/** * Command types for CMS domain operations. Mirrors `commands.rs`. */ import type { InternetMode } from "./settings.ts"; const VALID_INTERNET_MODES: InternetMode[] = ["Off", "ReadOnly", "Full"]; /** Partial update command for `Settings` — only non-null fields are applied. */ export interface SettingsPatch { internet_mode?: string; provider?: string; model?: string; api_keys?: Record; max_tokens?: number | null; temperature?: number | null; review_max_lessons_per_run?: number; adaptive_review_max_skip?: number; verify_command?: string | null; verify_timeout_ms?: number; workflow_max_concurrency?: number; review_enabled?: boolean; session_archive_enabled?: boolean; hive_mind_node_timeout_ms?: number; } /** The `apply` fields a Settings-like target must expose (subset of Settings). */ export interface SettingsPatchTarget { internet_mode: InternetMode; provider: string; model: string; api_keys: Record; max_tokens?: number | null; temperature?: number | null; review_max_lessons_per_run: number; adaptive_review_max_skip: number; verify_command?: string | null; verify_timeout_ms: number; workflow_max_concurrency: number; review_enabled: boolean; session_archive_enabled: boolean; hive_mind_node_timeout_ms: number; } /** Merge a patch into a settings-like target; only defined fields are applied. */ export function applySettingsPatch(patch: SettingsPatch, settings: SettingsPatchTarget): string | null { if (patch.internet_mode !== undefined) { const mode = patch.internet_mode; if (!VALID_INTERNET_MODES.includes(mode as InternetMode)) { return `invalid internet_mode '${mode}'; expected Off, ReadOnly, or Full`; } settings.internet_mode = mode as InternetMode; } if (patch.provider !== undefined) settings.provider = patch.provider; if (patch.model !== undefined) settings.model = patch.model; if (patch.api_keys !== undefined) settings.api_keys = patch.api_keys; if (patch.max_tokens !== undefined) settings.max_tokens = patch.max_tokens; if (patch.temperature !== undefined) settings.temperature = patch.temperature; if (patch.review_max_lessons_per_run !== undefined) settings.review_max_lessons_per_run = patch.review_max_lessons_per_run; if (patch.adaptive_review_max_skip !== undefined) settings.adaptive_review_max_skip = patch.adaptive_review_max_skip; if (patch.verify_command !== undefined) settings.verify_command = patch.verify_command; if (patch.verify_timeout_ms !== undefined) settings.verify_timeout_ms = patch.verify_timeout_ms; if (patch.workflow_max_concurrency !== undefined) settings.workflow_max_concurrency = patch.workflow_max_concurrency; if (patch.review_enabled !== undefined) settings.review_enabled = patch.review_enabled; if (patch.session_archive_enabled !== undefined) settings.session_archive_enabled = patch.session_archive_enabled; if (patch.hive_mind_node_timeout_ms !== undefined) settings.hive_mind_node_timeout_ms = patch.hive_mind_node_timeout_ms; return null; } /** Command to create a new memory entry. */ export interface NewMemory { name: string; description: string; content: string; kind?: string; outcome?: string; lifecycle?: string; scope?: string; before_snippet?: string; after_snippet?: string; provenances?: string[]; }