Files
ss-tools/frontend/src/lib/stores/assistantChat.js
2026-05-26 09:30:41 +03:00

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