ISO_TIME_SEPARATOR,
ISO_TIME_SEPARATOR_REPLACEMENT,
NON_ALPHANUMERIC_REGEX,
- MULTIPLE_UNDERSCORE_REGEX
+ MULTIPLE_UNDERSCORE_REGEX,
+ MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY
} from '$lib/constants';
class ConversationsStore {
isInitialized = $state(false);
/** Pending MCP server overrides for new conversations (before first message) */
- pendingMcpServerOverrides = $state<McpServerOverride[]>([]);
+ pendingMcpServerOverrides = $state<McpServerOverride[]>(ConversationsStore.loadMcpDefaults());
+
+ /** Load MCP default overrides from localStorage */
+ private static loadMcpDefaults(): McpServerOverride[] {
+ if (typeof globalThis.localStorage === 'undefined') return [];
+ try {
+ const raw = localStorage.getItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY);
+ if (!raw) return [];
+ const parsed = JSON.parse(raw);
+ if (!Array.isArray(parsed)) return [];
+ return parsed.filter(
+ (o: unknown) => typeof o === 'object' && o !== null && 'serverId' in o && 'enabled' in o
+ ) as McpServerOverride[];
+ } catch {
+ return [];
+ }
+ }
+
+ /** Persist MCP default overrides to localStorage */
+ private saveMcpDefaults(): void {
+ if (typeof globalThis.localStorage === 'undefined') return;
+ const plain = this.pendingMcpServerOverrides.map((o) => ({
+ serverId: o.serverId,
+ enabled: o.enabled
+ }));
+ if (plain.length > 0) {
+ localStorage.setItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY, JSON.stringify(plain));
+ } else {
+ localStorage.removeItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY);
+ }
+ }
/** Callback for title update confirmation dialog */
titleUpdateConfirmationCallback?: (currentTitle: string, newTitle: string) => Promise<boolean>;
clearActiveConversation(): void {
this.activeConversation = null;
this.activeMessages = [];
+ // reload MCP defaults so new chats inherit persisted state
+ this.pendingMcpServerOverrides = ConversationsStore.loadMcpDefaults();
}
/**
this.pendingMcpServerOverrides = [...this.pendingMcpServerOverrides, { serverId, enabled }];
}
}
+ this.saveMcpDefaults();
}
/**
*/
clearPendingMcpServerOverrides(): void {
this.pendingMcpServerOverrides = [];
+ this.saveMcpDefaults();
}
/**
}
/**
- * Checks if a server is enabled, considering per-chat overrides.
+ * Checks if a server is enabled for a given chat.
+ * Only per-chat overrides (persisted in localStorage for new chats,
+ * or in IndexedDB for existing conversations) control enabled state.
*/
#checkServerEnabled(
server: MCPServerSettingsEntry,
perChatOverrides?: McpServerOverride[]
): boolean {
- if (!server.enabled) {
- return false;
- }
-
- if (perChatOverrides) {
- const override = perChatOverrides.find((o) => o.serverId === server.id);
-
- return override?.enabled ?? false;
- }
-
- return false;
+ const override = perChatOverrides?.find((o) => o.serverId === server.id);
+ return override?.enabled ?? false;
}
/**
getEnabledServersForConversation(
perChatOverrides?: McpServerOverride[]
): MCPServerSettingsEntry[] {
- if (!perChatOverrides?.length) {
- return [];
- }
-
return this.getServers().filter((server) => {
- if (!server.enabled) {
- return false;
- }
-
- const override = perChatOverrides.find((o) => o.serverId === server.id);
-
- return override?.enabled ?? false;
+ return this.#checkServerEnabled(server, perChatOverrides);
});
}