matrix-builder / web /src /lib /ai-settings-store.ts
matrix-builder-bot
deploy: matrix-builder@ae902df6985a
66d0c75
Raw
History Blame Contribute Delete
2.9 kB
// Browser-local persistence for the optional Internal AI settings (see types/ai-settings.ts).
//
// Stored separately from account/profile settings and from the auth token — these values never
// go to the Matrix Builder backend. Reads are defensive: malformed or partial JSON always falls
// back to defaults so the settings panel and the assist hooks can never throw during render.
//
// Phase 3 (cloud persistence) is intentionally deferred, so this lives only in localStorage.
import {
AI_SETTINGS_STORAGE_KEY,
DEFAULT_AI_SETTINGS,
type MatrixAISettings,
} from "@/types/ai-settings";
// Merge whatever we read against defaults so missing/extra fields never break callers.
export function mergeAISettings(raw: unknown): MatrixAISettings {
if (!raw || typeof raw !== "object") return { ...DEFAULT_AI_SETTINGS };
const r = raw as Partial<MatrixAISettings> & { ollabridge?: Record<string, unknown> };
const ob = (r.ollabridge ?? {}) as Record<string, unknown>;
const d = DEFAULT_AI_SETTINGS;
const provider = r.provider === "ollabridge" ? "ollabridge" : "none";
const mode = r.mode === "assisted" ? "assisted" : "deterministic";
const authMode =
ob.authMode === "api_key" || ob.authMode === "local-trust" ? ob.authMode : "pairing";
const md = (r.matrixDesigner ?? {}) as Record<string, unknown>;
return {
provider,
mode,
ollabridge: {
authMode,
baseUrl: typeof ob.baseUrl === "string" && ob.baseUrl ? ob.baseUrl : d.ollabridge.baseUrl,
model: typeof ob.model === "string" && ob.model ? ob.model : d.ollabridge.model,
apiKey: typeof ob.apiKey === "string" ? ob.apiKey : "",
pairToken: typeof ob.pairToken === "string" ? ob.pairToken : "",
deviceId: typeof ob.deviceId === "string" ? ob.deviceId : "",
},
matrixDesigner: {
enabled: md.enabled === true,
},
};
}
// Convenience: is the optional Matrix Designer enhancement turned on?
export function isMatrixDesignerEnabled(): boolean {
return getAISettings().matrixDesigner.enabled;
}
export function getAISettings(): MatrixAISettings {
if (typeof window === "undefined") return { ...DEFAULT_AI_SETTINGS };
const raw = window.localStorage.getItem(AI_SETTINGS_STORAGE_KEY);
if (!raw) return { ...DEFAULT_AI_SETTINGS };
try {
return mergeAISettings(JSON.parse(raw));
} catch {
return { ...DEFAULT_AI_SETTINGS };
}
}
export const AI_SETTINGS_EVENT = "mb-ai-settings-changed";
export function saveAISettings(settings: MatrixAISettings): void {
if (typeof window === "undefined") return;
window.localStorage.setItem(AI_SETTINGS_STORAGE_KEY, JSON.stringify(settings));
window.dispatchEvent(new Event(AI_SETTINGS_EVENT));
}
export function clearAISettings(): void {
if (typeof window === "undefined") return;
window.localStorage.removeItem(AI_SETTINGS_STORAGE_KEY);
window.dispatchEvent(new Event(AI_SETTINGS_EVENT));
}