Mulai migrasi Zesdex dari Rust ke TypeScript/Bun.
- Root workspace package.json, tsconfig strict, bun.lock, gitignore fix
- Paket @zesdex/domain (apps/packages/domain):
- core: ChatMessage/Conversation/ToolCall/SseParser/repairJson/
sanitizeToolArguments/UsageStats/Store/DomainError
- auth: Session/SessionId/SessionLock/OAuth + repository & service interfaces
- cms: AppConfig/Settings/SettingsPatch/Memory/EditLog + repository &
service interfaces
- agent: TurnEvent/SessionRuntime/AgentTurnParams/AgentProgress/prompt
- subagent & workflow models
- Wire-shape JSON disamakan dengan Rust (serde rename/flatten/skip_if)
- 27 unit test Bun port dari test Rust (SseParser, repair_json, resolve_effective_model, session id)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
81 lines
3.3 KiB
TypeScript
81 lines
3.3 KiB
TypeScript
/**
|
|
* 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<string, string>;
|
|
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<string, string>;
|
|
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[];
|
|
} |