// #region AssistantChatStore [C:3] [TYPE Store] [SEMANTICS assistant, chat, store, session, panel] // @BRIEF Control assistant chat panel visibility, conversation binding, session context, and seeded prompts. // @RELATION BINDS_TO -> [EXT:frontend:AssistantChatPanel] // @UX_STATE Closed -> Chat panel hidden // @UX_STATE Open -> Chat panel visible with active conversation // #region assistantChat:Store [TYPE Function] // @PURPOSE: Control assistant chat panel visibility and active conversation binding. // @RELATION BINDS_TO -> [EXT:frontend:AssistantChatPanel] // import { writable } from 'svelte/store'; const initialState = { isOpen: false, conversationId: null, datasetReviewSessionId: null, seedMessage: '', focusTarget: null, }; export const assistantChatStore = writable(initialState); // #region toggleAssistantChat:Function [TYPE Function] // @PURPOSE: Toggle assistant panel visibility. // @PRE: Store is initialized. // @POST: isOpen value inverted. export function toggleAssistantChat() { assistantChatStore.update((state) => { const next = { ...state, isOpen: !state.isOpen }; console.log(`[EXT:frontend:assistantChat][${next.isOpen ? 'Open' : 'Closed'}] toggleAssistantChat`); return next; }); } // #endregion toggleAssistantChat:Function // #region openAssistantChat:Function [TYPE Function] // @PURPOSE: Open assistant panel. // @PRE: Store is initialized. // @POST: isOpen = true. export function openAssistantChat() { assistantChatStore.update((state) => { const next = { ...state, isOpen: true }; console.log('[EXT:frontend:assistantChat][Open] openAssistantChat'); return next; }); } // #endregion openAssistantChat:Function // #region openAssistantChatWithContext:Function [TYPE Function] // @PURPOSE: Open assistant panel with dataset review session context and optional seeded prompt/focus target. // @PRE: Context payload may be partial. // @POST: Assistant drawer opens with session binding and visible focus metadata. export function openAssistantChatWithContext(context = {}) { assistantChatStore.update((state) => { const next = { ...state, isOpen: true, datasetReviewSessionId: context.datasetReviewSessionId ?? state.datasetReviewSessionId ?? null, seedMessage: context.seedMessage ?? '', focusTarget: context.focusTarget ?? null, }; console.log('[EXT:frontend:assistantChat][Open] openAssistantChatWithContext'); return next; }); } // #endregion openAssistantChatWithContext:Function // #region closeAssistantChat:Function [TYPE Function] // @PURPOSE: Close assistant panel. // @PRE: Store is initialized. // @POST: isOpen = false. export function closeAssistantChat() { assistantChatStore.update((state) => { const next = { ...state, isOpen: false }; console.log('[EXT:frontend:assistantChat][Closed] closeAssistantChat'); return next; }); } // #endregion closeAssistantChat:Function // #region setAssistantConversationId:Function [TYPE Function] // @PURPOSE: Bind current conversation id in UI state. // @PRE: conversationId is string-like identifier. // @POST: store.conversationId updated. export function setAssistantConversationId(conversationId) { assistantChatStore.update((state) => { console.log('[EXT:frontend:assistantChat][ConversationBound] setAssistantConversationId'); return { ...state, conversationId }; }); } // #endregion setAssistantConversationId:Function // #region setAssistantDatasetReviewSessionId:Function [TYPE Function] // @PURPOSE: Bind active dataset review session to assistant state. // @PRE: session identifier may be null when workspace context is cleared. // @POST: store.datasetReviewSessionId updated. export function setAssistantDatasetReviewSessionId(datasetReviewSessionId) { assistantChatStore.update((state) => ({ ...state, datasetReviewSessionId })); } // #endregion setAssistantDatasetReviewSessionId:Function // #region setAssistantSeedMessage:Function [TYPE Function] // @PURPOSE: Stage a seeded assistant prompt for contextual send UX. // @PRE: seedMessage can be empty to clear staged draft. // @POST: store.seedMessage updated. export function setAssistantSeedMessage(seedMessage) { assistantChatStore.update((state) => ({ ...state, seedMessage: seedMessage || '' })); } // #endregion setAssistantSeedMessage:Function // #region setAssistantFocusTarget:Function [TYPE Function] // @PURPOSE: Track the workspace entity currently referenced by assistant context. // @PRE: focusTarget may be null to clear prior focus. // @POST: store.focusTarget updated. export function setAssistantFocusTarget(focusTarget) { assistantChatStore.update((state) => ({ ...state, focusTarget: focusTarget || null })); } // #endregion setAssistantFocusTarget:Function // #endregion assistantChat:Store // #endregion AssistantChatStore