Files
zesdex/apps/packages/domain/src/cms/commands.ts
T
asepharyanaandClaude Opus 5 07e84e43b3 feat(rewrite): bootstrap monorepo Bun + port domain layer ke TypeScript
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>
2026-09-02 22:50:38 +07:00

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[];
}