123 lines
4.7 KiB
JavaScript
123 lines
4.7 KiB
JavaScript
// #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
|