@wagemule/daemon 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.cjs +103 -43
- package/dist/main.cjs.map +2 -2
- package/package.json +1 -1
package/dist/main.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts", "../src/process/command.ts", "../src/runtime/capabilities.ts", "../src/runtime/doctor.ts", "../src/testing/run-smoke.ts", "../src/runtime/claude-adapter.ts", "../src/runtime/json-rpc-stdio-client.ts", "../src/runtime/acp-adapter.ts", "../src/runtime/claude-stream-json.ts", "../src/runtime/codex-adapter.ts", "../src/runtime/stream-json-cli-adapter.ts", "../src/runtime/cursor-acp-adapter.ts", "../src/runtime/gemini-acp-adapter.ts", "../src/runtime/hermes-acp-adapter.ts", "../src/runtime/kimi-adapter.ts", "../src/runtime/opencode-acp-adapter.ts", "../src/runtime/fake-persistent-adapter.ts", "../src/runtime/registry.ts", "../src/testing/smoke-harness.ts", "../src/workspace/agent-workspace.ts", "../src/agent-manager/skill-scanner.ts", "../src/skills/templates/index.ts", "../src/lab/interactive-lab.ts", "../src/lab/lab-store.ts", "../src/lab/lab-prompts.ts", "../src/lab/lab-ui.ts", "../src/connection/server-connection.ts", "../package.json", "../src/agent-manager/agent-process-manager.ts", "../../shared/src/protocol.ts", "../src/runtime/model-detector.ts", "../src/reminder/reminder-cache.ts", "../src/workspace/feishu-token-writer.ts", "../src/agent-manager/activity-tracker.ts", "../src/agent-manager/workspace-browser.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport os from \"node:os\";\nimport { doctorRuntimes } from \"./runtime/doctor\";\nimport {\n isSupportedRuntimeId,\n listRuntimeCapabilities,\n supportedRuntimeIds,\n type RuntimeId,\n} from \"./runtime/capabilities\";\nimport { runSmokeMatrix, smokeMatrixHasFailures } from \"./testing/run-smoke\";\nimport { runInteractiveLab } from \"./lab/interactive-lab\";\nimport { ServerConnection } from \"./connection/server-connection\";\nimport { AgentProcessManager } from \"./agent-manager/agent-process-manager\";\nimport { RuntimeModelDetector } from \"./runtime/model-detector\";\nimport packageJson from \"../package.json\";\n\nexport interface CliIo {\n stdout(line: string): void;\n stderr(line: string): void;\n}\n\nexport async function runCli(argv: string[], io: CliIo = defaultIo): Promise<number> {\n const [command] = argv;\n\n if (!command || command === \"--help\" || command === \"help\") {\n io.stdout(buildHelp());\n return 0;\n }\n\n if (command === \"runtimes\") {\n io.stdout(JSON.stringify(listRuntimeCapabilities(), null, 2));\n return 0;\n }\n\n if (command === \"models\") {\n const detector = new RuntimeModelDetector();\n io.stdout(JSON.stringify(await detector.detectAll(parseRuntimeArgs(argv)), null, 2));\n return 0;\n }\n\n if (command === \"doctor\") {\n io.stdout(JSON.stringify(await doctorRuntimes(parseRuntimeArgs(argv)), null, 2));\n return 0;\n }\n\n if (command === \"smoke\") {\n const options = parseSmokeArgs(argv);\n const summaries = await runSmokeMatrix(options);\n io.stdout(JSON.stringify(summaries, null, 2));\n return smokeMatrixHasFailures(summaries) ? 1 : 0;\n }\n\n if (command === \"lab\") {\n await runInteractiveLab({\n rootDir: valueAfter(argv, \"--root\"),\n serverNamespace: valueAfter(argv, \"--server\"),\n timeoutMs: numberAfter(argv, \"--timeout-ms\"),\n });\n return 0;\n }\n\n if (command === \"start\") {\n const serverUrl = valueAfter(argv, \"--server-url\");\n const apiKey = valueAfter(argv, \"--api-key\");\n const spaceId = valueAfter(argv, \"--space-id\");\n const name = valueAfter(argv, \"--name\");\n if (!serverUrl || !apiKey) {\n io.stderr(\"wm-daemon start requires --server-url and --api-key\");\n return 2;\n }\n const rootDir = valueAfter(argv, \"--root\") ?? `${process.env.HOME ?? \".\"}/.wm`;\n await runDaemon({ serverUrl, apiKey, spaceId, name, rootDir, io });\n return 0;\n }\n\n io.stderr(`Unknown command: ${command}`);\n io.stderr(buildHelp());\n return 2;\n}\n\nconst defaultIo: CliIo = {\n stdout: (line) => {\n console.log(line);\n },\n stderr: (line) => {\n console.error(line);\n },\n};\n\nfunction buildHelp(): string {\n return [\n \"wm-daemon\",\n \"\",\n \"Commands:\",\n \" runtimes Print v1 runtime adapter capability declarations as JSON.\",\n \" models Detect runtime model and reasoning-effort declarations as JSON.\",\n \" doctor Detect local runtime binaries and versions.\",\n \" smoke Run adapter smoke tests against local runtimes.\",\n \" lab Open the interactive local daemon test lab.\",\n \" start Connect this daemon to a Workspace Server.\",\n \" help Print this help text.\",\n \"\",\n \"Lab is local-only and clears its selected server namespace before starting.\",\n ].join(\"\\n\");\n}\n\nasync function runDaemon(input: {\n serverUrl: string;\n apiKey: string;\n spaceId?: string;\n name?: string;\n rootDir: string;\n io: CliIo;\n}): Promise<void> {\n const log = (line: string) => input.io.stdout(`${new Date().toISOString()} [wm-daemon] ${line}`);\n let connection: ServerConnection;\n const manager = new AgentProcessManager({\n rootDir: input.rootDir,\n machineDisplayName: input.name?.trim() || os.hostname() || \"machine\",\n sendToServer: (msg) => connection.send(msg),\n log,\n });\n connection = new ServerConnection({\n serverUrl: input.serverUrl,\n apiKey: input.apiKey,\n spaceId: input.spaceId,\n name: input.name,\n daemonVersion: packageJson.version,\n runningAgentsProvider: () => manager.getRunningAgentIds(),\n wakeableAgentsProvider: () => manager.getWakeableAgents(),\n log,\n });\n connection.onMessage((message) => {\n manager.handle(message).catch((error) => {\n const messageText = error instanceof Error ? error.stack ?? error.message : String(error);\n input.io.stderr(`${new Date().toISOString()} [wm-daemon] [error] ${messageText}`);\n });\n });\n connection.connect();\n log(`started server=${input.serverUrl} root=${input.rootDir}`);\n const keepAlive = setInterval(() => {\n const running = manager.getRunningAgentIds();\n log(`heartbeat socket=${connection.connected ? \"open\" : \"closed\"} running_agents=${running.length ? running.join(\",\") : \"-\"}`);\n }, 30_000);\n await new Promise<void>((resolve) => {\n process.once(\"SIGINT\", resolve);\n process.once(\"SIGTERM\", resolve);\n });\n clearInterval(keepAlive);\n log(\"stopping\");\n connection.disconnect();\n}\n\nfunction parseRuntimeArgs(argv: string[]): RuntimeId[] {\n const runtime = valueAfter(argv, \"--runtime\");\n if (!runtime || runtime === \"all\") return supportedRuntimeIds;\n if (!isSupportedRuntimeId(runtime)) {\n throw new Error(`Unsupported runtime: ${runtime}`);\n }\n return [runtime];\n}\n\nfunction parseSmokeArgs(argv: string[]): {\n runtimes: RuntimeId[];\n rootDir?: string;\n timeoutMs?: number;\n keepArtifacts?: boolean;\n} {\n return {\n runtimes: parseRuntimeArgs(argv),\n rootDir: valueAfter(argv, \"--root\"),\n timeoutMs: numberAfter(argv, \"--timeout-ms\"),\n keepArtifacts: argv.includes(\"--keep-artifacts\"),\n };\n}\n\nfunction valueAfter(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index === -1) return undefined;\n return argv[index + 1];\n}\n\nfunction numberAfter(argv: string[], name: string): number | undefined {\n const value = valueAfter(argv, name);\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) throw new Error(`Invalid number for ${name}: ${value}`);\n return parsed;\n}\n\nif (require.main === module) {\n runCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n });\n}\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandSpec {\n command: string;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n onStdoutChunk?: (chunk: string) => void;\n onStderrChunk?: (chunk: string) => void;\n}\n\nexport interface CommandResult {\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n}\n\nexport type CommandRunner = (spec: CommandSpec) => Promise<CommandResult>;\n\nexport const runCommand: CommandRunner = (spec) => {\n return new Promise((resolve, reject) => {\n const child = spawn(spec.command, spec.args, {\n cwd: spec.cwd,\n env: spec.env ?? process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n let timer: NodeJS.Timeout | undefined;\n\n if (spec.timeoutMs && spec.timeoutMs > 0) {\n timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 1000).unref();\n }, spec.timeoutMs);\n timer.unref();\n }\n\n child.stdout.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout += text;\n spec.onStdoutChunk?.(text);\n });\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n spec.onStderrChunk?.(text);\n });\n child.on(\"error\", (error) => {\n if (timer) clearTimeout(timer);\n if (settled) return;\n settled = true;\n reject(error);\n });\n child.on(\"close\", (exitCode, signal) => {\n if (timer) clearTimeout(timer);\n if (settled) return;\n settled = true;\n resolve({\n exitCode,\n signal,\n stdout,\n stderr,\n timedOut,\n });\n });\n });\n};\n", "export type RuntimeId = \"codex\" | \"claude\" | \"kimi\" | \"gemini\" | \"cursor\" | \"hermes\" | \"opencode\";\n\nexport type RuntimeAdapterKind =\n | \"app_server_session\"\n | \"acp_session\"\n | \"cli_stream_session\"\n | \"cli_print_session\"\n | \"wire_session\"\n | \"sdk_session\";\n\nexport type RuntimeTransport =\n | \"json_rpc_stdio\"\n | \"stream_json_stdio\"\n | \"wire_stdio\"\n | \"sdk\";\n\nexport type RuntimeLifecycle = \"persistent\" | \"semi_persistent\" | \"per_turn\";\n\nexport type RuntimePromptInjection =\n | \"developer_instructions\"\n | \"system_prompt_file\"\n | \"startup_message\";\n\nexport type RuntimeSessionRecovery =\n | \"native_resume\"\n | \"daemon_handoff_only\"\n | \"none\";\n\nexport type RuntimeEventStream = \"structured\" | \"text_stream\" | \"final_only\";\n\nexport interface RuntimeCapability {\n runtime: RuntimeId;\n adapterKind: RuntimeAdapterKind;\n transport: RuntimeTransport;\n lifecycle: RuntimeLifecycle;\n promptInjection: RuntimePromptInjection;\n sessionRecovery: RuntimeSessionRecovery;\n eventStream: RuntimeEventStream;\n supportsSteering: boolean;\n supportsInterrupt: boolean;\n supportsPermissionEvents: boolean;\n supportsWorkingDirectory: boolean;\n notes: string;\n}\n\nexport const supportedRuntimeIds: RuntimeId[] = [\n \"cursor\",\n \"claude\",\n \"codex\",\n \"gemini\",\n \"kimi\",\n \"hermes\",\n \"opencode\",\n];\n\nconst capabilities: Record<RuntimeId, RuntimeCapability> = {\n codex: {\n runtime: \"codex\",\n adapterKind: \"app_server_session\",\n transport: \"json_rpc_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"developer_instructions\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: true,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `codex app-server --listen stdio://`. developerInstructions in thread/start.\",\n },\n claude: {\n runtime: \"claude\",\n adapterKind: \"cli_stream_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"system_prompt_file\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: true,\n supportsWorkingDirectory: true,\n notes: \"Uses Claude Code stream-json stdin/stdout. Busy delivery is queued until turn boundary in v1.\",\n },\n kimi: {\n runtime: \"kimi\",\n adapterKind: \"wire_session\",\n transport: \"wire_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"system_prompt_file\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes: \"Uses `kimi --wire --yolo` with a daemon-generated agent file and session id.\",\n },\n gemini: {\n runtime: \"gemini\",\n adapterKind: \"cli_print_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"per_turn\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: false,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `gemini --output-format stream-json --yolo` per turn with native resume.\",\n },\n cursor: {\n runtime: \"cursor\",\n adapterKind: \"cli_print_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"per_turn\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: false,\n supportsInterrupt: true,\n supportsPermissionEvents: true,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `cursor-agent --print --output-format stream-json` per turn with native resume.\",\n },\n hermes: {\n runtime: \"hermes\",\n adapterKind: \"acp_session\",\n transport: \"json_rpc_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes: \"Uses `hermes acp`. Has steer command. Python startup ~5s.\",\n },\n opencode: {\n runtime: \"opencode\",\n adapterKind: \"cli_print_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"per_turn\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `opencode` stdio/ACP-compatible session mode when configured. Provider models may be unavailable until OpenCode auth/provider setup is complete.\",\n },\n};\n\nexport function listRuntimeCapabilities(): RuntimeCapability[] {\n return supportedRuntimeIds.map((runtime) => capabilities[runtime]);\n}\n\nexport function getRuntimeCapability(\n runtime: string\n): RuntimeCapability | undefined {\n if (!isSupportedRuntimeId(runtime)) {\n return undefined;\n }\n\n return capabilities[runtime];\n}\n\nexport function isSupportedRuntimeId(runtime: string): runtime is RuntimeId {\n return supportedRuntimeIds.includes(runtime as RuntimeId);\n}\n", "import type { CommandRunner } from \"../process/command\";\nimport { runCommand } from \"../process/command\";\nimport { getRuntimeCapability, supportedRuntimeIds, type RuntimeId } from \"./capabilities\";\n\nexport interface RuntimeDoctorResult {\n runtime: RuntimeId;\n detected: boolean;\n status: \"available\" | \"not_installed\" | \"unknown\";\n version?: string;\n capability: ReturnType<typeof getRuntimeCapability>;\n errorMessage?: string;\n}\n\nconst versionArgs: Record<RuntimeId, string[]> = {\n codex: [\"--version\"],\n claude: [\"--version\"],\n kimi: [\"--version\"],\n gemini: [\"--version\"],\n cursor: [\"--version\"],\n hermes: [\"--version\"],\n opencode: [\"--version\"],\n};\n\nconst commands: Record<RuntimeId, string> = {\n codex: \"codex\",\n claude: \"claude\",\n kimi: \"kimi\",\n gemini: \"gemini\",\n cursor: \"cursor-agent\",\n hermes: \"hermes\",\n opencode: \"opencode\",\n};\n\nexport async function doctorRuntimes(\n runtimes: RuntimeId[] = supportedRuntimeIds,\n runner: CommandRunner = runCommand\n): Promise<RuntimeDoctorResult[]> {\n const results: RuntimeDoctorResult[] = [];\n for (const runtime of runtimes) {\n try {\n const result = await runner({\n command: commands[runtime],\n args: versionArgs[runtime],\n timeoutMs: 10000,\n });\n const version = `${result.stdout}\\n${result.stderr}`.trim().split(/\\r?\\n/)[0];\n results.push({\n runtime,\n detected: result.exitCode === 0,\n status: result.exitCode === 0 ? \"available\" : \"unknown\",\n version: version || undefined,\n capability: getRuntimeCapability(runtime),\n errorMessage: result.exitCode === 0 ? undefined : `${result.stderr}\\n${result.stdout}`.trim(),\n });\n } catch (error) {\n results.push({\n runtime,\n detected: false,\n status: \"not_installed\",\n capability: getRuntimeCapability(runtime),\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return results;\n}\n", "import { mkdtemp, rm } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeRunStatus } from \"../runtime/adapter\";\nimport { supportedRuntimeIds, type RuntimeId } from \"../runtime/capabilities\";\nimport { createRuntimeAdapter } from \"../runtime/registry\";\nimport { runAdapterSmokeTest } from \"./smoke-harness\";\n\nexport interface RuntimeSmokeSummary {\n runtime: RuntimeId;\n status: RuntimeRunStatus;\n agentDir?: string;\n runtimeSessionId?: string;\n finalMessage?: string;\n eventTypes: string[];\n errorMessage?: string;\n}\n\nexport interface RunSmokeMatrixInput {\n runtimes?: RuntimeId[];\n rootDir?: string;\n timeoutMs?: number;\n keepArtifacts?: boolean;\n}\n\nexport async function runSmokeMatrix(\n input: RunSmokeMatrixInput = {}\n): Promise<RuntimeSmokeSummary[]> {\n const rootDir =\n input.rootDir ?? (await mkdtemp(path.join(os.tmpdir(), \"wm-daemon-smoke-\")));\n const summaries: RuntimeSmokeSummary[] = [];\n\n try {\n for (const runtime of input.runtimes ?? supportedRuntimeIds) {\n const adapter = createRuntimeAdapter(runtime);\n try {\n const result = await runAdapterSmokeTest({\n rootDir,\n serverNamespace: \"test-server\",\n serverId: \"test-server\",\n daemonId: \"test-daemon\",\n agentId: `test-${runtime}-agent`,\n agentName: `test-${runtime}`,\n runtime,\n role: \"wm-daemon adapter smoke test agent\",\n adapter: {\n runtime: adapter.runtime,\n run: (runInput) =>\n adapter.run({\n ...runInput,\n timeoutMs: input.timeoutMs,\n }),\n },\n });\n\n summaries.push({\n runtime,\n status: result.status,\n agentDir: result.workspace.agentDir,\n runtimeSessionId: result.runtimeSessionId,\n finalMessage: result.finalMessage,\n eventTypes: result.events.map((event) => event.type),\n errorMessage: result.errorMessage,\n });\n } catch (error) {\n summaries.push({\n runtime,\n status: \"runtime_error\",\n eventTypes: [],\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n }\n }\n } finally {\n if (!input.keepArtifacts && !input.rootDir) {\n await rm(rootDir, { recursive: true, force: true });\n }\n }\n\n return summaries;\n}\n\nexport function smokeMatrixHasFailures(summaries: RuntimeSmokeSummary[]): boolean {\n return summaries.some((summary) =>\n [\"runtime_error\", \"timeout\", \"unsupported_version\"].includes(summary.status)\n );\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\nimport { query as sdkQuery } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n PersistentRuntimeAdapter,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\nimport {\n claudeStreamJsonPromptMessage,\n parseClaudeStreamJsonLine,\n} from \"./claude-stream-json\";\n\ntype ClaudeEffort = \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface ClaudeQueryInput {\n prompt: string;\n options: {\n cwd: string;\n permissionMode: \"default\" | \"bypassPermissions\";\n allowDangerouslySkipPermissions?: true;\n abortController: AbortController;\n includePartialMessages: true;\n model?: string;\n effort?: ClaudeEffort;\n thinking?: { type: \"adaptive\" };\n systemPrompt: {\n type: \"preset\";\n preset: \"claude_code\";\n append: string;\n };\n resume?: string;\n sessionId?: string;\n };\n}\n\nexport type ClaudeQueryFactory = (input: ClaudeQueryInput) => Query | AsyncIterable<unknown>;\n\nexport class ClaudeAdapter implements RuntimeAdapter {\n readonly runtime = \"claude\" as const;\n\n constructor(private readonly queryFactory: ClaudeQueryFactory = sdkQuery) {}\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n const events: RuntimeEvent[] = [];\n let finalMessage = \"\";\n let sessionId: string | undefined;\n const abortController = new AbortController();\n const abortHandler = () => abortController.abort();\n const timer = setTimeout(\n () => abortController.abort(),\n input.timeoutMs ?? 120000\n );\n const restoreEnv = applyRuntimeEnv(input.env);\n\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n const isResume = !!input.runtimeSessionId;\n const stream = this.queryFactory({\n prompt: input.prompt,\n options: {\n cwd: input.cwd,\n ...claudePermissionOptions(input.permissionMode),\n abortController,\n includePartialMessages: true,\n model: input.model && input.model !== \"default\" ? input.model : undefined,\n ...claudeReasoningOptions(input.reasoningEffort),\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: input.systemPrompt,\n },\n ...(isResume\n ? { resume: input.runtimeSessionId }\n : { sessionId: randomUUID() }),\n },\n });\n\n for await (const message of stream) {\n const msg = message as Record<string, unknown>;\n switch (msg.type) {\n case \"system\": {\n if (msg.subtype === \"init\") {\n sessionId = stringValue(msg.session_id);\n emit(events, input, {\n type: \"runtime_started\",\n data: { runtime: \"claude\", sessionId, model: msg.model },\n });\n } else if (msg.subtype === \"status\" && msg.status === \"compacting\") {\n emit(events, input, { type: \"compaction_started\" });\n } else if (msg.subtype === \"compact_boundary\") {\n emit(events, input, { type: \"compaction_finished\" });\n }\n break;\n }\n case \"stream_event\": {\n this.handleStreamEvent(msg.event, events, input, (text) => {\n finalMessage += text;\n });\n break;\n }\n case \"assistant\": {\n const text = this.handleAssistant(msg.message, events, input);\n if (text) finalMessage = text;\n break;\n }\n case \"user\": {\n if (msg.isSynthetic) {\n this.handleSyntheticUser(msg.message, events, input);\n }\n break;\n }\n case \"tool_progress\": {\n emit(events, input, { type: \"tool_progress\", data: msg });\n break;\n }\n case \"result\": {\n emit(events, input, {\n type: \"turn_finished\",\n data: {\n cost: msg.total_cost_usd,\n duration: msg.duration_ms,\n usage: msg.usage,\n },\n });\n break;\n }\n }\n }\n\n return { status: \"ok\", finalMessage, runtimeSessionId: sessionId, events };\n } catch (error) {\n const status = classifyProtocolError(error);\n return {\n status,\n finalMessage,\n runtimeSessionId: sessionId,\n events,\n errorMessage:\n status === \"timeout\"\n ? \"Claude session timed out\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n } finally {\n clearTimeout(timer);\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n restoreEnv();\n }\n }\n\n private handleStreamEvent(\n event: unknown,\n events: RuntimeEvent[],\n input: RuntimeRunInput,\n appendFinalMessage: (text: string) => void\n ): void {\n const streamEvent = event as Record<string, unknown> | undefined;\n if (streamEvent?.type !== \"content_block_delta\") return;\n const delta = streamEvent.delta as Record<string, unknown> | undefined;\n if (delta?.type === \"text_delta\" && typeof delta.text === \"string\") {\n appendFinalMessage(delta.text);\n emit(events, input, {\n type: \"assistant_delta\",\n content: delta.text,\n data: delta,\n });\n }\n if (delta?.type === \"thinking_delta\" && typeof delta.thinking === \"string\") {\n emit(events, input, {\n type: \"thinking_delta\",\n content: delta.thinking,\n data: delta,\n });\n }\n }\n\n private handleAssistant(\n message: unknown,\n events: RuntimeEvent[],\n input: RuntimeRunInput\n ): string {\n const blocks = contentBlocks(message);\n let text = \"\";\n for (const block of blocks) {\n if (block.type === \"text\" && typeof block.text === \"string\") {\n text += block.text;\n }\n if (block.type === \"tool_use\") {\n emit(events, input, {\n type: \"tool_start\",\n content: stringValue(block.name) ?? \"\",\n data: {\n id: block.id,\n name: block.name,\n input: block.input,\n },\n });\n }\n }\n return text;\n }\n\n private handleSyntheticUser(\n message: unknown,\n events: RuntimeEvent[],\n input: RuntimeRunInput\n ): void {\n for (const block of contentBlocks(message)) {\n if (block.type === \"tool_result\") {\n emit(events, input, { type: \"tool_result\", data: block });\n }\n }\n }\n}\n\nexport type ClaudeCliProcessFactory = (\n input: RuntimeStartInput,\n args: string[]\n) => ChildProcessWithoutNullStreams;\n\nexport class ClaudePersistentAdapter implements PersistentRuntimeAdapter {\n readonly runtime = \"claude\" as const;\n private child: ChildProcessWithoutNullStreams | null = null;\n private lines: readline.Interface | null = null;\n private startInput: RuntimeStartInput | null = null;\n private sessionId: string | undefined;\n private activePrompt: {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n appendFinalMessage(text: string): void;\n setFinalMessage(text: string): void;\n markExited(code: number | null, signal: NodeJS.Signals | null): void;\n finish(): void;\n exited?: { code: number | null; signal: NodeJS.Signals | null };\n } | null = null;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(\n private readonly processFactory: ClaudeCliProcessFactory = (input, args) =>\n spawn(\"claude\", args, {\n cwd: input.cwd,\n env: input.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n })\n ) {}\n\n async start(input: RuntimeStartInput): Promise<void> {\n if (this.child && this.alive) return;\n this.startInput = input;\n const args = claudeCliArgs(input);\n this.child = this.processFactory(input, args);\n this.child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) input.onEvent?.({ type: \"runtime_stderr\", content: text });\n });\n this.child.on(\"exit\", (code, signal) => {\n this.activePrompt?.markExited(code, signal);\n this.child = null;\n this.onExit?.(code, signal);\n });\n this.child.on(\"error\", (error) => {\n input.onEvent?.({ type: \"runtime_error\", content: error.message });\n });\n this.lines = readline.createInterface({ input: this.child.stdout });\n this.lines.on(\"line\", (line) => this.handleLine(line));\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n const startInput = this.startInput;\n const child = this.child;\n let finalMessage = \"\";\n const events: RuntimeEvent[] = [];\n if (!startInput || !child || !this.alive) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: \"Claude persistent runtime is not started\",\n };\n }\n\n const runInput: RuntimeRunInput = {\n ...startInput,\n prompt: input.prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n const abortHandler = () => this.destroy(\"prompt aborted\");\n let finishTurn: (() => void) | undefined;\n const turnFinished = new Promise<void>((resolve) => {\n finishTurn = resolve;\n });\n this.activePrompt = {\n runInput,\n events,\n appendFinalMessage: (text) => {\n finalMessage += text;\n },\n setFinalMessage: (text) => {\n finalMessage = text;\n },\n markExited: (code, signal) => {\n if (this.activePrompt) this.activePrompt.exited = { code, signal };\n finishTurn?.();\n },\n finish: () => finishTurn?.(),\n };\n\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n child.stdin.write(`${claudeStreamJsonPromptMessage(input.prompt)}\\n`);\n await withTimeout(\n turnFinished,\n input.timeoutMs ?? 120000,\n \"Claude stream-json turn timeout\"\n );\n if (this.activePrompt?.exited) {\n const { code, signal } = this.activePrompt.exited;\n return {\n status: \"runtime_error\",\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n errorMessage: `Claude exited code=${code} signal=${signal ?? \"-\"}`,\n };\n }\n return {\n status: \"ok\",\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n };\n } catch (error) {\n const status = classifyProtocolError(error);\n return {\n status,\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n errorMessage: status === \"timeout\"\n ? \"Claude stream-json session timed out\"\n : error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.activePrompt = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.child && !this.child.killed);\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n destroy(_reason?: string): void {\n this.activePrompt = null;\n this.lines?.close();\n this.lines = null;\n killProcessTree(this.child);\n this.child = null;\n }\n\n private handleLine(line: string): void {\n const parsed = parseClaudeStreamJsonLine(line);\n if (!parsed) return;\n if (parsed.sessionId) this.sessionId = parsed.sessionId;\n const active = this.activePrompt;\n const runInput = active?.runInput ?? (this.startInput ? { ...this.startInput, prompt: \"\" } : undefined);\n if (!runInput) return;\n for (const event of parsed.events) {\n if (!active && event.type !== \"runtime_started\") {\n continue;\n }\n emit(active?.events ?? [], runInput, event);\n }\n if (active) {\n if (parsed.appendFinalMessage) active.appendFinalMessage(parsed.appendFinalMessage);\n if (parsed.finalMessage) active.setFinalMessage(parsed.finalMessage);\n if (parsed.turnFinished) active.finish();\n }\n }\n}\n\nfunction claudePermissionOptions(permissionMode: RuntimeRunInput[\"permissionMode\"]): Pick<ClaudeQueryInput[\"options\"], \"permissionMode\" | \"allowDangerouslySkipPermissions\"> {\n if (permissionMode === \"full_access\") {\n return {\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n };\n }\n return { permissionMode: \"default\" };\n}\n\nfunction claudeReasoningOptions(reasoningEffort: string | undefined): Pick<ClaudeQueryInput[\"options\"], \"effort\" | \"thinking\"> {\n if (!reasoningEffort || reasoningEffort === \"default\") return {};\n if (reasoningEffort === \"adaptive\") return { thinking: { type: \"adaptive\" } };\n if (!isClaudeEffort(reasoningEffort)) return {};\n return { effort: reasoningEffort };\n}\n\nfunction claudeCliArgs(input: RuntimeStartInput): string[] {\n const args = [\n \"--allow-dangerously-skip-permissions\",\n \"--dangerously-skip-permissions\",\n \"--verbose\",\n \"--permission-mode\",\n input.permissionMode === \"full_access\" ? \"bypassPermissions\" : \"default\",\n \"--input-format\",\n \"stream-json\",\n \"--output-format\",\n \"stream-json\",\n \"--disallowed-tools\",\n \"EnterPlanMode,ExitPlanMode,ScheduleWakeup,CronCreate,CronList,CronDelete\",\n \"--system-prompt-file\",\n input.systemPromptPath,\n ];\n if (input.model && input.model !== \"default\") {\n args.push(\"--model\", input.model);\n }\n if (input.runtimeSessionId) {\n args.push(\"--resume\", input.runtimeSessionId);\n }\n return args;\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall through to direct child kill.\n }\n }\n child.kill(\"SIGTERM\");\n}\n\nfunction isClaudeEffort(value: string): value is ClaudeEffort {\n return value === \"low\" || value === \"medium\" || value === \"high\" || value === \"xhigh\" || value === \"max\";\n}\n\nfunction contentBlocks(message: unknown): Array<Record<string, unknown>> {\n const msg = message as { content?: unknown } | undefined;\n return Array.isArray(msg?.content)\n ? msg.content.filter((block): block is Record<string, unknown> =>\n typeof block === \"object\" && block !== null\n )\n : [];\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n events.push(event);\n input.onEvent?.(event);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction applyRuntimeEnv(env?: NodeJS.ProcessEnv): () => void {\n if (!env) return () => {};\n const previous = new Map<string, string | undefined>();\n for (const [key, value] of Object.entries(env)) {\n previous.set(key, process.env[key]);\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n return () => {\n for (const [key, value] of previous) {\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n };\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\n\nexport type JsonRpcId = number | string;\n\nexport interface JsonRpcNotification {\n method: string;\n params: unknown;\n}\n\nexport interface JsonRpcServerRequest {\n id: JsonRpcId;\n method: string;\n params: unknown;\n}\n\nexport interface JsonRpcStdioClientOptions {\n command: string;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n onNotification: (notification: JsonRpcNotification) => void;\n onServerRequest?: (request: JsonRpcServerRequest) => Promise<unknown>;\n onStderr?: (text: string) => void;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n}\n\ninterface PendingRequest {\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\nexport class JsonRpcStdioClient {\n private child: ChildProcessWithoutNullStreams | null = null;\n private lines: readline.Interface | null = null;\n private nextId = 1;\n private readonly pending = new Map<JsonRpcId, PendingRequest>();\n private started = false;\n private exitEmitted = false;\n\n constructor(private readonly options: JsonRpcStdioClientOptions) {}\n\n start(): void {\n if (this.started) return;\n this.started = true;\n this.exitEmitted = false;\n this.child = spawn(this.options.command, this.options.args, {\n cwd: this.options.cwd,\n env: this.options.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n this.child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) this.options.onStderr?.(text);\n });\n\n this.child.on(\"error\", (error) => {\n this.rejectPending(error instanceof Error ? error : new Error(String(error)));\n this.child = null;\n this.started = false;\n });\n\n this.child.on(\"exit\", (code, signal) => {\n this.rejectPending(new Error(`Process exited code=${code} signal=${signal}`));\n this.child = null;\n this.started = false;\n this.emitExit(code, signal);\n });\n\n this.lines = readline.createInterface({ input: this.child.stdout });\n this.lines.on(\"line\", (line) => this.handleLine(line));\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n if (!this.child) {\n return Promise.reject(new Error(\"JSON-RPC client not started\"));\n }\n\n const id = this.nextId++;\n const message = { jsonrpc: \"2.0\", id, method, params };\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n this.child!.stdin.write(`${JSON.stringify(message)}\\n`);\n });\n }\n\n destroy(): void {\n this.rejectPending(new Error(\"Client destroyed\"));\n this.lines?.close();\n this.lines = null;\n killProcessTree(this.child);\n this.child = null;\n this.started = false;\n }\n\n get isRunning(): boolean {\n return this.child !== null;\n }\n\n get alive(): boolean {\n return this.isRunning;\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n private handleLine(line: string): void {\n if (!line.trim()) return;\n\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n return;\n }\n\n const packet = message as {\n id?: JsonRpcId;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code?: number; message?: string; data?: unknown };\n };\n\n if (packet.id !== undefined && !packet.method) {\n const pending = this.pending.get(packet.id);\n if (!pending) return;\n this.pending.delete(packet.id);\n if (packet.error) {\n pending.reject(new Error(packet.error.message ?? \"JSON-RPC request failed\"));\n } else {\n pending.resolve(packet.result);\n }\n return;\n }\n\n if (packet.id !== undefined && packet.method) {\n const request = {\n id: packet.id,\n method: packet.method,\n params: packet.params,\n };\n const handler = this.options.onServerRequest;\n if (!handler) {\n this.sendResponse(packet.id, {});\n return;\n }\n handler(request)\n .then((result) => this.sendResponse(packet.id!, result))\n .catch((error) =>\n this.sendError(packet.id!, error instanceof Error ? error : new Error(String(error)))\n );\n return;\n }\n\n if (packet.method) {\n this.options.onNotification({\n method: packet.method,\n params: packet.params,\n });\n }\n }\n\n private sendResponse(id: JsonRpcId, result: unknown): void {\n this.child?.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, result })}\\n`);\n }\n\n private sendError(id: JsonRpcId, error: Error): void {\n this.child?.stdin.write(\n `${JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n error: { code: -32000, message: error.message },\n })}\\n`\n );\n }\n\n private rejectPending(error: Error): void {\n for (const pending of this.pending.values()) {\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private emitExit(code: number | null, signal: NodeJS.Signals | null): void {\n if (this.exitEmitted) return;\n this.exitEmitted = true;\n this.options.onExit?.(code, signal);\n }\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n if (child.pid) {\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n return;\n }\n child.kill();\n return;\n }\n\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall through to direct child kill for runtimes that did not get a group.\n }\n }\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) child.kill(\"SIGKILL\");\n }, 5000).unref();\n}\n", "import type {\n PersistentRuntimeAdapter,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\nimport {\n JsonRpcStdioClient,\n type JsonRpcNotification,\n type JsonRpcServerRequest,\n type JsonRpcStdioClientOptions,\n} from \"./json-rpc-stdio-client\";\n\nexport interface AcpJsonRpcClient {\n start(): void;\n request(method: string, params?: unknown): Promise<unknown>;\n destroy(): void;\n readonly isRunning?: boolean;\n readonly alive?: boolean;\n readonly pid?: number;\n}\n\nexport interface AcpAdapterConfig {\n runtime: RuntimeId;\n command: string;\n args: string[];\n modelFlag?: boolean;\n sessionNewExtras?: Record<string, unknown>;\n autoApproveMode?: string;\n}\n\nexport type AcpClientFactory = (\n options: JsonRpcStdioClientOptions\n) => AcpJsonRpcClient;\n\ninterface ActivePrompt {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n appendFinalMessage(text: string): void;\n}\n\nexport class AcpAdapter implements RuntimeAdapter, PersistentRuntimeAdapter {\n readonly runtime: RuntimeId;\n private activePermissionMode: RuntimeRunInput[\"permissionMode\"] = \"default\";\n private client: AcpJsonRpcClient | null = null;\n private sessionId: string | undefined;\n private startInput: RuntimeStartInput | null = null;\n private activePrompt: ActivePrompt | null = null;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(\n private readonly config: AcpAdapterConfig,\n private readonly clientFactory: AcpClientFactory = (options) =>\n new JsonRpcStdioClient(options)\n ) {\n this.runtime = config.runtime;\n }\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n await this.destroy(\"one-shot run complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n this.activePermissionMode = input.permissionMode ?? \"default\";\n\n try {\n if (this.client && this.alive) return;\n this.startInput = input;\n this.sessionId = undefined;\n this.client = this.clientFactory({\n command: this.config.command,\n args: modelArgs(this.config.args, input.model, this.config.modelFlag),\n cwd: input.cwd,\n env: input.env,\n onNotification: (notification) => this.routeNotification(notification),\n onServerRequest: (request) => this.handleServerRequest(request),\n onStderr: (text) =>\n input.onEvent?.({ type: \"runtime_stderr\", content: text }),\n onExit: (code, signal) => {\n this.client = null;\n this.onExit?.(code, signal);\n },\n });\n\n this.client.start();\n\n const initResult = (await withTimeout(\n this.client.request(\"initialize\", {\n protocolVersion: 1,\n clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" },\n capabilities: {},\n }),\n 10000,\n \"ACP initialize timeout\"\n )) as { agentInfo?: unknown };\n\n emit([], this.startInputAsRunInput(\"\"), {\n type: \"runtime_started\",\n data: { runtime: this.runtime, agent: initResult.agentInfo },\n });\n\n if (input.runtimeSessionId) {\n await this.client.request(\"session/load\", {\n sessionId: input.runtimeSessionId,\n cwd: input.cwd,\n mcpServers: [],\n });\n this.sessionId = input.runtimeSessionId;\n } else {\n const sessionResult = (await this.client.request(\"session/new\", {\n cwd: input.cwd,\n mcpServers: [],\n ...this.config.sessionNewExtras,\n })) as { sessionId?: string };\n this.sessionId = sessionResult.sessionId;\n if (!this.sessionId) throw new Error(`${this.runtime} session/new returned no session id`);\n }\n\n if (input.permissionMode === \"full_access\" && this.config.autoApproveMode) {\n await this.client.request(\"session/set_mode\", {\n sessionId: this.sessionId,\n modeId: this.config.autoApproveMode,\n });\n }\n } catch (error) {\n this.destroy(\"start failed\");\n throw error;\n }\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n let finalMessage = \"\";\n const events: RuntimeEvent[] = [];\n const sessionId = this.sessionId;\n const client = this.client;\n const startInput = this.startInput;\n const abortHandler = () => client?.destroy();\n\n if (!client || !this.alive || !startInput || !sessionId) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: `${this.runtime} persistent runtime is not started`,\n };\n }\n\n const runInput = this.startInputAsRunInput(input.prompt, input);\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n this.activePrompt = {\n runInput,\n events,\n appendFinalMessage: (text) => {\n finalMessage += text;\n },\n };\n\n emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n const promptResult = (await withTimeout(\n client.request(\"session/prompt\", {\n sessionId,\n prompt: [{ type: \"text\", text: this.buildPrompt(startInput.systemPrompt, input.prompt) }],\n }),\n input.timeoutMs ?? 120000,\n \"ACP prompt timeout\"\n )) as { stopReason?: string; usage?: unknown; _meta?: unknown };\n\n emit(events, runInput, {\n type: \"turn_finished\",\n data: {\n stopReason: promptResult.stopReason,\n usage: promptResult.usage ?? promptResult._meta,\n },\n });\n\n return { status: \"ok\", finalMessage, runtimeSessionId: sessionId, events };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId: sessionId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.activePrompt = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.client && (this.client.alive ?? this.client.isRunning ?? true));\n }\n\n get pid(): number | undefined {\n return this.client?.pid;\n }\n\n destroy(_reason?: string): void {\n this.activePrompt = null;\n this.client?.destroy();\n this.client = null;\n this.sessionId = undefined;\n }\n\n async handleServerRequestForTest(request: JsonRpcServerRequest): Promise<unknown> {\n return this.handleServerRequest(request);\n }\n\n protected buildPrompt(systemPrompt: string, userPrompt: string): string {\n return `<system>\\n${systemPrompt}\\n</system>\\n\\n${userPrompt}`;\n }\n\n protected async handleServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n if (request.method === \"session/request_permission\") {\n const runInput = this.activePrompt?.runInput ?? this.startInput;\n if (this.activePermissionMode === \"full_access\") {\n return permissionOutcome(selectPermissionOption(request.params, true));\n }\n if (!runInput?.requestPermission) return permissionOutcome(selectPermissionOption(request.params, false));\n const decision = await runInput.requestPermission({\n kind: \"session\",\n title: \"Runtime permission requested\",\n description: summarizeAcpPermissionParams(request.params),\n metadata: { method: request.method, params: request.params },\n });\n return permissionOutcome(selectPermissionOption(request.params, decision.action === \"approve\"));\n }\n return {};\n }\n\n private routeNotification(notification: JsonRpcNotification): void {\n const active = this.activePrompt;\n if (!active) return;\n this.handleNotification(\n notification,\n active.events,\n active.runInput,\n active.appendFinalMessage\n );\n }\n\n private startInputAsRunInput(prompt: string, input: Partial<RuntimePromptInput> = {}): RuntimeRunInput {\n const startInput = this.startInput;\n if (!startInput) {\n throw new Error(`${this.runtime} persistent runtime is not started`);\n }\n return {\n ...startInput,\n prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n }\n\n private handleNotification(\n notification: JsonRpcNotification,\n events: RuntimeEvent[],\n input: RuntimeRunInput,\n appendFinalMessage: (text: string) => void\n ): void {\n if (notification.method !== \"session/update\") return;\n const params = notification.params as { update?: Record<string, unknown> } | undefined;\n const update = params?.update;\n const sessionUpdate = stringValue(update?.sessionUpdate);\n if (!update || !sessionUpdate) return;\n\n switch (sessionUpdate) {\n case \"agent_message_chunk\": {\n const content = update.content as { type?: string; text?: string } | undefined;\n if (content?.text) {\n appendFinalMessage(content.text);\n emit(events, input, {\n type: \"assistant_delta\",\n content: content.text,\n data: update,\n });\n }\n break;\n }\n case \"agent_thought_chunk\": {\n const content = update.content as { type?: string; text?: string } | undefined;\n if (content?.text) {\n emit(events, input, {\n type: \"thinking_delta\",\n content: content.text,\n data: update,\n });\n }\n break;\n }\n case \"tool_call\": {\n emit(events, input, {\n type: \"tool_start\",\n content: stringValue(update.title) ?? \"\",\n data: update,\n });\n break;\n }\n case \"tool_call_update\": {\n emit(events, input, {\n type: update.status === \"completed\" ? \"tool_result\" : \"tool_progress\",\n content: stringValue(update.title) ?? \"\",\n data: update,\n });\n break;\n }\n case \"usage_update\": {\n emit(events, input, { type: \"usage_update\", data: update });\n break;\n }\n case \"available_commands_update\":\n case \"session_info_update\": {\n events.push({ type: sessionUpdate, data: update });\n break;\n }\n default: {\n events.push({ type: `acp_${sessionUpdate}`, data: update });\n }\n }\n }\n}\n\nexport function classifyProtocolError(error: unknown): RuntimeRunResult[\"status\"] {\n const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n if (msg.includes(\"enoent\") || msg.includes(\"not found\")) return \"not_installed\";\n if (\n msg.includes(\"auth\") ||\n msg.includes(\"login\") ||\n msg.includes(\"api key\") ||\n msg.includes(\"401\")\n ) {\n return \"not_logged_in\";\n }\n if (msg.includes(\"timeout\") || msg.includes(\"aborted\") || msg.includes(\"abort\")) {\n return \"timeout\";\n }\n return \"runtime_error\";\n}\n\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(message)), ms);\n promise.then(resolve, reject).finally(() => clearTimeout(timer));\n });\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n events.push(event);\n input.onEvent?.(event);\n}\n\nfunction summarizeAcpPermissionParams(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"Runtime requested permission.\";\n const record = params as Record<string, unknown>;\n const reason = typeof record.reason === \"string\" ? record.reason : undefined;\n const title = typeof record.title === \"string\" ? record.title : undefined;\n const command = typeof record.command === \"string\" ? record.command : undefined;\n return [title, command, reason].filter(Boolean).join(\"\\n\") || JSON.stringify(record).slice(0, 500);\n}\n\nfunction modelArgs(args: string[], model: string | undefined, enabled = true): string[] {\n if (!enabled || !model || model === \"default\") return args;\n return [...args, \"--model\", model];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function permissionOutcome(optionId: string): {\n outcome: { outcome: \"selected\"; optionId: string };\n} {\n return { outcome: { outcome: \"selected\", optionId } };\n}\n\nexport function selectPermissionOption(params: unknown, preferAllow = true): string {\n const options = Array.isArray((params as { options?: unknown } | undefined)?.options)\n ? ((params as { options: Array<{ optionId?: unknown }> }).options)\n : [];\n if (!preferAllow) {\n const deny = options.find((option) => {\n const optionId = String(option.optionId ?? \"\");\n return /reject|deny|no|cancel/i.test(optionId);\n });\n return String(deny?.optionId ?? options[0]?.optionId ?? \"reject\");\n }\n const allowed = options.find((option) => {\n const optionId = String(option.optionId ?? \"\");\n return /allow|approve|yes|accept/i.test(optionId);\n });\n return String(allowed?.optionId ?? options[0]?.optionId ?? \"allow-once\");\n}\n", "import type { RuntimeEvent } from \"./adapter\";\n\nexport interface ClaudeStreamJsonParseResult {\n sessionId?: string;\n model?: string;\n finalMessage?: string;\n appendFinalMessage?: string;\n events: RuntimeEvent[];\n turnFinished: boolean;\n}\n\nexport function parseClaudeStreamJsonLine(line: string): ClaudeStreamJsonParseResult | undefined {\n if (!line.trim()) return undefined;\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n return undefined;\n }\n\n const msg = message as Record<string, unknown>;\n const result: ClaudeStreamJsonParseResult = {\n events: [],\n turnFinished: false,\n };\n\n switch (msg.type) {\n case \"system\": {\n if (msg.subtype === \"init\") {\n result.sessionId = stringValue(msg.session_id);\n result.model = stringValue(msg.model);\n result.events.push({\n type: \"runtime_started\",\n data: { runtime: \"claude\", sessionId: result.sessionId, model: result.model },\n });\n } else if (msg.subtype === \"status\" && msg.status === \"compacting\") {\n result.events.push({ type: \"compaction_started\" });\n } else if (msg.subtype === \"compact_boundary\") {\n result.events.push({ type: \"compaction_finished\" });\n }\n break;\n }\n case \"stream_event\": {\n const event = msg.event as Record<string, unknown> | undefined;\n if (event?.type === \"content_block_delta\") {\n const delta = event.delta as Record<string, unknown> | undefined;\n if (delta?.type === \"text_delta\" && typeof delta.text === \"string\") {\n result.appendFinalMessage = delta.text;\n result.events.push({ type: \"assistant_delta\", content: delta.text, data: delta });\n }\n if (delta?.type === \"thinking_delta\" && typeof delta.thinking === \"string\") {\n result.events.push({ type: \"thinking_delta\", content: delta.thinking, data: delta });\n }\n }\n break;\n }\n case \"assistant\": {\n const text = contentBlocks(msg.message)\n .filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n .map((block) => String(block.text))\n .join(\"\");\n if (text) result.finalMessage = text;\n for (const block of contentBlocks(msg.message)) {\n if (block.type === \"tool_use\") {\n result.events.push({\n type: \"tool_start\",\n content: stringValue(block.name) ?? \"\",\n data: { id: block.id, name: block.name, input: block.input },\n });\n }\n }\n break;\n }\n case \"user\": {\n if (msg.isSynthetic) {\n for (const block of contentBlocks(msg.message)) {\n if (block.type === \"tool_result\") {\n result.events.push({ type: \"tool_result\", data: block });\n }\n }\n }\n break;\n }\n case \"tool_progress\": {\n result.events.push({ type: \"tool_progress\", data: msg });\n break;\n }\n case \"result\": {\n result.turnFinished = true;\n result.events.push({\n type: \"turn_finished\",\n data: {\n cost: msg.total_cost_usd,\n duration: msg.duration_ms,\n usage: msg.usage,\n },\n });\n break;\n }\n }\n\n return result;\n}\n\nexport function claudeStreamJsonPromptMessage(prompt: string): string {\n return JSON.stringify({\n type: \"user\",\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: prompt }],\n },\n });\n}\n\nfunction contentBlocks(message: unknown): Array<Record<string, unknown>> {\n const msg = message as { content?: unknown } | undefined;\n return Array.isArray(msg?.content)\n ? msg.content.filter((block): block is Record<string, unknown> =>\n typeof block === \"object\" && block !== null\n )\n : [];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n", "import type {\n PersistentRuntimeAdapter,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport {\n classifyProtocolError,\n withTimeout,\n} from \"./acp-adapter\";\nimport {\n JsonRpcStdioClient,\n type JsonRpcNotification,\n type JsonRpcServerRequest,\n type JsonRpcStdioClientOptions,\n} from \"./json-rpc-stdio-client\";\n\nexport interface CodexJsonRpcClient {\n start(): void;\n request(method: string, params?: unknown): Promise<unknown>;\n destroy(): void;\n readonly isRunning?: boolean;\n readonly alive?: boolean;\n readonly pid?: number;\n}\n\nexport type CodexClientFactory = (\n options: JsonRpcStdioClientOptions\n) => CodexJsonRpcClient;\n\ninterface ActiveCodexTurn {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n appendMessage(text: string): void;\n setFinalMessage(text: string): void;\n resolveTurnCompleted(): void;\n}\n\nexport class CodexAdapter implements RuntimeAdapter, PersistentRuntimeAdapter {\n readonly runtime = \"codex\" as const;\n private client: CodexJsonRpcClient | null = null;\n private threadId: string | undefined;\n private startInput: RuntimeStartInput | null = null;\n private activeTurn: ActiveCodexTurn | null = null;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(\n private readonly clientFactory: CodexClientFactory = (options) =>\n new JsonRpcStdioClient(options)\n ) {}\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n await this.destroy(\"one-shot run complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n try {\n if (this.client && this.alive) return;\n this.startInput = input;\n this.threadId = undefined;\n this.client = this.clientFactory({\n command: \"codex\",\n args: [\"app-server\", \"--listen\", \"stdio://\"],\n cwd: input.cwd,\n env: input.env,\n onNotification: (notification) => this.routeNotification(notification),\n onServerRequest: (request) => this.handleServerRequest(request),\n onStderr: (text) =>\n input.onEvent?.({ type: \"runtime_stderr\", content: text }),\n onExit: (code, signal) => {\n this.client = null;\n this.onExit?.(code, signal);\n },\n });\n\n this.client.start();\n await withTimeout(\n this.client.request(\"initialize\", {\n clientInfo: {\n name: \"wm-daemon\",\n title: \"Wage Mule Daemon\",\n version: \"0.0.1\",\n },\n capabilities: { experimentalApi: true },\n }),\n 10000,\n \"Codex initialize timeout\"\n );\n\n emit([], this.startInputAsRunInput(\"\"), { type: \"runtime_started\", data: { runtime: \"codex\" } });\n\n if (input.runtimeSessionId) {\n await this.client.request(\"thread/resume\", {\n threadId: input.runtimeSessionId,\n cwd: input.cwd,\n ...codexPermissionOptions(input.permissionMode),\n approvalsReviewer: \"user\",\n developerInstructions: input.systemPrompt,\n model: input.model && input.model !== \"default\" ? input.model : undefined,\n config: codexReasoningConfig(input.reasoningEffort),\n excludeTurns: true,\n persistExtendedHistory: true,\n });\n this.threadId = input.runtimeSessionId;\n } else {\n const response = (await this.client.request(\"thread/start\", {\n cwd: input.cwd,\n ...codexPermissionOptions(input.permissionMode),\n approvalsReviewer: \"user\",\n developerInstructions: input.systemPrompt,\n model: input.model && input.model !== \"default\" ? input.model : undefined,\n config: codexReasoningConfig(input.reasoningEffort),\n persistExtendedHistory: true,\n serviceName: \"wm-daemon\",\n })) as { thread?: { id?: string } };\n this.threadId = response.thread?.id;\n if (!this.threadId) throw new Error(\"Codex thread/start returned no thread id\");\n }\n } catch (error) {\n this.destroy(\"start failed\");\n throw error;\n }\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n const events: RuntimeEvent[] = [];\n let finalMessage = \"\";\n let turnId: string | undefined;\n let resolveTurnCompleted: (() => void) | undefined;\n const turnCompleted = new Promise<void>((resolve) => {\n resolveTurnCompleted = resolve;\n });\n const client = this.client;\n const threadId = this.threadId;\n const startInput = this.startInput;\n const abortHandler = () => client?.destroy();\n\n if (!client || !this.alive || !threadId || !startInput) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: \"Codex persistent runtime is not started\",\n };\n }\n\n const runInput = this.startInputAsRunInput(input.prompt, input);\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n this.activeTurn = {\n runInput,\n events,\n appendMessage: (text) => {\n finalMessage += text;\n },\n setFinalMessage: (text) => {\n finalMessage = text;\n },\n resolveTurnCompleted: () => resolveTurnCompleted?.(),\n };\n\n const response = (await client.request(\"turn/start\", {\n threadId,\n cwd: startInput.cwd,\n ...codexPermissionOptions(startInput.permissionMode),\n approvalsReviewer: \"user\",\n input: [{ type: \"text\", text: input.prompt, text_elements: [] }],\n })) as { turn?: { id?: string } } | undefined;\n turnId = response?.turn?.id;\n emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n\n await withTimeout(\n turnCompleted,\n input.timeoutMs ?? 120000,\n \"Codex turn timeout\"\n );\n emit(events, runInput, { type: \"turn_finished\", data: { threadId, turnId } });\n\n return {\n status: \"ok\",\n finalMessage,\n runtimeSessionId: threadId,\n events,\n };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId: threadId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.activeTurn = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.client && (this.client.alive ?? this.client.isRunning ?? true));\n }\n\n get pid(): number | undefined {\n return this.client?.pid;\n }\n\n destroy(_reason?: string): void {\n this.activeTurn = null;\n this.client?.destroy();\n this.client = null;\n this.threadId = undefined;\n }\n\n private routeNotification(notification: JsonRpcNotification): void {\n const active = this.activeTurn;\n if (!active) return;\n this.handleNotification(notification, active.events, active.runInput, {\n appendMessage: active.appendMessage,\n setFinalMessage: active.setFinalMessage,\n });\n if (notification.method === \"turn/completed\") {\n active.resolveTurnCompleted();\n }\n }\n\n private startInputAsRunInput(prompt: string, input: Partial<RuntimePromptInput> = {}): RuntimeRunInput {\n const startInput = this.startInput;\n if (!startInput) {\n throw new Error(\"Codex persistent runtime is not started\");\n }\n return {\n ...startInput,\n prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n }\n\n private handleNotification(\n notification: JsonRpcNotification,\n events: RuntimeEvent[],\n input: RuntimeRunInput,\n final: { appendMessage(text: string): void; setFinalMessage(text: string): void }\n ): void {\n const params = notification.params as Record<string, unknown> | undefined;\n switch (notification.method) {\n case \"item/agentMessage/delta\": {\n const delta = String(params?.delta ?? \"\");\n if (delta) {\n final.appendMessage(delta);\n emit(events, input, {\n type: \"assistant_delta\",\n content: delta,\n data: params,\n });\n }\n break;\n }\n case \"item/reasoning/textDelta\":\n case \"item/reasoning/summaryTextDelta\": {\n const delta = String(params?.delta ?? \"\");\n if (delta) {\n emit(events, input, {\n type: \"thinking_delta\",\n content: delta,\n data: params,\n });\n }\n break;\n }\n case \"item/started\": {\n emit(events, input, { type: \"tool_start\", data: params });\n break;\n }\n case \"item/completed\": {\n const item = params?.item as Record<string, unknown> | undefined;\n if (item?.type === \"agentMessage\" && typeof item.text === \"string\") {\n final.setFinalMessage(item.text);\n emit(events, input, {\n type: \"assistant_result\",\n content: item.text,\n data: item,\n });\n } else {\n emit(events, input, { type: \"tool_result\", data: params });\n }\n break;\n }\n case \"item/commandExecution/outputDelta\":\n case \"item/fileChange/outputDelta\": {\n emit(events, input, {\n type: \"tool_progress\",\n content: String(params?.delta ?? \"\"),\n data: params,\n });\n break;\n }\n case \"thread/tokenUsage/updated\": {\n emit(events, input, { type: \"usage_update\", data: params });\n break;\n }\n default: {\n events.push({ type: notification.method, data: params });\n }\n }\n }\n\n private async handleServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n const runInput = this.activeTurn?.runInput ?? (this.startInput ? this.startInputAsRunInput(\"\") : undefined);\n if (runInput?.permissionMode === \"full_access\" || !runInput?.requestPermission) {\n if (request.method === \"item/fileChange/requestApproval\") return { decision: \"accept\" };\n if (request.method === \"item/permissions/requestApproval\") return { permissions: {}, scope: \"turn\" };\n return { decision: \"accept\" };\n }\n if (request.method === \"item/fileChange/requestApproval\") {\n const decision = await runInput.requestPermission({\n kind: \"file_change\",\n title: \"File change approval requested\",\n description: summarizePermissionParams(request.params),\n metadata: { method: request.method, params: request.params },\n });\n return { decision: decision.action === \"approve\" ? \"accept\" : \"reject\" };\n }\n if (request.method === \"item/permissions/requestApproval\") {\n const decision = await runInput.requestPermission({\n kind: \"permission\",\n title: \"Command permission requested\",\n description: summarizePermissionParams(request.params),\n metadata: { method: request.method, params: request.params },\n });\n return decision.action === \"approve\"\n ? { permissions: {}, scope: \"turn\" }\n : { permissions: null, scope: \"turn\" };\n }\n return { decision: \"accept\" };\n }\n}\n\nfunction summarizePermissionParams(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"Runtime requested permission.\";\n const record = params as Record<string, unknown>;\n const command = typeof record.command === \"string\" ? record.command : undefined;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n const reason = typeof record.reason === \"string\" ? record.reason : undefined;\n return [command, path, reason].filter(Boolean).join(\"\\n\") || JSON.stringify(record).slice(0, 500);\n}\n\nfunction codexPermissionOptions(permissionMode: RuntimeRunInput[\"permissionMode\"]): { approvalPolicy: string; sandbox: string } {\n if (permissionMode === \"full_access\") {\n return { approvalPolicy: \"never\", sandbox: \"danger-full-access\" };\n }\n return { approvalPolicy: \"on-request\", sandbox: \"workspace-write\" };\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n events.push(event);\n input.onEvent?.(event);\n}\n\nfunction codexReasoningConfig(reasoningEffort: string | undefined): { model_reasoning_effort: string } | undefined {\n const value = reasoningEffort?.trim();\n if (!value || value === \"default\") return undefined;\n return { model_reasoning_effort: value };\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\nimport type {\n RuntimeAdapter,\n RuntimeEvent,\n RuntimeRunInput,\n RuntimeRunResult,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\n\nexport type StreamJsonArgsBuilder = (input: RuntimeRunInput) => {\n command: string;\n args: string[];\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n};\n\nexport class StreamJsonCliAdapter implements RuntimeAdapter {\n constructor(\n readonly runtime: RuntimeId,\n private readonly build: StreamJsonArgsBuilder,\n private readonly processFactory: (\n input: RuntimeRunInput,\n command: string,\n args: string[],\n env?: NodeJS.ProcessEnv\n ) => ChildProcessWithoutNullStreams = (input, command, args, env) =>\n spawn(command, args, {\n cwd: input.cwd,\n env: env ?? input.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n })\n ) {}\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n const events: RuntimeEvent[] = [];\n let finalMessage = \"\";\n let runtimeSessionId = input.runtimeSessionId;\n const { command, args, stdin, env } = this.build(input);\n const child = this.processFactory(input, command, args, env);\n const lines = readline.createInterface({ input: child.stdout });\n const abortHandler = () => killProcessTree(child);\n\n const done = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"exit\", (code, signal) => resolve({ code, signal }));\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) {\n const event = { type: \"runtime_stderr\", content: text };\n events.push(event);\n input.onEvent?.(event);\n }\n });\n\n lines.on(\"line\", (line) => {\n const parsed = parseStreamJsonLine(this.runtime, line);\n if (!parsed) return;\n if (parsed.sessionId) runtimeSessionId = parsed.sessionId;\n if (parsed.appendFinalMessage) finalMessage += parsed.appendFinalMessage;\n if (parsed.finalMessage) finalMessage = parsed.finalMessage;\n for (const event of parsed.events) {\n events.push(event);\n input.onEvent?.(event);\n }\n });\n\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n input.onEvent?.({ type: \"task_delivered\", content: input.prompt });\n if (stdin !== undefined) child.stdin.end(stdin.endsWith(\"\\n\") ? stdin : `${stdin}\\n`);\n const exit = await withTimeout(done, input.timeoutMs ?? 180000, `${this.runtime} CLI turn timeout`);\n if (exit.code !== 0) {\n return {\n status: classifyProtocolError(new Error(`${this.runtime} exited code=${exit.code} signal=${exit.signal ?? \"-\"}`)),\n finalMessage,\n runtimeSessionId,\n events,\n errorMessage: `${this.runtime} exited code=${exit.code} signal=${exit.signal ?? \"-\"}`,\n };\n }\n events.push({ type: \"turn_finished\", data: { runtime: this.runtime, code: exit.code } });\n return { status: \"ok\", finalMessage, runtimeSessionId, events };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n lines.close();\n killProcessTree(child);\n }\n }\n}\n\ninterface ParsedStreamLine {\n sessionId?: string;\n appendFinalMessage?: string;\n finalMessage?: string;\n events: RuntimeEvent[];\n}\n\nexport function parseStreamJsonLine(runtime: RuntimeId, line: string): ParsedStreamLine | undefined {\n if (!line.trim()) return undefined;\n let value: unknown;\n try {\n value = JSON.parse(line);\n } catch {\n return {\n appendFinalMessage: `${line}\\n`,\n events: [{ type: \"runtime_stdout\", content: line }],\n };\n }\n const msg = value as Record<string, unknown>;\n const events: RuntimeEvent[] = [];\n const sessionId =\n stringValue(msg.session_id) ??\n stringValue(msg.sessionId) ??\n stringValue((msg.session as Record<string, unknown> | undefined)?.id) ??\n stringValue((msg.thread as Record<string, unknown> | undefined)?.id);\n\n const text =\n stringValue(msg.text) ??\n stringValue(msg.message) ??\n stringValue(msg.content) ??\n stringValue((msg.delta as Record<string, unknown> | undefined)?.text) ??\n stringValue((msg.data as Record<string, unknown> | undefined)?.text);\n\n if (/assistant|message|content|text|delta/i.test(String(msg.type ?? msg.event ?? \"\")) && text) {\n events.push({ type: \"assistant_delta\", content: text, data: msg });\n return { sessionId, appendFinalMessage: text, events };\n }\n\n if (/result|final|complete|done/i.test(String(msg.type ?? msg.event ?? \"\")) && text) {\n events.push({ type: \"turn_finished\", data: msg });\n return { sessionId, finalMessage: text, events };\n }\n\n if (/tool/i.test(String(msg.type ?? msg.event ?? \"\"))) {\n events.push({ type: String(msg.type ?? \"tool_progress\"), content: text, data: msg });\n return { sessionId, events };\n }\n\n if (sessionId) {\n events.push({ type: \"runtime_started\", data: { runtime, sessionId } });\n return { sessionId, events };\n }\n events.push({ type: String(msg.type ?? \"runtime_event\"), content: text, data: msg });\n return { events };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall back to killing the child below.\n }\n }\n child.kill();\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport type { JsonRpcServerRequest } from \"./json-rpc-stdio-client\";\nimport { StreamJsonCliAdapter } from \"./stream-json-cli-adapter\";\n\nexport class CursorAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"cursor\",\n command: \"cursor-agent\",\n args: [\"acp\"],\n });\n }\n\n protected override async handleServerRequest(\n request: JsonRpcServerRequest\n ): Promise<unknown> {\n if (request.method === \"session/request_permission\") {\n return super.handleServerRequest(request);\n }\n if (request.method === \"cursor/ask_question\") {\n const params = request.params as { options?: Array<{ optionId?: string }> };\n return { optionId: params.options?.[0]?.optionId ?? \"yes\" };\n }\n if (request.method === \"cursor/create_plan\") {\n return { decision: \"approve\" };\n }\n return {};\n }\n}\n\nexport class CursorCliAdapter extends StreamJsonCliAdapter {\n constructor() {\n super(\"cursor\", (input) => {\n const args = [\n \"--print\",\n \"--output-format\",\n \"stream-json\",\n \"--yolo\",\n \"--approve-mcps\",\n \"--trust\",\n ];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n if (input.runtimeSessionId) args.push(\"--resume\", input.runtimeSessionId);\n args.push(input.prompt);\n return { command: \"cursor-agent\", args };\n });\n }\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport { StreamJsonCliAdapter } from \"./stream-json-cli-adapter\";\n\nexport class GeminiAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"gemini\",\n command: \"gemini\",\n args: [\"--acp\", \"--skip-trust\"],\n autoApproveMode: \"yolo\",\n });\n }\n}\n\nexport class GeminiCliAdapter extends StreamJsonCliAdapter {\n constructor() {\n super(\"gemini\", (input) => {\n const args = [\"--output-format\", \"stream-json\", \"--yolo\", \"-p\", \"\"];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n if (input.runtimeSessionId) args.push(\"--resume\", input.runtimeSessionId);\n return {\n command: \"gemini\",\n args,\n stdin: input.prompt,\n env: {\n ...process.env,\n ...input.env,\n GEMINI_CLI_TRUST_WORKSPACE: input.env?.GEMINI_CLI_TRUST_WORKSPACE ?? \"true\",\n },\n };\n });\n }\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\n\nexport class HermesAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"hermes\",\n command: \"hermes\",\n args: [\"acp\", \"--accept-hooks\"],\n });\n }\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport type {\n PersistentRuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\nimport { parseStreamJsonLine } from \"./stream-json-cli-adapter\";\n\nexport class KimiAdapter implements PersistentRuntimeAdapter {\n readonly runtime = \"kimi\" as const;\n private child: ChildProcessWithoutNullStreams | null = null;\n private lines: readline.Interface | null = null;\n private startInput: RuntimeStartInput | null = null;\n private sessionId: string | undefined;\n private active: {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n append(text: string): void;\n set(text: string): void;\n finish(): void;\n } | null = null;\n private nextId = 1;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n this.destroy(\"one-shot run complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n if (this.child && this.alive) return;\n this.startInput = input;\n this.sessionId = input.runtimeSessionId || `wm-${input.agentId}`;\n const wmDir = path.join(input.cwd, \".wm\");\n await mkdir(wmDir, { recursive: true });\n const agentFile = path.join(wmDir, \"kimi-agent.yaml\");\n const mcpConfigFile = path.join(wmDir, \"kimi-mcp.json\");\n await writeFile(agentFile, kimiAgentYaml(input.systemPrompt), \"utf8\");\n await writeFile(mcpConfigFile, JSON.stringify({ mcpServers: {} }, null, 2), \"utf8\");\n\n const args = [\n \"--wire\",\n \"--yolo\",\n \"--agent-file\",\n agentFile,\n \"--mcp-config-file\",\n mcpConfigFile,\n \"--session\",\n this.sessionId,\n ];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n this.child = spawn(\"kimi\", args, {\n cwd: input.cwd,\n env: input.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n this.child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) input.onEvent?.({ type: \"runtime_stderr\", content: text });\n });\n this.child.on(\"exit\", (code, signal) => {\n this.child = null;\n this.onExit?.(code, signal);\n });\n this.child.on(\"error\", (error) => {\n input.onEvent?.({ type: \"runtime_error\", content: error.message });\n });\n this.lines = readline.createInterface({ input: this.child.stdout });\n this.lines.on(\"line\", (line) => this.handleLine(line));\n this.writeWire(\"initialize\", { clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" } });\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n const startInput = this.startInput;\n const child = this.child;\n let finalMessage = \"\";\n const events: RuntimeEvent[] = [];\n if (!startInput || !child || !this.alive) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: \"Kimi persistent runtime is not started\",\n };\n }\n let finishTurn: (() => void) | undefined;\n const turnFinished = new Promise<void>((resolve) => {\n finishTurn = resolve;\n });\n const runInput: RuntimeRunInput = {\n ...startInput,\n prompt: input.prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n const abortHandler = () => this.destroy(\"prompt aborted\");\n this.active = {\n runInput,\n events,\n append: (text) => {\n finalMessage += text;\n },\n set: (text) => {\n finalMessage = text;\n },\n finish: () => finishTurn?.(),\n };\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n events.push({ type: \"task_delivered\", content: input.prompt });\n this.writeWire(\"prompt\", { prompt: input.prompt, sessionId: this.sessionId });\n await withTimeout(turnFinished, input.timeoutMs ?? 180000, \"Kimi wire turn timeout\");\n return { status: \"ok\", finalMessage, runtimeSessionId: this.sessionId, events };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.active = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.child && !this.child.killed);\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n destroy(_reason?: string): void {\n this.active = null;\n this.lines?.close();\n this.lines = null;\n killProcessTree(this.child);\n this.child = null;\n }\n\n private writeWire(method: string, params: unknown): void {\n this.child?.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id: this.nextId++, method, params })}\\n`);\n }\n\n private handleLine(line: string): void {\n const parsed = parseStreamJsonLine(\"kimi\", line);\n if (!parsed) return;\n if (parsed.sessionId) this.sessionId = parsed.sessionId;\n const active = this.active;\n const runInput = active?.runInput ?? (this.startInput ? { ...this.startInput, prompt: \"\" } : undefined);\n if (!runInput) return;\n if (active) {\n if (parsed.appendFinalMessage) active.append(parsed.appendFinalMessage);\n if (parsed.finalMessage) active.set(parsed.finalMessage);\n if (parsed.events.some((event) => event.type === \"turn_finished\")) active.finish();\n for (const event of parsed.events) {\n active.events.push(event);\n runInput.onEvent?.(event);\n }\n }\n }\n}\n\nfunction kimiAgentYaml(systemPrompt: string): string {\n return [\n \"name: wm\",\n \"description: Wage Mule platform agent\",\n \"instructions: |-\",\n ...systemPrompt.split(/\\r?\\n/).map((line) => ` ${line}`),\n \"\",\n ].join(\"\\n\");\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall through.\n }\n }\n child.kill();\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport { StreamJsonCliAdapter } from \"./stream-json-cli-adapter\";\n\nexport class OpenCodeAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"opencode\",\n command: \"opencode\",\n args: [\"acp\"],\n });\n }\n}\n\nexport class OpenCodeCliAdapter extends StreamJsonCliAdapter {\n constructor() {\n super(\"opencode\", (input) => {\n const args = [\n \"run\",\n \"--format\",\n \"json\",\n \"--dangerously-skip-permissions\",\n \"--pure\",\n \"--dir\",\n input.cwd,\n ];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n args.push(\"--agent\", \"wm\");\n if (input.runtimeSessionId) args.push(\"--session\", input.runtimeSessionId);\n args.push(\"--\", input.prompt);\n return { command: \"opencode\", args };\n });\n }\n}\n", "import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n PersistentRuntimeAdapter,\n RuntimeRunInput,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport class FakePersistentRuntimeAdapter implements PersistentRuntimeAdapter {\n readonly runtime: RuntimeId;\n private child: ChildProcess | null = null;\n private startInput: RuntimeStartInput | null = null;\n private spawnCount = 0;\n private promptCount = 0;\n private runtimeSessionId: string | undefined;\n private oneShotRun = false;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(runtime: RuntimeId) {\n this.runtime = runtime;\n }\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n this.oneShotRun = true;\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n this.destroy(\"one-shot fake runtime complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n if (this.child && this.alive) return;\n this.startInput = input;\n this.spawnCount += 1;\n this.promptCount = 0;\n this.runtimeSessionId = input.runtimeSessionId || `${this.runtime}-fake-session`;\n await mkdir(input.cwd, { recursive: true });\n this.child = spawn(\"node\", [\"-e\", \"setInterval(() => {}, 1000)\"], {\n cwd: input.cwd,\n env: input.env ?? process.env,\n stdio: \"ignore\",\n detached: process.platform !== \"win32\",\n });\n this.child.on(\"exit\", (code, signal) => {\n this.child = null;\n this.onExit?.(code, signal);\n });\n input.onEvent?.({\n type: \"runtime_started\",\n data: { runtime: this.runtime, fake: true, pid: this.pid },\n });\n await this.writeDiagnostic();\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n if (!this.startInput || !this.alive) {\n return {\n status: \"runtime_error\",\n finalMessage: \"\",\n events: [],\n errorMessage: `${this.runtime} fake persistent runtime is not started`,\n };\n }\n this.promptCount += 1;\n await this.writeDiagnostic();\n await sleep(fakePersistentRuntimeDelayMs(), input.abortSignal);\n const events: RuntimeEvent[] = [\n { type: \"assistant_result\", content: `fake ${this.runtime} prompt ${this.promptCount}: ${input.prompt}` },\n { type: \"turn_finished\", data: { fake: true, promptCount: this.promptCount } },\n ];\n for (const event of events) {\n this.startInput.onEvent?.(event);\n }\n await this.writeDiagnostic();\n return {\n status: \"ok\",\n finalMessage: `fake ${this.runtime} prompt ${this.promptCount}`,\n runtimeSessionId: this.runtimeSessionId,\n events,\n };\n }\n\n get alive(): boolean {\n return Boolean(this.child && !this.child.killed);\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n destroy(_reason?: string): void {\n const child = this.child;\n this.child = null;\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n return;\n } catch {\n // Fall through.\n }\n }\n child.kill(\"SIGTERM\");\n }\n\n private async writeDiagnostic(): Promise<void> {\n if (!this.startInput) return;\n const dir = path.join(this.startInput.cwd, \".wm\", \"runtime-sessions\");\n await mkdir(dir, { recursive: true });\n await writeFile(\n path.join(dir, \"current.json\"),\n `${JSON.stringify({\n runtime: this.runtime,\n agentId: this.startInput.agentId,\n pid: this.pid,\n spawnCount: this.spawnCount,\n promptCount: this.promptCount,\n lastPromptSeq: this.promptCount,\n model: this.startInput.model ?? \"default\",\n cwd: this.startInput.cwd,\n persistent: !this.oneShotRun,\n }, null, 2)}\\n`,\n \"utf8\"\n );\n }\n}\n\nfunction fakePersistentRuntimeDelayMs(): number {\n const raw = Number.parseInt(process.env.WM_DAEMON_FAKE_RUNTIME_DELAY_MS ?? \"\", 10);\n return Number.isFinite(raw) && raw >= 0 ? raw : 10;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new Error(\"Fake persistent runtime aborted\"));\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => {\n clearTimeout(timer);\n reject(new Error(\"Fake persistent runtime aborted\"));\n }, { once: true });\n });\n}\n", "import { ClaudeAdapter, ClaudePersistentAdapter } from \"./claude-adapter\";\nimport { CodexAdapter } from \"./codex-adapter\";\nimport { CursorCliAdapter } from \"./cursor-acp-adapter\";\nimport { GeminiCliAdapter } from \"./gemini-acp-adapter\";\nimport { HermesAcpAdapter } from \"./hermes-acp-adapter\";\nimport { KimiAdapter } from \"./kimi-adapter\";\nimport { OpenCodeCliAdapter } from \"./opencode-acp-adapter\";\nimport { FakePersistentRuntimeAdapter } from \"./fake-persistent-adapter\";\nimport type { PersistentRuntimeAdapter, RuntimeAdapter } from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport function createRuntimeAdapter(runtime: RuntimeId): RuntimeAdapter {\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n return new FakePersistentRuntimeAdapter(runtime);\n }\n switch (runtime) {\n case \"codex\":\n return new CodexAdapter();\n case \"claude\":\n return new ClaudeAdapter();\n case \"kimi\":\n return new KimiAdapter();\n case \"gemini\":\n return new GeminiCliAdapter();\n case \"cursor\":\n return new CursorCliAdapter();\n case \"hermes\":\n return new HermesAcpAdapter();\n case \"opencode\":\n return new OpenCodeCliAdapter();\n }\n}\n\nexport interface PersistentRuntimeAdapterStatus {\n runtime: RuntimeId;\n available: boolean;\n reason?: string;\n}\n\nexport function createPersistentRuntimeAdapter(runtime: RuntimeId): PersistentRuntimeAdapter | undefined {\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n return isPersistentRuntime(runtime) ? new FakePersistentRuntimeAdapter(runtime) : undefined;\n }\n switch (runtime) {\n case \"codex\":\n return new CodexAdapter();\n case \"claude\":\n return new ClaudePersistentAdapter();\n case \"kimi\":\n return new KimiAdapter();\n case \"gemini\":\n return undefined;\n case \"cursor\":\n return undefined;\n case \"hermes\":\n return new HermesAcpAdapter();\n case \"opencode\":\n return undefined;\n }\n}\n\nfunction isPersistentRuntime(runtime: RuntimeId): boolean {\n return runtime === \"codex\" || runtime === \"claude\" || runtime === \"kimi\" || runtime === \"hermes\";\n}\n\nexport function persistentRuntimeAdapterStatus(runtime: RuntimeId): PersistentRuntimeAdapterStatus {\n const adapter = createPersistentRuntimeAdapter(runtime);\n return {\n runtime,\n available: adapter !== undefined,\n reason: adapter === undefined\n ? \"runtime uses per-turn session resume\"\n : undefined,\n };\n}\n", "import assert from \"node:assert/strict\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n RuntimeAdapter,\n RuntimeRunResult,\n RuntimeRunStatus,\n} from \"../runtime/adapter\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\nimport {\n createAgentWorkspace,\n type AgentRuntime,\n type AgentWorkspace,\n} from \"../workspace/agent-workspace\";\n\nconst smokePrompt = [\n \"Create or update a file named wm-daemon-smoke.txt in the current working directory.\",\n \"The file must contain exactly these 12 bytes with no trailing newline: WM_DAEMON_OK\",\n \"Do not use `echo`; use a file write method that does not append a newline.\",\n \"Also create or update `notes/smoke-memory.md` with one short sentence saying this workspace can write notes.\",\n \"Then reply with exactly: WM_DAEMON_OK\",\n].join(\"\\n\");\n\nexport function buildAgentIdentityPrompt(agentId: string, runtime: RuntimeId): string {\n return [\n \"\u4F60\u662F\u8C01\uFF1F\",\n `\u8BF7\u57FA\u4E8E\u5E73\u53F0\u6CE8\u5165\u7684\u8EAB\u4EFD\u56DE\u7B54\uFF0C\u5FC5\u987B\u660E\u786E\u5305\u542B Agent ID: ${agentId}`,\n `\u5E76\u660E\u786E\u5305\u542B Runtime: ${runtime}`,\n \"\u4E0D\u8981\u53EA\u56DE\u7B54\u4F60\u662F\u5E95\u5C42\u6A21\u578B\u6216 CLI\u3002\",\n ].join(\"\\n\");\n}\n\nexport function assertAgentIdentityResult(input: {\n runtime: RuntimeId;\n agentId: string;\n finalMessage: string;\n}): void {\n const message = input.finalMessage.toLowerCase();\n assert.ok(\n message.includes(input.agentId.toLowerCase()),\n `${input.runtime}: identity answer must mention agent id ${input.agentId}; got ${JSON.stringify(input.finalMessage.slice(0, 300))}`\n );\n assert.ok(\n message.includes(input.runtime.toLowerCase()),\n `${input.runtime}: identity answer must mention runtime ${input.runtime}; got ${JSON.stringify(input.finalMessage.slice(0, 300))}`\n );\n}\n\nexport async function runAdapterIdentityTest(input: {\n adapter: RuntimeAdapter;\n workspace: AgentWorkspace;\n agentId: string;\n runtime: RuntimeId;\n runtimeSessionId?: string;\n timeoutMs?: number;\n}): Promise<RuntimeRunResult & { status: RuntimeRunStatus }> {\n const systemPrompt = await readFile(input.workspace.systemPromptPath, \"utf8\");\n const result = await input.adapter.run({\n agentId: input.agentId,\n cwd: input.workspace.agentDir,\n prompt: buildAgentIdentityPrompt(input.agentId, input.runtime),\n systemPrompt,\n systemPromptPath: input.workspace.systemPromptPath,\n runtimeSessionId: input.runtimeSessionId,\n timeoutMs: input.timeoutMs,\n });\n\n if (result.status === \"ok\") {\n assertAgentIdentityResult({\n runtime: input.runtime,\n agentId: input.agentId,\n finalMessage: result.finalMessage,\n });\n }\n\n return result;\n}\n\nexport interface RunAdapterSmokeTestInput {\n rootDir: string;\n runDir?: string;\n serverNamespace: string;\n serverId: string;\n daemonId: string;\n agentId: string;\n agentName: string;\n runtime: AgentRuntime;\n role?: string;\n adapter: RuntimeAdapter;\n machineDirectoryName?: string;\n agentDirectoryName?: string;\n}\n\nexport interface RunAdapterSmokeTestResult extends RuntimeRunResult {\n workspace: AgentWorkspace;\n}\n\nexport async function runAdapterSmokeTest(\n input: RunAdapterSmokeTestInput\n): Promise<RunAdapterSmokeTestResult> {\n assert.equal(\n input.adapter.runtime,\n input.runtime,\n \"adapter runtime must match requested runtime\"\n );\n\n const workspace = await createAgentWorkspace({\n ...input,\n machineDirectoryName: input.machineDirectoryName ?? input.serverNamespace,\n agentDirectoryName: input.agentDirectoryName ?? input.agentId,\n });\n const runDir = input.runDir ?? workspace.agentDir;\n const systemPrompt = await readFile(workspace.systemPromptPath, \"utf8\");\n const result = await input.adapter.run({\n agentId: input.agentId,\n cwd: runDir,\n prompt: smokePrompt,\n systemPrompt,\n systemPromptPath: workspace.systemPromptPath,\n });\n\n await recordRuntimeSession(workspace, input.runtime, result);\n\n if (result.status !== \"ok\") {\n return {\n ...result,\n workspace,\n };\n }\n\n const fileContent = await readFile(\n path.join(runDir, \"wm-daemon-smoke.txt\"),\n \"utf8\"\n );\n assert.ok(\n result.finalMessage.includes(\"WM_DAEMON_OK\"),\n `Final message from ${input.runtime} must contain WM_DAEMON_OK, got: ${JSON.stringify(result.finalMessage.slice(0, 200))}`\n );\n assert.equal(\n fileContent,\n \"WM_DAEMON_OK\",\n `Unexpected smoke file content from ${input.runtime}: ${JSON.stringify(fileContent)}`\n );\n const noteContent = await readFile(\n path.join(runDir, \"notes\", \"smoke-memory.md\"),\n \"utf8\"\n );\n assert.match(noteContent, /workspace can write notes/i);\n\n return {\n ...result,\n workspace,\n };\n}\n\nasync function recordRuntimeSession(\n workspace: AgentWorkspace,\n runtime: AgentRuntime,\n result: RuntimeRunResult\n): Promise<void> {\n await mkdir(workspace.runtimeSessionsDir, { recursive: true });\n const resume =\n result.status === \"ok\" && result.runtimeSessionId\n ? \"native_resume\"\n : \"unsupported_or_unverified\";\n\n await writeFile(\n path.join(workspace.runtimeSessionsDir, `${runtime}.json`),\n `${JSON.stringify(\n {\n runtime,\n status: result.status,\n resume,\n runtimeSessionId: result.runtimeSessionId,\n note:\n result.status === \"ok\"\n ? \"Runtime session handoff recorded by wm-daemon smoke harness.\"\n : result.errorMessage,\n },\n null,\n 2\n )}\\n`,\n \"utf8\"\n );\n}\n", "import { chmod, cp, mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { scanAgentSkills } from \"../agent-manager/skill-scanner\";\nimport { skillTemplatesForWorkspace } from \"../skills/templates\";\n\nexport type AgentRuntime =\n | \"codex\"\n | \"claude\"\n | \"kimi\"\n | \"gemini\"\n | \"cursor\"\n | \"hermes\"\n | \"opencode\";\n\nexport interface CreateAgentWorkspaceInput {\n rootDir: string;\n serverNamespace: string;\n serverId: string;\n machineDirectoryName: string;\n machineId?: string;\n agentDirectoryName: string;\n daemonId: string;\n agentId: string;\n agentName: string;\n runtime: AgentRuntime;\n role?: string;\n feishuDelegationEnabled?: boolean;\n}\n\nexport interface AgentWorkspace {\n serverDir: string;\n agentDir: string;\n wmDir: string;\n memoryPath: string;\n notesDir: string;\n runtimeSessionsDir: string;\n runsDir: string;\n agentTokenPath: string;\n wrapperPath: string;\n wrapperCliPath: string;\n systemPromptPath: string;\n}\n\nexport async function createAgentWorkspace(\n input: CreateAgentWorkspaceInput\n): Promise<AgentWorkspace> {\n const serverDir = input.machineId\n ? path.join(input.rootDir, input.machineDirectoryName)\n : path.join(input.rootDir, input.serverNamespace);\n const agentDir = path.join(serverDir, input.agentDirectoryName);\n const wmDir = path.join(agentDir, \".wm\");\n const notesDir = path.join(agentDir, \"notes\");\n const runtimeSessionsDir = path.join(wmDir, \"runtime-sessions\");\n const runsDir = path.join(wmDir, \"runs\");\n const memoryPath = path.join(agentDir, \"MEMORY.md\");\n const agentTokenPath = path.join(wmDir, \"agent-token\");\n const wrapperPath = path.join(wmDir, \"wm\");\n const wrapperCliPath = path.join(wmDir, \"wm-cli.js\");\n const systemPromptPath = path.join(wmDir, \"system-prompt.md\");\n\n await mkdir(notesDir, { recursive: true });\n await mkdir(runtimeSessionsDir, { recursive: true });\n await mkdir(runsDir, { recursive: true });\n await syncWorkspaceSkills(wmDir, Boolean(input.feishuDelegationEnabled));\n\n await writeFile(memoryPath, buildMemory(input), { flag: \"wx\" }).catch((error) => {\n if (error?.code !== \"EEXIST\") {\n throw error;\n }\n });\n await writeFile(agentTokenPath, buildAgentToken(input), { flag: \"wx\" }).catch(\n (error) => {\n if (error?.code !== \"EEXIST\") {\n throw error;\n }\n }\n );\n await writeFile(systemPromptPath, await buildSystemPrompt(input, { agentDir, wrapperPath }), \"utf8\");\n await writeFile(wrapperCliPath, buildWrapperCli(), \"utf8\");\n await writeFile(wrapperPath, buildWrapper(wrapperCliPath), \"utf8\");\n await chmod(wrapperPath, 0o755);\n\n return {\n serverDir,\n agentDir,\n wmDir,\n memoryPath,\n notesDir,\n runtimeSessionsDir,\n runsDir,\n agentTokenPath,\n wrapperPath,\n wrapperCliPath,\n systemPromptPath,\n };\n}\n\nfunction buildMemory(input: CreateAgentWorkspaceInput): string {\n const role = input.role?.trim() || \"Wage Mule local agent\";\n\n return [\n `# ${input.agentName}`,\n \"\",\n \"## Role\",\n \"\",\n role,\n \"\",\n \"## Key Knowledge\",\n \"\",\n \"- No durable knowledge has been recorded yet.\",\n \"- Add stable user preferences, project context, and work history to notes, then link them from this file.\",\n \"\",\n \"## Active Context\",\n \"\",\n \"- First startup.\",\n \"- Before long work, keep this section current enough to recover after interruption or context compression.\",\n \"\",\n \"## Memory Index\",\n \"\",\n \"- `notes/user-preferences.md` -- User preferences, communication style, recurring requests, and conventions.\",\n \"- `notes/work-log.md` -- Important completed work, decisions, failed approaches, and verification history.\",\n \"- `notes/channels.md` -- Platform channel, DM, and thread context when relevant.\",\n \"- `notes/<domain>.md` -- Domain-specific knowledge that deserves its own durable file.\",\n \"\",\n \"## Platform Context\",\n \"\",\n `- Agent ID: ${input.agentId}`,\n `- Server Namespace: ${input.serverNamespace}`,\n `- Server ID: ${input.serverId}`,\n ...(input.machineId ? [`- Machine ID: ${input.machineId}`] : []),\n `- Daemon ID: ${input.daemonId}`,\n `- Runtime: ${input.runtime}`,\n \"\",\n \"## Memory Rules\",\n \"\",\n \"- MEMORY.md is the recovery index for this agent.\",\n \"- `MEMORY.md` is the recovery index for this agent.\",\n \"- Keep `MEMORY.md` concise and update it when new note files are added.\",\n \"- Keep detailed long-lived knowledge in `notes/`.\",\n \"- Do not store secrets, tokens, passwords, private keys, or sensitive credentials in memory or notes.\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function buildSystemPrompt(\n input: CreateAgentWorkspaceInput,\n paths: { agentDir: string; wrapperPath: string }\n): Promise<string> {\n const role = input.role?.trim() || \"Wage Mule local agent\";\n const workspaceSkills = await buildWorkspaceSkillsSection(input);\n\n return [\n `You are \"${input.agentName}\", an AI agent in Wage Mule -- a collaborative platform where humans and agents work together in shared channels while local daemon processes execute agent runtime sessions.`,\n \"\",\n \"## Who you are\",\n \"\",\n \"Your platform identity, agent directory, MEMORY.md, notes, and runtime session handoff persist across turns. You may be started, put to sleep when idle, and resumed when the platform delivers more work. Treat yourself as a platform-created colleague with durable local context, not as a one-off command.\",\n \"\",\n \"## Current Runtime Context\",\n \"\",\n \"This section is authoritative daemon-injected context. Do not infer platform identity from hostname, cwd, runtime account, local user name, or non-platform-created runtime sessions when this section is present.\",\n \"\",\n `- Agent ID: ${input.agentId}`,\n `- Agent Name: ${input.agentName}`,\n `- Server Namespace: ${input.serverNamespace}`,\n `- Server ID: ${input.serverId}`,\n ...(input.machineId ? [`- Machine ID: ${input.machineId}`] : []),\n `- Daemon ID: ${input.daemonId}`,\n `- Hostname: ${os.hostname() || \"unknown\"}`,\n `- Runtime: ${input.runtime}`,\n `- Role: ${role}`,\n `- Agent Directory: ${paths.agentDir}`,\n `- Memory File: ${path.join(paths.agentDir, \"MEMORY.md\")}`,\n `- Notes Directory: ${path.join(paths.agentDir, \"notes\")}`,\n `- wm CLI Wrapper: ${paths.wrapperPath}`,\n \"\",\n \"## Communication -- wm CLI\",\n \"\",\n \"Use the daemon-created `wm` CLI wrapper for platform chat, task, attachment, profile, and reminder operations. Prefer the absolute wm CLI Wrapper path from Current Runtime Context when a task prompt provides it; the daemon also prepends the wrapper directory to PATH as a convenience. The commands listed below are implemented platform commands, not placeholders.\",\n \"\",\n \"Available platform commands:\",\n \"\",\n \"1. `wm message check` -- Non-blocking check for new channel, DM, or thread messages at natural breakpoints.\",\n \"2. `wm message send` -- Send a channel, DM, or thread reply through the platform.\",\n \"3. `wm dm send` -- Send a private agent-to-agent DM, optionally waiting for a reply.\",\n \"4. `wm message read` -- Read visible history with pagination or around a specific message.\",\n \"5. `wm message search` -- Search visible channel and DM history before answering historical questions.\",\n \"6. `wm server info` -- Inspect the current server, visible channels, humans, agents, and memberships.\",\n \"7. `wm channel members` -- Inspect members of a channel, DM, or thread target.\",\n \"8. `wm member find` -- Find platform members by Feishu open_id.\",\n \"9. `wm task list` -- View task messages for a channel or relevant target.\",\n \"10. `wm task claim` -- Claim a task before doing work that changes files, runs tools, or performs multi-step investigation.\",\n \"11. `wm task unclaim` -- Release a task you cannot or should not continue.\",\n \"12. `wm task update` -- Move a task through statuses such as todo, in_progress, in_review, and done.\",\n \"13. `wm task create` -- Create genuine new follow-up work when no canonical message/task exists.\",\n \"14. `wm attachment upload` -- Upload a local artifact and reference it in a platform message.\",\n \"15. `wm attachment view` -- Download and inspect a platform attachment.\",\n \"16. `wm profile show` -- Inspect your own profile or a visible human/agent profile.\",\n \"17. `wm profile update` -- Update your display name, description, or avatar when explicitly asked.\",\n \"18. `wm reminder schedule` -- Schedule a platform-visible reminder for follow-up work.\",\n \"19. `wm reminder list` -- List reminders and their lifecycle history.\",\n \"20. `wm reminder snooze` -- Push an existing reminder later.\",\n \"21. `wm reminder update` -- Change a reminder without creating a duplicate.\",\n \"22. `wm reminder cancel` -- Cancel a reminder that is no longer needed.\",\n \"\",\n \"Diagnostic command:\",\n \"\",\n \"- `wm auth whoami` prints the current platform identity and server URL.\",\n \"- Use `--json` on wm commands only when you need machine-readable output; default output is optimized for agent collaboration.\",\n \"- Use platform communication commands as the only channel for channel/task-visible communication. Runtime stdout/final answers are daemon transport details, not the long-term platform protocol.\",\n \"\",\n \"## Work Surface Routing\",\n \"\",\n \"First identify where the requested work must happen, then choose the tool for that surface.\",\n \"\",\n \"- Wage Mule platform: use `wm` for channel replies, DMs, thread collaboration, tasks, attachments, profiles, reminders, and questions directed at other platform agents.\",\n \"- Local workspace: use normal filesystem and shell tools for code, documents, local diagnostics, and verification.\",\n \"- External systems: use the relevant installed workspace skill, token, CLI, or API for tools outside Wage Mule, such as Feishu/Lark.\",\n \"- Do not turn external-contact requests into platform mentions. If the user asks you to contact a person through an external system, use that external system and then report the result back to the original platform thread.\",\n \"- If a request needs both surfaces, do the external work on the external surface and use `wm message send` only for the platform-visible progress or final report.\",\n \"\",\n \"## CRITICAL RULES\",\n \"\",\n \"- Other agents may be running on different machines. Do not use local processes, workspaces, server activity, task lists, or runtime sessions to answer what another agent is doing.\",\n \"- When a human asks you to ask, check, confirm, contact, or get status from another platform agent, your first platform action is to ask that agent in the original message thread with `wm message send --target \\\"#channel:<message>\\\"` and an @mention.\",\n \"- When the request explicitly calls for a private agent DM, use `wm dm send --to-agent-id <agent_id>` instead of a thread mention.\",\n \"- Wait for that agent's platform reply via delivered messages, `wm message check`, or recent unread output; then summarize the reply in the same thread.\",\n \"- `wm server info`, `wm channel members`, and `wm task list` are discovery tools. They are not authoritative answers for another agent's current work.\",\n \"\",\n \"## Startup sequence\",\n \"\",\n \"1. If the current turn includes a concrete incoming user/platform message, decide whether it needs a quick acknowledgment, blocker question, or ownership signal before deep work.\",\n \"2. Read `MEMORY.md` before handling normal work. Then read only the additional notes or repository files needed for this turn.\",\n \"3. If the message asks for multi-step work, update the Active Context section in `MEMORY.md` before diving deep when interruption would lose important state.\",\n \"4. If the message asks you to take action beyond a simple answer, claim the task when `wm task claim` is available before starting substantial work.\",\n \"5. Complete the requested work end to end when feasible: inspect context, make changes if needed, run verification, then report the result.\",\n \"6. After significant work or learning, update `notes/` and then update `MEMORY.md` so future resumes can recover the context.\",\n \"7. At natural breakpoints in long work, check for platform messages when `wm message check` is available.\",\n \"8. Before stopping, send or return one concise summary containing result, verification, blockers, and next relevant path.\",\n \"\",\n \"## Messaging model\",\n \"\",\n \"Platform messages may come from channels, DMs, or threads. Server-delivered messages carry structured target, message id, timestamp, sender kind, and sender identity. Reply in the same target unless the platform explicitly asks for a different surface. For channel main messages that start a collaboration, create or use that message's thread target.\",\n \"\",\n \"Target examples:\",\n \"\",\n \"```text\",\n \"[target=#all msg=a1b2c3d4 time=2026-03-15T01:00:00 type=human] @user: hello\",\n \"[target=#all:a1b2c3d4 msg=f3a4b5c6 time=2026-03-15T01:00:03 type=human] @user: thread reply\",\n \"[target=dm:@user msg=c9d0e1f2 time=2026-03-15T01:00:02 type=human] @user: can you help?\",\n \"```\",\n \"\",\n \"- Reuse the exact target when replying in a future `wm message send` call.\",\n \"- Treat system messages as state changes; do not reply unless they clearly request action.\",\n \"- Keep private channel or DM context inside that authorized surface.\",\n \"- When a user references prior platform discussion, search/read history first once `wm message search` and `wm message read` are available.\",\n \"\",\n \"## Tasks\",\n \"\",\n \"A message is work when fulfilling it requires tool use, code changes, file edits, investigation, deployment, or multi-step execution. When task commands are available:\",\n \"\",\n \"- Claim before starting substantial work.\",\n \"- If claiming fails, stop work on that task and report or pick another task only if instructed.\",\n \"- Post progress in the task thread for multi-step work.\",\n \"- Prefer updating an existing task over creating duplicates.\",\n \"- Move finished work to review/done according to platform workflow.\",\n \"- Split large work into independent subtasks only when it genuinely enables parallel execution.\",\n \"\",\n \"## Communication style\",\n \"\",\n \"- Be concise, concrete, and transparent about blockers.\",\n \"- For multi-step work, provide brief progress updates when platform messaging is available.\",\n \"- Do not flood channels with idle narration.\",\n \"- Do not summarize another agent's owned work unless explicitly asked.\",\n \"- Keep URLs next to non-English punctuation wrapped in angle brackets or markdown links.\",\n \"\",\n \"## Workspace & Memory\",\n \"\",\n \"- The Agent Directory belongs only to this platform-created agent.\",\n \"- The daemon starts the runtime with the Agent Directory as cwd; files created by relative path stay inside this workspace.\",\n \"- `MEMORY.md` is the recovery index for who you are, what you know, what is active, and where detailed notes live.\",\n \"- Keep `MEMORY.md` concise. Use it as a table of contents and active recovery point, not as an unbounded transcript.\",\n \"- Create or update files under `notes/` for detailed durable knowledge such as user preferences, work history, channel context, and domain notes.\",\n \"- Suggested note files: `notes/user-preferences.md`, `notes/work-log.md`, `notes/channels.md`, and `notes/<domain>.md`.\",\n \"- After significant work or learning, update `notes/` and then update `MEMORY.md` to link or summarize the new durable context.\",\n \"- Before long work, update the Active Context section in `MEMORY.md` enough that you can resume after interruption or context compression.\",\n \"- Do not import local sessions, agents, profiles, memories, or identities that were not created by Wage Mule.\",\n \"- Runtime-native session/resume state is owned by the runtime adapter. Use it, but do not rewrite or normalize it unless the daemon explicitly asks.\",\n \"- Do not store secrets, tokens, passwords, private keys, or sensitive credentials in memory, notes, code, or logs.\",\n \"\",\n \"## Safety and permissions\",\n \"\",\n \"- Follow repository AGENTS.md or equivalent local instructions before editing code.\",\n \"- Do not commit, push, deploy, delete important files, or perform externally visible actions unless explicitly instructed.\",\n \"- Do not store secrets, tokens, passwords, or private keys in code, memory, notes, or logs.\",\n \"- If local and platform instructions conflict, prefer the most specific valid instruction and report the conflict.\",\n \"\",\n ...workspaceSkills,\n ].join(\"\\n\");\n}\n\nasync function syncWorkspaceSkills(wmDir: string, feishuEnabled: boolean): Promise<void> {\n const skillsDir = path.join(wmDir, \"skills\");\n await mkdir(skillsDir, { recursive: true });\n for (const template of skillTemplatesForWorkspace()) {\n const targetDir = path.join(skillsDir, template.name);\n await mkdir(targetDir, { recursive: true });\n await writeFile(path.join(targetDir, \"SKILL.md\"), template.content, \"utf8\");\n }\n await rm(path.join(skillsDir, \"lark\"), { recursive: true, force: true });\n if (feishuEnabled) await copyLarksuiteSkills(skillsDir);\n}\n\nasync function copyLarksuiteSkills(skillsDir: string): Promise<void> {\n const sourceDir = await resolveLarksuiteSkillsSourceDir();\n const entries = await readdir(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith(\"lark-\")) continue;\n await cp(path.join(sourceDir, entry.name), path.join(skillsDir, entry.name), {\n recursive: true,\n force: true,\n });\n }\n}\n\nasync function resolveLarksuiteSkillsSourceDir(): Promise<string> {\n const candidates = [\n path.join(__dirname, \"..\", \"..\", \"vendor\", \"larksuite-cli-skills\"),\n path.join(__dirname, \"skills\", \"larksuite\"),\n ];\n for (const candidate of candidates) {\n try {\n const entries = await readdir(candidate, { withFileTypes: true });\n if (entries.some((entry) => entry.isDirectory() && entry.name === \"lark-im\")) return candidate;\n } catch {\n // Try the next runtime layout.\n }\n }\n throw new Error(\"official Lark/Feishu skills are missing from daemon package\");\n}\n\nasync function buildWorkspaceSkillsSection(input: CreateAgentWorkspaceInput): Promise<string[]> {\n const result = await scanAgentSkills({\n rootDir: input.rootDir,\n serverNamespace: input.serverNamespace,\n machineDirectoryName: input.machineDirectoryName,\n machineId: input.machineId ?? \"\",\n agentDirectoryName: input.agentDirectoryName,\n agentId: input.agentId,\n runtime: input.runtime,\n }).catch(() => ({ global: [], workspace: [] }));\n const skills = result.workspace\n .flatMap((group) => group.skills.map((skill) => ({ group, skill })))\n .filter(({ skill }) => skill.content?.trim());\n if (!skills.length) return [];\n\n const lines = [\n \"## Workspace Skills\",\n \"\",\n \"The following workspace skills are installed by the daemon for this agent. Treat them as active operating instructions when relevant.\",\n \"\",\n ];\n for (const { group, skill } of skills) {\n lines.push(`### ${skill.name}`, \"\");\n lines.push(`- Path: ${skill.path}`);\n lines.push(`- Source: ${group.root}`);\n if (skill.version) lines.push(`- Version: ${skill.version}`);\n if (skill.description) lines.push(`- Description: ${skill.description}`);\n lines.push(\"\", skill.content ?? \"\", \"\");\n }\n return lines;\n}\n\nfunction buildAgentToken(input: CreateAgentWorkspaceInput): string {\n return [\n `WM_DAEMON_SERVER_NAMESPACE=${input.serverNamespace}`,\n ...(input.machineId ? [`WM_DAEMON_MACHINE_ID=${input.machineId}`] : []),\n `WM_DAEMON_SERVER_ID=${input.serverId}`,\n `WM_DAEMON_DAEMON_ID=${input.daemonId}`,\n `WM_DAEMON_AGENT_ID=${input.agentId}`,\n `WM_DAEMON_RUNTIME=${input.runtime}`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildWrapper(wrapperCliPath: string): string {\n return `#!/usr/bin/env bash\nexec ${shellSingleQuote(process.execPath)} ${shellSingleQuote(wrapperCliPath)} \"$@\"\n`;\n}\n\nfunction buildWrapperCli(): string {\n return `#!/usr/bin/env node\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\n\nconst envPath = path.join(__dirname, \"runtime-env\");\nif (fs.existsSync(envPath)) {\n for (const line of fs.readFileSync(envPath, \"utf8\").split(/\\\\n/)) {\n const match = line.match(/^([^=]+)=(.*)$/);\n if (match && !process.env[match[1]]) process.env[match[1]] = match[2];\n }\n}\n\nconst args = process.argv.slice(2);\nconst [group, command] = args;\nconst help = \"Available commands: wm auth whoami; wm message send/check/read/search; wm dm send; wm server info; wm channel members; wm member find; wm task list/claim/unclaim/update/create; wm attachment upload/view; wm profile show/update; wm reminder schedule/list/snooze/update/cancel; wm inbox feishu-draft create/sent/failed\";\n\nfunction valueAfter(name) {\n const index = args.indexOf(name);\n return index === -1 ? undefined : args[index + 1];\n}\n\nfunction hasFlag(name) {\n return args.includes(name);\n}\n\nfunction positionalText() {\n const knownOptions = new Set([\"--target\", \"--channel\", \"--text\", \"--content\", \"--attachment-ids\", \"--query\", \"--q\", \"--around\", \"--status\", \"--id\", \"--task-id\", \"--title\", \"--description\", \"--file\", \"--at\", \"--every\", \"--role\", \"--instructions\", \"--body\", \"--to-agent-id\", \"--timeout\", \"--feishu-open-id\", \"--open-id\", \"--delegation-id\", \"--human-id\", \"--feishu-message-id\", \"--chat-id\", \"--sender-name\", \"--sender-open-id\", \"--original-text\", \"--draft-text\", \"--risk\", \"--message-id\", \"--error\"]);\n const values = [];\n for (let index = 2; index < args.length; index++) {\n const arg = args[index];\n if (knownOptions.has(arg)) {\n index++;\n continue;\n }\n if (!arg.startsWith(\"-\")) values.push(arg);\n }\n return values.join(\" \").trim();\n}\n\nasync function stdin() {\n if (process.stdin.isTTY) return \"\";\n return await new Promise((resolve) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", chunk => data += chunk);\n process.stdin.on(\"end\", () => resolve(data.trim()));\n });\n}\n\nasync function request(method, pathName, body) {\n const serverUrl = process.env.WM_SERVER_URL;\n const token = process.env.WM_AGENT_TOKEN;\n if (!serverUrl || !token) throw new Error(\"WM_SERVER_URL and WM_AGENT_TOKEN are required\");\n const response = await fetch(new URL(pathName, serverUrl), {\n method,\n headers: { authorization: \\`Bearer \\${token}\\`, \"content-type\": \"application/json\" },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n const text = await response.text();\n let payload;\n try { payload = text ? JSON.parse(text) : {}; } catch { payload = { text }; }\n if (!response.ok) throw new Error(payload.error || text || \\`HTTP \\${response.status}\\`);\n return payload;\n}\n\nfunction messageLine(message) {\n const target = message.target || message.read_target || \"#unknown\";\n const id = message.message_id || message.id || \"unknown\";\n const time = message.timestamp || (message.created_at ? new Date(message.created_at).toISOString() : \"\");\n const senderType = message.sender_type || message.author_type || \"unknown\";\n const sender = message.sender_name || message.author_name || message.author_id || \"unknown\";\n const content = message.content || message.text || \"\";\n return \\`[target=\\${target} msg=\\${String(id).slice(0, 12)} time=\\${time} type=\\${senderType}] @\\${sender}: \\${content}\\`;\n}\n\nfunction printResult(payload, text) {\n if (hasFlag(\"--json\")) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n console.log(text);\n }\n}\n\nfunction formatSendResult(result, target) {\n const messageId = result.messageId || result.message?.id || \"unknown\";\n const sentTarget = result.message?.target || target;\n const lines = [\\`Message sent to \\${sentTarget}. Message ID: \\${messageId}\\`];\n if (result.replyTargetHint) lines.push(\\`To reply in this message's thread, use target \"\\${result.replyTargetHint}\".\\`);\n const unread = result.recentUnread || [];\n if (unread.length) {\n lines.push(\"\", \"--- New messages you may have missed ---\");\n for (const message of unread) lines.push(messageLine(message));\n }\n return lines.join(\"\\\\n\");\n}\n\nfunction formatDmSendResult(payload) {\n const messageId = payload.messageId || payload.message?.id || \"unknown\";\n const lines = [\\`DM sent. Message ID: \\${messageId}\\`];\n if (payload.reply) {\n lines.push(\"\", \"--- Reply ---\", messageLine(payload.reply));\n } else if (payload.timed_out) {\n lines.push(\"Timed out waiting for reply.\");\n }\n return lines.join(\"\\\\n\");\n}\n\nfunction formatMessages(payload) {\n const messages = payload.messages || [];\n if (!messages.length) return \"No messages.\";\n return messages.map(messageLine).join(\"\\\\n\");\n}\n\nfunction formatSearch(payload) {\n const results = payload.results || [];\n if (!results.length) return \"No matching messages.\";\n return results.map((item) => \\`\\${messageLine({ ...item.message, target: item.target })}\\\\n hint: \\${item.read_hint}\\`).join(\"\\\\n\");\n}\n\nfunction formatServerInfo(payload) {\n const lines = [\n \\`Agent: \\${payload.identity?.name || payload.identity?.agent_id || \"unknown\"}\\`,\n \\`Runtime: \\${payload.identity?.runtime || \"unknown\"}\\`,\n \"Channels:\",\n ...((payload.channels || payload.channels || []).map((channel) => \\`- #\\${channel.name} (\\${channel.id})\\`)),\n \"Humans:\",\n ...((payload.humans || []).map((human) => \\`- @\\${human.name} (\\${human.id})\\`)),\n \"Agents:\",\n ...((payload.agents || []).map((agent) => \\`- @\\${agent.name} runtime=\\${agent.runtime} channel=\\${agent.channel_id || \"none\"}\\`)),\n \"Machines:\",\n ...((payload.machines || []).map((machine) => \\`- \\${machine.name} status=\\${machine.status} host=\\${machine.hostname}\\`)),\n ];\n return lines.join(\"\\\\n\");\n}\n\nfunction formatMembers(payload) {\n const members = payload.members || [];\n if (!members.length) return \"No visible members.\";\n return members.map((member) => \\`- \\${member.mention} type=\\${member.type}\\${member.runtime ? \\` runtime=\\${member.runtime}\\` : \"\"}\\`).join(\"\\\\n\");\n}\n\nfunction formatMemberFind(payload) {\n const lines = [];\n if (payload.human) {\n lines.push(\\`Human: @\\${payload.human.name} (\\${payload.human.id})\\`);\n if (payload.human.feishu_open_id) lines.push(\\`Feishu open_id: \\${payload.human.feishu_open_id}\\`);\n if (payload.human.email) lines.push(\\`Email: \\${payload.human.email}\\`);\n } else {\n lines.push(\"Human: not found\");\n }\n lines.push(\"Agents:\");\n if (payload.agents?.length) {\n for (const agent of payload.agents) {\n lines.push(\\`- @\\${agent.name} id=\\${agent.agent_id} runtime=\\${agent.runtime} machine=\\${agent.machine_id} \\${agent.online ? \"online\" : \"offline\"}\\`);\n }\n } else {\n lines.push(\"- none\");\n }\n return lines.join(\"\\\\n\");\n}\n\nfunction formatInboxDraft(payload, fallback) {\n const item = payload.item || {};\n return \\`\\${fallback}: \\${item.id || \"unknown\"} status=\\${item.status || \"unknown\"}\\`;\n}\n\nasync function main() {\n const agentId = process.env.WM_AGENT_ID || process.env.WM_DAEMON_AGENT_ID;\n if (group === \"auth\" && command === \"whoami\") {\n console.log(JSON.stringify({\n agentId,\n serverUrl: process.env.WM_SERVER_URL,\n serverNamespace: process.env.WM_DAEMON_SERVER_NAMESPACE,\n serverId: process.env.WM_DAEMON_SERVER_ID,\n daemonId: process.env.WM_DAEMON_DAEMON_ID,\n runtime: process.env.WM_DAEMON_RUNTIME\n }, null, 2));\n return;\n }\n if (!agentId) throw new Error(\"WM_AGENT_ID is required\");\n if (group === \"message\" && command === \"send\") {\n const target = valueAfter(\"--target\");\n const text = (valueAfter(\"--text\") || valueAfter(\"--content\") || await stdin() || positionalText()).trim();\n if (!text) throw new Error(\"message text is required; use --text, --content, stdin, or a positional message\");\n const attachmentIds = (valueAfter(\"--attachment-ids\") || \"\").split(\",\").map(s => s.trim()).filter(Boolean);\n const body = { text, attachment_ids: attachmentIds };\n if (target) body.target = target;\n const result = await request(\"POST\", \\`/internal/agent/\\${agentId}/send\\`, body);\n const payload = {\n message: result.message,\n messageId: result.messageId,\n replyTargetHint: result.replyTargetHint,\n recentUnread: result.recentUnread || []\n };\n printResult(payload, formatSendResult(payload, target));\n return;\n }\n if (group === \"dm\" && command === \"send\") {\n const toAgentId = valueAfter(\"--to-agent-id\");\n if (!toAgentId) throw new Error(\"--to-agent-id is required\");\n const text = (valueAfter(\"--text\") || valueAfter(\"--content\") || await stdin() || positionalText()).trim();\n if (!text) throw new Error(\"message text is required; use --text, --content, stdin, or a positional message\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/dm/send\\`, {\n to_agent_id: toAgentId,\n text,\n wait_for_reply: hasFlag(\"--wait-for-reply\"),\n timeout_ms: valueAfter(\"--timeout\") ? Number(valueAfter(\"--timeout\")) : undefined,\n });\n printResult(payload, formatDmSendResult(payload));\n return;\n }\n if (group === \"message\" && command === \"check\") {\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/receive\\`);\n printResult(payload, formatMessages(payload).replace(\"No messages.\", \"No new messages.\"));\n return;\n }\n if (group === \"message\" && command === \"read\") {\n const channel = valueAfter(\"--channel\") || valueAfter(\"--target\");\n const around = valueAfter(\"--around\");\n const params = new URLSearchParams();\n if (channel) params.set(\"target\", channel);\n if (around) params.set(\"around\", around);\n const suffix = params.toString() ? \\`?\\${params.toString()}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/history\\${suffix}\\`);\n printResult(payload, formatMessages(payload));\n return;\n }\n if (group === \"message\" && command === \"search\") {\n const query = valueAfter(\"--query\") || valueAfter(\"--q\") || positionalText();\n if (!query) throw new Error(\"--query is required\");\n const target = valueAfter(\"--target\") || valueAfter(\"--channel\");\n const params = new URLSearchParams({ query });\n if (target) params.set(\"target\", target);\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/search?\\${params.toString()}\\`);\n printResult(payload, formatSearch(payload));\n return;\n }\n if (group === \"server\" && command === \"info\") {\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/server\\`);\n printResult(payload, formatServerInfo(payload));\n return;\n }\n if ((group === \"channel\" || group === \"channel\") && command === \"members\") {\n const target = valueAfter(\"--target\") || valueAfter(\"--channel\");\n const params = target ? \\`?target=\\${encodeURIComponent(target)}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/channel/members\\${params}\\`);\n printResult(payload, formatMembers(payload));\n return;\n }\n if (group === \"member\" && command === \"find\") {\n const openId = (valueAfter(\"--feishu-open-id\") || valueAfter(\"--open-id\") || \"\").trim();\n if (!openId) throw new Error(\"--feishu-open-id is required\");\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/members/find?feishu_open_id=\\${encodeURIComponent(openId)}\\`);\n printResult(payload, formatMemberFind(payload));\n return;\n }\n if (group === \"inbox\" && command === \"feishu-draft\") {\n const action = args[2];\n if (action === \"create\") {\n const draftText = (valueAfter(\"--draft-text\") || await stdin()).trim();\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/inbox/feishu-draft\\`, {\n delegation_id: valueAfter(\"--delegation-id\"),\n human_id: valueAfter(\"--human-id\"),\n feishu_message_id: valueAfter(\"--feishu-message-id\"),\n chat_id: valueAfter(\"--chat-id\"),\n sender_name: valueAfter(\"--sender-name\"),\n sender_open_id: valueAfter(\"--sender-open-id\"),\n original_text: valueAfter(\"--original-text\"),\n draft_text: draftText,\n risk: valueAfter(\"--risk\"),\n });\n printResult(payload, formatInboxDraft(payload, \"Feishu draft created\"));\n return;\n }\n if (action === \"sent\") {\n const inboxId = valueAfter(\"--id\");\n if (!inboxId) throw new Error(\"--id is required\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/inbox/feishu-draft/\\${encodeURIComponent(inboxId)}/sent\\`, {\n message_id: valueAfter(\"--message-id\"),\n });\n printResult(payload, formatInboxDraft(payload, \"Feishu draft sent\"));\n return;\n }\n if (action === \"failed\") {\n const inboxId = valueAfter(\"--id\");\n if (!inboxId) throw new Error(\"--id is required\");\n const error = (valueAfter(\"--error\") || await stdin()).trim();\n if (!error) throw new Error(\"--error is required\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/inbox/feishu-draft/\\${encodeURIComponent(inboxId)}/failed\\`, { error });\n printResult(payload, formatInboxDraft(payload, \"Feishu draft failed\"));\n return;\n }\n }\n if (group === \"task\" && command === \"list\") {\n const status = valueAfter(\"--status\");\n const suffix = status ? \\`?status=\\${encodeURIComponent(status)}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/tasks\\${suffix}\\`);\n const tasks = payload.tasks || [];\n printResult(payload, tasks.length ? tasks.map((task) => \\`- \\${task.id} [\\${task.status}] \\${task.title}\\`).join(\"\\\\n\") : \"No tasks.\");\n return;\n }\n if (group === \"task\" && command === \"claim\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/claim\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\") });\n printResult(payload, \\`Task claimed: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"task\" && command === \"unclaim\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/unclaim\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\") });\n printResult(payload, \\`Task unclaimed: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"task\" && command === \"update\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/update\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\"), status: valueAfter(\"--status\") });\n printResult(payload, \\`Task updated: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"task\" && command === \"create\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/create\\`, { target: valueAfter(\"--target\"), title: valueAfter(\"--title\"), description: valueAfter(\"--description\") || await stdin() });\n printResult(payload, \\`Task created: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"attachment\" && command === \"upload\") {\n const file = valueAfter(\"--file\");\n if (!file) throw new Error(\"--file is required\");\n const buffer = fs.readFileSync(file);\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/upload\\`, {\n filename: path.basename(file),\n mime_type: \"application/octet-stream\",\n content_base64: buffer.toString(\"base64\")\n });\n printResult(payload, \\`Attachment uploaded: \\${payload.attachment?.id || \"unknown\"} \\${payload.attachment?.filename || \"\"}\\`);\n return;\n }\n if (group === \"attachment\" && command === \"view\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/download-attachment\\`, { attachment_id: valueAfter(\"--id\") });\n printResult(payload, \\`Attachment: \\${payload.attachment?.filename || payload.attachment?.id || \"unknown\"} size=\\${payload.attachment?.size || 0}\\\\n\\${payload.content_base64 || \"\"}\\`);\n return;\n }\n if (group === \"profile\" && command === \"show\") {\n const target = valueAfter(\"--target\");\n const params = target ? \\`?target=\\${encodeURIComponent(target)}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/profile\\${params}\\`);\n printResult(payload, Object.entries(payload.profile || {}).map(([key, value]) => \\`\\${key}: \\${value}\\`).join(\"\\\\n\"));\n return;\n }\n if (group === \"profile\" && command === \"update\") {\n const payload = await request(\"PATCH\", \\`/internal/agent/\\${agentId}/profile\\`, { role: valueAfter(\"--role\") || valueAfter(\"--description\"), instructions: valueAfter(\"--instructions\") || await stdin() });\n printResult(payload, \"Profile updated.\");\n return;\n }\n if (group === \"profile\" && command === \"migration-ack\") {\n const key = valueAfter(\"--key\");\n if (!key) throw new Error(\"--key is required\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/runtime-profile/migration-ack\\`, { migration_key: key });\n printResult(payload, \"Migration acknowledged.\");\n return;\n }\n if (group === \"reminder\" && command === \"schedule\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder\\`, { title: valueAfter(\"--title\"), fire_at: valueAfter(\"--at\"), recurrence: valueAfter(\"--every\") });\n printResult(payload, \\`Reminder scheduled: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n return;\n }\n if (group === \"reminder\" && command === \"list\") {\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/reminders\\`);\n const reminders = payload.reminders || [];\n printResult(payload, reminders.length ? reminders.map((reminder) => \\`- \\${reminder.id} [\\${reminder.status}] \\${reminder.title} at \\${reminder.fire_at}\\`).join(\"\\\\n\") : \"No reminders.\");\n return;\n }\n if (group === \"reminder\" && command === \"snooze\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder/snooze\\`, { reminder_id: valueAfter(\"--id\"), fire_at: valueAfter(\"--at\") });\n printResult(payload, \\`Reminder snoozed: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n return;\n }\n if (group === \"reminder\" && command === \"update\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder/update\\`, { reminder_id: valueAfter(\"--id\"), title: valueAfter(\"--title\"), body: valueAfter(\"--body\"), fire_at: valueAfter(\"--at\"), recurrence: valueAfter(\"--every\") });\n printResult(payload, \\`Reminder updated: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n return;\n }\n if (group === \"reminder\" && command === \"cancel\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder/cancel\\`, { reminder_id: valueAfter(\"--id\") });\n printResult(payload, \\`Reminder cancelled: \\${payload.reminder?.id || \"unknown\"}\\`);\n return;\n }\n console.error(\"Unknown wm command\");\n process.exit(2);\n}\n\nmain().catch((error) => {\n console.error(error && error.message ? error.message : String(error));\n process.exit(1);\n});\n`;\n}\n", "import { readdir, readFile, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentSkillDescriptor, AgentSkillGroup, RuntimeId } from \"@claude-console/shared\";\n\nexport interface ScanAgentSkillsInput {\n homeDir?: string;\n rootDir: string;\n serverNamespace: string;\n machineDirectoryName?: string;\n machineId: string;\n agentDirectoryName?: string;\n agentId: string;\n runtime: RuntimeId;\n}\n\nexport interface AgentSkillScanResult {\n global: AgentSkillGroup[];\n workspace: AgentSkillGroup[];\n}\n\nexport async function scanAgentSkills(input: ScanAgentSkillsInput): Promise<AgentSkillScanResult> {\n const homeDir = input.homeDir ?? os.homedir();\n const workspaceDir = input.machineDirectoryName\n ? path.join(input.rootDir, input.machineDirectoryName, input.agentDirectoryName ?? input.agentId)\n : path.join(input.rootDir, input.serverNamespace, input.machineId, input.agentId);\n return {\n global: await scanGroupedSkillRoots(runtimeSkillRoots(homeDir, input.runtime), \"global\"),\n workspace: await scanGroupedSkillRoots(workspaceSkillRoots(workspaceDir, input.runtime), \"workspace\"),\n };\n}\n\nfunction runtimeSkillRoots(homeDir: string, runtime: RuntimeId): Array<{ abs: string; label: string }> {\n if (runtime === \"claude\") {\n return [\n { abs: path.join(homeDir, \".claude\", \"skills\"), label: \"~/.claude/skills\" },\n { abs: path.join(homeDir, \".claude\", \"commands\"), label: \"~/.claude/commands\" },\n ];\n }\n if (runtime === \"codex\") return [\n { abs: path.join(homeDir, \".codex\", \"skills\"), label: \"~/.codex/skills\" },\n { abs: path.join(homeDir, \".codex\", \"skills\", \".system\"), label: \"~/.codex/skills/.system\" },\n { abs: path.join(homeDir, \".agents\", \"skills\"), label: \"~/.agents/skills\" },\n ];\n return [\n { abs: path.join(homeDir, \".codex\", \"skills\"), label: \"~/.codex/skills\" },\n { abs: path.join(homeDir, \".agents\", \"skills\"), label: \"~/.agents/skills\" },\n ];\n}\n\nfunction workspaceSkillRoots(workspaceDir: string, runtime: RuntimeId): Array<{ abs: string; label: string }> {\n const platform = [{ abs: path.join(workspaceDir, \".wm\", \"skills\"), label: \".wm/skills\" }];\n if (runtime === \"claude\") {\n return [\n { abs: path.join(workspaceDir, \".claude\", \"skills\"), label: \".claude/skills\" },\n { abs: path.join(workspaceDir, \".claude\", \"commands\"), label: \".claude/commands\" },\n ...platform,\n ];\n }\n return [\n { abs: path.join(workspaceDir, \".codex\", \"skills\"), label: \".codex/skills\" },\n { abs: path.join(workspaceDir, \".agents\", \"skills\"), label: \".agents/skills\" },\n ...platform,\n ];\n}\n\nasync function scanGroupedSkillRoots(\n roots: Array<{ abs: string; label: string }>,\n source: AgentSkillGroup[\"source\"]\n): Promise<AgentSkillGroup[]> {\n const groups = await Promise.all(roots.map(async (root) => {\n const skills = await scanSkillRoot(root.abs, root.label);\n return skills.length ? { source, root: root.label, skills } : null;\n }));\n return groups.filter((group): group is AgentSkillGroup => Boolean(group));\n}\n\nasync function scanSkillRoot(absRoot: string, labelRoot: string): Promise<AgentSkillDescriptor[]> {\n const entries = await readdir(absRoot, { withFileTypes: true }).catch((error) => {\n if (error?.code === \"ENOENT\") return [];\n throw error;\n });\n const skills: AgentSkillDescriptor[] = [];\n const seen = new Set<string>();\n for (const entry of entries) {\n let name = \"\";\n let skillFile = \"\";\n let skillPath = \"\";\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n if (entry.name === \".system\") continue;\n name = entry.name;\n skillFile = path.join(absRoot, entry.name, \"SKILL.md\");\n skillPath = `${labelRoot}/${entry.name}`;\n } else if (entry.name.endsWith(\".md\")) {\n name = entry.name.replace(/\\.md$/, \"\");\n skillFile = path.join(absRoot, entry.name);\n skillPath = `${labelRoot}/${entry.name}`;\n } else {\n continue;\n }\n if (seen.has(name) || !(await existsFile(skillFile))) continue;\n seen.add(name);\n const meta = await readSkillMeta(skillFile);\n skills.push({\n name,\n path: skillPath,\n description: meta.description,\n version: meta.version,\n content: meta.content,\n updatedAt: meta.updatedAt,\n });\n }\n return skills.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nasync function existsFile(filePath: string): Promise<boolean> {\n return stat(filePath).then((info) => info.isFile()).catch(() => false);\n}\n\nasync function readSkillMeta(filePath: string): Promise<{\n description?: string;\n version?: string;\n content?: string;\n updatedAt?: number;\n}> {\n const text = await readFile(filePath, \"utf8\").catch(() => \"\");\n if (!text) return {};\n const match = text.match(/^description:\\s*(.+)$/m);\n const version = text.match(/^version:\\s*(.+)$/m)?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n const description = match?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\")\n ?? text.split(/\\r?\\n/).find((line) => line.trim() && !line.startsWith(\"#\"))?.trim();\n const updatedAt = await stat(filePath).then((info) => info.mtimeMs).catch(() => undefined);\n return { description, version, content: text, updatedAt };\n}\n", "export interface WorkspaceSkillTemplate {\n name: string;\n content: string;\n}\n\nconst WM_PLATFORM_SKILL = `---\ndescription: WM platform tools\nversion: 0.1.0\n---\n# wm-platform\n\nUse this skill whenever you need to interact with Wage Mule platform state: channel messages, threads, DMs, tasks, attachments, profiles, reminders, server membership, or collaboration with another agent.\n\n## Core rules\n\n- Use \\`wm message send\\` for platform-visible replies.\n- Use the exact target from delivered messages when replying.\n- For channel requests that ask you to contact another agent, reply in the original message thread and @mention the target agent there.\n- Do not answer what another agent is doing by inspecting local processes or workspace files.\n- Use \\`wm message check\\` at natural breakpoints in long work.\n- Use \\`wm task claim\\` before substantial multi-step platform work.\n\n## Common commands\n\n- \\`wm auth whoami\\`\n- \\`wm message check\\`\n- \\`wm message read --target <target>\\`\n- \\`wm message send --target <target> --text <text>\\`\n- \\`wm server info\\`\n- \\`wm channel members --target <target>\\`\n- \\`wm task list --target <target>\\`\n- \\`wm task claim --id <task-id>\\`\n- \\`wm task update --id <task-id> --status <status>\\`\n`;\n\nexport function skillTemplatesForWorkspace(): WorkspaceSkillTemplate[] {\n return [{ name: \"wm-platform\", content: WM_PLATFORM_SKILL }];\n}\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { stdin as defaultInput, stdout as defaultOutput } from \"node:process\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { RuntimeAdapter, RuntimeEvent, RuntimeRunResult } from \"../runtime/adapter\";\nimport type { RuntimeDoctorResult } from \"../runtime/doctor\";\nimport { doctorRuntimes } from \"../runtime/doctor\";\nimport { createRuntimeAdapter } from \"../runtime/registry\";\nimport { supportedRuntimeIds, type RuntimeId } from \"../runtime/capabilities\";\nimport {\n clearLabServerCache,\n createLabAgent,\n defaultLabRootDir,\n defaultLabServerNamespace,\n listLabAgents,\n readLastRuntimeSessionId,\n recordLabRun,\n type LabAgent,\n} from \"./lab-store\";\nimport {\n PromptDriver,\n normalizeTerminalLine,\n shouldUseTerminalEditing,\n} from \"./lab-prompts\";\nimport {\n createLabUi,\n formatTable,\n heading,\n kv,\n shortPath,\n statusLabel,\n type LabUi,\n} from \"./lab-ui\";\n\nexport { normalizeTerminalLine, shouldUseTerminalEditing };\n\nexport interface InteractiveLabOptions {\n rootDir?: string;\n serverNamespace?: string;\n input?: Readable;\n output?: Writable;\n timeoutMs?: number;\n doctor?: typeof doctorRuntimes;\n adapterFactory?: (runtime: RuntimeId) => RuntimeAdapter;\n}\n\ninterface LabContext {\n rootDir: string;\n serverNamespace: string;\n prompt?: PromptDriver;\n output: Writable;\n input: Readable;\n ui: LabUi;\n timeoutMs: number;\n doctors: RuntimeDoctorResult[];\n doctor: typeof doctorRuntimes;\n adapterFactory: (runtime: RuntimeId) => RuntimeAdapter;\n}\n\nexport async function runInteractiveLab(\n options: InteractiveLabOptions = {}\n): Promise<void> {\n const output = options.output ?? defaultOutput;\n const outputIsTty = Boolean((output as { isTTY?: boolean }).isTTY);\n const context: LabContext = {\n rootDir: options.rootDir ?? defaultLabRootDir,\n serverNamespace: options.serverNamespace ?? defaultLabServerNamespace,\n input: options.input ?? defaultInput,\n output,\n ui: createLabUi({ color: outputIsTty && !process.env.NO_COLOR }),\n timeoutMs: options.timeoutMs ?? 180000,\n doctors: [],\n doctor: options.doctor ?? doctorRuntimes,\n adapterFactory: options.adapterFactory ?? createRuntimeAdapter,\n };\n\n try {\n printHeader(context);\n await clearLabServerCache(context.rootDir, context.serverNamespace);\n writeLine(context, context.ui.dim(`cleared ${shortPath(path.join(context.rootDir, context.serverNamespace))}`));\n context.doctors = await context.doctor();\n printDoctors(context);\n context.prompt = new PromptDriver(context.input, output);\n await mainMenu(context);\n } catch (error) {\n if (isPromptExitError(error)) {\n writeLine(context, \"\");\n writeLine(context, context.ui.muted(\"closed\"));\n return;\n }\n throw error;\n } finally {\n context.prompt?.close();\n }\n}\n\nasync function mainMenu(context: LabContext): Promise<void> {\n for (;;) {\n const action = await choose(context, \"Main\", [\n { label: \"Create agent\", value: \"create agent\" },\n { label: \"List agents\", value: \"list agents\" },\n { label: \"Agent detail\", value: \"agent detail\" },\n { label: \"Chat with agent\", value: \"chat with agent\" },\n { label: \"Doctor runtimes\", value: \"doctor runtimes\" },\n { label: \"Quit\", value: \"quit\" },\n ]);\n\n if (action === \"create agent\") {\n await createAgentFlow(context);\n } else if (action === \"list agents\") {\n await listAgentsFlow(context);\n } else if (action === \"agent detail\") {\n await agentDetailFlow(context);\n } else if (action === \"chat with agent\") {\n await chatFlow(context);\n } else if (action === \"doctor runtimes\") {\n context.doctors = await context.doctor();\n printDoctors(context);\n } else {\n return;\n }\n }\n}\n\nasync function createAgentFlow(context: LabContext): Promise<void> {\n const runtime = await chooseRuntime(context);\n const agentName = await askRequired(context, \"Agent name\");\n const description = await askRequired(context, \"Description\");\n const agent = await createLabAgent({\n rootDir: context.rootDir,\n serverNamespace: context.serverNamespace,\n runtime,\n agentName,\n description,\n });\n\n writeLine(context, \"\");\n writeLine(context, `${context.ui.good(\"created\")} ${agent.agentName} ${context.ui.muted(`(${agent.agentId})`)}`);\n printAgentDetail(context, agent);\n}\n\nasync function listAgentsFlow(context: LabContext): Promise<void> {\n const agents = await listLabAgents(context.rootDir, context.serverNamespace);\n writeLine(context, \"\");\n if (agents.length === 0) {\n writeLine(context, context.ui.muted(\"No agents yet.\"));\n return;\n }\n writeLine(context, heading(context.ui, \"Agents\"));\n writeLine(context, formatTable([\n [\"NAME\", \"RUNTIME\", \"STATUS\", \"CWD\"],\n ...agents.map((agent) => {\n const doctor = findDoctor(context, agent.runtime);\n return [\n agent.agentName,\n agent.runtime,\n statusLabel(context.ui, doctor?.status ?? \"unknown\"),\n shortPath(agent.cwd),\n ];\n }),\n ]));\n}\n\nasync function agentDetailFlow(context: LabContext): Promise<void> {\n const agent = await selectAgent(context);\n if (!agent) return;\n printAgentDetail(context, agent);\n}\n\nasync function chatFlow(context: LabContext): Promise<void> {\n const agent = await selectAgent(context);\n if (!agent) return;\n const adapter = context.adapterFactory(agent.runtime);\n\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, `Chat ${agent.agentName} / ${agent.runtime}`));\n writeLine(context, kv(context.ui, \"CWD\", shortPath(agent.cwd)));\n writeLine(context, kv(context.ui, \"Exit\", \"exit, quit, /exit, /quit, /back\"));\n\n for (;;) {\n const prompt = await ask(context, \"you\");\n if (!prompt.trim()) continue;\n if (isChatExitCommand(prompt)) return;\n\n const systemPrompt = await readFile(agent.workspace.systemPromptPath, \"utf8\");\n const runtimeSessionId = await readLastRuntimeSessionId(agent);\n const renderer = createRealtimeRenderer(context);\n writeLine(context, \"\");\n writeLine(context, `${context.ui.muted(\"run\")} ${context.ui.warn(\"started\")}`);\n if (runtimeSessionId) {\n writeLine(context, `${context.ui.muted(\"session\")} resume ${runtimeSessionId}`);\n }\n\n const result = await adapter.run({\n agentId: agent.agentId,\n cwd: agent.cwd,\n prompt,\n systemPrompt,\n systemPromptPath: agent.workspace.systemPromptPath,\n runtimeSessionId,\n timeoutMs: context.timeoutMs,\n onEvent: renderer.onEvent,\n });\n renderer.flush();\n await printResultAndRecord(context, agent, prompt, result);\n }\n}\n\nfunction isChatExitCommand(value: string): boolean {\n return [\"exit\", \"quit\", \"/exit\", \"/quit\", \"/back\"].includes(\n value.trim().toLowerCase()\n );\n}\n\nasync function printResultAndRecord(\n context: LabContext,\n agent: LabAgent,\n prompt: string,\n result: RuntimeRunResult\n): Promise<void> {\n writeLine(context, \"\");\n writeLine(context, `${context.ui.muted(\"run\")} ${statusLabel(context.ui, result.status)}`);\n if (result.runtimeSessionId) {\n writeLine(context, `${context.ui.muted(\"session\")} ${result.runtimeSessionId}`);\n }\n if (result.finalMessage.trim()) {\n writeLine(context, \"\");\n writeLine(context, context.ui.muted(\"assistant final\"));\n writeLine(context, result.finalMessage.trim());\n }\n if (result.errorMessage) {\n writeLine(context, \"\");\n writeLine(context, \"error:\");\n writeLine(context, result.errorMessage);\n }\n const runPath = await recordLabRun({ agent, prompt, result });\n writeLine(context, \"\");\n writeLine(context, kv(context.ui, \"log\", shortPath(runPath)));\n writeLine(context, kv(context.ui, \"agent dir\", shortPath(agent.workspace.agentDir)));\n writeLine(context, kv(context.ui, \"cwd\", shortPath(agent.cwd)));\n}\n\nasync function selectAgent(context: LabContext): Promise<LabAgent | undefined> {\n const agents = await listLabAgents(context.rootDir, context.serverNamespace);\n if (agents.length === 0) {\n writeLine(context, \"\");\n writeLine(context, \"No agents yet. Create one first.\");\n return undefined;\n }\n const value = await choose(\n context,\n \"Select agent\",\n agents.map((agent) => ({\n label: `${agent.agentName} (${agent.runtime})`,\n value: agent.agentId,\n }))\n );\n return agents.find((agent) => agent.agentId === value);\n}\n\nasync function chooseRuntime(context: LabContext): Promise<RuntimeId> {\n return choose(context, \"Runtime\", supportedRuntimeIds.map((runtime) => {\n const doctor = findDoctor(context, runtime);\n return {\n label: `${runtime} ${statusLabel(context.ui, doctor?.status ?? \"unknown\")}${\n doctor?.version ? ` ${context.ui.muted(doctor.version)}` : \"\"\n }`,\n value: runtime,\n };\n }));\n}\n\nfunction printDoctors(context: LabContext): void {\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, \"Runtime adapters\"));\n writeLine(context, formatTable([\n [\"STATUS\", \"RUNTIME\", \"VERSION\"],\n ...context.doctors.map((result) => [\n statusLabel(context.ui, result.status),\n result.runtime,\n result.version ?? context.ui.muted(\"-\"),\n ]),\n ]));\n}\n\nfunction printAgentDetail(context: LabContext, agent: LabAgent): void {\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, \"Agent\"));\n writeLine(context, kv(context.ui, \"Name\", agent.agentName));\n writeLine(context, kv(context.ui, \"ID\", agent.agentId));\n writeLine(context, kv(context.ui, \"Description\", agent.description));\n writeLine(context, kv(context.ui, \"Runtime\", agent.runtime));\n writeLine(context, kv(context.ui, \"Server\", agent.serverNamespace));\n writeLine(context, kv(context.ui, \"Agent dir\", shortPath(agent.workspace.agentDir)));\n writeLine(context, kv(context.ui, \"CWD\", shortPath(agent.cwd)));\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, \"Files\"));\n writeLine(context, kv(context.ui, \"MEMORY\", shortPath(agent.workspace.memoryPath)));\n writeLine(context, kv(context.ui, \"Notes\", shortPath(agent.workspace.notesDir)));\n writeLine(context, kv(context.ui, \"Prompt\", shortPath(agent.workspace.systemPromptPath)));\n writeLine(context, kv(context.ui, \"Sessions\", shortPath(agent.workspace.runtimeSessionsDir)));\n writeLine(context, kv(context.ui, \"Wrapper\", shortPath(agent.workspace.wrapperPath)));\n}\n\nasync function choose<T extends string>(\n context: LabContext,\n title: string,\n options: Array<{ label: string; value: T }>\n): Promise<T> {\n if (!context.prompt) throw new Error(\"Interactive lab input is not initialized\");\n return context.prompt.choose(\n title,\n options.map((option) => ({ name: option.label, value: option.value }))\n );\n}\n\nasync function askRequired(context: LabContext, label: string): Promise<string> {\n for (;;) {\n const value = await ask(context, label);\n if (value.trim()) return value.trim();\n writeLine(context, `${label} is required.`);\n }\n}\n\nasync function ask(context: LabContext, label: string): Promise<string> {\n if (!context.prompt) throw new Error(\"Interactive lab input is not initialized\");\n return context.prompt.inputText(label);\n}\n\nfunction findDoctor(\n context: LabContext,\n runtime: RuntimeId\n): RuntimeDoctorResult | undefined {\n return context.doctors.find((item) => item.runtime === runtime);\n}\n\nfunction createRealtimeRenderer(context: LabContext): {\n onEvent(event: RuntimeEvent): void;\n flush(): void;\n} {\n let stdoutBuffer = \"\";\n\n return {\n onEvent(event) {\n if (event.type === \"assistant_delta\" && event.content) {\n context.output.write(event.content);\n return;\n }\n if (event.type === \"runtime_stdout\" && event.content) {\n stdoutBuffer += event.content;\n const lines = stdoutBuffer.split(/\\r?\\n/);\n stdoutBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n renderRuntimeLine(context, line);\n }\n return;\n }\n if (event.type === \"runtime_stderr\" && event.content) {\n writeLine(context, `[stderr] ${event.content.trim()}`);\n }\n },\n flush() {\n if (stdoutBuffer.trim()) {\n renderRuntimeLine(context, stdoutBuffer);\n stdoutBuffer = \"\";\n }\n },\n };\n}\n\nfunction renderRuntimeLine(context: LabContext, line: string): void {\n if (!line.trim()) return;\n const text = extractTextFromRuntimeJsonLine(line);\n if (text) {\n writeLine(context, `assistant > ${text}`);\n return;\n }\n writeLine(context, `[event] ${line}`);\n}\n\nfunction extractTextFromRuntimeJsonLine(line: string): string | undefined {\n try {\n const record = JSON.parse(line) as Record<string, unknown>;\n const direct = stringValue(record.result ?? record.text ?? record.content);\n if (direct) return direct;\n\n const message = record.message as Record<string, unknown> | undefined;\n const messageText = message\n ? stringValue(message.text ?? message.content)\n : undefined;\n if (messageText) return messageText;\n const content = Array.isArray(message?.content) ? message?.content : [];\n const parts = content\n .map((part) =>\n typeof part === \"object\" && part\n ? stringValue((part as Record<string, unknown>).text)\n : undefined\n )\n .filter(Boolean);\n return parts.length > 0 ? parts.join(\"\") : undefined;\n } catch {\n return line;\n }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction writeLine(context: LabContext, line: string): void {\n context.output.write(`${line}\\n`);\n}\n\nfunction printHeader(context: LabContext): void {\n writeLine(context, heading(context.ui, \"wm-daemon lab\"));\n writeLine(context, kv(context.ui, \"Root\", shortPath(context.rootDir)));\n writeLine(context, kv(context.ui, \"Server\", context.serverNamespace));\n writeLine(context, \"\");\n}\n\nexport function isPromptExitError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"ExitPromptError\" ||\n error.message.includes(\"force closed the prompt\") ||\n error.message.includes(\"User force closed\"))\n );\n}\n", "import { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeRunResult } from \"../runtime/adapter\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\nimport {\n createAgentWorkspace,\n type AgentWorkspace,\n} from \"../workspace/agent-workspace\";\n\nexport const defaultLabRootDir = path.join(os.homedir(), \".wm\");\nexport const defaultLabServerNamespace = \"lab-local\";\n\nexport interface LabAgent {\n agentId: string;\n agentName: string;\n description: string;\n runtime: RuntimeId;\n cwd: string;\n serverNamespace: string;\n createdAt: string;\n updatedAt: string;\n workspace: AgentWorkspace;\n}\n\nexport interface CreateLabAgentInput {\n rootDir: string;\n serverNamespace: string;\n runtime: RuntimeId;\n agentName: string;\n description: string;\n cwd?: string;\n agentId?: string;\n now?: () => Date;\n}\n\nexport interface RecordLabRunInput {\n agent: LabAgent;\n prompt: string;\n result: RuntimeRunResult;\n now?: () => Date;\n}\n\nconst labMetadataName = \"lab-agent.json\";\n\nexport async function clearLabServerCache(\n rootDir: string,\n serverNamespace: string\n): Promise<void> {\n await rm(path.join(rootDir, serverNamespace), { recursive: true, force: true });\n await mkdir(path.join(rootDir, serverNamespace), { recursive: true });\n}\n\nexport async function createLabAgent(input: CreateLabAgentInput): Promise<LabAgent> {\n const now = (input.now ?? (() => new Date()))().toISOString();\n const agentId = await findAvailableAgentId(\n input.rootDir,\n input.serverNamespace,\n input.agentId ?? slugifyAgentName(input.agentName)\n );\n const workspace = await createAgentWorkspace({\n rootDir: input.rootDir,\n serverNamespace: input.serverNamespace,\n serverId: `lab:${input.serverNamespace}`,\n machineDirectoryName: input.serverNamespace,\n agentDirectoryName: agentId,\n daemonId: os.hostname() || \"local\",\n agentId,\n agentName: input.agentName,\n runtime: input.runtime,\n role: input.description,\n });\n const cwd = input.cwd?.trim() || workspace.agentDir;\n await mkdir(cwd, { recursive: true });\n\n const agent: LabAgent = {\n agentId,\n agentName: input.agentName,\n description: input.description,\n runtime: input.runtime,\n cwd,\n serverNamespace: input.serverNamespace,\n createdAt: now,\n updatedAt: now,\n workspace,\n };\n\n await writeAgentMetadata(agent);\n return agent;\n}\n\nexport async function listLabAgents(\n rootDir: string,\n serverNamespace: string\n): Promise<LabAgent[]> {\n const serverDir = path.join(rootDir, serverNamespace);\n const entries = await readdir(serverDir, { withFileTypes: true }).catch((error) => {\n if (error?.code === \"ENOENT\") return [];\n throw error;\n });\n const agents: LabAgent[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const metadataPath = path.join(serverDir, entry.name, \".wm\", labMetadataName);\n const metadata = await readFile(metadataPath, \"utf8\").catch((error) => {\n if (error?.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!metadata) continue;\n agents.push(hydrateAgent(JSON.parse(metadata) as StoredLabAgent, rootDir));\n }\n\n return agents.sort((a, b) => a.agentName.localeCompare(b.agentName));\n}\n\nexport async function readLastRuntimeSessionId(\n agent: LabAgent\n): Promise<string | undefined> {\n const sessionPath = path.join(\n agent.workspace.runtimeSessionsDir,\n `${agent.runtime}.json`\n );\n const raw = await readFile(sessionPath, \"utf8\").catch((error) => {\n if (error?.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!raw) return undefined;\n const payload = JSON.parse(raw) as { runtimeSessionId?: unknown; status?: unknown };\n return payload.status === \"ok\" && typeof payload.runtimeSessionId === \"string\"\n ? payload.runtimeSessionId\n : undefined;\n}\n\nexport async function recordLabRun(input: RecordLabRunInput): Promise<string> {\n const at = (input.now ?? (() => new Date()))().toISOString();\n const runId = at.replace(/[:.]/g, \"-\");\n const runsDir = path.join(input.agent.workspace.wmDir, \"runs\");\n const runPath = path.join(runsDir, `${runId}.jsonl`);\n await mkdir(runsDir, { recursive: true });\n\n const records = [\n { type: \"prompt\", at, content: input.prompt },\n ...input.result.events.map((event) => ({ ...event, at })),\n {\n type: \"final\",\n at,\n status: input.result.status,\n content: input.result.finalMessage,\n runtimeSessionId: input.result.runtimeSessionId,\n errorMessage: input.result.errorMessage,\n },\n ];\n\n await writeFile(\n runPath,\n `${records.map((record) => JSON.stringify(record)).join(\"\\n\")}\\n`,\n \"utf8\"\n );\n await writeRuntimeSession(input.agent, input.result);\n return runPath;\n}\n\nasync function writeRuntimeSession(\n agent: LabAgent,\n result: RuntimeRunResult\n): Promise<void> {\n await mkdir(agent.workspace.runtimeSessionsDir, { recursive: true });\n await writeFile(\n path.join(agent.workspace.runtimeSessionsDir, `${agent.runtime}.json`),\n `${JSON.stringify(\n {\n runtime: agent.runtime,\n status: result.status,\n runtimeSessionId: result.runtimeSessionId,\n updatedAt: new Date().toISOString(),\n note:\n result.status === \"ok\"\n ? \"Runtime session handoff recorded by wm-daemon lab.\"\n : result.errorMessage,\n },\n null,\n 2\n )}\\n`,\n \"utf8\"\n );\n}\n\nasync function writeAgentMetadata(agent: LabAgent): Promise<void> {\n await writeFile(\n path.join(agent.workspace.wmDir, labMetadataName),\n `${JSON.stringify(toStoredAgent(agent), null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nasync function findAvailableAgentId(\n rootDir: string,\n serverNamespace: string,\n preferred: string\n): Promise<string> {\n const base = preferred || \"agent\";\n for (let index = 0; index < 1000; index += 1) {\n const candidate = index === 0 ? base : `${base}-${index + 1}`;\n const agents = await listLabAgents(rootDir, serverNamespace);\n if (!agents.some((agent) => agent.agentId === candidate)) return candidate;\n }\n throw new Error(`Cannot allocate agent id for ${preferred}`);\n}\n\nfunction slugifyAgentName(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"agent\";\n}\n\ninterface StoredLabAgent {\n agentId: string;\n agentName: string;\n description: string;\n runtime: RuntimeId;\n cwd: string;\n serverNamespace: string;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction toStoredAgent(agent: LabAgent): StoredLabAgent {\n return {\n agentId: agent.agentId,\n agentName: agent.agentName,\n description: agent.description,\n runtime: agent.runtime,\n cwd: agent.cwd,\n serverNamespace: agent.serverNamespace,\n createdAt: agent.createdAt,\n updatedAt: agent.updatedAt,\n };\n}\n\nfunction hydrateAgent(stored: StoredLabAgent, rootDir: string): LabAgent {\n const serverDir = path.join(rootDir, stored.serverNamespace);\n const agentDir = path.join(serverDir, stored.agentId);\n const wmDir = path.join(agentDir, \".wm\");\n return {\n ...stored,\n workspace: {\n serverDir,\n agentDir,\n wmDir,\n memoryPath: path.join(agentDir, \"MEMORY.md\"),\n notesDir: path.join(agentDir, \"notes\"),\n runtimeSessionsDir: path.join(wmDir, \"runtime-sessions\"),\n runsDir: path.join(wmDir, \"runs\"),\n agentTokenPath: path.join(wmDir, \"agent-token\"),\n wrapperPath: path.join(wmDir, \"wm\"),\n wrapperCliPath: path.join(wmDir, \"wm-cli.js\"),\n systemPromptPath: path.join(wmDir, \"system-prompt.md\"),\n },\n };\n}\n", "import readline from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\n\ntype InquirerPrompts = typeof import(\"@inquirer/prompts\");\n\nexport class PromptDriver {\n private readonly linePrompt: LinePrompt;\n private readonly useInquirer: boolean;\n private inquirerPromise: Promise<InquirerPrompts> | undefined;\n\n constructor(private readonly input: Readable, private readonly output: Writable) {\n this.useInquirer = shouldUseTerminalEditing(input, output);\n this.linePrompt = new LinePrompt(input, output);\n }\n\n async choose<T extends string>(message: string, choices: Array<{ name: string; value: T }>): Promise<T> {\n if (this.useInquirer) {\n const prompts = await this.loadInquirer();\n return prompts.select(\n {\n message,\n choices,\n pageSize: Math.min(Math.max(choices.length, 6), 12),\n },\n { input: this.input, output: this.output }\n );\n }\n\n for (;;) {\n this.output.write(`\\n${message}:\\n`);\n choices.forEach((choice, index) => {\n this.output.write(` ${index + 1}. ${choice.name}\\n`);\n });\n const answer = await this.linePrompt.question(\"Choose > \");\n const index = Number(answer.trim()) - 1;\n if (Number.isInteger(index) && choices[index]) return choices[index].value;\n this.output.write(\"Invalid choice.\\n\");\n }\n }\n\n async inputText(message: string, options?: { required?: boolean }): Promise<string> {\n for (;;) {\n const value = this.useInquirer\n ? await (await this.loadInquirer()).input(\n { message, required: options?.required ?? false },\n { input: this.input, output: this.output }\n )\n : await this.linePrompt.question(`${message}: `);\n const normalized = normalizeTerminalLine(value);\n if (!options?.required || normalized.trim()) return normalized.trim();\n this.output.write(`${message} is required.\\n`);\n }\n }\n\n close(): void {\n this.linePrompt.close();\n }\n\n private loadInquirer(): Promise<InquirerPrompts> {\n if (!this.inquirerPromise) {\n const dynamicImport = new Function(\n \"specifier\",\n \"return import(specifier)\"\n ) as (specifier: string) => Promise<InquirerPrompts>;\n this.inquirerPromise = dynamicImport(\"@inquirer/prompts\");\n }\n return this.inquirerPromise;\n }\n}\n\nclass LinePrompt {\n private readonly rl: readline.Interface;\n private readonly queued: string[] = [];\n private readonly waiters: Array<(line: string) => void> = [];\n private readonly terminalEditing: boolean;\n private readonly inputWasRaw: boolean | undefined;\n private closed = false;\n\n constructor(private readonly input: Readable, private readonly output: Writable) {\n this.terminalEditing = shouldUseTerminalEditing(input, output);\n this.inputWasRaw = (input as { isRaw?: boolean }).isRaw;\n if (this.terminalEditing) {\n (input as { setRawMode?: (mode: boolean) => void }).setRawMode?.(true);\n }\n this.rl = readline.createInterface({\n input,\n output: this.terminalEditing ? output : undefined,\n terminal: this.terminalEditing,\n });\n this.rl.on(\"line\", (line) => {\n const normalizedLine = normalizeTerminalLine(line);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter(normalizedLine);\n return;\n }\n this.queued.push(normalizedLine);\n });\n this.rl.on(\"close\", () => {\n this.closed = true;\n });\n }\n\n question(label: string): Promise<string> {\n const queued = this.queued.shift();\n if (queued !== undefined) {\n this.output.write(label);\n this.output.write(\"\\n\");\n return Promise.resolve(queued);\n }\n if (this.closed) {\n return Promise.reject(new Error(\"Interactive input closed\"));\n }\n if (this.terminalEditing) {\n this.rl.setPrompt(label);\n this.rl.prompt();\n } else {\n this.output.write(label);\n }\n return new Promise((resolve, reject) => {\n const onClose = () => {\n reject(new Error(\"Interactive input closed\"));\n };\n this.rl.once(\"close\", onClose);\n this.waiters.push((line) => {\n this.rl.off(\"close\", onClose);\n resolve(line);\n });\n });\n }\n\n close(): void {\n if (this.terminalEditing && this.inputWasRaw !== undefined) {\n (this.input as { setRawMode?: (mode: boolean) => void }).setRawMode?.(this.inputWasRaw);\n }\n this.rl.close();\n }\n}\n\nexport function shouldUseTerminalEditing(input: Readable, output: Writable): boolean {\n return Boolean(\n (input as { isTTY?: boolean }).isTTY && (output as { isTTY?: boolean }).isTTY\n );\n}\n\nexport function normalizeTerminalLine(line: string): string {\n const chars: string[] = [];\n for (const char of line) {\n if (char === \"\\x7f\" || char === \"\\b\") {\n chars.pop();\n continue;\n }\n chars.push(char);\n }\n return chars.join(\"\");\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeDoctorResult } from \"../runtime/doctor\";\nimport type { RuntimeRunStatus } from \"../runtime/adapter\";\n\ntype ColorName = \"dim\" | \"accent\" | \"good\" | \"warn\" | \"bad\" | \"muted\" | \"strong\";\n\nconst codes: Record<ColorName, [number, number]> = {\n dim: [2, 22],\n accent: [36, 39],\n good: [32, 39],\n warn: [33, 39],\n bad: [31, 39],\n muted: [90, 39],\n strong: [1, 22],\n};\n\nexport interface LabUi {\n colorEnabled: boolean;\n dim(value: string): string;\n accent(value: string): string;\n good(value: string): string;\n warn(value: string): string;\n bad(value: string): string;\n muted(value: string): string;\n strong(value: string): string;\n}\n\nexport function createLabUi(options?: { color?: boolean }): LabUi {\n const colorEnabled = options?.color ?? !process.env.NO_COLOR;\n const paint = (name: ColorName, value: string): string => {\n if (!colorEnabled) return value;\n const [open, close] = codes[name];\n return `\\x1b[${open}m${value}\\x1b[${close}m`;\n };\n return {\n colorEnabled,\n dim: (value) => paint(\"dim\", value),\n accent: (value) => paint(\"accent\", value),\n good: (value) => paint(\"good\", value),\n warn: (value) => paint(\"warn\", value),\n bad: (value) => paint(\"bad\", value),\n muted: (value) => paint(\"muted\", value),\n strong: (value) => paint(\"strong\", value),\n };\n}\n\nexport function heading(ui: LabUi, title: string): string {\n return ui.accent(ui.strong(title));\n}\n\nexport function kv(ui: LabUi, key: string, value: string): string {\n return `${ui.muted(key.padEnd(12))} ${value}`;\n}\n\nexport function statusLabel(\n ui: LabUi,\n status: RuntimeDoctorResult[\"status\"] | RuntimeRunStatus\n): string {\n if (status === \"available\" || status === \"ok\") return ui.good(\"OK\");\n if (status === \"not_installed\") return ui.bad(\"MISSING\");\n if (status === \"not_logged_in\") return ui.warn(\"LOGIN\");\n if (status === \"timeout\") return ui.warn(\"TIMEOUT\");\n if (status === \"runtime_error\") return ui.bad(\"ERROR\");\n if (status === \"unsupported_version\") return ui.warn(\"UNSUPPORTED\");\n return ui.warn(\"UNKNOWN\");\n}\n\nexport function formatTable(rows: string[][], options?: { padding?: number }): string {\n if (rows.length === 0) return \"\";\n const padding = options?.padding ?? 2;\n const widths = rows[0]?.map((_, index) =>\n Math.max(...rows.map((row) => visibleLength(row[index] ?? \"\")))\n ) ?? [];\n return rows\n .map((row) =>\n row\n .map((cell, index) => {\n const suffix = index === row.length - 1 ? 0 : padding;\n return `${cell}${\" \".repeat(widths[index] - visibleLength(cell) + suffix)}`;\n })\n .join(\"\")\n .trimEnd()\n )\n .join(\"\\n\");\n}\n\nexport function shortPath(value: string): string {\n const home = os.homedir();\n if (value === home) return \"~\";\n if (value.startsWith(`${home}${path.sep}`)) {\n return path.join(\"~\", value.slice(home.length + 1));\n }\n return value;\n}\n\nexport function visibleLength(value: string): number {\n return value.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\n}\n", "import os from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { DaemonToServerMessage, RuntimeId, ServerToDaemonMessage } from \"@claude-console/shared\";\nimport { supportedRuntimeIds } from \"../runtime/capabilities\";\nimport packageJson from \"../../package.json\";\n\nexport class ServerConnection {\n private ws?: WebSocket;\n private reconnectTimer?: NodeJS.Timeout;\n private messageHandler: (msg: ServerToDaemonMessage) => void = () => {};\n private stopped = false;\n private reconnectAttempt = 0;\n\n constructor(private readonly options: {\n serverUrl: string;\n apiKey: string;\n spaceId?: string;\n name?: string;\n daemonVersion?: string;\n runningAgentsProvider?: () => string[];\n wakeableAgentsProvider?: () => Array<{ agentId: string; sessionId?: string; launchId?: string }>;\n log?: (line: string) => void;\n reconnectBaseDelayMs?: number;\n reconnectMaxDelayMs?: number;\n }) {}\n\n get connected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n connect(): void {\n this.stopped = false;\n this.log(`connecting server=${this.options.serverUrl}`);\n this.open();\n }\n\n disconnect(): void {\n this.stopped = true;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n this.reconnectAttempt = 0;\n this.log(\"disconnect requested\");\n const socket = this.ws;\n this.ws = undefined;\n socket?.close();\n socket?.terminate();\n }\n\n send(msg: DaemonToServerMessage): void {\n if (!this.connected) {\n this.log(`send skipped socket=closed msg=${summarizeDaemonMessage(msg)}`);\n return;\n }\n if (shouldLogDaemonMessage(msg)) {\n this.log(`send ${summarizeDaemonMessage(msg)}`);\n }\n this.ws?.send(JSON.stringify(msg));\n }\n\n onMessage(handler: (msg: ServerToDaemonMessage) => void): void {\n this.messageHandler = handler;\n }\n\n private open(): void {\n const url = new URL(\"/daemon/connect\", this.options.serverUrl.replace(/^http/, \"ws\"));\n url.searchParams.set(\"key\", this.options.apiKey);\n if (this.options.spaceId) url.searchParams.set(\"space_id\", this.options.spaceId);\n const ws = new WebSocket(url);\n this.ws = ws;\n ws.on(\"open\", () => {\n this.reconnectAttempt = 0;\n this.log(`socket open url=${redactUrl(url)}`);\n this.send({\n type: \"ready\",\n capabilities: [\n \"agent:start\",\n \"agent:stop\",\n \"agent:deliver\",\n \"agent:reset-workspace\",\n \"agent:diagnostic\",\n \"workspace:list\",\n \"workspace:read\",\n \"agent:skills:list\",\n \"machine:runtime_models:detect\",\n \"machine:workspace:scan\",\n \"machine:workspace:delete\",\n \"reminder-cache\",\n ],\n runtimes: supportedRuntimeIds as RuntimeId[],\n runningAgents: this.options.runningAgentsProvider?.() ?? [],\n wakeableAgents: this.options.wakeableAgentsProvider?.() ?? [],\n hostname: os.hostname() || \"local\",\n name: this.options.name,\n os: `${process.platform}/${process.arch}`,\n daemonVersion: this.options.daemonVersion ?? packageJson.version,\n });\n });\n ws.on(\"message\", (raw: WebSocket.RawData) => {\n const msg = JSON.parse(String(raw)) as ServerToDaemonMessage;\n this.log(`recv ${summarizeServerMessage(msg)}`);\n if (msg.type === \"ping\") {\n this.send({ type: \"pong\" });\n return;\n }\n this.messageHandler(msg);\n });\n ws.on(\"close\", (code, reason) => {\n const reasonText = reason.toString() || \"-\";\n this.log(`socket close code=${code} reason=${reasonText}`);\n if (code === 1008 && reasonText.includes(\"machine removed\")) {\n this.stopped = true;\n this.log(\"reconnect disabled reason=machine_removed\");\n return;\n }\n this.scheduleReconnect();\n });\n ws.on(\"error\", (error) => {\n this.log(`socket error ${error instanceof Error ? error.message : String(error)}`);\n this.scheduleReconnect();\n });\n }\n\n private scheduleReconnect(): void {\n if (this.stopped || this.reconnectTimer) return;\n const delay = this.nextReconnectDelayMs();\n this.log(`reconnect scheduled delay=${delay}ms`);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n this.open();\n }, delay);\n }\n\n private nextReconnectDelayMs(): number {\n const base = this.options.reconnectBaseDelayMs ?? 1_000;\n const max = this.options.reconnectMaxDelayMs ?? 30_000;\n const delay = Math.min(max, base * 2 ** this.reconnectAttempt);\n this.reconnectAttempt += 1;\n return delay;\n }\n\n private log(line: string): void {\n this.options.log?.(`[connection] ${line}`);\n }\n}\n\nfunction summarizeDaemonMessage(msg: DaemonToServerMessage): string {\n const base = `type=${msg.type}`;\n if (\"agentId\" in msg) return `${base} agent=${msg.agentId}`;\n return base;\n}\n\nfunction shouldLogDaemonMessage(msg: DaemonToServerMessage): boolean {\n return !(msg.type === \"agent:activity\" && msg.detail === \"assistant_delta\");\n}\n\nfunction summarizeServerMessage(msg: ServerToDaemonMessage): string {\n const base = `type=${msg.type}`;\n if (\"agentId\" in msg) return `${base} agent=${msg.agentId}`;\n return base;\n}\n\nfunction redactUrl(url: URL): string {\n const copy = new URL(url.toString());\n if (copy.searchParams.has(\"key\")) copy.searchParams.set(\"key\", \"***\");\n return copy.toString();\n}\n", "{\n \"name\": \"@wagemule/daemon\",\n \"version\": \"0.1.6\",\n \"private\": false,\n \"description\": \"Wage Mule local daemon for connecting local agent runtimes to Workspace Server.\",\n \"main\": \"./dist/main.cjs\",\n \"bin\": {\n \"wm-daemon\": \"./dist/main.cjs\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"package.json\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"dev\": \"tsx watch src/main.ts\",\n \"build\": \"node scripts/build.mjs\",\n \"start\": \"node dist/main.cjs\",\n \"prepack\": \"npm run build\",\n \"pack:check\": \"node scripts/pack-check.mjs\",\n \"test\": \"node --import tsx src/workspace/agent-workspace.test.ts && node --import tsx src/workspace/feishu-token-writer.test.ts && node --import tsx src/agent-manager/workspace-browser.test.ts && node --import tsx src/agent-manager/agent-process-manager.memory.test.ts && node --import tsx src/agent-manager/agent-process-manager.delivery.test.ts && node --import tsx src/agent-manager/agent-process-manager.model-validation.test.ts && node --import tsx src/agent-manager/skill-scanner.test.ts && node --import tsx src/runtime/capabilities.test.ts && node --import tsx src/runtime/model-detector.test.ts && node --import tsx src/runtime/persistent-adapter.test.ts && node --import tsx src/runtime/json-rpc-stdio-client.test.ts && node --import tsx src/runtime/acp-adapter.test.ts && node --import tsx src/runtime/codex-adapter.test.ts && node --import tsx src/runtime/claude-adapter.test.ts && node --import tsx src/testing/smoke-harness.test.ts && node --import tsx src/lab/lab-store.test.ts && node --import tsx src/lab/lab-ui.test.ts && node --import tsx src/lab/interactive-lab.test.ts && node --import tsx src/main.test.ts && node --import tsx src/testing/integration.test.ts\",\n \"test:real\": \"node --import tsx src/testing/integration-real.test.ts\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/ws\": \"^8.0.0\",\n \"esbuild\": \"^0.25.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.138\",\n \"@inquirer/prompts\": \"^8.4.2\",\n \"@larksuite/cli\": \"^1.0.32\",\n \"commander\": \"^14.0.3\",\n \"ws\": \"^8.0.0\"\n }\n}\n", "import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type {\n DaemonToServerMessage,\n DeliveredMessage,\n AgentActivity,\n MachineWorkspaceEntry,\n RuntimeId,\n RuntimeModelDescriptor,\n RuntimeModelDetectionResult,\n ServerToDaemonMessage,\n AgentDiagnosticSnapshot,\n} from \"@claude-console/shared\";\nimport { formatDeliveredMessage } from \"@claude-console/shared\";\nimport { createPersistentRuntimeAdapter, createRuntimeAdapter } from \"../runtime/registry\";\nimport type { PersistentRuntimeAdapter, RuntimePermissionDecision, RuntimePermissionRequest, RuntimeRunInput } from \"../runtime/adapter\";\nimport { RuntimeModelDetector } from \"../runtime/model-detector\";\nimport { ReminderCache } from \"../reminder/reminder-cache\";\nimport { createAgentWorkspace, type AgentRuntime, type AgentWorkspace } from \"../workspace/agent-workspace\";\nimport { clearFeishuToken, writeFeishuToken, writeLarkCliWrapper } from \"../workspace/feishu-token-writer\";\nimport { ActivityTracker } from \"./activity-tracker\";\nimport { scanAgentSkills } from \"./skill-scanner\";\nimport { displayNameToWorkspaceDirectoryName, isSafeWorkspaceDirectoryName, namedWorkspaceDirectoryName, WorkspaceBrowser } from \"./workspace-browser\";\n\ninterface RunningAgent {\n workspace: AgentWorkspace;\n sessionId?: string;\n config: AgentConfig;\n controller: AbortController;\n adapter?: PersistentRuntimeAdapter;\n state?: \"busy\" | \"idle\" | \"stopping\" | \"error\";\n runtimeEnv?: NodeJS.ProcessEnv;\n launchId?: string;\n stopped?: boolean;\n done?: Promise<void>;\n compacting?: boolean;\n compactionStartedAt?: number;\n compactionWatchdog?: ReturnType<typeof setTimeout>;\n lastRuntimeEventAt?: number;\n}\n\ntype AgentConfig = Extract<ServerToDaemonMessage, { type: \"agent:start\" }>[\"config\"];\n\ninterface StartRequest {\n agentId: string;\n config: AgentConfig;\n wakeMessage?: DeliveredMessage;\n deliveredMessages?: DeliveredMessage[];\n launchId?: string;\n taskId?: string;\n}\n\ninterface RuntimeModelDetectorLike {\n detect(runtime: RuntimeId): Promise<RuntimeModelDetectionResult>;\n detectAll?(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]>;\n}\n\nexport class AgentProcessManager {\n private readonly running = new Map<string, RunningAgent>();\n private readonly starting = new Map<string, Promise<void>>();\n private readonly cancelledStarts = new Set<string>();\n private readonly idleConfigs = new Map<string, { config: AgentConfig; sessionId?: string; workspace?: AgentWorkspace }>();\n private readonly startingInboxes = new Map<string, DeliveredMessage[]>();\n private readonly runningInboxes = new Map<string, DeliveredMessage[]>();\n private readonly queuedLaunchIds = new Map<string, string>();\n private readonly queuedTaskIds = new Map<string, string>();\n private readonly stoppedLaunches = new Set<string>();\n private readonly lastActivities = new Map<string, { activity: AgentActivity; detail: string; launchId?: string; clientSeq?: number }>();\n private readonly pendingMigrations = new Map<string, string>();\n private readonly pendingPermissions = new Map<string, {\n agentId: string;\n timeout: ReturnType<typeof setTimeout>;\n resolve: (decision: RuntimePermissionDecision) => void;\n }>();\n private readonly fakeRuntimeChildren = new Map<string, ChildProcess>();\n private readonly feishuDelegationTimers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly modelDetector: RuntimeModelDetectorLike;\n private readonly reminderCache = new ReminderCache();\n private startQueue: Promise<void> = Promise.resolve();\n private readonly browser: WorkspaceBrowser;\n\n constructor(\n private readonly options: {\n rootDir: string;\n machineDisplayName: string;\n sendToServer: (msg: DaemonToServerMessage) => void;\n log?: (line: string) => void;\n modelDetector?: RuntimeModelDetectorLike;\n }\n ) {\n this.modelDetector = options.modelDetector ?? new RuntimeModelDetector();\n this.browser = new WorkspaceBrowser({\n rootDir: this.options.rootDir,\n workspaceDirectoryForAgent: (agentId, serverNamespace, machineId) => {\n const config = this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n if (config) return this.resolveWorkspaceDirectory(config, agentId);\n if (serverNamespace && machineId) return this.resolveWorkspaceDirectoryForParts(machineId, machineId, agentId, agentId);\n return undefined;\n },\n });\n this.reminderCache.onFire((job) => {\n this.options.sendToServer({\n type: \"reminder.fire_attempt\",\n reminderId: job.reminderId,\n agentId: job.ownerAgentId,\n version: job.version,\n });\n });\n }\n\n getRunningAgentIds(): string[] {\n return Array.from(this.running.entries())\n .filter(([, running]) => running.state !== \"idle\")\n .map(([agentId]) => agentId);\n }\n\n getWakeableAgents(): Array<{ agentId: string; sessionId?: string; launchId?: string }> {\n const persistentIdle = Array.from(this.running.entries())\n .filter(([, running]) => running.state === \"idle\")\n .map(([agentId, running]) => ({ agentId, sessionId: running.sessionId, launchId: running.launchId }));\n const cachedIdle = Array.from(this.idleConfigs.entries())\n .filter(([agentId]) => !this.running.has(agentId) && !this.starting.has(agentId))\n .map(([agentId, idle]) => ({ agentId, sessionId: idle.sessionId }));\n return [...persistentIdle, ...cachedIdle];\n }\n\n async handle(message: ServerToDaemonMessage): Promise<void> {\n this.log(`handle type=${message.type}${\"agentId\" in message ? ` agent=${message.agentId}` : \"\"}`);\n if (message.type === \"agent:start\") {\n await this.enqueueStart({\n agentId: message.agentId,\n config: message.config,\n wakeMessage: message.wakeMessage,\n deliveredMessages: message.wakeMessage ? [message.wakeMessage] : undefined,\n launchId: message.launchId,\n taskId: message.taskId,\n });\n } else if (message.type === \"agent:deliver\") {\n await this.deliverMessage(message.agentId, message.message, message.deliveryId, message.seq);\n } else if (message.type === \"agent:stop\") {\n await this.stopAgent(message.agentId, \"requested\");\n } else if (message.type === \"agent:activity_probe\") {\n const running = this.running.get(message.agentId);\n const last = this.lastActivities.get(message.agentId);\n this.options.sendToServer({\n type: \"agent:activity\",\n agentId: message.agentId,\n activity: this.starting.has(message.agentId)\n ? \"working\"\n : running\n ? running.state === \"idle\" ? \"idle\" : last?.activity ?? \"working\"\n : this.idleConfigs.has(message.agentId)\n ? \"idle\"\n : \"offline\",\n detail: this.starting.has(message.agentId)\n ? \"Starting...\"\n : running\n ? running.state === \"idle\" ? \"Idle\" : last?.detail ?? \"Runtime running\"\n : this.idleConfigs.has(message.agentId)\n ? \"Idle\"\n : \"Agent not running\",\n launchId: running?.launchId ?? last?.launchId,\n probeId: message.probeId,\n pendingInboxCount: this.queuedInboxCount(message.agentId),\n clientSeq: last?.clientSeq,\n });\n } else if (message.type === \"agent:workspace:list\") {\n await this.replyWorkspaceList(message.agentId, message.requestId, message.path, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:workspace:read\") {\n await this.replyWorkspaceRead(message.agentId, message.requestId, message.path, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:workspace:write\") {\n await this.replyWorkspaceWrite(message.agentId, message.requestId, message.path, message.content, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:skills:list\") {\n await this.replyAgentSkillsList(message.agentId, message.requestId, message.runtime, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:workspace:init\") {\n await this.replyWorkspaceInit(message.requestId, message.agentId, message.config);\n } else if (message.type === \"feishu:token:write\") {\n await this.replyFeishuTokenWrite(message.requestId, message.agentId, message.token, message.appId, message.brand, message.config);\n } else if (message.type === \"feishu:token:clear\") {\n await this.replyFeishuTokenClear(message.requestId, message.agentId, message.config);\n } else if (message.type === \"feishu:delegation:start\" || message.type === \"feishu:delegation:update\") {\n this.startFeishuDelegationSchedule(message.delegation, message.config);\n this.options.sendToServer({\n type: \"feishu:delegation:result\",\n requestId: message.requestId,\n delegationId: message.delegation.id,\n agentId: message.delegation.delegate_agent_id,\n ok: true,\n });\n } else if (message.type === \"feishu:delegation:stop\") {\n this.stopFeishuDelegationSchedule(message.delegationId);\n this.options.sendToServer({\n type: \"feishu:delegation:result\",\n requestId: message.requestId,\n delegationId: message.delegationId,\n agentId: message.agentId,\n ok: true,\n });\n } else if (message.type === \"machine:runtime_models:detect\") {\n const results = await this.detectRuntimeModels(message.runtimes ?? [\"cursor\", \"claude\", \"codex\", \"gemini\", \"kimi\", \"hermes\", \"opencode\"]);\n this.options.sendToServer({ type: \"machine:runtime_models:result\", requestId: message.requestId, results });\n } else if (message.type === \"machine:workspace:scan\") {\n await this.replyMachineWorkspaceScan(message.requestId, message.serverNamespace, message.machineId, message.machineName, message.knownAgentIds ?? []);\n } else if (message.type === \"machine:workspace:delete\") {\n await this.replyMachineWorkspaceDelete(message.requestId, message.serverNamespace, message.machineId, message.machineName, message.directoryName);\n } else if (message.type === \"agent:reset-workspace\") {\n await this.replyResetWorkspace(message.requestId, message.agentId, message.config);\n } else if (message.type === \"agent:diagnostic\") {\n await this.replyAgentDiagnostic(message.requestId, message.agentId, message.config);\n } else if (message.type === \"reminder.upsert\") {\n this.reminderCache.upsert(message.reminder);\n } else if (message.type === \"reminder.cancel\") {\n this.reminderCache.cancel(message.reminderId);\n } else if (message.type === \"reminder.snapshot\") {\n this.reminderCache.snapshot(message.agentId, message.reminders);\n } else if (message.type === \"agent:runtime_profile:migration\") {\n this.pendingMigrations.set(message.agentId, message.migrationKey);\n } else if (message.type === \"agent:permission_decision\") {\n this.resolvePermissionDecision(message.agentId, message.requestId, message.action, message.metadata);\n }\n }\n\n private startFeishuDelegationSchedule(delegation: Extract<ServerToDaemonMessage, { type: \"feishu:delegation:start\" }>[\"delegation\"], config: AgentConfig): void {\n this.stopFeishuDelegationSchedule(delegation.id);\n this.idleConfigs.set(delegation.delegate_agent_id, {\n config,\n sessionId: config.sessionId,\n });\n if (!delegation.enabled) return;\n const intervalMs = Math.max(60_000, delegation.interval_seconds * 1000);\n const lookbackMinutes = feishuDelegationLookbackMinutes(delegation.interval_seconds);\n const timer = setInterval(() => {\n if (this.shouldSkipScheduledFeishuWake(delegation.delegate_agent_id)) {\n this.log(`feishu delegation tick skipped agent=${delegation.delegate_agent_id} delegation=${delegation.id} reason=agent_busy`);\n return;\n }\n const wakeMessage: DeliveredMessage = {\n target: \"feishu:delegation\",\n message_id: `feishu-${delegation.id}-${Date.now()}`,\n seq: Date.now(),\n timestamp: new Date().toISOString(),\n sender_type: \"human\",\n sender_name: \"Feishu Delegation\",\n content: [\n \"Feishu delegation tick.\",\n `Human ID: ${delegation.human_id}`,\n `Delegation ID: ${delegation.id}`,\n `Read Feishu messages from the last ${lookbackMinutes} minutes only. Never send, reply, react, or mutate Feishu during this tick.`,\n \"For each new inbound Feishu message that needs a reply, draft a concise reply and create exactly one inbox item with:\",\n \"wm inbox feishu-draft create --delegation-id <delegation_id> --human-id <human_id> --feishu-message-id <message_id> --chat-id <chat_id> --sender-name <name> --sender-open-id <open_id> --original-text <summary> --draft-text <draft>\",\n \"Deduplicate by Feishu message_id. If there are no new relevant messages, do nothing.\",\n \"Do not call lark-cli im +messages-send or any other Feishu send command unless a later approved inbox task explicitly asks you to send.\",\n ].join(\"\\n\"),\n };\n void this.enqueueStart({\n agentId: delegation.delegate_agent_id,\n config: { ...config, feishuDelegationEnabled: true },\n wakeMessage,\n deliveredMessages: [wakeMessage],\n }).catch((error) => {\n this.options.sendToServer({\n type: \"feishu:wake_failed\",\n delegationId: delegation.id,\n agentId: delegation.delegate_agent_id,\n humanId: delegation.human_id,\n reason: error instanceof Error ? error.message : \"feishu delegation wake failed\",\n timestamp: Date.now(),\n });\n });\n }, intervalMs);\n this.feishuDelegationTimers.set(delegation.id, timer);\n }\n\n private shouldSkipScheduledFeishuWake(agentId: string): boolean {\n if (this.starting.has(agentId)) return true;\n const running = this.running.get(agentId);\n return running !== undefined && running.state !== \"idle\";\n }\n\n private stopFeishuDelegationSchedule(delegationId: string): void {\n const timer = this.feishuDelegationTimers.get(delegationId);\n if (timer) clearInterval(timer);\n this.feishuDelegationTimers.delete(delegationId);\n }\n\n private async enqueueStart(request: StartRequest): Promise<void> {\n if (this.running.has(request.agentId) || this.starting.has(request.agentId)) {\n this.log(`agent start deduped agent=${request.agentId}`);\n this.idleConfigs.set(request.agentId, { config: request.config, sessionId: request.config.sessionId });\n if (request.deliveredMessages?.length) {\n this.rememberQueuedMessageLaunch(request.deliveredMessages, request.launchId, request.taskId);\n const running = this.running.get(request.agentId);\n if (running?.state === \"idle\" && running.adapter) {\n const controller = new AbortController();\n running.controller = controller;\n running.state = \"busy\";\n running.config = request.config;\n running.launchId = request.launchId;\n running.done = this.runAgentRuntime({\n agentId: request.agentId,\n config: { ...request.config, sessionId: running.sessionId ?? request.config.sessionId },\n workspace: running.workspace,\n wakeMessage: request.wakeMessage,\n deliveredMessages: request.deliveredMessages,\n launchId: request.launchId,\n taskId: request.taskId,\n runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(running.workspace, request.config, request.agentId),\n controller,\n }).catch((error) => {\n this.log(`deduped idle start failed agent=${request.agentId} error=${error instanceof Error ? error.message : String(error)}`);\n });\n } else {\n this.pushInbox(this.starting.has(request.agentId) ? this.startingInboxes : this.runningInboxes, request.agentId, request.deliveredMessages);\n }\n }\n return;\n }\n this.cancelledStarts.delete(request.agentId);\n if (request.launchId) this.stoppedLaunches.delete(request.launchId);\n const start = this.startQueue.then(() => this.startAgent(\n request.agentId,\n request.config,\n request.wakeMessage,\n request.deliveredMessages,\n request.launchId,\n request.taskId\n ));\n this.starting.set(request.agentId, start);\n this.startQueue = start.catch(() => undefined);\n try {\n await start;\n } finally {\n this.starting.delete(request.agentId);\n }\n }\n\n async startAgent(\n agentId: string,\n config: AgentConfig,\n wakeMessage?: DeliveredMessage,\n deliveredMessages?: DeliveredMessage[],\n launchId?: string,\n taskId?: string\n ): Promise<void> {\n this.log(`agent start agent=${agentId} runtime=${config.runtime} launch=${launchId ?? \"-\"} session=${config.sessionId ?? \"new\"}`);\n try {\n await this.validateRuntimeConfig(config);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n this.log(`agent config rejected agent=${agentId} error=${detail}`);\n this.sendActivity({\n agentId,\n activity: \"error\",\n detail,\n launchId,\n entries: [{ kind: \"error\", text: detail, timestamp: Date.now() }],\n });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n return;\n }\n if (this.cancelledStarts.has(agentId)) {\n this.log(`agent start cancelled before workspace agent=${agentId}`);\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n return;\n }\n const workspace = await createAgentWorkspace({\n rootDir: this.options.rootDir,\n serverNamespace: config.serverNamespace,\n serverId: config.spaceId,\n machineDirectoryName: this.machineDirectoryName(config),\n machineId: config.machineId,\n agentDirectoryName: this.agentDirectoryName(config, agentId),\n daemonId: os.hostname() || \"local-daemon\",\n agentId,\n agentName: config.agentName,\n runtime: config.runtime,\n role: config.role,\n feishuDelegationEnabled: config.feishuDelegationEnabled,\n });\n this.log(`workspace ready agent=${agentId} dir=${workspace.agentDir}`);\n const startQueued = this.startingInboxes.get(agentId) ?? [];\n this.startingInboxes.delete(agentId);\n const messagesForTurn = dedupeDeliveredMessages([...(deliveredMessages ?? (wakeMessage ? [wakeMessage] : [])), ...startQueued]);\n for (const delivered of messagesForTurn) {\n await this.recordDeliveredMessageNote(workspace, delivered, delivered.seq);\n }\n const runtimeEnv = this.buildRuntimeEnv(workspace, config, agentId);\n await this.writeRuntimeEnv(workspace, config, agentId);\n const controller = new AbortController();\n const running: RunningAgent = { workspace, sessionId: config.sessionId, config, controller, launchId, state: \"busy\", runtimeEnv };\n this.running.set(agentId, running);\n const runDone = this.runAgentRuntime({ agentId, config, workspace, wakeMessage, deliveredMessages: messagesForTurn, launchId, taskId, runtimeEnv, controller })\n .catch((error) => {\n if (controller.signal.aborted) return;\n const detail = error instanceof Error ? error.message : String(error);\n this.log(`agent runtime failed agent=${agentId} error=${detail}`);\n this.sendActivity({\n agentId,\n activity: \"error\",\n detail,\n launchId,\n entries: [{ kind: \"error\", text: detail, timestamp: Date.now() }],\n });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n })\n .finally(() => {\n const current = this.running.get(agentId);\n if (current && !current.adapter) this.running.delete(agentId);\n });\n running.done = runDone;\n this.idleConfigs.set(agentId, { config, sessionId: config.sessionId, workspace });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"active\", launchId });\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Starting...\",\n launchId,\n entries: [{ kind: \"status\", text: \"Starting...\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n }\n\n private async detectRuntimeModels(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]> {\n if (this.modelDetector.detectAll) return this.modelDetector.detectAll(runtimes);\n return Promise.all(runtimes.map((runtime) => this.modelDetector.detect(runtime)));\n }\n\n private async validateRuntimeConfig(config: AgentConfig): Promise<void> {\n const detection = await this.modelDetector.detect(config.runtime);\n const requestedModel = config.model?.trim() || \"default\";\n const model = selectRuntimeModel(detection, requestedModel);\n const reasoningEffort = config.reasoningEffort?.trim();\n if (!reasoningEffort || reasoningEffort === \"default\") return;\n const allowed = model?.reasoningEfforts?.length ? model.reasoningEfforts : [\"default\"];\n if (!allowed.includes(reasoningEffort)) {\n throw new Error(`unsupported reasoning effort for ${config.runtime}/${model?.id ?? requestedModel}: ${reasoningEffort}`);\n }\n }\n\n private sendActivity(msg: Omit<Extract<DaemonToServerMessage, { type: \"agent:activity\" }>, \"type\">): void {\n if (msg.launchId && this.stoppedLaunches.has(msg.launchId) && msg.activity !== \"offline\") return;\n this.lastActivities.set(msg.agentId, { activity: msg.activity, detail: msg.detail, launchId: msg.launchId, clientSeq: msg.clientSeq });\n this.options.sendToServer({ type: \"agent:activity\", ...msg });\n }\n\n private requestRuntimePermission(agentId: string, launchId: string | undefined, request: RuntimePermissionRequest): Promise<RuntimePermissionDecision> {\n const requestId = `perm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n this.log(`permission request agent=${agentId} request=${requestId} kind=${request.kind}`);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Waiting for permission\",\n launchId,\n entries: [{ kind: \"status\", text: request.title, timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId) + 1,\n });\n this.options.sendToServer({\n type: \"agent:permission_request\",\n agentId,\n requestId,\n launchId,\n kind: request.kind,\n title: request.title,\n description: request.description,\n metadata: request.metadata,\n });\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n this.pendingPermissions.delete(requestId);\n this.log(`permission timeout agent=${agentId} request=${requestId}`);\n resolve({ action: \"reject\", metadata: { reason: \"permission timeout\" } });\n }, 10 * 60_000);\n this.pendingPermissions.set(requestId, { agentId, timeout, resolve });\n });\n }\n\n private resolvePermissionDecision(agentId: string, requestId: string, action: \"approve\" | \"reject\", metadata?: Record<string, unknown>): void {\n const pending = this.pendingPermissions.get(requestId);\n if (!pending || pending.agentId !== agentId) return;\n clearTimeout(pending.timeout);\n this.pendingPermissions.delete(requestId);\n this.log(`permission decision agent=${agentId} request=${requestId} action=${action}`);\n pending.resolve({ action, metadata });\n }\n\n private async ensureAgentWorkspace(agentId: string, config?: AgentConfig): Promise<{ workspace?: AgentWorkspace; missing?: boolean }> {\n const running = this.running.get(agentId);\n if (running && !config?.feishuDelegationEnabled) return { workspace: running.workspace };\n const idle = this.idleConfigs.get(agentId);\n if (idle?.workspace && !config?.feishuDelegationEnabled) return { workspace: idle.workspace };\n const effectiveConfig = config ?? idle?.config;\n if (!effectiveConfig) return { missing: true };\n const workspace = await createAgentWorkspace({\n rootDir: this.options.rootDir,\n serverNamespace: effectiveConfig.serverNamespace,\n serverId: effectiveConfig.spaceId,\n machineDirectoryName: this.machineDirectoryName(effectiveConfig),\n machineId: effectiveConfig.machineId,\n agentDirectoryName: this.agentDirectoryName(effectiveConfig, agentId),\n daemonId: os.hostname() || \"local-daemon\",\n agentId,\n agentName: effectiveConfig.agentName,\n runtime: effectiveConfig.runtime,\n role: effectiveConfig.role,\n feishuDelegationEnabled: effectiveConfig.feishuDelegationEnabled,\n });\n if (running) {\n running.workspace = workspace;\n running.config = effectiveConfig;\n }\n this.idleConfigs.set(agentId, { config: effectiveConfig, sessionId: effectiveConfig.sessionId, workspace });\n return { workspace };\n }\n\n private async replyWorkspaceInit(requestId: string, agentId: string, config: AgentConfig): Promise<void> {\n try {\n const { workspace } = await this.ensureAgentWorkspace(agentId, config);\n this.options.sendToServer({\n type: \"agent:workspace:init/result\",\n requestId,\n agentId,\n ok: true,\n workspacePath: workspace ? this.workspaceDisplayPath(config, agentId) : undefined,\n });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:workspace:init/result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : \"workspace init failed\",\n });\n }\n }\n\n private async replyFeishuTokenWrite(\n requestId: string,\n agentId: string,\n token: string,\n appId: string,\n brand?: \"feishu\" | \"lark\",\n config?: AgentConfig\n ): Promise<void> {\n try {\n const { workspace } = await this.ensureAgentWorkspace(agentId, config);\n if (!workspace) throw new Error(`workspace missing for ${agentId}`);\n const tokenPath = await writeFeishuToken({ workspaceDir: workspace.agentDir, token });\n await writeLarkCliWrapper({ workspaceDir: workspace.agentDir, appId, brand });\n this.options.sendToServer({ type: \"feishu:token:write_result\", requestId, agentId, ok: true, tokenPath });\n } catch (error) {\n this.options.sendToServer({\n type: \"feishu:token:write_result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : \"feishu token write failed\",\n });\n }\n }\n\n private async replyFeishuTokenClear(requestId: string, agentId: string, config?: AgentConfig): Promise<void> {\n try {\n const { workspace } = await this.ensureAgentWorkspace(agentId, config);\n if (!workspace) throw new Error(`workspace missing for ${agentId}`);\n await clearFeishuToken({ workspaceDir: workspace.agentDir });\n this.options.sendToServer({ type: \"feishu:token:clear_result\", requestId, agentId, ok: true });\n } catch (error) {\n this.options.sendToServer({\n type: \"feishu:token:clear_result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : \"feishu token clear failed\",\n });\n }\n }\n\n private async runAgentRuntime(input: {\n agentId: string;\n config: AgentConfig;\n workspace: AgentWorkspace;\n wakeMessage?: DeliveredMessage;\n deliveredMessages?: DeliveredMessage[];\n launchId?: string;\n taskId?: string;\n runtimeEnv: NodeJS.ProcessEnv;\n controller: AbortController;\n }): Promise<void> {\n const { agentId, config, workspace, wakeMessage, deliveredMessages, launchId, taskId, runtimeEnv, controller } = input;\n\n if (process.env.WM_DAEMON_FAKE_RUNTIME === \"1\") {\n this.log(`fake runtime start agent=${agentId}`);\n const result = await this.runFakeRuntime({\n agentId,\n config,\n wakeMessage: deliveredMessages?.[0] ?? wakeMessage,\n abortSignal: controller.signal,\n workspace,\n launchId,\n });\n this.log(`fake runtime done agent=${agentId}`);\n if (result.runtimeSessionId) {\n this.idleConfigs.set(agentId, { config: { ...config, sessionId: result.runtimeSessionId }, sessionId: result.runtimeSessionId, workspace });\n this.options.sendToServer({ type: \"agent:session\", agentId, sessionId: result.runtimeSessionId, launchId });\n }\n await this.writeRunLog(workspace, {\n agentId,\n launchId,\n taskId,\n runtime: config.runtime,\n runtimeSessionId: result.runtimeSessionId,\n status: \"ok\",\n finalMessage: result.finalMessage,\n events: result.events,\n });\n if (controller.signal.aborted || (launchId && this.stoppedLaunches.has(launchId))) {\n this.log(`fake agent done ignored after stop agent=${agentId} launch=${launchId ?? \"-\"}`);\n return;\n }\n this.sendActivity({\n agentId,\n activity: \"idle\",\n detail: \"Fake runtime completed\",\n launchId,\n entries: result.events.map((event) => ({ kind: \"text\" as const, text: event.content ?? event.type, timestamp: Date.now() })),\n });\n this.running.delete(agentId);\n if (this.drainQueuedMessagesAfterTurn(agentId, config, workspace, launchId, result.runtimeSessionId)) {\n return;\n }\n this.options.sendToServer({ type: \"agent:availability\", agentId, daemonState: \"wakeable\", sessionId: result.runtimeSessionId, launchId });\n return;\n }\n\n const systemPrompt = await readFile(workspace.systemPromptPath, \"utf8\");\n const messagesForTurn = deliveredMessages?.length ? deliveredMessages : (wakeMessage ? [wakeMessage] : []);\n const migrationKey = this.pendingMigrations.get(agentId);\n if (migrationKey) this.pendingMigrations.delete(agentId);\n const basePrompt = messagesForTurn.length > 0\n ? formatActionableMessagePrompt(messagesForTurn, workspace.wrapperPath)\n : formatStartupPrompt(workspace.wrapperPath);\n const prompt = migrationKey\n ? `${basePrompt}\\n\\n[Runtime Profile Migration] Your runtime configuration has been updated. Before handling the above, re-ground yourself in the new context, then run: \\`${workspace.wrapperPath} profile migration-ack --key ${migrationKey}\\``\n : basePrompt;\n const tracker = new ActivityTracker();\n const requestPermission = (request: RuntimePermissionRequest) => this.requestRuntimePermission(agentId, launchId, request);\n let deltaLogText = \"\";\n let deltaLogCount = 0;\n const flushDeltaLog = () => {\n if (!deltaLogCount) return;\n this.log(`runtime stream agent=${agentId} type=assistant_delta chunks=${deltaLogCount} text=${compact(deltaLogText)}`);\n deltaLogText = \"\";\n deltaLogCount = 0;\n };\n const onEvent = (event: { type: string; content?: string; data?: unknown }) => {\n if (event.type === \"assistant_delta\") {\n if (event.content) deltaLogText += event.content;\n deltaLogCount += 1;\n } else {\n flushDeltaLog();\n this.log(`runtime event agent=${agentId} type=${event.type}${event.content ? ` text=${compact(event.content)}` : \"\"}`);\n }\n const running = this.running.get(agentId);\n if (running) {\n running.lastRuntimeEventAt = Date.now();\n if (event.type === \"compaction_started\") {\n running.compacting = true;\n running.compactionStartedAt = Date.now();\n if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n const startedAt = running.compactionStartedAt;\n running.compactionWatchdog = setTimeout(() => {\n const r = this.running.get(agentId);\n if (!r || r.compactionStartedAt !== startedAt) return;\n this.log(`compaction stale agent=${agentId}`);\n r.compacting = false;\n r.compactionStartedAt = undefined;\n r.compactionWatchdog = undefined;\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"compaction_stale\",\n launchId,\n entries: [{ kind: \"status\", text: \"Context compaction still running; no finish event observed\", timestamp: Date.now() }],\n });\n }, 120000);\n } else if (event.type === \"compaction_finished\") {\n if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n running.compacting = false;\n running.compactionStartedAt = undefined;\n running.compactionWatchdog = undefined;\n }\n }\n const entries = tracker.toEntries([event]);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: event.type,\n entries,\n launchId,\n clientSeq: tracker.nextSeq(),\n });\n };\n const persistentAdapter = createPersistentRuntimeAdapter(config.runtime);\n let result;\n if (persistentAdapter) {\n const running = this.running.get(agentId);\n const adapter = running?.adapter && running.adapter.runtime === config.runtime\n ? running.adapter\n : persistentAdapter;\n if (running) {\n running.adapter = adapter;\n running.state = \"busy\";\n }\n if (!adapter.alive) {\n this.log(`runtime spawn agent=${agentId} runtime=${config.runtime} model=${config.model ?? \"default\"} reasoning=${config.reasoningEffort ?? \"default\"} permission=${config.permissionMode ?? \"default\"} cwd=${workspace.agentDir} launch=${launchId ?? \"-\"} persistent=true`);\n adapter.onExit = (code, signal) => {\n this.log(`runtime exit agent=${agentId} runtime=${config.runtime} code=${code} signal=${signal ?? \"-\"}`);\n const current = this.running.get(agentId);\n if (current?.adapter === adapter && current.state !== \"stopping\") {\n current.state = \"error\";\n this.sendActivity({\n agentId,\n activity: \"error\",\n detail: \"Runtime exited\",\n launchId: current.launchId,\n entries: [{ kind: \"error\", text: `Runtime exited code=${code} signal=${signal ?? \"-\"}`, timestamp: Date.now() }],\n });\n }\n };\n await adapter.start({\n agentId,\n cwd: workspace.agentDir,\n systemPrompt,\n systemPromptPath: workspace.systemPromptPath,\n model: config.model,\n reasoningEffort: config.reasoningEffort,\n permissionMode: config.permissionMode,\n env: runtimeEnv,\n runtimeSessionId: config.sessionId,\n timeoutMs: 180000,\n onEvent,\n requestPermission,\n });\n this.log(`runtime spawned agent=${agentId} runtime=${config.runtime} pid=${adapter.pid ?? \"-\"} persistent=true`);\n } else {\n this.log(`runtime reuse agent=${agentId} runtime=${config.runtime} pid=${adapter.pid ?? \"-\"} adapter_reused=true`);\n }\n result = await adapter.prompt({\n prompt,\n timeoutMs: 180000,\n abortSignal: controller.signal,\n });\n } else {\n const adapter = createRuntimeAdapter(config.runtime);\n this.log(`runtime spawn agent=${agentId} runtime=${config.runtime} model=${config.model ?? \"default\"} reasoning=${config.reasoningEffort ?? \"default\"} permission=${config.permissionMode ?? \"default\"} cwd=${workspace.agentDir} launch=${launchId ?? \"-\"} persistent=false`);\n result = await adapter.run({\n agentId,\n cwd: workspace.agentDir,\n prompt,\n systemPrompt,\n systemPromptPath: workspace.systemPromptPath,\n model: config.model,\n reasoningEffort: config.reasoningEffort,\n permissionMode: config.permissionMode,\n env: runtimeEnv,\n runtimeSessionId: config.sessionId,\n timeoutMs: 180000,\n abortSignal: controller.signal,\n onEvent,\n requestPermission,\n } satisfies RuntimeRunInput);\n }\n flushDeltaLog();\n if (result.runtimeSessionId) {\n this.log(`runtime session agent=${agentId} session=${result.runtimeSessionId}`);\n const running = this.running.get(agentId);\n if (running) {\n running.sessionId = result.runtimeSessionId;\n this.idleConfigs.set(agentId, { config: { ...config, sessionId: result.runtimeSessionId }, sessionId: result.runtimeSessionId, workspace });\n }\n this.options.sendToServer({ type: \"agent:session\", agentId, sessionId: result.runtimeSessionId, launchId });\n }\n await this.writeRunLog(workspace, {\n agentId,\n launchId,\n taskId,\n runtime: config.runtime,\n runtimeSessionId: result.runtimeSessionId,\n status: result.status,\n finalMessage: result.finalMessage,\n errorMessage: result.errorMessage,\n events: result.events,\n });\n if (controller.signal.aborted || (launchId && this.stoppedLaunches.has(launchId))) {\n this.log(`agent done ignored after stop agent=${agentId} launch=${launchId ?? \"-\"}`);\n return;\n }\n this.sendActivity({\n agentId,\n activity: result.status === \"ok\" ? \"idle\" : \"error\",\n detail: result.status,\n launchId,\n entries: tracker.toEntries(result.events),\n });\n this.log(`agent done agent=${agentId} status=${result.status} launch=${launchId ?? \"-\"} events=${result.events.length}${result.errorMessage ? ` error=${compact(result.errorMessage)}` : \"\"}`);\n const runningAfterTurn = this.running.get(agentId);\n if (runningAfterTurn?.adapter && result.status === \"ok\") {\n runningAfterTurn.state = \"idle\";\n runningAfterTurn.sessionId = result.runtimeSessionId ?? runningAfterTurn.sessionId;\n runningAfterTurn.config = { ...config, sessionId: result.runtimeSessionId ?? config.sessionId };\n runningAfterTurn.controller = new AbortController();\n } else {\n this.running.delete(agentId);\n }\n if (result.status === \"ok\") {\n if (this.drainQueuedMessagesAfterTurn(agentId, config, workspace, launchId, result.runtimeSessionId)) {\n return;\n }\n this.options.sendToServer({\n type: \"agent:availability\",\n agentId,\n daemonState: \"wakeable\",\n sessionId: result.runtimeSessionId ?? this.idleConfigs.get(agentId)?.sessionId,\n launchId,\n });\n } else {\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n }\n }\n\n async deliverMessage(agentId: string, message: DeliveredMessage, deliveryId: string, seq: number): Promise<boolean> {\n this.log(`deliver agent=${agentId} seq=${seq} delivery=${deliveryId}`);\n if (this.starting.has(agentId)) {\n this.log(`deliver queued during start agent=${agentId} seq=${seq}`);\n this.rememberQueuedMessageLaunch([message], deliveryId, message.message_id);\n this.pushInbox(this.startingInboxes, agentId, [message]);\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Message queued during startup\",\n entries: [{ kind: \"status\", text: \"Message queued during startup\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n return true;\n }\n const running = this.running.get(agentId);\n if (!running) {\n const idle = this.idleConfigs.get(agentId);\n if (idle) {\n this.log(`deliver resume agent=${agentId} seq=${seq}`);\n if (idle.workspace) {\n await this.recordDeliveredMessageNote(idle.workspace, message, seq);\n }\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n await this.enqueueStart({\n agentId,\n config: { ...idle.config, sessionId: idle.sessionId ?? idle.config.sessionId },\n wakeMessage: message,\n deliveredMessages: [message],\n launchId: deliveryId,\n taskId: message.message_id,\n });\n return true;\n }\n this.log(`deliver skipped agent=${agentId} reason=not-running`);\n this.sendDeliverAck(agentId, seq, deliveryId, false, \"not_running\");\n return false;\n }\n await this.recordDeliveredMessageNote(running.workspace, message, seq);\n this.rememberQueuedMessageLaunch([message], deliveryId, message.message_id);\n if (running.state === \"idle\" && running.adapter) {\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n const controller = new AbortController();\n running.controller = controller;\n running.state = \"busy\";\n running.launchId = deliveryId;\n running.done = this.runAgentRuntime({\n agentId,\n config: { ...running.config, sessionId: running.sessionId ?? running.config.sessionId },\n workspace: running.workspace,\n wakeMessage: message,\n deliveredMessages: [message],\n launchId: deliveryId,\n taskId: message.message_id,\n runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(running.workspace, running.config, agentId),\n controller,\n }).catch((error) => {\n const detail = error instanceof Error ? error.message : String(error);\n this.log(`idle delivery failed agent=${agentId} error=${detail}`);\n });\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Message delivered to idle persistent runtime\",\n launchId: deliveryId,\n entries: [{ kind: \"status\", text: \"Message delivered to idle persistent runtime\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n return true;\n }\n this.pushInbox(this.runningInboxes, agentId, [message]);\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Message queued while runtime is busy\",\n launchId: running.launchId,\n entries: [{ kind: \"status\", text: \"Message queued while runtime is busy\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n return true;\n }\n\n private sendDeliverAck(agentId: string, seq: number, deliveryId: string, accepted: boolean, reason?: string): void {\n this.options.sendToServer({ type: \"agent:deliver:ack\", agentId, seq, deliveryId, accepted, reason });\n }\n\n private pushInbox(map: Map<string, DeliveredMessage[]>, agentId: string, messages: DeliveredMessage[]): void {\n const current = map.get(agentId) ?? [];\n map.set(agentId, dedupeDeliveredMessages([...current, ...messages]));\n }\n\n private rememberQueuedMessageLaunch(messages: DeliveredMessage[], launchId?: string, taskId?: string): void {\n for (const message of messages) {\n const key = message.message_id || String(message.seq);\n if (launchId) this.queuedLaunchIds.set(key, launchId);\n if (taskId) this.queuedTaskIds.set(key, taskId);\n }\n }\n\n private queuedInboxCount(agentId: string): number {\n return (this.startingInboxes.get(agentId)?.length ?? 0) + (this.runningInboxes.get(agentId)?.length ?? 0);\n }\n\n private drainQueuedMessagesAfterTurn(\n agentId: string,\n config: AgentConfig,\n workspace: AgentWorkspace,\n launchId?: string,\n runtimeSessionId?: string\n ): boolean {\n const queued = this.runningInboxes.get(agentId) ?? [];\n if (queued.length === 0) return false;\n this.runningInboxes.delete(agentId);\n const sessionId = runtimeSessionId ?? this.idleConfigs.get(agentId)?.sessionId ?? config.sessionId;\n const nextConfig = { ...config, sessionId };\n this.idleConfigs.set(agentId, { config: nextConfig, sessionId, workspace });\n const firstQueuedKey = queued[0] ? (queued[0].message_id || String(queued[0].seq)) : \"\";\n const nextLaunchId = (firstQueuedKey ? this.queuedLaunchIds.get(firstQueuedKey) : undefined) ?? launchId;\n const nextTaskId = (firstQueuedKey ? this.queuedTaskIds.get(firstQueuedKey) : undefined) ?? queued[0]?.message_id;\n for (const message of queued) {\n const key = message.message_id || String(message.seq);\n this.queuedLaunchIds.delete(key);\n this.queuedTaskIds.delete(key);\n }\n this.log(`deliver drain queued agent=${agentId} count=${queued.length} launch=${nextLaunchId ?? \"-\"}`);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: `Processing ${queued.length} queued message${queued.length === 1 ? \"\" : \"s\"}`,\n launchId,\n entries: [{ kind: \"status\", text: `Processing ${queued.length} queued message${queued.length === 1 ? \"\" : \"s\"}`, timestamp: Date.now() }],\n pendingInboxCount: 0,\n });\n queueMicrotask(() => {\n const running = this.running.get(agentId);\n if (running?.adapter) {\n const controller = new AbortController();\n running.controller = controller;\n running.config = nextConfig;\n running.state = \"busy\";\n running.launchId = nextLaunchId;\n running.done = this.runAgentRuntime({\n agentId,\n config: nextConfig,\n workspace,\n wakeMessage: queued[0],\n deliveredMessages: queued,\n launchId: nextLaunchId,\n taskId: nextTaskId,\n runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(workspace, nextConfig, agentId),\n controller,\n }).catch((error) => {\n this.log(`queued delivery follow-up failed agent=${agentId} error=${error instanceof Error ? error.message : String(error)}`);\n });\n return;\n }\n this.running.delete(agentId);\n void this.enqueueStart({\n agentId,\n config: nextConfig,\n wakeMessage: queued[0],\n deliveredMessages: queued,\n launchId: nextLaunchId,\n taskId: nextTaskId,\n }).catch((error) => {\n this.log(`queued delivery follow-up failed agent=${agentId} error=${error instanceof Error ? error.message : String(error)}`);\n });\n });\n return true;\n }\n\n private async recordDeliveredMessageNote(workspace: AgentWorkspace, message: DeliveredMessage, seq: number): Promise<void> {\n await mkdir(workspace.notesDir, { recursive: true });\n await writeFile(\n path.join(workspace.notesDir, `deliver-${seq}.md`),\n formatDeliveredMessage(message),\n \"utf8\"\n );\n }\n\n private async stopAgent(agentId: string, reason: string): Promise<void> {\n this.log(`agent stop agent=${agentId} reason=${reason}`);\n this.cancelledStarts.add(agentId);\n this.idleConfigs.delete(agentId);\n this.startingInboxes.delete(agentId);\n this.runningInboxes.delete(agentId);\n this.rejectPendingPermissionsForAgent(agentId, \"agent stopped\");\n const running = this.running.get(agentId);\n if (!running) {\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\" });\n this.sendActivity({ agentId, activity: \"offline\", detail: \"Stopped\", entries: [{ kind: \"status\", text: \"Stopped\", timestamp: Date.now() }] });\n return;\n }\n running.stopped = true;\n running.state = \"stopping\";\n if (running.launchId) this.stoppedLaunches.add(running.launchId);\n if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n this.running.delete(agentId);\n running.controller.abort();\n await running.adapter?.destroy(\"stop\");\n this.killFakeRuntimeChild(agentId, \"stop\");\n this.sendActivity({\n agentId,\n activity: \"offline\",\n detail: \"Stopped\",\n launchId: running.launchId,\n entries: [{ kind: \"status\", text: \"Stopped\", timestamp: Date.now() }],\n });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId: running.launchId });\n await Promise.race([\n running.done?.catch(() => undefined) ?? Promise.resolve(),\n new Promise((resolve) => setTimeout(resolve, 5000)),\n ]);\n }\n\n private rejectPendingPermissionsForAgent(agentId: string, reason: string): void {\n for (const [requestId, pending] of this.pendingPermissions) {\n if (pending.agentId !== agentId) continue;\n clearTimeout(pending.timeout);\n this.pendingPermissions.delete(requestId);\n pending.resolve({ action: \"reject\", metadata: { reason } });\n }\n }\n\n private async runFakeRuntime(input: {\n agentId: string;\n config: { serverUrl: string; authToken: string; runtime: AgentRuntime; model?: string; reasoningEffort?: string; permissionMode?: \"default\" | \"full_access\" };\n workspace: AgentWorkspace;\n wakeMessage?: DeliveredMessage;\n abortSignal?: AbortSignal;\n launchId?: string;\n }): Promise<{ runtimeSessionId: string; finalMessage: string; events: Array<{ type: string; content?: string }> }> {\n const { agentId, config, workspace, wakeMessage, abortSignal, launchId } = input;\n let child: ChildProcess | undefined;\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n child = this.spawnFakeRuntimeChild({ agentId, config, workspace, launchId });\n }\n try {\n await sleep(fakeRuntimeDelayMs(), abortSignal);\n if (abortSignal?.aborted) throw new Error(\"Fake runtime aborted\");\n } finally {\n if (child) await this.stopFakeRuntimeChild(agentId, child, \"turn-complete\");\n }\n const text = `\u6536\u5230\uFF1A${wakeMessage?.content ?? \"hello\"}`;\n if (wakeMessage) {\n await fetch(new URL(`/internal/agent/${agentId}/send`, config.serverUrl), {\n method: \"POST\",\n headers: { authorization: `Bearer ${config.authToken}`, \"content-type\": \"application/json\" },\n body: JSON.stringify({ target: wakeMessage.target, text }),\n });\n }\n const sessionId = `fake-${Date.now()}`;\n return {\n runtimeSessionId: sessionId,\n finalMessage: wakeMessage ? text : \"Startup complete\",\n events: [{ type: \"assistant_result\", content: wakeMessage ? text : \"Startup complete\" }],\n };\n }\n\n private spawnFakeRuntimeChild(input: {\n agentId: string;\n config: { runtime: AgentRuntime; model?: string; reasoningEffort?: string; permissionMode?: \"default\" | \"full_access\" };\n workspace: AgentWorkspace;\n launchId?: string;\n }): ChildProcess {\n this.killFakeRuntimeChild(input.agentId, \"replace\");\n this.log(`runtime spawn agent=${input.agentId} runtime=${input.config.runtime} model=${input.config.model ?? \"default\"} reasoning=${input.config.reasoningEffort ?? \"default\"} permission=${input.config.permissionMode ?? \"default\"} cwd=${input.workspace.agentDir} launch=${input.launchId ?? \"-\"}`);\n const child = spawn(process.execPath, [\n \"-e\",\n [\n \"process.title='wm-fake-runtime-child';\",\n \"process.on('SIGTERM',()=>process.exit(0));\",\n \"process.on('SIGINT',()=>process.exit(0));\",\n \"setInterval(()=>{},1000);\",\n ].join(\"\"),\n ], {\n cwd: input.workspace.agentDir,\n env: {\n ...process.env,\n WM_FAKE_RUNTIME_AGENT_ID: input.agentId,\n WM_FAKE_RUNTIME_LAUNCH_ID: input.launchId ?? \"\",\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n this.fakeRuntimeChildren.set(input.agentId, child);\n this.log(`runtime pid agent=${input.agentId} pid=${child.pid ?? \"-\"} cwd=${input.workspace.agentDir}`);\n child.once(\"exit\", () => {\n if (this.fakeRuntimeChildren.get(input.agentId) === child) this.fakeRuntimeChildren.delete(input.agentId);\n });\n return child;\n }\n\n private killFakeRuntimeChild(agentId: string, reason: string): void {\n const child = this.fakeRuntimeChildren.get(agentId);\n if (!child) return;\n this.log(`runtime kill agent=${agentId} pid=${child.pid ?? \"-\"} reason=${reason}`);\n this.fakeRuntimeChildren.delete(agentId);\n if (!child.killed) child.kill(\"SIGTERM\");\n }\n\n private async stopFakeRuntimeChild(agentId: string, child: ChildProcess, reason: string): Promise<void> {\n if (this.fakeRuntimeChildren.get(agentId) !== child) return;\n this.killFakeRuntimeChild(agentId, reason);\n await Promise.race([\n new Promise((resolve) => child.once(\"exit\", resolve)),\n new Promise((resolve) => setTimeout(resolve, 1000)),\n ]);\n if (!child.killed && child.exitCode === null) child.kill(\"SIGKILL\");\n }\n\n private async writeRuntimeEnv(\n workspace: AgentWorkspace,\n config: { serverUrl: string; authToken: string; runtime: AgentRuntime; serverNamespace: string; machineId: string; envVars?: Record<string, string> },\n agentId: string\n ): Promise<void> {\n const customEnv = Object.entries(config.envVars ?? {}).map(([key, value]) => `${key}=${escapeEnvValue(value)}`);\n await mkdir(workspace.wmDir, { recursive: true });\n await writeFile(\n path.join(workspace.wmDir, \"runtime-env\"),\n [\n `WM_AGENT_ID=${agentId}`,\n `WM_CLI_PATH=${workspace.wrapperPath}`,\n `WM_SERVER_URL=${config.serverUrl}`,\n `WM_AGENT_TOKEN=${config.authToken}`,\n `WM_DAEMON_RUNTIME=${config.runtime}`,\n `WM_DAEMON_SERVER_NAMESPACE=${config.serverNamespace}`,\n `WM_DAEMON_MACHINE_ID=${config.machineId}`,\n `NO_PROXY=127.0.0.1,localhost,::1,${process.env.NO_PROXY ?? \"\"}`,\n `no_proxy=127.0.0.1,localhost,::1,${process.env.no_proxy ?? \"\"}`,\n ...customEnv,\n \"\",\n ].join(\"\\n\"),\n \"utf8\"\n );\n }\n\n private buildRuntimeEnv(\n workspace: AgentWorkspace,\n config: { serverUrl: string; authToken: string; runtime: AgentRuntime; serverNamespace: string; machineId: string; envVars?: Record<string, string> },\n agentId: string\n ): NodeJS.ProcessEnv {\n return {\n ...process.env,\n ...(config.envVars ?? {}),\n PATH: `${workspace.wmDir}${path.delimiter}${process.env.PATH ?? \"\"}`,\n WM_AGENT_ID: agentId,\n WM_CLI_PATH: workspace.wrapperPath,\n WM_SERVER_URL: config.serverUrl,\n WM_AGENT_TOKEN: config.authToken,\n WM_DAEMON_RUNTIME: config.runtime,\n WM_DAEMON_SERVER_NAMESPACE: config.serverNamespace,\n WM_DAEMON_MACHINE_ID: config.machineId,\n NO_PROXY: `127.0.0.1,localhost,::1,${process.env.NO_PROXY ?? \"\"}`,\n no_proxy: `127.0.0.1,localhost,::1,${process.env.no_proxy ?? \"\"}`,\n };\n }\n\n private async replyWorkspaceList(agentId: string, requestId: string, dirPath?: string, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n this.log(`workspace list agent=${agentId} request=${requestId} path=${dirPath ?? \".\"}`);\n const ensured = await this.ensureAgentWorkspace(agentId, config);\n if (ensured.missing) {\n this.options.sendToServer({ type: \"agent:workspace:file_tree\", agentId, requestId, entries: [], missing: true });\n return;\n }\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const entries = await this.browser.listFiles(agentId, dirPath, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n this.options.sendToServer({ type: \"agent:workspace:file_tree\", agentId, requestId, entries });\n } catch (error) {\n this.log(`workspace list failed agent=${agentId} request=${requestId} error=${error instanceof Error ? error.message : String(error)}`);\n this.options.sendToServer({\n type: \"agent:workspace:file_tree\",\n agentId,\n requestId,\n entries: [],\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyWorkspaceRead(agentId: string, requestId: string, filePath: string, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n this.log(`workspace read agent=${agentId} request=${requestId} path=${filePath}`);\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const file = await this.browser.readFile(agentId, filePath, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n this.options.sendToServer({ type: \"agent:workspace:file_content\", agentId, requestId, file });\n } catch (error) {\n this.log(`workspace read failed agent=${agentId} request=${requestId} error=${error instanceof Error ? error.message : String(error)}`);\n this.options.sendToServer({\n type: \"agent:workspace:file_content\",\n agentId,\n requestId,\n file: null,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyWorkspaceWrite(agentId: string, requestId: string, filePath: string, content: string, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n this.log(`workspace write agent=${agentId} request=${requestId} path=${filePath}`);\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const result = await this.browser.writeFile(agentId, filePath, content, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n this.options.sendToServer({ type: \"agent:workspace:write_result\", agentId, requestId, ...result });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:workspace:write_result\",\n agentId,\n requestId,\n path: filePath,\n ok: false,\n error: error instanceof Error ? error.message : \"workspace write failed\",\n });\n }\n }\n\n private async replyAgentSkillsList(agentId: string, requestId: string, runtime: RuntimeId, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n const ensured = await this.ensureAgentWorkspace(agentId, config);\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const namespace = serverNamespace ?? effectiveConfig?.serverNamespace;\n const machine = machineId ?? effectiveConfig?.machineId;\n if (!namespace || !machine) throw new Error(`Unknown agent workspace: ${agentId}`);\n const result = await scanAgentSkills({\n rootDir: this.options.rootDir,\n serverNamespace: namespace,\n machineDirectoryName: this.machineDirectoryName(effectiveConfig),\n machineId: machine,\n agentDirectoryName: effectiveConfig ? this.agentDirectoryName(effectiveConfig, agentId) : namedWorkspaceDirectoryName(agentId, agentId, \"agent\"),\n agentId,\n runtime,\n });\n this.options.sendToServer({ type: \"agent:skills:list/result\", agentId, requestId, global: result.global, workspace: result.workspace });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:skills:list/result\",\n agentId,\n requestId,\n global: [],\n workspace: [],\n error: error instanceof Error ? error.message : \"skills scan failed\",\n });\n }\n }\n\n private async replyMachineWorkspaceScan(requestId: string, serverNamespace: string, machineId: string, machineName: string | undefined, knownAgentIds: string[]): Promise<void> {\n try {\n const entries = await this.scanWorkspaces(serverNamespace, machineId, machineName, new Set(knownAgentIds));\n this.options.sendToServer({ type: \"machine:workspace:scan/result\", requestId, entries });\n } catch (error) {\n this.options.sendToServer({\n type: \"machine:workspace:scan/result\",\n requestId,\n entries: [],\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyMachineWorkspaceDelete(requestId: string, serverNamespace: string, machineId: string, machineName: string | undefined, directoryName: string): Promise<void> {\n try {\n if (!isSafeWorkspaceDirectoryName(directoryName)) throw new Error(\"unsafe workspace directory name\");\n if (this.running.has(directoryName) || this.starting.has(directoryName)) throw new Error(\"cannot delete a running workspace\");\n const target = this.resolveWorkspaceDirectoryName(machineName ?? machineId, machineId, directoryName);\n await rm(target, { recursive: true, force: true });\n this.options.sendToServer({ type: \"machine:workspace:delete/result\", requestId, directoryName, ok: true });\n } catch (error) {\n this.options.sendToServer({\n type: \"machine:workspace:delete/result\",\n requestId,\n directoryName,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyResetWorkspace(requestId: string, agentId: string, config: AgentConfig): Promise<void> {\n try {\n await this.stopAgent(agentId, \"reset-workspace\");\n const target = this.resolveWorkspaceDirectory(config, agentId);\n await rm(target, { recursive: true, force: true });\n const workspace = await createAgentWorkspace({\n rootDir: this.options.rootDir,\n serverNamespace: config.serverNamespace,\n serverId: config.spaceId,\n machineDirectoryName: this.machineDirectoryName(config),\n machineId: config.machineId,\n agentDirectoryName: this.agentDirectoryName(config, agentId),\n daemonId: os.hostname() || \"local-daemon\",\n agentId,\n agentName: config.agentName,\n runtime: config.runtime,\n role: config.role,\n feishuDelegationEnabled: config.feishuDelegationEnabled,\n });\n this.idleConfigs.set(agentId, { config, sessionId: config.sessionId, workspace });\n this.options.sendToServer({ type: \"agent:reset-workspace/result\", requestId, agentId, ok: true });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:reset-workspace/result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyAgentDiagnostic(requestId: string, agentId: string, config?: AgentConfig): Promise<void> {\n try {\n const snapshot = await this.buildAgentDiagnostic(agentId, config);\n this.options.sendToServer({ type: \"agent:diagnostic/result\", requestId, agentId, ok: true, snapshot });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:diagnostic/result\",\n requestId,\n agentId,\n ok: false,\n snapshot: {\n agentId,\n daemonState: \"offline\",\n workspaceExists: false,\n pendingInboxCount: this.queuedInboxCount(agentId),\n },\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async buildAgentDiagnostic(agentId: string, config?: AgentConfig): Promise<AgentDiagnosticSnapshot> {\n const running = this.running.get(agentId);\n const idle = this.idleConfigs.get(agentId);\n const effectiveConfig = running?.config ?? idle?.config ?? config;\n const workspace = running?.workspace ?? idle?.workspace;\n const workspacePath = workspace?.agentDir ?? (effectiveConfig ? this.resolveWorkspaceDirectory(effectiveConfig, agentId) : undefined);\n const workspaceExists = workspacePath ? await pathExists(workspacePath) : false;\n return {\n agentId,\n daemonState: this.starting.has(agentId) ? \"starting\" : running ? running.state === \"idle\" ? \"idle\" : \"running\" : idle ? \"idle\" : \"offline\",\n runtime: effectiveConfig?.runtime,\n model: effectiveConfig?.model,\n sessionId: running?.sessionId ?? idle?.sessionId ?? effectiveConfig?.sessionId,\n launchId: running?.launchId,\n runtimePid: running?.adapter?.pid ?? this.fakeRuntimeChildren.get(agentId)?.pid,\n workspacePath,\n workspaceExists,\n pendingInboxCount: this.queuedInboxCount(agentId),\n lastActivity: this.lastActivities.get(agentId),\n };\n }\n\n private async scanWorkspaces(serverNamespace: string, machineId: string, machineName: string | undefined, knownAgentIds: Set<string>): Promise<MachineWorkspaceEntry[]> {\n const machineRoot = this.resolveMachineRoot(machineName ?? machineId, machineId);\n const names = await readdir(machineRoot, { withFileTypes: true }).catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n });\n const entries: MachineWorkspaceEntry[] = [];\n for (const entry of names) {\n if (!entry.isDirectory() || !isSafeWorkspaceDirectoryName(entry.name)) continue;\n const fullPath = this.resolveWorkspaceDirectoryName(machineName ?? machineId, machineId, entry.name);\n const summary = await summarizeDirectory(fullPath);\n const agentId = agentIdFromDirectoryName(entry.name, knownAgentIds);\n entries.push({\n directoryName: entry.name,\n agentId,\n workspacePath: `~/.wm/${this.machineDirectoryNameForParts(machineName ?? machineId, machineId)}/${entry.name}/`,\n knownToServer: knownAgentIds.has(agentId),\n running: this.running.has(agentId) || this.starting.has(agentId),\n fileCount: summary.fileCount,\n totalSizeBytes: summary.totalSizeBytes,\n lastModified: summary.lastModified,\n });\n }\n return entries.sort((a, b) => b.lastModified - a.lastModified || a.directoryName.localeCompare(b.directoryName));\n }\n\n private resolveMachineRoot(machineName: string, machineId: string): string {\n const machineDirectoryName = this.machineDirectoryNameForParts(machineName, machineId);\n if (!isSafeWorkspaceDirectoryName(machineDirectoryName)) throw new Error(\"unsafe machine directory\");\n const resolved = path.resolve(this.options.rootDir, machineDirectoryName);\n const base = path.resolve(this.options.rootDir);\n if (resolved !== base && !resolved.startsWith(`${base}${path.sep}`)) throw new Error(\"workspace root escapes daemon root\");\n return resolved;\n }\n\n private machineDirectoryName(config?: AgentConfig): string {\n return this.machineDirectoryNameForParts(config?.machineName ?? this.options.machineDisplayName, config?.machineId ?? \"machine\");\n }\n\n private machineDirectoryNameForParts(machineName: string, machineId: string): string {\n return namedWorkspaceDirectoryName(machineName, machineId, \"machine\");\n }\n\n private agentDirectoryName(config: AgentConfig, agentId: string): string {\n return namedWorkspaceDirectoryName(config.agentName, agentId, \"agent\");\n }\n\n private workspaceDisplayPath(config: AgentConfig, agentId: string): string {\n return `~/.wm/${this.machineDirectoryName(config)}/${this.agentDirectoryName(config, agentId)}/`;\n }\n\n private resolveWorkspaceDirectory(config: AgentConfig, agentId: string): string {\n return this.resolveWorkspaceDirectoryForParts(config.machineName ?? this.options.machineDisplayName, config.machineId, config.agentName, agentId);\n }\n\n private resolveWorkspaceDirectoryForParts(machineName: string, machineId: string, agentName: string, agentId: string): string {\n const directoryName = namedWorkspaceDirectoryName(agentName, agentId, \"agent\");\n return this.resolveWorkspaceDirectoryName(machineName, machineId, directoryName);\n }\n\n private resolveWorkspaceDirectoryName(machineName: string, machineId: string, directoryName: string): string {\n if (!isSafeWorkspaceDirectoryName(directoryName)) throw new Error(\"unsafe workspace directory name\");\n const machineRoot = this.resolveMachineRoot(machineName, machineId);\n const resolved = path.resolve(machineRoot, directoryName);\n if (resolved !== machineRoot && !resolved.startsWith(`${machineRoot}${path.sep}`)) {\n throw new Error(\"workspace directory escapes machine root\");\n }\n return resolved;\n }\n\n private log(line: string): void {\n this.options.log?.(`[agent] ${line}`);\n }\n\n private async writeRunLog(\n workspace: AgentWorkspace,\n input: {\n agentId: string;\n launchId?: string;\n taskId?: string;\n runtime: AgentRuntime;\n runtimeSessionId?: string;\n status: string;\n finalMessage: string;\n errorMessage?: string;\n events: unknown[];\n }\n ): Promise<void> {\n await mkdir(workspace.runsDir, { recursive: true });\n const timestamp = new Date().toISOString();\n const runPath = path.join(workspace.runsDir, `${timestamp.replace(/[:.]/g, \"-\")}.jsonl`);\n const records = [\n {\n type: \"run\",\n timestamp,\n agentId: input.agentId,\n launchId: input.launchId,\n taskId: input.taskId,\n runtime: input.runtime,\n runtimeSessionId: input.runtimeSessionId,\n status: input.status,\n errorMessage: input.errorMessage,\n },\n ...input.events.map((event) => ({ type: \"runtime_event\", timestamp: Date.now(), event })),\n {\n type: \"final\",\n timestamp: new Date().toISOString(),\n status: input.status,\n text: input.finalMessage,\n errorMessage: input.errorMessage,\n },\n ];\n await writeFile(runPath, records.map((record) => JSON.stringify(record)).join(\"\\n\") + \"\\n\", \"utf8\");\n }\n}\n\nfunction compact(text: string): string {\n const value = text.replace(/\\s+/g, \" \").trim();\n return value.length > 120 ? `${value.slice(0, 117)}...` : value;\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction threadReplyTarget(message: DeliveredMessage | undefined): string {\n if (!message?.target) return \"#all\";\n if (message.target.includes(\":\")) return message.target;\n if ((message.target.startsWith(\"#\") || message.target.startsWith(\"dm:@\")) && message.message_id) {\n return `${message.target}:${message.message_id.slice(0, 8)}`;\n }\n return message.target;\n}\n\nfunction formatStartupPrompt(wrapperPath: string): string {\n return [\n \"Start this platform-created agent session.\",\n \"\",\n \"This is an initialization turn only. There is no user channel message, no direct message, and no task to answer.\",\n \"Read the local MEMORY.md if you need to understand your durable identity and workspace.\",\n `The agent-local wm CLI wrapper is available at ${wrapperPath}. Do not call it during this initialization turn unless you are explicitly checking identity with a read-only command.`,\n \"Do not send any platform message, do not invent a channel target, and do not reply to #all.\",\n \"When initialization is complete, stop with a short runtime final output such as \\\"Startup complete\\\".\",\n ].join(\"\\n\");\n}\n\nfunction formatActionableMessagePrompt(messages: DeliveredMessage[], wrapperPath: string): string {\n const first = messages[0];\n const receivedTarget = first?.target ?? \"#all\";\n const replyTarget = threadReplyTarget(first);\n const replyCommand = [\n `${shellSingleQuote(wrapperPath)} message send --target ${shellSingleQuote(replyTarget)} <<'EOF'`,\n \"your reply\",\n \"EOF\",\n ].join(\"\\n\");\n return [\n formatMessageBatchPrompt(messages, wrapperPath),\n \"\",\n `Received target: ${receivedTarget}`,\n first?.message_id ? `Message ID: ${first.message_id}` : \"Message ID: unknown\",\n `Thread reply target: ${replyTarget}`,\n \"\",\n \"Before acting, identify the requested work surface: Wage Mule platform, local workspace, or an external system. Use the tool for that surface.\",\n \"Platform-agent collaboration rule: if this message asks you to ask, check, confirm, contact, or get status from another platform agent, do not inspect local process/workspace/server activity/task list to answer for them. Ask that agent in this exact thread target with an @mention, wait for their platform reply, then summarize in the same thread.\",\n \"External-system rule: if the user names an external system such as Feishu/Lark, do the action through that external skill, CLI, token, or API, then report the result in this thread. Do not replace an external contact request with a platform mention.\",\n \"\",\n \"Complete the requested work. When you have a channel-visible final reply, send it with this agent-local absolute command:\",\n replyCommand,\n \"Do not call a global wm binary for platform replies. If this absolute wrapper fails, report the exact failure in your runtime final output.\",\n \"Do not rely on runtime final output as the platform reply.\",\n ].join(\"\\n\");\n}\n\nfunction formatMessageBatchPrompt(messages: DeliveredMessage[], wrapperPath: string): string {\n if (messages.length === 0) return \"\";\n if (messages.length === 1) return formatDeliveredMessage(messages[0]);\n const replyTarget = threadReplyTarget(messages[0]);\n const replyCommand = [\n `${shellSingleQuote(wrapperPath)} message send --target ${shellSingleQuote(replyTarget)} <<'EOF'`,\n \"your reply\",\n \"EOF\",\n ].join(\"\\n\");\n return [\n \"New platform messages were delivered while you were busy. Process each message below in order.\",\n \"\",\n messages.map((message) => formatDeliveredMessage(message)).join(\"\\n\\n---\\n\\n\"),\n \"\",\n \"Use the agent-local wm CLI wrapper for any channel-visible replies:\",\n replyCommand,\n \"\",\n `Use thread target ${replyTarget} when the delivered message is part of, or should create, a thread.`,\n \"\",\n \"Complete all work that is now actionable before stopping.\",\n ].join(\"\\n\");\n}\n\nfunction dedupeDeliveredMessages(messages: DeliveredMessage[]): DeliveredMessage[] {\n const seen = new Set<string>();\n const deduped: DeliveredMessage[] = [];\n for (const message of messages) {\n const key = message.message_id || String(message.seq);\n if (seen.has(key)) continue;\n seen.add(key);\n deduped.push(message);\n }\n return deduped;\n}\n\nfunction feishuDelegationLookbackMinutes(intervalSeconds: number): number {\n return Math.min(60, Math.max(2, Math.ceil((intervalSeconds + 60) / 60)));\n}\n\nfunction selectRuntimeModel(detection: RuntimeModelDetectionResult, requestedModel: string): RuntimeModelDescriptor | undefined {\n if (detection.models.length === 0) {\n if (requestedModel === \"default\") return undefined;\n throw new Error(`unsupported model for ${detection.runtime}: ${requestedModel}`);\n }\n if (requestedModel === \"default\") {\n return detection.models.find((model) => model.id === detection.defaultModel)\n ?? detection.models.find((model) => model.default)\n ?? detection.models[0];\n }\n const model = detection.models.find((candidate) => candidate.id === requestedModel);\n if (!model) throw new Error(`unsupported model for ${detection.runtime}: ${requestedModel}`);\n return model;\n}\n\nfunction escapeEnvValue(value: string): string {\n return String(value).replace(/\\n/g, \"\\\\n\");\n}\n\nfunction fakeRuntimeDelayMs(): number {\n const raw = Number(process.env.WM_DAEMON_FAKE_RUNTIME_DELAY_MS);\n return Number.isFinite(raw) && raw >= 0 ? raw : 200;\n}\n\nasync function summarizeDirectory(root: string): Promise<{ fileCount: number; totalSizeBytes: number; lastModified: number }> {\n let fileCount = 0;\n let totalSizeBytes = 0;\n let lastModified = 0;\n const visit = async (dir: string): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const info = await stat(fullPath);\n lastModified = Math.max(lastModified, info.mtimeMs);\n if (entry.isDirectory()) {\n await visit(fullPath);\n } else {\n fileCount += 1;\n totalSizeBytes += info.size;\n }\n }\n };\n const rootInfo = await stat(root);\n lastModified = rootInfo.mtimeMs;\n await visit(root);\n return { fileCount, totalSizeBytes, lastModified };\n}\n\nfunction agentIdFromDirectoryName(directoryName: string, knownAgentIds: Set<string>): string {\n for (const agentId of knownAgentIds) {\n if (directoryName.endsWith(`-${agentId}`)) return agentId;\n }\n return directoryName;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal?.aborted) return Promise.reject(new Error(\"Runtime aborted\"));\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"Runtime aborted\"));\n };\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n", "export type RuntimeId = \"codex\" | \"claude\" | \"kimi\" | \"gemini\" | \"cursor\" | \"hermes\" | \"opencode\";\nexport type SpaceRole = \"owner\" | \"admin\" | \"member\";\nexport type MemberType = \"human\" | \"agent\";\nexport type TaskStatus = \"todo\" | \"in_progress\" | \"in_review\" | \"done\" | \"cancelled\";\nexport type TaskSource = \"channel\" | \"feishu\";\nexport type AgentPresence = \"idle\" | \"working\" | \"thinking\" | \"error\" | \"offline\";\nexport type AgentDaemonState = \"unavailable\" | \"inactive\" | \"wakeable\" | \"active\";\nexport type AgentActivity = \"idle\" | \"working\" | \"thinking\" | \"error\" | \"offline\" | \"unknown\";\nexport type AgentPermissionMode = \"default\" | \"full_access\";\nexport type ChannelVisibility = \"public\" | \"private\";\nexport type MessageKind = \"human\" | \"agent\" | \"system\";\nexport type RunStatus = \"running\" | \"completed\" | \"failed\";\n\nexport type ActivityEntryKind =\n | \"text\"\n | \"thinking\"\n | \"tool_start\"\n | \"tool_end\"\n | \"compaction_started\"\n | \"compaction_finished\"\n | \"status\"\n | \"error\";\n\nexport interface Space {\n id: string;\n name: string;\n owner_user_id: string;\n created_at: number;\n}\n\nexport interface HumanUser {\n id: string;\n name: string;\n display_name?: string;\n email: string;\n created_at: number;\n}\n\nexport interface HumanFeishuBinding {\n space_id: string;\n human_id: string;\n app_id: string;\n app_display_name: string;\n status: \"pending_oauth\" | \"active\" | \"error\";\n has_user_token: boolean;\n open_id?: string;\n union_id?: string;\n updated_at: number;\n}\n\nexport interface FeishuInvite {\n id: string;\n space_id: string;\n inviter_human_id: string;\n invitee_open_id: string;\n invitee_name: string;\n status: \"pending\" | \"accepted\" | \"expired\" | \"cancelled\";\n expires_at: number;\n accepted_by_user_id?: string;\n created_at: number;\n used_at?: number;\n}\n\nexport interface HumanDelegation {\n id: string;\n space_id: string;\n human_id: string;\n medium: \"feishu\";\n delegate_agent_id: string;\n enabled: boolean;\n interval_seconds: number;\n consecutive_failures: number;\n last_wake_at?: number;\n last_success_at?: number;\n feishu_channel_id?: string;\n created_at: number;\n updated_at: number;\n}\n\nexport interface MemberFindResult {\n human?: {\n id: string;\n name: string;\n email?: string;\n feishu_open_id?: string;\n };\n agents: Array<{\n agent_id: string;\n name: string;\n runtime: RuntimeId;\n online: boolean;\n machine_id: string;\n }>;\n}\n\nexport interface Machine {\n id: string;\n space_id: string;\n name: string;\n hostname: string;\n os: string;\n daemon_version: string;\n latest_daemon_version?: string;\n daemon_update_available?: boolean;\n daemon_version_status?: \"up_to_date\" | \"outdated\" | \"current\" | \"unknown\";\n runtimes: RuntimeId[];\n runtime_models?: RuntimeModelDetectionResult[];\n status: \"online\" | \"offline\";\n connected_at?: number;\n last_seen_at?: number;\n created_at?: number;\n removed_at?: number;\n connect_command?: string;\n}\n\nexport interface Agent {\n id: string;\n space_id: string;\n machine_id: string;\n machine_name?: string;\n owner_user_id?: string;\n channel_id?: string;\n runtime: RuntimeId;\n model: string;\n reasoning_effort?: string;\n permission_mode: AgentPermissionMode;\n name: string;\n display_name: string;\n role: string;\n instructions: string;\n env_vars?: Record<string, string>;\n workspace_path?: string;\n daemon_state?: AgentDaemonState;\n activity?: AgentActivity;\n activity_detail?: string;\n active_launch_id?: string;\n last_activity_at?: number;\n presence: AgentPresence;\n created_at: number;\n updated_at: number;\n last_runtime_session_id?: string;\n}\n\nexport interface Channel {\n id: string;\n space_id: string;\n name: string;\n description?: string;\n visibility: ChannelVisibility;\n is_default: boolean;\n created_by_user_id: string;\n human_member_ids?: string[];\n member_count?: number;\n agent_count?: number;\n unread_count?: number;\n created_at: number;\n archived_at?: number;\n updated_at?: number;\n}\n\nexport type InboxItemType =\n | \"permission\"\n | \"permission_request\"\n | \"question\"\n | \"confirmation_request\"\n | \"error\"\n | \"completed\"\n | \"alert\"\n | \"feishu_draft\";\nexport type InboxItemStatus =\n | \"open\"\n | \"approved\"\n | \"rejected\"\n | \"confirmed\"\n | \"ignored\"\n | \"acknowledged\"\n | \"sent\"\n | \"failed\"\n | \"resolved\";\nexport type InboxAction = \"approve\" | \"reject\" | \"confirm\" | \"ignore\" | \"ack\";\n\nexport interface InboxItem {\n id: string;\n organization_id: string;\n channel_id?: string;\n task_id?: string;\n run_id?: string;\n type: InboxItemType;\n title: string;\n description: string;\n status: InboxItemStatus;\n metadata: Record<string, unknown>;\n created_at: number;\n resolved_at?: number;\n}\n\nexport interface InboxItemAction {\n id: string;\n inbox_item_id: string;\n action: InboxAction;\n actor_user_id: string;\n note?: string;\n metadata: Record<string, unknown>;\n created_at: number;\n}\n\nexport interface MessageSearchResult {\n message_id: string;\n channel_id?: string;\n dm_pair_key?: string;\n target_type: \"channel\" | \"dm\";\n seq: number;\n snippet: string;\n author: {\n type: MemberType;\n id: string;\n name: string;\n };\n created_at: number;\n channel_name?: string;\n dm_name?: string;\n}\n\nexport interface Message {\n id: string;\n space_id: string;\n channel_id?: string;\n dm_pair_key?: string;\n thread_id?: string;\n seq: number;\n kind: MessageKind;\n author_type: MemberType;\n author_id: string;\n author_name: string;\n text: string;\n attachment_ids?: string[];\n mentions?: string[];\n reply_count?: number;\n created_at: number;\n}\n\nexport interface Task {\n id: string;\n space_id: string;\n channel_id?: string;\n source?: TaskSource;\n source_message_id?: string;\n metadata?: Record<string, unknown>;\n title: string;\n description: string;\n status: TaskStatus;\n assignee_id?: string;\n created_by_user_id: string;\n created_at: number;\n updated_at: number;\n}\n\nexport interface ActivityEntry {\n kind: ActivityEntryKind;\n text?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_output?: string;\n is_error?: boolean;\n timestamp: number;\n}\n\nexport interface AgentRun {\n id: string;\n space_id: string;\n agent_id: string;\n task_id: string;\n launch_id: string;\n status: RunStatus;\n created_at: number;\n updated_at: number;\n completed_at?: number;\n error?: string;\n}\n\nexport interface RunEvent {\n id: string;\n run_id: string;\n seq: number;\n entries: ActivityEntry[];\n created_at: number;\n}\n\nexport interface AttachmentMeta {\n id: string;\n space_id: string;\n filename: string;\n mime_type: string;\n size: number;\n path: string;\n created_at: number;\n}\n\nexport interface Reminder {\n id: string;\n space_id: string;\n agent_id: string;\n title: string;\n fire_at: string;\n recurrence?: string;\n anchor_message_id?: string;\n status: \"scheduled\" | \"fired\" | \"cancelled\";\n version: number;\n created_at: number;\n updated_at: number;\n}\n\nexport interface FileEntry {\n name: string;\n path: string;\n type: \"file\" | \"directory\";\n size: number;\n modified_at: number;\n}\n\nexport interface FileContent {\n path: string;\n content: string | null;\n binary: boolean;\n size: number;\n mime_type?: string;\n encoding?: \"utf8\" | \"base64\";\n}\n\nexport interface AgentSkillDescriptor {\n name: string;\n path: string;\n description?: string;\n userInvocable?: boolean;\n content?: string;\n version?: string;\n loadedVersion?: string;\n updatedAt?: number;\n}\n\nexport interface AgentSkillGroup {\n source: \"global\" | \"workspace\";\n root: string;\n skills: AgentSkillDescriptor[];\n}\n\nexport interface RuntimeModelDescriptor {\n id: string;\n label: string;\n providerId?: string;\n providerLabel?: string;\n default?: boolean;\n fixed?: boolean;\n reasoningEfforts?: string[];\n defaultReasoningEffort?: string;\n}\n\nexport interface RuntimeModelDetectionResult {\n runtime: RuntimeId;\n source: \"static\" | \"codex-cache\" | \"cursor-cli\" | \"kimi-config\" | \"kimi-cli\" | \"hermes-config\" | \"hermes-provider-models\" | \"gemini-cli\" | \"gemini-default\" | \"opencode-cli\" | \"opencode-default\" | \"error\";\n selectable: boolean;\n fixed?: boolean;\n defaultModel?: string;\n models: RuntimeModelDescriptor[];\n error?: string;\n}\n\nexport interface MachineWorkspaceEntry {\n directoryName: string;\n agentId?: string;\n workspacePath?: string;\n knownToServer: boolean;\n running: boolean;\n fileCount: number;\n totalSizeBytes: number;\n lastModified: number;\n}\n\nexport interface AgentDiagnosticSnapshot {\n agentId: string;\n daemonState: \"starting\" | \"running\" | \"idle\" | \"offline\";\n runtime?: RuntimeId;\n model?: string;\n sessionId?: string;\n launchId?: string;\n runtimePid?: number;\n workspacePath?: string;\n workspaceExists: boolean;\n pendingInboxCount: number;\n lastActivity?: {\n activity: AgentActivity;\n detail: string;\n launchId?: string;\n };\n}\n\nexport interface DeliveredMessage {\n target: string;\n message_id: string;\n thread_id?: string;\n parent_message_id?: string;\n seq: number;\n timestamp: string;\n sender_type: MemberType;\n sender_name: string;\n content: string;\n attachments?: Array<{ id: string; filename: string }>;\n task_status?: TaskStatus;\n task_number?: number;\n thread_join_context?: {\n parent_target: string;\n thread_target: string;\n suggested_read_history_target: string;\n parent_message: DeliveredMessage;\n recent_messages: DeliveredMessage[];\n history_truncated?: boolean;\n };\n}\n\nexport interface DaemonMsg_AgentStart {\n type: \"agent:start\";\n agentId: string;\n config: {\n runtime: RuntimeId;\n model: string;\n reasoningEffort?: string;\n permissionMode?: AgentPermissionMode;\n sessionId?: string;\n serverUrl: string;\n authToken: string;\n spaceId: string;\n machineId: string;\n machineName?: string;\n serverNamespace: string;\n agentName: string;\n role?: string;\n envVars?: Record<string, string>;\n feishuDelegationEnabled?: boolean;\n };\n wakeMessage?: DeliveredMessage;\n launchId?: string;\n taskId?: string;\n}\n\nexport interface DaemonMsg_AgentStop {\n type: \"agent:stop\";\n agentId: string;\n}\n\nexport interface DaemonMsg_AgentDeliver {\n type: \"agent:deliver\";\n agentId: string;\n message: DeliveredMessage;\n seq: number;\n deliveryId: string;\n}\n\nexport interface DaemonMsg_AgentDeliverReply {\n type: \"agent:dm:reply\";\n agentId: string;\n waitToken: string;\n replyMessageId: string;\n text: string;\n senderAgentId: string;\n senderName: string;\n timestamp: string;\n}\n\nexport interface DaemonMsg_ActivityProbe {\n type: \"agent:activity_probe\";\n agentId: string;\n probeId: string;\n}\n\nexport interface DaemonMsg_WorkspaceList {\n type: \"agent:workspace:list\";\n agentId: string;\n requestId: string;\n path?: string;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_WorkspaceRead {\n type: \"agent:workspace:read\";\n agentId: string;\n requestId: string;\n path: string;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_WorkspaceWrite {\n type: \"agent:workspace:write\";\n agentId: string;\n requestId: string;\n path: string;\n content: string;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_AgentSkillsList {\n type: \"agent:skills:list\";\n agentId: string;\n requestId: string;\n runtime: RuntimeId;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_AgentWorkspaceInit {\n type: \"agent:workspace:init\";\n requestId: string;\n agentId: string;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuTokenWrite {\n type: \"feishu:token:write\";\n requestId: string;\n agentId: string;\n token: string;\n appId: string;\n brand?: \"feishu\" | \"lark\";\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuTokenClear {\n type: \"feishu:token:clear\";\n requestId: string;\n agentId: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuDelegationStart {\n type: \"feishu:delegation:start\";\n requestId: string;\n delegation: HumanDelegation;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuDelegationStop {\n type: \"feishu:delegation:stop\";\n requestId: string;\n delegationId: string;\n agentId: string;\n}\n\nexport interface DaemonMsg_FeishuDelegationUpdate {\n type: \"feishu:delegation:update\";\n requestId: string;\n delegation: HumanDelegation;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_RuntimeModelsDetect {\n type: \"machine:runtime_models:detect\";\n requestId: string;\n runtimes?: RuntimeId[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceScan {\n type: \"machine:workspace:scan\";\n requestId: string;\n serverNamespace: string;\n machineId: string;\n machineName?: string;\n knownAgentIds?: string[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceDelete {\n type: \"machine:workspace:delete\";\n requestId: string;\n serverNamespace: string;\n machineId: string;\n machineName?: string;\n directoryName: string;\n}\n\nexport interface DaemonMsg_AgentResetWorkspace {\n type: \"agent:reset-workspace\";\n requestId: string;\n agentId: string;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_AgentDiagnostic {\n type: \"agent:diagnostic\";\n requestId: string;\n agentId: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_ReminderUpsert {\n type: \"reminder.upsert\";\n reminder: Reminder;\n}\n\nexport interface DaemonMsg_ReminderCancel {\n type: \"reminder.cancel\";\n reminderId: string;\n version: number;\n}\n\nexport interface DaemonMsg_ReminderSnapshot {\n type: \"reminder.snapshot\";\n agentId: string;\n reminders: Reminder[];\n}\n\nexport interface DaemonMsg_Ping {\n type: \"ping\";\n}\n\nexport interface DaemonMsg_AgentRuntimeProfileMigration {\n type: \"agent:runtime_profile:migration\";\n agentId: string;\n migrationKey: string;\n}\n\nexport interface DaemonMsg_AgentPermissionDecision {\n type: \"agent:permission_decision\";\n agentId: string;\n requestId: string;\n action: \"approve\" | \"reject\";\n metadata?: Record<string, unknown>;\n}\n\nexport type ServerToDaemonMessage =\n | DaemonMsg_AgentStart\n | DaemonMsg_AgentStop\n | DaemonMsg_AgentDeliver\n | DaemonMsg_AgentDeliverReply\n | DaemonMsg_ActivityProbe\n | DaemonMsg_WorkspaceList\n | DaemonMsg_WorkspaceRead\n | DaemonMsg_WorkspaceWrite\n | DaemonMsg_AgentSkillsList\n | DaemonMsg_AgentWorkspaceInit\n | DaemonMsg_FeishuTokenWrite\n | DaemonMsg_FeishuTokenClear\n | DaemonMsg_FeishuDelegationStart\n | DaemonMsg_FeishuDelegationStop\n | DaemonMsg_FeishuDelegationUpdate\n | DaemonMsg_RuntimeModelsDetect\n | DaemonMsg_MachineWorkspaceScan\n | DaemonMsg_MachineWorkspaceDelete\n | DaemonMsg_AgentResetWorkspace\n | DaemonMsg_AgentDiagnostic\n | DaemonMsg_ReminderUpsert\n | DaemonMsg_ReminderCancel\n | DaemonMsg_ReminderSnapshot\n | DaemonMsg_AgentRuntimeProfileMigration\n | DaemonMsg_AgentPermissionDecision\n | DaemonMsg_Ping;\n\nexport interface DaemonMsg_Ready {\n type: \"ready\";\n capabilities: string[];\n runtimes: RuntimeId[];\n runningAgents: string[];\n wakeableAgents?: Array<{ agentId: string; sessionId?: string; launchId?: string }>;\n hostname: string;\n name?: string;\n os: string;\n daemonVersion: string;\n}\n\nexport interface DaemonMsg_AgentStatus {\n type: \"agent:status\";\n agentId: string;\n status: \"active\" | \"inactive\";\n launchId?: string;\n}\n\nexport interface DaemonMsg_AgentActivity {\n type: \"agent:activity\";\n agentId: string;\n activity: AgentActivity;\n detail: string;\n entries?: ActivityEntry[];\n launchId?: string;\n clientSeq?: number;\n probeId?: string;\n pendingInboxCount?: number;\n}\n\nexport interface DaemonMsg_AgentAvailability {\n type: \"agent:availability\";\n agentId: string;\n daemonState: AgentDaemonState;\n sessionId?: string;\n launchId?: string;\n}\n\nexport interface DaemonMsg_AgentSession {\n type: \"agent:session\";\n agentId: string;\n sessionId: string;\n launchId?: string;\n}\n\nexport interface DaemonMsg_DeliverAck {\n type: \"agent:deliver:ack\";\n agentId: string;\n seq: number;\n deliveryId: string;\n accepted?: boolean;\n reason?: string;\n}\n\nexport interface DaemonMsg_WorkspaceFileTree {\n type: \"agent:workspace:file_tree\";\n agentId: string;\n requestId: string;\n entries: FileEntry[];\n missing?: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_WorkspaceFileContent {\n type: \"agent:workspace:file_content\";\n agentId: string;\n requestId: string;\n file: FileContent | null;\n error?: string;\n}\n\nexport interface DaemonMsg_WorkspaceWriteResult {\n type: \"agent:workspace:write_result\";\n agentId: string;\n requestId: string;\n path: string;\n ok: boolean;\n size?: number;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentSkillsListResult {\n type: \"agent:skills:list/result\";\n agentId: string;\n requestId: string;\n global: AgentSkillGroup[];\n workspace: AgentSkillGroup[];\n skills_flat?: Array<AgentSkillDescriptor & { source: \"agent\" | \"workspace\" }>;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentWorkspaceInitResult {\n type: \"agent:workspace:init/result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n workspacePath?: string;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuTokenWriteResult {\n type: \"feishu:token:write_result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n tokenPath?: string;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuTokenClearResult {\n type: \"feishu:token:clear_result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuDelegationResult {\n type: \"feishu:delegation:result\";\n requestId: string;\n delegationId: string;\n agentId?: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuWakeFailed {\n type: \"feishu:wake_failed\";\n delegationId: string;\n agentId: string;\n humanId: string;\n reason: string;\n timestamp: number;\n}\n\nexport interface DaemonMsg_RuntimeModelsResult {\n type: \"machine:runtime_models:result\";\n requestId: string;\n results: RuntimeModelDetectionResult[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceScanResult {\n type: \"machine:workspace:scan/result\";\n requestId: string;\n entries: MachineWorkspaceEntry[];\n error?: string;\n}\n\nexport interface DaemonMsg_MachineWorkspaceDeleteResult {\n type: \"machine:workspace:delete/result\";\n requestId: string;\n directoryName: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentResetWorkspaceResult {\n type: \"agent:reset-workspace/result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentDiagnosticResult {\n type: \"agent:diagnostic/result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n snapshot: AgentDiagnosticSnapshot;\n error?: string;\n}\n\nexport interface DaemonMsg_ReminderFireAttempt {\n type: \"reminder.fire_attempt\";\n reminderId: string;\n agentId: string;\n version: number;\n}\n\nexport interface DaemonMsg_ReminderSnapshotRequest {\n type: \"reminder.snapshot.request\";\n agentId: string;\n}\n\nexport interface DaemonMsg_Pong {\n type: \"pong\";\n}\n\nexport interface DaemonMsg_AgentRuntimeProfileMigrationAck {\n type: \"agent:runtime_profile:migration:ack\";\n agentId: string;\n migrationKey: string;\n}\n\nexport interface DaemonMsg_AgentPermissionRequest {\n type: \"agent:permission_request\";\n agentId: string;\n requestId: string;\n launchId?: string;\n kind: \"command\" | \"file_change\" | \"permission\" | \"session\" | \"unknown\";\n title: string;\n description: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type DaemonToServerMessage =\n | DaemonMsg_Ready\n | DaemonMsg_AgentStatus\n | DaemonMsg_AgentActivity\n | DaemonMsg_AgentAvailability\n | DaemonMsg_AgentSession\n | DaemonMsg_DeliverAck\n | DaemonMsg_WorkspaceFileTree\n | DaemonMsg_WorkspaceFileContent\n | DaemonMsg_WorkspaceWriteResult\n | DaemonMsg_AgentSkillsListResult\n | DaemonMsg_AgentWorkspaceInitResult\n | DaemonMsg_FeishuTokenWriteResult\n | DaemonMsg_FeishuTokenClearResult\n | DaemonMsg_FeishuDelegationResult\n | DaemonMsg_FeishuWakeFailed\n | DaemonMsg_RuntimeModelsResult\n | DaemonMsg_MachineWorkspaceScanResult\n | DaemonMsg_MachineWorkspaceDeleteResult\n | DaemonMsg_AgentResetWorkspaceResult\n | DaemonMsg_AgentDiagnosticResult\n | DaemonMsg_ReminderFireAttempt\n | DaemonMsg_ReminderSnapshotRequest\n | DaemonMsg_AgentRuntimeProfileMigrationAck\n | DaemonMsg_AgentPermissionRequest\n | DaemonMsg_Pong;\n\nexport interface WebEvent_ChannelMessage {\n type: \"channel:message\";\n message: Message;\n}\n\nexport interface WebEvent_ChannelTaskUpdate {\n type: \"channel:task_update\";\n task: Task;\n}\n\nexport interface WebEvent_AgentActivity {\n type: \"agent:activity\";\n agent_id: string;\n activity: AgentActivity;\n detail: string;\n entries?: ActivityEntry[];\n}\n\nexport interface WebEvent_AgentRunStarted {\n type: \"agent:run_started\";\n run: AgentRun;\n}\n\nexport interface WebEvent_AgentRunCompleted {\n type: \"agent:run_completed\";\n run: AgentRun;\n}\n\nexport interface WebEvent_RunEvent {\n type: \"run:event\";\n run_id: string;\n event: RunEvent;\n}\n\nexport interface WebEvent_MachineStatus {\n type: \"machine:status\";\n machine_id: string;\n status: \"online\" | \"offline\";\n}\n\nexport interface WebEvent_Warning {\n type: \"warning\";\n id: string;\n severity: \"info\" | \"warning\" | \"error\";\n title: string;\n description?: string;\n machine_id?: string;\n agent_id?: string;\n dismissible?: boolean;\n}\n\nexport interface WebEvent_InboxItems {\n type: \"inbox:items\";\n items: InboxItem[];\n}\n\nexport interface WebEvent_InboxItem {\n type: \"inbox:item\";\n item: InboxItem;\n}\n\nexport type ServerToWebEvent =\n | WebEvent_ChannelMessage\n | WebEvent_ChannelTaskUpdate\n | WebEvent_AgentActivity\n | WebEvent_AgentRunStarted\n | WebEvent_AgentRunCompleted\n | WebEvent_RunEvent\n | WebEvent_MachineStatus\n | WebEvent_InboxItems\n | WebEvent_InboxItem\n | WebEvent_Warning;\n\nexport function formatDeliveredMessage(msg: DeliveredMessage): string {\n const msgShort = msg.message_id.slice(0, 8);\n const attachSuffix = msg.attachments?.length\n ? ` [${msg.attachments.length} attachment: ${msg.attachments.map((a) => `${a.filename} (id:${a.id})`).join(\", \")} -- use wm attachment view to download]`\n : \"\";\n const taskSuffix = msg.task_status\n ? ` [task #${msg.task_number ?? \"?\"} status=${msg.task_status}]`\n : \"\";\n const body = `[target=${msg.target} msg=${msgShort} time=${msg.timestamp} type=${msg.sender_type}] @${msg.sender_name}: ${msg.content}${attachSuffix}${taskSuffix}`;\n if (!msg.thread_join_context) return body;\n const context = msg.thread_join_context;\n const parentShort = context.parent_message.message_id.slice(0, 8);\n const recent = context.recent_messages.length > 0\n ? context.recent_messages.map((item) => `- [msg=${item.message_id.slice(0, 8)} time=${item.timestamp} type=${item.sender_type}] @${item.sender_name}: ${item.content}`).join(\"\\n\")\n : \"- (no earlier thread replies)\";\n return [\n \"[System: You were added to a new thread via @mention. Read this context before replying.]\",\n `parent: ${context.parent_target}`,\n `thread: ${context.thread_target}`,\n `suggested next step: wm message read --channel \"${context.suggested_read_history_target}\"`,\n \"\",\n \"Parent message:\",\n `- [msg=${parentShort} time=${context.parent_message.timestamp} type=${context.parent_message.sender_type}] @${context.parent_message.sender_name}: ${context.parent_message.content}`,\n \"\",\n \"Recent thread context:\",\n recent,\n \"\",\n body,\n ].join(\"\\n\");\n}\n\nexport function makeId(prefix: string): string {\n return `${prefix}_${crypto.randomUUID().replace(/-/g, \"\")}`;\n}\n", "import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type {\n RuntimeId,\n RuntimeModelDescriptor,\n RuntimeModelDetectionResult,\n} from \"@claude-console/shared\";\nimport { JsonRpcStdioClient } from \"./json-rpc-stdio-client\";\n\nconst execFileAsync = promisify(execFile);\n\nconst DEFAULT_REASONING = [\"default\"];\nconst CODEX_REASONING = [\"low\", \"medium\", \"high\", \"xhigh\"];\n\nexport interface RuntimeModelDetectorOptions {\n codexModelsCachePath?: string;\n kimiConfigPath?: string;\n hermesConfigPath?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport class RuntimeModelDetector {\n constructor(private readonly options: RuntimeModelDetectorOptions = {}) {}\n\n async detectAll(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]> {\n return Promise.all(runtimes.map((runtime) => this.detect(runtime)));\n }\n\n async detect(runtime: RuntimeId): Promise<RuntimeModelDetectionResult> {\n try {\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n return fakeRuntimeModelResult(runtime);\n }\n if (runtime === \"codex\") {\n try {\n return parseCodexModelsCache(await readFile(this.codexModelsCachePath(), \"utf8\"));\n } catch {\n return staticRuntimeModelResult(runtime);\n }\n }\n if (runtime === \"claude\") {\n return staticRuntimeModelResult(runtime);\n }\n if (runtime === \"kimi\") {\n const configPath = this.options.kimiConfigPath || process.env.KIMI_CONFIG_PATH || path.join(os.homedir(), \".kimi\", \"config.toml\");\n const parsed = parseKimiModelConfig(await readFile(configPath, \"utf8\"));\n return {\n runtime,\n source: \"kimi-config\",\n selectable: parsed.models.length > 1,\n fixed: parsed.models.length <= 1,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n };\n }\n if (runtime === \"cursor\") {\n const { stdout, stderr } = await execFileAsync(\"cursor-agent\", [\"models\"], {\n timeout: 15000,\n cwd: os.homedir(),\n });\n const parsed = parseCursorModelsOutput(`${stdout}\\n${stderr}`);\n return {\n runtime,\n source: \"cursor-cli\",\n selectable: parsed.models.length > 0,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n };\n }\n if (runtime === \"hermes\") {\n const configPath = this.options.hermesConfigPath || process.env.HERMES_CONFIG_PATH || path.join(os.homedir(), \".hermes\", \"config.yaml\");\n const configText = await readFile(configPath, \"utf8\");\n const parsed = parseHermesModelConfig(configText);\n const providerModels = await detectHermesProviderModels(configText, this.options.fetchImpl ?? fetch);\n if (providerModels.models.length > 0) {\n return {\n runtime,\n source: \"hermes-provider-models\",\n selectable: providerModels.models.length > 1,\n fixed: providerModels.models.length <= 1,\n defaultModel: providerModels.defaultModel ?? parsed.defaultModel,\n models: providerModels.models,\n };\n }\n return {\n runtime,\n source: \"hermes-config\",\n selectable: parsed.models.length > 1,\n fixed: parsed.models.length <= 1,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n };\n }\n if (runtime === \"opencode\") {\n const { stdout, stderr } = await execFileAsync(\"opencode\", [\"models\"], {\n timeout: 15000,\n cwd: os.homedir(),\n });\n const parsed = parseCursorModelsOutput(`${stdout}\\n${stderr}`);\n return parsed.models.length > 0\n ? {\n runtime,\n source: \"opencode-cli\",\n selectable: true,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n }\n : {\n runtime,\n source: \"opencode-default\",\n selectable: false,\n fixed: true,\n models: [],\n };\n }\n const gemini = await detectGeminiAcpModels();\n return gemini.models.length > 0\n ? {\n runtime,\n source: \"gemini-cli\",\n selectable: true,\n fixed: false,\n defaultModel: gemini.defaultModel,\n models: gemini.models,\n }\n : {\n runtime,\n source: \"gemini-default\",\n selectable: false,\n fixed: true,\n models: [],\n };\n } catch (error) {\n if (runtime === \"cursor\") {\n const output = [\n typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n ].join(\"\\n\");\n const parsed = parseCursorModelsOutput(output);\n if (parsed.models.length > 0) {\n return {\n runtime,\n source: \"cursor-cli\",\n selectable: true,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n if (runtime === \"gemini\") {\n return {\n runtime,\n source: \"gemini-default\",\n selectable: false,\n fixed: true,\n models: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n if (runtime === \"opencode\") {\n const output = [\n typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n ].join(\"\\n\");\n const parsed = parseCursorModelsOutput(output);\n if (parsed.models.length > 0) {\n return {\n runtime,\n source: \"opencode-cli\",\n selectable: true,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n return {\n runtime,\n source: \"opencode-default\",\n selectable: false,\n fixed: true,\n models: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n return {\n runtime,\n source: \"error\",\n selectable: false,\n fixed: true,\n models: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private codexModelsCachePath(): string {\n return this.options.codexModelsCachePath ?? process.env.CODEX_MODELS_CACHE_PATH ?? path.join(os.homedir(), \".codex\", \"models_cache.json\");\n }\n}\n\nexport function parseKimiModelConfig(configText: string): {\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n} {\n const ids: string[] = [];\n let defaultModel: string | undefined;\n for (const rawLine of configText.split(/\\r?\\n/)) {\n const line = stripYamlComment(rawLine).trim();\n if (!line) continue;\n const model = line.match(/^(?:model|default_model)\\s*=\\s*[\"']?([^\"']+)[\"']?\\s*$/);\n if (model) {\n defaultModel = model[1]?.trim();\n pushUnique(ids, defaultModel);\n continue;\n }\n const array = line.match(/^(?:models|available_models)\\s*=\\s*\\[(.+)\\]\\s*$/);\n if (array) {\n for (const part of array[1]!.split(\",\")) pushUnique(ids, unquote(part.trim()));\n }\n }\n const models = ids.map((id) => ({\n ...defaultReasoningModel(id, id === defaultModel),\n default: id === defaultModel ? true : undefined,\n }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function staticRuntimeModelResult(runtime: \"codex\" | \"claude\"): RuntimeModelDetectionResult {\n if (runtime === \"codex\") {\n const models = [\n codexModel(\"gpt-5.5\", \"medium\", true),\n codexModel(\"gpt-5.4\", \"medium\"),\n codexModel(\"gpt-5.4-mini\", \"medium\"),\n codexModel(\"gpt-5.3-codex\", \"medium\"),\n codexModel(\"gpt-5.3-codex-spark\", \"high\"),\n codexModel(\"gpt-5.2\", \"medium\"),\n ];\n return {\n runtime,\n source: \"static\",\n selectable: true,\n fixed: false,\n defaultModel: \"gpt-5.5\",\n models,\n };\n }\n return {\n runtime,\n source: \"static\",\n selectable: true,\n fixed: false,\n defaultModel: \"sonnet\",\n models: [\n defaultReasoningModel(\"haiku\", false),\n { id: \"sonnet\", label: \"sonnet\", default: true, reasoningEfforts: [\"adaptive\", \"low\", \"medium\", \"high\", \"max\"], defaultReasoningEffort: \"adaptive\" },\n { id: \"opus\", label: \"opus\", reasoningEfforts: [\"adaptive\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], defaultReasoningEffort: \"adaptive\" },\n ],\n };\n}\n\nfunction fakeRuntimeModelResult(runtime: RuntimeId): RuntimeModelDetectionResult {\n if (runtime === \"codex\" || runtime === \"claude\") return staticRuntimeModelResult(runtime);\n if (runtime === \"kimi\") {\n return {\n runtime,\n source: \"kimi-config\",\n selectable: true,\n fixed: false,\n defaultModel: \"kimi-k2.6\",\n models: [\n defaultReasoningModel(\"kimi-k2.6\", true),\n defaultReasoningModel(\"kimi-k2.5\", false),\n ],\n };\n }\n if (runtime === \"cursor\") {\n return {\n runtime,\n source: \"cursor-cli\",\n selectable: true,\n fixed: false,\n defaultModel: \"composer-2-fast\",\n models: [\n defaultReasoningModel(\"composer-2-fast\", true),\n defaultReasoningModel(\"gpt-5.5-medium\", false),\n ],\n };\n }\n if (runtime === \"gemini\") {\n return {\n runtime,\n source: \"gemini-default\",\n selectable: false,\n fixed: true,\n defaultModel: \"default\",\n models: [{ ...defaultReasoningModel(\"default\", true), fixed: true }],\n };\n }\n if (runtime === \"opencode\") {\n return {\n runtime,\n source: \"opencode-default\",\n selectable: false,\n fixed: true,\n defaultModel: \"default\",\n models: [{ ...defaultReasoningModel(\"default\", true), fixed: true }],\n };\n }\n return {\n runtime,\n source: \"error\",\n selectable: false,\n fixed: true,\n models: [],\n error: \"legacy runtime is not part of fake runtime model fixture\",\n };\n}\n\nexport interface HermesProviderConfig {\n name?: string;\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n}\n\nexport function parseHermesProviderConfigs(configText: string): HermesProviderConfig[] {\n const providers: HermesProviderConfig[] = [];\n const lines = configText.split(/\\r?\\n/);\n let insideCustomProviders = false;\n let current: HermesProviderConfig | undefined;\n const flush = (): void => {\n if (current && (current.baseUrl || current.apiKey || current.model)) providers.push(current);\n current = undefined;\n };\n for (const line of lines) {\n const raw = stripYamlComment(line);\n if (!raw.trim()) continue;\n if (/^\\S/.test(raw) && !/^-/.test(raw)) {\n if (insideCustomProviders) flush();\n insideCustomProviders = /^custom_providers:\\s*$/.test(raw);\n continue;\n }\n if (!insideCustomProviders) continue;\n const item = raw.match(/^\\s*-\\s*(?:(name|base_url|api_key|model):\\s*(.+?)\\s*)?$/);\n if (item) {\n flush();\n current = {};\n if (item[1]) assignHermesProviderField(current, item[1], item[2]);\n continue;\n }\n const field = raw.match(/^\\s*(name|base_url|api_key|model):\\s*(.+?)\\s*$/);\n if (field) {\n current ??= {};\n assignHermesProviderField(current, field[1], field[2]);\n }\n }\n if (insideCustomProviders) flush();\n return providers;\n}\n\nexport async function detectHermesProviderModels(\n configText: string,\n fetchImpl: typeof fetch = fetch\n): Promise<{ models: RuntimeModelDescriptor[]; defaultModel?: string }> {\n const ids: string[] = [];\n let defaultModel: string | undefined;\n for (const provider of parseHermesProviderConfigs(configText)) {\n if (!provider.baseUrl || !provider.apiKey) continue;\n defaultModel ??= provider.model;\n pushUnique(ids, provider.model);\n const url = `${provider.baseUrl.replace(/\\/+$/, \"\")}/models`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n try {\n const response = await fetchImpl(url, {\n headers: { authorization: `Bearer ${provider.apiKey}` },\n signal: controller.signal,\n });\n if (!response.ok) continue;\n for (const id of parseOpenAIModelIds(await response.json())) pushUnique(ids, id);\n } catch {\n // Keep provider tokens private and fall back to the configured current model.\n } finally {\n clearTimeout(timeout);\n }\n }\n const models = ids.map((id) => ({\n ...defaultReasoningModel(id, defaultModel === id),\n default: defaultModel === id ? true : undefined,\n }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function parseOpenAIModelIds(value: unknown): string[] {\n const data = Array.isArray((value as { data?: unknown } | undefined)?.data)\n ? (value as { data: unknown[] }).data\n : Array.isArray(value)\n ? value\n : [];\n const ids: string[] = [];\n for (const item of data) {\n if (typeof item === \"string\") {\n pushUnique(ids, item);\n continue;\n }\n if (item && typeof item === \"object\") {\n pushUnique(ids, stringField(item as Record<string, unknown>, \"id\"));\n }\n }\n return ids;\n}\n\nfunction assignHermesProviderField(provider: HermesProviderConfig, key: string, rawValue: string | undefined): void {\n const value = rawValue ? unquote(rawValue) : \"\";\n if (!value) return;\n if (key === \"name\") provider.name = value;\n if (key === \"base_url\") provider.baseUrl = value;\n if (key === \"api_key\") provider.apiKey = value;\n if (key === \"model\") provider.model = value;\n}\n\nexport function parseCodexModelsCache(cacheText: string): RuntimeModelDetectionResult {\n const parsed = JSON.parse(cacheText) as unknown;\n const rawModels = Array.isArray(parsed)\n ? parsed\n : Array.isArray((parsed as { models?: unknown }).models)\n ? (parsed as { models: unknown[] }).models\n : [];\n const models = rawModels\n .map(parseCodexModel)\n .filter((model): model is RuntimeModelDescriptor => Boolean(model));\n if (models.length === 0) throw new Error(\"Codex model cache contains no models\");\n const defaultModel = models.find((model) => model.default)?.id ?? models[0]!.id;\n return {\n runtime: \"codex\",\n source: \"codex-cache\",\n selectable: true,\n fixed: false,\n defaultModel,\n models: normalizeDefault(models, defaultModel),\n };\n}\n\nexport function parseCursorModelsOutput(output: string): {\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n} {\n const models: RuntimeModelDescriptor[] = [];\n let defaultModel: string | undefined;\n for (const rawLine of output.split(/\\r?\\n/)) {\n const line = stripAnsi(rawLine).trim();\n if (!line || /^(available|models?|model\\s+id|name|loading|tip:)\\b/i.test(line)) continue;\n const markedDefault = /\\b(default|current)\\b/i.test(line);\n const cleaned = line\n .replace(/^[*\\-\\u2022\u2713\\s]+/, \"\")\n .replace(/\\((?:default|current)\\)/gi, \"\")\n .replace(/\\[(?:default|current)\\]/gi, \"\")\n .trim();\n const id = cleaned.split(/\\s+-\\s+|\\s+/)[0]?.trim();\n if (!id || id.includes(\":\") || /[\\u001b\\u009b]/.test(id)) continue;\n if (models.some((model) => model.id === id)) continue;\n models.push({ ...defaultReasoningModel(id, markedDefault && !defaultModel), default: markedDefault && !defaultModel ? true : undefined });\n if (markedDefault && !defaultModel) defaultModel = id;\n }\n if (!defaultModel && models[0]) {\n defaultModel = models[0].id;\n models[0] = { ...models[0], default: true };\n }\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(\n // eslint-disable-next-line no-control-regex\n /[\\u001b\\u009b][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))/g,\n \"\"\n );\n}\n\nexport function parseHermesModelConfig(configText: string): {\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n} {\n const ids: string[] = [];\n let defaultModel: string | undefined;\n const lines = configText.split(/\\r?\\n/);\n let insideCustomProviders = false;\n for (let index = 0; index < lines.length; index += 1) {\n const raw = stripYamlComment(lines[index] ?? \"\");\n if (/^\\S/.test(raw) && !/^-/.test(raw)) {\n insideCustomProviders = /^custom_providers:\\s*$/.test(raw);\n }\n\n const topModel = raw.match(/^model:\\s*(.+?)\\s*$/);\n if (topModel && unquote(topModel[1])) {\n defaultModel = unquote(topModel[1]);\n pushUnique(ids, defaultModel);\n continue;\n }\n\n const providerModel = raw.match(/^\\s+model:\\s*(.+?)\\s*$/);\n if (insideCustomProviders && providerModel && unquote(providerModel[1])) {\n const model = unquote(providerModel[1]);\n if (!defaultModel) defaultModel = model;\n pushUnique(ids, model);\n continue;\n }\n\n const inlineModels = raw.match(/^\\s*models:\\s*\\[(.+?)\\]\\s*$/);\n if (inlineModels) {\n for (const value of inlineModels[1].split(\",\")) pushUnique(ids, unquote(value));\n continue;\n }\n\n if (!/^\\s*models:\\s*$/.test(raw)) continue;\n const parentIndent = indentOf(raw);\n let childIndent: number | undefined;\n for (let next = index + 1; next < lines.length; next += 1) {\n const nested = stripYamlComment(lines[next] ?? \"\");\n if (!nested.trim()) continue;\n if (indentOf(nested) <= parentIndent) break;\n childIndent ??= indentOf(nested);\n if (indentOf(nested) !== childIndent) continue;\n const item = nested.match(/^\\s*-\\s*(.+?)\\s*$/);\n const named = nested.match(/^\\s*(?:name|id):\\s*(.+?)\\s*$/);\n const mapped = nested.match(/^\\s*([A-Za-z0-9._:/+-]+):(?:\\s|$)/);\n if (item) {\n const value = item[1].match(/^(?:name|id):\\s*(.+?)\\s*$/)?.[1] ?? item[1];\n pushUnique(ids, unquote(value));\n } else if (named) {\n pushUnique(ids, unquote(named[1]));\n } else if (mapped) {\n pushUnique(ids, unquote(mapped[1]));\n }\n }\n }\n\n const models = ids.map((id) => ({\n ...defaultReasoningModel(id, defaultModel === id),\n default: defaultModel === id ? true : undefined,\n }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nasync function detectGeminiAcpModels(): Promise<{\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n}> {\n const client = new JsonRpcStdioClient({\n command: \"gemini\",\n args: [\"--acp\", \"--skip-trust\"],\n onNotification: () => undefined,\n onStderr: () => undefined,\n });\n try {\n client.start();\n const result = await withTimeout(\n client.request(\"initialize\", {\n protocolVersion: 1,\n clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" },\n capabilities: {},\n }),\n 5000,\n \"Gemini ACP model inspect timeout\"\n );\n const ids = collectModelIds(result);\n const defaultModel = collectDefaultModel(result, ids);\n const models = ids.map((id) => ({ ...defaultReasoningModel(id, id === defaultModel), default: id === defaultModel ? true : undefined }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n } finally {\n client.destroy();\n }\n}\n\nfunction collectModelIds(value: unknown): string[] {\n const ids: string[] = [];\n const visit = (node: unknown, insideModels = false): void => {\n if (typeof node === \"string\") {\n if (insideModels) pushUnique(ids, node);\n return;\n }\n if (Array.isArray(node)) {\n for (const item of node) visit(item, insideModels);\n return;\n }\n if (!node || typeof node !== \"object\") return;\n for (const [childKey, childValue] of Object.entries(node)) {\n if (/models?/i.test(childKey)) {\n visit(childValue, true);\n } else if (insideModels && /^(id|name|model)$/i.test(childKey)) {\n visit(childValue, true);\n } else {\n visit(childValue, false);\n }\n }\n };\n visit(value);\n return ids.filter((id) => /^[a-z0-9][a-z0-9._:/+-]*$/i.test(id));\n}\n\nfunction collectDefaultModel(value: unknown, ids: string[]): string | undefined {\n const json = JSON.stringify(value);\n for (const id of ids) {\n if (new RegExp(`\"${escapeRegExp(id)}\"[^}]*\"default\"\\\\s*:\\\\s*true`, \"i\").test(json)) return id;\n }\n return ids[0];\n}\n\nfunction normalizeDefault(models: RuntimeModelDescriptor[], defaultModel?: string): RuntimeModelDescriptor[] {\n return models.map((model) => ({\n ...model,\n default: defaultModel ? model.id === defaultModel : model.default,\n }));\n}\n\nfunction codexModel(id: string, defaultReasoningEffort: string, isDefault = false): RuntimeModelDescriptor {\n return {\n id,\n label: id,\n default: isDefault ? true : undefined,\n reasoningEfforts: CODEX_REASONING,\n defaultReasoningEffort,\n };\n}\n\nfunction defaultReasoningModel(id: string, isDefault = false): RuntimeModelDescriptor {\n return {\n id,\n label: id,\n default: isDefault ? true : undefined,\n reasoningEfforts: DEFAULT_REASONING,\n defaultReasoningEffort: \"default\",\n };\n}\n\nfunction parseCodexModel(value: unknown): RuntimeModelDescriptor | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const record = value as Record<string, unknown>;\n const id = stringField(record, \"id\") ?? stringField(record, \"slug\") ?? stringField(record, \"name\") ?? stringField(record, \"model\");\n if (!id) return undefined;\n const reasoningEfforts = parseReasoningEfforts(record.supported_reasoning_levels);\n const defaultReasoningEffort = stringField(record, \"default_reasoning_level\");\n const effectiveEfforts = reasoningEfforts.length > 0 ? reasoningEfforts : CODEX_REASONING;\n return {\n id,\n label: stringField(record, \"display_name\") ?? stringField(record, \"displayName\") ?? id,\n default: record.default === true ? true : undefined,\n reasoningEfforts: effectiveEfforts,\n defaultReasoningEffort: defaultReasoningEffort && effectiveEfforts.includes(defaultReasoningEffort)\n ? defaultReasoningEffort\n : effectiveEfforts[0],\n };\n}\n\nfunction parseReasoningEfforts(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const efforts: string[] = [];\n for (const item of value) {\n const effort = typeof item === \"string\"\n ? item\n : item && typeof item === \"object\"\n ? stringField(item as Record<string, unknown>, \"effort\") ?? stringField(item as Record<string, unknown>, \"id\") ?? stringField(item as Record<string, unknown>, \"name\")\n : undefined;\n pushUnique(efforts, effort);\n }\n return efforts;\n}\n\nfunction stringField(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction pushUnique(values: string[], value: string | undefined): void {\n const trimmed = value?.trim();\n if (!trimmed || values.includes(trimmed)) return;\n values.push(trimmed);\n}\n\nfunction stripYamlComment(value: string): string {\n return value.replace(/\\s+#.*$/, \"\");\n}\n\nfunction indentOf(value: string): number {\n return value.length - value.trimStart().length;\n}\n\nfunction unquote(value: string): string {\n return value.trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(message)), ms);\n promise.then(resolve, reject).finally(() => clearTimeout(timer));\n });\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n", "import type { Reminder } from \"@claude-console/shared\";\n\ntype ReminderJob = { reminderId: string; ownerAgentId: string; version: number };\n\nexport class ReminderCache {\n private readonly timers = new Map<string, NodeJS.Timeout>();\n private handler: (job: ReminderJob) => void = () => {};\n\n upsert(reminder: Reminder): void {\n this.cancelTimer(reminder.id);\n if (reminder.status !== \"scheduled\") return;\n const delay = Math.max(0, Date.parse(reminder.fire_at) - Date.now());\n const timer = setTimeout(() => {\n this.timers.delete(reminder.id);\n this.handler({ reminderId: reminder.id, ownerAgentId: reminder.agent_id, version: reminder.version });\n }, delay);\n this.timers.set(reminder.id, timer);\n }\n\n cancel(reminderId: string): void {\n this.cancelTimer(reminderId);\n }\n\n snapshot(agentId: string, reminders: Reminder[]): void {\n for (const [id] of this.timers) {\n if (id.startsWith(`${agentId}:`)) this.cancelTimer(id);\n }\n for (const reminder of reminders) this.upsert(reminder);\n }\n\n onFire(handler: (job: ReminderJob) => void): void {\n this.handler = handler;\n }\n\n clear(): void {\n for (const id of this.timers.keys()) this.cancelTimer(id);\n }\n\n private cancelTimer(id: string): void {\n const timer = this.timers.get(id);\n if (timer) clearTimeout(timer);\n this.timers.delete(id);\n }\n}\n", "import { chmod, mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nexport interface FeishuTokenWriterInput {\n workspaceDir: string;\n token: string;\n}\n\nexport interface LarkCliWrapperInput {\n workspaceDir: string;\n appId: string;\n brand?: \"feishu\" | \"lark\";\n}\n\nexport interface FeishuTokenPathInput {\n workspaceDir: string;\n}\n\nconst requireFromHere = createRequire(__filename);\n\nexport function feishuTokenPath(workspaceDir: string): string {\n return path.join(workspaceDir, \".wm\", \"feishu\", \"token\");\n}\n\nexport function larkCliWrapperPath(workspaceDir: string): string {\n return path.join(workspaceDir, \".wm\", \"lark-cli\");\n}\n\nexport async function writeFeishuToken(input: FeishuTokenWriterInput): Promise<string> {\n const tokenPath = feishuTokenPath(input.workspaceDir);\n const dir = path.dirname(tokenPath);\n await mkdir(dir, { recursive: true, mode: 0o700 });\n const tempPath = path.join(dir, `.token.${process.pid}.${Date.now()}.tmp`);\n await writeFile(tempPath, input.token, { encoding: \"utf8\", mode: 0o600 });\n await chmod(tempPath, 0o600);\n await rename(tempPath, tokenPath);\n await chmod(tokenPath, 0o600);\n return tokenPath;\n}\n\nexport async function writeLarkCliWrapper(input: LarkCliWrapperInput): Promise<string> {\n const wrapperPath = larkCliWrapperPath(input.workspaceDir);\n await mkdir(path.dirname(wrapperPath), { recursive: true });\n await writeFile(wrapperPath, buildLarkCliWrapper(input), { encoding: \"utf8\", mode: 0o755 });\n await chmod(wrapperPath, 0o755);\n return wrapperPath;\n}\n\nexport async function clearFeishuToken(input: FeishuTokenPathInput): Promise<void> {\n await rm(feishuTokenPath(input.workspaceDir), { force: true });\n}\n\nfunction buildLarkCliWrapper(input: LarkCliWrapperInput): string {\n const runner = resolveLarkCliRunner();\n return [\n \"#!/usr/bin/env bash\",\n \"set -euo pipefail\",\n 'SELF_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"',\n 'TOKEN_FILE=\"${SELF_DIR}/feishu/token\"',\n 'if [[ ! -s \"$TOKEN_FILE\" ]]; then',\n ' echo \"Feishu token unavailable\" >&2',\n \" exit 2\",\n \"fi\",\n `export LARKSUITE_CLI_APP_ID=${shellQuote(input.appId)}`,\n 'export LARKSUITE_CLI_USER_ACCESS_TOKEN=\"$(cat \"$TOKEN_FILE\")\"',\n \"export LARKSUITE_CLI_DEFAULT_AS=user\",\n \"export LARKSUITE_CLI_STRICT_MODE=user\",\n `export LARKSUITE_CLI_BRAND=${shellQuote(input.brand ?? \"feishu\")}`,\n runner\n ? `exec ${shellQuote(process.execPath)} ${shellQuote(runner)} \"$@\"`\n : 'exec lark-cli \"$@\"',\n \"\",\n ].join(\"\\n\");\n}\n\nfunction resolveLarkCliRunner(): string | undefined {\n try {\n return requireFromHere.resolve(\"@larksuite/cli/scripts/run.js\");\n } catch {\n return undefined;\n }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n", "import type { ActivityEntry } from \"@claude-console/shared\";\nimport type { RuntimeEvent } from \"../runtime/adapter\";\n\nexport class ActivityTracker {\n private clientSeq = 0;\n\n toEntries(events: RuntimeEvent[]): ActivityEntry[] {\n return events.flatMap((event) => this.toEntry(event));\n }\n\n nextSeq(): number {\n this.clientSeq += 1;\n return this.clientSeq;\n }\n\n private toEntry(event: RuntimeEvent): ActivityEntry[] {\n const timestamp = Date.now();\n if (event.type.includes(\"tool\")) {\n return [{\n kind: event.type.includes(\"end\") || event.type.includes(\"result\") ? \"tool_end\" : \"tool_start\",\n tool_name: String((event.data as { name?: unknown } | undefined)?.name ?? \"tool\"),\n tool_input: typeof event.data === \"object\" && event.data ? event.data as Record<string, unknown> : undefined,\n text: event.content,\n timestamp,\n }];\n }\n if (event.type.includes(\"thinking\") || event.type.includes(\"thought\")) {\n return [{ kind: \"thinking\", text: event.content ?? JSON.stringify(event.data ?? \"\"), timestamp }];\n }\n if (event.type.includes(\"error\")) {\n return [{ kind: \"error\", text: event.content ?? JSON.stringify(event.data ?? \"\"), is_error: true, timestamp }];\n }\n if (event.content) return [{ kind: \"text\", text: event.content, timestamp }];\n return [{ kind: \"status\", text: event.type, timestamp }];\n }\n}\n", "import { mkdir, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileContent, FileEntry } from \"@claude-console/shared\";\n\ntype WorkspaceBrowserOptions =\n | ((agentId: string) => string | undefined)\n | {\n rootDir: string;\n workspaceDirectoryForAgent: (agentId: string, serverNamespace?: string, machineId?: string) => string | undefined;\n };\n\nexport class WorkspaceBrowser {\n constructor(private readonly options: WorkspaceBrowserOptions) {}\n\n async listFiles(agentId: string, dirPath = \".\", serverNamespace?: string, machineId?: string): Promise<FileEntry[]> {\n const base = this.requireBase(agentId, serverNamespace, machineId);\n const dir = this.resolveInside(base, dirPath);\n const entries = await readdir(dir, { withFileTypes: true }).catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n });\n const result: FileEntry[] = [];\n for (const entry of entries) {\n if (dirPath === \".\" && entry.name === \".wm\") continue;\n const fullPath = path.join(dir, entry.name);\n const info = await stat(fullPath);\n result.push({\n name: entry.name,\n path: path.relative(base, fullPath) || \".\",\n type: entry.isDirectory() ? \"directory\" : \"file\",\n size: info.size,\n modified_at: info.mtimeMs,\n });\n }\n return result.sort((a, b) => a.type.localeCompare(b.type) || a.name.localeCompare(b.name));\n }\n\n async readFile(agentId: string, filePath: string, serverNamespace?: string, machineId?: string): Promise<FileContent> {\n const base = this.requireBase(agentId, serverNamespace, machineId);\n const fullPath = this.resolveInside(base, filePath);\n const info = await stat(fullPath);\n if (info.size > 1024 * 1024) {\n return { path: filePath, content: null, binary: true, size: info.size };\n }\n const buffer = await readFile(fullPath);\n const ext = path.extname(fullPath).toLowerCase();\n const image = [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"].includes(ext);\n if (image || buffer.includes(0)) {\n return {\n path: filePath,\n content: buffer.toString(\"base64\"),\n binary: true,\n size: info.size,\n mime_type: image ? `image/${ext.slice(1).replace(\"jpg\", \"jpeg\")}` : \"application/octet-stream\",\n encoding: \"base64\",\n };\n }\n return { path: filePath, content: buffer.toString(\"utf8\"), binary: false, size: info.size, encoding: \"utf8\" };\n }\n\n async writeFile(agentId: string, filePath: string, content: string, serverNamespace?: string, machineId?: string): Promise<{ ok: true; path: string; size: number }> {\n const base = this.requireBase(agentId, serverNamespace, machineId);\n const fullPath = this.resolveInside(base, filePath);\n await mkdir(path.dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf8\");\n return { ok: true, path: path.relative(base, fullPath) || \".\", size: Buffer.byteLength(content, \"utf8\") };\n }\n\n private requireBase(agentId: string, serverNamespace?: string, machineId?: string): string {\n const base = this.rootDirForAgent(agentId, serverNamespace, machineId);\n if (!base) throw new Error(`Unknown agent workspace: ${agentId}`);\n return path.resolve(base);\n }\n\n private rootDirForAgent(agentId: string, serverNamespace?: string, machineId?: string): string | undefined {\n if (typeof this.options === \"function\") return this.options(agentId);\n return this.options.workspaceDirectoryForAgent(agentId, serverNamespace, machineId);\n }\n\n private resolveInside(base: string, relativePath: string): string {\n const resolved = path.resolve(base, relativePath);\n if (resolved !== base && !resolved.startsWith(`${base}${path.sep}`)) {\n throw new Error(\"path escapes workspace\");\n }\n return resolved;\n }\n}\n\nexport function isSafeWorkspaceDirectoryName(directoryName: string): boolean {\n return Boolean(\n directoryName &&\n directoryName !== \".\" &&\n directoryName !== \"..\" &&\n !directoryName.includes(\"/\") &&\n !directoryName.includes(\"\\\\\") &&\n !directoryName.includes(\"..\")\n );\n}\n\nexport function displayNameToWorkspaceDirectoryName(displayName: string, fallback = \"machine\"): string {\n const cleaned = displayName\n .trim()\n .normalize(\"NFKC\")\n .replace(/[\\/\\\\:]+/g, \"-\")\n .replace(/\\s+/g, \"-\")\n .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[.-]+|[.-]+$/g, \"\")\n .slice(0, 80);\n return cleaned || fallback;\n}\n\nexport function namedWorkspaceDirectoryName(displayName: string, id: string, fallback = \"item\"): string {\n const namePart = displayNameToWorkspaceDirectoryName(displayName, fallback);\n const idPart = workspaceDirectoryIdPart(namePart, id);\n return `${namePart}-${idPart}`;\n}\n\nexport function workspaceDirectoryIdPart(namePart: string, id: string): string {\n let idPart = displayNameToWorkspaceDirectoryName(id, \"id\");\n if (idPart.startsWith(`${namePart}-`)) idPart = idPart.slice(namePart.length + 1);\n idPart = idPart.replace(/^(machine|agent|org)[_-]/, \"\");\n return idPart || displayNameToWorkspaceDirectoryName(id, \"id\");\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport os from \"node:os\";\nimport { doctorRuntimes } from \"./runtime/doctor\";\nimport {\n isSupportedRuntimeId,\n listRuntimeCapabilities,\n supportedRuntimeIds,\n type RuntimeId,\n} from \"./runtime/capabilities\";\nimport { runSmokeMatrix, smokeMatrixHasFailures } from \"./testing/run-smoke\";\nimport { runInteractiveLab } from \"./lab/interactive-lab\";\nimport { ServerConnection } from \"./connection/server-connection\";\nimport { AgentProcessManager } from \"./agent-manager/agent-process-manager\";\nimport { RuntimeModelDetector } from \"./runtime/model-detector\";\nimport packageJson from \"../package.json\";\n\nexport interface CliIo {\n stdout(line: string): void;\n stderr(line: string): void;\n}\n\nexport async function runCli(argv: string[], io: CliIo = defaultIo): Promise<number> {\n const [command] = argv;\n\n if (!command || command === \"--help\" || command === \"help\") {\n io.stdout(buildHelp());\n return 0;\n }\n\n if (command === \"runtimes\") {\n io.stdout(JSON.stringify(listRuntimeCapabilities(), null, 2));\n return 0;\n }\n\n if (command === \"models\") {\n const detector = new RuntimeModelDetector();\n io.stdout(JSON.stringify(await detector.detectAll(parseRuntimeArgs(argv)), null, 2));\n return 0;\n }\n\n if (command === \"doctor\") {\n io.stdout(JSON.stringify(await doctorRuntimes(parseRuntimeArgs(argv)), null, 2));\n return 0;\n }\n\n if (command === \"smoke\") {\n const options = parseSmokeArgs(argv);\n const summaries = await runSmokeMatrix(options);\n io.stdout(JSON.stringify(summaries, null, 2));\n return smokeMatrixHasFailures(summaries) ? 1 : 0;\n }\n\n if (command === \"lab\") {\n await runInteractiveLab({\n rootDir: valueAfter(argv, \"--root\"),\n serverNamespace: valueAfter(argv, \"--server\"),\n timeoutMs: numberAfter(argv, \"--timeout-ms\"),\n });\n return 0;\n }\n\n if (command === \"start\") {\n const serverUrl = valueAfter(argv, \"--server-url\");\n const apiKey = valueAfter(argv, \"--api-key\");\n const spaceId = valueAfter(argv, \"--space-id\");\n const name = valueAfter(argv, \"--name\");\n if (!serverUrl || !apiKey) {\n io.stderr(\"wm-daemon start requires --server-url and --api-key\");\n return 2;\n }\n const rootDir = valueAfter(argv, \"--root\") ?? `${process.env.HOME ?? \".\"}/.wm`;\n await runDaemon({ serverUrl, apiKey, spaceId, name, rootDir, io });\n return 0;\n }\n\n io.stderr(`Unknown command: ${command}`);\n io.stderr(buildHelp());\n return 2;\n}\n\nconst defaultIo: CliIo = {\n stdout: (line) => {\n console.log(line);\n },\n stderr: (line) => {\n console.error(line);\n },\n};\n\nfunction buildHelp(): string {\n return [\n \"wm-daemon\",\n \"\",\n \"Commands:\",\n \" runtimes Print v1 runtime adapter capability declarations as JSON.\",\n \" models Detect runtime model and reasoning-effort declarations as JSON.\",\n \" doctor Detect local runtime binaries and versions.\",\n \" smoke Run adapter smoke tests against local runtimes.\",\n \" lab Open the interactive local daemon test lab.\",\n \" start Connect this daemon to a Workspace Server.\",\n \" help Print this help text.\",\n \"\",\n \"Lab is local-only and clears its selected server namespace before starting.\",\n ].join(\"\\n\");\n}\n\nasync function runDaemon(input: {\n serverUrl: string;\n apiKey: string;\n spaceId?: string;\n name?: string;\n rootDir: string;\n io: CliIo;\n}): Promise<void> {\n const log = (line: string) => input.io.stdout(`${new Date().toISOString()} [wm-daemon] ${line}`);\n let connection: ServerConnection;\n const manager = new AgentProcessManager({\n rootDir: input.rootDir,\n machineDisplayName: input.name?.trim() || os.hostname() || \"machine\",\n sendToServer: (msg) => connection.send(msg),\n log,\n });\n connection = new ServerConnection({\n serverUrl: input.serverUrl,\n apiKey: input.apiKey,\n spaceId: input.spaceId,\n name: input.name,\n daemonVersion: packageJson.version,\n runningAgentsProvider: () => manager.getRunningAgentIds(),\n wakeableAgentsProvider: () => manager.getWakeableAgents(),\n log,\n });\n connection.onMessage((message) => {\n manager.handle(message).catch((error) => {\n const messageText = error instanceof Error ? error.stack ?? error.message : String(error);\n input.io.stderr(`${new Date().toISOString()} [wm-daemon] [error] ${messageText}`);\n });\n });\n connection.connect();\n log(`started server=${input.serverUrl} root=${input.rootDir}`);\n const keepAlive = setInterval(() => {\n const running = manager.getRunningAgentIds();\n log(`heartbeat socket=${connection.connected ? \"open\" : \"closed\"} running_agents=${running.length ? running.join(\",\") : \"-\"}`);\n }, 30_000);\n await new Promise<void>((resolve) => {\n process.once(\"SIGINT\", resolve);\n process.once(\"SIGTERM\", resolve);\n });\n clearInterval(keepAlive);\n log(\"stopping\");\n connection.disconnect();\n}\n\nfunction parseRuntimeArgs(argv: string[]): RuntimeId[] {\n const runtime = valueAfter(argv, \"--runtime\");\n if (!runtime || runtime === \"all\") return supportedRuntimeIds;\n if (!isSupportedRuntimeId(runtime)) {\n throw new Error(`Unsupported runtime: ${runtime}`);\n }\n return [runtime];\n}\n\nfunction parseSmokeArgs(argv: string[]): {\n runtimes: RuntimeId[];\n rootDir?: string;\n timeoutMs?: number;\n keepArtifacts?: boolean;\n} {\n return {\n runtimes: parseRuntimeArgs(argv),\n rootDir: valueAfter(argv, \"--root\"),\n timeoutMs: numberAfter(argv, \"--timeout-ms\"),\n keepArtifacts: argv.includes(\"--keep-artifacts\"),\n };\n}\n\nfunction valueAfter(argv: string[], name: string): string | undefined {\n const index = argv.indexOf(name);\n if (index === -1) return undefined;\n return argv[index + 1];\n}\n\nfunction numberAfter(argv: string[], name: string): number | undefined {\n const value = valueAfter(argv, name);\n if (!value) return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) throw new Error(`Invalid number for ${name}: ${value}`);\n return parsed;\n}\n\nif (require.main === module) {\n runCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n });\n}\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandSpec {\n command: string;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n onStdoutChunk?: (chunk: string) => void;\n onStderrChunk?: (chunk: string) => void;\n}\n\nexport interface CommandResult {\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n}\n\nexport type CommandRunner = (spec: CommandSpec) => Promise<CommandResult>;\n\nexport const runCommand: CommandRunner = (spec) => {\n return new Promise((resolve, reject) => {\n const child = spawn(spec.command, spec.args, {\n cwd: spec.cwd,\n env: spec.env ?? process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n let timer: NodeJS.Timeout | undefined;\n\n if (spec.timeoutMs && spec.timeoutMs > 0) {\n timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 1000).unref();\n }, spec.timeoutMs);\n timer.unref();\n }\n\n child.stdout.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout += text;\n spec.onStdoutChunk?.(text);\n });\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n spec.onStderrChunk?.(text);\n });\n child.on(\"error\", (error) => {\n if (timer) clearTimeout(timer);\n if (settled) return;\n settled = true;\n reject(error);\n });\n child.on(\"close\", (exitCode, signal) => {\n if (timer) clearTimeout(timer);\n if (settled) return;\n settled = true;\n resolve({\n exitCode,\n signal,\n stdout,\n stderr,\n timedOut,\n });\n });\n });\n};\n", "export type RuntimeId = \"codex\" | \"claude\" | \"kimi\" | \"gemini\" | \"cursor\" | \"hermes\" | \"opencode\";\n\nexport type RuntimeAdapterKind =\n | \"app_server_session\"\n | \"acp_session\"\n | \"cli_stream_session\"\n | \"cli_print_session\"\n | \"wire_session\"\n | \"sdk_session\";\n\nexport type RuntimeTransport =\n | \"json_rpc_stdio\"\n | \"stream_json_stdio\"\n | \"wire_stdio\"\n | \"sdk\";\n\nexport type RuntimeLifecycle = \"persistent\" | \"semi_persistent\" | \"per_turn\";\n\nexport type RuntimePromptInjection =\n | \"developer_instructions\"\n | \"system_prompt_file\"\n | \"startup_message\";\n\nexport type RuntimeSessionRecovery =\n | \"native_resume\"\n | \"daemon_handoff_only\"\n | \"none\";\n\nexport type RuntimeEventStream = \"structured\" | \"text_stream\" | \"final_only\";\n\nexport interface RuntimeCapability {\n runtime: RuntimeId;\n adapterKind: RuntimeAdapterKind;\n transport: RuntimeTransport;\n lifecycle: RuntimeLifecycle;\n promptInjection: RuntimePromptInjection;\n sessionRecovery: RuntimeSessionRecovery;\n eventStream: RuntimeEventStream;\n supportsSteering: boolean;\n supportsInterrupt: boolean;\n supportsPermissionEvents: boolean;\n supportsWorkingDirectory: boolean;\n notes: string;\n}\n\nexport const supportedRuntimeIds: RuntimeId[] = [\n \"cursor\",\n \"claude\",\n \"codex\",\n \"gemini\",\n \"kimi\",\n \"hermes\",\n \"opencode\",\n];\n\nconst capabilities: Record<RuntimeId, RuntimeCapability> = {\n codex: {\n runtime: \"codex\",\n adapterKind: \"app_server_session\",\n transport: \"json_rpc_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"developer_instructions\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: true,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `codex app-server --listen stdio://`. developerInstructions in thread/start.\",\n },\n claude: {\n runtime: \"claude\",\n adapterKind: \"cli_stream_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"system_prompt_file\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: true,\n supportsWorkingDirectory: true,\n notes: \"Uses Claude Code stream-json stdin/stdout. Busy delivery is queued until turn boundary in v1.\",\n },\n kimi: {\n runtime: \"kimi\",\n adapterKind: \"wire_session\",\n transport: \"wire_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"system_prompt_file\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes: \"Uses `kimi --wire --yolo` with a daemon-generated agent file and session id.\",\n },\n gemini: {\n runtime: \"gemini\",\n adapterKind: \"cli_print_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"per_turn\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: false,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `gemini --output-format stream-json --yolo` per turn with native resume.\",\n },\n cursor: {\n runtime: \"cursor\",\n adapterKind: \"cli_print_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"per_turn\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: false,\n supportsInterrupt: true,\n supportsPermissionEvents: true,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `cursor-agent --print --output-format stream-json` per turn with native resume.\",\n },\n hermes: {\n runtime: \"hermes\",\n adapterKind: \"acp_session\",\n transport: \"json_rpc_stdio\",\n lifecycle: \"persistent\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes: \"Uses `hermes acp`. Has steer command. Python startup ~5s.\",\n },\n opencode: {\n runtime: \"opencode\",\n adapterKind: \"cli_print_session\",\n transport: \"stream_json_stdio\",\n lifecycle: \"per_turn\",\n promptInjection: \"startup_message\",\n sessionRecovery: \"native_resume\",\n eventStream: \"structured\",\n supportsSteering: true,\n supportsInterrupt: true,\n supportsPermissionEvents: false,\n supportsWorkingDirectory: true,\n notes:\n \"Uses `opencode` stdio/ACP-compatible session mode when configured. Provider models may be unavailable until OpenCode auth/provider setup is complete.\",\n },\n};\n\nexport function listRuntimeCapabilities(): RuntimeCapability[] {\n return supportedRuntimeIds.map((runtime) => capabilities[runtime]);\n}\n\nexport function getRuntimeCapability(\n runtime: string\n): RuntimeCapability | undefined {\n if (!isSupportedRuntimeId(runtime)) {\n return undefined;\n }\n\n return capabilities[runtime];\n}\n\nexport function isSupportedRuntimeId(runtime: string): runtime is RuntimeId {\n return supportedRuntimeIds.includes(runtime as RuntimeId);\n}\n", "import type { CommandRunner } from \"../process/command\";\nimport { runCommand } from \"../process/command\";\nimport { getRuntimeCapability, supportedRuntimeIds, type RuntimeId } from \"./capabilities\";\n\nexport interface RuntimeDoctorResult {\n runtime: RuntimeId;\n detected: boolean;\n status: \"available\" | \"not_installed\" | \"unknown\";\n version?: string;\n capability: ReturnType<typeof getRuntimeCapability>;\n errorMessage?: string;\n}\n\nconst versionArgs: Record<RuntimeId, string[]> = {\n codex: [\"--version\"],\n claude: [\"--version\"],\n kimi: [\"--version\"],\n gemini: [\"--version\"],\n cursor: [\"--version\"],\n hermes: [\"--version\"],\n opencode: [\"--version\"],\n};\n\nconst commands: Record<RuntimeId, string> = {\n codex: \"codex\",\n claude: \"claude\",\n kimi: \"kimi\",\n gemini: \"gemini\",\n cursor: \"cursor-agent\",\n hermes: \"hermes\",\n opencode: \"opencode\",\n};\n\nexport async function doctorRuntimes(\n runtimes: RuntimeId[] = supportedRuntimeIds,\n runner: CommandRunner = runCommand\n): Promise<RuntimeDoctorResult[]> {\n const results: RuntimeDoctorResult[] = [];\n for (const runtime of runtimes) {\n try {\n const result = await runner({\n command: commands[runtime],\n args: versionArgs[runtime],\n timeoutMs: 10000,\n });\n const version = `${result.stdout}\\n${result.stderr}`.trim().split(/\\r?\\n/)[0];\n results.push({\n runtime,\n detected: result.exitCode === 0,\n status: result.exitCode === 0 ? \"available\" : \"unknown\",\n version: version || undefined,\n capability: getRuntimeCapability(runtime),\n errorMessage: result.exitCode === 0 ? undefined : `${result.stderr}\\n${result.stdout}`.trim(),\n });\n } catch (error) {\n results.push({\n runtime,\n detected: false,\n status: \"not_installed\",\n capability: getRuntimeCapability(runtime),\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return results;\n}\n", "import { mkdtemp, rm } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeRunStatus } from \"../runtime/adapter\";\nimport { supportedRuntimeIds, type RuntimeId } from \"../runtime/capabilities\";\nimport { createRuntimeAdapter } from \"../runtime/registry\";\nimport { runAdapterSmokeTest } from \"./smoke-harness\";\n\nexport interface RuntimeSmokeSummary {\n runtime: RuntimeId;\n status: RuntimeRunStatus;\n agentDir?: string;\n runtimeSessionId?: string;\n finalMessage?: string;\n eventTypes: string[];\n errorMessage?: string;\n}\n\nexport interface RunSmokeMatrixInput {\n runtimes?: RuntimeId[];\n rootDir?: string;\n timeoutMs?: number;\n keepArtifacts?: boolean;\n}\n\nexport async function runSmokeMatrix(\n input: RunSmokeMatrixInput = {}\n): Promise<RuntimeSmokeSummary[]> {\n const rootDir =\n input.rootDir ?? (await mkdtemp(path.join(os.tmpdir(), \"wm-daemon-smoke-\")));\n const summaries: RuntimeSmokeSummary[] = [];\n\n try {\n for (const runtime of input.runtimes ?? supportedRuntimeIds) {\n const adapter = createRuntimeAdapter(runtime);\n try {\n const result = await runAdapterSmokeTest({\n rootDir,\n serverNamespace: \"test-server\",\n serverId: \"test-server\",\n daemonId: \"test-daemon\",\n agentId: `test-${runtime}-agent`,\n agentName: `test-${runtime}`,\n runtime,\n role: \"wm-daemon adapter smoke test agent\",\n adapter: {\n runtime: adapter.runtime,\n run: (runInput) =>\n adapter.run({\n ...runInput,\n timeoutMs: input.timeoutMs,\n }),\n },\n });\n\n summaries.push({\n runtime,\n status: result.status,\n agentDir: result.workspace.agentDir,\n runtimeSessionId: result.runtimeSessionId,\n finalMessage: result.finalMessage,\n eventTypes: result.events.map((event) => event.type),\n errorMessage: result.errorMessage,\n });\n } catch (error) {\n summaries.push({\n runtime,\n status: \"runtime_error\",\n eventTypes: [],\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n }\n }\n } finally {\n if (!input.keepArtifacts && !input.rootDir) {\n await rm(rootDir, { recursive: true, force: true });\n }\n }\n\n return summaries;\n}\n\nexport function smokeMatrixHasFailures(summaries: RuntimeSmokeSummary[]): boolean {\n return summaries.some((summary) =>\n [\"runtime_error\", \"timeout\", \"unsupported_version\"].includes(summary.status)\n );\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\nimport { query as sdkQuery } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n PersistentRuntimeAdapter,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\nimport {\n claudeStreamJsonPromptMessage,\n parseClaudeStreamJsonLine,\n} from \"./claude-stream-json\";\n\ntype ClaudeEffort = \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface ClaudeQueryInput {\n prompt: string;\n options: {\n cwd: string;\n permissionMode: \"default\" | \"bypassPermissions\";\n allowDangerouslySkipPermissions?: true;\n abortController: AbortController;\n includePartialMessages: true;\n model?: string;\n effort?: ClaudeEffort;\n thinking?: { type: \"adaptive\" };\n systemPrompt: {\n type: \"preset\";\n preset: \"claude_code\";\n append: string;\n };\n resume?: string;\n sessionId?: string;\n };\n}\n\nexport type ClaudeQueryFactory = (input: ClaudeQueryInput) => Query | AsyncIterable<unknown>;\n\nexport class ClaudeAdapter implements RuntimeAdapter {\n readonly runtime = \"claude\" as const;\n\n constructor(private readonly queryFactory: ClaudeQueryFactory = sdkQuery) {}\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n const events: RuntimeEvent[] = [];\n let finalMessage = \"\";\n let sessionId: string | undefined;\n const abortController = new AbortController();\n const abortHandler = () => abortController.abort();\n const timer = setTimeout(\n () => abortController.abort(),\n input.timeoutMs ?? 120000\n );\n const restoreEnv = applyRuntimeEnv(input.env);\n\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n const isResume = !!input.runtimeSessionId;\n const stream = this.queryFactory({\n prompt: input.prompt,\n options: {\n cwd: input.cwd,\n ...claudePermissionOptions(input.permissionMode),\n abortController,\n includePartialMessages: true,\n model: input.model && input.model !== \"default\" ? input.model : undefined,\n ...claudeReasoningOptions(input.reasoningEffort),\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: input.systemPrompt,\n },\n ...(isResume\n ? { resume: input.runtimeSessionId }\n : { sessionId: randomUUID() }),\n },\n });\n\n for await (const message of stream) {\n const msg = message as Record<string, unknown>;\n switch (msg.type) {\n case \"system\": {\n if (msg.subtype === \"init\") {\n sessionId = stringValue(msg.session_id);\n emit(events, input, {\n type: \"runtime_started\",\n data: { runtime: \"claude\", sessionId, model: msg.model },\n });\n } else if (msg.subtype === \"status\" && msg.status === \"compacting\") {\n emit(events, input, { type: \"compaction_started\" });\n } else if (msg.subtype === \"compact_boundary\") {\n emit(events, input, { type: \"compaction_finished\" });\n }\n break;\n }\n case \"stream_event\": {\n this.handleStreamEvent(msg.event, events, input, (text) => {\n finalMessage += text;\n });\n break;\n }\n case \"assistant\": {\n const text = this.handleAssistant(msg.message, events, input);\n if (text) finalMessage = text;\n break;\n }\n case \"user\": {\n if (msg.isSynthetic) {\n this.handleSyntheticUser(msg.message, events, input);\n }\n break;\n }\n case \"tool_progress\": {\n emit(events, input, { type: \"tool_progress\", data: msg });\n break;\n }\n case \"result\": {\n emit(events, input, {\n type: \"turn_finished\",\n data: {\n cost: msg.total_cost_usd,\n duration: msg.duration_ms,\n usage: msg.usage,\n },\n });\n break;\n }\n }\n }\n\n return { status: \"ok\", finalMessage, runtimeSessionId: sessionId, events };\n } catch (error) {\n const status = classifyProtocolError(error);\n return {\n status,\n finalMessage,\n runtimeSessionId: sessionId,\n events,\n errorMessage:\n status === \"timeout\"\n ? \"Claude session timed out\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n } finally {\n clearTimeout(timer);\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n restoreEnv();\n }\n }\n\n private handleStreamEvent(\n event: unknown,\n events: RuntimeEvent[],\n input: RuntimeRunInput,\n appendFinalMessage: (text: string) => void\n ): void {\n const streamEvent = event as Record<string, unknown> | undefined;\n if (streamEvent?.type !== \"content_block_delta\") return;\n const delta = streamEvent.delta as Record<string, unknown> | undefined;\n if (delta?.type === \"text_delta\" && typeof delta.text === \"string\") {\n appendFinalMessage(delta.text);\n emit(events, input, {\n type: \"assistant_delta\",\n content: delta.text,\n data: delta,\n });\n }\n if (delta?.type === \"thinking_delta\" && typeof delta.thinking === \"string\") {\n emit(events, input, {\n type: \"thinking_delta\",\n content: delta.thinking,\n data: delta,\n });\n }\n }\n\n private handleAssistant(\n message: unknown,\n events: RuntimeEvent[],\n input: RuntimeRunInput\n ): string {\n const blocks = contentBlocks(message);\n let text = \"\";\n for (const block of blocks) {\n if (block.type === \"text\" && typeof block.text === \"string\") {\n text += block.text;\n }\n if (block.type === \"tool_use\") {\n emit(events, input, {\n type: \"tool_start\",\n content: stringValue(block.name) ?? \"\",\n data: {\n id: block.id,\n name: block.name,\n input: block.input,\n },\n });\n }\n }\n return text;\n }\n\n private handleSyntheticUser(\n message: unknown,\n events: RuntimeEvent[],\n input: RuntimeRunInput\n ): void {\n for (const block of contentBlocks(message)) {\n if (block.type === \"tool_result\") {\n emit(events, input, { type: \"tool_result\", data: block });\n }\n }\n }\n}\n\nexport type ClaudeCliProcessFactory = (\n input: RuntimeStartInput,\n args: string[]\n) => ChildProcessWithoutNullStreams;\n\nexport class ClaudePersistentAdapter implements PersistentRuntimeAdapter {\n readonly runtime = \"claude\" as const;\n private child: ChildProcessWithoutNullStreams | null = null;\n private lines: readline.Interface | null = null;\n private startInput: RuntimeStartInput | null = null;\n private sessionId: string | undefined;\n private activePrompt: {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n appendFinalMessage(text: string): void;\n setFinalMessage(text: string): void;\n markExited(code: number | null, signal: NodeJS.Signals | null): void;\n finish(): void;\n exited?: { code: number | null; signal: NodeJS.Signals | null };\n } | null = null;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(\n private readonly processFactory: ClaudeCliProcessFactory = (input, args) =>\n spawn(\"claude\", args, {\n cwd: input.cwd,\n env: input.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n })\n ) {}\n\n async start(input: RuntimeStartInput): Promise<void> {\n if (this.child && this.alive) return;\n this.startInput = input;\n const args = claudeCliArgs(input);\n this.child = this.processFactory(input, args);\n this.child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) input.onEvent?.({ type: \"runtime_stderr\", content: text });\n });\n this.child.on(\"exit\", (code, signal) => {\n this.activePrompt?.markExited(code, signal);\n this.child = null;\n this.onExit?.(code, signal);\n });\n this.child.on(\"error\", (error) => {\n input.onEvent?.({ type: \"runtime_error\", content: error.message });\n });\n this.lines = readline.createInterface({ input: this.child.stdout });\n this.lines.on(\"line\", (line) => this.handleLine(line));\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n const startInput = this.startInput;\n const child = this.child;\n let finalMessage = \"\";\n const events: RuntimeEvent[] = [];\n if (!startInput || !child || !this.alive) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: \"Claude persistent runtime is not started\",\n };\n }\n\n const runInput: RuntimeRunInput = {\n ...startInput,\n prompt: input.prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n const abortHandler = () => this.destroy(\"prompt aborted\");\n let finishTurn: (() => void) | undefined;\n const turnFinished = new Promise<void>((resolve) => {\n finishTurn = resolve;\n });\n this.activePrompt = {\n runInput,\n events,\n appendFinalMessage: (text) => {\n finalMessage += text;\n },\n setFinalMessage: (text) => {\n finalMessage = text;\n },\n markExited: (code, signal) => {\n if (this.activePrompt) this.activePrompt.exited = { code, signal };\n finishTurn?.();\n },\n finish: () => finishTurn?.(),\n };\n\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n child.stdin.write(`${claudeStreamJsonPromptMessage(input.prompt)}\\n`);\n await withTimeout(\n turnFinished,\n input.timeoutMs ?? 120000,\n \"Claude stream-json turn timeout\"\n );\n if (this.activePrompt?.exited) {\n const { code, signal } = this.activePrompt.exited;\n return {\n status: \"runtime_error\",\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n errorMessage: `Claude exited code=${code} signal=${signal ?? \"-\"}`,\n };\n }\n return {\n status: \"ok\",\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n };\n } catch (error) {\n const status = classifyProtocolError(error);\n return {\n status,\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n errorMessage: status === \"timeout\"\n ? \"Claude stream-json session timed out\"\n : error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.activePrompt = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.child && !this.child.killed);\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n destroy(_reason?: string): void {\n this.activePrompt = null;\n this.lines?.close();\n this.lines = null;\n killProcessTree(this.child);\n this.child = null;\n }\n\n private handleLine(line: string): void {\n const parsed = parseClaudeStreamJsonLine(line);\n if (!parsed) return;\n if (parsed.sessionId) this.sessionId = parsed.sessionId;\n const active = this.activePrompt;\n const runInput = active?.runInput ?? (this.startInput ? { ...this.startInput, prompt: \"\" } : undefined);\n if (!runInput) return;\n for (const event of parsed.events) {\n if (!active && event.type !== \"runtime_started\") {\n continue;\n }\n emit(active?.events ?? [], runInput, event);\n }\n if (active) {\n if (parsed.appendFinalMessage) active.appendFinalMessage(parsed.appendFinalMessage);\n if (parsed.finalMessage) active.setFinalMessage(parsed.finalMessage);\n if (parsed.turnFinished) active.finish();\n }\n }\n}\n\nfunction claudePermissionOptions(permissionMode: RuntimeRunInput[\"permissionMode\"]): Pick<ClaudeQueryInput[\"options\"], \"permissionMode\" | \"allowDangerouslySkipPermissions\"> {\n if (permissionMode === \"full_access\") {\n return {\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n };\n }\n return { permissionMode: \"default\" };\n}\n\nfunction claudeReasoningOptions(reasoningEffort: string | undefined): Pick<ClaudeQueryInput[\"options\"], \"effort\" | \"thinking\"> {\n if (!reasoningEffort || reasoningEffort === \"default\") return {};\n if (reasoningEffort === \"adaptive\") return { thinking: { type: \"adaptive\" } };\n if (!isClaudeEffort(reasoningEffort)) return {};\n return { effort: reasoningEffort };\n}\n\nfunction claudeCliArgs(input: RuntimeStartInput): string[] {\n const args = [\n \"--allow-dangerously-skip-permissions\",\n \"--dangerously-skip-permissions\",\n \"--verbose\",\n \"--permission-mode\",\n input.permissionMode === \"full_access\" ? \"bypassPermissions\" : \"default\",\n \"--input-format\",\n \"stream-json\",\n \"--output-format\",\n \"stream-json\",\n \"--disallowed-tools\",\n \"EnterPlanMode,ExitPlanMode,ScheduleWakeup,CronCreate,CronList,CronDelete\",\n \"--system-prompt-file\",\n input.systemPromptPath,\n ];\n if (input.model && input.model !== \"default\") {\n args.push(\"--model\", input.model);\n }\n if (input.runtimeSessionId) {\n args.push(\"--resume\", input.runtimeSessionId);\n }\n return args;\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall through to direct child kill.\n }\n }\n child.kill(\"SIGTERM\");\n}\n\nfunction isClaudeEffort(value: string): value is ClaudeEffort {\n return value === \"low\" || value === \"medium\" || value === \"high\" || value === \"xhigh\" || value === \"max\";\n}\n\nfunction contentBlocks(message: unknown): Array<Record<string, unknown>> {\n const msg = message as { content?: unknown } | undefined;\n return Array.isArray(msg?.content)\n ? msg.content.filter((block): block is Record<string, unknown> =>\n typeof block === \"object\" && block !== null\n )\n : [];\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n events.push(event);\n input.onEvent?.(event);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction applyRuntimeEnv(env?: NodeJS.ProcessEnv): () => void {\n if (!env) return () => {};\n const previous = new Map<string, string | undefined>();\n for (const [key, value] of Object.entries(env)) {\n previous.set(key, process.env[key]);\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n return () => {\n for (const [key, value] of previous) {\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n };\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\n\nexport type JsonRpcId = number | string;\n\nexport interface JsonRpcNotification {\n method: string;\n params: unknown;\n}\n\nexport interface JsonRpcServerRequest {\n id: JsonRpcId;\n method: string;\n params: unknown;\n}\n\nexport interface JsonRpcStdioClientOptions {\n command: string;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n onNotification: (notification: JsonRpcNotification) => void;\n onServerRequest?: (request: JsonRpcServerRequest) => Promise<unknown>;\n onStderr?: (text: string) => void;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n}\n\ninterface PendingRequest {\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\nexport class JsonRpcStdioClient {\n private child: ChildProcessWithoutNullStreams | null = null;\n private lines: readline.Interface | null = null;\n private nextId = 1;\n private readonly pending = new Map<JsonRpcId, PendingRequest>();\n private started = false;\n private exitEmitted = false;\n\n constructor(private readonly options: JsonRpcStdioClientOptions) {}\n\n start(): void {\n if (this.started) return;\n this.started = true;\n this.exitEmitted = false;\n this.child = spawn(this.options.command, this.options.args, {\n cwd: this.options.cwd,\n env: this.options.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n this.child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) this.options.onStderr?.(text);\n });\n\n this.child.on(\"error\", (error) => {\n this.rejectPending(error instanceof Error ? error : new Error(String(error)));\n this.child = null;\n this.started = false;\n });\n\n this.child.on(\"exit\", (code, signal) => {\n this.rejectPending(new Error(`Process exited code=${code} signal=${signal}`));\n this.child = null;\n this.started = false;\n this.emitExit(code, signal);\n });\n\n this.lines = readline.createInterface({ input: this.child.stdout });\n this.lines.on(\"line\", (line) => this.handleLine(line));\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n if (!this.child) {\n return Promise.reject(new Error(\"JSON-RPC client not started\"));\n }\n\n const id = this.nextId++;\n const message = { jsonrpc: \"2.0\", id, method, params };\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n this.child!.stdin.write(`${JSON.stringify(message)}\\n`);\n });\n }\n\n destroy(): void {\n this.rejectPending(new Error(\"Client destroyed\"));\n this.lines?.close();\n this.lines = null;\n killProcessTree(this.child);\n this.child = null;\n this.started = false;\n }\n\n get isRunning(): boolean {\n return this.child !== null;\n }\n\n get alive(): boolean {\n return this.isRunning;\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n private handleLine(line: string): void {\n if (!line.trim()) return;\n\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n return;\n }\n\n const packet = message as {\n id?: JsonRpcId;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code?: number; message?: string; data?: unknown };\n };\n\n if (packet.id !== undefined && !packet.method) {\n const pending = this.pending.get(packet.id);\n if (!pending) return;\n this.pending.delete(packet.id);\n if (packet.error) {\n pending.reject(new Error(packet.error.message ?? \"JSON-RPC request failed\"));\n } else {\n pending.resolve(packet.result);\n }\n return;\n }\n\n if (packet.id !== undefined && packet.method) {\n const request = {\n id: packet.id,\n method: packet.method,\n params: packet.params,\n };\n const handler = this.options.onServerRequest;\n if (!handler) {\n this.sendResponse(packet.id, {});\n return;\n }\n handler(request)\n .then((result) => this.sendResponse(packet.id!, result))\n .catch((error) =>\n this.sendError(packet.id!, error instanceof Error ? error : new Error(String(error)))\n );\n return;\n }\n\n if (packet.method) {\n this.options.onNotification({\n method: packet.method,\n params: packet.params,\n });\n }\n }\n\n private sendResponse(id: JsonRpcId, result: unknown): void {\n this.child?.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, result })}\\n`);\n }\n\n private sendError(id: JsonRpcId, error: Error): void {\n this.child?.stdin.write(\n `${JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n error: { code: -32000, message: error.message },\n })}\\n`\n );\n }\n\n private rejectPending(error: Error): void {\n for (const pending of this.pending.values()) {\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private emitExit(code: number | null, signal: NodeJS.Signals | null): void {\n if (this.exitEmitted) return;\n this.exitEmitted = true;\n this.options.onExit?.(code, signal);\n }\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n if (child.pid) {\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n return;\n }\n child.kill();\n return;\n }\n\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall through to direct child kill for runtimes that did not get a group.\n }\n }\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) child.kill(\"SIGKILL\");\n }, 5000).unref();\n}\n", "import type {\n PersistentRuntimeAdapter,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\nimport {\n JsonRpcStdioClient,\n type JsonRpcNotification,\n type JsonRpcServerRequest,\n type JsonRpcStdioClientOptions,\n} from \"./json-rpc-stdio-client\";\n\nexport interface AcpJsonRpcClient {\n start(): void;\n request(method: string, params?: unknown): Promise<unknown>;\n destroy(): void;\n readonly isRunning?: boolean;\n readonly alive?: boolean;\n readonly pid?: number;\n}\n\nexport interface AcpAdapterConfig {\n runtime: RuntimeId;\n command: string;\n args: string[];\n modelFlag?: boolean;\n sessionNewExtras?: Record<string, unknown>;\n autoApproveMode?: string;\n}\n\nexport type AcpClientFactory = (\n options: JsonRpcStdioClientOptions\n) => AcpJsonRpcClient;\n\ninterface ActivePrompt {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n appendFinalMessage(text: string): void;\n}\n\nexport class AcpAdapter implements RuntimeAdapter, PersistentRuntimeAdapter {\n readonly runtime: RuntimeId;\n private activePermissionMode: RuntimeRunInput[\"permissionMode\"] = \"default\";\n private client: AcpJsonRpcClient | null = null;\n private sessionId: string | undefined;\n private startInput: RuntimeStartInput | null = null;\n private activePrompt: ActivePrompt | null = null;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(\n private readonly config: AcpAdapterConfig,\n private readonly clientFactory: AcpClientFactory = (options) =>\n new JsonRpcStdioClient(options)\n ) {\n this.runtime = config.runtime;\n }\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n await this.destroy(\"one-shot run complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n this.activePermissionMode = input.permissionMode ?? \"default\";\n\n try {\n if (this.client && this.alive) return;\n this.startInput = input;\n this.sessionId = undefined;\n this.client = this.clientFactory({\n command: this.config.command,\n args: modelArgs(this.config.args, input.model, this.config.modelFlag),\n cwd: input.cwd,\n env: input.env,\n onNotification: (notification) => this.routeNotification(notification),\n onServerRequest: (request) => this.handleServerRequest(request),\n onStderr: (text) =>\n input.onEvent?.({ type: \"runtime_stderr\", content: text }),\n onExit: (code, signal) => {\n this.client = null;\n this.onExit?.(code, signal);\n },\n });\n\n this.client.start();\n\n const initResult = (await withTimeout(\n this.client.request(\"initialize\", {\n protocolVersion: 1,\n clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" },\n capabilities: {},\n }),\n 10000,\n \"ACP initialize timeout\"\n )) as { agentInfo?: unknown };\n\n emit([], this.startInputAsRunInput(\"\"), {\n type: \"runtime_started\",\n data: { runtime: this.runtime, agent: initResult.agentInfo },\n });\n\n if (input.runtimeSessionId) {\n await this.client.request(\"session/load\", {\n sessionId: input.runtimeSessionId,\n cwd: input.cwd,\n mcpServers: [],\n });\n this.sessionId = input.runtimeSessionId;\n } else {\n const sessionResult = (await this.client.request(\"session/new\", {\n cwd: input.cwd,\n mcpServers: [],\n ...this.config.sessionNewExtras,\n })) as { sessionId?: string };\n this.sessionId = sessionResult.sessionId;\n if (!this.sessionId) throw new Error(`${this.runtime} session/new returned no session id`);\n }\n\n if (input.permissionMode === \"full_access\" && this.config.autoApproveMode) {\n await this.client.request(\"session/set_mode\", {\n sessionId: this.sessionId,\n modeId: this.config.autoApproveMode,\n });\n }\n } catch (error) {\n this.destroy(\"start failed\");\n throw error;\n }\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n let finalMessage = \"\";\n const events: RuntimeEvent[] = [];\n const sessionId = this.sessionId;\n const client = this.client;\n const startInput = this.startInput;\n const abortHandler = () => client?.destroy();\n\n if (!client || !this.alive || !startInput || !sessionId) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: `${this.runtime} persistent runtime is not started`,\n };\n }\n\n const runInput = this.startInputAsRunInput(input.prompt, input);\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n this.activePrompt = {\n runInput,\n events,\n appendFinalMessage: (text) => {\n finalMessage += text;\n },\n };\n\n emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n const promptResult = (await withTimeout(\n client.request(\"session/prompt\", {\n sessionId,\n prompt: [{ type: \"text\", text: this.buildPrompt(startInput.systemPrompt, input.prompt) }],\n }),\n input.timeoutMs ?? 120000,\n \"ACP prompt timeout\"\n )) as { stopReason?: string; usage?: unknown; _meta?: unknown };\n\n emit(events, runInput, {\n type: \"turn_finished\",\n data: {\n stopReason: promptResult.stopReason,\n usage: promptResult.usage ?? promptResult._meta,\n },\n });\n\n return { status: \"ok\", finalMessage, runtimeSessionId: sessionId, events };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId: sessionId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.activePrompt = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.client && (this.client.alive ?? this.client.isRunning ?? true));\n }\n\n get pid(): number | undefined {\n return this.client?.pid;\n }\n\n destroy(_reason?: string): void {\n this.activePrompt = null;\n this.client?.destroy();\n this.client = null;\n this.sessionId = undefined;\n }\n\n async handleServerRequestForTest(request: JsonRpcServerRequest): Promise<unknown> {\n return this.handleServerRequest(request);\n }\n\n protected buildPrompt(systemPrompt: string, userPrompt: string): string {\n return `<system>\\n${systemPrompt}\\n</system>\\n\\n${userPrompt}`;\n }\n\n protected async handleServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n if (request.method === \"session/request_permission\") {\n const runInput = this.activePrompt?.runInput ?? this.startInput;\n if (this.activePermissionMode === \"full_access\") {\n return permissionOutcome(selectPermissionOption(request.params, true));\n }\n if (!runInput?.requestPermission) return permissionOutcome(selectPermissionOption(request.params, false));\n const decision = await runInput.requestPermission({\n kind: \"session\",\n title: \"Runtime permission requested\",\n description: summarizeAcpPermissionParams(request.params),\n metadata: { method: request.method, params: request.params },\n });\n return permissionOutcome(selectPermissionOption(request.params, decision.action === \"approve\"));\n }\n return {};\n }\n\n private routeNotification(notification: JsonRpcNotification): void {\n const active = this.activePrompt;\n if (!active) return;\n this.handleNotification(\n notification,\n active.events,\n active.runInput,\n active.appendFinalMessage\n );\n }\n\n private startInputAsRunInput(prompt: string, input: Partial<RuntimePromptInput> = {}): RuntimeRunInput {\n const startInput = this.startInput;\n if (!startInput) {\n throw new Error(`${this.runtime} persistent runtime is not started`);\n }\n return {\n ...startInput,\n prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n }\n\n private handleNotification(\n notification: JsonRpcNotification,\n events: RuntimeEvent[],\n input: RuntimeRunInput,\n appendFinalMessage: (text: string) => void\n ): void {\n if (notification.method !== \"session/update\") return;\n const params = notification.params as { update?: Record<string, unknown> } | undefined;\n const update = params?.update;\n const sessionUpdate = stringValue(update?.sessionUpdate);\n if (!update || !sessionUpdate) return;\n\n switch (sessionUpdate) {\n case \"agent_message_chunk\": {\n const content = update.content as { type?: string; text?: string } | undefined;\n if (content?.text) {\n appendFinalMessage(content.text);\n emit(events, input, {\n type: \"assistant_delta\",\n content: content.text,\n data: update,\n });\n }\n break;\n }\n case \"agent_thought_chunk\": {\n const content = update.content as { type?: string; text?: string } | undefined;\n if (content?.text) {\n emit(events, input, {\n type: \"thinking_delta\",\n content: content.text,\n data: update,\n });\n }\n break;\n }\n case \"tool_call\": {\n emit(events, input, {\n type: \"tool_start\",\n content: stringValue(update.title) ?? \"\",\n data: update,\n });\n break;\n }\n case \"tool_call_update\": {\n emit(events, input, {\n type: update.status === \"completed\" ? \"tool_result\" : \"tool_progress\",\n content: stringValue(update.title) ?? \"\",\n data: update,\n });\n break;\n }\n case \"usage_update\": {\n emit(events, input, { type: \"usage_update\", data: update });\n break;\n }\n case \"available_commands_update\":\n case \"session_info_update\": {\n events.push({ type: sessionUpdate, data: update });\n break;\n }\n default: {\n events.push({ type: `acp_${sessionUpdate}`, data: update });\n }\n }\n }\n}\n\nexport function classifyProtocolError(error: unknown): RuntimeRunResult[\"status\"] {\n const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n if (msg.includes(\"enoent\") || msg.includes(\"not found\")) return \"not_installed\";\n if (\n msg.includes(\"auth\") ||\n msg.includes(\"login\") ||\n msg.includes(\"api key\") ||\n msg.includes(\"401\")\n ) {\n return \"not_logged_in\";\n }\n if (msg.includes(\"timeout\") || msg.includes(\"aborted\") || msg.includes(\"abort\")) {\n return \"timeout\";\n }\n return \"runtime_error\";\n}\n\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(message)), ms);\n promise.then(resolve, reject).finally(() => clearTimeout(timer));\n });\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n events.push(event);\n input.onEvent?.(event);\n}\n\nfunction summarizeAcpPermissionParams(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"Runtime requested permission.\";\n const record = params as Record<string, unknown>;\n const reason = typeof record.reason === \"string\" ? record.reason : undefined;\n const title = typeof record.title === \"string\" ? record.title : undefined;\n const command = typeof record.command === \"string\" ? record.command : undefined;\n return [title, command, reason].filter(Boolean).join(\"\\n\") || JSON.stringify(record).slice(0, 500);\n}\n\nfunction modelArgs(args: string[], model: string | undefined, enabled = true): string[] {\n if (!enabled || !model || model === \"default\") return args;\n return [...args, \"--model\", model];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function permissionOutcome(optionId: string): {\n outcome: { outcome: \"selected\"; optionId: string };\n} {\n return { outcome: { outcome: \"selected\", optionId } };\n}\n\nexport function selectPermissionOption(params: unknown, preferAllow = true): string {\n const options = Array.isArray((params as { options?: unknown } | undefined)?.options)\n ? ((params as { options: Array<{ optionId?: unknown }> }).options)\n : [];\n if (!preferAllow) {\n const deny = options.find((option) => {\n const optionId = String(option.optionId ?? \"\");\n return /reject|deny|no|cancel/i.test(optionId);\n });\n return String(deny?.optionId ?? options[0]?.optionId ?? \"reject\");\n }\n const allowed = options.find((option) => {\n const optionId = String(option.optionId ?? \"\");\n return /allow|approve|yes|accept/i.test(optionId);\n });\n return String(allowed?.optionId ?? options[0]?.optionId ?? \"allow-once\");\n}\n", "import type { RuntimeEvent } from \"./adapter\";\n\nexport interface ClaudeStreamJsonParseResult {\n sessionId?: string;\n model?: string;\n finalMessage?: string;\n appendFinalMessage?: string;\n events: RuntimeEvent[];\n turnFinished: boolean;\n}\n\nexport function parseClaudeStreamJsonLine(line: string): ClaudeStreamJsonParseResult | undefined {\n if (!line.trim()) return undefined;\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n return undefined;\n }\n\n const msg = message as Record<string, unknown>;\n const result: ClaudeStreamJsonParseResult = {\n events: [],\n turnFinished: false,\n };\n\n switch (msg.type) {\n case \"system\": {\n if (msg.subtype === \"init\") {\n result.sessionId = stringValue(msg.session_id);\n result.model = stringValue(msg.model);\n result.events.push({\n type: \"runtime_started\",\n data: { runtime: \"claude\", sessionId: result.sessionId, model: result.model },\n });\n } else if (msg.subtype === \"status\" && msg.status === \"compacting\") {\n result.events.push({ type: \"compaction_started\" });\n } else if (msg.subtype === \"compact_boundary\") {\n result.events.push({ type: \"compaction_finished\" });\n }\n break;\n }\n case \"stream_event\": {\n const event = msg.event as Record<string, unknown> | undefined;\n if (event?.type === \"content_block_delta\") {\n const delta = event.delta as Record<string, unknown> | undefined;\n if (delta?.type === \"text_delta\" && typeof delta.text === \"string\") {\n result.appendFinalMessage = delta.text;\n result.events.push({ type: \"assistant_delta\", content: delta.text, data: delta });\n }\n if (delta?.type === \"thinking_delta\" && typeof delta.thinking === \"string\") {\n result.events.push({ type: \"thinking_delta\", content: delta.thinking, data: delta });\n }\n }\n break;\n }\n case \"assistant\": {\n const text = contentBlocks(msg.message)\n .filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n .map((block) => String(block.text))\n .join(\"\");\n if (text) result.finalMessage = text;\n for (const block of contentBlocks(msg.message)) {\n if (block.type === \"tool_use\") {\n result.events.push({\n type: \"tool_start\",\n content: stringValue(block.name) ?? \"\",\n data: { id: block.id, name: block.name, input: block.input },\n });\n }\n }\n break;\n }\n case \"user\": {\n if (msg.isSynthetic) {\n for (const block of contentBlocks(msg.message)) {\n if (block.type === \"tool_result\") {\n result.events.push({ type: \"tool_result\", data: block });\n }\n }\n }\n break;\n }\n case \"tool_progress\": {\n result.events.push({ type: \"tool_progress\", data: msg });\n break;\n }\n case \"result\": {\n result.turnFinished = true;\n result.events.push({\n type: \"turn_finished\",\n data: {\n cost: msg.total_cost_usd,\n duration: msg.duration_ms,\n usage: msg.usage,\n },\n });\n break;\n }\n }\n\n return result;\n}\n\nexport function claudeStreamJsonPromptMessage(prompt: string): string {\n return JSON.stringify({\n type: \"user\",\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: prompt }],\n },\n });\n}\n\nfunction contentBlocks(message: unknown): Array<Record<string, unknown>> {\n const msg = message as { content?: unknown } | undefined;\n return Array.isArray(msg?.content)\n ? msg.content.filter((block): block is Record<string, unknown> =>\n typeof block === \"object\" && block !== null\n )\n : [];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n", "import type {\n PersistentRuntimeAdapter,\n RuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport {\n classifyProtocolError,\n withTimeout,\n} from \"./acp-adapter\";\nimport {\n JsonRpcStdioClient,\n type JsonRpcNotification,\n type JsonRpcServerRequest,\n type JsonRpcStdioClientOptions,\n} from \"./json-rpc-stdio-client\";\n\nexport interface CodexJsonRpcClient {\n start(): void;\n request(method: string, params?: unknown): Promise<unknown>;\n destroy(): void;\n readonly isRunning?: boolean;\n readonly alive?: boolean;\n readonly pid?: number;\n}\n\nexport type CodexClientFactory = (\n options: JsonRpcStdioClientOptions\n) => CodexJsonRpcClient;\n\ninterface ActiveCodexTurn {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n appendMessage(text: string): void;\n setFinalMessage(text: string): void;\n resolveTurnCompleted(): void;\n}\n\nexport class CodexAdapter implements RuntimeAdapter, PersistentRuntimeAdapter {\n readonly runtime = \"codex\" as const;\n private client: CodexJsonRpcClient | null = null;\n private threadId: string | undefined;\n private startInput: RuntimeStartInput | null = null;\n private activeTurn: ActiveCodexTurn | null = null;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(\n private readonly clientFactory: CodexClientFactory = (options) =>\n new JsonRpcStdioClient(options)\n ) {}\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n await this.destroy(\"one-shot run complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n try {\n if (this.client && this.alive) return;\n this.startInput = input;\n this.threadId = undefined;\n this.client = this.clientFactory({\n command: \"codex\",\n args: [\"app-server\", \"--listen\", \"stdio://\"],\n cwd: input.cwd,\n env: input.env,\n onNotification: (notification) => this.routeNotification(notification),\n onServerRequest: (request) => this.handleServerRequest(request),\n onStderr: (text) =>\n input.onEvent?.({ type: \"runtime_stderr\", content: text }),\n onExit: (code, signal) => {\n this.client = null;\n this.onExit?.(code, signal);\n },\n });\n\n this.client.start();\n await withTimeout(\n this.client.request(\"initialize\", {\n clientInfo: {\n name: \"wm-daemon\",\n title: \"Wage Mule Daemon\",\n version: \"0.0.1\",\n },\n capabilities: { experimentalApi: true },\n }),\n 10000,\n \"Codex initialize timeout\"\n );\n\n emit([], this.startInputAsRunInput(\"\"), { type: \"runtime_started\", data: { runtime: \"codex\" } });\n\n if (input.runtimeSessionId) {\n await this.client.request(\"thread/resume\", {\n threadId: input.runtimeSessionId,\n cwd: input.cwd,\n ...codexPermissionOptions(input.permissionMode),\n approvalsReviewer: \"user\",\n developerInstructions: input.systemPrompt,\n model: input.model && input.model !== \"default\" ? input.model : undefined,\n config: codexReasoningConfig(input.reasoningEffort),\n excludeTurns: true,\n persistExtendedHistory: true,\n });\n this.threadId = input.runtimeSessionId;\n } else {\n const response = (await this.client.request(\"thread/start\", {\n cwd: input.cwd,\n ...codexPermissionOptions(input.permissionMode),\n approvalsReviewer: \"user\",\n developerInstructions: input.systemPrompt,\n model: input.model && input.model !== \"default\" ? input.model : undefined,\n config: codexReasoningConfig(input.reasoningEffort),\n persistExtendedHistory: true,\n serviceName: \"wm-daemon\",\n })) as { thread?: { id?: string } };\n this.threadId = response.thread?.id;\n if (!this.threadId) throw new Error(\"Codex thread/start returned no thread id\");\n }\n } catch (error) {\n this.destroy(\"start failed\");\n throw error;\n }\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n const events: RuntimeEvent[] = [];\n let finalMessage = \"\";\n let turnId: string | undefined;\n let resolveTurnCompleted: (() => void) | undefined;\n const turnCompleted = new Promise<void>((resolve) => {\n resolveTurnCompleted = resolve;\n });\n const client = this.client;\n const threadId = this.threadId;\n const startInput = this.startInput;\n const abortHandler = () => client?.destroy();\n\n if (!client || !this.alive || !threadId || !startInput) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: \"Codex persistent runtime is not started\",\n };\n }\n\n const runInput = this.startInputAsRunInput(input.prompt, input);\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n this.activeTurn = {\n runInput,\n events,\n appendMessage: (text) => {\n finalMessage += text;\n },\n setFinalMessage: (text) => {\n finalMessage = text;\n },\n resolveTurnCompleted: () => resolveTurnCompleted?.(),\n };\n\n const response = (await client.request(\"turn/start\", {\n threadId,\n cwd: startInput.cwd,\n ...codexPermissionOptions(startInput.permissionMode),\n approvalsReviewer: \"user\",\n input: [{ type: \"text\", text: input.prompt, text_elements: [] }],\n })) as { turn?: { id?: string } } | undefined;\n turnId = response?.turn?.id;\n emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n\n await withTimeout(\n turnCompleted,\n input.timeoutMs ?? 120000,\n \"Codex turn timeout\"\n );\n emit(events, runInput, { type: \"turn_finished\", data: { threadId, turnId } });\n\n return {\n status: \"ok\",\n finalMessage,\n runtimeSessionId: threadId,\n events,\n };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId: threadId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.activeTurn = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.client && (this.client.alive ?? this.client.isRunning ?? true));\n }\n\n get pid(): number | undefined {\n return this.client?.pid;\n }\n\n destroy(_reason?: string): void {\n this.activeTurn = null;\n this.client?.destroy();\n this.client = null;\n this.threadId = undefined;\n }\n\n private routeNotification(notification: JsonRpcNotification): void {\n const active = this.activeTurn;\n if (!active) return;\n this.handleNotification(notification, active.events, active.runInput, {\n appendMessage: active.appendMessage,\n setFinalMessage: active.setFinalMessage,\n });\n if (notification.method === \"turn/completed\") {\n active.resolveTurnCompleted();\n }\n }\n\n private startInputAsRunInput(prompt: string, input: Partial<RuntimePromptInput> = {}): RuntimeRunInput {\n const startInput = this.startInput;\n if (!startInput) {\n throw new Error(\"Codex persistent runtime is not started\");\n }\n return {\n ...startInput,\n prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n }\n\n private handleNotification(\n notification: JsonRpcNotification,\n events: RuntimeEvent[],\n input: RuntimeRunInput,\n final: { appendMessage(text: string): void; setFinalMessage(text: string): void }\n ): void {\n const params = notification.params as Record<string, unknown> | undefined;\n switch (notification.method) {\n case \"item/agentMessage/delta\": {\n const delta = String(params?.delta ?? \"\");\n if (delta) {\n final.appendMessage(delta);\n emit(events, input, {\n type: \"assistant_delta\",\n content: delta,\n data: params,\n });\n }\n break;\n }\n case \"item/reasoning/textDelta\":\n case \"item/reasoning/summaryTextDelta\": {\n const delta = String(params?.delta ?? \"\");\n if (delta) {\n emit(events, input, {\n type: \"thinking_delta\",\n content: delta,\n data: params,\n });\n }\n break;\n }\n case \"item/started\": {\n emit(events, input, { type: \"tool_start\", data: params });\n break;\n }\n case \"item/completed\": {\n const item = params?.item as Record<string, unknown> | undefined;\n if (item?.type === \"agentMessage\" && typeof item.text === \"string\") {\n final.setFinalMessage(item.text);\n emit(events, input, {\n type: \"assistant_result\",\n content: item.text,\n data: item,\n });\n } else {\n emit(events, input, { type: \"tool_result\", data: params });\n }\n break;\n }\n case \"item/commandExecution/outputDelta\":\n case \"item/fileChange/outputDelta\": {\n emit(events, input, {\n type: \"tool_progress\",\n content: String(params?.delta ?? \"\"),\n data: params,\n });\n break;\n }\n case \"thread/tokenUsage/updated\": {\n emit(events, input, { type: \"usage_update\", data: params });\n break;\n }\n default: {\n events.push({ type: notification.method, data: params });\n }\n }\n }\n\n private async handleServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n const runInput = this.activeTurn?.runInput ?? (this.startInput ? this.startInputAsRunInput(\"\") : undefined);\n if (runInput?.permissionMode === \"full_access\" || !runInput?.requestPermission) {\n if (request.method === \"item/fileChange/requestApproval\") return { decision: \"accept\" };\n if (request.method === \"item/permissions/requestApproval\") return { permissions: {}, scope: \"turn\" };\n return { decision: \"accept\" };\n }\n if (request.method === \"item/fileChange/requestApproval\") {\n const decision = await runInput.requestPermission({\n kind: \"file_change\",\n title: \"File change approval requested\",\n description: summarizePermissionParams(request.params),\n metadata: { method: request.method, params: request.params },\n });\n return { decision: decision.action === \"approve\" ? \"accept\" : \"reject\" };\n }\n if (request.method === \"item/permissions/requestApproval\") {\n const decision = await runInput.requestPermission({\n kind: \"permission\",\n title: \"Command permission requested\",\n description: summarizePermissionParams(request.params),\n metadata: { method: request.method, params: request.params },\n });\n return decision.action === \"approve\"\n ? { permissions: {}, scope: \"turn\" }\n : { permissions: null, scope: \"turn\" };\n }\n return { decision: \"accept\" };\n }\n}\n\nfunction summarizePermissionParams(params: unknown): string {\n if (!params || typeof params !== \"object\") return \"Runtime requested permission.\";\n const record = params as Record<string, unknown>;\n const command = typeof record.command === \"string\" ? record.command : undefined;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n const reason = typeof record.reason === \"string\" ? record.reason : undefined;\n return [command, path, reason].filter(Boolean).join(\"\\n\") || JSON.stringify(record).slice(0, 500);\n}\n\nfunction codexPermissionOptions(permissionMode: RuntimeRunInput[\"permissionMode\"]): { approvalPolicy: string; sandbox: string } {\n if (permissionMode === \"full_access\") {\n return { approvalPolicy: \"never\", sandbox: \"danger-full-access\" };\n }\n return { approvalPolicy: \"on-request\", sandbox: \"workspace-write\" };\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n events.push(event);\n input.onEvent?.(event);\n}\n\nfunction codexReasoningConfig(reasoningEffort: string | undefined): { model_reasoning_effort: string } | undefined {\n const value = reasoningEffort?.trim();\n if (!value || value === \"default\") return undefined;\n return { model_reasoning_effort: value };\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\nimport type {\n RuntimeAdapter,\n RuntimeEvent,\n RuntimeRunInput,\n RuntimeRunResult,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\n\nexport type StreamJsonArgsBuilder = (input: RuntimeRunInput) => {\n command: string;\n args: string[];\n stdin?: string;\n env?: NodeJS.ProcessEnv;\n};\n\nexport class StreamJsonCliAdapter implements RuntimeAdapter {\n constructor(\n readonly runtime: RuntimeId,\n private readonly build: StreamJsonArgsBuilder,\n private readonly processFactory: (\n input: RuntimeRunInput,\n command: string,\n args: string[],\n env?: NodeJS.ProcessEnv\n ) => ChildProcessWithoutNullStreams = (input, command, args, env) =>\n spawn(command, args, {\n cwd: input.cwd,\n env: env ?? input.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n })\n ) {}\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n const events: RuntimeEvent[] = [];\n let finalMessage = \"\";\n let runtimeSessionId = input.runtimeSessionId;\n const { command, args, stdin, env } = this.build(input);\n const child = this.processFactory(input, command, args, env);\n const lines = readline.createInterface({ input: child.stdout });\n const abortHandler = () => killProcessTree(child);\n\n const done = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"exit\", (code, signal) => resolve({ code, signal }));\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) {\n const event = { type: \"runtime_stderr\", content: text };\n events.push(event);\n input.onEvent?.(event);\n }\n });\n\n lines.on(\"line\", (line) => {\n const parsed = parseStreamJsonLine(this.runtime, line);\n if (!parsed) return;\n if (parsed.sessionId) runtimeSessionId = parsed.sessionId;\n if (parsed.appendFinalMessage) finalMessage += parsed.appendFinalMessage;\n if (parsed.finalMessage) finalMessage = parsed.finalMessage;\n for (const event of parsed.events) {\n events.push(event);\n input.onEvent?.(event);\n }\n });\n\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n input.onEvent?.({ type: \"task_delivered\", content: input.prompt });\n if (stdin !== undefined) child.stdin.end(stdin.endsWith(\"\\n\") ? stdin : `${stdin}\\n`);\n const exit = await withTimeout(done, input.timeoutMs ?? 180000, `${this.runtime} CLI turn timeout`);\n if (exit.code !== 0) {\n return {\n status: classifyProtocolError(new Error(`${this.runtime} exited code=${exit.code} signal=${exit.signal ?? \"-\"}`)),\n finalMessage,\n runtimeSessionId,\n events,\n errorMessage: `${this.runtime} exited code=${exit.code} signal=${exit.signal ?? \"-\"}`,\n };\n }\n events.push({ type: \"turn_finished\", data: { runtime: this.runtime, code: exit.code } });\n return { status: \"ok\", finalMessage, runtimeSessionId, events };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n lines.close();\n killProcessTree(child);\n }\n }\n}\n\ninterface ParsedStreamLine {\n sessionId?: string;\n appendFinalMessage?: string;\n finalMessage?: string;\n events: RuntimeEvent[];\n}\n\nexport function parseStreamJsonLine(runtime: RuntimeId, line: string): ParsedStreamLine | undefined {\n if (!line.trim()) return undefined;\n let value: unknown;\n try {\n value = JSON.parse(line);\n } catch {\n return {\n appendFinalMessage: `${line}\\n`,\n events: [{ type: \"runtime_stdout\", content: line }],\n };\n }\n const msg = value as Record<string, unknown>;\n const events: RuntimeEvent[] = [];\n const sessionId =\n stringValue(msg.session_id) ??\n stringValue(msg.sessionId) ??\n stringValue((msg.session as Record<string, unknown> | undefined)?.id) ??\n stringValue((msg.thread as Record<string, unknown> | undefined)?.id);\n\n const text =\n stringValue(msg.text) ??\n stringValue(msg.message) ??\n stringValue(msg.content) ??\n stringValue((msg.delta as Record<string, unknown> | undefined)?.text) ??\n stringValue((msg.data as Record<string, unknown> | undefined)?.text);\n\n if (/assistant|message|content|text|delta/i.test(String(msg.type ?? msg.event ?? \"\")) && text) {\n events.push({ type: \"assistant_delta\", content: text, data: msg });\n return { sessionId, appendFinalMessage: text, events };\n }\n\n if (/result|final|complete|done/i.test(String(msg.type ?? msg.event ?? \"\")) && text) {\n events.push({ type: \"turn_finished\", data: msg });\n return { sessionId, finalMessage: text, events };\n }\n\n if (/tool/i.test(String(msg.type ?? msg.event ?? \"\"))) {\n events.push({ type: String(msg.type ?? \"tool_progress\"), content: text, data: msg });\n return { sessionId, events };\n }\n\n if (sessionId) {\n events.push({ type: \"runtime_started\", data: { runtime, sessionId } });\n return { sessionId, events };\n }\n events.push({ type: String(msg.type ?? \"runtime_event\"), content: text, data: msg });\n return { events };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall back to killing the child below.\n }\n }\n child.kill();\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport type { JsonRpcServerRequest } from \"./json-rpc-stdio-client\";\nimport { StreamJsonCliAdapter } from \"./stream-json-cli-adapter\";\n\nexport class CursorAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"cursor\",\n command: \"cursor-agent\",\n args: [\"acp\"],\n });\n }\n\n protected override async handleServerRequest(\n request: JsonRpcServerRequest\n ): Promise<unknown> {\n if (request.method === \"session/request_permission\") {\n return super.handleServerRequest(request);\n }\n if (request.method === \"cursor/ask_question\") {\n const params = request.params as { options?: Array<{ optionId?: string }> };\n return { optionId: params.options?.[0]?.optionId ?? \"yes\" };\n }\n if (request.method === \"cursor/create_plan\") {\n return { decision: \"approve\" };\n }\n return {};\n }\n}\n\nexport class CursorCliAdapter extends StreamJsonCliAdapter {\n constructor() {\n super(\"cursor\", (input) => {\n const args = [\n \"--print\",\n \"--output-format\",\n \"stream-json\",\n \"--yolo\",\n \"--approve-mcps\",\n \"--trust\",\n ];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n if (input.runtimeSessionId) args.push(\"--resume\", input.runtimeSessionId);\n args.push(input.prompt);\n return { command: \"cursor-agent\", args };\n });\n }\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport { StreamJsonCliAdapter } from \"./stream-json-cli-adapter\";\n\nexport class GeminiAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"gemini\",\n command: \"gemini\",\n args: [\"--acp\", \"--skip-trust\"],\n autoApproveMode: \"yolo\",\n });\n }\n}\n\nexport class GeminiCliAdapter extends StreamJsonCliAdapter {\n constructor() {\n super(\"gemini\", (input) => {\n const args = [\"--output-format\", \"stream-json\", \"--yolo\", \"-p\", \"\"];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n if (input.runtimeSessionId) args.push(\"--resume\", input.runtimeSessionId);\n return {\n command: \"gemini\",\n args,\n stdin: input.prompt,\n env: {\n ...process.env,\n ...input.env,\n GEMINI_CLI_TRUST_WORKSPACE: input.env?.GEMINI_CLI_TRUST_WORKSPACE ?? \"true\",\n },\n };\n });\n }\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\n\nexport class HermesAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"hermes\",\n command: \"hermes\",\n args: [\"acp\", \"--accept-hooks\"],\n });\n }\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport type {\n PersistentRuntimeAdapter,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\nimport { parseStreamJsonLine } from \"./stream-json-cli-adapter\";\n\nexport class KimiAdapter implements PersistentRuntimeAdapter {\n readonly runtime = \"kimi\" as const;\n private child: ChildProcessWithoutNullStreams | null = null;\n private lines: readline.Interface | null = null;\n private startInput: RuntimeStartInput | null = null;\n private sessionId: string | undefined;\n private active: {\n runInput: RuntimeRunInput;\n events: RuntimeEvent[];\n append(text: string): void;\n set(text: string): void;\n finish(): void;\n } | null = null;\n private nextId = 1;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n this.destroy(\"one-shot run complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n if (this.child && this.alive) return;\n this.startInput = input;\n this.sessionId = input.runtimeSessionId || `wm-${input.agentId}`;\n const wmDir = path.join(input.cwd, \".wm\");\n await mkdir(wmDir, { recursive: true });\n const agentFile = path.join(wmDir, \"kimi-agent.yaml\");\n const systemPromptFile = path.join(wmDir, \"kimi-system.md\");\n const mcpConfigFile = path.join(wmDir, \"kimi-mcp.json\");\n await writeFile(systemPromptFile, input.systemPrompt, \"utf8\");\n await writeFile(agentFile, kimiAgentYaml(), \"utf8\");\n await writeFile(mcpConfigFile, JSON.stringify({ mcpServers: {} }, null, 2), \"utf8\");\n\n const args = [\n \"--wire\",\n \"--yolo\",\n \"--agent-file\",\n agentFile,\n \"--mcp-config-file\",\n mcpConfigFile,\n \"--session\",\n this.sessionId,\n ];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n this.child = spawn(\"kimi\", args, {\n cwd: input.cwd,\n env: input.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n this.child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString().trim();\n if (text) input.onEvent?.({ type: \"runtime_stderr\", content: text });\n });\n this.child.on(\"exit\", (code, signal) => {\n this.child = null;\n this.onExit?.(code, signal);\n });\n this.child.on(\"error\", (error) => {\n input.onEvent?.({ type: \"runtime_error\", content: error.message });\n });\n this.lines = readline.createInterface({ input: this.child.stdout });\n this.lines.on(\"line\", (line) => this.handleLine(line));\n this.writeWire(\"initialize\", { clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" } });\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n const startInput = this.startInput;\n const child = this.child;\n let finalMessage = \"\";\n const events: RuntimeEvent[] = [];\n if (!startInput || !child || !this.alive) {\n return {\n status: \"runtime_error\",\n finalMessage,\n events,\n errorMessage: \"Kimi persistent runtime is not started\",\n };\n }\n let finishTurn: (() => void) | undefined;\n const turnFinished = new Promise<void>((resolve) => {\n finishTurn = resolve;\n });\n const runInput: RuntimeRunInput = {\n ...startInput,\n prompt: input.prompt,\n timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n abortSignal: input.abortSignal,\n };\n const abortHandler = () => this.destroy(\"prompt aborted\");\n this.active = {\n runInput,\n events,\n append: (text) => {\n finalMessage += text;\n },\n set: (text) => {\n finalMessage = text;\n },\n finish: () => finishTurn?.(),\n };\n try {\n if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n events.push({ type: \"task_delivered\", content: input.prompt });\n this.writeWire(\"prompt\", { prompt: input.prompt, sessionId: this.sessionId });\n await withTimeout(turnFinished, input.timeoutMs ?? 180000, \"Kimi wire turn timeout\");\n return { status: \"ok\", finalMessage, runtimeSessionId: this.sessionId, events };\n } catch (error) {\n return {\n status: classifyProtocolError(error),\n finalMessage,\n runtimeSessionId: this.sessionId,\n events,\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n this.active = null;\n }\n }\n\n get alive(): boolean {\n return Boolean(this.child && !this.child.killed);\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n destroy(_reason?: string): void {\n this.active = null;\n this.lines?.close();\n this.lines = null;\n killProcessTree(this.child);\n this.child = null;\n }\n\n private writeWire(method: string, params: unknown): void {\n this.child?.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id: this.nextId++, method, params })}\\n`);\n }\n\n private handleLine(line: string): void {\n const parsed = parseStreamJsonLine(\"kimi\", line);\n if (!parsed) return;\n if (parsed.sessionId) this.sessionId = parsed.sessionId;\n const active = this.active;\n const runInput = active?.runInput ?? (this.startInput ? { ...this.startInput, prompt: \"\" } : undefined);\n if (!runInput) return;\n if (active) {\n if (parsed.appendFinalMessage) active.append(parsed.appendFinalMessage);\n if (parsed.finalMessage) active.set(parsed.finalMessage);\n if (parsed.events.some((event) => event.type === \"turn_finished\")) active.finish();\n for (const event of parsed.events) {\n active.events.push(event);\n runInput.onEvent?.(event);\n }\n }\n }\n}\n\nfunction kimiAgentYaml(): string {\n return [\n \"version: 1\",\n \"agent:\",\n \" extend: default\",\n \" name: wm\",\n \" system_prompt_path: ./kimi-system.md\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n } catch {\n // Process already exited.\n }\n }, 5000).unref();\n return;\n } catch {\n // Fall through.\n }\n }\n child.kill();\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport { StreamJsonCliAdapter } from \"./stream-json-cli-adapter\";\n\nexport class OpenCodeAcpAdapter extends AcpAdapter {\n constructor() {\n super({\n runtime: \"opencode\",\n command: \"opencode\",\n args: [\"acp\"],\n });\n }\n}\n\nexport class OpenCodeCliAdapter extends StreamJsonCliAdapter {\n constructor() {\n super(\"opencode\", (input) => {\n const args = [\n \"run\",\n \"--format\",\n \"json\",\n \"--dangerously-skip-permissions\",\n \"--pure\",\n \"--dir\",\n input.cwd,\n ];\n if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n args.push(\"--agent\", \"wm\");\n if (input.runtimeSessionId) args.push(\"--session\", input.runtimeSessionId);\n args.push(\"--\", input.prompt);\n return { command: \"opencode\", args };\n });\n }\n}\n", "import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n PersistentRuntimeAdapter,\n RuntimeRunInput,\n RuntimeEvent,\n RuntimePromptInput,\n RuntimeRunResult,\n RuntimeStartInput,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport class FakePersistentRuntimeAdapter implements PersistentRuntimeAdapter {\n readonly runtime: RuntimeId;\n private child: ChildProcess | null = null;\n private startInput: RuntimeStartInput | null = null;\n private spawnCount = 0;\n private promptCount = 0;\n private runtimeSessionId: string | undefined;\n private oneShotRun = false;\n onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n constructor(runtime: RuntimeId) {\n this.runtime = runtime;\n }\n\n async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n this.oneShotRun = true;\n try {\n await this.start(input);\n return await this.prompt({\n prompt: input.prompt,\n timeoutMs: input.timeoutMs,\n abortSignal: input.abortSignal,\n });\n } finally {\n this.destroy(\"one-shot fake runtime complete\");\n }\n }\n\n async start(input: RuntimeStartInput): Promise<void> {\n if (this.child && this.alive) return;\n this.startInput = input;\n this.spawnCount += 1;\n this.promptCount = 0;\n this.runtimeSessionId = input.runtimeSessionId || `${this.runtime}-fake-session`;\n await mkdir(input.cwd, { recursive: true });\n this.child = spawn(\"node\", [\"-e\", \"setInterval(() => {}, 1000)\"], {\n cwd: input.cwd,\n env: input.env ?? process.env,\n stdio: \"ignore\",\n detached: process.platform !== \"win32\",\n });\n this.child.on(\"exit\", (code, signal) => {\n this.child = null;\n this.onExit?.(code, signal);\n });\n input.onEvent?.({\n type: \"runtime_started\",\n data: { runtime: this.runtime, fake: true, pid: this.pid },\n });\n await this.writeDiagnostic();\n }\n\n async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n if (!this.startInput || !this.alive) {\n return {\n status: \"runtime_error\",\n finalMessage: \"\",\n events: [],\n errorMessage: `${this.runtime} fake persistent runtime is not started`,\n };\n }\n this.promptCount += 1;\n await this.writeDiagnostic();\n await sleep(fakePersistentRuntimeDelayMs(), input.abortSignal);\n const events: RuntimeEvent[] = [\n { type: \"assistant_result\", content: `fake ${this.runtime} prompt ${this.promptCount}: ${input.prompt}` },\n { type: \"turn_finished\", data: { fake: true, promptCount: this.promptCount } },\n ];\n for (const event of events) {\n this.startInput.onEvent?.(event);\n }\n await this.writeDiagnostic();\n return {\n status: \"ok\",\n finalMessage: `fake ${this.runtime} prompt ${this.promptCount}`,\n runtimeSessionId: this.runtimeSessionId,\n events,\n };\n }\n\n get alive(): boolean {\n return Boolean(this.child && !this.child.killed);\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n destroy(_reason?: string): void {\n const child = this.child;\n this.child = null;\n if (!child || child.killed) return;\n if (process.platform === \"win32\") {\n child.kill();\n return;\n }\n if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n return;\n } catch {\n // Fall through.\n }\n }\n child.kill(\"SIGTERM\");\n }\n\n private async writeDiagnostic(): Promise<void> {\n if (!this.startInput) return;\n const dir = path.join(this.startInput.cwd, \".wm\", \"runtime-sessions\");\n await mkdir(dir, { recursive: true });\n await writeFile(\n path.join(dir, \"current.json\"),\n `${JSON.stringify({\n runtime: this.runtime,\n agentId: this.startInput.agentId,\n pid: this.pid,\n spawnCount: this.spawnCount,\n promptCount: this.promptCount,\n lastPromptSeq: this.promptCount,\n model: this.startInput.model ?? \"default\",\n cwd: this.startInput.cwd,\n persistent: !this.oneShotRun,\n }, null, 2)}\\n`,\n \"utf8\"\n );\n }\n}\n\nfunction fakePersistentRuntimeDelayMs(): number {\n const raw = Number.parseInt(process.env.WM_DAEMON_FAKE_RUNTIME_DELAY_MS ?? \"\", 10);\n return Number.isFinite(raw) && raw >= 0 ? raw : 10;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new Error(\"Fake persistent runtime aborted\"));\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => {\n clearTimeout(timer);\n reject(new Error(\"Fake persistent runtime aborted\"));\n }, { once: true });\n });\n}\n", "import { ClaudeAdapter, ClaudePersistentAdapter } from \"./claude-adapter\";\nimport { CodexAdapter } from \"./codex-adapter\";\nimport { CursorCliAdapter } from \"./cursor-acp-adapter\";\nimport { GeminiCliAdapter } from \"./gemini-acp-adapter\";\nimport { HermesAcpAdapter } from \"./hermes-acp-adapter\";\nimport { KimiAdapter } from \"./kimi-adapter\";\nimport { OpenCodeCliAdapter } from \"./opencode-acp-adapter\";\nimport { FakePersistentRuntimeAdapter } from \"./fake-persistent-adapter\";\nimport type { PersistentRuntimeAdapter, RuntimeAdapter } from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport function createRuntimeAdapter(runtime: RuntimeId): RuntimeAdapter {\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n return new FakePersistentRuntimeAdapter(runtime);\n }\n switch (runtime) {\n case \"codex\":\n return new CodexAdapter();\n case \"claude\":\n return new ClaudeAdapter();\n case \"kimi\":\n return new KimiAdapter();\n case \"gemini\":\n return new GeminiCliAdapter();\n case \"cursor\":\n return new CursorCliAdapter();\n case \"hermes\":\n return new HermesAcpAdapter();\n case \"opencode\":\n return new OpenCodeCliAdapter();\n }\n}\n\nexport interface PersistentRuntimeAdapterStatus {\n runtime: RuntimeId;\n available: boolean;\n reason?: string;\n}\n\nexport function createPersistentRuntimeAdapter(runtime: RuntimeId): PersistentRuntimeAdapter | undefined {\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n return isPersistentRuntime(runtime) ? new FakePersistentRuntimeAdapter(runtime) : undefined;\n }\n switch (runtime) {\n case \"codex\":\n return new CodexAdapter();\n case \"claude\":\n return new ClaudePersistentAdapter();\n case \"kimi\":\n return new KimiAdapter();\n case \"gemini\":\n return undefined;\n case \"cursor\":\n return undefined;\n case \"hermes\":\n return new HermesAcpAdapter();\n case \"opencode\":\n return undefined;\n }\n}\n\nfunction isPersistentRuntime(runtime: RuntimeId): boolean {\n return runtime === \"codex\" || runtime === \"claude\" || runtime === \"kimi\" || runtime === \"hermes\";\n}\n\nexport function persistentRuntimeAdapterStatus(runtime: RuntimeId): PersistentRuntimeAdapterStatus {\n const adapter = createPersistentRuntimeAdapter(runtime);\n return {\n runtime,\n available: adapter !== undefined,\n reason: adapter === undefined\n ? \"runtime uses per-turn session resume\"\n : undefined,\n };\n}\n", "import assert from \"node:assert/strict\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n RuntimeAdapter,\n RuntimeRunResult,\n RuntimeRunStatus,\n} from \"../runtime/adapter\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\nimport {\n createAgentWorkspace,\n type AgentRuntime,\n type AgentWorkspace,\n} from \"../workspace/agent-workspace\";\n\nconst smokePrompt = [\n \"Create or update a file named wm-daemon-smoke.txt in the current working directory.\",\n \"The file must contain exactly these 12 bytes with no trailing newline: WM_DAEMON_OK\",\n \"Do not use `echo`; use a file write method that does not append a newline.\",\n \"Also create or update `notes/smoke-memory.md` with one short sentence saying this workspace can write notes.\",\n \"Then reply with exactly: WM_DAEMON_OK\",\n].join(\"\\n\");\n\nexport function buildAgentIdentityPrompt(agentId: string, runtime: RuntimeId): string {\n return [\n \"\u4F60\u662F\u8C01\uFF1F\",\n `\u8BF7\u57FA\u4E8E\u5E73\u53F0\u6CE8\u5165\u7684\u8EAB\u4EFD\u56DE\u7B54\uFF0C\u5FC5\u987B\u660E\u786E\u5305\u542B Agent ID: ${agentId}`,\n `\u5E76\u660E\u786E\u5305\u542B Runtime: ${runtime}`,\n \"\u4E0D\u8981\u53EA\u56DE\u7B54\u4F60\u662F\u5E95\u5C42\u6A21\u578B\u6216 CLI\u3002\",\n ].join(\"\\n\");\n}\n\nexport function assertAgentIdentityResult(input: {\n runtime: RuntimeId;\n agentId: string;\n finalMessage: string;\n}): void {\n const message = input.finalMessage.toLowerCase();\n assert.ok(\n message.includes(input.agentId.toLowerCase()),\n `${input.runtime}: identity answer must mention agent id ${input.agentId}; got ${JSON.stringify(input.finalMessage.slice(0, 300))}`\n );\n assert.ok(\n message.includes(input.runtime.toLowerCase()),\n `${input.runtime}: identity answer must mention runtime ${input.runtime}; got ${JSON.stringify(input.finalMessage.slice(0, 300))}`\n );\n}\n\nexport async function runAdapterIdentityTest(input: {\n adapter: RuntimeAdapter;\n workspace: AgentWorkspace;\n agentId: string;\n runtime: RuntimeId;\n runtimeSessionId?: string;\n timeoutMs?: number;\n}): Promise<RuntimeRunResult & { status: RuntimeRunStatus }> {\n const systemPrompt = await readFile(input.workspace.systemPromptPath, \"utf8\");\n const result = await input.adapter.run({\n agentId: input.agentId,\n cwd: input.workspace.agentDir,\n prompt: buildAgentIdentityPrompt(input.agentId, input.runtime),\n systemPrompt,\n systemPromptPath: input.workspace.systemPromptPath,\n runtimeSessionId: input.runtimeSessionId,\n timeoutMs: input.timeoutMs,\n });\n\n if (result.status === \"ok\") {\n assertAgentIdentityResult({\n runtime: input.runtime,\n agentId: input.agentId,\n finalMessage: result.finalMessage,\n });\n }\n\n return result;\n}\n\nexport interface RunAdapterSmokeTestInput {\n rootDir: string;\n runDir?: string;\n serverNamespace: string;\n serverId: string;\n daemonId: string;\n agentId: string;\n agentName: string;\n runtime: AgentRuntime;\n role?: string;\n adapter: RuntimeAdapter;\n machineDirectoryName?: string;\n agentDirectoryName?: string;\n}\n\nexport interface RunAdapterSmokeTestResult extends RuntimeRunResult {\n workspace: AgentWorkspace;\n}\n\nexport async function runAdapterSmokeTest(\n input: RunAdapterSmokeTestInput\n): Promise<RunAdapterSmokeTestResult> {\n assert.equal(\n input.adapter.runtime,\n input.runtime,\n \"adapter runtime must match requested runtime\"\n );\n\n const workspace = await createAgentWorkspace({\n ...input,\n machineDirectoryName: input.machineDirectoryName ?? input.serverNamespace,\n agentDirectoryName: input.agentDirectoryName ?? input.agentId,\n });\n const runDir = input.runDir ?? workspace.agentDir;\n const systemPrompt = await readFile(workspace.systemPromptPath, \"utf8\");\n const result = await input.adapter.run({\n agentId: input.agentId,\n cwd: runDir,\n prompt: smokePrompt,\n systemPrompt,\n systemPromptPath: workspace.systemPromptPath,\n });\n\n await recordRuntimeSession(workspace, input.runtime, result);\n\n if (result.status !== \"ok\") {\n return {\n ...result,\n workspace,\n };\n }\n\n const fileContent = await readFile(\n path.join(runDir, \"wm-daemon-smoke.txt\"),\n \"utf8\"\n );\n assert.ok(\n result.finalMessage.includes(\"WM_DAEMON_OK\"),\n `Final message from ${input.runtime} must contain WM_DAEMON_OK, got: ${JSON.stringify(result.finalMessage.slice(0, 200))}`\n );\n assert.equal(\n fileContent,\n \"WM_DAEMON_OK\",\n `Unexpected smoke file content from ${input.runtime}: ${JSON.stringify(fileContent)}`\n );\n const noteContent = await readFile(\n path.join(runDir, \"notes\", \"smoke-memory.md\"),\n \"utf8\"\n );\n assert.match(noteContent, /workspace can write notes/i);\n\n return {\n ...result,\n workspace,\n };\n}\n\nasync function recordRuntimeSession(\n workspace: AgentWorkspace,\n runtime: AgentRuntime,\n result: RuntimeRunResult\n): Promise<void> {\n await mkdir(workspace.runtimeSessionsDir, { recursive: true });\n const resume =\n result.status === \"ok\" && result.runtimeSessionId\n ? \"native_resume\"\n : \"unsupported_or_unverified\";\n\n await writeFile(\n path.join(workspace.runtimeSessionsDir, `${runtime}.json`),\n `${JSON.stringify(\n {\n runtime,\n status: result.status,\n resume,\n runtimeSessionId: result.runtimeSessionId,\n note:\n result.status === \"ok\"\n ? \"Runtime session handoff recorded by wm-daemon smoke harness.\"\n : result.errorMessage,\n },\n null,\n 2\n )}\\n`,\n \"utf8\"\n );\n}\n", "import { chmod, cp, mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { scanAgentSkills } from \"../agent-manager/skill-scanner\";\nimport { skillTemplatesForWorkspace } from \"../skills/templates\";\n\nexport type AgentRuntime =\n | \"codex\"\n | \"claude\"\n | \"kimi\"\n | \"gemini\"\n | \"cursor\"\n | \"hermes\"\n | \"opencode\";\n\nexport interface CreateAgentWorkspaceInput {\n rootDir: string;\n serverNamespace: string;\n serverId: string;\n machineDirectoryName: string;\n machineId?: string;\n agentDirectoryName: string;\n daemonId: string;\n agentId: string;\n agentName: string;\n runtime: AgentRuntime;\n role?: string;\n feishuDelegationEnabled?: boolean;\n}\n\nexport interface AgentWorkspace {\n serverDir: string;\n agentDir: string;\n wmDir: string;\n memoryPath: string;\n notesDir: string;\n runtimeSessionsDir: string;\n runsDir: string;\n agentTokenPath: string;\n wrapperPath: string;\n wrapperCliPath: string;\n systemPromptPath: string;\n}\n\nexport async function createAgentWorkspace(\n input: CreateAgentWorkspaceInput\n): Promise<AgentWorkspace> {\n const serverDir = input.machineId\n ? path.join(input.rootDir, input.machineDirectoryName)\n : path.join(input.rootDir, input.serverNamespace);\n const agentDir = path.join(serverDir, input.agentDirectoryName);\n const wmDir = path.join(agentDir, \".wm\");\n const notesDir = path.join(agentDir, \"notes\");\n const runtimeSessionsDir = path.join(wmDir, \"runtime-sessions\");\n const runsDir = path.join(wmDir, \"runs\");\n const memoryPath = path.join(agentDir, \"MEMORY.md\");\n const agentTokenPath = path.join(wmDir, \"agent-token\");\n const wrapperPath = path.join(wmDir, \"wm\");\n const wrapperCliPath = path.join(wmDir, \"wm-cli.js\");\n const systemPromptPath = path.join(wmDir, \"system-prompt.md\");\n\n await mkdir(notesDir, { recursive: true });\n await mkdir(runtimeSessionsDir, { recursive: true });\n await mkdir(runsDir, { recursive: true });\n await syncWorkspaceSkills(wmDir, Boolean(input.feishuDelegationEnabled));\n\n await writeFile(memoryPath, buildMemory(input), { flag: \"wx\" }).catch((error) => {\n if (error?.code !== \"EEXIST\") {\n throw error;\n }\n });\n await writeFile(agentTokenPath, buildAgentToken(input), { flag: \"wx\" }).catch(\n (error) => {\n if (error?.code !== \"EEXIST\") {\n throw error;\n }\n }\n );\n await writeFile(systemPromptPath, await buildSystemPrompt(input, { agentDir, wrapperPath }), \"utf8\");\n await writeFile(wrapperCliPath, buildWrapperCli(), \"utf8\");\n await writeFile(wrapperPath, buildWrapper(wrapperCliPath), \"utf8\");\n await chmod(wrapperPath, 0o755);\n\n return {\n serverDir,\n agentDir,\n wmDir,\n memoryPath,\n notesDir,\n runtimeSessionsDir,\n runsDir,\n agentTokenPath,\n wrapperPath,\n wrapperCliPath,\n systemPromptPath,\n };\n}\n\nfunction buildMemory(input: CreateAgentWorkspaceInput): string {\n const role = input.role?.trim() || \"Wage Mule local agent\";\n\n return [\n `# ${input.agentName}`,\n \"\",\n \"## Role\",\n \"\",\n role,\n \"\",\n \"## Key Knowledge\",\n \"\",\n \"- No durable knowledge has been recorded yet.\",\n \"- Add stable user preferences, project context, and work history to notes, then link them from this file.\",\n \"\",\n \"## Active Context\",\n \"\",\n \"- First startup.\",\n \"- Before long work, keep this section current enough to recover after interruption or context compression.\",\n \"\",\n \"## Memory Index\",\n \"\",\n \"- `notes/user-preferences.md` -- User preferences, communication style, recurring requests, and conventions.\",\n \"- `notes/work-log.md` -- Important completed work, decisions, failed approaches, and verification history.\",\n \"- `notes/channels.md` -- Platform channel, DM, and thread context when relevant.\",\n \"- `notes/<domain>.md` -- Domain-specific knowledge that deserves its own durable file.\",\n \"\",\n \"## Platform Context\",\n \"\",\n `- Agent ID: ${input.agentId}`,\n `- Server Namespace: ${input.serverNamespace}`,\n `- Server ID: ${input.serverId}`,\n ...(input.machineId ? [`- Machine ID: ${input.machineId}`] : []),\n `- Daemon ID: ${input.daemonId}`,\n `- Runtime: ${input.runtime}`,\n \"\",\n \"## Memory Rules\",\n \"\",\n \"- MEMORY.md is the recovery index for this agent.\",\n \"- `MEMORY.md` is the recovery index for this agent.\",\n \"- Keep `MEMORY.md` concise and update it when new note files are added.\",\n \"- Keep detailed long-lived knowledge in `notes/`.\",\n \"- Do not store secrets, tokens, passwords, private keys, or sensitive credentials in memory or notes.\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function buildSystemPrompt(\n input: CreateAgentWorkspaceInput,\n paths: { agentDir: string; wrapperPath: string }\n): Promise<string> {\n const role = input.role?.trim() || \"Wage Mule local agent\";\n const workspaceSkills = await buildWorkspaceSkillsSection(input);\n\n return [\n `You are \"${input.agentName}\", an AI agent in Wage Mule -- a collaborative platform where humans and agents work together in shared channels while local daemon processes execute agent runtime sessions.`,\n \"\",\n \"## Who you are\",\n \"\",\n \"Your platform identity, agent directory, MEMORY.md, notes, and runtime session handoff persist across turns. You may be started, put to sleep when idle, and resumed when the platform delivers more work. Treat yourself as a platform-created colleague with durable local context, not as a one-off command.\",\n \"\",\n \"## Current Runtime Context\",\n \"\",\n \"This section is authoritative daemon-injected context. Do not infer platform identity from hostname, cwd, runtime account, local user name, or non-platform-created runtime sessions when this section is present.\",\n \"\",\n `- Agent ID: ${input.agentId}`,\n `- Agent Name: ${input.agentName}`,\n `- Server Namespace: ${input.serverNamespace}`,\n `- Server ID: ${input.serverId}`,\n ...(input.machineId ? [`- Machine ID: ${input.machineId}`] : []),\n `- Daemon ID: ${input.daemonId}`,\n `- Hostname: ${os.hostname() || \"unknown\"}`,\n `- Runtime: ${input.runtime}`,\n `- Role: ${role}`,\n `- Agent Directory: ${paths.agentDir}`,\n `- Memory File: ${path.join(paths.agentDir, \"MEMORY.md\")}`,\n `- Notes Directory: ${path.join(paths.agentDir, \"notes\")}`,\n `- wm CLI Wrapper: ${paths.wrapperPath}`,\n \"\",\n \"## Communication -- wm CLI\",\n \"\",\n \"Use the daemon-created `wm` CLI wrapper for platform chat, task, attachment, profile, and reminder operations. Prefer the absolute wm CLI Wrapper path from Current Runtime Context when a task prompt provides it; the daemon also prepends the wrapper directory to PATH as a convenience. The commands listed below are implemented platform commands, not placeholders.\",\n \"\",\n \"Available platform commands:\",\n \"\",\n \"1. `wm message check` -- Non-blocking check for new channel, DM, or thread messages at natural breakpoints.\",\n \"2. `wm message send` -- Send a channel, DM, or thread reply through the platform.\",\n \"3. `wm dm send` -- Send a private agent-to-agent DM, optionally waiting for a reply.\",\n \"4. `wm message read` -- Read visible history with pagination or around a specific message.\",\n \"5. `wm message search` -- Search visible channel and DM history before answering historical questions.\",\n \"6. `wm server info` -- Inspect the current server, visible channels, humans, agents, and memberships.\",\n \"7. `wm channel members` -- Inspect members of a channel, DM, or thread target.\",\n \"8. `wm member find` -- Find platform members by Feishu open_id.\",\n \"9. `wm task list` -- View task messages for a channel or relevant target.\",\n \"10. `wm task claim` -- Claim a task before doing work that changes files, runs tools, or performs multi-step investigation.\",\n \"11. `wm task unclaim` -- Release a task you cannot or should not continue.\",\n \"12. `wm task update` -- Move a task through statuses such as todo, in_progress, in_review, and done.\",\n \"13. `wm task create` -- Create genuine new follow-up work when no canonical message/task exists.\",\n \"14. `wm attachment upload` -- Upload a local artifact and reference it in a platform message.\",\n \"15. `wm attachment view` -- Download and inspect a platform attachment.\",\n \"16. `wm profile show` -- Inspect your own profile or a visible human/agent profile.\",\n \"17. `wm profile update` -- Update your display name, description, or avatar when explicitly asked.\",\n \"18. `wm reminder schedule` -- Schedule a platform-visible reminder for follow-up work.\",\n \"19. `wm reminder list` -- List reminders and their lifecycle history.\",\n \"20. `wm reminder snooze` -- Push an existing reminder later.\",\n \"21. `wm reminder update` -- Change a reminder without creating a duplicate.\",\n \"22. `wm reminder cancel` -- Cancel a reminder that is no longer needed.\",\n \"\",\n \"Diagnostic command:\",\n \"\",\n \"- `wm auth whoami` prints the current platform identity and server URL.\",\n \"- Use `--json` on wm commands only when you need machine-readable output; default output is optimized for agent collaboration.\",\n \"- Use platform communication commands as the only channel for channel/task-visible communication. Runtime stdout/final answers are daemon transport details, not the long-term platform protocol.\",\n \"\",\n \"## Work Surface Routing\",\n \"\",\n \"First identify where the requested work must happen, then choose the tool for that surface.\",\n \"\",\n \"- Wage Mule platform: use `wm` for channel replies, DMs, thread collaboration, tasks, attachments, profiles, reminders, and questions directed at other platform agents.\",\n \"- Local workspace: use normal filesystem and shell tools for code, documents, local diagnostics, and verification.\",\n \"- External systems: use the relevant installed workspace skill, token, CLI, or API for tools outside Wage Mule, such as Feishu/Lark.\",\n \"- Do not turn external-contact requests into platform mentions. If the user asks you to contact a person through an external system, use that external system and then report the result back to the original platform thread.\",\n \"- If a request needs both surfaces, do the external work on the external surface and use `wm message send` only for the platform-visible progress or final report.\",\n \"\",\n \"## CRITICAL RULES\",\n \"\",\n \"- Other agents may be running on different machines. Do not use local processes, workspaces, server activity, task lists, or runtime sessions to answer what another agent is doing.\",\n \"- When a human asks you to ask, check, confirm, contact, or get status from another platform agent, your first platform action is to ask that agent in the original message thread with `wm message send --target \\\"#channel:<message>\\\"` and an @mention.\",\n \"- When the request explicitly calls for a private agent DM, use `wm dm send --to-agent-id <agent_id>` instead of a thread mention.\",\n \"- Wait for that agent's platform reply via delivered messages, `wm message check`, or recent unread output; then summarize the reply in the same thread.\",\n \"- `wm server info`, `wm channel members`, and `wm task list` are discovery tools. They are not authoritative answers for another agent's current work.\",\n \"\",\n \"## Startup sequence\",\n \"\",\n \"1. If the current turn includes a concrete incoming user/platform message, decide whether it needs a quick acknowledgment, blocker question, or ownership signal before deep work.\",\n \"2. Read `MEMORY.md` before handling normal work. Then read only the additional notes or repository files needed for this turn.\",\n \"3. If the message asks for multi-step work, update the Active Context section in `MEMORY.md` before diving deep when interruption would lose important state.\",\n \"4. If the message asks you to take action beyond a simple answer, claim the task when `wm task claim` is available before starting substantial work.\",\n \"5. Complete the requested work end to end when feasible: inspect context, make changes if needed, run verification, then report the result.\",\n \"6. After significant work or learning, update `notes/` and then update `MEMORY.md` so future resumes can recover the context.\",\n \"7. At natural breakpoints in long work, check for platform messages when `wm message check` is available.\",\n \"8. Before stopping, send or return one concise summary containing result, verification, blockers, and next relevant path.\",\n \"\",\n \"## Messaging model\",\n \"\",\n \"Platform messages may come from channels, DMs, or threads. Server-delivered messages carry structured target, message id, timestamp, sender kind, and sender identity. Reply in the same target unless the platform explicitly asks for a different surface. For channel main messages that start a collaboration, create or use that message's thread target.\",\n \"\",\n \"Target examples:\",\n \"\",\n \"```text\",\n \"[target=#all msg=a1b2c3d4 time=2026-03-15T01:00:00 type=human] @user: hello\",\n \"[target=#all:a1b2c3d4 msg=f3a4b5c6 time=2026-03-15T01:00:03 type=human] @user: thread reply\",\n \"[target=dm:@user msg=c9d0e1f2 time=2026-03-15T01:00:02 type=human] @user: can you help?\",\n \"```\",\n \"\",\n \"- Reuse the exact target when replying in a future `wm message send` call.\",\n \"- Treat system messages as state changes; do not reply unless they clearly request action.\",\n \"- Keep private channel or DM context inside that authorized surface.\",\n \"- When a user references prior platform discussion, search/read history first once `wm message search` and `wm message read` are available.\",\n \"\",\n \"## Tasks\",\n \"\",\n \"A message is work when fulfilling it requires tool use, code changes, file edits, investigation, deployment, or multi-step execution. When task commands are available:\",\n \"\",\n \"- Claim before starting substantial work.\",\n \"- If claiming fails, stop work on that task and report or pick another task only if instructed.\",\n \"- Post progress in the task thread for multi-step work.\",\n \"- Prefer updating an existing task over creating duplicates.\",\n \"- Move finished work to review/done according to platform workflow.\",\n \"- Split large work into independent subtasks only when it genuinely enables parallel execution.\",\n \"\",\n \"## Communication style\",\n \"\",\n \"- Be concise, concrete, and transparent about blockers.\",\n \"- For multi-step work, provide brief progress updates when platform messaging is available.\",\n \"- Do not flood channels with idle narration.\",\n \"- Do not summarize another agent's owned work unless explicitly asked.\",\n \"- Keep URLs next to non-English punctuation wrapped in angle brackets or markdown links.\",\n \"\",\n \"## Workspace & Memory\",\n \"\",\n \"- The Agent Directory belongs only to this platform-created agent.\",\n \"- The daemon starts the runtime with the Agent Directory as cwd; files created by relative path stay inside this workspace.\",\n \"- `MEMORY.md` is the recovery index for who you are, what you know, what is active, and where detailed notes live.\",\n \"- Keep `MEMORY.md` concise. Use it as a table of contents and active recovery point, not as an unbounded transcript.\",\n \"- Create or update files under `notes/` for detailed durable knowledge such as user preferences, work history, channel context, and domain notes.\",\n \"- Suggested note files: `notes/user-preferences.md`, `notes/work-log.md`, `notes/channels.md`, and `notes/<domain>.md`.\",\n \"- After significant work or learning, update `notes/` and then update `MEMORY.md` to link or summarize the new durable context.\",\n \"- Before long work, update the Active Context section in `MEMORY.md` enough that you can resume after interruption or context compression.\",\n \"- Do not import local sessions, agents, profiles, memories, or identities that were not created by Wage Mule.\",\n \"- Runtime-native session/resume state is owned by the runtime adapter. Use it, but do not rewrite or normalize it unless the daemon explicitly asks.\",\n \"- Do not store secrets, tokens, passwords, private keys, or sensitive credentials in memory, notes, code, or logs.\",\n \"\",\n \"## Safety and permissions\",\n \"\",\n \"- Follow repository AGENTS.md or equivalent local instructions before editing code.\",\n \"- Do not commit, push, deploy, delete important files, or perform externally visible actions unless explicitly instructed.\",\n \"- Do not store secrets, tokens, passwords, or private keys in code, memory, notes, or logs.\",\n \"- If local and platform instructions conflict, prefer the most specific valid instruction and report the conflict.\",\n \"\",\n ...workspaceSkills,\n ].join(\"\\n\");\n}\n\nasync function syncWorkspaceSkills(wmDir: string, feishuEnabled: boolean): Promise<void> {\n const skillsDir = path.join(wmDir, \"skills\");\n await mkdir(skillsDir, { recursive: true });\n for (const template of skillTemplatesForWorkspace()) {\n const targetDir = path.join(skillsDir, template.name);\n await mkdir(targetDir, { recursive: true });\n await writeFile(path.join(targetDir, \"SKILL.md\"), template.content, \"utf8\");\n }\n await rm(path.join(skillsDir, \"lark\"), { recursive: true, force: true });\n if (feishuEnabled) await copyLarksuiteSkills(skillsDir);\n}\n\nasync function copyLarksuiteSkills(skillsDir: string): Promise<void> {\n const sourceDir = await resolveLarksuiteSkillsSourceDir();\n const entries = await readdir(sourceDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith(\"lark-\")) continue;\n await cp(path.join(sourceDir, entry.name), path.join(skillsDir, entry.name), {\n recursive: true,\n force: true,\n });\n }\n}\n\nasync function resolveLarksuiteSkillsSourceDir(): Promise<string> {\n const candidates = [\n path.join(__dirname, \"..\", \"..\", \"vendor\", \"larksuite-cli-skills\"),\n path.join(__dirname, \"skills\", \"larksuite\"),\n ];\n for (const candidate of candidates) {\n try {\n const entries = await readdir(candidate, { withFileTypes: true });\n if (entries.some((entry) => entry.isDirectory() && entry.name === \"lark-im\")) return candidate;\n } catch {\n // Try the next runtime layout.\n }\n }\n throw new Error(\"official Lark/Feishu skills are missing from daemon package\");\n}\n\nasync function buildWorkspaceSkillsSection(input: CreateAgentWorkspaceInput): Promise<string[]> {\n const result = await scanAgentSkills({\n rootDir: input.rootDir,\n serverNamespace: input.serverNamespace,\n machineDirectoryName: input.machineDirectoryName,\n machineId: input.machineId ?? \"\",\n agentDirectoryName: input.agentDirectoryName,\n agentId: input.agentId,\n runtime: input.runtime,\n }).catch(() => ({ global: [], workspace: [] }));\n const skills = result.workspace\n .flatMap((group) => group.skills.map((skill) => ({ group, skill })))\n .filter(({ skill }) => skill.content?.trim());\n if (!skills.length) return [];\n\n const lines = [\n \"## Workspace Skills\",\n \"\",\n \"The following workspace skills are installed by the daemon for this agent. Treat them as active operating instructions when relevant.\",\n \"\",\n ];\n for (const { group, skill } of skills) {\n lines.push(`### ${skill.name}`, \"\");\n lines.push(`- Path: ${skill.path}`);\n lines.push(`- Source: ${group.root}`);\n if (skill.version) lines.push(`- Version: ${skill.version}`);\n if (skill.description) lines.push(`- Description: ${skill.description}`);\n lines.push(\"\", skill.content ?? \"\", \"\");\n }\n return lines;\n}\n\nfunction buildAgentToken(input: CreateAgentWorkspaceInput): string {\n return [\n `WM_DAEMON_SERVER_NAMESPACE=${input.serverNamespace}`,\n ...(input.machineId ? [`WM_DAEMON_MACHINE_ID=${input.machineId}`] : []),\n `WM_DAEMON_SERVER_ID=${input.serverId}`,\n `WM_DAEMON_DAEMON_ID=${input.daemonId}`,\n `WM_DAEMON_AGENT_ID=${input.agentId}`,\n `WM_DAEMON_RUNTIME=${input.runtime}`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildWrapper(wrapperCliPath: string): string {\n return `#!/usr/bin/env bash\nexec ${shellSingleQuote(process.execPath)} ${shellSingleQuote(wrapperCliPath)} \"$@\"\n`;\n}\n\nfunction buildWrapperCli(): string {\n return `#!/usr/bin/env node\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\n\nconst envPath = path.join(__dirname, \"runtime-env\");\nif (fs.existsSync(envPath)) {\n for (const line of fs.readFileSync(envPath, \"utf8\").split(/\\\\n/)) {\n const match = line.match(/^([^=]+)=(.*)$/);\n if (match && !process.env[match[1]]) process.env[match[1]] = match[2];\n }\n}\n\nconst args = process.argv.slice(2);\nconst [group, command] = args;\nconst help = \"Available commands: wm auth whoami; wm message send/check/read/search; wm dm send; wm server info; wm channel members; wm member find; wm task list/claim/unclaim/update/create; wm attachment upload/view; wm profile show/update; wm reminder schedule/list/snooze/update/cancel; wm inbox feishu-draft create/sent/failed\";\n\nfunction valueAfter(name) {\n const index = args.indexOf(name);\n return index === -1 ? undefined : args[index + 1];\n}\n\nfunction hasFlag(name) {\n return args.includes(name);\n}\n\nfunction positionalText() {\n const knownOptions = new Set([\"--target\", \"--channel\", \"--text\", \"--content\", \"--attachment-ids\", \"--query\", \"--q\", \"--around\", \"--status\", \"--id\", \"--task-id\", \"--title\", \"--description\", \"--file\", \"--at\", \"--every\", \"--role\", \"--instructions\", \"--body\", \"--to-agent-id\", \"--timeout\", \"--feishu-open-id\", \"--open-id\", \"--delegation-id\", \"--human-id\", \"--feishu-message-id\", \"--chat-id\", \"--sender-name\", \"--sender-open-id\", \"--original-text\", \"--draft-text\", \"--risk\", \"--message-id\", \"--error\"]);\n const values = [];\n for (let index = 2; index < args.length; index++) {\n const arg = args[index];\n if (knownOptions.has(arg)) {\n index++;\n continue;\n }\n if (!arg.startsWith(\"-\")) values.push(arg);\n }\n return values.join(\" \").trim();\n}\n\nasync function stdin() {\n if (process.stdin.isTTY) return \"\";\n return await new Promise((resolve) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", chunk => data += chunk);\n process.stdin.on(\"end\", () => resolve(data.trim()));\n });\n}\n\nasync function request(method, pathName, body) {\n const serverUrl = process.env.WM_SERVER_URL;\n const token = process.env.WM_AGENT_TOKEN;\n if (!serverUrl || !token) throw new Error(\"WM_SERVER_URL and WM_AGENT_TOKEN are required\");\n const response = await fetch(new URL(pathName, serverUrl), {\n method,\n headers: { authorization: \\`Bearer \\${token}\\`, \"content-type\": \"application/json\" },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n const text = await response.text();\n let payload;\n try { payload = text ? JSON.parse(text) : {}; } catch { payload = { text }; }\n if (!response.ok) throw new Error(payload.error || text || \\`HTTP \\${response.status}\\`);\n return payload;\n}\n\nfunction messageLine(message) {\n const target = message.target || message.read_target || \"#unknown\";\n const id = message.message_id || message.id || \"unknown\";\n const time = message.timestamp || (message.created_at ? new Date(message.created_at).toISOString() : \"\");\n const senderType = message.sender_type || message.author_type || \"unknown\";\n const sender = message.sender_name || message.author_name || message.author_id || \"unknown\";\n const content = message.content || message.text || \"\";\n return \\`[target=\\${target} msg=\\${String(id).slice(0, 12)} time=\\${time} type=\\${senderType}] @\\${sender}: \\${content}\\`;\n}\n\nfunction printResult(payload, text) {\n if (hasFlag(\"--json\")) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n console.log(text);\n }\n}\n\nfunction formatSendResult(result, target) {\n const messageId = result.messageId || result.message?.id || \"unknown\";\n const sentTarget = result.message?.target || target;\n const lines = [\\`Message sent to \\${sentTarget}. Message ID: \\${messageId}\\`];\n if (result.replyTargetHint) lines.push(\\`To reply in this message's thread, use target \"\\${result.replyTargetHint}\".\\`);\n const unread = result.recentUnread || [];\n if (unread.length) {\n lines.push(\"\", \"--- New messages you may have missed ---\");\n for (const message of unread) lines.push(messageLine(message));\n }\n return lines.join(\"\\\\n\");\n}\n\nfunction formatDmSendResult(payload) {\n const messageId = payload.messageId || payload.message?.id || \"unknown\";\n const lines = [\\`DM sent. Message ID: \\${messageId}\\`];\n if (payload.reply) {\n lines.push(\"\", \"--- Reply ---\", messageLine(payload.reply));\n } else if (payload.timed_out) {\n lines.push(\"Timed out waiting for reply.\");\n }\n return lines.join(\"\\\\n\");\n}\n\nfunction formatMessages(payload) {\n const messages = payload.messages || [];\n if (!messages.length) return \"No messages.\";\n return messages.map(messageLine).join(\"\\\\n\");\n}\n\nfunction formatSearch(payload) {\n const results = payload.results || [];\n if (!results.length) return \"No matching messages.\";\n return results.map((item) => \\`\\${messageLine({ ...item.message, target: item.target })}\\\\n hint: \\${item.read_hint}\\`).join(\"\\\\n\");\n}\n\nfunction formatServerInfo(payload) {\n const lines = [\n \\`Agent: \\${payload.identity?.name || payload.identity?.agent_id || \"unknown\"}\\`,\n \\`Runtime: \\${payload.identity?.runtime || \"unknown\"}\\`,\n \"Channels:\",\n ...((payload.channels || payload.channels || []).map((channel) => \\`- #\\${channel.name} (\\${channel.id})\\`)),\n \"Humans:\",\n ...((payload.humans || []).map((human) => \\`- @\\${human.name} (\\${human.id})\\`)),\n \"Agents:\",\n ...((payload.agents || []).map((agent) => \\`- @\\${agent.name} runtime=\\${agent.runtime} channel=\\${agent.channel_id || \"none\"}\\`)),\n \"Machines:\",\n ...((payload.machines || []).map((machine) => \\`- \\${machine.name} status=\\${machine.status} host=\\${machine.hostname}\\`)),\n ];\n return lines.join(\"\\\\n\");\n}\n\nfunction formatMembers(payload) {\n const members = payload.members || [];\n if (!members.length) return \"No visible members.\";\n return members.map((member) => \\`- \\${member.mention} type=\\${member.type}\\${member.runtime ? \\` runtime=\\${member.runtime}\\` : \"\"}\\`).join(\"\\\\n\");\n}\n\nfunction formatMemberFind(payload) {\n const lines = [];\n if (payload.human) {\n lines.push(\\`Human: @\\${payload.human.name} (\\${payload.human.id})\\`);\n if (payload.human.feishu_open_id) lines.push(\\`Feishu open_id: \\${payload.human.feishu_open_id}\\`);\n if (payload.human.email) lines.push(\\`Email: \\${payload.human.email}\\`);\n } else {\n lines.push(\"Human: not found\");\n }\n lines.push(\"Agents:\");\n if (payload.agents?.length) {\n for (const agent of payload.agents) {\n lines.push(\\`- @\\${agent.name} id=\\${agent.agent_id} runtime=\\${agent.runtime} machine=\\${agent.machine_id} \\${agent.online ? \"online\" : \"offline\"}\\`);\n }\n } else {\n lines.push(\"- none\");\n }\n return lines.join(\"\\\\n\");\n}\n\nfunction formatInboxDraft(payload, fallback) {\n const item = payload.item || {};\n return \\`\\${fallback}: \\${item.id || \"unknown\"} status=\\${item.status || \"unknown\"}\\`;\n}\n\nasync function main() {\n const agentId = process.env.WM_AGENT_ID || process.env.WM_DAEMON_AGENT_ID;\n if (group === \"auth\" && command === \"whoami\") {\n console.log(JSON.stringify({\n agentId,\n serverUrl: process.env.WM_SERVER_URL,\n serverNamespace: process.env.WM_DAEMON_SERVER_NAMESPACE,\n serverId: process.env.WM_DAEMON_SERVER_ID,\n daemonId: process.env.WM_DAEMON_DAEMON_ID,\n runtime: process.env.WM_DAEMON_RUNTIME\n }, null, 2));\n return;\n }\n if (!agentId) throw new Error(\"WM_AGENT_ID is required\");\n if (group === \"message\" && command === \"send\") {\n const target = valueAfter(\"--target\");\n const text = (valueAfter(\"--text\") || valueAfter(\"--content\") || await stdin() || positionalText()).trim();\n if (!text) throw new Error(\"message text is required; use --text, --content, stdin, or a positional message\");\n const attachmentIds = (valueAfter(\"--attachment-ids\") || \"\").split(\",\").map(s => s.trim()).filter(Boolean);\n const body = { text, attachment_ids: attachmentIds };\n if (target) body.target = target;\n const result = await request(\"POST\", \\`/internal/agent/\\${agentId}/send\\`, body);\n const payload = {\n message: result.message,\n messageId: result.messageId,\n replyTargetHint: result.replyTargetHint,\n recentUnread: result.recentUnread || []\n };\n printResult(payload, formatSendResult(payload, target));\n return;\n }\n if (group === \"dm\" && command === \"send\") {\n const toAgentId = valueAfter(\"--to-agent-id\");\n if (!toAgentId) throw new Error(\"--to-agent-id is required\");\n const text = (valueAfter(\"--text\") || valueAfter(\"--content\") || await stdin() || positionalText()).trim();\n if (!text) throw new Error(\"message text is required; use --text, --content, stdin, or a positional message\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/dm/send\\`, {\n to_agent_id: toAgentId,\n text,\n wait_for_reply: hasFlag(\"--wait-for-reply\"),\n timeout_ms: valueAfter(\"--timeout\") ? Number(valueAfter(\"--timeout\")) : undefined,\n });\n printResult(payload, formatDmSendResult(payload));\n return;\n }\n if (group === \"message\" && command === \"check\") {\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/receive\\`);\n printResult(payload, formatMessages(payload).replace(\"No messages.\", \"No new messages.\"));\n return;\n }\n if (group === \"message\" && command === \"read\") {\n const channel = valueAfter(\"--channel\") || valueAfter(\"--target\");\n const around = valueAfter(\"--around\");\n const params = new URLSearchParams();\n if (channel) params.set(\"target\", channel);\n if (around) params.set(\"around\", around);\n const suffix = params.toString() ? \\`?\\${params.toString()}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/history\\${suffix}\\`);\n printResult(payload, formatMessages(payload));\n return;\n }\n if (group === \"message\" && command === \"search\") {\n const query = valueAfter(\"--query\") || valueAfter(\"--q\") || positionalText();\n if (!query) throw new Error(\"--query is required\");\n const target = valueAfter(\"--target\") || valueAfter(\"--channel\");\n const params = new URLSearchParams({ query });\n if (target) params.set(\"target\", target);\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/search?\\${params.toString()}\\`);\n printResult(payload, formatSearch(payload));\n return;\n }\n if (group === \"server\" && command === \"info\") {\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/server\\`);\n printResult(payload, formatServerInfo(payload));\n return;\n }\n if ((group === \"channel\" || group === \"channel\") && command === \"members\") {\n const target = valueAfter(\"--target\") || valueAfter(\"--channel\");\n const params = target ? \\`?target=\\${encodeURIComponent(target)}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/channel/members\\${params}\\`);\n printResult(payload, formatMembers(payload));\n return;\n }\n if (group === \"member\" && command === \"find\") {\n const openId = (valueAfter(\"--feishu-open-id\") || valueAfter(\"--open-id\") || \"\").trim();\n if (!openId) throw new Error(\"--feishu-open-id is required\");\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/members/find?feishu_open_id=\\${encodeURIComponent(openId)}\\`);\n printResult(payload, formatMemberFind(payload));\n return;\n }\n if (group === \"inbox\" && command === \"feishu-draft\") {\n const action = args[2];\n if (action === \"create\") {\n const draftText = (valueAfter(\"--draft-text\") || await stdin()).trim();\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/inbox/feishu-draft\\`, {\n delegation_id: valueAfter(\"--delegation-id\"),\n human_id: valueAfter(\"--human-id\"),\n feishu_message_id: valueAfter(\"--feishu-message-id\"),\n chat_id: valueAfter(\"--chat-id\"),\n sender_name: valueAfter(\"--sender-name\"),\n sender_open_id: valueAfter(\"--sender-open-id\"),\n original_text: valueAfter(\"--original-text\"),\n draft_text: draftText,\n risk: valueAfter(\"--risk\"),\n });\n printResult(payload, formatInboxDraft(payload, \"Feishu draft created\"));\n return;\n }\n if (action === \"sent\") {\n const inboxId = valueAfter(\"--id\");\n if (!inboxId) throw new Error(\"--id is required\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/inbox/feishu-draft/\\${encodeURIComponent(inboxId)}/sent\\`, {\n message_id: valueAfter(\"--message-id\"),\n });\n printResult(payload, formatInboxDraft(payload, \"Feishu draft sent\"));\n return;\n }\n if (action === \"failed\") {\n const inboxId = valueAfter(\"--id\");\n if (!inboxId) throw new Error(\"--id is required\");\n const error = (valueAfter(\"--error\") || await stdin()).trim();\n if (!error) throw new Error(\"--error is required\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/inbox/feishu-draft/\\${encodeURIComponent(inboxId)}/failed\\`, { error });\n printResult(payload, formatInboxDraft(payload, \"Feishu draft failed\"));\n return;\n }\n }\n if (group === \"task\" && command === \"list\") {\n const status = valueAfter(\"--status\");\n const suffix = status ? \\`?status=\\${encodeURIComponent(status)}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/tasks\\${suffix}\\`);\n const tasks = payload.tasks || [];\n printResult(payload, tasks.length ? tasks.map((task) => \\`- \\${task.id} [\\${task.status}] \\${task.title}\\`).join(\"\\\\n\") : \"No tasks.\");\n return;\n }\n if (group === \"task\" && command === \"claim\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/claim\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\") });\n printResult(payload, \\`Task claimed: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"task\" && command === \"unclaim\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/unclaim\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\") });\n printResult(payload, \\`Task unclaimed: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"task\" && command === \"update\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/update\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\"), status: valueAfter(\"--status\") });\n printResult(payload, \\`Task updated: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"task\" && command === \"create\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/task/create\\`, { target: valueAfter(\"--target\"), title: valueAfter(\"--title\"), description: valueAfter(\"--description\") || await stdin() });\n printResult(payload, \\`Task created: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n return;\n }\n if (group === \"attachment\" && command === \"upload\") {\n const file = valueAfter(\"--file\");\n if (!file) throw new Error(\"--file is required\");\n const buffer = fs.readFileSync(file);\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/upload\\`, {\n filename: path.basename(file),\n mime_type: \"application/octet-stream\",\n content_base64: buffer.toString(\"base64\")\n });\n printResult(payload, \\`Attachment uploaded: \\${payload.attachment?.id || \"unknown\"} \\${payload.attachment?.filename || \"\"}\\`);\n return;\n }\n if (group === \"attachment\" && command === \"view\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/download-attachment\\`, { attachment_id: valueAfter(\"--id\") });\n printResult(payload, \\`Attachment: \\${payload.attachment?.filename || payload.attachment?.id || \"unknown\"} size=\\${payload.attachment?.size || 0}\\\\n\\${payload.content_base64 || \"\"}\\`);\n return;\n }\n if (group === \"profile\" && command === \"show\") {\n const target = valueAfter(\"--target\");\n const params = target ? \\`?target=\\${encodeURIComponent(target)}\\` : \"\";\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/profile\\${params}\\`);\n printResult(payload, Object.entries(payload.profile || {}).map(([key, value]) => \\`\\${key}: \\${value}\\`).join(\"\\\\n\"));\n return;\n }\n if (group === \"profile\" && command === \"update\") {\n const payload = await request(\"PATCH\", \\`/internal/agent/\\${agentId}/profile\\`, { role: valueAfter(\"--role\") || valueAfter(\"--description\"), instructions: valueAfter(\"--instructions\") || await stdin() });\n printResult(payload, \"Profile updated.\");\n return;\n }\n if (group === \"profile\" && command === \"migration-ack\") {\n const key = valueAfter(\"--key\");\n if (!key) throw new Error(\"--key is required\");\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/runtime-profile/migration-ack\\`, { migration_key: key });\n printResult(payload, \"Migration acknowledged.\");\n return;\n }\n if (group === \"reminder\" && command === \"schedule\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder\\`, { title: valueAfter(\"--title\"), fire_at: valueAfter(\"--at\"), recurrence: valueAfter(\"--every\") });\n printResult(payload, \\`Reminder scheduled: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n return;\n }\n if (group === \"reminder\" && command === \"list\") {\n const payload = await request(\"GET\", \\`/internal/agent/\\${agentId}/reminders\\`);\n const reminders = payload.reminders || [];\n printResult(payload, reminders.length ? reminders.map((reminder) => \\`- \\${reminder.id} [\\${reminder.status}] \\${reminder.title} at \\${reminder.fire_at}\\`).join(\"\\\\n\") : \"No reminders.\");\n return;\n }\n if (group === \"reminder\" && command === \"snooze\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder/snooze\\`, { reminder_id: valueAfter(\"--id\"), fire_at: valueAfter(\"--at\") });\n printResult(payload, \\`Reminder snoozed: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n return;\n }\n if (group === \"reminder\" && command === \"update\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder/update\\`, { reminder_id: valueAfter(\"--id\"), title: valueAfter(\"--title\"), body: valueAfter(\"--body\"), fire_at: valueAfter(\"--at\"), recurrence: valueAfter(\"--every\") });\n printResult(payload, \\`Reminder updated: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n return;\n }\n if (group === \"reminder\" && command === \"cancel\") {\n const payload = await request(\"POST\", \\`/internal/agent/\\${agentId}/reminder/cancel\\`, { reminder_id: valueAfter(\"--id\") });\n printResult(payload, \\`Reminder cancelled: \\${payload.reminder?.id || \"unknown\"}\\`);\n return;\n }\n console.error(\"Unknown wm command\");\n process.exit(2);\n}\n\nmain().catch((error) => {\n console.error(error && error.message ? error.message : String(error));\n process.exit(1);\n});\n`;\n}\n", "import { readdir, readFile, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentSkillDescriptor, AgentSkillGroup, RuntimeId } from \"@claude-console/shared\";\n\nexport interface ScanAgentSkillsInput {\n homeDir?: string;\n rootDir: string;\n serverNamespace: string;\n machineDirectoryName?: string;\n machineId: string;\n agentDirectoryName?: string;\n agentId: string;\n runtime: RuntimeId;\n}\n\nexport interface AgentSkillScanResult {\n global: AgentSkillGroup[];\n workspace: AgentSkillGroup[];\n}\n\nexport async function scanAgentSkills(input: ScanAgentSkillsInput): Promise<AgentSkillScanResult> {\n const homeDir = input.homeDir ?? os.homedir();\n const workspaceDir = input.machineDirectoryName\n ? path.join(input.rootDir, input.machineDirectoryName, input.agentDirectoryName ?? input.agentId)\n : path.join(input.rootDir, input.serverNamespace, input.machineId, input.agentId);\n return {\n global: await scanGroupedSkillRoots(runtimeSkillRoots(homeDir, input.runtime), \"global\"),\n workspace: await scanGroupedSkillRoots(workspaceSkillRoots(workspaceDir, input.runtime), \"workspace\"),\n };\n}\n\nfunction runtimeSkillRoots(homeDir: string, runtime: RuntimeId): Array<{ abs: string; label: string }> {\n if (runtime === \"claude\") {\n return [\n { abs: path.join(homeDir, \".claude\", \"skills\"), label: \"~/.claude/skills\" },\n { abs: path.join(homeDir, \".claude\", \"commands\"), label: \"~/.claude/commands\" },\n ];\n }\n if (runtime === \"codex\") return [\n { abs: path.join(homeDir, \".codex\", \"skills\"), label: \"~/.codex/skills\" },\n { abs: path.join(homeDir, \".codex\", \"skills\", \".system\"), label: \"~/.codex/skills/.system\" },\n { abs: path.join(homeDir, \".agents\", \"skills\"), label: \"~/.agents/skills\" },\n ];\n return [\n { abs: path.join(homeDir, \".codex\", \"skills\"), label: \"~/.codex/skills\" },\n { abs: path.join(homeDir, \".agents\", \"skills\"), label: \"~/.agents/skills\" },\n ];\n}\n\nfunction workspaceSkillRoots(workspaceDir: string, runtime: RuntimeId): Array<{ abs: string; label: string }> {\n const platform = [{ abs: path.join(workspaceDir, \".wm\", \"skills\"), label: \".wm/skills\" }];\n if (runtime === \"claude\") {\n return [\n { abs: path.join(workspaceDir, \".claude\", \"skills\"), label: \".claude/skills\" },\n { abs: path.join(workspaceDir, \".claude\", \"commands\"), label: \".claude/commands\" },\n ...platform,\n ];\n }\n return [\n { abs: path.join(workspaceDir, \".codex\", \"skills\"), label: \".codex/skills\" },\n { abs: path.join(workspaceDir, \".agents\", \"skills\"), label: \".agents/skills\" },\n ...platform,\n ];\n}\n\nasync function scanGroupedSkillRoots(\n roots: Array<{ abs: string; label: string }>,\n source: AgentSkillGroup[\"source\"]\n): Promise<AgentSkillGroup[]> {\n const groups = await Promise.all(roots.map(async (root) => {\n const skills = await scanSkillRoot(root.abs, root.label);\n return skills.length ? { source, root: root.label, skills } : null;\n }));\n return groups.filter((group): group is AgentSkillGroup => Boolean(group));\n}\n\nasync function scanSkillRoot(absRoot: string, labelRoot: string): Promise<AgentSkillDescriptor[]> {\n const entries = await readdir(absRoot, { withFileTypes: true }).catch((error) => {\n if (error?.code === \"ENOENT\") return [];\n throw error;\n });\n const skills: AgentSkillDescriptor[] = [];\n const seen = new Set<string>();\n for (const entry of entries) {\n let name = \"\";\n let skillFile = \"\";\n let skillPath = \"\";\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n if (entry.name === \".system\") continue;\n name = entry.name;\n skillFile = path.join(absRoot, entry.name, \"SKILL.md\");\n skillPath = `${labelRoot}/${entry.name}`;\n } else if (entry.name.endsWith(\".md\")) {\n name = entry.name.replace(/\\.md$/, \"\");\n skillFile = path.join(absRoot, entry.name);\n skillPath = `${labelRoot}/${entry.name}`;\n } else {\n continue;\n }\n if (seen.has(name) || !(await existsFile(skillFile))) continue;\n seen.add(name);\n const meta = await readSkillMeta(skillFile);\n skills.push({\n name,\n path: skillPath,\n description: meta.description,\n version: meta.version,\n content: meta.content,\n updatedAt: meta.updatedAt,\n });\n }\n return skills.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nasync function existsFile(filePath: string): Promise<boolean> {\n return stat(filePath).then((info) => info.isFile()).catch(() => false);\n}\n\nasync function readSkillMeta(filePath: string): Promise<{\n description?: string;\n version?: string;\n content?: string;\n updatedAt?: number;\n}> {\n const text = await readFile(filePath, \"utf8\").catch(() => \"\");\n if (!text) return {};\n const match = text.match(/^description:\\s*(.+)$/m);\n const version = text.match(/^version:\\s*(.+)$/m)?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n const description = match?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\")\n ?? text.split(/\\r?\\n/).find((line) => line.trim() && !line.startsWith(\"#\"))?.trim();\n const updatedAt = await stat(filePath).then((info) => info.mtimeMs).catch(() => undefined);\n return { description, version, content: text, updatedAt };\n}\n", "export interface WorkspaceSkillTemplate {\n name: string;\n content: string;\n}\n\nconst WM_PLATFORM_SKILL = `---\ndescription: WM platform tools\nversion: 0.1.0\n---\n# wm-platform\n\nUse this skill whenever you need to interact with Wage Mule platform state: channel messages, threads, DMs, tasks, attachments, profiles, reminders, server membership, or collaboration with another agent.\n\n## Core rules\n\n- Use \\`wm message send\\` for platform-visible replies.\n- Use the exact target from delivered messages when replying.\n- For channel requests that ask you to contact another agent, reply in the original message thread and @mention the target agent there.\n- Do not answer what another agent is doing by inspecting local processes or workspace files.\n- Use \\`wm message check\\` at natural breakpoints in long work.\n- Use \\`wm task claim\\` before substantial multi-step platform work.\n\n## Common commands\n\n- \\`wm auth whoami\\`\n- \\`wm message check\\`\n- \\`wm message read --target <target>\\`\n- \\`wm message send --target <target> --text <text>\\`\n- \\`wm server info\\`\n- \\`wm channel members --target <target>\\`\n- \\`wm task list --target <target>\\`\n- \\`wm task claim --id <task-id>\\`\n- \\`wm task update --id <task-id> --status <status>\\`\n`;\n\nexport function skillTemplatesForWorkspace(): WorkspaceSkillTemplate[] {\n return [{ name: \"wm-platform\", content: WM_PLATFORM_SKILL }];\n}\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { stdin as defaultInput, stdout as defaultOutput } from \"node:process\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { RuntimeAdapter, RuntimeEvent, RuntimeRunResult } from \"../runtime/adapter\";\nimport type { RuntimeDoctorResult } from \"../runtime/doctor\";\nimport { doctorRuntimes } from \"../runtime/doctor\";\nimport { createRuntimeAdapter } from \"../runtime/registry\";\nimport { supportedRuntimeIds, type RuntimeId } from \"../runtime/capabilities\";\nimport {\n clearLabServerCache,\n createLabAgent,\n defaultLabRootDir,\n defaultLabServerNamespace,\n listLabAgents,\n readLastRuntimeSessionId,\n recordLabRun,\n type LabAgent,\n} from \"./lab-store\";\nimport {\n PromptDriver,\n normalizeTerminalLine,\n shouldUseTerminalEditing,\n} from \"./lab-prompts\";\nimport {\n createLabUi,\n formatTable,\n heading,\n kv,\n shortPath,\n statusLabel,\n type LabUi,\n} from \"./lab-ui\";\n\nexport { normalizeTerminalLine, shouldUseTerminalEditing };\n\nexport interface InteractiveLabOptions {\n rootDir?: string;\n serverNamespace?: string;\n input?: Readable;\n output?: Writable;\n timeoutMs?: number;\n doctor?: typeof doctorRuntimes;\n adapterFactory?: (runtime: RuntimeId) => RuntimeAdapter;\n}\n\ninterface LabContext {\n rootDir: string;\n serverNamespace: string;\n prompt?: PromptDriver;\n output: Writable;\n input: Readable;\n ui: LabUi;\n timeoutMs: number;\n doctors: RuntimeDoctorResult[];\n doctor: typeof doctorRuntimes;\n adapterFactory: (runtime: RuntimeId) => RuntimeAdapter;\n}\n\nexport async function runInteractiveLab(\n options: InteractiveLabOptions = {}\n): Promise<void> {\n const output = options.output ?? defaultOutput;\n const outputIsTty = Boolean((output as { isTTY?: boolean }).isTTY);\n const context: LabContext = {\n rootDir: options.rootDir ?? defaultLabRootDir,\n serverNamespace: options.serverNamespace ?? defaultLabServerNamespace,\n input: options.input ?? defaultInput,\n output,\n ui: createLabUi({ color: outputIsTty && !process.env.NO_COLOR }),\n timeoutMs: options.timeoutMs ?? 180000,\n doctors: [],\n doctor: options.doctor ?? doctorRuntimes,\n adapterFactory: options.adapterFactory ?? createRuntimeAdapter,\n };\n\n try {\n printHeader(context);\n await clearLabServerCache(context.rootDir, context.serverNamespace);\n writeLine(context, context.ui.dim(`cleared ${shortPath(path.join(context.rootDir, context.serverNamespace))}`));\n context.doctors = await context.doctor();\n printDoctors(context);\n context.prompt = new PromptDriver(context.input, output);\n await mainMenu(context);\n } catch (error) {\n if (isPromptExitError(error)) {\n writeLine(context, \"\");\n writeLine(context, context.ui.muted(\"closed\"));\n return;\n }\n throw error;\n } finally {\n context.prompt?.close();\n }\n}\n\nasync function mainMenu(context: LabContext): Promise<void> {\n for (;;) {\n const action = await choose(context, \"Main\", [\n { label: \"Create agent\", value: \"create agent\" },\n { label: \"List agents\", value: \"list agents\" },\n { label: \"Agent detail\", value: \"agent detail\" },\n { label: \"Chat with agent\", value: \"chat with agent\" },\n { label: \"Doctor runtimes\", value: \"doctor runtimes\" },\n { label: \"Quit\", value: \"quit\" },\n ]);\n\n if (action === \"create agent\") {\n await createAgentFlow(context);\n } else if (action === \"list agents\") {\n await listAgentsFlow(context);\n } else if (action === \"agent detail\") {\n await agentDetailFlow(context);\n } else if (action === \"chat with agent\") {\n await chatFlow(context);\n } else if (action === \"doctor runtimes\") {\n context.doctors = await context.doctor();\n printDoctors(context);\n } else {\n return;\n }\n }\n}\n\nasync function createAgentFlow(context: LabContext): Promise<void> {\n const runtime = await chooseRuntime(context);\n const agentName = await askRequired(context, \"Agent name\");\n const description = await askRequired(context, \"Description\");\n const agent = await createLabAgent({\n rootDir: context.rootDir,\n serverNamespace: context.serverNamespace,\n runtime,\n agentName,\n description,\n });\n\n writeLine(context, \"\");\n writeLine(context, `${context.ui.good(\"created\")} ${agent.agentName} ${context.ui.muted(`(${agent.agentId})`)}`);\n printAgentDetail(context, agent);\n}\n\nasync function listAgentsFlow(context: LabContext): Promise<void> {\n const agents = await listLabAgents(context.rootDir, context.serverNamespace);\n writeLine(context, \"\");\n if (agents.length === 0) {\n writeLine(context, context.ui.muted(\"No agents yet.\"));\n return;\n }\n writeLine(context, heading(context.ui, \"Agents\"));\n writeLine(context, formatTable([\n [\"NAME\", \"RUNTIME\", \"STATUS\", \"CWD\"],\n ...agents.map((agent) => {\n const doctor = findDoctor(context, agent.runtime);\n return [\n agent.agentName,\n agent.runtime,\n statusLabel(context.ui, doctor?.status ?? \"unknown\"),\n shortPath(agent.cwd),\n ];\n }),\n ]));\n}\n\nasync function agentDetailFlow(context: LabContext): Promise<void> {\n const agent = await selectAgent(context);\n if (!agent) return;\n printAgentDetail(context, agent);\n}\n\nasync function chatFlow(context: LabContext): Promise<void> {\n const agent = await selectAgent(context);\n if (!agent) return;\n const adapter = context.adapterFactory(agent.runtime);\n\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, `Chat ${agent.agentName} / ${agent.runtime}`));\n writeLine(context, kv(context.ui, \"CWD\", shortPath(agent.cwd)));\n writeLine(context, kv(context.ui, \"Exit\", \"exit, quit, /exit, /quit, /back\"));\n\n for (;;) {\n const prompt = await ask(context, \"you\");\n if (!prompt.trim()) continue;\n if (isChatExitCommand(prompt)) return;\n\n const systemPrompt = await readFile(agent.workspace.systemPromptPath, \"utf8\");\n const runtimeSessionId = await readLastRuntimeSessionId(agent);\n const renderer = createRealtimeRenderer(context);\n writeLine(context, \"\");\n writeLine(context, `${context.ui.muted(\"run\")} ${context.ui.warn(\"started\")}`);\n if (runtimeSessionId) {\n writeLine(context, `${context.ui.muted(\"session\")} resume ${runtimeSessionId}`);\n }\n\n const result = await adapter.run({\n agentId: agent.agentId,\n cwd: agent.cwd,\n prompt,\n systemPrompt,\n systemPromptPath: agent.workspace.systemPromptPath,\n runtimeSessionId,\n timeoutMs: context.timeoutMs,\n onEvent: renderer.onEvent,\n });\n renderer.flush();\n await printResultAndRecord(context, agent, prompt, result);\n }\n}\n\nfunction isChatExitCommand(value: string): boolean {\n return [\"exit\", \"quit\", \"/exit\", \"/quit\", \"/back\"].includes(\n value.trim().toLowerCase()\n );\n}\n\nasync function printResultAndRecord(\n context: LabContext,\n agent: LabAgent,\n prompt: string,\n result: RuntimeRunResult\n): Promise<void> {\n writeLine(context, \"\");\n writeLine(context, `${context.ui.muted(\"run\")} ${statusLabel(context.ui, result.status)}`);\n if (result.runtimeSessionId) {\n writeLine(context, `${context.ui.muted(\"session\")} ${result.runtimeSessionId}`);\n }\n if (result.finalMessage.trim()) {\n writeLine(context, \"\");\n writeLine(context, context.ui.muted(\"assistant final\"));\n writeLine(context, result.finalMessage.trim());\n }\n if (result.errorMessage) {\n writeLine(context, \"\");\n writeLine(context, \"error:\");\n writeLine(context, result.errorMessage);\n }\n const runPath = await recordLabRun({ agent, prompt, result });\n writeLine(context, \"\");\n writeLine(context, kv(context.ui, \"log\", shortPath(runPath)));\n writeLine(context, kv(context.ui, \"agent dir\", shortPath(agent.workspace.agentDir)));\n writeLine(context, kv(context.ui, \"cwd\", shortPath(agent.cwd)));\n}\n\nasync function selectAgent(context: LabContext): Promise<LabAgent | undefined> {\n const agents = await listLabAgents(context.rootDir, context.serverNamespace);\n if (agents.length === 0) {\n writeLine(context, \"\");\n writeLine(context, \"No agents yet. Create one first.\");\n return undefined;\n }\n const value = await choose(\n context,\n \"Select agent\",\n agents.map((agent) => ({\n label: `${agent.agentName} (${agent.runtime})`,\n value: agent.agentId,\n }))\n );\n return agents.find((agent) => agent.agentId === value);\n}\n\nasync function chooseRuntime(context: LabContext): Promise<RuntimeId> {\n return choose(context, \"Runtime\", supportedRuntimeIds.map((runtime) => {\n const doctor = findDoctor(context, runtime);\n return {\n label: `${runtime} ${statusLabel(context.ui, doctor?.status ?? \"unknown\")}${\n doctor?.version ? ` ${context.ui.muted(doctor.version)}` : \"\"\n }`,\n value: runtime,\n };\n }));\n}\n\nfunction printDoctors(context: LabContext): void {\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, \"Runtime adapters\"));\n writeLine(context, formatTable([\n [\"STATUS\", \"RUNTIME\", \"VERSION\"],\n ...context.doctors.map((result) => [\n statusLabel(context.ui, result.status),\n result.runtime,\n result.version ?? context.ui.muted(\"-\"),\n ]),\n ]));\n}\n\nfunction printAgentDetail(context: LabContext, agent: LabAgent): void {\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, \"Agent\"));\n writeLine(context, kv(context.ui, \"Name\", agent.agentName));\n writeLine(context, kv(context.ui, \"ID\", agent.agentId));\n writeLine(context, kv(context.ui, \"Description\", agent.description));\n writeLine(context, kv(context.ui, \"Runtime\", agent.runtime));\n writeLine(context, kv(context.ui, \"Server\", agent.serverNamespace));\n writeLine(context, kv(context.ui, \"Agent dir\", shortPath(agent.workspace.agentDir)));\n writeLine(context, kv(context.ui, \"CWD\", shortPath(agent.cwd)));\n writeLine(context, \"\");\n writeLine(context, heading(context.ui, \"Files\"));\n writeLine(context, kv(context.ui, \"MEMORY\", shortPath(agent.workspace.memoryPath)));\n writeLine(context, kv(context.ui, \"Notes\", shortPath(agent.workspace.notesDir)));\n writeLine(context, kv(context.ui, \"Prompt\", shortPath(agent.workspace.systemPromptPath)));\n writeLine(context, kv(context.ui, \"Sessions\", shortPath(agent.workspace.runtimeSessionsDir)));\n writeLine(context, kv(context.ui, \"Wrapper\", shortPath(agent.workspace.wrapperPath)));\n}\n\nasync function choose<T extends string>(\n context: LabContext,\n title: string,\n options: Array<{ label: string; value: T }>\n): Promise<T> {\n if (!context.prompt) throw new Error(\"Interactive lab input is not initialized\");\n return context.prompt.choose(\n title,\n options.map((option) => ({ name: option.label, value: option.value }))\n );\n}\n\nasync function askRequired(context: LabContext, label: string): Promise<string> {\n for (;;) {\n const value = await ask(context, label);\n if (value.trim()) return value.trim();\n writeLine(context, `${label} is required.`);\n }\n}\n\nasync function ask(context: LabContext, label: string): Promise<string> {\n if (!context.prompt) throw new Error(\"Interactive lab input is not initialized\");\n return context.prompt.inputText(label);\n}\n\nfunction findDoctor(\n context: LabContext,\n runtime: RuntimeId\n): RuntimeDoctorResult | undefined {\n return context.doctors.find((item) => item.runtime === runtime);\n}\n\nfunction createRealtimeRenderer(context: LabContext): {\n onEvent(event: RuntimeEvent): void;\n flush(): void;\n} {\n let stdoutBuffer = \"\";\n\n return {\n onEvent(event) {\n if (event.type === \"assistant_delta\" && event.content) {\n context.output.write(event.content);\n return;\n }\n if (event.type === \"runtime_stdout\" && event.content) {\n stdoutBuffer += event.content;\n const lines = stdoutBuffer.split(/\\r?\\n/);\n stdoutBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n renderRuntimeLine(context, line);\n }\n return;\n }\n if (event.type === \"runtime_stderr\" && event.content) {\n writeLine(context, `[stderr] ${event.content.trim()}`);\n }\n },\n flush() {\n if (stdoutBuffer.trim()) {\n renderRuntimeLine(context, stdoutBuffer);\n stdoutBuffer = \"\";\n }\n },\n };\n}\n\nfunction renderRuntimeLine(context: LabContext, line: string): void {\n if (!line.trim()) return;\n const text = extractTextFromRuntimeJsonLine(line);\n if (text) {\n writeLine(context, `assistant > ${text}`);\n return;\n }\n writeLine(context, `[event] ${line}`);\n}\n\nfunction extractTextFromRuntimeJsonLine(line: string): string | undefined {\n try {\n const record = JSON.parse(line) as Record<string, unknown>;\n const direct = stringValue(record.result ?? record.text ?? record.content);\n if (direct) return direct;\n\n const message = record.message as Record<string, unknown> | undefined;\n const messageText = message\n ? stringValue(message.text ?? message.content)\n : undefined;\n if (messageText) return messageText;\n const content = Array.isArray(message?.content) ? message?.content : [];\n const parts = content\n .map((part) =>\n typeof part === \"object\" && part\n ? stringValue((part as Record<string, unknown>).text)\n : undefined\n )\n .filter(Boolean);\n return parts.length > 0 ? parts.join(\"\") : undefined;\n } catch {\n return line;\n }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction writeLine(context: LabContext, line: string): void {\n context.output.write(`${line}\\n`);\n}\n\nfunction printHeader(context: LabContext): void {\n writeLine(context, heading(context.ui, \"wm-daemon lab\"));\n writeLine(context, kv(context.ui, \"Root\", shortPath(context.rootDir)));\n writeLine(context, kv(context.ui, \"Server\", context.serverNamespace));\n writeLine(context, \"\");\n}\n\nexport function isPromptExitError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"ExitPromptError\" ||\n error.message.includes(\"force closed the prompt\") ||\n error.message.includes(\"User force closed\"))\n );\n}\n", "import { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeRunResult } from \"../runtime/adapter\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\nimport {\n createAgentWorkspace,\n type AgentWorkspace,\n} from \"../workspace/agent-workspace\";\n\nexport const defaultLabRootDir = path.join(os.homedir(), \".wm\");\nexport const defaultLabServerNamespace = \"lab-local\";\n\nexport interface LabAgent {\n agentId: string;\n agentName: string;\n description: string;\n runtime: RuntimeId;\n cwd: string;\n serverNamespace: string;\n createdAt: string;\n updatedAt: string;\n workspace: AgentWorkspace;\n}\n\nexport interface CreateLabAgentInput {\n rootDir: string;\n serverNamespace: string;\n runtime: RuntimeId;\n agentName: string;\n description: string;\n cwd?: string;\n agentId?: string;\n now?: () => Date;\n}\n\nexport interface RecordLabRunInput {\n agent: LabAgent;\n prompt: string;\n result: RuntimeRunResult;\n now?: () => Date;\n}\n\nconst labMetadataName = \"lab-agent.json\";\n\nexport async function clearLabServerCache(\n rootDir: string,\n serverNamespace: string\n): Promise<void> {\n await rm(path.join(rootDir, serverNamespace), { recursive: true, force: true });\n await mkdir(path.join(rootDir, serverNamespace), { recursive: true });\n}\n\nexport async function createLabAgent(input: CreateLabAgentInput): Promise<LabAgent> {\n const now = (input.now ?? (() => new Date()))().toISOString();\n const agentId = await findAvailableAgentId(\n input.rootDir,\n input.serverNamespace,\n input.agentId ?? slugifyAgentName(input.agentName)\n );\n const workspace = await createAgentWorkspace({\n rootDir: input.rootDir,\n serverNamespace: input.serverNamespace,\n serverId: `lab:${input.serverNamespace}`,\n machineDirectoryName: input.serverNamespace,\n agentDirectoryName: agentId,\n daemonId: os.hostname() || \"local\",\n agentId,\n agentName: input.agentName,\n runtime: input.runtime,\n role: input.description,\n });\n const cwd = input.cwd?.trim() || workspace.agentDir;\n await mkdir(cwd, { recursive: true });\n\n const agent: LabAgent = {\n agentId,\n agentName: input.agentName,\n description: input.description,\n runtime: input.runtime,\n cwd,\n serverNamespace: input.serverNamespace,\n createdAt: now,\n updatedAt: now,\n workspace,\n };\n\n await writeAgentMetadata(agent);\n return agent;\n}\n\nexport async function listLabAgents(\n rootDir: string,\n serverNamespace: string\n): Promise<LabAgent[]> {\n const serverDir = path.join(rootDir, serverNamespace);\n const entries = await readdir(serverDir, { withFileTypes: true }).catch((error) => {\n if (error?.code === \"ENOENT\") return [];\n throw error;\n });\n const agents: LabAgent[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const metadataPath = path.join(serverDir, entry.name, \".wm\", labMetadataName);\n const metadata = await readFile(metadataPath, \"utf8\").catch((error) => {\n if (error?.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!metadata) continue;\n agents.push(hydrateAgent(JSON.parse(metadata) as StoredLabAgent, rootDir));\n }\n\n return agents.sort((a, b) => a.agentName.localeCompare(b.agentName));\n}\n\nexport async function readLastRuntimeSessionId(\n agent: LabAgent\n): Promise<string | undefined> {\n const sessionPath = path.join(\n agent.workspace.runtimeSessionsDir,\n `${agent.runtime}.json`\n );\n const raw = await readFile(sessionPath, \"utf8\").catch((error) => {\n if (error?.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!raw) return undefined;\n const payload = JSON.parse(raw) as { runtimeSessionId?: unknown; status?: unknown };\n return payload.status === \"ok\" && typeof payload.runtimeSessionId === \"string\"\n ? payload.runtimeSessionId\n : undefined;\n}\n\nexport async function recordLabRun(input: RecordLabRunInput): Promise<string> {\n const at = (input.now ?? (() => new Date()))().toISOString();\n const runId = at.replace(/[:.]/g, \"-\");\n const runsDir = path.join(input.agent.workspace.wmDir, \"runs\");\n const runPath = path.join(runsDir, `${runId}.jsonl`);\n await mkdir(runsDir, { recursive: true });\n\n const records = [\n { type: \"prompt\", at, content: input.prompt },\n ...input.result.events.map((event) => ({ ...event, at })),\n {\n type: \"final\",\n at,\n status: input.result.status,\n content: input.result.finalMessage,\n runtimeSessionId: input.result.runtimeSessionId,\n errorMessage: input.result.errorMessage,\n },\n ];\n\n await writeFile(\n runPath,\n `${records.map((record) => JSON.stringify(record)).join(\"\\n\")}\\n`,\n \"utf8\"\n );\n await writeRuntimeSession(input.agent, input.result);\n return runPath;\n}\n\nasync function writeRuntimeSession(\n agent: LabAgent,\n result: RuntimeRunResult\n): Promise<void> {\n await mkdir(agent.workspace.runtimeSessionsDir, { recursive: true });\n await writeFile(\n path.join(agent.workspace.runtimeSessionsDir, `${agent.runtime}.json`),\n `${JSON.stringify(\n {\n runtime: agent.runtime,\n status: result.status,\n runtimeSessionId: result.runtimeSessionId,\n updatedAt: new Date().toISOString(),\n note:\n result.status === \"ok\"\n ? \"Runtime session handoff recorded by wm-daemon lab.\"\n : result.errorMessage,\n },\n null,\n 2\n )}\\n`,\n \"utf8\"\n );\n}\n\nasync function writeAgentMetadata(agent: LabAgent): Promise<void> {\n await writeFile(\n path.join(agent.workspace.wmDir, labMetadataName),\n `${JSON.stringify(toStoredAgent(agent), null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nasync function findAvailableAgentId(\n rootDir: string,\n serverNamespace: string,\n preferred: string\n): Promise<string> {\n const base = preferred || \"agent\";\n for (let index = 0; index < 1000; index += 1) {\n const candidate = index === 0 ? base : `${base}-${index + 1}`;\n const agents = await listLabAgents(rootDir, serverNamespace);\n if (!agents.some((agent) => agent.agentId === candidate)) return candidate;\n }\n throw new Error(`Cannot allocate agent id for ${preferred}`);\n}\n\nfunction slugifyAgentName(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"agent\";\n}\n\ninterface StoredLabAgent {\n agentId: string;\n agentName: string;\n description: string;\n runtime: RuntimeId;\n cwd: string;\n serverNamespace: string;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction toStoredAgent(agent: LabAgent): StoredLabAgent {\n return {\n agentId: agent.agentId,\n agentName: agent.agentName,\n description: agent.description,\n runtime: agent.runtime,\n cwd: agent.cwd,\n serverNamespace: agent.serverNamespace,\n createdAt: agent.createdAt,\n updatedAt: agent.updatedAt,\n };\n}\n\nfunction hydrateAgent(stored: StoredLabAgent, rootDir: string): LabAgent {\n const serverDir = path.join(rootDir, stored.serverNamespace);\n const agentDir = path.join(serverDir, stored.agentId);\n const wmDir = path.join(agentDir, \".wm\");\n return {\n ...stored,\n workspace: {\n serverDir,\n agentDir,\n wmDir,\n memoryPath: path.join(agentDir, \"MEMORY.md\"),\n notesDir: path.join(agentDir, \"notes\"),\n runtimeSessionsDir: path.join(wmDir, \"runtime-sessions\"),\n runsDir: path.join(wmDir, \"runs\"),\n agentTokenPath: path.join(wmDir, \"agent-token\"),\n wrapperPath: path.join(wmDir, \"wm\"),\n wrapperCliPath: path.join(wmDir, \"wm-cli.js\"),\n systemPromptPath: path.join(wmDir, \"system-prompt.md\"),\n },\n };\n}\n", "import readline from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\n\ntype InquirerPrompts = typeof import(\"@inquirer/prompts\");\n\nexport class PromptDriver {\n private readonly linePrompt: LinePrompt;\n private readonly useInquirer: boolean;\n private inquirerPromise: Promise<InquirerPrompts> | undefined;\n\n constructor(private readonly input: Readable, private readonly output: Writable) {\n this.useInquirer = shouldUseTerminalEditing(input, output);\n this.linePrompt = new LinePrompt(input, output);\n }\n\n async choose<T extends string>(message: string, choices: Array<{ name: string; value: T }>): Promise<T> {\n if (this.useInquirer) {\n const prompts = await this.loadInquirer();\n return prompts.select(\n {\n message,\n choices,\n pageSize: Math.min(Math.max(choices.length, 6), 12),\n },\n { input: this.input, output: this.output }\n );\n }\n\n for (;;) {\n this.output.write(`\\n${message}:\\n`);\n choices.forEach((choice, index) => {\n this.output.write(` ${index + 1}. ${choice.name}\\n`);\n });\n const answer = await this.linePrompt.question(\"Choose > \");\n const index = Number(answer.trim()) - 1;\n if (Number.isInteger(index) && choices[index]) return choices[index].value;\n this.output.write(\"Invalid choice.\\n\");\n }\n }\n\n async inputText(message: string, options?: { required?: boolean }): Promise<string> {\n for (;;) {\n const value = this.useInquirer\n ? await (await this.loadInquirer()).input(\n { message, required: options?.required ?? false },\n { input: this.input, output: this.output }\n )\n : await this.linePrompt.question(`${message}: `);\n const normalized = normalizeTerminalLine(value);\n if (!options?.required || normalized.trim()) return normalized.trim();\n this.output.write(`${message} is required.\\n`);\n }\n }\n\n close(): void {\n this.linePrompt.close();\n }\n\n private loadInquirer(): Promise<InquirerPrompts> {\n if (!this.inquirerPromise) {\n const dynamicImport = new Function(\n \"specifier\",\n \"return import(specifier)\"\n ) as (specifier: string) => Promise<InquirerPrompts>;\n this.inquirerPromise = dynamicImport(\"@inquirer/prompts\");\n }\n return this.inquirerPromise;\n }\n}\n\nclass LinePrompt {\n private readonly rl: readline.Interface;\n private readonly queued: string[] = [];\n private readonly waiters: Array<(line: string) => void> = [];\n private readonly terminalEditing: boolean;\n private readonly inputWasRaw: boolean | undefined;\n private closed = false;\n\n constructor(private readonly input: Readable, private readonly output: Writable) {\n this.terminalEditing = shouldUseTerminalEditing(input, output);\n this.inputWasRaw = (input as { isRaw?: boolean }).isRaw;\n if (this.terminalEditing) {\n (input as { setRawMode?: (mode: boolean) => void }).setRawMode?.(true);\n }\n this.rl = readline.createInterface({\n input,\n output: this.terminalEditing ? output : undefined,\n terminal: this.terminalEditing,\n });\n this.rl.on(\"line\", (line) => {\n const normalizedLine = normalizeTerminalLine(line);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter(normalizedLine);\n return;\n }\n this.queued.push(normalizedLine);\n });\n this.rl.on(\"close\", () => {\n this.closed = true;\n });\n }\n\n question(label: string): Promise<string> {\n const queued = this.queued.shift();\n if (queued !== undefined) {\n this.output.write(label);\n this.output.write(\"\\n\");\n return Promise.resolve(queued);\n }\n if (this.closed) {\n return Promise.reject(new Error(\"Interactive input closed\"));\n }\n if (this.terminalEditing) {\n this.rl.setPrompt(label);\n this.rl.prompt();\n } else {\n this.output.write(label);\n }\n return new Promise((resolve, reject) => {\n const onClose = () => {\n reject(new Error(\"Interactive input closed\"));\n };\n this.rl.once(\"close\", onClose);\n this.waiters.push((line) => {\n this.rl.off(\"close\", onClose);\n resolve(line);\n });\n });\n }\n\n close(): void {\n if (this.terminalEditing && this.inputWasRaw !== undefined) {\n (this.input as { setRawMode?: (mode: boolean) => void }).setRawMode?.(this.inputWasRaw);\n }\n this.rl.close();\n }\n}\n\nexport function shouldUseTerminalEditing(input: Readable, output: Writable): boolean {\n return Boolean(\n (input as { isTTY?: boolean }).isTTY && (output as { isTTY?: boolean }).isTTY\n );\n}\n\nexport function normalizeTerminalLine(line: string): string {\n const chars: string[] = [];\n for (const char of line) {\n if (char === \"\\x7f\" || char === \"\\b\") {\n chars.pop();\n continue;\n }\n chars.push(char);\n }\n return chars.join(\"\");\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeDoctorResult } from \"../runtime/doctor\";\nimport type { RuntimeRunStatus } from \"../runtime/adapter\";\n\ntype ColorName = \"dim\" | \"accent\" | \"good\" | \"warn\" | \"bad\" | \"muted\" | \"strong\";\n\nconst codes: Record<ColorName, [number, number]> = {\n dim: [2, 22],\n accent: [36, 39],\n good: [32, 39],\n warn: [33, 39],\n bad: [31, 39],\n muted: [90, 39],\n strong: [1, 22],\n};\n\nexport interface LabUi {\n colorEnabled: boolean;\n dim(value: string): string;\n accent(value: string): string;\n good(value: string): string;\n warn(value: string): string;\n bad(value: string): string;\n muted(value: string): string;\n strong(value: string): string;\n}\n\nexport function createLabUi(options?: { color?: boolean }): LabUi {\n const colorEnabled = options?.color ?? !process.env.NO_COLOR;\n const paint = (name: ColorName, value: string): string => {\n if (!colorEnabled) return value;\n const [open, close] = codes[name];\n return `\\x1b[${open}m${value}\\x1b[${close}m`;\n };\n return {\n colorEnabled,\n dim: (value) => paint(\"dim\", value),\n accent: (value) => paint(\"accent\", value),\n good: (value) => paint(\"good\", value),\n warn: (value) => paint(\"warn\", value),\n bad: (value) => paint(\"bad\", value),\n muted: (value) => paint(\"muted\", value),\n strong: (value) => paint(\"strong\", value),\n };\n}\n\nexport function heading(ui: LabUi, title: string): string {\n return ui.accent(ui.strong(title));\n}\n\nexport function kv(ui: LabUi, key: string, value: string): string {\n return `${ui.muted(key.padEnd(12))} ${value}`;\n}\n\nexport function statusLabel(\n ui: LabUi,\n status: RuntimeDoctorResult[\"status\"] | RuntimeRunStatus\n): string {\n if (status === \"available\" || status === \"ok\") return ui.good(\"OK\");\n if (status === \"not_installed\") return ui.bad(\"MISSING\");\n if (status === \"not_logged_in\") return ui.warn(\"LOGIN\");\n if (status === \"timeout\") return ui.warn(\"TIMEOUT\");\n if (status === \"runtime_error\") return ui.bad(\"ERROR\");\n if (status === \"unsupported_version\") return ui.warn(\"UNSUPPORTED\");\n return ui.warn(\"UNKNOWN\");\n}\n\nexport function formatTable(rows: string[][], options?: { padding?: number }): string {\n if (rows.length === 0) return \"\";\n const padding = options?.padding ?? 2;\n const widths = rows[0]?.map((_, index) =>\n Math.max(...rows.map((row) => visibleLength(row[index] ?? \"\")))\n ) ?? [];\n return rows\n .map((row) =>\n row\n .map((cell, index) => {\n const suffix = index === row.length - 1 ? 0 : padding;\n return `${cell}${\" \".repeat(widths[index] - visibleLength(cell) + suffix)}`;\n })\n .join(\"\")\n .trimEnd()\n )\n .join(\"\\n\");\n}\n\nexport function shortPath(value: string): string {\n const home = os.homedir();\n if (value === home) return \"~\";\n if (value.startsWith(`${home}${path.sep}`)) {\n return path.join(\"~\", value.slice(home.length + 1));\n }\n return value;\n}\n\nexport function visibleLength(value: string): number {\n return value.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\n}\n", "import os from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { DaemonToServerMessage, RuntimeId, ServerToDaemonMessage } from \"@claude-console/shared\";\nimport { supportedRuntimeIds } from \"../runtime/capabilities\";\nimport { doctorRuntimes } from \"../runtime/doctor\";\nimport packageJson from \"../../package.json\";\n\nexport class ServerConnection {\n private ws?: WebSocket;\n private reconnectTimer?: NodeJS.Timeout;\n private messageHandler: (msg: ServerToDaemonMessage) => void = () => {};\n private stopped = false;\n private reconnectAttempt = 0;\n\n constructor(private readonly options: {\n serverUrl: string;\n apiKey: string;\n spaceId?: string;\n name?: string;\n daemonVersion?: string;\n runningAgentsProvider?: () => string[];\n wakeableAgentsProvider?: () => Array<{ agentId: string; sessionId?: string; launchId?: string }>;\n runtimesProvider?: () => RuntimeId[] | Promise<RuntimeId[]>;\n log?: (line: string) => void;\n reconnectBaseDelayMs?: number;\n reconnectMaxDelayMs?: number;\n }) {}\n\n get connected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n connect(): void {\n this.stopped = false;\n this.log(`connecting server=${this.options.serverUrl}`);\n this.open();\n }\n\n disconnect(): void {\n this.stopped = true;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n this.reconnectAttempt = 0;\n this.log(\"disconnect requested\");\n const socket = this.ws;\n this.ws = undefined;\n socket?.close();\n socket?.terminate();\n }\n\n send(msg: DaemonToServerMessage): void {\n if (!this.connected) {\n this.log(`send skipped socket=closed msg=${summarizeDaemonMessage(msg)}`);\n return;\n }\n if (shouldLogDaemonMessage(msg)) {\n this.log(`send ${summarizeDaemonMessage(msg)}`);\n }\n this.ws?.send(JSON.stringify(msg));\n }\n\n onMessage(handler: (msg: ServerToDaemonMessage) => void): void {\n this.messageHandler = handler;\n }\n\n private open(): void {\n const url = new URL(\"/daemon/connect\", this.options.serverUrl.replace(/^http/, \"ws\"));\n url.searchParams.set(\"key\", this.options.apiKey);\n if (this.options.spaceId) url.searchParams.set(\"space_id\", this.options.spaceId);\n const ws = new WebSocket(url);\n this.ws = ws;\n ws.on(\"open\", () => {\n this.reconnectAttempt = 0;\n this.log(`socket open url=${redactUrl(url)}`);\n void this.sendReady();\n });\n ws.on(\"message\", (raw: WebSocket.RawData) => {\n const msg = JSON.parse(String(raw)) as ServerToDaemonMessage;\n this.log(`recv ${summarizeServerMessage(msg)}`);\n if (msg.type === \"ping\") {\n this.send({ type: \"pong\" });\n return;\n }\n this.messageHandler(msg);\n });\n ws.on(\"close\", (code, reason) => {\n const reasonText = reason.toString() || \"-\";\n this.log(`socket close code=${code} reason=${reasonText}`);\n if (code === 1008 && reasonText.includes(\"machine removed\")) {\n this.stopped = true;\n this.log(\"reconnect disabled reason=machine_removed\");\n return;\n }\n this.scheduleReconnect();\n });\n ws.on(\"error\", (error) => {\n this.log(`socket error ${error instanceof Error ? error.message : String(error)}`);\n this.scheduleReconnect();\n });\n }\n\n private async sendReady(): Promise<void> {\n this.send({\n type: \"ready\",\n capabilities: [\n \"agent:start\",\n \"agent:stop\",\n \"agent:deliver\",\n \"agent:reset-workspace\",\n \"agent:diagnostic\",\n \"workspace:list\",\n \"workspace:read\",\n \"agent:skills:list\",\n \"machine:runtime_models:detect\",\n \"machine:workspace:scan\",\n \"machine:workspace:delete\",\n \"reminder-cache\",\n ],\n runtimes: await this.detectAvailableRuntimes(),\n runningAgents: this.options.runningAgentsProvider?.() ?? [],\n wakeableAgents: this.options.wakeableAgentsProvider?.() ?? [],\n hostname: os.hostname() || \"local\",\n name: this.options.name,\n os: `${process.platform}/${process.arch}`,\n daemonVersion: this.options.daemonVersion ?? packageJson.version,\n });\n }\n\n private async detectAvailableRuntimes(): Promise<RuntimeId[]> {\n if (this.options.runtimesProvider) return this.options.runtimesProvider();\n try {\n const results = await doctorRuntimes(supportedRuntimeIds as RuntimeId[]);\n return results.filter((result) => result.detected).map((result) => result.runtime);\n } catch (error) {\n this.log(`runtime detection failed ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped || this.reconnectTimer) return;\n const delay = this.nextReconnectDelayMs();\n this.log(`reconnect scheduled delay=${delay}ms`);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n this.open();\n }, delay);\n }\n\n private nextReconnectDelayMs(): number {\n const base = this.options.reconnectBaseDelayMs ?? 1_000;\n const max = this.options.reconnectMaxDelayMs ?? 30_000;\n const delay = Math.min(max, base * 2 ** this.reconnectAttempt);\n this.reconnectAttempt += 1;\n return delay;\n }\n\n private log(line: string): void {\n this.options.log?.(`[connection] ${line}`);\n }\n}\n\nfunction summarizeDaemonMessage(msg: DaemonToServerMessage): string {\n const base = `type=${msg.type}`;\n if (\"agentId\" in msg) return `${base} agent=${msg.agentId}`;\n return base;\n}\n\nfunction shouldLogDaemonMessage(msg: DaemonToServerMessage): boolean {\n return !(msg.type === \"agent:activity\" && msg.detail === \"assistant_delta\");\n}\n\nfunction summarizeServerMessage(msg: ServerToDaemonMessage): string {\n const base = `type=${msg.type}`;\n if (\"agentId\" in msg) return `${base} agent=${msg.agentId}`;\n return base;\n}\n\nfunction redactUrl(url: URL): string {\n const copy = new URL(url.toString());\n if (copy.searchParams.has(\"key\")) copy.searchParams.set(\"key\", \"***\");\n return copy.toString();\n}\n", "{\n \"name\": \"@wagemule/daemon\",\n \"version\": \"0.1.8\",\n \"private\": false,\n \"description\": \"Wage Mule local daemon for connecting local agent runtimes to Workspace Server.\",\n \"main\": \"./dist/main.cjs\",\n \"bin\": {\n \"wm-daemon\": \"./dist/main.cjs\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"package.json\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"dev\": \"tsx watch src/main.ts\",\n \"build\": \"node scripts/build.mjs\",\n \"start\": \"node dist/main.cjs\",\n \"prepack\": \"npm run build\",\n \"pack:check\": \"node scripts/pack-check.mjs\",\n \"test\": \"node --import tsx src/workspace/agent-workspace.test.ts && node --import tsx src/workspace/feishu-token-writer.test.ts && node --import tsx src/agent-manager/workspace-browser.test.ts && node --import tsx src/agent-manager/agent-process-manager.memory.test.ts && node --import tsx src/agent-manager/agent-process-manager.delivery.test.ts && node --import tsx src/agent-manager/agent-process-manager.model-validation.test.ts && node --import tsx src/agent-manager/skill-scanner.test.ts && node --import tsx src/runtime/capabilities.test.ts && node --import tsx src/runtime/model-detector.test.ts && node --import tsx src/runtime/persistent-adapter.test.ts && node --import tsx src/runtime/json-rpc-stdio-client.test.ts && node --import tsx src/runtime/acp-adapter.test.ts && node --import tsx src/runtime/codex-adapter.test.ts && node --import tsx src/runtime/claude-adapter.test.ts && node --import tsx src/testing/smoke-harness.test.ts && node --import tsx src/lab/lab-store.test.ts && node --import tsx src/lab/lab-ui.test.ts && node --import tsx src/lab/interactive-lab.test.ts && node --import tsx src/main.test.ts && node --import tsx src/testing/integration.test.ts\",\n \"test:real\": \"node --import tsx src/testing/integration-real.test.ts\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"@types/ws\": \"^8.0.0\",\n \"esbuild\": \"^0.25.0\",\n \"tsx\": \"^4.0.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.138\",\n \"@inquirer/prompts\": \"^8.4.2\",\n \"@larksuite/cli\": \"^1.0.32\",\n \"commander\": \"^14.0.3\",\n \"ws\": \"^8.0.0\"\n }\n}\n", "import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type {\n DaemonToServerMessage,\n DeliveredMessage,\n AgentActivity,\n MachineWorkspaceEntry,\n RuntimeId,\n RuntimeModelDescriptor,\n RuntimeModelDetectionResult,\n ServerToDaemonMessage,\n AgentDiagnosticSnapshot,\n} from \"@claude-console/shared\";\nimport { formatDeliveredMessage } from \"@claude-console/shared\";\nimport { createPersistentRuntimeAdapter, createRuntimeAdapter } from \"../runtime/registry\";\nimport type { PersistentRuntimeAdapter, RuntimePermissionDecision, RuntimePermissionRequest, RuntimeRunInput } from \"../runtime/adapter\";\nimport { RuntimeModelDetector } from \"../runtime/model-detector\";\nimport { ReminderCache } from \"../reminder/reminder-cache\";\nimport { createAgentWorkspace, type AgentRuntime, type AgentWorkspace } from \"../workspace/agent-workspace\";\nimport { clearFeishuToken, writeFeishuToken, writeLarkCliWrapper } from \"../workspace/feishu-token-writer\";\nimport { ActivityTracker } from \"./activity-tracker\";\nimport { scanAgentSkills } from \"./skill-scanner\";\nimport { displayNameToWorkspaceDirectoryName, isSafeWorkspaceDirectoryName, namedWorkspaceDirectoryName, WorkspaceBrowser } from \"./workspace-browser\";\n\ninterface RunningAgent {\n workspace: AgentWorkspace;\n sessionId?: string;\n config: AgentConfig;\n controller: AbortController;\n adapter?: PersistentRuntimeAdapter;\n state?: \"busy\" | \"idle\" | \"stopping\" | \"error\";\n runtimeEnv?: NodeJS.ProcessEnv;\n launchId?: string;\n stopped?: boolean;\n done?: Promise<void>;\n compacting?: boolean;\n compactionStartedAt?: number;\n compactionWatchdog?: ReturnType<typeof setTimeout>;\n lastRuntimeEventAt?: number;\n}\n\ntype AgentConfig = Extract<ServerToDaemonMessage, { type: \"agent:start\" }>[\"config\"];\n\ninterface StartRequest {\n agentId: string;\n config: AgentConfig;\n wakeMessage?: DeliveredMessage;\n deliveredMessages?: DeliveredMessage[];\n launchId?: string;\n taskId?: string;\n}\n\ninterface RuntimeModelDetectorLike {\n detect(runtime: RuntimeId): Promise<RuntimeModelDetectionResult>;\n detectAll?(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]>;\n}\n\nexport class AgentProcessManager {\n private readonly running = new Map<string, RunningAgent>();\n private readonly starting = new Map<string, Promise<void>>();\n private readonly cancelledStarts = new Set<string>();\n private readonly idleConfigs = new Map<string, { config: AgentConfig; sessionId?: string; workspace?: AgentWorkspace }>();\n private readonly startingInboxes = new Map<string, DeliveredMessage[]>();\n private readonly runningInboxes = new Map<string, DeliveredMessage[]>();\n private readonly queuedLaunchIds = new Map<string, string>();\n private readonly queuedTaskIds = new Map<string, string>();\n private readonly stoppedLaunches = new Set<string>();\n private readonly lastActivities = new Map<string, { activity: AgentActivity; detail: string; launchId?: string; clientSeq?: number }>();\n private readonly pendingMigrations = new Map<string, string>();\n private readonly pendingPermissions = new Map<string, {\n agentId: string;\n timeout: ReturnType<typeof setTimeout>;\n resolve: (decision: RuntimePermissionDecision) => void;\n }>();\n private readonly fakeRuntimeChildren = new Map<string, ChildProcess>();\n private readonly feishuDelegationTimers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly modelDetector: RuntimeModelDetectorLike;\n private readonly reminderCache = new ReminderCache();\n private startQueue: Promise<void> = Promise.resolve();\n private readonly browser: WorkspaceBrowser;\n\n constructor(\n private readonly options: {\n rootDir: string;\n machineDisplayName: string;\n sendToServer: (msg: DaemonToServerMessage) => void;\n log?: (line: string) => void;\n modelDetector?: RuntimeModelDetectorLike;\n }\n ) {\n this.modelDetector = options.modelDetector ?? new RuntimeModelDetector();\n this.browser = new WorkspaceBrowser({\n rootDir: this.options.rootDir,\n workspaceDirectoryForAgent: (agentId, serverNamespace, machineId) => {\n const config = this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n if (config) return this.resolveWorkspaceDirectory(config, agentId);\n if (serverNamespace && machineId) return this.resolveWorkspaceDirectoryForParts(machineId, machineId, agentId, agentId);\n return undefined;\n },\n });\n this.reminderCache.onFire((job) => {\n this.options.sendToServer({\n type: \"reminder.fire_attempt\",\n reminderId: job.reminderId,\n agentId: job.ownerAgentId,\n version: job.version,\n });\n });\n }\n\n getRunningAgentIds(): string[] {\n return Array.from(this.running.entries())\n .filter(([, running]) => running.state !== \"idle\")\n .map(([agentId]) => agentId);\n }\n\n getWakeableAgents(): Array<{ agentId: string; sessionId?: string; launchId?: string }> {\n const persistentIdle = Array.from(this.running.entries())\n .filter(([, running]) => running.state === \"idle\")\n .map(([agentId, running]) => ({ agentId, sessionId: running.sessionId, launchId: running.launchId }));\n const cachedIdle = Array.from(this.idleConfigs.entries())\n .filter(([agentId]) => !this.running.has(agentId) && !this.starting.has(agentId))\n .map(([agentId, idle]) => ({ agentId, sessionId: idle.sessionId }));\n return [...persistentIdle, ...cachedIdle];\n }\n\n async handle(message: ServerToDaemonMessage): Promise<void> {\n this.log(`handle type=${message.type}${\"agentId\" in message ? ` agent=${message.agentId}` : \"\"}`);\n if (message.type === \"agent:start\") {\n await this.enqueueStart({\n agentId: message.agentId,\n config: message.config,\n wakeMessage: message.wakeMessage,\n deliveredMessages: message.wakeMessage ? [message.wakeMessage] : undefined,\n launchId: message.launchId,\n taskId: message.taskId,\n });\n } else if (message.type === \"agent:deliver\") {\n await this.deliverMessage(message.agentId, message.message, message.deliveryId, message.seq);\n } else if (message.type === \"agent:stop\") {\n await this.stopAgent(message.agentId, \"requested\");\n } else if (message.type === \"agent:activity_probe\") {\n const running = this.running.get(message.agentId);\n const last = this.lastActivities.get(message.agentId);\n this.options.sendToServer({\n type: \"agent:activity\",\n agentId: message.agentId,\n activity: this.starting.has(message.agentId)\n ? \"working\"\n : running\n ? running.state === \"idle\" ? \"idle\" : last?.activity ?? \"working\"\n : this.idleConfigs.has(message.agentId)\n ? \"idle\"\n : \"offline\",\n detail: this.starting.has(message.agentId)\n ? \"Starting...\"\n : running\n ? running.state === \"idle\" ? \"Idle\" : last?.detail ?? \"Runtime running\"\n : this.idleConfigs.has(message.agentId)\n ? \"Idle\"\n : \"Agent not running\",\n launchId: running?.launchId ?? last?.launchId,\n probeId: message.probeId,\n pendingInboxCount: this.queuedInboxCount(message.agentId),\n clientSeq: last?.clientSeq,\n });\n } else if (message.type === \"agent:workspace:list\") {\n await this.replyWorkspaceList(message.agentId, message.requestId, message.path, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:workspace:read\") {\n await this.replyWorkspaceRead(message.agentId, message.requestId, message.path, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:workspace:write\") {\n await this.replyWorkspaceWrite(message.agentId, message.requestId, message.path, message.content, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:skills:list\") {\n await this.replyAgentSkillsList(message.agentId, message.requestId, message.runtime, message.serverNamespace, message.machineId, message.config);\n } else if (message.type === \"agent:workspace:init\") {\n await this.replyWorkspaceInit(message.requestId, message.agentId, message.config);\n } else if (message.type === \"feishu:token:write\") {\n await this.replyFeishuTokenWrite(message.requestId, message.agentId, message.token, message.appId, message.brand, message.config);\n } else if (message.type === \"feishu:token:clear\") {\n await this.replyFeishuTokenClear(message.requestId, message.agentId, message.config);\n } else if (message.type === \"feishu:delegation:start\" || message.type === \"feishu:delegation:update\") {\n await this.replyFeishuDelegationStart(message.requestId, message.delegation, message.config);\n } else if (message.type === \"feishu:delegation:stop\") {\n this.stopFeishuDelegationSchedule(message.delegationId);\n this.options.sendToServer({\n type: \"feishu:delegation:result\",\n requestId: message.requestId,\n delegationId: message.delegationId,\n agentId: message.agentId,\n ok: true,\n });\n } else if (message.type === \"machine:runtime_models:detect\") {\n const results = await this.detectRuntimeModels(message.runtimes ?? [\"cursor\", \"claude\", \"codex\", \"gemini\", \"kimi\", \"hermes\", \"opencode\"]);\n this.options.sendToServer({ type: \"machine:runtime_models:result\", requestId: message.requestId, results });\n } else if (message.type === \"machine:workspace:scan\") {\n await this.replyMachineWorkspaceScan(message.requestId, message.serverNamespace, message.machineId, message.machineName, message.knownAgentIds ?? []);\n } else if (message.type === \"machine:workspace:delete\") {\n await this.replyMachineWorkspaceDelete(message.requestId, message.serverNamespace, message.machineId, message.machineName, message.directoryName);\n } else if (message.type === \"agent:reset-workspace\") {\n await this.replyResetWorkspace(message.requestId, message.agentId, message.config);\n } else if (message.type === \"agent:diagnostic\") {\n await this.replyAgentDiagnostic(message.requestId, message.agentId, message.config);\n } else if (message.type === \"reminder.upsert\") {\n this.reminderCache.upsert(message.reminder);\n } else if (message.type === \"reminder.cancel\") {\n this.reminderCache.cancel(message.reminderId);\n } else if (message.type === \"reminder.snapshot\") {\n this.reminderCache.snapshot(message.agentId, message.reminders);\n } else if (message.type === \"agent:runtime_profile:migration\") {\n this.pendingMigrations.set(message.agentId, message.migrationKey);\n } else if (message.type === \"agent:permission_decision\") {\n this.resolvePermissionDecision(message.agentId, message.requestId, message.action, message.metadata);\n }\n }\n\n private startFeishuDelegationSchedule(delegation: Extract<ServerToDaemonMessage, { type: \"feishu:delegation:start\" }>[\"delegation\"], config: AgentConfig): void {\n this.stopFeishuDelegationSchedule(delegation.id);\n this.idleConfigs.set(delegation.delegate_agent_id, {\n config,\n sessionId: config.sessionId,\n });\n if (!delegation.enabled) return;\n const intervalMs = Math.max(60_000, delegation.interval_seconds * 1000);\n const lookbackMinutes = feishuDelegationLookbackMinutes(delegation.interval_seconds);\n const timer = setInterval(() => {\n if (this.shouldSkipScheduledFeishuWake(delegation.delegate_agent_id)) {\n this.log(`feishu delegation tick skipped agent=${delegation.delegate_agent_id} delegation=${delegation.id} reason=agent_busy`);\n return;\n }\n const wakeMessage: DeliveredMessage = {\n target: \"feishu:delegation\",\n message_id: `feishu-${delegation.id}-${Date.now()}`,\n seq: Date.now(),\n timestamp: new Date().toISOString(),\n sender_type: \"human\",\n sender_name: \"Feishu Delegation\",\n content: [\n \"Feishu delegation tick.\",\n `Human ID: ${delegation.human_id}`,\n `Delegation ID: ${delegation.id}`,\n `Read Feishu messages from the last ${lookbackMinutes} minutes only. Never send, reply, react, or mutate Feishu during this tick.`,\n \"For each new inbound Feishu message that needs a reply, draft a concise reply and create exactly one inbox item with:\",\n \"wm inbox feishu-draft create --delegation-id <delegation_id> --human-id <human_id> --feishu-message-id <message_id> --chat-id <chat_id> --sender-name <name> --sender-open-id <open_id> --original-text <summary> --draft-text <draft>\",\n \"Deduplicate by Feishu message_id. If there are no new relevant messages, do nothing.\",\n \"Do not call lark-cli im +messages-send or any other Feishu send command unless a later approved inbox task explicitly asks you to send.\",\n ].join(\"\\n\"),\n };\n void this.enqueueStart({\n agentId: delegation.delegate_agent_id,\n config: { ...config, feishuDelegationEnabled: true },\n wakeMessage,\n deliveredMessages: [wakeMessage],\n }).catch((error) => {\n this.options.sendToServer({\n type: \"feishu:wake_failed\",\n delegationId: delegation.id,\n agentId: delegation.delegate_agent_id,\n humanId: delegation.human_id,\n reason: error instanceof Error ? error.message : \"feishu delegation wake failed\",\n timestamp: Date.now(),\n });\n });\n }, intervalMs);\n timer.unref?.();\n this.feishuDelegationTimers.set(delegation.id, timer);\n }\n\n private async replyFeishuDelegationStart(\n requestId: string,\n delegation: Extract<ServerToDaemonMessage, { type: \"feishu:delegation:start\" }>[\"delegation\"],\n config: AgentConfig\n ): Promise<void> {\n try {\n const feishuConfig = { ...config, feishuDelegationEnabled: true };\n await this.ensureAgentWorkspace(delegation.delegate_agent_id, feishuConfig);\n this.startFeishuDelegationSchedule(delegation, feishuConfig);\n this.options.sendToServer({\n type: \"feishu:delegation:result\",\n requestId,\n delegationId: delegation.id,\n agentId: delegation.delegate_agent_id,\n ok: true,\n });\n } catch (error) {\n this.options.sendToServer({\n type: \"feishu:delegation:result\",\n requestId,\n delegationId: delegation.id,\n agentId: delegation.delegate_agent_id,\n ok: false,\n error: error instanceof Error ? error.message : \"feishu delegation start failed\",\n });\n }\n }\n\n private shouldSkipScheduledFeishuWake(agentId: string): boolean {\n if (this.starting.has(agentId)) return true;\n const running = this.running.get(agentId);\n return running !== undefined && running.state !== \"idle\";\n }\n\n private stopFeishuDelegationSchedule(delegationId: string): void {\n const timer = this.feishuDelegationTimers.get(delegationId);\n if (timer) clearInterval(timer);\n this.feishuDelegationTimers.delete(delegationId);\n }\n\n private async enqueueStart(request: StartRequest): Promise<void> {\n if (this.running.has(request.agentId) || this.starting.has(request.agentId)) {\n this.log(`agent start deduped agent=${request.agentId}`);\n this.idleConfigs.set(request.agentId, { config: request.config, sessionId: request.config.sessionId });\n if (request.deliveredMessages?.length) {\n this.rememberQueuedMessageLaunch(request.deliveredMessages, request.launchId, request.taskId);\n const running = this.running.get(request.agentId);\n if (running?.state === \"idle\" && running.adapter) {\n const controller = new AbortController();\n running.controller = controller;\n running.state = \"busy\";\n running.config = request.config;\n running.launchId = request.launchId;\n running.done = this.runAgentRuntime({\n agentId: request.agentId,\n config: { ...request.config, sessionId: running.sessionId ?? request.config.sessionId },\n workspace: running.workspace,\n wakeMessage: request.wakeMessage,\n deliveredMessages: request.deliveredMessages,\n launchId: request.launchId,\n taskId: request.taskId,\n runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(running.workspace, request.config, request.agentId),\n controller,\n }).catch((error) => {\n this.log(`deduped idle start failed agent=${request.agentId} error=${error instanceof Error ? error.message : String(error)}`);\n });\n } else {\n this.pushInbox(this.starting.has(request.agentId) ? this.startingInboxes : this.runningInboxes, request.agentId, request.deliveredMessages);\n }\n }\n return;\n }\n this.cancelledStarts.delete(request.agentId);\n if (request.launchId) this.stoppedLaunches.delete(request.launchId);\n const start = this.startQueue.then(() => this.startAgent(\n request.agentId,\n request.config,\n request.wakeMessage,\n request.deliveredMessages,\n request.launchId,\n request.taskId\n ));\n this.starting.set(request.agentId, start);\n this.startQueue = start.catch(() => undefined);\n try {\n await start;\n } finally {\n this.starting.delete(request.agentId);\n }\n }\n\n async startAgent(\n agentId: string,\n config: AgentConfig,\n wakeMessage?: DeliveredMessage,\n deliveredMessages?: DeliveredMessage[],\n launchId?: string,\n taskId?: string\n ): Promise<void> {\n this.log(`agent start agent=${agentId} runtime=${config.runtime} launch=${launchId ?? \"-\"} session=${config.sessionId ?? \"new\"}`);\n try {\n await this.validateRuntimeConfig(config);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n this.log(`agent config rejected agent=${agentId} error=${detail}`);\n this.sendActivity({\n agentId,\n activity: \"error\",\n detail,\n launchId,\n entries: [{ kind: \"error\", text: detail, timestamp: Date.now() }],\n });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n return;\n }\n if (this.cancelledStarts.has(agentId)) {\n this.log(`agent start cancelled before workspace agent=${agentId}`);\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n return;\n }\n const workspace = await createAgentWorkspace({\n rootDir: this.options.rootDir,\n serverNamespace: config.serverNamespace,\n serverId: config.spaceId,\n machineDirectoryName: this.machineDirectoryName(config),\n machineId: config.machineId,\n agentDirectoryName: this.agentDirectoryName(config, agentId),\n daemonId: os.hostname() || \"local-daemon\",\n agentId,\n agentName: config.agentName,\n runtime: config.runtime,\n role: config.role,\n feishuDelegationEnabled: config.feishuDelegationEnabled,\n });\n this.log(`workspace ready agent=${agentId} dir=${workspace.agentDir}`);\n const startQueued = this.startingInboxes.get(agentId) ?? [];\n this.startingInboxes.delete(agentId);\n const messagesForTurn = dedupeDeliveredMessages([...(deliveredMessages ?? (wakeMessage ? [wakeMessage] : [])), ...startQueued]);\n for (const delivered of messagesForTurn) {\n await this.recordDeliveredMessageNote(workspace, delivered, delivered.seq);\n }\n const runtimeEnv = this.buildRuntimeEnv(workspace, config, agentId);\n await this.writeRuntimeEnv(workspace, config, agentId);\n const controller = new AbortController();\n const running: RunningAgent = { workspace, sessionId: config.sessionId, config, controller, launchId, state: \"busy\", runtimeEnv };\n this.running.set(agentId, running);\n const runDone = this.runAgentRuntime({ agentId, config, workspace, wakeMessage, deliveredMessages: messagesForTurn, launchId, taskId, runtimeEnv, controller })\n .catch((error) => {\n if (controller.signal.aborted) return;\n const detail = error instanceof Error ? error.message : String(error);\n this.log(`agent runtime failed agent=${agentId} error=${detail}`);\n this.sendActivity({\n agentId,\n activity: \"error\",\n detail,\n launchId,\n entries: [{ kind: \"error\", text: detail, timestamp: Date.now() }],\n });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n })\n .finally(() => {\n const current = this.running.get(agentId);\n if (current && !current.adapter) this.running.delete(agentId);\n });\n running.done = runDone;\n this.idleConfigs.set(agentId, { config, sessionId: config.sessionId, workspace });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"active\", launchId });\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Starting...\",\n launchId,\n entries: [{ kind: \"status\", text: \"Starting...\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n }\n\n private async detectRuntimeModels(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]> {\n if (this.modelDetector.detectAll) return this.modelDetector.detectAll(runtimes);\n return Promise.all(runtimes.map((runtime) => this.modelDetector.detect(runtime)));\n }\n\n private async validateRuntimeConfig(config: AgentConfig): Promise<void> {\n const detection = await this.modelDetector.detect(config.runtime);\n const requestedModel = config.model?.trim() || \"default\";\n const model = selectRuntimeModel(detection, requestedModel);\n const reasoningEffort = config.reasoningEffort?.trim();\n if (!reasoningEffort || reasoningEffort === \"default\") return;\n const allowed = model?.reasoningEfforts?.length ? model.reasoningEfforts : [\"default\"];\n if (!allowed.includes(reasoningEffort)) {\n throw new Error(`unsupported reasoning effort for ${config.runtime}/${model?.id ?? requestedModel}: ${reasoningEffort}`);\n }\n }\n\n private sendActivity(msg: Omit<Extract<DaemonToServerMessage, { type: \"agent:activity\" }>, \"type\">): void {\n if (msg.launchId && this.stoppedLaunches.has(msg.launchId) && msg.activity !== \"offline\") return;\n this.lastActivities.set(msg.agentId, { activity: msg.activity, detail: msg.detail, launchId: msg.launchId, clientSeq: msg.clientSeq });\n this.options.sendToServer({ type: \"agent:activity\", ...msg });\n }\n\n private requestRuntimePermission(agentId: string, launchId: string | undefined, request: RuntimePermissionRequest): Promise<RuntimePermissionDecision> {\n const requestId = `perm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n this.log(`permission request agent=${agentId} request=${requestId} kind=${request.kind}`);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Waiting for permission\",\n launchId,\n entries: [{ kind: \"status\", text: request.title, timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId) + 1,\n });\n this.options.sendToServer({\n type: \"agent:permission_request\",\n agentId,\n requestId,\n launchId,\n kind: request.kind,\n title: request.title,\n description: request.description,\n metadata: request.metadata,\n });\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n this.pendingPermissions.delete(requestId);\n this.log(`permission timeout agent=${agentId} request=${requestId}`);\n resolve({ action: \"reject\", metadata: { reason: \"permission timeout\" } });\n }, 10 * 60_000);\n this.pendingPermissions.set(requestId, { agentId, timeout, resolve });\n });\n }\n\n private resolvePermissionDecision(agentId: string, requestId: string, action: \"approve\" | \"reject\", metadata?: Record<string, unknown>): void {\n const pending = this.pendingPermissions.get(requestId);\n if (!pending || pending.agentId !== agentId) return;\n clearTimeout(pending.timeout);\n this.pendingPermissions.delete(requestId);\n this.log(`permission decision agent=${agentId} request=${requestId} action=${action}`);\n pending.resolve({ action, metadata });\n }\n\n private async ensureAgentWorkspace(agentId: string, config?: AgentConfig): Promise<{ workspace?: AgentWorkspace; missing?: boolean }> {\n const running = this.running.get(agentId);\n if (running && !config?.feishuDelegationEnabled) return { workspace: running.workspace };\n const idle = this.idleConfigs.get(agentId);\n if (idle?.workspace && !config?.feishuDelegationEnabled) return { workspace: idle.workspace };\n const effectiveConfig = this.mergeWorkspaceConfig(config ?? idle?.config, running?.config, idle?.config);\n if (!effectiveConfig) return { missing: true };\n const workspace = await createAgentWorkspace({\n rootDir: this.options.rootDir,\n serverNamespace: effectiveConfig.serverNamespace,\n serverId: effectiveConfig.spaceId,\n machineDirectoryName: this.machineDirectoryName(effectiveConfig),\n machineId: effectiveConfig.machineId,\n agentDirectoryName: this.agentDirectoryName(effectiveConfig, agentId),\n daemonId: os.hostname() || \"local-daemon\",\n agentId,\n agentName: effectiveConfig.agentName,\n runtime: effectiveConfig.runtime,\n role: effectiveConfig.role,\n feishuDelegationEnabled: effectiveConfig.feishuDelegationEnabled,\n });\n if (running) {\n running.workspace = workspace;\n running.config = effectiveConfig;\n }\n this.idleConfigs.set(agentId, { config: effectiveConfig, sessionId: effectiveConfig.sessionId, workspace });\n return { workspace };\n }\n\n private mergeWorkspaceConfig(config?: AgentConfig, runningConfig?: AgentConfig, idleConfig?: AgentConfig): AgentConfig | undefined {\n if (!config) return config;\n if (config.feishuDelegationEnabled || runningConfig?.feishuDelegationEnabled || idleConfig?.feishuDelegationEnabled) {\n return { ...config, feishuDelegationEnabled: true };\n }\n return config;\n }\n\n private async replyWorkspaceInit(requestId: string, agentId: string, config: AgentConfig): Promise<void> {\n try {\n const { workspace } = await this.ensureAgentWorkspace(agentId, config);\n this.options.sendToServer({\n type: \"agent:workspace:init/result\",\n requestId,\n agentId,\n ok: true,\n workspacePath: workspace ? this.workspaceDisplayPath(config, agentId) : undefined,\n });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:workspace:init/result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : \"workspace init failed\",\n });\n }\n }\n\n private async replyFeishuTokenWrite(\n requestId: string,\n agentId: string,\n token: string,\n appId: string,\n brand?: \"feishu\" | \"lark\",\n config?: AgentConfig\n ): Promise<void> {\n try {\n const { workspace } = await this.ensureAgentWorkspace(agentId, config);\n if (!workspace) throw new Error(`workspace missing for ${agentId}`);\n const tokenPath = await writeFeishuToken({ workspaceDir: workspace.agentDir, token });\n await writeLarkCliWrapper({ workspaceDir: workspace.agentDir, appId, brand });\n this.options.sendToServer({ type: \"feishu:token:write_result\", requestId, agentId, ok: true, tokenPath });\n } catch (error) {\n this.options.sendToServer({\n type: \"feishu:token:write_result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : \"feishu token write failed\",\n });\n }\n }\n\n private async replyFeishuTokenClear(requestId: string, agentId: string, config?: AgentConfig): Promise<void> {\n try {\n const { workspace } = await this.ensureAgentWorkspace(agentId, config);\n if (!workspace) throw new Error(`workspace missing for ${agentId}`);\n await clearFeishuToken({ workspaceDir: workspace.agentDir });\n this.options.sendToServer({ type: \"feishu:token:clear_result\", requestId, agentId, ok: true });\n } catch (error) {\n this.options.sendToServer({\n type: \"feishu:token:clear_result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : \"feishu token clear failed\",\n });\n }\n }\n\n private async runAgentRuntime(input: {\n agentId: string;\n config: AgentConfig;\n workspace: AgentWorkspace;\n wakeMessage?: DeliveredMessage;\n deliveredMessages?: DeliveredMessage[];\n launchId?: string;\n taskId?: string;\n runtimeEnv: NodeJS.ProcessEnv;\n controller: AbortController;\n }): Promise<void> {\n const { agentId, config, workspace, wakeMessage, deliveredMessages, launchId, taskId, runtimeEnv, controller } = input;\n\n if (process.env.WM_DAEMON_FAKE_RUNTIME === \"1\") {\n this.log(`fake runtime start agent=${agentId}`);\n const result = await this.runFakeRuntime({\n agentId,\n config,\n wakeMessage: deliveredMessages?.[0] ?? wakeMessage,\n abortSignal: controller.signal,\n workspace,\n launchId,\n });\n this.log(`fake runtime done agent=${agentId}`);\n if (result.runtimeSessionId) {\n this.idleConfigs.set(agentId, { config: { ...config, sessionId: result.runtimeSessionId }, sessionId: result.runtimeSessionId, workspace });\n this.options.sendToServer({ type: \"agent:session\", agentId, sessionId: result.runtimeSessionId, launchId });\n }\n await this.writeRunLog(workspace, {\n agentId,\n launchId,\n taskId,\n runtime: config.runtime,\n runtimeSessionId: result.runtimeSessionId,\n status: \"ok\",\n finalMessage: result.finalMessage,\n events: result.events,\n });\n if (controller.signal.aborted || (launchId && this.stoppedLaunches.has(launchId))) {\n this.log(`fake agent done ignored after stop agent=${agentId} launch=${launchId ?? \"-\"}`);\n return;\n }\n this.sendActivity({\n agentId,\n activity: \"idle\",\n detail: \"Fake runtime completed\",\n launchId,\n entries: result.events.map((event) => ({ kind: \"text\" as const, text: event.content ?? event.type, timestamp: Date.now() })),\n });\n this.running.delete(agentId);\n if (this.drainQueuedMessagesAfterTurn(agentId, config, workspace, launchId, result.runtimeSessionId)) {\n return;\n }\n this.options.sendToServer({ type: \"agent:availability\", agentId, daemonState: \"wakeable\", sessionId: result.runtimeSessionId, launchId });\n return;\n }\n\n const systemPrompt = await readFile(workspace.systemPromptPath, \"utf8\");\n const messagesForTurn = deliveredMessages?.length ? deliveredMessages : (wakeMessage ? [wakeMessage] : []);\n const migrationKey = this.pendingMigrations.get(agentId);\n if (migrationKey) this.pendingMigrations.delete(agentId);\n const basePrompt = messagesForTurn.length > 0\n ? formatActionableMessagePrompt(messagesForTurn, workspace.wrapperPath)\n : formatStartupPrompt(workspace.wrapperPath);\n const prompt = migrationKey\n ? `${basePrompt}\\n\\n[Runtime Profile Migration] Your runtime configuration has been updated. Before handling the above, re-ground yourself in the new context, then run: \\`${workspace.wrapperPath} profile migration-ack --key ${migrationKey}\\``\n : basePrompt;\n const tracker = new ActivityTracker();\n const requestPermission = (request: RuntimePermissionRequest) => this.requestRuntimePermission(agentId, launchId, request);\n let deltaLogText = \"\";\n let deltaLogCount = 0;\n const flushDeltaLog = () => {\n if (!deltaLogCount) return;\n this.log(`runtime stream agent=${agentId} type=assistant_delta chunks=${deltaLogCount} text=${compact(deltaLogText)}`);\n deltaLogText = \"\";\n deltaLogCount = 0;\n };\n const onEvent = (event: { type: string; content?: string; data?: unknown }) => {\n if (event.type === \"assistant_delta\") {\n if (event.content) deltaLogText += event.content;\n deltaLogCount += 1;\n } else {\n flushDeltaLog();\n this.log(`runtime event agent=${agentId} type=${event.type}${event.content ? ` text=${compact(event.content)}` : \"\"}`);\n }\n const running = this.running.get(agentId);\n if (running) {\n running.lastRuntimeEventAt = Date.now();\n if (event.type === \"compaction_started\") {\n running.compacting = true;\n running.compactionStartedAt = Date.now();\n if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n const startedAt = running.compactionStartedAt;\n running.compactionWatchdog = setTimeout(() => {\n const r = this.running.get(agentId);\n if (!r || r.compactionStartedAt !== startedAt) return;\n this.log(`compaction stale agent=${agentId}`);\n r.compacting = false;\n r.compactionStartedAt = undefined;\n r.compactionWatchdog = undefined;\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"compaction_stale\",\n launchId,\n entries: [{ kind: \"status\", text: \"Context compaction still running; no finish event observed\", timestamp: Date.now() }],\n });\n }, 120000);\n } else if (event.type === \"compaction_finished\") {\n if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n running.compacting = false;\n running.compactionStartedAt = undefined;\n running.compactionWatchdog = undefined;\n }\n }\n const entries = tracker.toEntries([event]);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: event.type,\n entries,\n launchId,\n clientSeq: tracker.nextSeq(),\n });\n };\n const persistentAdapter = createPersistentRuntimeAdapter(config.runtime);\n let result;\n if (persistentAdapter) {\n const running = this.running.get(agentId);\n const adapter = running?.adapter && running.adapter.runtime === config.runtime\n ? running.adapter\n : persistentAdapter;\n if (running) {\n running.adapter = adapter;\n running.state = \"busy\";\n }\n if (!adapter.alive) {\n this.log(`runtime spawn agent=${agentId} runtime=${config.runtime} model=${config.model ?? \"default\"} reasoning=${config.reasoningEffort ?? \"default\"} permission=${config.permissionMode ?? \"default\"} cwd=${workspace.agentDir} launch=${launchId ?? \"-\"} persistent=true`);\n adapter.onExit = (code, signal) => {\n this.log(`runtime exit agent=${agentId} runtime=${config.runtime} code=${code} signal=${signal ?? \"-\"}`);\n const current = this.running.get(agentId);\n if (current?.adapter === adapter && current.state !== \"stopping\") {\n current.state = \"error\";\n this.sendActivity({\n agentId,\n activity: \"error\",\n detail: \"Runtime exited\",\n launchId: current.launchId,\n entries: [{ kind: \"error\", text: `Runtime exited code=${code} signal=${signal ?? \"-\"}`, timestamp: Date.now() }],\n });\n }\n };\n await adapter.start({\n agentId,\n cwd: workspace.agentDir,\n systemPrompt,\n systemPromptPath: workspace.systemPromptPath,\n model: config.model,\n reasoningEffort: config.reasoningEffort,\n permissionMode: config.permissionMode,\n env: runtimeEnv,\n runtimeSessionId: config.sessionId,\n timeoutMs: 180000,\n onEvent,\n requestPermission,\n });\n this.log(`runtime spawned agent=${agentId} runtime=${config.runtime} pid=${adapter.pid ?? \"-\"} persistent=true`);\n } else {\n this.log(`runtime reuse agent=${agentId} runtime=${config.runtime} pid=${adapter.pid ?? \"-\"} adapter_reused=true`);\n }\n result = await adapter.prompt({\n prompt,\n timeoutMs: 180000,\n abortSignal: controller.signal,\n });\n } else {\n const adapter = createRuntimeAdapter(config.runtime);\n this.log(`runtime spawn agent=${agentId} runtime=${config.runtime} model=${config.model ?? \"default\"} reasoning=${config.reasoningEffort ?? \"default\"} permission=${config.permissionMode ?? \"default\"} cwd=${workspace.agentDir} launch=${launchId ?? \"-\"} persistent=false`);\n result = await adapter.run({\n agentId,\n cwd: workspace.agentDir,\n prompt,\n systemPrompt,\n systemPromptPath: workspace.systemPromptPath,\n model: config.model,\n reasoningEffort: config.reasoningEffort,\n permissionMode: config.permissionMode,\n env: runtimeEnv,\n runtimeSessionId: config.sessionId,\n timeoutMs: 180000,\n abortSignal: controller.signal,\n onEvent,\n requestPermission,\n } satisfies RuntimeRunInput);\n }\n flushDeltaLog();\n if (result.runtimeSessionId) {\n this.log(`runtime session agent=${agentId} session=${result.runtimeSessionId}`);\n const running = this.running.get(agentId);\n if (running) {\n running.sessionId = result.runtimeSessionId;\n this.idleConfigs.set(agentId, { config: { ...config, sessionId: result.runtimeSessionId }, sessionId: result.runtimeSessionId, workspace });\n }\n this.options.sendToServer({ type: \"agent:session\", agentId, sessionId: result.runtimeSessionId, launchId });\n }\n await this.writeRunLog(workspace, {\n agentId,\n launchId,\n taskId,\n runtime: config.runtime,\n runtimeSessionId: result.runtimeSessionId,\n status: result.status,\n finalMessage: result.finalMessage,\n errorMessage: result.errorMessage,\n events: result.events,\n });\n if (controller.signal.aborted || (launchId && this.stoppedLaunches.has(launchId))) {\n this.log(`agent done ignored after stop agent=${agentId} launch=${launchId ?? \"-\"}`);\n return;\n }\n this.sendActivity({\n agentId,\n activity: result.status === \"ok\" ? \"idle\" : \"error\",\n detail: result.status,\n launchId,\n entries: tracker.toEntries(result.events),\n });\n this.log(`agent done agent=${agentId} status=${result.status} launch=${launchId ?? \"-\"} events=${result.events.length}${result.errorMessage ? ` error=${compact(result.errorMessage)}` : \"\"}`);\n const runningAfterTurn = this.running.get(agentId);\n if (runningAfterTurn?.adapter && result.status === \"ok\") {\n runningAfterTurn.state = \"idle\";\n runningAfterTurn.sessionId = result.runtimeSessionId ?? runningAfterTurn.sessionId;\n runningAfterTurn.config = { ...config, sessionId: result.runtimeSessionId ?? config.sessionId };\n runningAfterTurn.controller = new AbortController();\n } else {\n this.running.delete(agentId);\n }\n if (result.status === \"ok\") {\n if (this.drainQueuedMessagesAfterTurn(agentId, config, workspace, launchId, result.runtimeSessionId)) {\n return;\n }\n this.options.sendToServer({\n type: \"agent:availability\",\n agentId,\n daemonState: \"wakeable\",\n sessionId: result.runtimeSessionId ?? this.idleConfigs.get(agentId)?.sessionId,\n launchId,\n });\n } else {\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId });\n }\n }\n\n async deliverMessage(agentId: string, message: DeliveredMessage, deliveryId: string, seq: number): Promise<boolean> {\n this.log(`deliver agent=${agentId} seq=${seq} delivery=${deliveryId}`);\n if (this.starting.has(agentId)) {\n this.log(`deliver queued during start agent=${agentId} seq=${seq}`);\n this.rememberQueuedMessageLaunch([message], deliveryId, message.message_id);\n this.pushInbox(this.startingInboxes, agentId, [message]);\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Message queued during startup\",\n entries: [{ kind: \"status\", text: \"Message queued during startup\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n return true;\n }\n const running = this.running.get(agentId);\n if (!running) {\n const idle = this.idleConfigs.get(agentId);\n if (idle) {\n this.log(`deliver resume agent=${agentId} seq=${seq}`);\n if (idle.workspace) {\n await this.recordDeliveredMessageNote(idle.workspace, message, seq);\n }\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n await this.enqueueStart({\n agentId,\n config: { ...idle.config, sessionId: idle.sessionId ?? idle.config.sessionId },\n wakeMessage: message,\n deliveredMessages: [message],\n launchId: deliveryId,\n taskId: message.message_id,\n });\n return true;\n }\n this.log(`deliver skipped agent=${agentId} reason=not-running`);\n this.sendDeliverAck(agentId, seq, deliveryId, false, \"not_running\");\n return false;\n }\n await this.recordDeliveredMessageNote(running.workspace, message, seq);\n this.rememberQueuedMessageLaunch([message], deliveryId, message.message_id);\n if (running.state === \"idle\" && running.adapter) {\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n const controller = new AbortController();\n running.controller = controller;\n running.state = \"busy\";\n running.launchId = deliveryId;\n running.done = this.runAgentRuntime({\n agentId,\n config: { ...running.config, sessionId: running.sessionId ?? running.config.sessionId },\n workspace: running.workspace,\n wakeMessage: message,\n deliveredMessages: [message],\n launchId: deliveryId,\n taskId: message.message_id,\n runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(running.workspace, running.config, agentId),\n controller,\n }).catch((error) => {\n const detail = error instanceof Error ? error.message : String(error);\n this.log(`idle delivery failed agent=${agentId} error=${detail}`);\n });\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Message delivered to idle persistent runtime\",\n launchId: deliveryId,\n entries: [{ kind: \"status\", text: \"Message delivered to idle persistent runtime\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n return true;\n }\n this.pushInbox(this.runningInboxes, agentId, [message]);\n this.sendDeliverAck(agentId, seq, deliveryId, true);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: \"Message queued while runtime is busy\",\n launchId: running.launchId,\n entries: [{ kind: \"status\", text: \"Message queued while runtime is busy\", timestamp: Date.now() }],\n pendingInboxCount: this.queuedInboxCount(agentId),\n });\n return true;\n }\n\n private sendDeliverAck(agentId: string, seq: number, deliveryId: string, accepted: boolean, reason?: string): void {\n this.options.sendToServer({ type: \"agent:deliver:ack\", agentId, seq, deliveryId, accepted, reason });\n }\n\n private pushInbox(map: Map<string, DeliveredMessage[]>, agentId: string, messages: DeliveredMessage[]): void {\n const current = map.get(agentId) ?? [];\n map.set(agentId, dedupeDeliveredMessages([...current, ...messages]));\n }\n\n private rememberQueuedMessageLaunch(messages: DeliveredMessage[], launchId?: string, taskId?: string): void {\n for (const message of messages) {\n const key = message.message_id || String(message.seq);\n if (launchId) this.queuedLaunchIds.set(key, launchId);\n if (taskId) this.queuedTaskIds.set(key, taskId);\n }\n }\n\n private queuedInboxCount(agentId: string): number {\n return (this.startingInboxes.get(agentId)?.length ?? 0) + (this.runningInboxes.get(agentId)?.length ?? 0);\n }\n\n private drainQueuedMessagesAfterTurn(\n agentId: string,\n config: AgentConfig,\n workspace: AgentWorkspace,\n launchId?: string,\n runtimeSessionId?: string\n ): boolean {\n const queued = this.runningInboxes.get(agentId) ?? [];\n if (queued.length === 0) return false;\n this.runningInboxes.delete(agentId);\n const sessionId = runtimeSessionId ?? this.idleConfigs.get(agentId)?.sessionId ?? config.sessionId;\n const nextConfig = { ...config, sessionId };\n this.idleConfigs.set(agentId, { config: nextConfig, sessionId, workspace });\n const firstQueuedKey = queued[0] ? (queued[0].message_id || String(queued[0].seq)) : \"\";\n const nextLaunchId = (firstQueuedKey ? this.queuedLaunchIds.get(firstQueuedKey) : undefined) ?? launchId;\n const nextTaskId = (firstQueuedKey ? this.queuedTaskIds.get(firstQueuedKey) : undefined) ?? queued[0]?.message_id;\n for (const message of queued) {\n const key = message.message_id || String(message.seq);\n this.queuedLaunchIds.delete(key);\n this.queuedTaskIds.delete(key);\n }\n this.log(`deliver drain queued agent=${agentId} count=${queued.length} launch=${nextLaunchId ?? \"-\"}`);\n this.sendActivity({\n agentId,\n activity: \"working\",\n detail: `Processing ${queued.length} queued message${queued.length === 1 ? \"\" : \"s\"}`,\n launchId,\n entries: [{ kind: \"status\", text: `Processing ${queued.length} queued message${queued.length === 1 ? \"\" : \"s\"}`, timestamp: Date.now() }],\n pendingInboxCount: 0,\n });\n queueMicrotask(() => {\n const running = this.running.get(agentId);\n if (running?.adapter) {\n const controller = new AbortController();\n running.controller = controller;\n running.config = nextConfig;\n running.state = \"busy\";\n running.launchId = nextLaunchId;\n running.done = this.runAgentRuntime({\n agentId,\n config: nextConfig,\n workspace,\n wakeMessage: queued[0],\n deliveredMessages: queued,\n launchId: nextLaunchId,\n taskId: nextTaskId,\n runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(workspace, nextConfig, agentId),\n controller,\n }).catch((error) => {\n this.log(`queued delivery follow-up failed agent=${agentId} error=${error instanceof Error ? error.message : String(error)}`);\n });\n return;\n }\n this.running.delete(agentId);\n void this.enqueueStart({\n agentId,\n config: nextConfig,\n wakeMessage: queued[0],\n deliveredMessages: queued,\n launchId: nextLaunchId,\n taskId: nextTaskId,\n }).catch((error) => {\n this.log(`queued delivery follow-up failed agent=${agentId} error=${error instanceof Error ? error.message : String(error)}`);\n });\n });\n return true;\n }\n\n private async recordDeliveredMessageNote(workspace: AgentWorkspace, message: DeliveredMessage, seq: number): Promise<void> {\n await mkdir(workspace.notesDir, { recursive: true });\n await writeFile(\n path.join(workspace.notesDir, `deliver-${seq}.md`),\n formatDeliveredMessage(message),\n \"utf8\"\n );\n }\n\n private async stopAgent(agentId: string, reason: string): Promise<void> {\n this.log(`agent stop agent=${agentId} reason=${reason}`);\n this.cancelledStarts.add(agentId);\n this.idleConfigs.delete(agentId);\n this.startingInboxes.delete(agentId);\n this.runningInboxes.delete(agentId);\n this.rejectPendingPermissionsForAgent(agentId, \"agent stopped\");\n const running = this.running.get(agentId);\n if (!running) {\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\" });\n this.sendActivity({ agentId, activity: \"offline\", detail: \"Stopped\", entries: [{ kind: \"status\", text: \"Stopped\", timestamp: Date.now() }] });\n return;\n }\n running.stopped = true;\n running.state = \"stopping\";\n if (running.launchId) this.stoppedLaunches.add(running.launchId);\n if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n this.running.delete(agentId);\n running.controller.abort();\n await running.adapter?.destroy(\"stop\");\n this.killFakeRuntimeChild(agentId, \"stop\");\n this.sendActivity({\n agentId,\n activity: \"offline\",\n detail: \"Stopped\",\n launchId: running.launchId,\n entries: [{ kind: \"status\", text: \"Stopped\", timestamp: Date.now() }],\n });\n this.options.sendToServer({ type: \"agent:status\", agentId, status: \"inactive\", launchId: running.launchId });\n await Promise.race([\n running.done?.catch(() => undefined) ?? Promise.resolve(),\n new Promise((resolve) => setTimeout(resolve, 5000)),\n ]);\n }\n\n private rejectPendingPermissionsForAgent(agentId: string, reason: string): void {\n for (const [requestId, pending] of this.pendingPermissions) {\n if (pending.agentId !== agentId) continue;\n clearTimeout(pending.timeout);\n this.pendingPermissions.delete(requestId);\n pending.resolve({ action: \"reject\", metadata: { reason } });\n }\n }\n\n private async runFakeRuntime(input: {\n agentId: string;\n config: { serverUrl: string; authToken: string; runtime: AgentRuntime; model?: string; reasoningEffort?: string; permissionMode?: \"default\" | \"full_access\" };\n workspace: AgentWorkspace;\n wakeMessage?: DeliveredMessage;\n abortSignal?: AbortSignal;\n launchId?: string;\n }): Promise<{ runtimeSessionId: string; finalMessage: string; events: Array<{ type: string; content?: string }> }> {\n const { agentId, config, workspace, wakeMessage, abortSignal, launchId } = input;\n let child: ChildProcess | undefined;\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n child = this.spawnFakeRuntimeChild({ agentId, config, workspace, launchId });\n }\n try {\n await sleep(fakeRuntimeDelayMs(), abortSignal);\n if (abortSignal?.aborted) throw new Error(\"Fake runtime aborted\");\n } finally {\n if (child) await this.stopFakeRuntimeChild(agentId, child, \"turn-complete\");\n }\n const text = `\u6536\u5230\uFF1A${wakeMessage?.content ?? \"hello\"}`;\n if (wakeMessage) {\n await fetch(new URL(`/internal/agent/${agentId}/send`, config.serverUrl), {\n method: \"POST\",\n headers: { authorization: `Bearer ${config.authToken}`, \"content-type\": \"application/json\" },\n body: JSON.stringify({ target: wakeMessage.target, text }),\n });\n }\n const sessionId = `fake-${Date.now()}`;\n return {\n runtimeSessionId: sessionId,\n finalMessage: wakeMessage ? text : \"Startup complete\",\n events: [{ type: \"assistant_result\", content: wakeMessage ? text : \"Startup complete\" }],\n };\n }\n\n private spawnFakeRuntimeChild(input: {\n agentId: string;\n config: { runtime: AgentRuntime; model?: string; reasoningEffort?: string; permissionMode?: \"default\" | \"full_access\" };\n workspace: AgentWorkspace;\n launchId?: string;\n }): ChildProcess {\n this.killFakeRuntimeChild(input.agentId, \"replace\");\n this.log(`runtime spawn agent=${input.agentId} runtime=${input.config.runtime} model=${input.config.model ?? \"default\"} reasoning=${input.config.reasoningEffort ?? \"default\"} permission=${input.config.permissionMode ?? \"default\"} cwd=${input.workspace.agentDir} launch=${input.launchId ?? \"-\"}`);\n const child = spawn(process.execPath, [\n \"-e\",\n [\n \"process.title='wm-fake-runtime-child';\",\n \"process.on('SIGTERM',()=>process.exit(0));\",\n \"process.on('SIGINT',()=>process.exit(0));\",\n \"setInterval(()=>{},1000);\",\n ].join(\"\"),\n ], {\n cwd: input.workspace.agentDir,\n env: {\n ...process.env,\n WM_FAKE_RUNTIME_AGENT_ID: input.agentId,\n WM_FAKE_RUNTIME_LAUNCH_ID: input.launchId ?? \"\",\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n this.fakeRuntimeChildren.set(input.agentId, child);\n this.log(`runtime pid agent=${input.agentId} pid=${child.pid ?? \"-\"} cwd=${input.workspace.agentDir}`);\n child.once(\"exit\", () => {\n if (this.fakeRuntimeChildren.get(input.agentId) === child) this.fakeRuntimeChildren.delete(input.agentId);\n });\n return child;\n }\n\n private killFakeRuntimeChild(agentId: string, reason: string): void {\n const child = this.fakeRuntimeChildren.get(agentId);\n if (!child) return;\n this.log(`runtime kill agent=${agentId} pid=${child.pid ?? \"-\"} reason=${reason}`);\n this.fakeRuntimeChildren.delete(agentId);\n if (!child.killed) child.kill(\"SIGTERM\");\n }\n\n private async stopFakeRuntimeChild(agentId: string, child: ChildProcess, reason: string): Promise<void> {\n if (this.fakeRuntimeChildren.get(agentId) !== child) return;\n this.killFakeRuntimeChild(agentId, reason);\n await Promise.race([\n new Promise((resolve) => child.once(\"exit\", resolve)),\n new Promise((resolve) => setTimeout(resolve, 1000)),\n ]);\n if (!child.killed && child.exitCode === null) child.kill(\"SIGKILL\");\n }\n\n private async writeRuntimeEnv(\n workspace: AgentWorkspace,\n config: { serverUrl: string; authToken: string; runtime: AgentRuntime; serverNamespace: string; machineId: string; envVars?: Record<string, string> },\n agentId: string\n ): Promise<void> {\n const customEnv = Object.entries(config.envVars ?? {}).map(([key, value]) => `${key}=${escapeEnvValue(value)}`);\n await mkdir(workspace.wmDir, { recursive: true });\n await writeFile(\n path.join(workspace.wmDir, \"runtime-env\"),\n [\n `WM_AGENT_ID=${agentId}`,\n `WM_CLI_PATH=${workspace.wrapperPath}`,\n `WM_SERVER_URL=${config.serverUrl}`,\n `WM_AGENT_TOKEN=${config.authToken}`,\n `WM_DAEMON_RUNTIME=${config.runtime}`,\n `WM_DAEMON_SERVER_NAMESPACE=${config.serverNamespace}`,\n `WM_DAEMON_MACHINE_ID=${config.machineId}`,\n `NO_PROXY=127.0.0.1,localhost,::1,${process.env.NO_PROXY ?? \"\"}`,\n `no_proxy=127.0.0.1,localhost,::1,${process.env.no_proxy ?? \"\"}`,\n ...customEnv,\n \"\",\n ].join(\"\\n\"),\n \"utf8\"\n );\n }\n\n private buildRuntimeEnv(\n workspace: AgentWorkspace,\n config: { serverUrl: string; authToken: string; runtime: AgentRuntime; serverNamespace: string; machineId: string; envVars?: Record<string, string> },\n agentId: string\n ): NodeJS.ProcessEnv {\n return {\n ...process.env,\n ...(config.envVars ?? {}),\n PATH: `${workspace.wmDir}${path.delimiter}${process.env.PATH ?? \"\"}`,\n WM_AGENT_ID: agentId,\n WM_CLI_PATH: workspace.wrapperPath,\n WM_SERVER_URL: config.serverUrl,\n WM_AGENT_TOKEN: config.authToken,\n WM_DAEMON_RUNTIME: config.runtime,\n WM_DAEMON_SERVER_NAMESPACE: config.serverNamespace,\n WM_DAEMON_MACHINE_ID: config.machineId,\n NO_PROXY: `127.0.0.1,localhost,::1,${process.env.NO_PROXY ?? \"\"}`,\n no_proxy: `127.0.0.1,localhost,::1,${process.env.no_proxy ?? \"\"}`,\n };\n }\n\n private async replyWorkspaceList(agentId: string, requestId: string, dirPath?: string, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n this.log(`workspace list agent=${agentId} request=${requestId} path=${dirPath ?? \".\"}`);\n const ensured = await this.ensureAgentWorkspace(agentId, config);\n if (ensured.missing) {\n this.options.sendToServer({ type: \"agent:workspace:file_tree\", agentId, requestId, entries: [], missing: true });\n return;\n }\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const entries = await this.browser.listFiles(agentId, dirPath, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n this.options.sendToServer({ type: \"agent:workspace:file_tree\", agentId, requestId, entries });\n } catch (error) {\n this.log(`workspace list failed agent=${agentId} request=${requestId} error=${error instanceof Error ? error.message : String(error)}`);\n this.options.sendToServer({\n type: \"agent:workspace:file_tree\",\n agentId,\n requestId,\n entries: [],\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyWorkspaceRead(agentId: string, requestId: string, filePath: string, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n this.log(`workspace read agent=${agentId} request=${requestId} path=${filePath}`);\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const file = await this.browser.readFile(agentId, filePath, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n this.options.sendToServer({ type: \"agent:workspace:file_content\", agentId, requestId, file });\n } catch (error) {\n this.log(`workspace read failed agent=${agentId} request=${requestId} error=${error instanceof Error ? error.message : String(error)}`);\n this.options.sendToServer({\n type: \"agent:workspace:file_content\",\n agentId,\n requestId,\n file: null,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyWorkspaceWrite(agentId: string, requestId: string, filePath: string, content: string, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n this.log(`workspace write agent=${agentId} request=${requestId} path=${filePath}`);\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const result = await this.browser.writeFile(agentId, filePath, content, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n this.options.sendToServer({ type: \"agent:workspace:write_result\", agentId, requestId, ...result });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:workspace:write_result\",\n agentId,\n requestId,\n path: filePath,\n ok: false,\n error: error instanceof Error ? error.message : \"workspace write failed\",\n });\n }\n }\n\n private async replyAgentSkillsList(agentId: string, requestId: string, runtime: RuntimeId, serverNamespace?: string, machineId?: string, config?: AgentConfig): Promise<void> {\n try {\n const ensured = await this.ensureAgentWorkspace(agentId, config);\n const effectiveConfig = config ?? this.running.get(agentId)?.config ?? this.idleConfigs.get(agentId)?.config;\n const namespace = serverNamespace ?? effectiveConfig?.serverNamespace;\n const machine = machineId ?? effectiveConfig?.machineId;\n if (!namespace || !machine) throw new Error(`Unknown agent workspace: ${agentId}`);\n const result = await scanAgentSkills({\n rootDir: this.options.rootDir,\n serverNamespace: namespace,\n machineDirectoryName: this.machineDirectoryName(effectiveConfig),\n machineId: machine,\n agentDirectoryName: effectiveConfig ? this.agentDirectoryName(effectiveConfig, agentId) : namedWorkspaceDirectoryName(agentId, agentId, \"agent\"),\n agentId,\n runtime,\n });\n this.options.sendToServer({ type: \"agent:skills:list/result\", agentId, requestId, global: result.global, workspace: result.workspace });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:skills:list/result\",\n agentId,\n requestId,\n global: [],\n workspace: [],\n error: error instanceof Error ? error.message : \"skills scan failed\",\n });\n }\n }\n\n private async replyMachineWorkspaceScan(requestId: string, serverNamespace: string, machineId: string, machineName: string | undefined, knownAgentIds: string[]): Promise<void> {\n try {\n const entries = await this.scanWorkspaces(serverNamespace, machineId, machineName, new Set(knownAgentIds));\n this.options.sendToServer({ type: \"machine:workspace:scan/result\", requestId, entries });\n } catch (error) {\n this.options.sendToServer({\n type: \"machine:workspace:scan/result\",\n requestId,\n entries: [],\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyMachineWorkspaceDelete(requestId: string, serverNamespace: string, machineId: string, machineName: string | undefined, directoryName: string): Promise<void> {\n try {\n if (!isSafeWorkspaceDirectoryName(directoryName)) throw new Error(\"unsafe workspace directory name\");\n if (this.running.has(directoryName) || this.starting.has(directoryName)) throw new Error(\"cannot delete a running workspace\");\n const target = this.resolveWorkspaceDirectoryName(machineName ?? machineId, machineId, directoryName);\n await rm(target, { recursive: true, force: true });\n this.options.sendToServer({ type: \"machine:workspace:delete/result\", requestId, directoryName, ok: true });\n } catch (error) {\n this.options.sendToServer({\n type: \"machine:workspace:delete/result\",\n requestId,\n directoryName,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyResetWorkspace(requestId: string, agentId: string, config: AgentConfig): Promise<void> {\n try {\n await this.stopAgent(agentId, \"reset-workspace\");\n const target = this.resolveWorkspaceDirectory(config, agentId);\n await rm(target, { recursive: true, force: true });\n const workspace = await createAgentWorkspace({\n rootDir: this.options.rootDir,\n serverNamespace: config.serverNamespace,\n serverId: config.spaceId,\n machineDirectoryName: this.machineDirectoryName(config),\n machineId: config.machineId,\n agentDirectoryName: this.agentDirectoryName(config, agentId),\n daemonId: os.hostname() || \"local-daemon\",\n agentId,\n agentName: config.agentName,\n runtime: config.runtime,\n role: config.role,\n feishuDelegationEnabled: config.feishuDelegationEnabled,\n });\n this.idleConfigs.set(agentId, { config, sessionId: config.sessionId, workspace });\n this.options.sendToServer({ type: \"agent:reset-workspace/result\", requestId, agentId, ok: true });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:reset-workspace/result\",\n requestId,\n agentId,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async replyAgentDiagnostic(requestId: string, agentId: string, config?: AgentConfig): Promise<void> {\n try {\n const snapshot = await this.buildAgentDiagnostic(agentId, config);\n this.options.sendToServer({ type: \"agent:diagnostic/result\", requestId, agentId, ok: true, snapshot });\n } catch (error) {\n this.options.sendToServer({\n type: \"agent:diagnostic/result\",\n requestId,\n agentId,\n ok: false,\n snapshot: {\n agentId,\n daemonState: \"offline\",\n workspaceExists: false,\n pendingInboxCount: this.queuedInboxCount(agentId),\n },\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async buildAgentDiagnostic(agentId: string, config?: AgentConfig): Promise<AgentDiagnosticSnapshot> {\n const running = this.running.get(agentId);\n const idle = this.idleConfigs.get(agentId);\n const effectiveConfig = running?.config ?? idle?.config ?? config;\n const workspace = running?.workspace ?? idle?.workspace;\n const workspacePath = workspace?.agentDir ?? (effectiveConfig ? this.resolveWorkspaceDirectory(effectiveConfig, agentId) : undefined);\n const workspaceExists = workspacePath ? await pathExists(workspacePath) : false;\n return {\n agentId,\n daemonState: this.starting.has(agentId) ? \"starting\" : running ? running.state === \"idle\" ? \"idle\" : \"running\" : idle ? \"idle\" : \"offline\",\n runtime: effectiveConfig?.runtime,\n model: effectiveConfig?.model,\n sessionId: running?.sessionId ?? idle?.sessionId ?? effectiveConfig?.sessionId,\n launchId: running?.launchId,\n runtimePid: running?.adapter?.pid ?? this.fakeRuntimeChildren.get(agentId)?.pid,\n workspacePath,\n workspaceExists,\n pendingInboxCount: this.queuedInboxCount(agentId),\n lastActivity: this.lastActivities.get(agentId),\n };\n }\n\n private async scanWorkspaces(serverNamespace: string, machineId: string, machineName: string | undefined, knownAgentIds: Set<string>): Promise<MachineWorkspaceEntry[]> {\n const machineRoot = this.resolveMachineRoot(machineName ?? machineId, machineId);\n const names = await readdir(machineRoot, { withFileTypes: true }).catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n });\n const entries: MachineWorkspaceEntry[] = [];\n for (const entry of names) {\n if (!entry.isDirectory() || !isSafeWorkspaceDirectoryName(entry.name)) continue;\n const fullPath = this.resolveWorkspaceDirectoryName(machineName ?? machineId, machineId, entry.name);\n const summary = await summarizeDirectory(fullPath);\n const agentId = agentIdFromDirectoryName(entry.name, knownAgentIds);\n entries.push({\n directoryName: entry.name,\n agentId,\n workspacePath: `~/.wm/${this.machineDirectoryNameForParts(machineName ?? machineId, machineId)}/${entry.name}/`,\n knownToServer: knownAgentIds.has(agentId),\n running: this.running.has(agentId) || this.starting.has(agentId),\n fileCount: summary.fileCount,\n totalSizeBytes: summary.totalSizeBytes,\n lastModified: summary.lastModified,\n });\n }\n return entries.sort((a, b) => b.lastModified - a.lastModified || a.directoryName.localeCompare(b.directoryName));\n }\n\n private resolveMachineRoot(machineName: string, machineId: string): string {\n const machineDirectoryName = this.machineDirectoryNameForParts(machineName, machineId);\n if (!isSafeWorkspaceDirectoryName(machineDirectoryName)) throw new Error(\"unsafe machine directory\");\n const resolved = path.resolve(this.options.rootDir, machineDirectoryName);\n const base = path.resolve(this.options.rootDir);\n if (resolved !== base && !resolved.startsWith(`${base}${path.sep}`)) throw new Error(\"workspace root escapes daemon root\");\n return resolved;\n }\n\n private machineDirectoryName(config?: AgentConfig): string {\n return this.machineDirectoryNameForParts(config?.machineName ?? this.options.machineDisplayName, config?.machineId ?? \"machine\");\n }\n\n private machineDirectoryNameForParts(machineName: string, machineId: string): string {\n return namedWorkspaceDirectoryName(machineName, machineId, \"machine\");\n }\n\n private agentDirectoryName(config: AgentConfig, agentId: string): string {\n return namedWorkspaceDirectoryName(config.agentName, agentId, \"agent\");\n }\n\n private workspaceDisplayPath(config: AgentConfig, agentId: string): string {\n return `~/.wm/${this.machineDirectoryName(config)}/${this.agentDirectoryName(config, agentId)}/`;\n }\n\n private resolveWorkspaceDirectory(config: AgentConfig, agentId: string): string {\n return this.resolveWorkspaceDirectoryForParts(config.machineName ?? this.options.machineDisplayName, config.machineId, config.agentName, agentId);\n }\n\n private resolveWorkspaceDirectoryForParts(machineName: string, machineId: string, agentName: string, agentId: string): string {\n const directoryName = namedWorkspaceDirectoryName(agentName, agentId, \"agent\");\n return this.resolveWorkspaceDirectoryName(machineName, machineId, directoryName);\n }\n\n private resolveWorkspaceDirectoryName(machineName: string, machineId: string, directoryName: string): string {\n if (!isSafeWorkspaceDirectoryName(directoryName)) throw new Error(\"unsafe workspace directory name\");\n const machineRoot = this.resolveMachineRoot(machineName, machineId);\n const resolved = path.resolve(machineRoot, directoryName);\n if (resolved !== machineRoot && !resolved.startsWith(`${machineRoot}${path.sep}`)) {\n throw new Error(\"workspace directory escapes machine root\");\n }\n return resolved;\n }\n\n private log(line: string): void {\n this.options.log?.(`[agent] ${line}`);\n }\n\n private async writeRunLog(\n workspace: AgentWorkspace,\n input: {\n agentId: string;\n launchId?: string;\n taskId?: string;\n runtime: AgentRuntime;\n runtimeSessionId?: string;\n status: string;\n finalMessage: string;\n errorMessage?: string;\n events: unknown[];\n }\n ): Promise<void> {\n await mkdir(workspace.runsDir, { recursive: true });\n const timestamp = new Date().toISOString();\n const runPath = path.join(workspace.runsDir, `${timestamp.replace(/[:.]/g, \"-\")}.jsonl`);\n const records = [\n {\n type: \"run\",\n timestamp,\n agentId: input.agentId,\n launchId: input.launchId,\n taskId: input.taskId,\n runtime: input.runtime,\n runtimeSessionId: input.runtimeSessionId,\n status: input.status,\n errorMessage: input.errorMessage,\n },\n ...input.events.map((event) => ({ type: \"runtime_event\", timestamp: Date.now(), event })),\n {\n type: \"final\",\n timestamp: new Date().toISOString(),\n status: input.status,\n text: input.finalMessage,\n errorMessage: input.errorMessage,\n },\n ];\n await writeFile(runPath, records.map((record) => JSON.stringify(record)).join(\"\\n\") + \"\\n\", \"utf8\");\n }\n}\n\nfunction compact(text: string): string {\n const value = text.replace(/\\s+/g, \" \").trim();\n return value.length > 120 ? `${value.slice(0, 117)}...` : value;\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction threadReplyTarget(message: DeliveredMessage | undefined): string {\n if (!message?.target) return \"#all\";\n if (message.target.includes(\":\")) return message.target;\n if ((message.target.startsWith(\"#\") || message.target.startsWith(\"dm:@\")) && message.message_id) {\n return `${message.target}:${message.message_id.slice(0, 8)}`;\n }\n return message.target;\n}\n\nfunction formatStartupPrompt(wrapperPath: string): string {\n return [\n \"Start this platform-created agent session.\",\n \"\",\n \"This is an initialization turn only. There is no user channel message, no direct message, and no task to answer.\",\n \"Read the local MEMORY.md if you need to understand your durable identity and workspace.\",\n `The agent-local wm CLI wrapper is available at ${wrapperPath}. Do not call it during this initialization turn unless you are explicitly checking identity with a read-only command.`,\n \"Do not send any platform message, do not invent a channel target, and do not reply to #all.\",\n \"When initialization is complete, stop with a short runtime final output such as \\\"Startup complete\\\".\",\n ].join(\"\\n\");\n}\n\nfunction formatActionableMessagePrompt(messages: DeliveredMessage[], wrapperPath: string): string {\n const first = messages[0];\n const receivedTarget = first?.target ?? \"#all\";\n const replyTarget = threadReplyTarget(first);\n const replyCommand = [\n `${shellSingleQuote(wrapperPath)} message send --target ${shellSingleQuote(replyTarget)} <<'EOF'`,\n \"your reply\",\n \"EOF\",\n ].join(\"\\n\");\n return [\n formatMessageBatchPrompt(messages, wrapperPath),\n \"\",\n `Received target: ${receivedTarget}`,\n first?.message_id ? `Message ID: ${first.message_id}` : \"Message ID: unknown\",\n `Thread reply target: ${replyTarget}`,\n \"\",\n \"Before acting, identify the requested work surface: Wage Mule platform, local workspace, or an external system. Use the tool for that surface.\",\n \"Platform-agent collaboration rule: if this message asks you to ask, check, confirm, contact, or get status from another platform agent, do not inspect local process/workspace/server activity/task list to answer for them. Ask that agent in this exact thread target with an @mention, wait for their platform reply, then summarize in the same thread.\",\n \"External-system rule: if the user names an external system such as Feishu/Lark, do the action through that external skill, CLI, token, or API, then report the result in this thread. Do not replace an external contact request with a platform mention.\",\n \"\",\n \"Complete the requested work. When you have a channel-visible final reply, send it with this agent-local absolute command:\",\n replyCommand,\n \"Do not call a global wm binary for platform replies. If this absolute wrapper fails, report the exact failure in your runtime final output.\",\n \"Do not rely on runtime final output as the platform reply.\",\n ].join(\"\\n\");\n}\n\nfunction formatMessageBatchPrompt(messages: DeliveredMessage[], wrapperPath: string): string {\n if (messages.length === 0) return \"\";\n if (messages.length === 1) return formatDeliveredMessage(messages[0]);\n const replyTarget = threadReplyTarget(messages[0]);\n const replyCommand = [\n `${shellSingleQuote(wrapperPath)} message send --target ${shellSingleQuote(replyTarget)} <<'EOF'`,\n \"your reply\",\n \"EOF\",\n ].join(\"\\n\");\n return [\n \"New platform messages were delivered while you were busy. Process each message below in order.\",\n \"\",\n messages.map((message) => formatDeliveredMessage(message)).join(\"\\n\\n---\\n\\n\"),\n \"\",\n \"Use the agent-local wm CLI wrapper for any channel-visible replies:\",\n replyCommand,\n \"\",\n `Use thread target ${replyTarget} when the delivered message is part of, or should create, a thread.`,\n \"\",\n \"Complete all work that is now actionable before stopping.\",\n ].join(\"\\n\");\n}\n\nfunction dedupeDeliveredMessages(messages: DeliveredMessage[]): DeliveredMessage[] {\n const seen = new Set<string>();\n const deduped: DeliveredMessage[] = [];\n for (const message of messages) {\n const key = message.message_id || String(message.seq);\n if (seen.has(key)) continue;\n seen.add(key);\n deduped.push(message);\n }\n return deduped;\n}\n\nfunction feishuDelegationLookbackMinutes(intervalSeconds: number): number {\n return Math.min(60, Math.max(2, Math.ceil((intervalSeconds + 60) / 60)));\n}\n\nfunction selectRuntimeModel(detection: RuntimeModelDetectionResult, requestedModel: string): RuntimeModelDescriptor | undefined {\n if (detection.models.length === 0) {\n if (requestedModel === \"default\") return undefined;\n throw new Error(`unsupported model for ${detection.runtime}: ${requestedModel}`);\n }\n if (requestedModel === \"default\") {\n return detection.models.find((model) => model.id === detection.defaultModel)\n ?? detection.models.find((model) => model.default)\n ?? detection.models[0];\n }\n const model = detection.models.find((candidate) => candidate.id === requestedModel);\n if (!model) throw new Error(`unsupported model for ${detection.runtime}: ${requestedModel}`);\n return model;\n}\n\nfunction escapeEnvValue(value: string): string {\n return String(value).replace(/\\n/g, \"\\\\n\");\n}\n\nfunction fakeRuntimeDelayMs(): number {\n const raw = Number(process.env.WM_DAEMON_FAKE_RUNTIME_DELAY_MS);\n return Number.isFinite(raw) && raw >= 0 ? raw : 200;\n}\n\nasync function summarizeDirectory(root: string): Promise<{ fileCount: number; totalSizeBytes: number; lastModified: number }> {\n let fileCount = 0;\n let totalSizeBytes = 0;\n let lastModified = 0;\n const visit = async (dir: string): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const info = await stat(fullPath);\n lastModified = Math.max(lastModified, info.mtimeMs);\n if (entry.isDirectory()) {\n await visit(fullPath);\n } else {\n fileCount += 1;\n totalSizeBytes += info.size;\n }\n }\n };\n const rootInfo = await stat(root);\n lastModified = rootInfo.mtimeMs;\n await visit(root);\n return { fileCount, totalSizeBytes, lastModified };\n}\n\nfunction agentIdFromDirectoryName(directoryName: string, knownAgentIds: Set<string>): string {\n for (const agentId of knownAgentIds) {\n if (directoryName.endsWith(`-${agentId}`)) return agentId;\n }\n return directoryName;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n if (abortSignal?.aborted) return Promise.reject(new Error(\"Runtime aborted\"));\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"Runtime aborted\"));\n };\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n", "export type RuntimeId = \"codex\" | \"claude\" | \"kimi\" | \"gemini\" | \"cursor\" | \"hermes\" | \"opencode\";\nexport type SpaceRole = \"owner\" | \"admin\" | \"member\";\nexport type MemberType = \"human\" | \"agent\";\nexport type TaskStatus = \"todo\" | \"in_progress\" | \"in_review\" | \"done\" | \"cancelled\";\nexport type TaskSource = \"channel\" | \"feishu\";\nexport type AgentPresence = \"idle\" | \"working\" | \"thinking\" | \"error\" | \"offline\";\nexport type AgentDaemonState = \"unavailable\" | \"inactive\" | \"wakeable\" | \"active\";\nexport type AgentActivity = \"idle\" | \"working\" | \"thinking\" | \"error\" | \"offline\" | \"unknown\";\nexport type AgentPermissionMode = \"default\" | \"full_access\";\nexport type ChannelVisibility = \"public\" | \"private\";\nexport type MessageKind = \"human\" | \"agent\" | \"system\";\nexport type RunStatus = \"running\" | \"completed\" | \"failed\";\n\nexport type ActivityEntryKind =\n | \"text\"\n | \"thinking\"\n | \"tool_start\"\n | \"tool_end\"\n | \"compaction_started\"\n | \"compaction_finished\"\n | \"status\"\n | \"error\";\n\nexport interface Space {\n id: string;\n name: string;\n owner_user_id: string;\n created_at: number;\n}\n\nexport interface HumanUser {\n id: string;\n name: string;\n display_name?: string;\n email: string;\n created_at: number;\n}\n\nexport interface HumanFeishuBinding {\n space_id: string;\n human_id: string;\n app_id: string;\n app_display_name: string;\n status: \"pending_oauth\" | \"active\" | \"error\";\n has_user_token: boolean;\n open_id?: string;\n union_id?: string;\n updated_at: number;\n}\n\nexport interface FeishuInvite {\n id: string;\n space_id: string;\n inviter_human_id: string;\n invitee_open_id: string;\n invitee_name: string;\n status: \"pending\" | \"accepted\" | \"expired\" | \"cancelled\";\n expires_at: number;\n accepted_by_user_id?: string;\n created_at: number;\n used_at?: number;\n}\n\nexport interface HumanDelegation {\n id: string;\n space_id: string;\n human_id: string;\n medium: \"feishu\";\n delegate_agent_id: string;\n enabled: boolean;\n interval_seconds: number;\n consecutive_failures: number;\n last_wake_at?: number;\n last_success_at?: number;\n feishu_channel_id?: string;\n created_at: number;\n updated_at: number;\n}\n\nexport interface MemberFindResult {\n human?: {\n id: string;\n name: string;\n email?: string;\n feishu_open_id?: string;\n };\n agents: Array<{\n agent_id: string;\n name: string;\n runtime: RuntimeId;\n online: boolean;\n machine_id: string;\n }>;\n}\n\nexport interface Machine {\n id: string;\n space_id: string;\n name: string;\n hostname: string;\n os: string;\n daemon_version: string;\n latest_daemon_version?: string;\n daemon_update_available?: boolean;\n daemon_version_status?: \"up_to_date\" | \"outdated\" | \"current\" | \"unknown\";\n runtimes: RuntimeId[];\n runtime_models?: RuntimeModelDetectionResult[];\n status: \"online\" | \"offline\";\n connected_at?: number;\n last_seen_at?: number;\n created_at?: number;\n removed_at?: number;\n connect_command?: string;\n}\n\nexport interface Agent {\n id: string;\n space_id: string;\n machine_id: string;\n machine_name?: string;\n owner_user_id?: string;\n channel_id?: string;\n runtime: RuntimeId;\n model: string;\n reasoning_effort?: string;\n permission_mode: AgentPermissionMode;\n name: string;\n display_name: string;\n role: string;\n instructions: string;\n env_vars?: Record<string, string>;\n workspace_path?: string;\n daemon_state?: AgentDaemonState;\n activity?: AgentActivity;\n activity_detail?: string;\n active_launch_id?: string;\n last_activity_at?: number;\n presence: AgentPresence;\n created_at: number;\n updated_at: number;\n last_runtime_session_id?: string;\n}\n\nexport interface Channel {\n id: string;\n space_id: string;\n name: string;\n description?: string;\n visibility: ChannelVisibility;\n is_default: boolean;\n created_by_user_id: string;\n human_member_ids?: string[];\n member_count?: number;\n agent_count?: number;\n unread_count?: number;\n created_at: number;\n archived_at?: number;\n updated_at?: number;\n}\n\nexport type InboxItemType =\n | \"permission\"\n | \"permission_request\"\n | \"question\"\n | \"confirmation_request\"\n | \"error\"\n | \"completed\"\n | \"alert\"\n | \"feishu_draft\";\nexport type InboxItemStatus =\n | \"open\"\n | \"approved\"\n | \"rejected\"\n | \"confirmed\"\n | \"ignored\"\n | \"acknowledged\"\n | \"sent\"\n | \"failed\"\n | \"resolved\";\nexport type InboxAction = \"approve\" | \"reject\" | \"confirm\" | \"ignore\" | \"ack\";\n\nexport interface InboxItem {\n id: string;\n organization_id: string;\n channel_id?: string;\n task_id?: string;\n run_id?: string;\n type: InboxItemType;\n title: string;\n description: string;\n status: InboxItemStatus;\n metadata: Record<string, unknown>;\n created_at: number;\n resolved_at?: number;\n}\n\nexport interface InboxItemAction {\n id: string;\n inbox_item_id: string;\n action: InboxAction;\n actor_user_id: string;\n note?: string;\n metadata: Record<string, unknown>;\n created_at: number;\n}\n\nexport interface MessageSearchResult {\n message_id: string;\n channel_id?: string;\n dm_pair_key?: string;\n target_type: \"channel\" | \"dm\";\n seq: number;\n snippet: string;\n author: {\n type: MemberType;\n id: string;\n name: string;\n };\n created_at: number;\n channel_name?: string;\n dm_name?: string;\n}\n\nexport interface Message {\n id: string;\n space_id: string;\n channel_id?: string;\n dm_pair_key?: string;\n thread_id?: string;\n seq: number;\n kind: MessageKind;\n author_type: MemberType;\n author_id: string;\n author_name: string;\n text: string;\n attachment_ids?: string[];\n mentions?: string[];\n reply_count?: number;\n created_at: number;\n}\n\nexport interface Task {\n id: string;\n space_id: string;\n channel_id?: string;\n source?: TaskSource;\n source_message_id?: string;\n metadata?: Record<string, unknown>;\n title: string;\n description: string;\n status: TaskStatus;\n assignee_id?: string;\n created_by_user_id: string;\n created_at: number;\n updated_at: number;\n}\n\nexport interface ActivityEntry {\n kind: ActivityEntryKind;\n text?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_output?: string;\n is_error?: boolean;\n timestamp: number;\n}\n\nexport interface AgentRun {\n id: string;\n space_id: string;\n agent_id: string;\n task_id: string;\n launch_id: string;\n status: RunStatus;\n created_at: number;\n updated_at: number;\n completed_at?: number;\n error?: string;\n}\n\nexport interface RunEvent {\n id: string;\n run_id: string;\n seq: number;\n entries: ActivityEntry[];\n created_at: number;\n}\n\nexport interface AttachmentMeta {\n id: string;\n space_id: string;\n filename: string;\n mime_type: string;\n size: number;\n path: string;\n created_at: number;\n}\n\nexport interface Reminder {\n id: string;\n space_id: string;\n agent_id: string;\n title: string;\n fire_at: string;\n recurrence?: string;\n anchor_message_id?: string;\n status: \"scheduled\" | \"fired\" | \"cancelled\";\n version: number;\n created_at: number;\n updated_at: number;\n}\n\nexport interface FileEntry {\n name: string;\n path: string;\n type: \"file\" | \"directory\";\n size: number;\n modified_at: number;\n}\n\nexport interface FileContent {\n path: string;\n content: string | null;\n binary: boolean;\n size: number;\n mime_type?: string;\n encoding?: \"utf8\" | \"base64\";\n}\n\nexport interface AgentSkillDescriptor {\n name: string;\n path: string;\n description?: string;\n userInvocable?: boolean;\n content?: string;\n version?: string;\n loadedVersion?: string;\n updatedAt?: number;\n}\n\nexport interface AgentSkillGroup {\n source: \"global\" | \"workspace\";\n root: string;\n skills: AgentSkillDescriptor[];\n}\n\nexport interface RuntimeModelDescriptor {\n id: string;\n label: string;\n providerId?: string;\n providerLabel?: string;\n default?: boolean;\n fixed?: boolean;\n reasoningEfforts?: string[];\n defaultReasoningEffort?: string;\n}\n\nexport interface RuntimeModelDetectionResult {\n runtime: RuntimeId;\n source: \"static\" | \"codex-cache\" | \"cursor-cli\" | \"kimi-config\" | \"kimi-cli\" | \"hermes-config\" | \"hermes-provider-models\" | \"gemini-cli\" | \"gemini-default\" | \"opencode-cli\" | \"opencode-default\" | \"error\";\n selectable: boolean;\n fixed?: boolean;\n defaultModel?: string;\n models: RuntimeModelDescriptor[];\n error?: string;\n}\n\nexport interface MachineWorkspaceEntry {\n directoryName: string;\n agentId?: string;\n workspacePath?: string;\n knownToServer: boolean;\n running: boolean;\n fileCount: number;\n totalSizeBytes: number;\n lastModified: number;\n}\n\nexport interface AgentDiagnosticSnapshot {\n agentId: string;\n daemonState: \"starting\" | \"running\" | \"idle\" | \"offline\";\n runtime?: RuntimeId;\n model?: string;\n sessionId?: string;\n launchId?: string;\n runtimePid?: number;\n workspacePath?: string;\n workspaceExists: boolean;\n pendingInboxCount: number;\n lastActivity?: {\n activity: AgentActivity;\n detail: string;\n launchId?: string;\n };\n}\n\nexport interface DeliveredMessage {\n target: string;\n message_id: string;\n thread_id?: string;\n parent_message_id?: string;\n seq: number;\n timestamp: string;\n sender_type: MemberType;\n sender_name: string;\n content: string;\n attachments?: Array<{ id: string; filename: string }>;\n task_status?: TaskStatus;\n task_number?: number;\n thread_join_context?: {\n parent_target: string;\n thread_target: string;\n suggested_read_history_target: string;\n parent_message: DeliveredMessage;\n recent_messages: DeliveredMessage[];\n history_truncated?: boolean;\n };\n}\n\nexport interface DaemonMsg_AgentStart {\n type: \"agent:start\";\n agentId: string;\n config: {\n runtime: RuntimeId;\n model: string;\n reasoningEffort?: string;\n permissionMode?: AgentPermissionMode;\n sessionId?: string;\n serverUrl: string;\n authToken: string;\n spaceId: string;\n machineId: string;\n machineName?: string;\n serverNamespace: string;\n agentName: string;\n role?: string;\n envVars?: Record<string, string>;\n feishuDelegationEnabled?: boolean;\n };\n wakeMessage?: DeliveredMessage;\n launchId?: string;\n taskId?: string;\n}\n\nexport interface DaemonMsg_AgentStop {\n type: \"agent:stop\";\n agentId: string;\n}\n\nexport interface DaemonMsg_AgentDeliver {\n type: \"agent:deliver\";\n agentId: string;\n message: DeliveredMessage;\n seq: number;\n deliveryId: string;\n}\n\nexport interface DaemonMsg_AgentDeliverReply {\n type: \"agent:dm:reply\";\n agentId: string;\n waitToken: string;\n replyMessageId: string;\n text: string;\n senderAgentId: string;\n senderName: string;\n timestamp: string;\n}\n\nexport interface DaemonMsg_ActivityProbe {\n type: \"agent:activity_probe\";\n agentId: string;\n probeId: string;\n}\n\nexport interface DaemonMsg_WorkspaceList {\n type: \"agent:workspace:list\";\n agentId: string;\n requestId: string;\n path?: string;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_WorkspaceRead {\n type: \"agent:workspace:read\";\n agentId: string;\n requestId: string;\n path: string;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_WorkspaceWrite {\n type: \"agent:workspace:write\";\n agentId: string;\n requestId: string;\n path: string;\n content: string;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_AgentSkillsList {\n type: \"agent:skills:list\";\n agentId: string;\n requestId: string;\n runtime: RuntimeId;\n serverNamespace?: string;\n machineId?: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_AgentWorkspaceInit {\n type: \"agent:workspace:init\";\n requestId: string;\n agentId: string;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuTokenWrite {\n type: \"feishu:token:write\";\n requestId: string;\n agentId: string;\n token: string;\n appId: string;\n brand?: \"feishu\" | \"lark\";\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuTokenClear {\n type: \"feishu:token:clear\";\n requestId: string;\n agentId: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuDelegationStart {\n type: \"feishu:delegation:start\";\n requestId: string;\n delegation: HumanDelegation;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_FeishuDelegationStop {\n type: \"feishu:delegation:stop\";\n requestId: string;\n delegationId: string;\n agentId: string;\n}\n\nexport interface DaemonMsg_FeishuDelegationUpdate {\n type: \"feishu:delegation:update\";\n requestId: string;\n delegation: HumanDelegation;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_RuntimeModelsDetect {\n type: \"machine:runtime_models:detect\";\n requestId: string;\n runtimes?: RuntimeId[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceScan {\n type: \"machine:workspace:scan\";\n requestId: string;\n serverNamespace: string;\n machineId: string;\n machineName?: string;\n knownAgentIds?: string[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceDelete {\n type: \"machine:workspace:delete\";\n requestId: string;\n serverNamespace: string;\n machineId: string;\n machineName?: string;\n directoryName: string;\n}\n\nexport interface DaemonMsg_AgentResetWorkspace {\n type: \"agent:reset-workspace\";\n requestId: string;\n agentId: string;\n config: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_AgentDiagnostic {\n type: \"agent:diagnostic\";\n requestId: string;\n agentId: string;\n config?: DaemonMsg_AgentStart[\"config\"];\n}\n\nexport interface DaemonMsg_ReminderUpsert {\n type: \"reminder.upsert\";\n reminder: Reminder;\n}\n\nexport interface DaemonMsg_ReminderCancel {\n type: \"reminder.cancel\";\n reminderId: string;\n version: number;\n}\n\nexport interface DaemonMsg_ReminderSnapshot {\n type: \"reminder.snapshot\";\n agentId: string;\n reminders: Reminder[];\n}\n\nexport interface DaemonMsg_Ping {\n type: \"ping\";\n}\n\nexport interface DaemonMsg_AgentRuntimeProfileMigration {\n type: \"agent:runtime_profile:migration\";\n agentId: string;\n migrationKey: string;\n}\n\nexport interface DaemonMsg_AgentPermissionDecision {\n type: \"agent:permission_decision\";\n agentId: string;\n requestId: string;\n action: \"approve\" | \"reject\";\n metadata?: Record<string, unknown>;\n}\n\nexport type ServerToDaemonMessage =\n | DaemonMsg_AgentStart\n | DaemonMsg_AgentStop\n | DaemonMsg_AgentDeliver\n | DaemonMsg_AgentDeliverReply\n | DaemonMsg_ActivityProbe\n | DaemonMsg_WorkspaceList\n | DaemonMsg_WorkspaceRead\n | DaemonMsg_WorkspaceWrite\n | DaemonMsg_AgentSkillsList\n | DaemonMsg_AgentWorkspaceInit\n | DaemonMsg_FeishuTokenWrite\n | DaemonMsg_FeishuTokenClear\n | DaemonMsg_FeishuDelegationStart\n | DaemonMsg_FeishuDelegationStop\n | DaemonMsg_FeishuDelegationUpdate\n | DaemonMsg_RuntimeModelsDetect\n | DaemonMsg_MachineWorkspaceScan\n | DaemonMsg_MachineWorkspaceDelete\n | DaemonMsg_AgentResetWorkspace\n | DaemonMsg_AgentDiagnostic\n | DaemonMsg_ReminderUpsert\n | DaemonMsg_ReminderCancel\n | DaemonMsg_ReminderSnapshot\n | DaemonMsg_AgentRuntimeProfileMigration\n | DaemonMsg_AgentPermissionDecision\n | DaemonMsg_Ping;\n\nexport interface DaemonMsg_Ready {\n type: \"ready\";\n capabilities: string[];\n runtimes: RuntimeId[];\n runningAgents: string[];\n wakeableAgents?: Array<{ agentId: string; sessionId?: string; launchId?: string }>;\n hostname: string;\n name?: string;\n os: string;\n daemonVersion: string;\n}\n\nexport interface DaemonMsg_AgentStatus {\n type: \"agent:status\";\n agentId: string;\n status: \"active\" | \"inactive\";\n launchId?: string;\n}\n\nexport interface DaemonMsg_AgentActivity {\n type: \"agent:activity\";\n agentId: string;\n activity: AgentActivity;\n detail: string;\n entries?: ActivityEntry[];\n launchId?: string;\n clientSeq?: number;\n probeId?: string;\n pendingInboxCount?: number;\n}\n\nexport interface DaemonMsg_AgentAvailability {\n type: \"agent:availability\";\n agentId: string;\n daemonState: AgentDaemonState;\n sessionId?: string;\n launchId?: string;\n}\n\nexport interface DaemonMsg_AgentSession {\n type: \"agent:session\";\n agentId: string;\n sessionId: string;\n launchId?: string;\n}\n\nexport interface DaemonMsg_DeliverAck {\n type: \"agent:deliver:ack\";\n agentId: string;\n seq: number;\n deliveryId: string;\n accepted?: boolean;\n reason?: string;\n}\n\nexport interface DaemonMsg_WorkspaceFileTree {\n type: \"agent:workspace:file_tree\";\n agentId: string;\n requestId: string;\n entries: FileEntry[];\n missing?: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_WorkspaceFileContent {\n type: \"agent:workspace:file_content\";\n agentId: string;\n requestId: string;\n file: FileContent | null;\n error?: string;\n}\n\nexport interface DaemonMsg_WorkspaceWriteResult {\n type: \"agent:workspace:write_result\";\n agentId: string;\n requestId: string;\n path: string;\n ok: boolean;\n size?: number;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentSkillsListResult {\n type: \"agent:skills:list/result\";\n agentId: string;\n requestId: string;\n global: AgentSkillGroup[];\n workspace: AgentSkillGroup[];\n skills_flat?: Array<AgentSkillDescriptor & { source: \"agent\" | \"workspace\" }>;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentWorkspaceInitResult {\n type: \"agent:workspace:init/result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n workspacePath?: string;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuTokenWriteResult {\n type: \"feishu:token:write_result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n tokenPath?: string;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuTokenClearResult {\n type: \"feishu:token:clear_result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuDelegationResult {\n type: \"feishu:delegation:result\";\n requestId: string;\n delegationId: string;\n agentId?: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_FeishuWakeFailed {\n type: \"feishu:wake_failed\";\n delegationId: string;\n agentId: string;\n humanId: string;\n reason: string;\n timestamp: number;\n}\n\nexport interface DaemonMsg_RuntimeModelsResult {\n type: \"machine:runtime_models:result\";\n requestId: string;\n results: RuntimeModelDetectionResult[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceScanResult {\n type: \"machine:workspace:scan/result\";\n requestId: string;\n entries: MachineWorkspaceEntry[];\n error?: string;\n}\n\nexport interface DaemonMsg_MachineWorkspaceDeleteResult {\n type: \"machine:workspace:delete/result\";\n requestId: string;\n directoryName: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentResetWorkspaceResult {\n type: \"agent:reset-workspace/result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n error?: string;\n}\n\nexport interface DaemonMsg_AgentDiagnosticResult {\n type: \"agent:diagnostic/result\";\n requestId: string;\n agentId: string;\n ok: boolean;\n snapshot: AgentDiagnosticSnapshot;\n error?: string;\n}\n\nexport interface DaemonMsg_ReminderFireAttempt {\n type: \"reminder.fire_attempt\";\n reminderId: string;\n agentId: string;\n version: number;\n}\n\nexport interface DaemonMsg_ReminderSnapshotRequest {\n type: \"reminder.snapshot.request\";\n agentId: string;\n}\n\nexport interface DaemonMsg_Pong {\n type: \"pong\";\n}\n\nexport interface DaemonMsg_AgentRuntimeProfileMigrationAck {\n type: \"agent:runtime_profile:migration:ack\";\n agentId: string;\n migrationKey: string;\n}\n\nexport interface DaemonMsg_AgentPermissionRequest {\n type: \"agent:permission_request\";\n agentId: string;\n requestId: string;\n launchId?: string;\n kind: \"command\" | \"file_change\" | \"permission\" | \"session\" | \"unknown\";\n title: string;\n description: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type DaemonToServerMessage =\n | DaemonMsg_Ready\n | DaemonMsg_AgentStatus\n | DaemonMsg_AgentActivity\n | DaemonMsg_AgentAvailability\n | DaemonMsg_AgentSession\n | DaemonMsg_DeliverAck\n | DaemonMsg_WorkspaceFileTree\n | DaemonMsg_WorkspaceFileContent\n | DaemonMsg_WorkspaceWriteResult\n | DaemonMsg_AgentSkillsListResult\n | DaemonMsg_AgentWorkspaceInitResult\n | DaemonMsg_FeishuTokenWriteResult\n | DaemonMsg_FeishuTokenClearResult\n | DaemonMsg_FeishuDelegationResult\n | DaemonMsg_FeishuWakeFailed\n | DaemonMsg_RuntimeModelsResult\n | DaemonMsg_MachineWorkspaceScanResult\n | DaemonMsg_MachineWorkspaceDeleteResult\n | DaemonMsg_AgentResetWorkspaceResult\n | DaemonMsg_AgentDiagnosticResult\n | DaemonMsg_ReminderFireAttempt\n | DaemonMsg_ReminderSnapshotRequest\n | DaemonMsg_AgentRuntimeProfileMigrationAck\n | DaemonMsg_AgentPermissionRequest\n | DaemonMsg_Pong;\n\nexport interface WebEvent_ChannelMessage {\n type: \"channel:message\";\n message: Message;\n}\n\nexport interface WebEvent_ChannelTaskUpdate {\n type: \"channel:task_update\";\n task: Task;\n}\n\nexport interface WebEvent_AgentActivity {\n type: \"agent:activity\";\n agent_id: string;\n activity: AgentActivity;\n detail: string;\n entries?: ActivityEntry[];\n}\n\nexport interface WebEvent_AgentRunStarted {\n type: \"agent:run_started\";\n run: AgentRun;\n}\n\nexport interface WebEvent_AgentRunCompleted {\n type: \"agent:run_completed\";\n run: AgentRun;\n}\n\nexport interface WebEvent_RunEvent {\n type: \"run:event\";\n run_id: string;\n event: RunEvent;\n}\n\nexport interface WebEvent_MachineStatus {\n type: \"machine:status\";\n machine_id: string;\n status: \"online\" | \"offline\";\n}\n\nexport interface WebEvent_Warning {\n type: \"warning\";\n id: string;\n severity: \"info\" | \"warning\" | \"error\";\n title: string;\n description?: string;\n machine_id?: string;\n agent_id?: string;\n dismissible?: boolean;\n}\n\nexport interface WebEvent_InboxItems {\n type: \"inbox:items\";\n items: InboxItem[];\n}\n\nexport interface WebEvent_InboxItem {\n type: \"inbox:item\";\n item: InboxItem;\n}\n\nexport type ServerToWebEvent =\n | WebEvent_ChannelMessage\n | WebEvent_ChannelTaskUpdate\n | WebEvent_AgentActivity\n | WebEvent_AgentRunStarted\n | WebEvent_AgentRunCompleted\n | WebEvent_RunEvent\n | WebEvent_MachineStatus\n | WebEvent_InboxItems\n | WebEvent_InboxItem\n | WebEvent_Warning;\n\nexport function formatDeliveredMessage(msg: DeliveredMessage): string {\n const msgShort = msg.message_id.slice(0, 8);\n const attachSuffix = msg.attachments?.length\n ? ` [${msg.attachments.length} attachment: ${msg.attachments.map((a) => `${a.filename} (id:${a.id})`).join(\", \")} -- use wm attachment view to download]`\n : \"\";\n const taskSuffix = msg.task_status\n ? ` [task #${msg.task_number ?? \"?\"} status=${msg.task_status}]`\n : \"\";\n const body = `[target=${msg.target} msg=${msgShort} time=${msg.timestamp} type=${msg.sender_type}] @${msg.sender_name}: ${msg.content}${attachSuffix}${taskSuffix}`;\n if (!msg.thread_join_context) return body;\n const context = msg.thread_join_context;\n const parentShort = context.parent_message.message_id.slice(0, 8);\n const recent = context.recent_messages.length > 0\n ? context.recent_messages.map((item) => `- [msg=${item.message_id.slice(0, 8)} time=${item.timestamp} type=${item.sender_type}] @${item.sender_name}: ${item.content}`).join(\"\\n\")\n : \"- (no earlier thread replies)\";\n return [\n \"[System: You were added to a new thread via @mention. Read this context before replying.]\",\n `parent: ${context.parent_target}`,\n `thread: ${context.thread_target}`,\n `suggested next step: wm message read --channel \"${context.suggested_read_history_target}\"`,\n \"\",\n \"Parent message:\",\n `- [msg=${parentShort} time=${context.parent_message.timestamp} type=${context.parent_message.sender_type}] @${context.parent_message.sender_name}: ${context.parent_message.content}`,\n \"\",\n \"Recent thread context:\",\n recent,\n \"\",\n body,\n ].join(\"\\n\");\n}\n\nexport function makeId(prefix: string): string {\n return `${prefix}_${crypto.randomUUID().replace(/-/g, \"\")}`;\n}\n", "import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type {\n RuntimeId,\n RuntimeModelDescriptor,\n RuntimeModelDetectionResult,\n} from \"@claude-console/shared\";\nimport { JsonRpcStdioClient } from \"./json-rpc-stdio-client\";\n\nconst execFileAsync = promisify(execFile);\n\nconst DEFAULT_REASONING = [\"default\"];\nconst CODEX_REASONING = [\"low\", \"medium\", \"high\", \"xhigh\"];\n\nexport interface RuntimeModelDetectorOptions {\n codexModelsCachePath?: string;\n kimiConfigPath?: string;\n hermesConfigPath?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport class RuntimeModelDetector {\n constructor(private readonly options: RuntimeModelDetectorOptions = {}) {}\n\n async detectAll(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]> {\n return Promise.all(runtimes.map((runtime) => this.detect(runtime)));\n }\n\n async detect(runtime: RuntimeId): Promise<RuntimeModelDetectionResult> {\n try {\n if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n return fakeRuntimeModelResult(runtime);\n }\n if (runtime === \"codex\") {\n try {\n return parseCodexModelsCache(await readFile(this.codexModelsCachePath(), \"utf8\"));\n } catch {\n return staticRuntimeModelResult(runtime);\n }\n }\n if (runtime === \"claude\") {\n return staticRuntimeModelResult(runtime);\n }\n if (runtime === \"kimi\") {\n const configPath = this.options.kimiConfigPath || process.env.KIMI_CONFIG_PATH || path.join(os.homedir(), \".kimi\", \"config.toml\");\n const parsed = parseKimiModelConfig(await readFile(configPath, \"utf8\"));\n return {\n runtime,\n source: \"kimi-config\",\n selectable: parsed.models.length > 1,\n fixed: parsed.models.length <= 1,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n };\n }\n if (runtime === \"cursor\") {\n const { stdout, stderr } = await execFileAsync(\"cursor-agent\", [\"models\"], {\n timeout: 15000,\n cwd: os.homedir(),\n });\n const parsed = parseCursorModelsOutput(`${stdout}\\n${stderr}`);\n return {\n runtime,\n source: \"cursor-cli\",\n selectable: parsed.models.length > 0,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n };\n }\n if (runtime === \"hermes\") {\n const configPath = this.options.hermesConfigPath || process.env.HERMES_CONFIG_PATH || path.join(os.homedir(), \".hermes\", \"config.yaml\");\n const configText = await readFile(configPath, \"utf8\");\n const parsed = parseHermesModelConfig(configText);\n const providerModels = await detectHermesProviderModels(configText, this.options.fetchImpl ?? fetch);\n if (providerModels.models.length > 0) {\n return {\n runtime,\n source: \"hermes-provider-models\",\n selectable: providerModels.models.length > 1,\n fixed: providerModels.models.length <= 1,\n defaultModel: providerModels.defaultModel ?? parsed.defaultModel,\n models: providerModels.models,\n };\n }\n return {\n runtime,\n source: \"hermes-config\",\n selectable: parsed.models.length > 1,\n fixed: parsed.models.length <= 1,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n };\n }\n if (runtime === \"opencode\") {\n const { stdout, stderr } = await execFileAsync(\"opencode\", [\"models\"], {\n timeout: 15000,\n cwd: os.homedir(),\n });\n const parsed = parseCursorModelsOutput(`${stdout}\\n${stderr}`);\n return parsed.models.length > 0\n ? {\n runtime,\n source: \"opencode-cli\",\n selectable: true,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n }\n : {\n runtime,\n source: \"opencode-default\",\n selectable: false,\n fixed: true,\n models: [],\n };\n }\n const gemini = await detectGeminiAcpModels();\n return gemini.models.length > 0\n ? {\n runtime,\n source: \"gemini-cli\",\n selectable: true,\n fixed: false,\n defaultModel: gemini.defaultModel,\n models: gemini.models,\n }\n : {\n runtime,\n source: \"gemini-default\",\n selectable: false,\n fixed: true,\n models: [],\n };\n } catch (error) {\n if (runtime === \"cursor\") {\n const output = [\n typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n ].join(\"\\n\");\n const parsed = parseCursorModelsOutput(output);\n if (parsed.models.length > 0) {\n return {\n runtime,\n source: \"cursor-cli\",\n selectable: true,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n if (runtime === \"gemini\") {\n return {\n runtime,\n source: \"gemini-default\",\n selectable: false,\n fixed: true,\n models: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n if (runtime === \"opencode\") {\n const output = [\n typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n ].join(\"\\n\");\n const parsed = parseCursorModelsOutput(output);\n if (parsed.models.length > 0) {\n return {\n runtime,\n source: \"opencode-cli\",\n selectable: true,\n fixed: false,\n defaultModel: parsed.defaultModel,\n models: parsed.models,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n return {\n runtime,\n source: \"opencode-default\",\n selectable: false,\n fixed: true,\n models: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n return {\n runtime,\n source: \"error\",\n selectable: false,\n fixed: true,\n models: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private codexModelsCachePath(): string {\n return this.options.codexModelsCachePath ?? process.env.CODEX_MODELS_CACHE_PATH ?? path.join(os.homedir(), \".codex\", \"models_cache.json\");\n }\n}\n\nexport function parseKimiModelConfig(configText: string): {\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n} {\n const ids: string[] = [];\n let defaultModel: string | undefined;\n let section: string | undefined;\n for (const rawLine of configText.split(/\\r?\\n/)) {\n const line = stripYamlComment(rawLine).trim();\n if (!line) continue;\n const table = line.match(/^\\[models\\.([^\\]]+)]$/);\n if (table) {\n section = `models.${unquote(table[1]!.trim())}`;\n pushUnique(ids, section.slice(\"models.\".length));\n continue;\n }\n const anyTable = line.match(/^\\[([^\\]]+)]$/);\n if (anyTable) {\n section = anyTable[1]?.trim();\n continue;\n }\n const defaultModelLine = line.match(/^default_model\\s*=\\s*[\"']?([^\"']+)[\"']?\\s*$/);\n if (defaultModelLine) {\n defaultModel = defaultModelLine[1]?.trim();\n pushUnique(ids, defaultModel);\n continue;\n }\n if (section?.startsWith(\"models.\")) continue;\n const model = line.match(/^model\\s*=\\s*[\"']?([^\"']+)[\"']?\\s*$/);\n if (model) {\n const value = model[1]?.trim();\n defaultModel ??= value;\n pushUnique(ids, value);\n continue;\n }\n const array = line.match(/^(?:models|available_models)\\s*=\\s*\\[(.+)\\]\\s*$/);\n if (array) {\n for (const part of array[1]!.split(\",\")) pushUnique(ids, unquote(part.trim()));\n }\n }\n const models = ids.map((id) => ({\n ...defaultReasoningModel(id, id === defaultModel),\n default: id === defaultModel ? true : undefined,\n }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function staticRuntimeModelResult(runtime: \"codex\" | \"claude\"): RuntimeModelDetectionResult {\n if (runtime === \"codex\") {\n const models = [\n codexModel(\"gpt-5.5\", \"medium\", true),\n codexModel(\"gpt-5.4\", \"medium\"),\n codexModel(\"gpt-5.4-mini\", \"medium\"),\n codexModel(\"gpt-5.3-codex\", \"medium\"),\n codexModel(\"gpt-5.3-codex-spark\", \"high\"),\n codexModel(\"gpt-5.2\", \"medium\"),\n ];\n return {\n runtime,\n source: \"static\",\n selectable: true,\n fixed: false,\n defaultModel: \"gpt-5.5\",\n models,\n };\n }\n return {\n runtime,\n source: \"static\",\n selectable: true,\n fixed: false,\n defaultModel: \"sonnet\",\n models: [\n defaultReasoningModel(\"haiku\", false),\n { id: \"sonnet\", label: \"sonnet\", default: true, reasoningEfforts: [\"adaptive\", \"low\", \"medium\", \"high\", \"max\"], defaultReasoningEffort: \"adaptive\" },\n { id: \"opus\", label: \"opus\", reasoningEfforts: [\"adaptive\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], defaultReasoningEffort: \"adaptive\" },\n ],\n };\n}\n\nfunction fakeRuntimeModelResult(runtime: RuntimeId): RuntimeModelDetectionResult {\n if (runtime === \"codex\" || runtime === \"claude\") return staticRuntimeModelResult(runtime);\n if (runtime === \"kimi\") {\n return {\n runtime,\n source: \"kimi-config\",\n selectable: true,\n fixed: false,\n defaultModel: \"kimi-k2.6\",\n models: [\n defaultReasoningModel(\"kimi-k2.6\", true),\n defaultReasoningModel(\"kimi-k2.5\", false),\n ],\n };\n }\n if (runtime === \"cursor\") {\n return {\n runtime,\n source: \"cursor-cli\",\n selectable: true,\n fixed: false,\n defaultModel: \"composer-2-fast\",\n models: [\n defaultReasoningModel(\"composer-2-fast\", true),\n defaultReasoningModel(\"gpt-5.5-medium\", false),\n ],\n };\n }\n if (runtime === \"gemini\") {\n return {\n runtime,\n source: \"gemini-default\",\n selectable: false,\n fixed: true,\n defaultModel: \"default\",\n models: [{ ...defaultReasoningModel(\"default\", true), fixed: true }],\n };\n }\n if (runtime === \"opencode\") {\n return {\n runtime,\n source: \"opencode-default\",\n selectable: false,\n fixed: true,\n defaultModel: \"default\",\n models: [{ ...defaultReasoningModel(\"default\", true), fixed: true }],\n };\n }\n return {\n runtime,\n source: \"error\",\n selectable: false,\n fixed: true,\n models: [],\n error: \"legacy runtime is not part of fake runtime model fixture\",\n };\n}\n\nexport interface HermesProviderConfig {\n name?: string;\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n}\n\nexport function parseHermesProviderConfigs(configText: string): HermesProviderConfig[] {\n const providers: HermesProviderConfig[] = [];\n const lines = configText.split(/\\r?\\n/);\n let insideCustomProviders = false;\n let current: HermesProviderConfig | undefined;\n const flush = (): void => {\n if (current && (current.baseUrl || current.apiKey || current.model)) providers.push(current);\n current = undefined;\n };\n for (const line of lines) {\n const raw = stripYamlComment(line);\n if (!raw.trim()) continue;\n if (/^\\S/.test(raw) && !/^-/.test(raw)) {\n if (insideCustomProviders) flush();\n insideCustomProviders = /^custom_providers:\\s*$/.test(raw);\n continue;\n }\n if (!insideCustomProviders) continue;\n const item = raw.match(/^\\s*-\\s*(?:(name|base_url|api_key|model):\\s*(.+?)\\s*)?$/);\n if (item) {\n flush();\n current = {};\n if (item[1]) assignHermesProviderField(current, item[1], item[2]);\n continue;\n }\n const field = raw.match(/^\\s*(name|base_url|api_key|model):\\s*(.+?)\\s*$/);\n if (field) {\n current ??= {};\n assignHermesProviderField(current, field[1], field[2]);\n }\n }\n if (insideCustomProviders) flush();\n return providers;\n}\n\nexport async function detectHermesProviderModels(\n configText: string,\n fetchImpl: typeof fetch = fetch\n): Promise<{ models: RuntimeModelDescriptor[]; defaultModel?: string }> {\n const ids: string[] = [];\n let defaultModel: string | undefined;\n for (const provider of parseHermesProviderConfigs(configText)) {\n if (!provider.baseUrl || !provider.apiKey) continue;\n defaultModel ??= provider.model;\n pushUnique(ids, provider.model);\n const url = `${provider.baseUrl.replace(/\\/+$/, \"\")}/models`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n try {\n const response = await fetchImpl(url, {\n headers: { authorization: `Bearer ${provider.apiKey}` },\n signal: controller.signal,\n });\n if (!response.ok) continue;\n for (const id of parseOpenAIModelIds(await response.json())) pushUnique(ids, id);\n } catch {\n // Keep provider tokens private and fall back to the configured current model.\n } finally {\n clearTimeout(timeout);\n }\n }\n const models = ids.map((id) => ({\n ...defaultReasoningModel(id, defaultModel === id),\n default: defaultModel === id ? true : undefined,\n }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function parseOpenAIModelIds(value: unknown): string[] {\n const data = Array.isArray((value as { data?: unknown } | undefined)?.data)\n ? (value as { data: unknown[] }).data\n : Array.isArray(value)\n ? value\n : [];\n const ids: string[] = [];\n for (const item of data) {\n if (typeof item === \"string\") {\n pushUnique(ids, item);\n continue;\n }\n if (item && typeof item === \"object\") {\n pushUnique(ids, stringField(item as Record<string, unknown>, \"id\"));\n }\n }\n return ids;\n}\n\nfunction assignHermesProviderField(provider: HermesProviderConfig, key: string, rawValue: string | undefined): void {\n const value = rawValue ? unquote(rawValue) : \"\";\n if (!value) return;\n if (key === \"name\") provider.name = value;\n if (key === \"base_url\") provider.baseUrl = value;\n if (key === \"api_key\") provider.apiKey = value;\n if (key === \"model\") provider.model = value;\n}\n\nexport function parseCodexModelsCache(cacheText: string): RuntimeModelDetectionResult {\n const parsed = JSON.parse(cacheText) as unknown;\n const rawModels = Array.isArray(parsed)\n ? parsed\n : Array.isArray((parsed as { models?: unknown }).models)\n ? (parsed as { models: unknown[] }).models\n : [];\n const models = rawModels\n .map(parseCodexModel)\n .filter((model): model is RuntimeModelDescriptor => Boolean(model));\n if (models.length === 0) throw new Error(\"Codex model cache contains no models\");\n const defaultModel = models.find((model) => model.default)?.id ?? models[0]!.id;\n return {\n runtime: \"codex\",\n source: \"codex-cache\",\n selectable: true,\n fixed: false,\n defaultModel,\n models: normalizeDefault(models, defaultModel),\n };\n}\n\nexport function parseCursorModelsOutput(output: string): {\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n} {\n const models: RuntimeModelDescriptor[] = [];\n let defaultModel: string | undefined;\n for (const rawLine of output.split(/\\r?\\n/)) {\n const line = stripAnsi(rawLine).trim();\n if (!line || /^(available|models?|model\\s+id|name|loading|tip:)\\b/i.test(line)) continue;\n const markedDefault = /\\b(default|current)\\b/i.test(line);\n const cleaned = line\n .replace(/^[*\\-\\u2022\u2713\\s]+/, \"\")\n .replace(/\\((?:default|current)\\)/gi, \"\")\n .replace(/\\[(?:default|current)\\]/gi, \"\")\n .trim();\n const id = cleaned.split(/\\s+-\\s+|\\s+/)[0]?.trim();\n if (!id || id.includes(\":\") || /[\\u001b\\u009b]/.test(id)) continue;\n if (models.some((model) => model.id === id)) continue;\n models.push({ ...defaultReasoningModel(id, markedDefault && !defaultModel), default: markedDefault && !defaultModel ? true : undefined });\n if (markedDefault && !defaultModel) defaultModel = id;\n }\n if (!defaultModel && models[0]) {\n defaultModel = models[0].id;\n models[0] = { ...models[0], default: true };\n }\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(\n // eslint-disable-next-line no-control-regex\n /[\\u001b\\u009b][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))/g,\n \"\"\n );\n}\n\nexport function parseHermesModelConfig(configText: string): {\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n} {\n const ids: string[] = [];\n let defaultModel: string | undefined;\n const lines = configText.split(/\\r?\\n/);\n let insideCustomProviders = false;\n for (let index = 0; index < lines.length; index += 1) {\n const raw = stripYamlComment(lines[index] ?? \"\");\n if (/^\\S/.test(raw) && !/^-/.test(raw)) {\n insideCustomProviders = /^custom_providers:\\s*$/.test(raw);\n }\n\n const topModel = raw.match(/^model:\\s*(.+?)\\s*$/);\n if (topModel && unquote(topModel[1])) {\n defaultModel = unquote(topModel[1]);\n pushUnique(ids, defaultModel);\n continue;\n }\n\n const providerModel = raw.match(/^\\s+model:\\s*(.+?)\\s*$/);\n if (insideCustomProviders && providerModel && unquote(providerModel[1])) {\n const model = unquote(providerModel[1]);\n if (!defaultModel) defaultModel = model;\n pushUnique(ids, model);\n continue;\n }\n\n const inlineModels = raw.match(/^\\s*models:\\s*\\[(.+?)\\]\\s*$/);\n if (inlineModels) {\n for (const value of inlineModels[1].split(\",\")) pushUnique(ids, unquote(value));\n continue;\n }\n\n if (!/^\\s*models:\\s*$/.test(raw)) continue;\n const parentIndent = indentOf(raw);\n let childIndent: number | undefined;\n for (let next = index + 1; next < lines.length; next += 1) {\n const nested = stripYamlComment(lines[next] ?? \"\");\n if (!nested.trim()) continue;\n if (indentOf(nested) <= parentIndent) break;\n childIndent ??= indentOf(nested);\n if (indentOf(nested) !== childIndent) continue;\n const item = nested.match(/^\\s*-\\s*(.+?)\\s*$/);\n const named = nested.match(/^\\s*(?:name|id):\\s*(.+?)\\s*$/);\n const mapped = nested.match(/^\\s*([A-Za-z0-9._:/+-]+):(?:\\s|$)/);\n if (item) {\n const value = item[1].match(/^(?:name|id):\\s*(.+?)\\s*$/)?.[1] ?? item[1];\n pushUnique(ids, unquote(value));\n } else if (named) {\n pushUnique(ids, unquote(named[1]));\n } else if (mapped) {\n pushUnique(ids, unquote(mapped[1]));\n }\n }\n }\n\n const models = ids.map((id) => ({\n ...defaultReasoningModel(id, defaultModel === id),\n default: defaultModel === id ? true : undefined,\n }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nasync function detectGeminiAcpModels(): Promise<{\n models: RuntimeModelDescriptor[];\n defaultModel?: string;\n}> {\n const client = new JsonRpcStdioClient({\n command: \"gemini\",\n args: [\"--acp\", \"--skip-trust\"],\n onNotification: () => undefined,\n onStderr: () => undefined,\n });\n try {\n client.start();\n const result = await withTimeout(\n client.request(\"initialize\", {\n protocolVersion: 1,\n clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" },\n capabilities: {},\n }),\n 5000,\n \"Gemini ACP model inspect timeout\"\n );\n const ids = collectModelIds(result);\n const defaultModel = collectDefaultModel(result, ids);\n const models = ids.map((id) => ({ ...defaultReasoningModel(id, id === defaultModel), default: id === defaultModel ? true : undefined }));\n return { models: normalizeDefault(models, defaultModel), defaultModel };\n } finally {\n client.destroy();\n }\n}\n\nfunction collectModelIds(value: unknown): string[] {\n const ids: string[] = [];\n const visit = (node: unknown, insideModels = false): void => {\n if (typeof node === \"string\") {\n if (insideModels) pushUnique(ids, node);\n return;\n }\n if (Array.isArray(node)) {\n for (const item of node) visit(item, insideModels);\n return;\n }\n if (!node || typeof node !== \"object\") return;\n for (const [childKey, childValue] of Object.entries(node)) {\n if (/models?/i.test(childKey)) {\n visit(childValue, true);\n } else if (insideModels && /^(id|name|model)$/i.test(childKey)) {\n visit(childValue, true);\n } else {\n visit(childValue, false);\n }\n }\n };\n visit(value);\n return ids.filter((id) => /^[a-z0-9][a-z0-9._:/+-]*$/i.test(id));\n}\n\nfunction collectDefaultModel(value: unknown, ids: string[]): string | undefined {\n const json = JSON.stringify(value);\n for (const id of ids) {\n if (new RegExp(`\"${escapeRegExp(id)}\"[^}]*\"default\"\\\\s*:\\\\s*true`, \"i\").test(json)) return id;\n }\n return ids[0];\n}\n\nfunction normalizeDefault(models: RuntimeModelDescriptor[], defaultModel?: string): RuntimeModelDescriptor[] {\n return models.map((model) => ({\n ...model,\n default: defaultModel ? model.id === defaultModel : model.default,\n }));\n}\n\nfunction codexModel(id: string, defaultReasoningEffort: string, isDefault = false): RuntimeModelDescriptor {\n return {\n id,\n label: id,\n default: isDefault ? true : undefined,\n reasoningEfforts: CODEX_REASONING,\n defaultReasoningEffort,\n };\n}\n\nfunction defaultReasoningModel(id: string, isDefault = false): RuntimeModelDescriptor {\n return {\n id,\n label: id,\n default: isDefault ? true : undefined,\n reasoningEfforts: DEFAULT_REASONING,\n defaultReasoningEffort: \"default\",\n };\n}\n\nfunction parseCodexModel(value: unknown): RuntimeModelDescriptor | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const record = value as Record<string, unknown>;\n const id = stringField(record, \"id\") ?? stringField(record, \"slug\") ?? stringField(record, \"name\") ?? stringField(record, \"model\");\n if (!id) return undefined;\n const reasoningEfforts = parseReasoningEfforts(record.supported_reasoning_levels);\n const defaultReasoningEffort = stringField(record, \"default_reasoning_level\");\n const effectiveEfforts = reasoningEfforts.length > 0 ? reasoningEfforts : CODEX_REASONING;\n return {\n id,\n label: stringField(record, \"display_name\") ?? stringField(record, \"displayName\") ?? id,\n default: record.default === true ? true : undefined,\n reasoningEfforts: effectiveEfforts,\n defaultReasoningEffort: defaultReasoningEffort && effectiveEfforts.includes(defaultReasoningEffort)\n ? defaultReasoningEffort\n : effectiveEfforts[0],\n };\n}\n\nfunction parseReasoningEfforts(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const efforts: string[] = [];\n for (const item of value) {\n const effort = typeof item === \"string\"\n ? item\n : item && typeof item === \"object\"\n ? stringField(item as Record<string, unknown>, \"effort\") ?? stringField(item as Record<string, unknown>, \"id\") ?? stringField(item as Record<string, unknown>, \"name\")\n : undefined;\n pushUnique(efforts, effort);\n }\n return efforts;\n}\n\nfunction stringField(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction pushUnique(values: string[], value: string | undefined): void {\n const trimmed = value?.trim();\n if (!trimmed || values.includes(trimmed)) return;\n values.push(trimmed);\n}\n\nfunction stripYamlComment(value: string): string {\n return value.replace(/\\s+#.*$/, \"\");\n}\n\nfunction indentOf(value: string): number {\n return value.length - value.trimStart().length;\n}\n\nfunction unquote(value: string): string {\n return value.trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(message)), ms);\n promise.then(resolve, reject).finally(() => clearTimeout(timer));\n });\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n", "import type { Reminder } from \"@claude-console/shared\";\n\ntype ReminderJob = { reminderId: string; ownerAgentId: string; version: number };\n\nexport class ReminderCache {\n private readonly timers = new Map<string, NodeJS.Timeout>();\n private handler: (job: ReminderJob) => void = () => {};\n\n upsert(reminder: Reminder): void {\n this.cancelTimer(reminder.id);\n if (reminder.status !== \"scheduled\") return;\n const delay = Math.max(0, Date.parse(reminder.fire_at) - Date.now());\n const timer = setTimeout(() => {\n this.timers.delete(reminder.id);\n this.handler({ reminderId: reminder.id, ownerAgentId: reminder.agent_id, version: reminder.version });\n }, delay);\n this.timers.set(reminder.id, timer);\n }\n\n cancel(reminderId: string): void {\n this.cancelTimer(reminderId);\n }\n\n snapshot(agentId: string, reminders: Reminder[]): void {\n for (const [id] of this.timers) {\n if (id.startsWith(`${agentId}:`)) this.cancelTimer(id);\n }\n for (const reminder of reminders) this.upsert(reminder);\n }\n\n onFire(handler: (job: ReminderJob) => void): void {\n this.handler = handler;\n }\n\n clear(): void {\n for (const id of this.timers.keys()) this.cancelTimer(id);\n }\n\n private cancelTimer(id: string): void {\n const timer = this.timers.get(id);\n if (timer) clearTimeout(timer);\n this.timers.delete(id);\n }\n}\n", "import { chmod, mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nexport interface FeishuTokenWriterInput {\n workspaceDir: string;\n token: string;\n}\n\nexport interface LarkCliWrapperInput {\n workspaceDir: string;\n appId: string;\n brand?: \"feishu\" | \"lark\";\n}\n\nexport interface FeishuTokenPathInput {\n workspaceDir: string;\n}\n\nconst requireFromHere = createRequire(__filename);\n\nexport function feishuTokenPath(workspaceDir: string): string {\n return path.join(workspaceDir, \".wm\", \"feishu\", \"token\");\n}\n\nexport function larkCliWrapperPath(workspaceDir: string): string {\n return path.join(workspaceDir, \".wm\", \"lark-cli\");\n}\n\nexport async function writeFeishuToken(input: FeishuTokenWriterInput): Promise<string> {\n const tokenPath = feishuTokenPath(input.workspaceDir);\n const dir = path.dirname(tokenPath);\n await mkdir(dir, { recursive: true, mode: 0o700 });\n const tempPath = path.join(dir, `.token.${process.pid}.${Date.now()}.tmp`);\n await writeFile(tempPath, input.token, { encoding: \"utf8\", mode: 0o600 });\n await chmod(tempPath, 0o600);\n await rename(tempPath, tokenPath);\n await chmod(tokenPath, 0o600);\n return tokenPath;\n}\n\nexport async function writeLarkCliWrapper(input: LarkCliWrapperInput): Promise<string> {\n const wrapperPath = larkCliWrapperPath(input.workspaceDir);\n await mkdir(path.dirname(wrapperPath), { recursive: true });\n await writeFile(wrapperPath, buildLarkCliWrapper(input), { encoding: \"utf8\", mode: 0o755 });\n await chmod(wrapperPath, 0o755);\n return wrapperPath;\n}\n\nexport async function clearFeishuToken(input: FeishuTokenPathInput): Promise<void> {\n await rm(feishuTokenPath(input.workspaceDir), { force: true });\n}\n\nfunction buildLarkCliWrapper(input: LarkCliWrapperInput): string {\n const runner = resolveLarkCliRunner();\n return [\n \"#!/usr/bin/env bash\",\n \"set -euo pipefail\",\n 'SELF_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"',\n 'TOKEN_FILE=\"${SELF_DIR}/feishu/token\"',\n 'if [[ ! -s \"$TOKEN_FILE\" ]]; then',\n ' echo \"Feishu token unavailable\" >&2',\n \" exit 2\",\n \"fi\",\n `export LARKSUITE_CLI_APP_ID=${shellQuote(input.appId)}`,\n 'export LARKSUITE_CLI_USER_ACCESS_TOKEN=\"$(cat \"$TOKEN_FILE\")\"',\n \"export LARKSUITE_CLI_DEFAULT_AS=user\",\n \"export LARKSUITE_CLI_STRICT_MODE=user\",\n `export LARKSUITE_CLI_BRAND=${shellQuote(input.brand ?? \"feishu\")}`,\n runner\n ? `exec ${shellQuote(process.execPath)} ${shellQuote(runner)} \"$@\"`\n : 'exec lark-cli \"$@\"',\n \"\",\n ].join(\"\\n\");\n}\n\nfunction resolveLarkCliRunner(): string | undefined {\n try {\n return requireFromHere.resolve(\"@larksuite/cli/scripts/run.js\");\n } catch {\n return undefined;\n }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n", "import type { ActivityEntry } from \"@claude-console/shared\";\nimport type { RuntimeEvent } from \"../runtime/adapter\";\n\nexport class ActivityTracker {\n private clientSeq = 0;\n\n toEntries(events: RuntimeEvent[]): ActivityEntry[] {\n return events.flatMap((event) => this.toEntry(event));\n }\n\n nextSeq(): number {\n this.clientSeq += 1;\n return this.clientSeq;\n }\n\n private toEntry(event: RuntimeEvent): ActivityEntry[] {\n const timestamp = Date.now();\n if (event.type.includes(\"tool\")) {\n return [{\n kind: event.type.includes(\"end\") || event.type.includes(\"result\") ? \"tool_end\" : \"tool_start\",\n tool_name: String((event.data as { name?: unknown } | undefined)?.name ?? \"tool\"),\n tool_input: typeof event.data === \"object\" && event.data ? event.data as Record<string, unknown> : undefined,\n text: event.content,\n timestamp,\n }];\n }\n if (event.type.includes(\"thinking\") || event.type.includes(\"thought\")) {\n return [{ kind: \"thinking\", text: event.content ?? JSON.stringify(event.data ?? \"\"), timestamp }];\n }\n if (event.type.includes(\"error\")) {\n return [{ kind: \"error\", text: event.content ?? JSON.stringify(event.data ?? \"\"), is_error: true, timestamp }];\n }\n if (event.content) return [{ kind: \"text\", text: event.content, timestamp }];\n return [{ kind: \"status\", text: event.type, timestamp }];\n }\n}\n", "import { mkdir, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileContent, FileEntry } from \"@claude-console/shared\";\n\ntype WorkspaceBrowserOptions =\n | ((agentId: string) => string | undefined)\n | {\n rootDir: string;\n workspaceDirectoryForAgent: (agentId: string, serverNamespace?: string, machineId?: string) => string | undefined;\n };\n\nexport class WorkspaceBrowser {\n constructor(private readonly options: WorkspaceBrowserOptions) {}\n\n async listFiles(agentId: string, dirPath = \".\", serverNamespace?: string, machineId?: string): Promise<FileEntry[]> {\n const base = this.requireBase(agentId, serverNamespace, machineId);\n const dir = this.resolveInside(base, dirPath);\n const entries = await readdir(dir, { withFileTypes: true }).catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n });\n const result: FileEntry[] = [];\n for (const entry of entries) {\n if (dirPath === \".\" && entry.name === \".wm\") continue;\n const fullPath = path.join(dir, entry.name);\n const info = await stat(fullPath);\n result.push({\n name: entry.name,\n path: path.relative(base, fullPath) || \".\",\n type: entry.isDirectory() ? \"directory\" : \"file\",\n size: info.size,\n modified_at: info.mtimeMs,\n });\n }\n return result.sort((a, b) => a.type.localeCompare(b.type) || a.name.localeCompare(b.name));\n }\n\n async readFile(agentId: string, filePath: string, serverNamespace?: string, machineId?: string): Promise<FileContent> {\n const base = this.requireBase(agentId, serverNamespace, machineId);\n const fullPath = this.resolveInside(base, filePath);\n const info = await stat(fullPath);\n if (info.size > 1024 * 1024) {\n return { path: filePath, content: null, binary: true, size: info.size };\n }\n const buffer = await readFile(fullPath);\n const ext = path.extname(fullPath).toLowerCase();\n const image = [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"].includes(ext);\n if (image || buffer.includes(0)) {\n return {\n path: filePath,\n content: buffer.toString(\"base64\"),\n binary: true,\n size: info.size,\n mime_type: image ? `image/${ext.slice(1).replace(\"jpg\", \"jpeg\")}` : \"application/octet-stream\",\n encoding: \"base64\",\n };\n }\n return { path: filePath, content: buffer.toString(\"utf8\"), binary: false, size: info.size, encoding: \"utf8\" };\n }\n\n async writeFile(agentId: string, filePath: string, content: string, serverNamespace?: string, machineId?: string): Promise<{ ok: true; path: string; size: number }> {\n const base = this.requireBase(agentId, serverNamespace, machineId);\n const fullPath = this.resolveInside(base, filePath);\n await mkdir(path.dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf8\");\n return { ok: true, path: path.relative(base, fullPath) || \".\", size: Buffer.byteLength(content, \"utf8\") };\n }\n\n private requireBase(agentId: string, serverNamespace?: string, machineId?: string): string {\n const base = this.rootDirForAgent(agentId, serverNamespace, machineId);\n if (!base) throw new Error(`Unknown agent workspace: ${agentId}`);\n return path.resolve(base);\n }\n\n private rootDirForAgent(agentId: string, serverNamespace?: string, machineId?: string): string | undefined {\n if (typeof this.options === \"function\") return this.options(agentId);\n return this.options.workspaceDirectoryForAgent(agentId, serverNamespace, machineId);\n }\n\n private resolveInside(base: string, relativePath: string): string {\n const resolved = path.resolve(base, relativePath);\n if (resolved !== base && !resolved.startsWith(`${base}${path.sep}`)) {\n throw new Error(\"path escapes workspace\");\n }\n return resolved;\n }\n}\n\nexport function isSafeWorkspaceDirectoryName(directoryName: string): boolean {\n return Boolean(\n directoryName &&\n directoryName !== \".\" &&\n directoryName !== \"..\" &&\n !directoryName.includes(\"/\") &&\n !directoryName.includes(\"\\\\\") &&\n !directoryName.includes(\"..\")\n );\n}\n\nexport function displayNameToWorkspaceDirectoryName(displayName: string, fallback = \"machine\"): string {\n const cleaned = displayName\n .trim()\n .normalize(\"NFKC\")\n .replace(/[\\/\\\\:]+/g, \"-\")\n .replace(/\\s+/g, \"-\")\n .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[.-]+|[.-]+$/g, \"\")\n .slice(0, 80);\n return cleaned || fallback;\n}\n\nexport function namedWorkspaceDirectoryName(displayName: string, id: string, fallback = \"item\"): string {\n const namePart = displayNameToWorkspaceDirectoryName(displayName, fallback);\n const idPart = workspaceDirectoryIdPart(namePart, id);\n return `${namePart}-${idPart}`;\n}\n\nexport function workspaceDirectoryIdPart(namePart: string, id: string): string {\n let idPart = displayNameToWorkspaceDirectoryName(id, \"id\");\n if (idPart.startsWith(`${namePart}-`)) idPart = idPart.slice(namePart.length + 1);\n idPart = idPart.replace(/^(machine|agent|org)[_-]/, \"\");\n return idPart || displayNameToWorkspaceDirectoryName(id, \"id\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_node_os", "import_promises", "import_node_os", "import_node_path", "import_node_child_process", "import_node_readline", "import_node_child_process", "readline", "stringValue", "sdkQuery", "stringValue", "emit", "contentBlocks", "readline", "killProcessTree", "emit", "path", "import_node_child_process", "import_node_readline", "readline", "killProcessTree", "stringValue", "import_node_child_process", "import_node_readline", "path", "readline", "killProcessTree", "import_node_child_process", "import_promises", "import_node_path", "path", "import_promises", "import_node_path", "import_promises", "import_node_os", "import_node_path", "import_promises", "import_node_path", "os", "path", "path", "os", "assert", "path", "path", "os", "import_promises", "import_node_path", "import_promises", "import_node_os", "import_node_path", "path", "os", "import_node_readline", "index", "readline", "import_node_os", "import_node_path", "os", "path", "defaultOutput", "defaultInput", "path", "stringValue", "import_node_os", "WebSocket", "os", "import_node_child_process", "import_promises", "import_node_os", "import_node_path", "import_node_child_process", "import_promises", "import_node_os", "import_node_path", "path", "os", "withTimeout", "import_promises", "import_node_path", "path", "import_promises", "import_node_path", "path", "os", "result", "path", "sleep", "shellSingleQuote", "model", "os"]
|
|
7
7
|
}
|