negotium 0.2.19 → 0.2.21

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.
Files changed (56) hide show
  1. package/dist/agent-helpers.js +573 -593
  2. package/dist/agent-helpers.js.map +17 -17
  3. package/dist/background-bash.js +3 -2
  4. package/dist/background-bash.js.map +3 -3
  5. package/dist/browser-runtime.js +76 -36
  6. package/dist/browser-runtime.js.map +6 -6
  7. package/dist/canonical-mcp-bridge.js +1 -1
  8. package/dist/{chunk-fc58cqry.js → chunk-rhp26p2c.js} +171 -26
  9. package/dist/{chunk-fc58cqry.js.map → chunk-rhp26p2c.js.map} +6 -5
  10. package/dist/{chunk-r0xs3t81.js → chunk-s2gez3wg.js} +18 -3
  11. package/dist/{chunk-r0xs3t81.js.map → chunk-s2gez3wg.js.map} +2 -2
  12. package/dist/hosted-agent.js +185 -54
  13. package/dist/hosted-agent.js.map +7 -6
  14. package/dist/main.js +1209 -1114
  15. package/dist/main.js.map +25 -25
  16. package/dist/mcp-catalog.js.map +1 -1
  17. package/dist/mcp-factories.js +526 -540
  18. package/dist/mcp-factories.js.map +17 -17
  19. package/dist/outbox.js.map +1 -1
  20. package/dist/platform-runtime.js.map +1 -1
  21. package/dist/prompts.js +3 -2
  22. package/dist/prompts.js.map +3 -3
  23. package/dist/query-runtime.js +63 -26
  24. package/dist/query-runtime.js.map +4 -4
  25. package/dist/registry.js +4 -3
  26. package/dist/registry.js.map +3 -3
  27. package/dist/rollout.js +1 -1
  28. package/dist/runtime/src/agents/archiver.ts +3 -2
  29. package/dist/runtime/src/application/switch-topic-access-mode.ts +81 -8
  30. package/dist/runtime/src/bus.ts +19 -2
  31. package/dist/runtime/src/mcp/session-comm/runtime.ts +16 -0
  32. package/dist/runtime/src/platform/config.ts +13 -1
  33. package/dist/runtime/src/runtime/ask-callbacks.ts +19 -11
  34. package/dist/runtime/src/runtime/background-sessions.ts +9 -7
  35. package/dist/runtime/src/runtime/visual-store.ts +31 -23
  36. package/dist/runtime/src/storage/api-topics.ts +26 -0
  37. package/dist/runtime/src/storage/browser-profiles.ts +16 -8
  38. package/dist/runtime/src/storage/runtime-events.ts +30 -20
  39. package/dist/runtime/src/storage/runtime-gateway-submissions.ts +24 -16
  40. package/dist/runtime/src/storage/runtime-turn-requests.ts +9 -1
  41. package/dist/runtime/src/storage/self-schedules.ts +32 -24
  42. package/dist/runtime/src/storage/storage-host.ts +105 -43
  43. package/dist/runtime/src/storage/vault.ts +12 -3
  44. package/dist/runtime/src/version.ts +1 -1
  45. package/dist/runtime-helpers.js +63 -26
  46. package/dist/runtime-helpers.js.map +4 -4
  47. package/dist/sqlite.js +17 -1
  48. package/dist/sqlite.js.map +2 -2
  49. package/dist/storage.js +92 -46
  50. package/dist/storage.js.map +4 -4
  51. package/dist/types/packages/core/src/storage/api-topics.d.ts +15 -0
  52. package/dist/types/packages/core/src/storage/storage-host.d.ts +10 -0
  53. package/dist/types/packages/core/src/version.d.ts +1 -1
  54. package/dist/vault.js +156 -10
  55. package/dist/vault.js.map +6 -5
  56. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../packages/core/src/agents/claude-provider.ts", "../../../packages/core/src/agents/rollout/shared.ts", "../../../packages/core/src/platform/config.ts", "../../../packages/core/src/platform/config-helpers.ts", "../../../packages/core/src/platform/logger.ts", "../../../packages/core/src/types.ts", "../../../packages/core/src/platform/jsonl.ts", "../../../packages/core/src/platform/file-utils.ts", "../../../packages/core/src/agents/claude-registry.ts", "../../../packages/core/src/agents/deep-map.ts", "../../../packages/core/src/agents/execution-host.ts", "../../../packages/core/src/security/sensitive-path.ts", "../../../packages/core/src/agents/vault-tool-policy.ts", "../../../packages/core/src/mcp/runtime-spec.ts", "../../../packages/core/src/mcp/session-comm/bridge-ipc-config.ts", "../../../packages/core/src/platform/background-bash/manager.ts", "../../../packages/core/src/platform/delay.ts", "../../../packages/core/src/platform/background-bash/context.ts", "../../../packages/core/src/platform/mcp-catalog-policy.ts", "../../../packages/core/src/platform/playwright/capability.ts", "../../../packages/core/src/platform/mcp-config.ts", "../../../packages/core/src/storage/vault.ts", "../../../packages/core/src/storage/sqlite.ts", "../../../packages/core/src/storage/vault-crypto-core.ts", "../../../packages/core/src/storage/vault-crypto.ts", "../../../packages/core/src/media/file-events.ts", "../../../packages/core/src/platform/error.ts", "../../../packages/core/src/runtime/context-warning.ts", "../../../packages/core/src/agents/codex-provider.ts", "../../../packages/core/src/agents/codex-native-multi-agent.ts", "../../../packages/core/src/version.ts", "../../../packages/core/src/agents/codex-tree-kill.ts", "../../../packages/core/src/agents/codex-tree-manager.ts", "../../../packages/core/src/agents/rollout/codex.ts", "../../../packages/core/src/agents/tool-format.ts", "../../../packages/core/src/platform/maestro-bootstrap-env.ts", "../../../packages/core/src/agents/maestro-provider.ts", "../../../packages/core/src/agents/claude-runtime-inspection.ts", "../../../packages/core/src/agents/hosted-agent.ts"],
3
+ "sources": ["../../../packages/core/src/agents/claude-provider.ts", "../../../packages/core/src/agents/rollout/shared.ts", "../../../packages/core/src/platform/config.ts", "../../../packages/core/src/platform/config-helpers.ts", "../../../packages/core/src/platform/logger.ts", "../../../packages/core/src/types.ts", "../../../packages/core/src/platform/jsonl.ts", "../../../packages/core/src/platform/file-utils.ts", "../../../packages/core/src/agents/claude-registry.ts", "../../../packages/core/src/agents/deep-map.ts", "../../../packages/core/src/agents/execution-host.ts", "../../../packages/core/src/security/sensitive-path.ts", "../../../packages/core/src/agents/vault-tool-policy.ts", "../../../packages/core/src/mcp/runtime-spec.ts", "../../../packages/core/src/mcp/session-comm/bridge-ipc-config.ts", "../../../packages/core/src/platform/background-bash/manager.ts", "../../../packages/core/src/platform/delay.ts", "../../../packages/core/src/platform/background-bash/context.ts", "../../../packages/core/src/platform/mcp-catalog-policy.ts", "../../../packages/core/src/platform/playwright/capability.ts", "../../../packages/core/src/platform/mcp-config.ts", "../../../packages/core/src/storage/vault.ts", "../../../packages/core/src/storage/sqlite.ts", "../../../packages/core/src/storage/storage-host.ts", "../../../packages/core/src/storage/vault-crypto-core.ts", "../../../packages/core/src/storage/vault-crypto.ts", "../../../packages/core/src/media/file-events.ts", "../../../packages/core/src/platform/error.ts", "../../../packages/core/src/runtime/context-warning.ts", "../../../packages/core/src/agents/codex-provider.ts", "../../../packages/core/src/agents/codex-native-multi-agent.ts", "../../../packages/core/src/version.ts", "../../../packages/core/src/agents/codex-tree-kill.ts", "../../../packages/core/src/agents/codex-tree-manager.ts", "../../../packages/core/src/agents/rollout/codex.ts", "../../../packages/core/src/agents/tool-format.ts", "../../../packages/core/src/platform/maestro-bootstrap-env.ts", "../../../packages/core/src/agents/maestro-provider.ts", "../../../packages/core/src/agents/claude-runtime-inspection.ts", "../../../packages/core/src/agents/hosted-agent.ts"],
4
4
  "sourcesContent": [
5
5
  "import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type {\n HookInput,\n Options,\n PostToolUseHookInput,\n PreToolUseHookInput,\n SDKAssistantMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKSystemMessage,\n SDKToolProgressMessage,\n SDKToolUseSummaryMessage,\n SDKUserMessage,\n SDKUserMessageReplay,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n ContentBlockParam,\n ImageBlockParam,\n} from \"@anthropic-ai/sdk/resources/messages/messages.mjs\";\nimport { claudeRegistry } from \"#agents/claude-registry\";\nimport { deepMapStrings } from \"#agents/deep-map\";\nimport {\n hostedClaudeCodeExecutablePath,\n hostedMcpServers,\n redactHostedSecrets,\n referencesHostedSecretStorage,\n substituteHostedSecrets,\n} from \"#agents/execution-host\";\nimport { shouldSubstituteVaultToolInput } from \"#agents/vault-tool-policy\";\nimport { extractFileEvents } from \"#media/file-events\";\nimport { errMsg } from \"#platform/error\";\nimport { logger } from \"#platform/logger\";\nimport { claudeRequestContextTokens } from \"#runtime/context-warning\";\nimport type { AgentInputAttachment, AgentQueryOptions, EffortLevel, UnifiedEvent } from \"#types\";\n\nconst CLAUDE_DEFAULT_DISALLOWED_TOOLS = [\n \"AskUserQuestion\",\n \"Workflow\",\n \"TodoWrite\",\n \"TaskCreate\",\n \"TaskUpdate\",\n \"TaskList\",\n \"TaskGet\",\n // Native scheduling/cron tools duplicate Negotium's own runtime MCP surface\n // (`mcp__runtime__schedule_self`, the `cron-manager` server) and bypass its\n // persistence/host wiring if used directly.\n \"ScheduleWakeup\",\n \"CronCreate\",\n \"CronList\",\n \"CronDelete\",\n] as const;\n\nconst CLAUDE_NATIVE_AGENT_TOOLS = [\"Task\", \"Agent\", \"TaskOutput\", \"TaskStop\"] as const;\n\nexport function claudeBuiltInTools(\n opts: Pick<AgentQueryOptions, \"toolPolicy\">,\n): string[] | undefined {\n return opts.toolPolicy ? [] : undefined;\n}\n\nexport function substituteClaudeToolInput(\n userId: string,\n toolName: string,\n input: unknown,\n): unknown {\n if (!shouldSubstituteVaultToolInput(toolName)) return input;\n return deepMapStrings(input, (value) => substituteHostedSecrets(userId, value));\n}\n\nexport function buildClaudeDisallowedTools(\n extra: readonly string[] | undefined = undefined,\n): string[] {\n return [\n ...new Set([\n ...CLAUDE_DEFAULT_DISALLOWED_TOOLS,\n ...CLAUDE_NATIVE_AGENT_TOOLS,\n ...(extra ?? []),\n ]),\n ];\n}\n\n/**\n * Narrow our shared `EffortLevel` to the subset claude-agent-sdk accepts.\n * Claude SDK rejects \"minimal\" (codex-only); we drop it silently rather than\n * coercing, matching our policy for unrecognized model strings.\n */\ntype ClaudeEffort = Exclude<EffortLevel, \"minimal\">;\nfunction toClaudeEffort(e: EffortLevel | undefined): ClaudeEffort | undefined {\n if (!e || !claudeRegistry.validateEffort(e)) return undefined;\n return e as ClaudeEffort;\n}\n\ntype ClaudeImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nconst CLAUDE_IMAGE_MAX_BYTES = 10 * 1024 * 1024;\nconst CLAUDE_IMAGE_MIME_TYPES = new Set<string>([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nfunction isClaudeImageAttachment(\n attachment: AgentInputAttachment,\n): attachment is AgentInputAttachment & { mimeType: ClaudeImageMimeType } {\n return attachment.type === \"image\" && CLAUDE_IMAGE_MIME_TYPES.has(attachment.mimeType);\n}\n\nasync function* singleUserMessage(message: SDKUserMessage): AsyncGenerator<SDKUserMessage> {\n yield message;\n}\n\nfunction buildClaudePrompt(opts: AgentQueryOptions): string | AsyncIterable<SDKUserMessage> {\n const attachments = opts.attachments ?? [];\n if (attachments.length === 0) return opts.prompt;\n\n const imageBlocks: ImageBlockParam[] = [];\n for (const attachment of attachments) {\n if (!isClaudeImageAttachment(attachment)) continue;\n if (attachment.sizeBytes > CLAUDE_IMAGE_MAX_BYTES) {\n logger.info(\n {\n path: attachment.path,\n mimeType: attachment.mimeType,\n sizeBytes: attachment.sizeBytes,\n maxBytes: CLAUDE_IMAGE_MAX_BYTES,\n },\n \"claudeProvider: skipping oversized image attachment content block\",\n );\n continue;\n }\n\n try {\n imageBlocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType,\n data: readFileSync(attachment.path).toString(\"base64\"),\n },\n });\n } catch (err) {\n logger.warn(\n {\n path: attachment.path,\n mimeType: attachment.mimeType,\n err,\n },\n \"claudeProvider: failed to read image attachment for content block\",\n );\n }\n }\n\n if (imageBlocks.length === 0) return opts.prompt;\n\n const content: ContentBlockParam[] = [{ type: \"text\", text: opts.prompt }, ...imageBlocks];\n return singleUserMessage({\n type: \"user\",\n message: {\n role: \"user\",\n content,\n },\n parent_tool_use_id: null,\n });\n}\n\n// --- Stream event sub-types (from @anthropic-ai/sdk, not directly importable) ---\ninterface ContentBlockDelta {\n type: \"content_block_delta\";\n delta: { type: string; partial_json?: string; text?: string };\n}\ntype StreamEvent = ContentBlockDelta | { type: string };\n\n// --- Assistant message content block types (from BetaMessage.content) ---\ninterface TextBlock {\n type: \"text\";\n text: string;\n}\ninterface ToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\ninterface ToolResultBlock {\n type: \"tool_result\";\n tool_use_id: string;\n content: string | unknown;\n is_error?: boolean;\n}\ntype ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | { type: string };\n\n// --- Process tree kill on abort ---\n//\n// The Claude Agent SDK spawns a `claude` CLI subprocess, which in turn spawns\n// MCP servers (playwright-mcp, background workers, …) which themselves spawn\n// browsers / interpreters. The SDK's default abort path only signals the\n// direct child, leaving grandchildren orphaned — over time they accumulate as\n// zombies, holding ports (Playwright DevTools 9222) and leaking memory\n// (Chrome ~hundreds of MB per orphan). Single-user Mac deployments notice\n// this within a day of repeated /abort.\n//\n// We override `spawnClaudeCodeProcess` to:\n// 1. spawn with `detached: true` → child becomes the leader of a new\n// process group with the same pgid as its pid;\n// 2. on abort, send the signal to `-pid` (the whole group) instead of the\n// single pid, so all transitive descendants receive it;\n// 3. escalate to SIGKILL after a 2.5s grace if SIGTERM didn't take.\n\ntype SpawnClaudeCodeProcess = NonNullable<Options[\"spawnClaudeCodeProcess\"]>;\ntype SpawnClaudeCodeOptions = Parameters<SpawnClaudeCodeProcess>[0];\ntype SpawnClaudeCodeResult = ReturnType<SpawnClaudeCodeProcess>;\n\nconst CLAUDE_ABORT_SIGKILL_DELAY_MS = 2500;\n\nfunction signalProcessTree(pid: number, signal: NodeJS.Signals): boolean {\n // Negative pid = \"signal every process in this process group\". Falls back\n // to single-pid signaling if the group call fails (e.g. on platforms where\n // `detached` didn't materialize a new group).\n try {\n process.kill(-pid, signal);\n return true;\n } catch (groupErr) {\n try {\n process.kill(pid, signal);\n return true;\n } catch (pidErr) {\n logger.debug({ groupErr, pidErr, pid, signal }, \"Failed to signal Claude process tree\");\n return false;\n }\n }\n}\n\nexport function spawnClaudeCodeProcessWithTreeKill(\n options: SpawnClaudeCodeOptions,\n): SpawnClaudeCodeResult {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n detached: true,\n env: options.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n });\n if (!child.stdin || !child.stdout) {\n child.kill(\"SIGKILL\");\n throw new Error(\"Failed to spawn Claude Code process with piped stdin/stdout\");\n }\n\n let exited = false;\n let killTimer: NodeJS.Timeout | undefined;\n const clearKillTimer = () => {\n if (killTimer) clearTimeout(killTimer);\n killTimer = undefined;\n };\n\n const kill = (signal: NodeJS.Signals): boolean => {\n if (!child.pid) return child.kill(signal);\n const ok = signalProcessTree(child.pid, signal);\n if (signal !== \"SIGKILL\") {\n // Soft signal: schedule a SIGKILL fallback so a stuck process tree\n // can't survive abort indefinitely.\n clearKillTimer();\n killTimer = setTimeout(() => {\n if (!exited && child.pid) {\n logger.warn({ pid: child.pid }, \"Claude process tree still alive after SIGTERM; SIGKILL\");\n signalProcessTree(child.pid, \"SIGKILL\");\n }\n }, CLAUDE_ABORT_SIGKILL_DELAY_MS);\n killTimer.unref?.();\n }\n return ok;\n };\n\n const onAbort = () => {\n logger.warn({ pid: child.pid, command: options.command }, \"Aborting Claude Code process tree\");\n kill(\"SIGTERM\");\n };\n\n if (options.signal.aborted) onAbort();\n else options.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.once(\"exit\", (code, signal) => {\n exited = true;\n clearKillTimer();\n options.signal.removeEventListener(\"abort\", onAbort);\n logger.debug({ pid: child.pid, code, signal }, \"Claude Code process exited\");\n });\n\n // Consume the child's 'error' event. Without a listener, a spawn-level error\n // propagates into the SDK's readline-over-stdout teardown and crashes the\n // whole process with \"this.input.pause is not a function\" (node:readline\n // close→pause on a stream that never initialized). Handling it here keeps the\n // failure local and surfaces a clean diagnostic.\n child.once(\"error\", (err) => {\n exited = true;\n clearKillTimer();\n options.signal.removeEventListener(\"abort\", onAbort);\n logger.error(\n {\n pid: child.pid,\n command: options.command,\n err: err instanceof Error ? err.message : String(err),\n },\n \"Claude Code process error event\",\n );\n });\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed || exited;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill,\n on(event, listener) {\n child.on(event, listener);\n },\n once(event, listener) {\n child.once(event, listener);\n },\n off(event, listener) {\n child.off(event, listener);\n },\n };\n}\n\n/**\n * Recognize the multiple shapes Node + WHATWG fetch use when a request is\n * cancelled via `AbortController`. Mirrors `isAbortError` in maestro/provider\n * — both files keep their own copy so neither has to import the other (the\n * agent providers are deliberately siblings, no shared error helpers).\n */\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const e = err as { name?: unknown; code?: unknown };\n if (e.name === \"AbortError\") return true;\n if (e.code === 20 || e.code === \"ABORT_ERR\") return true;\n return false;\n}\n\n/**\n * Core Claude provider.\n * Wraps the @anthropic-ai/claude-agent-sdk into a UnifiedEvent stream so any\n * caller can consume it identically to other providers such as codexProvider.\n * The dispatch entry point is `runAgent` in agents/index.ts.\n *\n * Failure handling: any throw escaping the SDK iteration (missing Claude CLI\n * binary, OAuth not configured, transient network) is caught and yielded as\n * a `{type:\"error\"}` UnifiedEvent so the dispatcher never sees a synthetic\n * crash and event-processor's `error` case classifies it with the right\n * provider name. Matches the graceful pattern maestroProvider already uses.\n * Abort signals are swallowed silently (the user moved on) so they don't\n * surface as ghost error messages.\n */\nexport async function* claudeProvider(opts: AgentQueryOptions): AsyncGenerator<UnifiedEvent> {\n const claudeExecutable = hostedClaudeCodeExecutablePath();\n // The default host returns undefined so the Agent SDK selects its bundled,\n // version-matched Claude Code binary. If a host explicitly overrides the\n // executable, validate it up front and return an actionable error instead\n // of letting process spawn fail mid-stream with an opaque ENOENT.\n if (claudeExecutable && !existsSync(claudeExecutable)) {\n yield {\n type: \"error\",\n content: `Claude CLI not found at ${claudeExecutable}. Install Claude Code or configure the executable path.`,\n };\n return;\n }\n\n const cleanEnv = { ...process.env };\n delete cleanEnv.NEGOTIUM_PEER_SESSION_BRIDGE_URL;\n delete cleanEnv.NEGOTIUM_PEER_SESSION_BRIDGE_TOKEN;\n delete cleanEnv.CLAUDECODE;\n cleanEnv.CLAUDE_CODE_STREAM_CLOSE_TIMEOUT ??= \"300000\";\n // Workflow is a feature flag, not a disallowedTools-addressable tool name.\n // The env var is the version-robust kill switch (works on any CLI the SDK\n // spawns); the `settings` flag layer below covers it a second time.\n cleanEnv.CLAUDE_CODE_DISABLE_WORKFLOWS = \"1\";\n\n const queryOptions: Options = {\n ...(claudeExecutable ? { pathToClaudeCodeExecutable: claudeExecutable } : {}),\n spawnClaudeCodeProcess: spawnClaudeCodeProcessWithTreeKill,\n cwd: opts.cwd,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n includePartialMessages: true,\n env: cleanEnv,\n mcpServers: hostedMcpServers(opts) as Options[\"mcpServers\"],\n ...(claudeBuiltInTools(opts) ? { tools: claudeBuiltInTools(opts) } : {}),\n abortController: opts.abortController,\n // `AskUserQuestion` is Claude Code's built-in clarification tool, but it\n // expects the SDK CLI to render a TUI prompt and read stdin for the\n // answer — neither exists in this headless Telegram bridge. Without\n // disallowing it, the model would call AskUserQuestion, the SDK would\n // wait for a TUI response that never comes, and the turn would hang\n // until abort. Forbidding the tool nudges the model to ask the same\n // clarification as plain text (see topic-system prompt), which routes\n // through the normal next-user-message path and the user just answers\n // in the topic.\n //\n // Claude Code's private task store, Workflow, and native subagent tools are\n // not Negotium state. They stay disabled even when a caller supplies custom\n // agent definitions: delegation must go through runtime.spawn_subagent and\n // task state must go through the required shared task MCP.\n disallowedTools: buildClaudeDisallowedTools(opts.disallowedTools),\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.maxBudgetUsd ? { maxBudgetUsd: opts.maxBudgetUsd } : {}),\n ...(opts.agents\n ? {\n agents: Object.fromEntries(\n Object.entries(opts.agents).map(([name, def]) => {\n const { effort, ...rest } = def;\n const narrowed = typeof effort === \"string\" ? toClaudeEffort(effort) : effort;\n return [name, narrowed !== undefined ? { ...rest, effort: narrowed } : rest];\n }),\n ),\n }\n : {}),\n ...(toClaudeEffort(opts.effort) ? { effort: toClaudeEffort(opts.effort) } : {}),\n hooks: {\n PreToolUse: [\n {\n hooks: [\n async (input: HookInput) => {\n const { tool_name, tool_input } = input as PreToolUseHookInput;\n if (referencesHostedSecretStorage(tool_input)) {\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: \"Runtime secret storage access is not permitted\",\n },\n };\n }\n\n // Block built-in run_in_background: the bash runs inside the CLI\n // subprocess and dies when the turn ends (SIGTERM on IPC close).\n // Direct the model to the MCP tool that survives across turns and\n // auto-injects a completion notification via session-inbox.\n if (\n tool_name === \"Bash\" &&\n (tool_input as Record<string, unknown>)?.run_in_background === true\n ) {\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason:\n \"run_in_background is not supported in headless mode — the bash process dies when the agent turn ends. Use mcp__background-bash__background_bash_run instead: it survives across turns and automatically injects the result into the session when done.\",\n },\n };\n }\n\n // Resolve Vault placeholders only for explicitly allowlisted\n // transient execution tools. Messaging and persistence tools\n // must retain {{KEY}} verbatim.\n const userId = opts.vaultUserId ?? opts.userId ?? \"\";\n const withVault = substituteClaudeToolInput(userId, tool_name, tool_input);\n if (JSON.stringify(withVault) === JSON.stringify(tool_input)) {\n return { continue: true };\n }\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n updatedInput: withVault as Record<string, unknown>,\n },\n };\n },\n ],\n },\n ],\n PostToolUse: [\n {\n hooks: [\n async (input: HookInput) => {\n const { tool_response } = input as PostToolUseHookInput;\n const userId = opts.vaultUserId ?? opts.userId ?? \"\";\n const redacted = deepMapStrings(tool_response, (value) =>\n redactHostedSecrets(userId, value),\n );\n if (JSON.stringify(redacted) === JSON.stringify(tool_response)) {\n return { continue: true };\n }\n return {\n hookSpecificOutput: {\n hookEventName: \"PostToolUse\" as const,\n updatedToolOutput: redacted,\n },\n };\n },\n ],\n },\n ],\n },\n settingSources: [\"project\"] as Options[\"settingSources\"],\n // Disable the multi-agent Workflow feature: a headless backend query has\n // no business fanning out orchestration subagents, and the \"ultracode\"\n // keyword trigger would let user-authored message text opt into it.\n settings: {\n disableWorkflows: true,\n workflowKeywordTriggerEnabled: false,\n },\n systemPrompt: opts.systemPrompt,\n };\n\n if (opts.sessionId) {\n queryOptions.resume = opts.sessionId;\n }\n\n // Wrap the SDK iteration so init failures (missing claude CLI, OAuth not\n // configured, transient network errors before the first event) surface as\n // a normal error UnifiedEvent. Without this, an unconfigured Claude\n // install would crash the dispatcher with a synthetic exception and the\n // user-facing classifyError would still fire — but only via the handler\n // catch path, which means cleanup ordering differed from maestro/codex.\n // Keeping the failure shape consistent across providers simplifies the\n // upstream error code.\n // Thinking heartbeat: long extended-thinking stretches (minutes on fable /\n // high effort) emit no text or tool events, so the room UI goes silent and\n // the user can't tell whether the turn is still alive. The SDK does stream\n // thinking signals (`thinking_delta` content deltas, `system/thinking_tokens`\n // pings during redacted thinking) — digest them into a throttled\n // `tool_progress` heartbeat that the client already renders as a live status\n // chip (its handler also re-asserts the typing indicator).\n const THINKING_BEAT_MS = 5000;\n let thinkingStart: number | null = null;\n let lastThinkingBeat = 0;\n let lastContextTokens: number | undefined;\n let lastContextModel: string | undefined;\n const thinkingBeat = (): { type: \"tool_progress\"; toolName: string; elapsed: number } | null => {\n const now = Date.now();\n if (thinkingStart === null) {\n thinkingStart = now;\n lastThinkingBeat = now;\n return { type: \"tool_progress\", toolName: \"thinking\", elapsed: 0 };\n }\n if (now - lastThinkingBeat < THINKING_BEAT_MS) return null;\n lastThinkingBeat = now;\n return { type: \"tool_progress\", toolName: \"thinking\", elapsed: (now - thinkingStart) / 1000 };\n };\n\n try {\n const prompt = buildClaudePrompt(opts);\n for await (const message of query({\n prompt,\n options: queryOptions,\n })) {\n // --- Thinking heartbeat (see above) ---\n // A thinking \"stretch\" ends at the first non-thinking signal so elapsed\n // restarts cleanly on the next thinking phase within the same turn.\n if (\n message.type === \"system\" &&\n (message as { subtype?: string }).subtype === \"thinking_tokens\"\n ) {\n const beat = thinkingBeat();\n if (beat) yield beat;\n continue;\n }\n\n // --- Stream events (token-by-token) ---\n // tool_use is NOT emitted from the stream path: the completed assistant\n // message below carries the same block with its input already parsed,\n // and tools only start executing after the message completes — so the\n // stream copy added no timeliness, only a duplicate tool_use per turn\n // in the unified log (doubling `<!-- Tool: ... -->` comments when\n // bridging to another agent).\n if (message.type === \"stream_event\") {\n const streamMsg = message as SDKPartialAssistantMessage;\n const evt = (streamMsg as { event?: StreamEvent }).event;\n if (!evt) continue;\n\n if (evt.type === \"content_block_delta\") {\n const delta = evt as ContentBlockDelta;\n if (delta.delta.type === \"thinking_delta\") {\n const beat = thinkingBeat();\n if (beat) yield beat;\n } else if (delta.delta.type === \"text_delta\" && delta.delta.text) {\n // Claude only exposes tool_use blocks on the completed assistant\n // message below. Forwarding text deltas here would place all text\n // before those tools, making the original block order impossible\n // for consumers to reconstruct. The completed message emits text\n // and tool blocks in their canonical order.\n thinkingStart = null;\n } else {\n // Tool-args streaming (partial_json) etc. — thinking stretch over.\n thinkingStart = null;\n }\n }\n\n continue;\n }\n\n // Any completed message (assistant text, tool events, results) ends the\n // current thinking stretch.\n thinkingStart = null;\n\n // --- Tool progress ---\n if (message.type === \"tool_progress\") {\n const m = message as SDKToolProgressMessage;\n yield {\n type: \"tool_progress\",\n toolName: m.tool_name,\n elapsed: m.elapsed_time_seconds,\n };\n continue;\n }\n\n // --- Tool use summary ---\n if (message.type === \"tool_use_summary\") {\n const m = message as SDKToolUseSummaryMessage;\n yield { type: \"tool_use_summary\", summary: m.summary };\n continue;\n }\n\n // --- System init ---\n if (message.type === \"system\") {\n const m = message as SDKSystemMessage;\n if (m.subtype === \"init\") {\n yield { type: \"session\", sessionId: m.session_id };\n } else {\n // Log all other system messages (task_updated, task_progress,\n // task_notification, etc.) so we can observe lifecycle events.\n logger.debug(\n { subtype: m.subtype, msg: m },\n \"claudeProvider: system message (unhandled subtype)\",\n );\n }\n continue;\n }\n\n // --- Result (terminal) ---\n // SDK occasionally yields stray messages after a `result`; consuming them\n // surfaces as ghost messages in the topic (\"어? 뭐가 더 나오네?\"). Close\n // the generator immediately on terminal so the SDK stream is dropped and\n // any trailing payloads can't leak through.\n if (message.type === \"result\") {\n const m = message as SDKResultMessage;\n if (m.subtype === \"success\") {\n const contextWindow =\n (lastContextModel ? m.modelUsage?.[lastContextModel]?.contextWindow : undefined) ??\n Object.values(m.modelUsage ?? {})[0]?.contextWindow;\n yield {\n type: \"result\",\n content: m.result,\n stopReason: m.stop_reason ?? \"end_turn\",\n usage: m.usage\n ? {\n inputTokens: m.usage.input_tokens,\n outputTokens: m.usage.output_tokens,\n cacheCreationInputTokens: m.usage.cache_creation_input_tokens ?? undefined,\n cacheReadInputTokens: m.usage.cache_read_input_tokens ?? undefined,\n costUsd: m.total_cost_usd,\n ...(lastContextTokens !== undefined && contextWindow\n ? { contextTokens: lastContextTokens, contextWindow }\n : {}),\n }\n : undefined,\n };\n yield* extractFileEvents(m.result, \"result\");\n return;\n }\n // Error result\n const budgetExceeded = m.subtype === \"error_max_budget_usd\";\n const errorMsg = budgetExceeded\n ? \"The job reached its cost limit\"\n : m.errors?.join(\"; \") || \"Unknown error\";\n yield {\n type: \"error\",\n content: errorMsg,\n ...(budgetExceeded ? { code: \"budget_exceeded\" as const } : {}),\n ...(m.usage\n ? {\n usage: {\n inputTokens: m.usage.input_tokens,\n outputTokens: m.usage.output_tokens,\n cacheCreationInputTokens: m.usage.cache_creation_input_tokens ?? undefined,\n cacheReadInputTokens: m.usage.cache_read_input_tokens ?? undefined,\n costUsd: m.total_cost_usd,\n },\n }\n : {}),\n };\n return;\n }\n\n // --- Assistant message ---\n if (message.type === \"assistant\") {\n const m = message as SDKAssistantMessage;\n const content = (m.message?.content ?? []) as ContentBlock[];\n const usage = m.message?.usage;\n if (usage) {\n lastContextTokens = claudeRequestContextTokens(usage) ?? undefined;\n lastContextModel = m.message.model;\n }\n\n for (const block of content) {\n if (block.type === \"text\") {\n const textBlock = block as TextBlock;\n yield { type: \"text\", content: textBlock.text };\n // Surface mid-turn [FILE:/abs/path] tags right away, matching codex/\n // maestro providers — without this, a model that narrates a file\n // before its next tool call (rather than emitting the tag in the\n // final `result` text) wouldn't trigger send-file at all. The file\n // event handler dedups on normalized path so the same tag appearing\n // again in `result` won't double-send.\n yield* extractFileEvents(textBlock.text, \"text\");\n } else if (block.type === \"tool_use\") {\n const tb = block as ToolUseBlock;\n yield {\n type: \"tool_use\",\n name: tb.name,\n input: tb.input || {},\n toolUseId: tb.id,\n };\n }\n }\n continue;\n }\n\n // --- User message (tool results ride on user-role messages) ---\n // The Anthropic message protocol puts tool_result blocks in USER\n // messages, never assistant ones — without this branch the unified log\n // records tool calls but no results, losing information codex topics\n // keep (visible when bridging a claude topic to another agent).\n if (message.type === \"user\") {\n const um = message as SDKUserMessage | SDKUserMessageReplay;\n // Replays re-deliver transcript history on resume; mapping them would\n // duplicate every past tool_result into the unified log.\n if (\"isReplay\" in um && um.isReplay) continue;\n const content = um.message?.content;\n if (!Array.isArray(content)) continue;\n for (const block of content as ContentBlock[]) {\n if (block.type !== \"tool_result\") continue;\n const trBlock = block as ToolResultBlock;\n const trContent =\n typeof trBlock.content === \"string\" ? trBlock.content.slice(0, 200) : \"\";\n yield {\n type: \"tool_result\",\n toolUseId: trBlock.tool_use_id || \"\",\n content: trContent,\n ...(trBlock.is_error ? { isError: true } : {}),\n };\n }\n }\n }\n } catch (e) {\n // Abort = user moved on; don't surface as an error message. The handler\n // catches the abort signal separately via abortReason, so swallowing\n // here matches both maestro and codex behavior.\n if (isAbortError(e) || opts.abortController?.signal.aborted) return;\n logger.error({ err: e }, \"claudeProvider: SDK iteration failed\");\n yield { type: \"error\", content: errMsg(e) };\n }\n}\n",
6
6
  "/**\n * Helpers shared by every agent's rollout encoder.\n *\n * Each rollout file under `agents/rollout/<agent>.ts` materializes a\n * synthetic SDK-native JSONL from a provider-agnostic `ConversationEntry`\n * stream. The cwd validation, UUID shape check, and chat-pair extraction\n * are identical regardless of agent, so they live here.\n */\n\nimport { mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n DM_WORKSPACE_DIR,\n PROJECT_ROOT,\n SESSION_WORKSPACE_DIR,\n TOPIC_WORKSPACE_DIR,\n WORKSPACE_DIR,\n} from \"#platform/config\";\nimport { logger } from \"#platform/logger\";\nimport { renderUserPromptBatch } from \"#runtime/user-turn-envelope\";\nimport type { ConversationEntry } from \"#storage/conversations\";\n\nexport interface RolloutHostOptions {\n /** Absolute workspace roots under which synthetic provider sessions may be written. */\n workspaceRoots?: readonly string[];\n /** Directory containing the provider rollout fixture JSONL files. */\n fixturesDir?: string;\n}\n\nlet trustedWorkspaceRoots = [\n WORKSPACE_DIR,\n DM_WORKSPACE_DIR,\n SESSION_WORKSPACE_DIR,\n TOPIC_WORKSPACE_DIR,\n].map((root) => resolve(root));\n\n/** Configure the embedding host's trusted workspace roots. */\nexport function configureRolloutHost(options: RolloutHostOptions): () => void {\n if (!options.workspaceRoots && !options.fixturesDir) {\n throw new Error(\"configureRolloutHost requires workspaceRoots or fixturesDir\");\n }\n if (options.workspaceRoots?.length === 0) {\n throw new Error(\"configureRolloutHost requires at least one workspace root\");\n }\n const previousRoots = trustedWorkspaceRoots;\n const previousFixturesDir = FIXTURES_DIR;\n if (options.workspaceRoots) {\n trustedWorkspaceRoots = options.workspaceRoots.map((root) => resolve(root));\n }\n if (options.fixturesDir) FIXTURES_DIR = resolve(options.fixturesDir);\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n trustedWorkspaceRoots = previousRoots;\n FIXTURES_DIR = previousFixturesDir;\n };\n}\n\n/**\n * Captured fixture snapshots — `claude-attachments.jsonl`, `codex-shell.jsonl`,\n * etc. — live one level above the per-agent rollout files (under\n * `agents/fixtures/`) so each agent can pull from the same directory without\n * duplicating fixtures.\n *\n * To refresh fixtures: run any live Codex/Claude session, copy the first few\n * non-conversational entries from the resulting rollout file, and update\n * `src/agents/fixtures/{codex-shell,claude-attachments}.jsonl`.\n */\nexport let FIXTURES_DIR = resolve(PROJECT_ROOT, \"src\", \"agents\", \"fixtures\");\n\n/** Deep-clone to avoid mutating cached fixture objects. */\nexport function clone<T>(obj: T): T {\n return structuredClone(obj);\n}\n\n/**\n * UUID v4/v7 shape — both 36 chars with the standard 8-4-4-4-12 hex layout.\n * We do not enforce the version nibble because randomUUID (v4) and uuidv7\n * coexist; the only requirement for our caller is that the value is safe to\n * embed in a path component and that the SDK accepts it as a session/thread\n * identifier.\n */\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function assertUuidLike(label: string, value: string): void {\n if (!UUID_RE.test(value)) {\n throw new Error(`rollout: ${label} is not a UUID-shaped string: ${value}`);\n }\n}\n\n/**\n * Reject cwds that escape Otium-managed workspace roots. We use `path.resolve`\n * to normalize `..` traversal; symlink-based escapes are out of scope (the\n * workspace roots are not expected to contain attacker-controlled symlinks).\n */\nfunction assertCwdInWorkspace(cwd: string): void {\n const abs = resolve(cwd);\n // Synthetic rollouts for spawn/fork must be written under the same root as\n // live topic turns or provider resume looks in a different cwd hash than the\n // one we generated.\n const ok = trustedWorkspaceRoots.some((root) => abs === root || abs.startsWith(`${root}/`));\n if (!ok) {\n throw new Error(`rollout: cwd outside trusted workspace roots: ${cwd} (resolved=${abs})`);\n }\n}\n\n/** Best-effort guarantee that the resumed cwd will exist when the SDK stats it. */\nexport function ensureCwdExists(cwd: string): void {\n assertCwdInWorkspace(cwd);\n try {\n mkdirSync(cwd, { recursive: true });\n } catch (err) {\n logger.warn({ err, cwd }, \"rollout: ensureCwdExists failed — caller should pre-create cwd\");\n }\n}\n\n/**\n * Length-bound a string by Unicode code points rather than UTF-16 units, so a\n * truncation never lands in the middle of a multi-byte sequence and produces\n * a malformed character. Used for in-line tool annotations where we only need\n * a rough preview, not the full payload.\n */\nfunction truncate(text: string, n: number): string {\n const cps = Array.from(text);\n return cps.length > n ? `${cps.slice(0, n).join(\"\")}…` : text;\n}\n\n/**\n * Reduce a UnifiedEvent stream to user/assistant message pairs. Tool calls and\n * tool results are inlined as bracketed annotations on the surrounding\n * assistant turn so the historical narrative is preserved when synthesizing a\n * native rollout for a different SDK. Streaming text deltas are folded into\n * their final consolidated `text` event to avoid double-counting partial\n * tokens.\n */\nexport type ChatPair = { userText: string; assistantText: string };\n\ninterface ExtractOptions {\n includeToolAnnotations: boolean;\n}\n\nexport function extractChatPairs(\n entries: ConversationEntry[],\n opts: ExtractOptions = { includeToolAnnotations: true },\n): ChatPair[] {\n const pairs: ChatPair[] = [];\n let pendingUsers: string[] = [];\n let pendingBatchSize: number | null = null;\n let pendingBatchNextIndex = 0;\n let pendingAssistantParts: string[] = [];\n let toolBuffer: string[] = [];\n\n const flushAssistant = () => {\n if (pendingUsers.length === 0) return;\n const tools =\n opts.includeToolAnnotations && toolBuffer.length > 0 ? `\\n\\n${toolBuffer.join(\"\\n\")}` : \"\";\n const assistantText = pendingAssistantParts.join(\"\").trim() + tools;\n if (assistantText.trim()) {\n pairs.push({ userText: renderUserPromptBatch(pendingUsers), assistantText });\n }\n pendingUsers = [];\n pendingBatchSize = null;\n pendingBatchNextIndex = 0;\n pendingAssistantParts = [];\n toolBuffer = [];\n };\n\n for (const entry of entries) {\n const ev = entry.event;\n switch (ev.type) {\n case \"user_message\": {\n const userEvent = ev as {\n content: string;\n consecutiveBatchSize?: number;\n consecutiveBatchIndex?: number;\n };\n if (pendingAssistantParts.length > 0 || toolBuffer.length > 0) {\n flushAssistant();\n }\n const batchSize = userEvent.consecutiveBatchSize;\n const batchIndex = userEvent.consecutiveBatchIndex;\n const marked =\n Number.isInteger(batchSize) &&\n Number.isInteger(batchIndex) &&\n (batchSize ?? 0) > 1 &&\n (batchIndex ?? -1) >= 0 &&\n (batchIndex ?? 0) < (batchSize ?? 0);\n if (!marked) {\n if (pendingUsers.length > 0) flushAssistant();\n pendingUsers.push(userEvent.content);\n pendingBatchSize = null;\n pendingBatchNextIndex = 0;\n break;\n }\n if (batchIndex === 0) {\n if (pendingUsers.length > 0) flushAssistant();\n pendingBatchSize = batchSize ?? null;\n pendingBatchNextIndex = 0;\n } else if (\n !(\n (pendingBatchSize !== null &&\n (batchSize ?? 0) >= pendingBatchSize &&\n pendingBatchNextIndex === batchIndex) ||\n (pendingBatchSize === null && pendingUsers.length === batchIndex)\n )\n ) {\n flushAssistant();\n }\n pendingUsers.push(userEvent.content);\n pendingBatchSize = batchSize ?? null;\n pendingBatchNextIndex = (batchIndex ?? 0) + 1;\n break;\n }\n case \"session\":\n // Session-id metadata. Provider sessions can change mid-conversation\n // (e.g. agent flip after rollout reconstruction), but the SDK normally\n // emits this *during* a turn — after the user prompt was already\n // recorded, before the assistant text arrives. Only flush when there\n // is actual assistant content in flight; otherwise we'd discard the\n // staged user prompt and the next text event would synthesize a bogus\n // \"(continued)\" pair.\n if (pendingAssistantParts.length > 0 || toolBuffer.length > 0) {\n flushAssistant();\n }\n break;\n case \"text\": {\n // Per-block assistant text. claudeProvider emits one of these per text\n // content block, so a single turn can yield multiple `text` events\n // interleaved with tool_use. Accumulate (do NOT flush yet) — the\n // turn's `result` event below carries the final concatenation and\n // is the proper boundary.\n if (pendingUsers.length === 0) {\n pendingUsers = [\"(continued)\"];\n }\n pendingAssistantParts.push((ev as { content: string }).content);\n break;\n }\n case \"result\": {\n // End-of-turn marker. `result.content` is the canonical final answer\n // produced by the provider, so prefer it over the accumulated `text`\n // chunks (which may be partial or out of order across SDKs).\n if (pendingUsers.length === 0) {\n pendingUsers = [\"(continued)\"];\n }\n pendingAssistantParts = [(ev as { content: string }).content];\n flushAssistant();\n break;\n }\n case \"text_delta\":\n // Skip — final `text`/`result` event carries the complete content.\n break;\n case \"tool_use\": {\n const u = ev as { name: string; input: Record<string, unknown> };\n toolBuffer.push(`<!-- Tool: ${u.name} ${truncate(JSON.stringify(u.input), 200)} -->`);\n break;\n }\n case \"tool_result\": {\n const u = ev as { content: string };\n toolBuffer.push(`<!-- Tool result: ${truncate(u.content, 200)} -->`);\n break;\n }\n case \"error\": {\n const u = ev as { content: string };\n toolBuffer.push(`[Error: ${truncate(u.content, 200)}]`);\n break;\n }\n // Other UnifiedEvent variants (`tool_progress`, `tool_use_summary`,\n // `file`, `text_delta` already handled above) carry no conversational\n // content, so they do not contribute to a chat pair. We intentionally\n // omit a default branch — the explicit user_message variant introduced\n // by the recorder makes the previous \"treat unrecognized as user\" hack\n // unnecessary, and adding new UnifiedEvent variants in the future\n // should require an explicit decision here, not silent inheritance.\n case \"tool_progress\":\n case \"tool_use_summary\":\n case \"file\":\n case \"status\":\n break;\n }\n }\n flushAssistant();\n return pairs;\n}\n",
7
- "import { execFileSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n accessSync,\n chmodSync,\n constants,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseRuntimePort, readEnvText, safeRuntimePathSegment } from \"#platform/config-helpers\";\nimport { logger } from \"#platform/logger\";\nimport { type AgentKind, isAgentKind } from \"#types\";\n\nexport function envText(envKey: string): string | undefined {\n return readEnvText(process.env, envKey);\n}\n\nfunction resolveAgentEnv(envKey: string, fallback: AgentKind, legacyEnvKey?: string): AgentKind {\n const value = envText(envKey) ?? (legacyEnvKey ? envText(legacyEnvKey) : undefined);\n return isAgentKind(value) ? value : fallback;\n}\n\nconst HOME = homedir();\n\n// new URL(\"../..\", import.meta.url) causes webpack to treat \"../..\" as a module import.\n// Split into fileURLToPath → dirname → resolve to avoid that.\nfunction resolveProjectRoot(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const packagedRuntime = resolve(moduleDir, \"runtime\");\n if (existsSync(resolve(packagedRuntime, \"src\"))) return packagedRuntime;\n return resolve(moduleDir, \"../..\");\n}\n\nexport const PROJECT_ROOT = resolveProjectRoot();\n\n/** Resolve a dependency executable from either a package-local or hoisted install. */\nfunction resolveDependencyBin(name: string): string {\n let dir = PROJECT_ROOT;\n while (true) {\n const candidate = resolve(dir, \"node_modules\", \".bin\", name);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return candidate;\n dir = parent;\n }\n}\n\n// Each machine is one negotium node; all node state lives in one dotdir.\n// NEGOTIUM_STATE_DIR overrides (useful for tests and multi-node-on-one-box).\nconst STATE_DIR_ENV = envText(\"NEGOTIUM_STATE_DIR\");\nexport const STATE_DIR = STATE_DIR_ENV ? resolve(STATE_DIR_ENV) : resolve(HOME, \".negotium\");\n\nfunction resolveLocalStateDir(envKey: string, stateName: string): string {\n const envValue = envText(envKey);\n if (envValue) return resolve(envValue);\n return resolve(STATE_DIR, stateName);\n}\n\nfunction parsePortEnv(envValue: string | undefined, fallback: number): number {\n return parseRuntimePort(envValue, fallback);\n}\n\nexport const WORKSPACE_DIR = resolveLocalStateDir(\"NEGOTIUM_WORKSPACE_DIR\", \"workspace\");\nexport const TOPIC_WORKSPACE_DIR = resolve(WORKSPACE_DIR, \"topics\");\nexport const SHARED_WIKI_DIR = resolve(WORKSPACE_DIR, \"wiki\");\nexport const CRON_WORKSPACE_DIR = resolve(WORKSPACE_DIR, \"cron\");\nexport const BROWSER_DIR = resolveLocalStateDir(\"NEGOTIUM_BROWSER_DIR\", \"browser\");\nexport const BROWSER_PROFILES_DIR = resolve(BROWSER_DIR, \"profiles\");\nexport const BINARIES_DIR = resolve(STATE_DIR, \"binaries\");\nexport const SECRETS_DIR = resolve(STATE_DIR, \"secrets\");\n// Legacy names remain public, but their durable contents now live under data.\nexport const DM_WORKSPACE_DIR = resolve(STATE_DIR, \"data\", \"dm\");\nexport const SESSION_WORKSPACE_DIR = resolve(STATE_DIR, \"data\", \"sessions\");\n// The Claude Agent SDK ships a platform-matched Claude Code binary. Keep that\n// SDK/CLI pair together by default; only use an external executable when an\n// operator explicitly opts in. This avoids silently pairing an older SDK with\n// a newer globally installed Claude Code release.\nconst CLAUDE_EXECUTABLE_ENV = envText(\"NEGOTIUM_CLAUDE_EXECUTABLE\");\nexport const CLAUDE_EXECUTABLE = CLAUDE_EXECUTABLE_ENV ? resolve(CLAUDE_EXECUTABLE_ENV) : undefined;\n\n// Fallback output language for model-generated prose (topic/channel/manager\n// replies and the archiver's summaries, briefs, articles, completion reply).\n// Defaults to English; set `NEGOTIUM_LANG` to the user's mother tongue (e.g.\n// `Korean`, `ko`). The assistant still mirrors whatever language the user\n// writes in; `NEGOTIUM_MEMORY_LANG` can narrow just the archiver. Fixed system\n// chrome / degraded-path strings emitted by code stay English (can't translate\n// an arbitrary value at runtime).\nexport const DEFAULT_OUTPUT_LANGUAGE = \"English\";\n\nexport function resolveOutputLanguage(): string {\n const raw = envText(\"NEGOTIUM_LANG\")?.trim();\n return raw && raw.length > 0 ? raw : DEFAULT_OUTPUT_LANGUAGE;\n}\n\n/** Browser.rs release tested with this Negotium version. */\nexport const BROWSER_RS_VERSION = \"v0.1.19\";\n/** Require the authenticated listener and the current Browser.rs tool contract. */\nexport const BROWSER_RS_MIN_SECURE_VERSION = \"0.1.15\";\n\nfunction versionAtLeast(actualVersion: string, minimumVersion: string): boolean {\n const actual = actualVersion.split(\".\").map(Number);\n const minimum = minimumVersion.split(\".\").map(Number);\n if (actual.some(Number.isNaN) || minimum.some(Number.isNaN)) return false;\n for (let index = 0; index < minimum.length; index += 1) {\n if ((actual[index] ?? 0) > (minimum[index] ?? 0)) return true;\n if ((actual[index] ?? 0) < (minimum[index] ?? 0)) return false;\n }\n return true;\n}\n\nfunction browserRsMeetsMinimumVersion(candidate: string): boolean {\n try {\n const output = execFileSync(candidate, [\"--version\"], {\n encoding: \"utf8\",\n timeout: 2_000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const match = output.match(/^browser-rs (\\d+)\\.(\\d+)\\.(\\d+)$/);\n if (!match) return false;\n return versionAtLeast(match.slice(1).join(\".\"), BROWSER_RS_MIN_SECURE_VERSION);\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve the preferred Browser.rs engine without consulting PATH. The\n * versioned private location keeps different Negotium releases reproducible\n * and avoids changing a user's global browser-rs installation.\n */\nexport function resolveBrowserRsBin(envValue?: string): string | undefined {\n const override = envValue?.trim();\n if (\n !override &&\n !versionAtLeast(BROWSER_RS_VERSION.replace(/^v/, \"\"), BROWSER_RS_MIN_SECURE_VERSION)\n ) {\n return undefined;\n }\n const candidate = override\n ? resolve(override)\n : resolve(BINARIES_DIR, \"browser-rs\", BROWSER_RS_VERSION, \"browser-rs\");\n try {\n accessSync(candidate, constants.X_OK);\n return browserRsMeetsMinimumVersion(candidate) ? candidate : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Backend that stores documents published by `publish_html` and serves them\n * at `<base>/snippets/<id>`. Unset means the deployment has nowhere to\n * publish, and the publish tools are omitted from the catalog rather than\n * offering a link that cannot be minted.\n */\nexport const SNIPPETS_API_URL = (\n envText(\"NEGOTIUM_SNIPPETS_API_URL\") ??\n envText(\"SNIPPETS_API_URL\") ??\n \"\"\n).replace(/\\/+$/, \"\");\n\nexport const BROWSER_RS_BIN = resolveBrowserRsBin(envText(\"NEGOTIUM_BROWSER_RS_BIN\"));\n\n/** bash-rs release tested with this Negotium version — see apps/negotium/install-bash-rs.mjs. */\nexport const BASH_RS_VERSION = \"v0.1.5\";\n\n/**\n * Resolve the bash-rs binary the same way `resolveBrowserRsBin` resolves\n * Browser.rs: a versioned private location, no PATH lookup, `undefined`\n * (rather than throwing) when it's missing. There is no substitute: the manager\n * throws when a turn tries to prepare background-bash without a binary (see\n * `background-bash/manager.ts`), the turn runner catches that and continues\n * with a reminder that the tools are gone, so background-bash is simply\n * unavailable on a platform without a prebuilt binary.\n */\nexport function resolveBashRsBin(envValue?: string): string | undefined {\n const override = envValue?.trim();\n const candidate = override\n ? resolve(override)\n : resolve(BINARIES_DIR, \"bash-rs\", BASH_RS_VERSION, \"bash-rs\");\n try {\n accessSync(candidate, constants.X_OK);\n return candidate;\n } catch {\n return undefined;\n }\n}\n\nexport const BASH_RS_BIN = resolveBashRsBin(envText(\"NEGOTIUM_BASH_RS_BIN\"));\n\n// Managed Browser.rs terminates MCP transports and security policy itself.\nexport function resolveBrowserMcpBin(envValue?: string): string {\n const override = envValue?.trim();\n if (override) return resolve(override);\n return BROWSER_RS_BIN ?? resolve(BINARIES_DIR, \"browser-rs\", BROWSER_RS_VERSION, \"browser-rs\");\n}\n\nexport const PLAYWRIGHT_MCP_BIN = resolveBrowserMcpBin(envText(\"NEGOTIUM_BROWSER_MCP_BIN\"));\n\n// --- Browser egress proxy ---\n//\n// On a datacenter host (AWS) the browser's egress IP is a known cloud range,\n// so anti-bot services (Cloudflare, DataDome, reCAPTCHA) challenge or block it\n// far more than a residential IP would. Routing the automation browser through\n// a residential/ISP proxy moves the egress IP out of the datacenter range.\n//\n// Operators set BROWSER_PROXY_URL, e.g. http://user:pass@proxy.host:8080 or\n// socks5://proxy.host:1080. Credentials in the URL are split out because\n// Playwright takes them as separate fields. BROWSER_PROXY_BYPASS is an optional\n// comma-separated no-proxy list (e.g. \"localhost,127.0.0.1,*.internal\").\n//\n// NOTE: Chromium does not support authentication for SOCKS proxies — put\n// credentials only on http/https proxy URLs.\nexport type BrowserProxyConfig = {\n server: string;\n username?: string;\n password?: string;\n bypass?: string;\n};\n\nexport function resolveBrowserProxy(): BrowserProxyConfig | null {\n const raw = envText(\"BROWSER_PROXY_URL\");\n if (!raw) return null;\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n logger.warn({ raw }, \"Ignoring malformed BROWSER_PROXY_URL\");\n return null;\n }\n // Playwright wants the server without embedded credentials.\n const server = `${url.protocol}//${url.host}`;\n const proxy: BrowserProxyConfig = { server };\n if (url.username) proxy.username = decodeURIComponent(url.username);\n if (url.password) proxy.password = decodeURIComponent(url.password);\n const bypass = envText(\"BROWSER_PROXY_BYPASS\");\n if (bypass) proxy.bypass = bypass;\n return proxy;\n}\n\n// --- Node/tsx runtime for the `codex` agent's MCP servers ---\n//\n// codex 0.135's rmcp stdio MCP client cannot reliably complete the initialize\n// handshake with servers spawned via `bun` (the JSON-RPC initialize is\n// dropped/raced and no tools ever reach the model). Pure-node servers connect\n// reliably, so codex turns launch the SAME .ts servers via node + tsx instead\n// of `bun run`. claude/maestro keep using `bun run` (fast, native, unaffected).\n//\n// tsx transpiles .ts on the fly and resolves the `@/*` tsconfig path aliases,\n// but only when it can find the tsconfig — and MCP servers run with cwd set to\n// the user's workspace dir, not PROJECT_ROOT — so we pass TSX_TSCONFIG_PATH\n// explicitly via env. Requires package.json `\"type\": \"module\"` so the servers'\n// top-level `await` loads as ESM under node.\nexport const TSX_BIN = resolveDependencyBin(\"tsx\");\n/** In-process tsx loader used by Node MCP entrypoints (avoids the tsx CLI child process). */\nexport const TSX_LOADER = createRequire(import.meta.url).resolve(\"tsx\");\nexport const TSCONFIG_PATH = resolve(PROJECT_ROOT, \"tsconfig.json\");\n\nexport const SESSION_COMM_SERVER = resolve(PROJECT_ROOT, \"src/mcp/session-comm/server.ts\");\n\nexport const TASK_SERVER = resolve(PROJECT_ROOT, \"src/mcp/task-server.ts\");\nexport const BROWSER_MCP_SSE_PROXY_SERVER = resolve(\n PROJECT_ROOT,\n \"src/mcp/browser-sse-proxy-server.ts\",\n);\nexport const CANONICAL_MCP_PROXY_SERVER = resolve(\n PROJECT_ROOT,\n \"src/mcp/canonical-proxy-server.ts\",\n);\n\nexport const WIKI_SERVER = resolve(PROJECT_ROOT, \"src/mcp/wiki-server.ts\");\n\nexport const TOKEN_STATS_SERVER = resolve(PROJECT_ROOT, \"src/mcp/token-stats-server.ts\");\n\nexport const COMPACTION_LOG_SERVER = resolve(PROJECT_ROOT, \"src/mcp/compaction-log-server.ts\");\n\nexport const SYSTEM_HEALTH_SERVER = resolve(PROJECT_ROOT, \"src/mcp/system-health-server.ts\");\n\nexport const AGENT_HEALTH_SERVER = resolve(PROJECT_ROOT, \"src/mcp/agent-health-server.ts\");\n\nexport const VAULT_SERVER = resolve(PROJECT_ROOT, \"src/mcp/vault-server.ts\");\n\nexport const BG_BASH_BASE_PORT = parsePortEnv(process.env.BG_BASH_BASE_PORT, 9700);\nexport const BG_BASH_MAX_PORT = parsePortEnv(process.env.BG_BASH_MAX_PORT, 9799);\n\nfunction safeWorkspaceSegment(value: string, fallback: string): string {\n return safeRuntimePathSegment(value, fallback);\n}\n\n/** Resolve the shared filesystem workspace for an API topic. */\nexport function resolveTopicWorkspaceDir(topicId: string): string {\n return join(TOPIC_WORKSPACE_DIR, safeWorkspaceSegment(topicId, \"topic\"));\n}\n\nexport function isProductionEnv(): boolean {\n return process.env.NODE_ENV === \"production\";\n}\n\nfunction loadOrCreateLocalSecret(\n envKey: string,\n filename: string,\n options: { persistEnvValue?: boolean } = {},\n): string {\n const envValue = envText(envKey);\n const secretFile = resolve(SECRETS_DIR, filename);\n mkdirSync(dirname(secretFile), { recursive: true });\n if (envValue) {\n if (options.persistEnvValue) {\n writeFileSync(secretFile, `${envValue}\\n`, { mode: 0o600 });\n chmodSync(secretFile, 0o600);\n }\n return envValue;\n }\n\n if (existsSync(secretFile)) {\n const stored = readFileSync(secretFile, \"utf-8\").trim();\n if (stored) {\n chmodSync(secretFile, 0o600);\n return stored;\n }\n }\n\n const secret = randomBytes(32).toString(\"base64url\");\n try {\n writeFileSync(secretFile, `${secret}\\n`, { mode: 0o600, flag: \"wx\" });\n return secret;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const stored = readFileSync(secretFile, \"utf-8\").trim();\n if (!stored) throw new Error(`Secret file exists but is empty: ${secretFile}`);\n chmodSync(secretFile, 0o600);\n return stored;\n }\n}\n\nexport const RUNTIME_MCP_SECRET = loadOrCreateLocalSecret(\n \"RUNTIME_MCP_SECRET\",\n \"runtime-mcp-secret\",\n);\n/** Local bearer token for the loopback node-control API. */\nexport const NODE_CONTROL_TOKEN = loadOrCreateLocalSecret(\n \"NEGOTIUM_CONTROL_TOKEN\",\n \"node-control-token\",\n);\nexport const VAULT_MASTER_KEY = loadOrCreateLocalSecret(\n \"NEGOTIUM_VAULT_MASTER_KEY\",\n \"vault-master-key\",\n { persistEnvValue: true },\n);\n// Agent/tool subprocesses inherit process.env. Keep the loaded key in this\n// process only so `env`/`ps` inside an agent workspace cannot reveal it.\ndelete process.env.NEGOTIUM_VAULT_MASTER_KEY;\n\n/** The node's single open port: runtime MCP endpoint + node API. */\nexport const NEGOTIUM_PORT = parseInt(process.env.NEGOTIUM_PORT || \"7777\", 10);\nexport const hostname = process.env.HOSTNAME || \"127.0.0.1\";\n\n// Persistent state (survives restarts, long-lived)\nexport const DATA_DIR = resolveLocalStateDir(\"NEGOTIUM_DATA_DIR\", \"data\");\nexport const LOG_DIR = resolveLocalStateDir(\"NEGOTIUM_LOG_DIR\", \"logs\");\nexport const UPLOADS_DIR = resolve(DATA_DIR, \"uploads\");\nexport const VAULT_DIR = resolve(DATA_DIR, \"vault\");\n// SESSIONS_DB_PATH env override lets tests point the DB singleton at a temp file.\nexport const SESSIONS_DB = process.env.SESSIONS_DB_PATH\n ? resolve(process.env.SESSIONS_DB_PATH)\n : resolve(DATA_DIR, \"sessions.db\");\nexport const DEBUG_FILE = resolve(DATA_DIR, \"debug-users.json\");\nexport const USERS_LOG_DIR = resolve(DATA_DIR, \"users\");\n\n// Runtime IPC queues (transient, safe to clear on restart)\n/** @deprecated Use the runtime layout name; NEGOTIUM_RUN_DIR remains a compatibility override. */\nexport const RUN_DIR = resolveLocalStateDir(\"NEGOTIUM_RUN_DIR\", \"runtime\");\nexport const RUNTIME_DIR = RUN_DIR;\nexport const PROGRESS_DIR = resolve(RUN_DIR, \"progress\");\nexport const DM_CMD_DIR = resolve(RUN_DIR, \"dm-commands\");\nexport const DM_RESP_DIR = resolve(RUN_DIR, \"dm-responses\");\nexport const SESSION_INBOX_DIR = resolve(RUN_DIR, \"session-inbox\");\nexport const SESSION_ASKS_DIR = resolve(RUN_DIR, \"session-asks\");\n/**\n * Passed to `bash-rs` as `BASHRS_SPILL_ROOT`. Each job gets a subdirectory\n * here (`{bash_id}/meta.json`, `result.json`, `stdout.log`, `stderr.log`) —\n * see bash-rs-mcp's `journal.rs`. `runtime/bashrs-completions.ts` watches\n * this directory and turns `result.json` into a session-inbox `tell`. The\n * retired TypeScript server used to write one directly instead.\n */\nexport const BASHRS_SPILL_ROOT = resolve(RUN_DIR, \"bashrs\");\nexport const PLAYWRIGHT_BASE_PORT = parsePortEnv(process.env.PLAYWRIGHT_BASE_PORT, 9100);\nexport const PLAYWRIGHT_MAX_PORT = parsePortEnv(process.env.PLAYWRIGHT_MAX_PORT, 9499);\nexport const PLAYWRIGHT_PORTS_DIR = resolve(RUN_DIR, \"playwright-ports\");\nmkdirSync(STATE_DIR, { recursive: true });\nmkdirSync(DATA_DIR, { recursive: true });\nmkdirSync(UPLOADS_DIR, { recursive: true });\nmkdirSync(VAULT_DIR, { recursive: true, mode: 0o700 });\nmkdirSync(LOG_DIR, { recursive: true });\nmkdirSync(PROGRESS_DIR, { recursive: true });\nmkdirSync(DM_CMD_DIR, { recursive: true });\nmkdirSync(DM_RESP_DIR, { recursive: true });\nmkdirSync(SESSION_INBOX_DIR, { recursive: true });\nmkdirSync(SESSION_ASKS_DIR, { recursive: true });\nmkdirSync(PLAYWRIGHT_PORTS_DIR, { recursive: true });\nmkdirSync(WORKSPACE_DIR, { recursive: true });\nmkdirSync(TOPIC_WORKSPACE_DIR, { recursive: true });\nmkdirSync(SHARED_WIKI_DIR, { recursive: true });\nmkdirSync(CRON_WORKSPACE_DIR, { recursive: true });\nmkdirSync(DM_WORKSPACE_DIR, { recursive: true });\nmkdirSync(SESSION_WORKSPACE_DIR, { recursive: true });\nmkdirSync(BROWSER_DIR, { recursive: true });\nmkdirSync(BROWSER_PROFILES_DIR, { recursive: true });\nmkdirSync(BINARIES_DIR, { recursive: true });\nmkdirSync(SECRETS_DIR, { recursive: true, mode: 0o700 });\n\n/** Stale threshold for active-query state files (crash recovery) */\nexport const ACTIVE_QUERY_STALE_MS = 10 * 60 * 1000; // 10 minutes\n\nexport const AGENTS_PROMPTS_DIR = resolve(PROJECT_ROOT, \"src/prompts/agents\");\nexport const RESOURCES_DIR = resolve(PROJECT_ROOT, \"src/resources\");\n\n/** Returns process.env without CLAUDECODE, to prevent nested claude-code detection in subprocesses. */\nexport function getCleanEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n delete env.CLAUDECODE;\n return env;\n}\n\nexport const FILE_EXTENSIONS_REGEX =\n /(?:\\/[^\\s\"'<>|*?[\\]]+\\.(?:png|jpg|jpeg|gif|webp|svg|pdf|csv|xlsx|xls|json|txt|md|html|zip|py|js|ts|tsx|jsx|css|xml|yaml|yml|docx|pptx))/gi;\n\nexport const FILE_TAG_REGEX = /\\[FILE:(\\/[^\\]]+)\\]/gi;\n\n// Canonical Claude model IDs — update here when Anthropic releases new versions\nexport const MODEL_SONNET = \"claude-sonnet-5\";\nexport const MODEL_OPUS = \"claude-opus-5\";\nexport const MODEL_HAIKU = \"claude-haiku-4-5-20251001\";\nexport const MODEL_FABLE = \"claude-fable-5\"; // Mythos-class, announced 2026-06-09\n\n// DeepSeek V4 (released 2026-04-24). API is OpenAI-compatible at\n// https://api.deepseek.com/v1/chat/completions; thinking mode is enabled via\n// `extra_body.thinking.type` + `reasoning_effort`. Legacy `deepseek-chat` /\n// `deepseek-reasoner` are deprecated 2026-07-24.\nexport const MODEL_DEEPSEEK_V4_PRO = \"deepseek-v4-pro\";\nexport const MODEL_DEEPSEEK_V4_FLASH = \"deepseek-v4-flash\";\n\n// Agent + model defaults split by session role. FALLBACK_* is the shared base;\n// SESSION_* overrides topic + ephemeral; GATEWAY_* overrides dm + manager.\n// DEFAULT_* is accepted as a legacy alias during the env migration window.\nexport const FALLBACK_AGENT: AgentKind = resolveAgentEnv(\n \"FALLBACK_AGENT\",\n \"maestro\",\n \"DEFAULT_AGENT\",\n);\nexport const SESSION_AGENT: AgentKind = resolveAgentEnv(\"SESSION_AGENT\", FALLBACK_AGENT);\nexport const GATEWAY_AGENT: AgentKind = resolveAgentEnv(\"GATEWAY_AGENT\", FALLBACK_AGENT);\n\nexport const FALLBACK_MODEL = envText(\"FALLBACK_MODEL\") ?? envText(\"DEFAULT_MODEL\");\n\nfunction resolveModelEnv(envKey: string, agentConst: AgentKind): string | undefined {\n return envText(envKey) ?? (agentConst === FALLBACK_AGENT ? FALLBACK_MODEL : undefined);\n}\n\nexport const SESSION_MODEL = resolveModelEnv(\"SESSION_MODEL\", SESSION_AGENT);\nexport const GATEWAY_MODEL = resolveModelEnv(\"GATEWAY_MODEL\", GATEWAY_AGENT);\n\n/** Resolve the effective display/default model for a topic (session context).\n * Applies the session model override only when that role owns the agent;\n * otherwise each registry's native default stays authoritative. */\nexport function resolveDefaultModel(agent: string, registryDefaultModel: string): string {\n return agent === SESSION_AGENT && SESSION_MODEL ? SESSION_MODEL : registryDefaultModel;\n}\n\n// ── External tool binaries + media pipeline env ───────────────────\n// (src/media/* 에서 사용. 미설정 시 fallback 의미는 기존 그대로:\n// FFMPEG_BIN은 text-extractor에서 필수(undefined면 spawn 시점 실패),\n// video.ts에서는 PATH의 ffmpeg/ffprobe로 fallback.)\nexport const FFMPEG_BIN = envText(\"FFMPEG_BIN\");\nexport const FFPROBE_BIN = envText(\"FFPROBE_BIN\");\nexport const PYTHON_BIN = envText(\"PYTHON_BIN\") ?? \"python3\";\nexport const FASTER_WHISPER_WRAPPER =\n envText(\"FASTER_WHISPER_WRAPPER\") ?? resolve(PROJECT_ROOT, \"scripts/faster-whisper-wrapper.py\");\nexport const WHISPER_MODEL = envText(\"WHISPER_MODEL_FILE\") ?? \"turbo\";\nexport const TESSERACT_BIN = envText(\"TESSERACT_BIN\") ?? \"tesseract\";\nexport const PDFTOTEXT_BIN = envText(\"PDFTOTEXT_BIN\") ?? \"pdftotext\";\n\n// Max tell_session relay depth from origin user. ask_session forks reset to\n// depth=0, so this only caps tell_session chains. Override via MAX_TELL_DEPTH\n// (positive int); defaults to 20 when unset or invalid.\nconst _envMaxTellDepth = Number.parseInt(process.env.MAX_TELL_DEPTH ?? \"\", 10);\nexport const MAX_TELL_DEPTH =\n Number.isInteger(_envMaxTellDepth) && _envMaxTellDepth > 0 ? _envMaxTellDepth : 20;\n\n/** Codex CLI auth file. 호출 시점에 env를 읽는다 — 테스트가 런타임에\n * NEGOTIUM_CODEX_AUTH_FILE을 바꾸므로 모듈 로드 상수로 만들면 안 된다. */\nexport function codexAuthFilePath(): string {\n return (\n process.env.NEGOTIUM_CODEX_AUTH_FILE ||\n join(process.env.CODEX_HOME || join(homedir(), \".codex\"), \"auth.json\")\n );\n}\n\n// System defaults moved to per-agent registries\n// (`src/agents/{claude,codex}-registry.ts`). Read via\n// `getRegistry(agent).defaultModel` / `.defaultEffort`.\n\n// MCP server builders -> src/platform/mcp-config.ts\n",
7
+ "import { execFileSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n accessSync,\n chmodSync,\n constants,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseRuntimePort, readEnvText, safeRuntimePathSegment } from \"#platform/config-helpers\";\nimport { logger } from \"#platform/logger\";\nimport { type AgentKind, isAgentKind } from \"#types\";\n\nexport function envText(envKey: string): string | undefined {\n return readEnvText(process.env, envKey);\n}\n\nfunction resolveAgentEnv(envKey: string, fallback: AgentKind, legacyEnvKey?: string): AgentKind {\n const value = envText(envKey) ?? (legacyEnvKey ? envText(legacyEnvKey) : undefined);\n return isAgentKind(value) ? value : fallback;\n}\n\nconst HOME = homedir();\n\n// new URL(\"../..\", import.meta.url) causes webpack to treat \"../..\" as a module import.\n// Split into fileURLToPath → dirname → resolve to avoid that.\nfunction resolveProjectRoot(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const packagedRuntime = resolve(moduleDir, \"runtime\");\n if (existsSync(resolve(packagedRuntime, \"src\"))) return packagedRuntime;\n return resolve(moduleDir, \"../..\");\n}\n\nexport const PROJECT_ROOT = resolveProjectRoot();\n\n/** Resolve a dependency executable from either a package-local or hoisted install. */\nfunction resolveDependencyBin(name: string): string {\n let dir = PROJECT_ROOT;\n while (true) {\n const candidate = resolve(dir, \"node_modules\", \".bin\", name);\n if (existsSync(candidate)) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return candidate;\n dir = parent;\n }\n}\n\n// Each machine is one negotium node; all node state lives in one dotdir.\n// NEGOTIUM_STATE_DIR overrides (useful for tests and multi-node-on-one-box).\nconst STATE_DIR_ENV = envText(\"NEGOTIUM_STATE_DIR\");\nexport const STATE_DIR = STATE_DIR_ENV ? resolve(STATE_DIR_ENV) : resolve(HOME, \".negotium\");\n\nfunction resolveLocalStateDir(envKey: string, stateName: string): string {\n const envValue = envText(envKey);\n if (envValue) return resolve(envValue);\n return resolve(STATE_DIR, stateName);\n}\n\nfunction parsePortEnv(envValue: string | undefined, fallback: number): number {\n return parseRuntimePort(envValue, fallback);\n}\n\nexport const WORKSPACE_DIR = resolveLocalStateDir(\"NEGOTIUM_WORKSPACE_DIR\", \"workspace\");\nexport const TOPIC_WORKSPACE_DIR = resolve(WORKSPACE_DIR, \"topics\");\nexport const SHARED_WIKI_DIR = resolve(WORKSPACE_DIR, \"wiki\");\nexport const CRON_WORKSPACE_DIR = resolve(WORKSPACE_DIR, \"cron\");\nexport const BROWSER_DIR = resolveLocalStateDir(\"NEGOTIUM_BROWSER_DIR\", \"browser\");\nexport const BROWSER_PROFILES_DIR = resolve(BROWSER_DIR, \"profiles\");\nexport const BINARIES_DIR = resolve(STATE_DIR, \"binaries\");\nexport const SECRETS_DIR = resolve(STATE_DIR, \"secrets\");\n// Legacy names remain public, but their durable contents now live under data.\nexport const DM_WORKSPACE_DIR = resolve(STATE_DIR, \"data\", \"dm\");\nexport const SESSION_WORKSPACE_DIR = resolve(STATE_DIR, \"data\", \"sessions\");\n// The Claude Agent SDK ships a platform-matched Claude Code binary. Keep that\n// SDK/CLI pair together by default; only use an external executable when an\n// operator explicitly opts in. This avoids silently pairing an older SDK with\n// a newer globally installed Claude Code release.\nconst CLAUDE_EXECUTABLE_ENV = envText(\"NEGOTIUM_CLAUDE_EXECUTABLE\");\nexport const CLAUDE_EXECUTABLE = CLAUDE_EXECUTABLE_ENV ? resolve(CLAUDE_EXECUTABLE_ENV) : undefined;\n\n// Fallback output language for model-generated prose (topic/channel/manager\n// replies and the archiver's summaries, briefs, articles, completion reply).\n// Defaults to English; set `NEGOTIUM_LANG` to the user's mother tongue (e.g.\n// `Korean`, `ko`). The assistant still mirrors whatever language the user\n// writes in; `NEGOTIUM_MEMORY_LANG` can narrow just the archiver. Fixed system\n// chrome / degraded-path strings emitted by code stay English (can't translate\n// an arbitrary value at runtime).\nexport const DEFAULT_OUTPUT_LANGUAGE = \"English\";\n\nexport function resolveOutputLanguage(): string {\n const raw = envText(\"NEGOTIUM_LANG\")?.trim();\n return raw && raw.length > 0 ? raw : DEFAULT_OUTPUT_LANGUAGE;\n}\n\n/** Browser.rs release tested with this Negotium version. */\nexport const BROWSER_RS_VERSION = \"v0.1.19\";\n/** Require the authenticated listener and the current Browser.rs tool contract. */\nexport const BROWSER_RS_MIN_SECURE_VERSION = \"0.1.15\";\n\nfunction versionAtLeast(actualVersion: string, minimumVersion: string): boolean {\n const actual = actualVersion.split(\".\").map(Number);\n const minimum = minimumVersion.split(\".\").map(Number);\n if (actual.some(Number.isNaN) || minimum.some(Number.isNaN)) return false;\n for (let index = 0; index < minimum.length; index += 1) {\n if ((actual[index] ?? 0) > (minimum[index] ?? 0)) return true;\n if ((actual[index] ?? 0) < (minimum[index] ?? 0)) return false;\n }\n return true;\n}\n\n/**\n * Ceiling for the `--version` probe, not a latency expectation.\n *\n * The probe exists so a wedged binary cannot hang startup; a healthy one\n * answers in milliseconds. At 2s it also failed whenever the machine was merely\n * busy — process startup under a loaded test suite regularly exceeds that —\n * which turned a correctness check into a load measurement and made\n * `resolveBrowserRsBin` intermittently report a perfectly good binary as\n * unusable. Generous enough that only a genuinely stuck process trips it.\n */\nconst BROWSER_RS_VERSION_PROBE_TIMEOUT_MS = 15_000;\n\nfunction browserRsMeetsMinimumVersion(candidate: string): boolean {\n try {\n const output = execFileSync(candidate, [\"--version\"], {\n encoding: \"utf8\",\n timeout: BROWSER_RS_VERSION_PROBE_TIMEOUT_MS,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const match = output.match(/^browser-rs (\\d+)\\.(\\d+)\\.(\\d+)$/);\n if (!match) return false;\n return versionAtLeast(match.slice(1).join(\".\"), BROWSER_RS_MIN_SECURE_VERSION);\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve the preferred Browser.rs engine without consulting PATH. The\n * versioned private location keeps different Negotium releases reproducible\n * and avoids changing a user's global browser-rs installation.\n */\nexport function resolveBrowserRsBin(envValue?: string): string | undefined {\n const override = envValue?.trim();\n if (\n !override &&\n !versionAtLeast(BROWSER_RS_VERSION.replace(/^v/, \"\"), BROWSER_RS_MIN_SECURE_VERSION)\n ) {\n return undefined;\n }\n const candidate = override\n ? resolve(override)\n : resolve(BINARIES_DIR, \"browser-rs\", BROWSER_RS_VERSION, \"browser-rs\");\n try {\n accessSync(candidate, constants.X_OK);\n return browserRsMeetsMinimumVersion(candidate) ? candidate : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Backend that stores documents published by `publish_html` and serves them\n * at `<base>/snippets/<id>`. Unset means the deployment has nowhere to\n * publish, and the publish tools are omitted from the catalog rather than\n * offering a link that cannot be minted.\n */\nexport const SNIPPETS_API_URL = (\n envText(\"NEGOTIUM_SNIPPETS_API_URL\") ??\n envText(\"SNIPPETS_API_URL\") ??\n \"\"\n).replace(/\\/+$/, \"\");\n\nexport const BROWSER_RS_BIN = resolveBrowserRsBin(envText(\"NEGOTIUM_BROWSER_RS_BIN\"));\n\n/** bash-rs release tested with this Negotium version — see apps/negotium/install-bash-rs.mjs. */\nexport const BASH_RS_VERSION = \"v0.1.5\";\n\n/**\n * Resolve the bash-rs binary the same way `resolveBrowserRsBin` resolves\n * Browser.rs: a versioned private location, no PATH lookup, `undefined`\n * (rather than throwing) when it's missing. There is no substitute: the manager\n * throws when a turn tries to prepare background-bash without a binary (see\n * `background-bash/manager.ts`), the turn runner catches that and continues\n * with a reminder that the tools are gone, so background-bash is simply\n * unavailable on a platform without a prebuilt binary.\n */\nexport function resolveBashRsBin(envValue?: string): string | undefined {\n const override = envValue?.trim();\n const candidate = override\n ? resolve(override)\n : resolve(BINARIES_DIR, \"bash-rs\", BASH_RS_VERSION, \"bash-rs\");\n try {\n accessSync(candidate, constants.X_OK);\n return candidate;\n } catch {\n return undefined;\n }\n}\n\nexport const BASH_RS_BIN = resolveBashRsBin(envText(\"NEGOTIUM_BASH_RS_BIN\"));\n\n// Managed Browser.rs terminates MCP transports and security policy itself.\nexport function resolveBrowserMcpBin(envValue?: string): string {\n const override = envValue?.trim();\n if (override) return resolve(override);\n return BROWSER_RS_BIN ?? resolve(BINARIES_DIR, \"browser-rs\", BROWSER_RS_VERSION, \"browser-rs\");\n}\n\nexport const PLAYWRIGHT_MCP_BIN = resolveBrowserMcpBin(envText(\"NEGOTIUM_BROWSER_MCP_BIN\"));\n\n// --- Browser egress proxy ---\n//\n// On a datacenter host (AWS) the browser's egress IP is a known cloud range,\n// so anti-bot services (Cloudflare, DataDome, reCAPTCHA) challenge or block it\n// far more than a residential IP would. Routing the automation browser through\n// a residential/ISP proxy moves the egress IP out of the datacenter range.\n//\n// Operators set BROWSER_PROXY_URL, e.g. http://user:pass@proxy.host:8080 or\n// socks5://proxy.host:1080. Credentials in the URL are split out because\n// Playwright takes them as separate fields. BROWSER_PROXY_BYPASS is an optional\n// comma-separated no-proxy list (e.g. \"localhost,127.0.0.1,*.internal\").\n//\n// NOTE: Chromium does not support authentication for SOCKS proxies — put\n// credentials only on http/https proxy URLs.\nexport type BrowserProxyConfig = {\n server: string;\n username?: string;\n password?: string;\n bypass?: string;\n};\n\nexport function resolveBrowserProxy(): BrowserProxyConfig | null {\n const raw = envText(\"BROWSER_PROXY_URL\");\n if (!raw) return null;\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n logger.warn({ raw }, \"Ignoring malformed BROWSER_PROXY_URL\");\n return null;\n }\n // Playwright wants the server without embedded credentials.\n const server = `${url.protocol}//${url.host}`;\n const proxy: BrowserProxyConfig = { server };\n if (url.username) proxy.username = decodeURIComponent(url.username);\n if (url.password) proxy.password = decodeURIComponent(url.password);\n const bypass = envText(\"BROWSER_PROXY_BYPASS\");\n if (bypass) proxy.bypass = bypass;\n return proxy;\n}\n\n// --- Node/tsx runtime for the `codex` agent's MCP servers ---\n//\n// codex 0.135's rmcp stdio MCP client cannot reliably complete the initialize\n// handshake with servers spawned via `bun` (the JSON-RPC initialize is\n// dropped/raced and no tools ever reach the model). Pure-node servers connect\n// reliably, so codex turns launch the SAME .ts servers via node + tsx instead\n// of `bun run`. claude/maestro keep using `bun run` (fast, native, unaffected).\n//\n// tsx transpiles .ts on the fly and resolves the `@/*` tsconfig path aliases,\n// but only when it can find the tsconfig — and MCP servers run with cwd set to\n// the user's workspace dir, not PROJECT_ROOT — so we pass TSX_TSCONFIG_PATH\n// explicitly via env. Requires package.json `\"type\": \"module\"` so the servers'\n// top-level `await` loads as ESM under node.\nexport const TSX_BIN = resolveDependencyBin(\"tsx\");\n/** In-process tsx loader used by Node MCP entrypoints (avoids the tsx CLI child process). */\nexport const TSX_LOADER = createRequire(import.meta.url).resolve(\"tsx\");\nexport const TSCONFIG_PATH = resolve(PROJECT_ROOT, \"tsconfig.json\");\n\nexport const SESSION_COMM_SERVER = resolve(PROJECT_ROOT, \"src/mcp/session-comm/server.ts\");\n\nexport const TASK_SERVER = resolve(PROJECT_ROOT, \"src/mcp/task-server.ts\");\nexport const BROWSER_MCP_SSE_PROXY_SERVER = resolve(\n PROJECT_ROOT,\n \"src/mcp/browser-sse-proxy-server.ts\",\n);\nexport const CANONICAL_MCP_PROXY_SERVER = resolve(\n PROJECT_ROOT,\n \"src/mcp/canonical-proxy-server.ts\",\n);\n\nexport const WIKI_SERVER = resolve(PROJECT_ROOT, \"src/mcp/wiki-server.ts\");\n\nexport const TOKEN_STATS_SERVER = resolve(PROJECT_ROOT, \"src/mcp/token-stats-server.ts\");\n\nexport const COMPACTION_LOG_SERVER = resolve(PROJECT_ROOT, \"src/mcp/compaction-log-server.ts\");\n\nexport const SYSTEM_HEALTH_SERVER = resolve(PROJECT_ROOT, \"src/mcp/system-health-server.ts\");\n\nexport const AGENT_HEALTH_SERVER = resolve(PROJECT_ROOT, \"src/mcp/agent-health-server.ts\");\n\nexport const VAULT_SERVER = resolve(PROJECT_ROOT, \"src/mcp/vault-server.ts\");\n\nexport const BG_BASH_BASE_PORT = parsePortEnv(process.env.BG_BASH_BASE_PORT, 9700);\nexport const BG_BASH_MAX_PORT = parsePortEnv(process.env.BG_BASH_MAX_PORT, 9799);\n\nfunction safeWorkspaceSegment(value: string, fallback: string): string {\n return safeRuntimePathSegment(value, fallback);\n}\n\n/** Resolve the shared filesystem workspace for an API topic. */\nexport function resolveTopicWorkspaceDir(topicId: string): string {\n return join(TOPIC_WORKSPACE_DIR, safeWorkspaceSegment(topicId, \"topic\"));\n}\n\nexport function isProductionEnv(): boolean {\n return process.env.NODE_ENV === \"production\";\n}\n\nfunction loadOrCreateLocalSecret(\n envKey: string,\n filename: string,\n options: { persistEnvValue?: boolean } = {},\n): string {\n const envValue = envText(envKey);\n const secretFile = resolve(SECRETS_DIR, filename);\n mkdirSync(dirname(secretFile), { recursive: true });\n if (envValue) {\n if (options.persistEnvValue) {\n writeFileSync(secretFile, `${envValue}\\n`, { mode: 0o600 });\n chmodSync(secretFile, 0o600);\n }\n return envValue;\n }\n\n if (existsSync(secretFile)) {\n const stored = readFileSync(secretFile, \"utf-8\").trim();\n if (stored) {\n chmodSync(secretFile, 0o600);\n return stored;\n }\n }\n\n const secret = randomBytes(32).toString(\"base64url\");\n try {\n writeFileSync(secretFile, `${secret}\\n`, { mode: 0o600, flag: \"wx\" });\n return secret;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const stored = readFileSync(secretFile, \"utf-8\").trim();\n if (!stored) throw new Error(`Secret file exists but is empty: ${secretFile}`);\n chmodSync(secretFile, 0o600);\n return stored;\n }\n}\n\nexport const RUNTIME_MCP_SECRET = loadOrCreateLocalSecret(\n \"RUNTIME_MCP_SECRET\",\n \"runtime-mcp-secret\",\n);\n/** Local bearer token for the loopback node-control API. */\nexport const NODE_CONTROL_TOKEN = loadOrCreateLocalSecret(\n \"NEGOTIUM_CONTROL_TOKEN\",\n \"node-control-token\",\n);\nexport const VAULT_MASTER_KEY = loadOrCreateLocalSecret(\n \"NEGOTIUM_VAULT_MASTER_KEY\",\n \"vault-master-key\",\n { persistEnvValue: true },\n);\n// Agent/tool subprocesses inherit process.env. Keep the loaded key in this\n// process only so `env`/`ps` inside an agent workspace cannot reveal it.\ndelete process.env.NEGOTIUM_VAULT_MASTER_KEY;\n\n/** The node's single open port: runtime MCP endpoint + node API. */\nexport const NEGOTIUM_PORT = parseInt(process.env.NEGOTIUM_PORT || \"7777\", 10);\nexport const hostname = process.env.HOSTNAME || \"127.0.0.1\";\n\n// Persistent state (survives restarts, long-lived)\nexport const DATA_DIR = resolveLocalStateDir(\"NEGOTIUM_DATA_DIR\", \"data\");\nexport const LOG_DIR = resolveLocalStateDir(\"NEGOTIUM_LOG_DIR\", \"logs\");\nexport const UPLOADS_DIR = resolve(DATA_DIR, \"uploads\");\nexport const VAULT_DIR = resolve(DATA_DIR, \"vault\");\n// SESSIONS_DB_PATH env override lets tests point the DB singleton at a temp file.\nexport const SESSIONS_DB = process.env.SESSIONS_DB_PATH\n ? resolve(process.env.SESSIONS_DB_PATH)\n : resolve(DATA_DIR, \"sessions.db\");\nexport const DEBUG_FILE = resolve(DATA_DIR, \"debug-users.json\");\nexport const USERS_LOG_DIR = resolve(DATA_DIR, \"users\");\n\n// Runtime IPC queues (transient, safe to clear on restart)\n/** @deprecated Use the runtime layout name; NEGOTIUM_RUN_DIR remains a compatibility override. */\nexport const RUN_DIR = resolveLocalStateDir(\"NEGOTIUM_RUN_DIR\", \"runtime\");\nexport const RUNTIME_DIR = RUN_DIR;\nexport const PROGRESS_DIR = resolve(RUN_DIR, \"progress\");\nexport const DM_CMD_DIR = resolve(RUN_DIR, \"dm-commands\");\nexport const DM_RESP_DIR = resolve(RUN_DIR, \"dm-responses\");\nexport const SESSION_INBOX_DIR = resolve(RUN_DIR, \"session-inbox\");\nexport const SESSION_ASKS_DIR = resolve(RUN_DIR, \"session-asks\");\n/**\n * Passed to `bash-rs` as `BASHRS_SPILL_ROOT`. Each job gets a subdirectory\n * here (`{bash_id}/meta.json`, `result.json`, `stdout.log`, `stderr.log`) —\n * see bash-rs-mcp's `journal.rs`. `runtime/bashrs-completions.ts` watches\n * this directory and turns `result.json` into a session-inbox `tell`. The\n * retired TypeScript server used to write one directly instead.\n */\nexport const BASHRS_SPILL_ROOT = resolve(RUN_DIR, \"bashrs\");\nexport const PLAYWRIGHT_BASE_PORT = parsePortEnv(process.env.PLAYWRIGHT_BASE_PORT, 9100);\nexport const PLAYWRIGHT_MAX_PORT = parsePortEnv(process.env.PLAYWRIGHT_MAX_PORT, 9499);\nexport const PLAYWRIGHT_PORTS_DIR = resolve(RUN_DIR, \"playwright-ports\");\nmkdirSync(STATE_DIR, { recursive: true });\nmkdirSync(DATA_DIR, { recursive: true });\nmkdirSync(UPLOADS_DIR, { recursive: true });\nmkdirSync(VAULT_DIR, { recursive: true, mode: 0o700 });\nmkdirSync(LOG_DIR, { recursive: true });\nmkdirSync(PROGRESS_DIR, { recursive: true });\nmkdirSync(DM_CMD_DIR, { recursive: true });\nmkdirSync(DM_RESP_DIR, { recursive: true });\nmkdirSync(SESSION_INBOX_DIR, { recursive: true });\nmkdirSync(SESSION_ASKS_DIR, { recursive: true });\nmkdirSync(PLAYWRIGHT_PORTS_DIR, { recursive: true });\nmkdirSync(WORKSPACE_DIR, { recursive: true });\nmkdirSync(TOPIC_WORKSPACE_DIR, { recursive: true });\nmkdirSync(SHARED_WIKI_DIR, { recursive: true });\nmkdirSync(CRON_WORKSPACE_DIR, { recursive: true });\nmkdirSync(DM_WORKSPACE_DIR, { recursive: true });\nmkdirSync(SESSION_WORKSPACE_DIR, { recursive: true });\nmkdirSync(BROWSER_DIR, { recursive: true });\nmkdirSync(BROWSER_PROFILES_DIR, { recursive: true });\nmkdirSync(BINARIES_DIR, { recursive: true });\nmkdirSync(SECRETS_DIR, { recursive: true, mode: 0o700 });\n\n/** Stale threshold for active-query state files (crash recovery) */\nexport const ACTIVE_QUERY_STALE_MS = 10 * 60 * 1000; // 10 minutes\n\nexport const AGENTS_PROMPTS_DIR = resolve(PROJECT_ROOT, \"src/prompts/agents\");\nexport const RESOURCES_DIR = resolve(PROJECT_ROOT, \"src/resources\");\n\n/** Returns process.env without CLAUDECODE, to prevent nested claude-code detection in subprocesses. */\nexport function getCleanEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n delete env.CLAUDECODE;\n return env;\n}\n\nexport const FILE_EXTENSIONS_REGEX =\n /(?:\\/[^\\s\"'<>|*?[\\]]+\\.(?:png|jpg|jpeg|gif|webp|svg|pdf|csv|xlsx|xls|json|txt|md|html|zip|py|js|ts|tsx|jsx|css|xml|yaml|yml|docx|pptx))/gi;\n\nexport const FILE_TAG_REGEX = /\\[FILE:(\\/[^\\]]+)\\]/gi;\n\n// Canonical Claude model IDs — update here when Anthropic releases new versions\nexport const MODEL_SONNET = \"claude-sonnet-5\";\nexport const MODEL_OPUS = \"claude-opus-5\";\nexport const MODEL_HAIKU = \"claude-haiku-4-5-20251001\";\nexport const MODEL_FABLE = \"claude-fable-5\"; // Mythos-class, announced 2026-06-09\n\n// DeepSeek V4 (released 2026-04-24). API is OpenAI-compatible at\n// https://api.deepseek.com/v1/chat/completions; thinking mode is enabled via\n// `extra_body.thinking.type` + `reasoning_effort`. Legacy `deepseek-chat` /\n// `deepseek-reasoner` are deprecated 2026-07-24.\nexport const MODEL_DEEPSEEK_V4_PRO = \"deepseek-v4-pro\";\nexport const MODEL_DEEPSEEK_V4_FLASH = \"deepseek-v4-flash\";\n\n// Agent + model defaults split by session role. FALLBACK_* is the shared base;\n// SESSION_* overrides topic + ephemeral; GATEWAY_* overrides dm + manager.\n// DEFAULT_* is accepted as a legacy alias during the env migration window.\nexport const FALLBACK_AGENT: AgentKind = resolveAgentEnv(\n \"FALLBACK_AGENT\",\n \"maestro\",\n \"DEFAULT_AGENT\",\n);\nexport const SESSION_AGENT: AgentKind = resolveAgentEnv(\"SESSION_AGENT\", FALLBACK_AGENT);\nexport const GATEWAY_AGENT: AgentKind = resolveAgentEnv(\"GATEWAY_AGENT\", FALLBACK_AGENT);\n\nexport const FALLBACK_MODEL = envText(\"FALLBACK_MODEL\") ?? envText(\"DEFAULT_MODEL\");\n\nfunction resolveModelEnv(envKey: string, agentConst: AgentKind): string | undefined {\n return envText(envKey) ?? (agentConst === FALLBACK_AGENT ? FALLBACK_MODEL : undefined);\n}\n\nexport const SESSION_MODEL = resolveModelEnv(\"SESSION_MODEL\", SESSION_AGENT);\nexport const GATEWAY_MODEL = resolveModelEnv(\"GATEWAY_MODEL\", GATEWAY_AGENT);\n\n/** Resolve the effective display/default model for a topic (session context).\n * Applies the session model override only when that role owns the agent;\n * otherwise each registry's native default stays authoritative. */\nexport function resolveDefaultModel(agent: string, registryDefaultModel: string): string {\n return agent === SESSION_AGENT && SESSION_MODEL ? SESSION_MODEL : registryDefaultModel;\n}\n\n// ── External tool binaries + media pipeline env ───────────────────\n// (src/media/* 에서 사용. 미설정 시 fallback 의미는 기존 그대로:\n// FFMPEG_BIN은 text-extractor에서 필수(undefined면 spawn 시점 실패),\n// video.ts에서는 PATH의 ffmpeg/ffprobe로 fallback.)\nexport const FFMPEG_BIN = envText(\"FFMPEG_BIN\");\nexport const FFPROBE_BIN = envText(\"FFPROBE_BIN\");\nexport const PYTHON_BIN = envText(\"PYTHON_BIN\") ?? \"python3\";\nexport const FASTER_WHISPER_WRAPPER =\n envText(\"FASTER_WHISPER_WRAPPER\") ?? resolve(PROJECT_ROOT, \"scripts/faster-whisper-wrapper.py\");\nexport const WHISPER_MODEL = envText(\"WHISPER_MODEL_FILE\") ?? \"turbo\";\nexport const TESSERACT_BIN = envText(\"TESSERACT_BIN\") ?? \"tesseract\";\nexport const PDFTOTEXT_BIN = envText(\"PDFTOTEXT_BIN\") ?? \"pdftotext\";\n\n// Max tell_session relay depth from origin user. ask_session forks reset to\n// depth=0, so this only caps tell_session chains. Override via MAX_TELL_DEPTH\n// (positive int); defaults to 20 when unset or invalid.\nconst _envMaxTellDepth = Number.parseInt(process.env.MAX_TELL_DEPTH ?? \"\", 10);\nexport const MAX_TELL_DEPTH =\n Number.isInteger(_envMaxTellDepth) && _envMaxTellDepth > 0 ? _envMaxTellDepth : 20;\n\n/** Codex CLI auth file. 호출 시점에 env를 읽는다 — 테스트가 런타임에\n * NEGOTIUM_CODEX_AUTH_FILE을 바꾸므로 모듈 로드 상수로 만들면 안 된다. */\nexport function codexAuthFilePath(): string {\n return (\n process.env.NEGOTIUM_CODEX_AUTH_FILE ||\n join(process.env.CODEX_HOME || join(homedir(), \".codex\"), \"auth.json\")\n );\n}\n\n// System defaults moved to per-agent registries\n// (`src/agents/{claude,codex}-registry.ts`). Read via\n// `getRegistry(agent).defaultModel` / `.defaultEffort`.\n\n// MCP server builders -> src/platform/mcp-config.ts\n",
8
8
  "import { resolve } from \"node:path\";\n\nexport type RuntimeEnvironment = Readonly<Record<string, string | undefined>>;\n\nexport function readEnvText(env: RuntimeEnvironment, key: string): string | undefined {\n const value = env[key]?.trim();\n return value || undefined;\n}\n\nexport function parseRuntimePort(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const port = Number.parseInt(value, 10);\n return Number.isInteger(port) && port > 0 && port <= 65_535 ? port : fallback;\n}\n\nexport function resolveRuntimeStateDir(options: {\n env: RuntimeEnvironment;\n envKey: string;\n fallbackRoot: string;\n fallbackName: string;\n}): string {\n const configured = readEnvText(options.env, options.envKey);\n return configured ? resolve(configured) : resolve(options.fallbackRoot, options.fallbackName);\n}\n\nexport function safeRuntimePathSegment(value: string, fallback: string, maxLength = 160): string {\n const cleaned = value\n .trim()\n .replace(/[^A-Za-z0-9._-]/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, maxLength);\n return cleaned || fallback;\n}\n",
9
9
  "import pino from \"pino\";\n\nexport interface StdioLoggerOptions {\n level?: string;\n development?: boolean;\n}\n\n/**\n * Always write logs to stderr (fd 2), never stdout.\n *\n * MCP servers under `src/mcp/**` run as stdio subprocesses where stdout is the\n * JSON-RPC transport channel. A single log line on stdout corrupts the next\n * message and the MCP client closes the transport (\"Transport closed\"). The\n * main bot process is also fine with stderr — pm2 captures both streams.\n *\n * In dev mode pino spawns a `pino-pretty` worker that owns its own sink, so we\n * pass `destination: 2` through transport.options. In prod (no transport) the\n * second arg to `pino()` sets the destination directly.\n */\nexport function createStdioLogger(options: StdioLoggerOptions = {}) {\n const development = options.development ?? process.env.NODE_ENV === \"development\";\n return pino(\n {\n level: options.level ?? process.env.LOG_LEVEL ?? \"info\",\n transport: development\n ? {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"SYS:yyyy-mm-dd HH:MM:ss\",\n destination: 2,\n },\n }\n : undefined,\n },\n pino.destination(2),\n );\n}\n\nexport type StdioLogger = ReturnType<typeof createStdioLogger>;\n\nexport const logger = createStdioLogger();\n",
10
10
  "/**\n * Common context carried through the attachment/prompt-build pipeline.\n * Used by buildPromptFromMessage and related helpers.\n */\nexport interface SessionContext {\n userId: number;\n topicName?: string;\n userDir?: string;\n sessionType?: \"dm\" | \"forum\" | \"ephemeral\" | \"manager\" | \"cron\";\n}\n\nexport interface TokenUsage {\n /** Aggregate billable input across every model call made during this turn. */\n inputTokens: number;\n outputTokens: number;\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n /** Provider-reported query cost when available. */\n costUsd?: number;\n /** Tokens occupied by the latest model call, not aggregate turn spend. */\n contextTokens?: number;\n /** Provider-reported context window for the latest model call. */\n contextWindow?: number;\n}\n\n/** Agent identifier — one of the supported AI provider backends. */\nexport type AgentKind = \"maestro\" | \"claude\" | \"codex\";\n\nexport const SUPPORTED_AGENTS: readonly AgentKind[] = [\"maestro\", \"claude\", \"codex\"] as const;\n\nexport function isAgentKind(value: unknown): value is AgentKind {\n return typeof value === \"string\" && (SUPPORTED_AGENTS as readonly string[]).includes(value);\n}\n\n/**\n * Per-agent supported reasoning efforts. Single source of truth for both the\n * `EffortLevel` type and each registry's `validEfforts` runtime list — the\n * registries import these directly so adding a value in one place\n * propagates to validation, footer rendering, and zod enums.\n *\n * Claude SDK rejects 'minimal'; Codex SDK rejects 'max'. The two sets\n * intersect on low/medium/high/xhigh. Maestro (TS port) currently piggybacks\n * on the Anthropic provider, so its efforts mirror the Claude set; this can\n * narrow per-provider once Phase 5 lands.\n *\n * 'minimal' removed from codex: Codex API rejects it when default tools\n * (image_gen, web_search) are active, making agent sessions unusable.\n */\nexport const CLAUDE_EFFORT_VALUES = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nexport const CODEX_EFFORT_VALUES = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nexport const MAESTRO_EFFORT_VALUES = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\nexport type EffortLevel =\n | (typeof CLAUDE_EFFORT_VALUES)[number]\n | (typeof CODEX_EFFORT_VALUES)[number]\n | (typeof MAESTRO_EFFORT_VALUES)[number];\n\n/**\n * Runtime iteration list (used by zod enums and any callers that need to\n * loop over every accepted value). Manually ordered for readability; the\n * `satisfies` check fails the build if an entry here isn't covered by the\n * per-agent unions above.\n */\nexport const EFFORT_VALUES = [\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const satisfies readonly EffortLevel[];\n\n/**\n * Normalized events yielded by any agent provider (claudeProvider, codexProvider).\n * The handler/event-processor consumes these without caring which backend produced them.\n *\n * `user_message` is the lone \"into-the-log\" variant — no provider yields it.\n * The query handler writes it directly to the conversation log right before\n * `runAgent()` starts, so cross-agent rollout reconstruction can pair every\n * assistant turn with the user prompt that triggered it. Consumers that only\n * react to provider output (e.g. processAgentEvent) can safely ignore it.\n */\n/**\n * Wire-safe projection of one task, carried by the `tasks` UnifiedEvent.\n *\n * This is also the on-disk shape of Otium's shared task store, so claude,\n * codex, and maestro render the same live panel from the same source of truth.\n */\nexport interface TaskSnapshot {\n id: string;\n subject: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n /** Task ids this one is blocked by; omitted when empty. */\n blockedBy?: string[];\n /** Present-continuous label for spinners, when set. */\n activeForm?: string;\n /** Owner / agent name for multi-agent runs, when set. */\n owner?: string;\n}\n\nexport type UnifiedEvent =\n | {\n type: \"user_message\";\n content: string;\n synthetic?: \"compaction\";\n /** Total ordered user submissions represented by one preempting provider turn. */\n consecutiveBatchSize?: number;\n /** Zero-based position within the ordered preemption batch. */\n consecutiveBatchIndex?: number;\n }\n | { type: \"session\"; sessionId: string }\n | {\n type: \"tool_use\";\n name: string;\n input: Record<string, unknown>;\n /** Provider-assigned id so the client can match tool_use→tool_result pairs. */\n toolUseId?: string;\n }\n | { type: \"tool_progress\"; toolName: string; elapsed: number }\n | { type: \"tool_use_summary\"; summary: string }\n // Provider reasoning/thinking summary text (Codex `reasoning` items; Claude\n // extended-thinking). Surfaced so background runs (cron/archiver) show the\n // agent's thought process, not just tool calls.\n | { type: \"reasoning\"; content: string }\n // Full task-list snapshot (replace, not delta) from Otium's shared task\n // store. Provider-native task/todo stores are not authoritative.\n | { type: \"tasks\"; tasks: TaskSnapshot[] }\n | {\n type: \"tool_result\";\n toolUseId: string;\n content: string;\n /** True when the tool call failed; absent/false means success. */\n isError?: boolean;\n metadata?: {\n truncatedForModel: boolean;\n originalBytes: number;\n returnedBytes: number;\n omittedBytes?: number;\n outputPath?: string;\n };\n }\n | { type: \"text_delta\"; content: string }\n | { type: \"text\"; content: string }\n | { type: \"result\"; content: string; stopReason: string; usage?: TokenUsage }\n | { type: \"file\"; path: string; source: string; origin: \"tag\" | \"extension\" }\n | {\n type: \"error\";\n content: string;\n usage?: TokenUsage;\n code?: \"budget_exceeded\";\n }\n | { type: \"status\"; content: string };\n\nexport interface AgentInputAttachment {\n id: string;\n type: \"image\" | \"file\" | \"audio\";\n filename: string;\n mimeType: string;\n sizeBytes: number;\n path: string;\n}\n\n/** Worker-side runtime tools proxy user-facing state back to the canonical\n * hub topic identified here. */\nexport interface PeerRuntimeBridgeContext {\n hubCellId: string;\n hostTopicId: string;\n hostQueryId: string;\n canSpawnSubagents: boolean;\n}\n\nexport interface AgentQueryOptions {\n agent: AgentKind;\n prompt: string;\n attachments?: AgentInputAttachment[];\n sessionId?: string | null;\n cwd: string;\n systemPrompt: string;\n /**\n * Trusted system-level instructions for this Maestro invocation only.\n * Maestro projects them onto the invocation-start user message without\n * persisting them in session history or compaction. Omitted for Claude/Codex.\n */\n ephemeralSystemPrompt?: string;\n userId?: string;\n /** Credential namespace when it differs from the execution principal. */\n vaultUserId?: string;\n session?: string;\n playwrightPort?: number;\n playwrightCapability?: string;\n bgBashPort?: number;\n sessionType?: \"dm\" | \"forum\" | \"ephemeral\" | \"manager\" | \"cron\";\n /** API topic id (REST/WS world). Carries per-query topic context for MCP servers. */\n topicId?: string;\n /** Direct parent topic id when this query runs inside a subagent room. */\n subagentParentTopicId?: string;\n /** API query id for the currently running turn. Used by runtime MCP tools. */\n queryId?: string;\n /** Optional wiki-memory topic id. Derived topics use their root origin here\n * while other per-topic MCP servers keep `topicId` bound to the live room. */\n wikiTopicId?: string;\n /** Whether self-config MCP may enqueue an automatic continue turn after set_* changes. */\n autoContinue?: boolean;\n /** Expose Otium-only visual panel tools for this turn. Default-deny. */\n visualTools?: boolean;\n /** Expose adapter-backed file-delivery tools for this turn. Default-deny. */\n fileDeliveryTools?: boolean;\n abortController?: AbortController;\n model?: string;\n /** Provider-side hard budget when the selected SDK supports one. */\n maxBudgetUsd?: number;\n depth?: number;\n agents?: Record<\n string,\n {\n description: string;\n prompt: string;\n model?: string;\n tools?: string[];\n maxTurns?: number;\n effort?: EffortLevel | number;\n }\n >;\n effort?: EffortLevel;\n /**\n * Per-API-call `max_tokens` ceiling on the assistant's output. Wired\n * through to the underlying provider request body for every agent\n * (claude/codex/maestro). Omit to inherit each provider SDK's per-model\n * default — for maestro that's the v0.1.21+ `getNativeMaxOutputTokens`\n * catalog (deepseek-pro=64K, kimi-k3=64K, kimi-k2.7-code=32K).\n *\n * Pass an explicit number when a specific topic / surface needs a tighter\n * latency cap or a higher ceiling for long-form generation (legal\n * report writing, multi-K Write/Edit file bodies). Pre-0.1.21 maestro\n * builds silently clamped at 4096 and truncated outputs mid-string;\n * setting this field is now the supported way to lift that ceiling.\n */\n maxTokens?: number;\n /**\n * v0.1.22+: Claude-Code-style deferred tool catalog + `ToolSearch` built-in.\n *\n * Wired straight through to `maestro-agent-sdk`'s\n * `AgentQueryOptions.enableToolSearch`. When `true`, the maestro provider\n * registers every MCP tool as deferred — schemas stay off the wire until\n * the model promotes them via `ToolSearch(\"select:Name1,Name2\")` or\n * `ToolSearch(\"keyword\")`. Active set persists across resume.\n *\n * Otium's maestro provider supplies `true` when the caller leaves this\n * option unset, because most forum turns carry enough MCP surface for the\n * reminder-token savings to outweigh the first-use `ToolSearch` round-trip.\n * Callers can still pass `false` per call when a narrow surface or\n * latency-sensitive workflow is better served by eager MCP schemas.\n *\n * No-op for claude / codex agents — they have their own deferred-tool\n * machinery owned by their respective SDKs.\n */\n enableToolSearch?: boolean;\n /**\n * Bounded tool results with the full output kept on disk.\n *\n * Wired to `maestro-agent-sdk`'s `AgentQueryOptions.toolResultTruncation`.\n * The SDK caps a string tool result, writes the untruncated bytes to a file,\n * and splices an opaque `maestro://tool-output/<id>` reference into the text\n * that the `ReadToolOutput` tool can page back through.\n *\n * The maestro provider enables it by default. Left unset, every tool result\n * — a whole-file `Read`, a wide `Grep`, a `WebFetch` of a large page —\n * entered the context at full size, and the `\"ReadToolOutput\"` entry in the\n * provider's builtin list was dead, because the SDK only registers that tool\n * when truncation is on with `saveFullOutput`.\n *\n * Pass an explicit object to tune the budget, or `{ enabled: false }` for a\n * call whose tool results must arrive whole.\n *\n * No-op for claude / codex agents — their SDKs do their own truncation.\n */\n toolResultTruncation?: {\n enabled?: boolean;\n maxBytes?: number;\n headBytes?: number;\n tailBytes?: number;\n saveFullOutput?: boolean;\n outputDir?: string;\n retentionDays?: number;\n ignoreTools?: string[];\n };\n /**\n * Claude-Code-compatible exact tool denylist. Maestro v0.1.42+ hides these\n * tools from provider schemas / ToolSearch and blocks dispatch if a stale\n * call still arrives. Claude maps this to its SDK option. Codex does not\n * support this name-based list; its provider-native multi-agent tool family\n * is disabled separately through the Codex feature config.\n */\n disallowedTools?: readonly string[];\n /**\n * Hard provider tool policy for auxiliary model calls.\n *\n * `\"none\"` removes MCP and provider-native tools before the request is\n * dispatched. `\"compaction-log\"` keeps provider-native tools disabled and\n * exposes only the host-scoped immutable log reader. Use these for untrusted\n * transcript transforms; reacting to tool events after dispatch is not a\n * security boundary.\n */\n toolPolicy?: \"none\" | \"compaction-log\";\n mcpEnabled?: string[] | null;\n peerBridge?: PeerRuntimeBridgeContext;\n mcpExtra?: Record<string, unknown>;\n /**\n * true for silent fork runs generating ask_session replies — restricts session-comm\n * outbound tools (ask/tell/abort) so the forked session can only produce text\n */\n silent?: boolean;\n}\n\n/** State file written to data/users/{userId}/active-queries/{topicId}.json while a query is running. */\nexport interface QueryState {\n topicId?: string;\n topicName?: string;\n task?: string; // first 100 chars of prompt, newlines normalized\n since: string; // ISO timestamp\n}\n",
@@ -23,8 +23,9 @@
23
23
  "export type RuntimeMcpScope = \"dm\" | \"forum\" | \"fork\" | \"manager\" | \"cron\";\n\nexport interface RuntimeMcpPolicyEntry {\n scopes: readonly RuntimeMcpScope[];\n /** Forum entries marked required cannot be disabled by a topic whitelist. */\n forumRequired?: boolean;\n}\n\nexport const COMMON_RUNTIME_MCP_POLICY = {\n playwright: { scopes: [\"dm\", \"forum\", \"fork\", \"cron\"], forumRequired: true },\n runtime: { scopes: [\"forum\", \"manager\", \"fork\", \"cron\"], forumRequired: true },\n \"token-stats\": { scopes: [\"dm\", \"forum\", \"manager\", \"cron\"], forumRequired: true },\n task: { scopes: [\"dm\", \"forum\", \"manager\", \"cron\"], forumRequired: true },\n \"session-comm\": { scopes: [\"forum\", \"fork\", \"manager\"], forumRequired: true },\n wiki: { scopes: [\"dm\", \"forum\", \"manager\", \"cron\"], forumRequired: true },\n skills: { scopes: [\"dm\", \"forum\", \"manager\", \"cron\"], forumRequired: true },\n \"system-health\": { scopes: [\"dm\", \"forum\", \"manager\", \"cron\"], forumRequired: true },\n \"background-bash\": { scopes: [\"forum\"], forumRequired: true },\n \"agent-health\": { scopes: [\"forum\", \"manager\", \"cron\"], forumRequired: true },\n vault: { scopes: [\"dm\", \"forum\", \"manager\", \"cron\"], forumRequired: true },\n} as const satisfies Record<string, RuntimeMcpPolicyEntry>;\n\nexport type CommonRuntimeMcpName = keyof typeof COMMON_RUNTIME_MCP_POLICY;\n\nexport interface ForumMcpClassification {\n all: string[];\n required: string[];\n optional: string[];\n}\n\nexport function classifyForumMcpServers(\n catalog: Readonly<Record<string, RuntimeMcpPolicyEntry>>,\n): ForumMcpClassification {\n const all = Object.entries(catalog)\n .filter(([, entry]) => entry.scopes.includes(\"forum\"))\n .map(([name]) => name);\n const required = Object.entries(catalog)\n .filter(([, entry]) => entry.scopes.includes(\"forum\") && entry.forumRequired)\n .map(([name]) => name);\n const requiredSet = new Set(required);\n return { all, required, optional: all.filter((name) => !requiredSet.has(name)) };\n}\n\nexport function commonRuntimeMcpPolicy(name: CommonRuntimeMcpName): RuntimeMcpPolicyEntry {\n return COMMON_RUNTIME_MCP_POLICY[name];\n}\n\nexport function isForumRequiredMcp(name: string): boolean {\n const entry = COMMON_RUNTIME_MCP_POLICY[name as CommonRuntimeMcpName];\n return Boolean(entry?.scopes.includes(\"forum\") && entry.forumRequired);\n}\n",
24
24
  "import { createHmac } from \"node:crypto\";\n\nexport function browserOwnerCapability(capability: string, owner: string): string {\n return createHmac(\"sha256\", capability).update(owner).digest(\"hex\");\n}\n",
25
25
  "import { canonicalMcpBridgeEnv } from \"#mcp/canonical-bridge-config\";\nimport {\n buildHostedMcpSpec,\n buildRuntimeMcpSpec,\n type HostedMcpSurface,\n RUNTIME_MCP_KEY,\n} from \"#mcp/runtime-spec\";\nimport { peerSessionBridgeIpcEnv } from \"#mcp/session-comm/bridge-ipc-config\";\nimport { bgBashContextCapability } from \"#platform/background-bash/manager\";\nimport {\n AGENT_HEALTH_SERVER,\n BROWSER_MCP_SSE_PROXY_SERVER,\n CANONICAL_MCP_PROXY_SERVER,\n envText,\n FALLBACK_AGENT,\n resolveTopicWorkspaceDir,\n SESSION_COMM_SERVER,\n SYSTEM_HEALTH_SERVER,\n TASK_SERVER,\n TOKEN_STATS_SERVER,\n TSCONFIG_PATH,\n TSX_LOADER,\n VAULT_SERVER,\n WIKI_SERVER,\n} from \"#platform/config\";\nimport { logger } from \"#platform/logger\";\nimport {\n classifyForumMcpServers,\n commonRuntimeMcpPolicy,\n type RuntimeMcpScope,\n} from \"#platform/mcp-catalog-policy\";\nimport { browserOwnerCapability } from \"#platform/playwright/capability\";\nimport type { AgentKind, AgentQueryOptions, PeerRuntimeBridgeContext } from \"#types\";\n\nexport type { RuntimeMcpScope } from \"#platform/mcp-catalog-policy\";\n\n/**\n * Build the stdio transport spec for a Otium MCP server entry.\n *\n * claude/maestro launch the .ts server directly with `bun run` (fast, native\n * TypeScript + bun:sqlite). codex CANNOT — codex 0.135's rmcp stdio client\n * fails to handshake with bun-spawned servers (initialize is dropped/raced, so\n * no tools reach the model), while pure-node servers connect reliably. So for\n * the `codex` agent we launch the SAME server file via node + tsx, passing the\n * tsconfig explicitly (servers run with cwd ≠ PROJECT_ROOT, so tsx can't find\n * it on its own) so `@/*` path aliases resolve. Per-turn agent-aware config\n * means switching agents mid-topic just works: each turn re-spawns with the\n * right runtime.\n */\nexport function buildStdioMcpServer(\n agent: AgentKind | undefined,\n serverFile: string,\n serverArgs: string[],\n env?: Record<string, string>,\n): Record<string, unknown> {\n if (agent === \"codex\") {\n return {\n command: \"node\",\n args: [\"--import\", TSX_LOADER, serverFile, ...serverArgs],\n // Merged onto codex's inherited env (not a replacement) — verified.\n env: { TSX_TSCONFIG_PATH: TSCONFIG_PATH, ...env },\n };\n }\n return {\n command: \"bun\",\n args: [\"run\", serverFile, ...serverArgs],\n ...(env ? { env } : {}),\n };\n}\n\nfunction useHostedBuiltinMcp(): boolean {\n return envText(\"NEGOTIUM_BUILTIN_MCP_TRANSPORT\") !== \"stdio\";\n}\n\nfunction buildBuiltinMcpServer(\n surface: HostedMcpSurface,\n ctx: RuntimeMcpBuildContext,\n stdio: () => Record<string, unknown>,\n): Record<string, unknown> {\n if (!useHostedBuiltinMcp()) return stdio();\n const agent = ctx.agent ?? FALLBACK_AGENT;\n return buildHostedMcpSpec(agent, surface, {\n userId: ctx.userId,\n topicTitle: ctx.session,\n ...(ctx.topicId ? { topicId: ctx.topicId } : {}),\n ...(ctx.queryId ? { queryId: ctx.queryId } : {}),\n ...(ctx.wikiTopicId ? { wikiTopicId: ctx.wikiTopicId } : {}),\n ...(ctx.subagentParentTopicId ? { subagentParentTopicId: ctx.subagentParentTopicId } : {}),\n cwd: ctx.cwd ?? (ctx.topicId ? resolveTopicWorkspaceDir(ctx.topicId) : process.cwd()),\n agent,\n ...(ctx.model ? { model: ctx.model } : {}),\n ...(ctx.depth !== undefined ? { depth: ctx.depth } : {}),\n ...(ctx.silent !== undefined ? { silent: ctx.silent } : {}),\n ...(ctx.peerBridge ? { peerBridge: ctx.peerBridge } : {}),\n });\n}\n\n// --- Playwright unavailable notifier + per-turn state ---\n//\n// When the playwright manager fails to allocate a long-lived MCP port,\n// the catalog used to fall back to a per-turn stdio chromium that ran as\n// a child of the agent CLI subprocess — which meant Chromium was bound\n// to the agent's process tree and died on cascade-kill. We now skip the\n// browser entry entirely (the playwright entry is omitted from the\n// catalog for that turn) AND surface the gap two ways:\n//\n// 1. `notifyPlaywrightUnavailable` — fire-and-forget callback for the host\n// (telegram bot) to push an alert to the current topic. Throttled\n// per (userId, topic) with a 5-minute cooldown so a flaky\n// manager doesn't spam the chat. Per-process state — restart clears.\n//\n// 2. `consumePlaywrightUnavailable` — the system-prompt builder reads\n// this flag to add an explicit \"Playwright unavailable this turn\"\n// reminder to the agent's user message, so the model knows to\n// route around browser tools instead of hallucinating a call to a\n// tool that was silently removed from the schema list.\n\ntype PlaywrightUnavailableContext = {\n userId: string;\n topic: string | undefined;\n agent: AgentKind | undefined;\n};\n\ntype PlaywrightUnavailableNotifier = (ctx: PlaywrightUnavailableContext) => void;\n\nlet _playwrightUnavailableNotifier: PlaywrightUnavailableNotifier | undefined;\nconst _playwrightUnavailableLastNotifiedAt = new Map<string, number>();\nconst _PLAYWRIGHT_UNAVAILABLE_COOLDOWN_MS = 5 * 60_000;\n\nconst _playwrightUnavailableThisTurn = new Set<string>();\n\nfunction _playwrightUnavailableKey(userId: string, topic: string | undefined): string {\n return `${userId}:${topic ?? \"\"}`;\n}\n\n/**\n * Register the host's \"playwright unavailable\" alert sink. Called once at bot\n * startup. Idempotent — last writer wins.\n */\nexport function setPlaywrightUnavailableNotifier(cb: PlaywrightUnavailableNotifier): void {\n _playwrightUnavailableNotifier = cb;\n}\n\n/**\n * Mark the current turn as missing long-lived Playwright and notify the host.\n * The playwright catalog entry calls this when it is built without a port, but\n * route-level callers can call it earlier after ensurePlaywright fails so the\n * system prompt for the same turn can include the unavailable reminder.\n */\nexport function markPlaywrightUnavailable(ctx: PlaywrightUnavailableContext): void {\n _markPlaywrightUnavailable(ctx);\n}\n\nfunction _markPlaywrightUnavailable(ctx: PlaywrightUnavailableContext): void {\n // Mark unavailable for the next system-prompt build, regardless of\n // notifier presence (the model-side reminder must always fire so the\n // agent doesn't try to call a missing tool).\n _playwrightUnavailableThisTurn.add(_playwrightUnavailableKey(ctx.userId, ctx.topic));\n\n if (!_playwrightUnavailableNotifier) return;\n const key = _playwrightUnavailableKey(ctx.userId, ctx.topic);\n const now = Date.now();\n const last = _playwrightUnavailableLastNotifiedAt.get(key) ?? 0;\n if (now - last < _PLAYWRIGHT_UNAVAILABLE_COOLDOWN_MS) return;\n _playwrightUnavailableLastNotifiedAt.set(key, now);\n try {\n _playwrightUnavailableNotifier(ctx);\n } catch (err) {\n logger.warn({ err }, \"playwright unavailable notifier threw\");\n }\n}\n\n/**\n * Read + clear the \"playwright unavailable this turn\" flag for a\n * (user, group, topic). Used by the system-prompt builder right before\n * the agent query starts. Single consumer pattern — calling more than\n * once per turn returns `false` for the second caller (intended; the\n * reminder only needs to ride one prompt).\n */\nexport function consumePlaywrightUnavailable(userId: string, topic: string | undefined): boolean {\n const key = _playwrightUnavailableKey(userId, topic);\n if (!_playwrightUnavailableThisTurn.has(key)) return false;\n _playwrightUnavailableThisTurn.delete(key);\n return true;\n}\n\n/**\n * Single source of truth for MCP server registration.\n *\n * Each entry declares which scopes it participates in (`dm`, `forum`, `fork`, `cron`)\n * and how to build its spawn config given a context. Public helpers\n * (`getDmMcpServers`, `getForumMcpServers`, `getForkMcpServers`) and the\n * derived `ALL_FORUM_MCP_SERVER_NAMES` / `REQUIRED_FORUM_MCP_SERVERS`\n * constants all read from this catalog, so adding a new MCP server is a\n * one-line append here instead of touching three places.\n *\n * Conventions:\n * - `scopes` lists every scope the server should appear in by default.\n * - `forumRequired: true` keeps the server even when a forum topic\n * restricts the enabled list via `configure_mcp` (forum scope only).\n * - `build(ctx)` returns the raw transport config (Claude-SDK shape).\n * Codex callers funnel through `toCodexMcpServers` separately.\n *\n * Insertion order is preserved by `Object.entries`, which determines the\n * order of server names in user-facing displays.\n */\n\nexport interface RuntimeMcpBuildContext {\n userId: string;\n /** Vault namespace when credentials belong to a different principal. */\n vaultUserId?: string;\n /** \"dm\" for DM scope, topic/session name for forum/fork. */\n session: string;\n /** REST/WS topic id when known. Prefer for authorization/scope checks. */\n topicId?: string;\n /** Direct parent topic id when the current topic is a subagent room. */\n subagentParentTopicId?: string;\n /** REST/WS query id when known. */\n queryId?: string;\n /** Topic id whose wiki memory should be read/written. */\n wikiTopicId?: string;\n agent?: AgentKind;\n cwd?: string;\n model?: string;\n currentUserPrompt?: string;\n depth?: number;\n playwrightPort?: number;\n playwrightCapability?: string;\n bgBashPort?: number;\n autoContinue?: boolean;\n visualTools?: boolean;\n fileDeliveryTools?: boolean;\n silent?: boolean;\n peerBridge?: PeerRuntimeBridgeContext;\n}\n\nexport interface RuntimeMcpCatalogEntry {\n scopes: readonly RuntimeMcpScope[];\n /** Forum scope only: cannot be removed via the enabled whitelist. */\n forumRequired?: boolean;\n /**\n * Returns the raw transport spec (Claude-SDK shape), or `null` to\n * signal \"this server is unavailable for this turn — omit it from the\n * catalog entirely.\" Used by the playwright entry when the manager\n * cannot provide a long-lived port.\n */\n build(ctx: RuntimeMcpBuildContext): Record<string, unknown> | null;\n}\n\n// --- Playwright transport builders ---\n\nexport const CODEX_BROWSER_CAPABILITY_ENV = \"NEGOTIUM_BROWSER_CAPABILITY\";\n\nexport { browserOwnerCapability };\n\nexport function browserOwnerForContext(ctx: {\n userId?: string;\n session?: string;\n topicId?: string;\n}): string | undefined {\n if (ctx.topicId) return `topic:${ctx.topicId}`;\n if (ctx.userId && ctx.session) return `user:${ctx.userId}:${ctx.session}`;\n return undefined;\n}\n\nfunction playwrightTransport(port: number, owner: string, capability: string, agent?: AgentKind) {\n const ownerCapability = browserOwnerCapability(capability, owner);\n if (agent === \"codex\") {\n const query = new URLSearchParams({ owner });\n return {\n url: `http://127.0.0.1:${port}/mcp?${query}`,\n env_http_headers: { \"X-Browser-Capability\": CODEX_BROWSER_CAPABILITY_ENV },\n };\n }\n const query = new URLSearchParams({ owner });\n if (agent === \"maestro\") {\n // maestro-agent-sdk does not expose SSE headers. Route it through a\n // tiny stdio bridge so the bearer capability stays in an environment\n // variable rather than appearing in URLs and request logs.\n return buildStdioMcpServer(\"maestro\", BROWSER_MCP_SSE_PROXY_SERVER, [], {\n NEGOTIUM_BROWSER_SSE_URL: `http://127.0.0.1:${port}/sse?${query}`,\n NEGOTIUM_BROWSER_OWNER_CAPABILITY: ownerCapability,\n });\n }\n return {\n type: \"sse\" as const,\n url: `http://127.0.0.1:${port}/sse?${query}`,\n headers: { \"X-Browser-Capability\": ownerCapability },\n };\n}\n\nfunction longLivedHttpMcp(agent: AgentKind | undefined, port: number) {\n return agent === \"codex\"\n ? { url: `http://127.0.0.1:${port}/mcp` }\n : { type: \"sse\" as const, url: `http://127.0.0.1:${port}/sse` };\n}\n\nfunction backgroundBashTransport(\n agent: AgentKind | undefined,\n port: number,\n userId: string,\n topic: string,\n) {\n const capability = bgBashContextCapability(userId, topic);\n const headers = {\n \"X-Background-Bash-User\": userId,\n \"X-Background-Bash-Topic\": topic,\n \"X-Background-Bash-Capability\": capability,\n };\n if (agent === \"codex\") return { url: `http://127.0.0.1:${port}/mcp`, http_headers: headers };\n if (agent === \"maestro\") {\n const query = new URLSearchParams({ user: userId, topic, capability });\n return { type: \"sse\" as const, url: `http://127.0.0.1:${port}/sse?${query}` };\n }\n return { type: \"sse\" as const, url: `http://127.0.0.1:${port}/sse`, headers };\n}\n\n// --- Catalog ---\n\nconst MCP_CATALOG: Record<string, RuntimeMcpCatalogEntry> = {\n playwright: {\n ...commonRuntimeMcpPolicy(\"playwright\"),\n build({ userId, session, topicId, playwrightPort, playwrightCapability, agent }) {\n // Codex uses streamable HTTP while Claude and Maestro use SSE. Both\n // transports terminate at the same long-lived browser/profile server.\n if (playwrightPort && playwrightCapability) {\n const owner = browserOwnerForContext({ userId, session, topicId });\n if (!owner) return null;\n return playwrightTransport(playwrightPort, owner, playwrightCapability, agent);\n }\n // No port available — the playwright manager could not allocate one\n // for this turn. The previous behavior was to fall back to a per-turn\n // stdio chromium, but that made Chromium a child of the agent CLI\n // process tree, so cascade-kill on agent exit took the browser down\n // with it (visible in pm2 as \"Chromium died with claude\"). We now\n // omit the playwright entry from this turn's catalog AND fire two\n // side-effects:\n // 1. notify the host so it can push an alert into the current\n // topic (rate-limited 5min per scope key);\n // 2. mark the (user, topic) as \"playwright unavailable\n // this turn\" so the system-prompt builder can tell the model\n // explicitly, instead of letting the model hallucinate a call\n // to a tool whose schema silently vanished.\n _markPlaywrightUnavailable({\n userId,\n topic: session,\n agent,\n });\n return null;\n },\n },\n [RUNTIME_MCP_KEY]: {\n ...commonRuntimeMcpPolicy(\"runtime\"),\n build({\n userId,\n session,\n topicId,\n queryId,\n agent,\n cwd,\n model,\n currentUserPrompt,\n autoContinue,\n visualTools,\n fileDeliveryTools,\n peerBridge,\n }) {\n if (!topicId || !agent) return null;\n return buildRuntimeMcpSpec(agent, {\n userId,\n topicId,\n topicTitle: session,\n queryId,\n cwd: cwd ?? resolveTopicWorkspaceDir(topicId),\n agent,\n model,\n currentUserPrompt,\n autoContinue,\n visualTools,\n fileDeliveryTools,\n peerBridge,\n });\n },\n },\n \"token-stats\": {\n ...commonRuntimeMcpPolicy(\"token-stats\"),\n build(ctx) {\n return buildBuiltinMcpServer(\"token-stats\", ctx, () =>\n buildStdioMcpServer(ctx.agent, TOKEN_STATS_SERVER, [`--user-id=${ctx.userId}`]),\n );\n },\n },\n // Otium-owned shared task system. This is the only authoritative task/todo\n // surface across claude/codex/maestro; provider-native task stores are\n // blocked or ignored because they do not survive agent switches.\n task: {\n ...commonRuntimeMcpPolicy(\"task\"),\n build(ctx) {\n const { userId, session, topicId, queryId, agent, peerBridge } = ctx;\n if (peerBridge) {\n if (!topicId || !queryId) return null;\n const env = canonicalMcpBridgeEnv({\n surface: \"task\",\n userId,\n topicId,\n queryId,\n peerBridge,\n });\n return env\n ? buildStdioMcpServer(agent, CANONICAL_MCP_PROXY_SERVER, [\"--surface=task\"], env)\n : null;\n }\n const args = [`--user-id=${userId}`, `--topic=${session}`];\n if (topicId) args.push(`--topic-id=${topicId}`);\n return buildBuiltinMcpServer(\"task\", ctx, () =>\n buildStdioMcpServer(agent, TASK_SERVER, args),\n );\n },\n },\n \"session-comm\": {\n // Exposed in `manager` scope as well so the General-topic manager agent\n // can wake fresh-created topics via tell_session/ask_session right after\n // create_topic. Without this, a newly-created topic would stay in the\n // \"fresh-start ready\" state until the user manually visits it.\n ...commonRuntimeMcpPolicy(\"session-comm\"),\n build(ctx) {\n const {\n userId,\n session,\n topicId,\n subagentParentTopicId,\n agent,\n depth = 0,\n silent,\n peerBridge,\n } = ctx;\n const effectiveAgent = agent ?? FALLBACK_AGENT;\n const args = [\n `--user-id=${userId}`,\n `--topic=${session}`,\n ...(topicId ? [`--topic-id=${topicId}`] : []),\n ...(subagentParentTopicId ? [`--subagent-parent-topic-id=${subagentParentTopicId}`] : []),\n `--depth=${depth}`,\n `--agent=${effectiveAgent}`,\n ...(silent ? [\"--reply-only=true\"] : []),\n ...(peerBridge ? [`--peer-host-query-id=${peerBridge.hostQueryId}`] : []),\n ];\n return buildBuiltinMcpServer(\"session-comm\", ctx, () =>\n buildStdioMcpServer(\n effectiveAgent,\n SESSION_COMM_SERVER,\n args,\n peerBridge ? peerSessionBridgeIpcEnv() : undefined,\n ),\n );\n },\n },\n wiki: {\n ...commonRuntimeMcpPolicy(\"wiki\"),\n build(ctx) {\n const { userId, session, topicId, queryId, wikiTopicId, agent, peerBridge } = ctx;\n if (peerBridge) {\n if (!topicId || !queryId) return null;\n const env = canonicalMcpBridgeEnv({\n surface: \"wiki\",\n userId,\n topicId,\n queryId,\n peerBridge,\n });\n return env\n ? buildStdioMcpServer(agent, CANONICAL_MCP_PROXY_SERVER, [\"--surface=wiki\"], env)\n : null;\n }\n const args = [`--user-id=${userId}`];\n if (topicId) args.push(`--current-topic-id=${topicId}`);\n // Prefer the REST topic id so wiki_write writes filenames and SQLite\n // briefs keyed the same way the topic wiki API reads them.\n const resolvedWikiTopicId =\n wikiTopicId ?? topicId ?? (session !== \"dm\" ? session : undefined);\n if (resolvedWikiTopicId) args.push(`--topic-id=${resolvedWikiTopicId}`);\n args.push(\"--surface=wiki\");\n return buildBuiltinMcpServer(\"wiki\", { ...ctx, wikiTopicId: resolvedWikiTopicId }, () =>\n buildStdioMcpServer(agent, WIKI_SERVER, args),\n );\n },\n },\n skills: {\n ...commonRuntimeMcpPolicy(\"skills\"),\n build(ctx) {\n const { userId, topicId, agent } = ctx;\n const args = [`--user-id=${userId}`, \"--surface=skills\"];\n if (topicId) args.push(`--topic-id=${topicId}`);\n return buildBuiltinMcpServer(\"skills\", ctx, () =>\n buildStdioMcpServer(agent, WIKI_SERVER, args),\n );\n },\n },\n \"system-health\": {\n ...commonRuntimeMcpPolicy(\"system-health\"),\n build(ctx) {\n return buildBuiltinMcpServer(\"system-health\", ctx, () =>\n buildStdioMcpServer(ctx.agent, SYSTEM_HEALTH_SERVER, []),\n );\n },\n },\n \"background-bash\": {\n ...commonRuntimeMcpPolicy(\"background-bash\"),\n build({ agent, bgBashPort, userId, topicId }) {\n // Key the whole pipeline by the canonical topic id: it flows through the\n // capability, the request context, and the completion inbox filename\n // (sessionInboxPath) so the exiting process's output is routed back to\n // the exact originating topic. A title/session fallback would be encoded\n // as if it were an id and the inbox worker would fail to resolve it, so\n // background-bash is simply unavailable without a topic id.\n if (bgBashPort === undefined || !topicId) return null;\n return backgroundBashTransport(agent, bgBashPort, userId, topicId);\n },\n },\n \"agent-health\": {\n ...commonRuntimeMcpPolicy(\"agent-health\"),\n build(ctx) {\n const { userId, agent } = ctx;\n const args = [`--user-id=${userId}`];\n return buildBuiltinMcpServer(\"agent-health\", ctx, () =>\n buildStdioMcpServer(agent, AGENT_HEALTH_SERVER, args),\n );\n },\n },\n vault: {\n ...commonRuntimeMcpPolicy(\"vault\"),\n build(ctx) {\n const { userId, vaultUserId, agent } = ctx;\n // Normal turns use {{KEY}} directly in tool inputs. Keep the Vault MCP\n // surface focused on key discovery; broker tools remain available from\n // the public factory for compatibility but are no longer the default UX.\n const args = [`--user-id=${vaultUserId ?? userId}`];\n if (agent !== \"codex\") args.push(\"--list-only=true\");\n return buildBuiltinMcpServer(\"vault\", { ...ctx, userId: vaultUserId ?? userId }, () =>\n buildStdioMcpServer(agent, VAULT_SERVER, args),\n );\n },\n },\n};\n\n// --- Derived catalog views ---\n\n/** All forum-eligible MCP server names, in display order. */\nconst allForumMcpServerNames: string[] = [];\nexport const ALL_FORUM_MCP_SERVER_NAMES: readonly string[] = allForumMcpServerNames;\n\n/** Forum servers that cannot be removed via the enabled whitelist. */\nconst requiredForumMcpServers: string[] = [];\nexport const REQUIRED_FORUM_MCP_SERVERS: readonly string[] = requiredForumMcpServers;\n\n/** Forum servers that can be toggled via the enabled whitelist (not required). */\nconst optionalForumMcpServers: string[] = [];\nexport const OPTIONAL_FORUM_MCP_SERVERS: readonly string[] = optionalForumMcpServers;\n\nfunction refreshForumCatalogViews(): void {\n const { all, required, optional } = classifyForumMcpServers(MCP_CATALOG);\n allForumMcpServerNames.splice(0, allForumMcpServerNames.length, ...all);\n requiredForumMcpServers.splice(0, requiredForumMcpServers.length, ...required);\n optionalForumMcpServers.splice(0, optionalForumMcpServers.length, ...optional);\n}\n\nrefreshForumCatalogViews();\n\n/**\n * Mount one MCP capability supplied by an optional node module.\n *\n * Registration happens once at node startup, never in the per-event hot path.\n * The returned cleanup closure only removes the exact entry installed by this\n * call, making module stop/restart safe.\n */\nexport function registerRuntimeMcpServer(name: string, entry: RuntimeMcpCatalogEntry): () => void {\n const key = name.trim();\n if (!key || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(key)) {\n throw new Error(`invalid runtime MCP server name: ${name}`);\n }\n if (MCP_CATALOG[key]) throw new Error(`runtime MCP server already registered: ${key}`);\n MCP_CATALOG[key] = entry;\n refreshForumCatalogViews();\n return () => {\n if (MCP_CATALOG[key] !== entry) return;\n delete MCP_CATALOG[key];\n refreshForumCatalogViews();\n };\n}\n\n/**\n * Format the active MCP config for display (used by get_mcp_config /\n * get_topic_mcp / configure_mcp response).\n *\n * In whitelist mode the DB stores only the user-chosen optional servers;\n * required servers are always active but never written to the whitelist.\n * This helper surfaces that split so the model never confuses \"not in\n * whitelist\" with \"not active\".\n */\nexport function formatMcpStatus(config: {\n enabled: string[] | null;\n extra?: Record<string, unknown>;\n}): string[] {\n const extraNames = Object.keys(config.extra ?? {});\n\n if (config.enabled === null) {\n const total = ALL_FORUM_MCP_SERVER_NAMES.length + extraNames.length;\n return [\n `설정 방식: 기본값 (전체 활성)`,\n `활성 서버 (${total}개): ${[...ALL_FORUM_MCP_SERVER_NAMES, ...extraNames].join(\", \")}`,\n `추가 서버: ${extraNames.length > 0 ? extraNames.join(\", \") : \"없음\"}`,\n ];\n }\n\n // whitelist mode: stored list may or may not include required servers\n // (old entries might have them; new entries won't). Either way, split\n // by required vs optional for display.\n const optionalActive = config.enabled.filter((n) => !REQUIRED_FORUM_MCP_SERVERS.includes(n));\n const total = REQUIRED_FORUM_MCP_SERVERS.length + optionalActive.length + extraNames.length;\n return [\n `설정 방식: whitelist`,\n `필수 서버 (항상 활성, ${REQUIRED_FORUM_MCP_SERVERS.length}개): ${REQUIRED_FORUM_MCP_SERVERS.join(\", \")}`,\n `선택 서버 (whitelist, ${optionalActive.length}개): ${optionalActive.length > 0 ? optionalActive.join(\", \") : \"없음\"}`,\n `실제 활성 합계: ${total}개`,\n `추가 서버: ${extraNames.length > 0 ? extraNames.join(\", \") : \"없음\"}`,\n ``,\n `선택 가능 서버 전체 (${OPTIONAL_FORUM_MCP_SERVERS.length}개): ${OPTIONAL_FORUM_MCP_SERVERS.join(\", \")}`,\n ];\n}\n\n// --- Builders for each scope ---\n\n// ── Node-assigned MCP servers (mcp-host manifest) ───────────────────\n//\n// The per-node MCP manifest (`negotium mcp add`) lives in @negotium/mcp-host,\n// which depends on core — so core cannot read it directly. Instead the host\n// process resolves the manifest at node start (ensuring long-lived http\n// servers are running and have ports) and installs the result here. Entries\n// then ride every eligible scope's catalog, subject to the same per-topic\n// `enabled` whitelist as optional built-ins.\n\nexport type NodeMcpEntry =\n | { key: string; kind: \"http\"; port: number }\n | { key: string; kind: \"stdio\"; command: string; args?: string[]; env?: Record<string, string> };\n\nlet nodeMcpEntries: NodeMcpEntry[] = [];\n\n/** Install the node's assigned MCP servers. Last writer wins (host restart-safe). */\nexport function setNodeMcpServers(entries: NodeMcpEntry[]): void {\n nodeMcpEntries = entries.filter((entry) => !(entry.key in MCP_CATALOG));\n const dropped = entries.length - nodeMcpEntries.length;\n if (dropped > 0) {\n logger.warn({ dropped }, \"setNodeMcpServers: entries shadowing built-in catalog keys ignored\");\n }\n}\n\nexport function getNodeMcpServers(): readonly NodeMcpEntry[] {\n return nodeMcpEntries;\n}\n\nfunction buildNodeMcpSpecs(\n agent: AgentKind | undefined,\n filter: (name: string) => boolean,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const entry of nodeMcpEntries) {\n if (!filter(entry.key)) continue;\n out[entry.key] =\n entry.kind === \"http\"\n ? longLivedHttpMcp(agent, entry.port)\n : {\n command: entry.command,\n args: entry.args ?? [],\n ...(entry.env ? { env: entry.env } : {}),\n };\n }\n return out;\n}\n\nfunction buildScope(\n scope: RuntimeMcpScope,\n ctx: RuntimeMcpBuildContext,\n filter: (name: string) => boolean = () => true,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [name, entry] of Object.entries(MCP_CATALOG)) {\n if (!entry.scopes.includes(scope)) continue;\n if (!filter(name)) continue;\n // `null` from build() means \"skip this server for this turn\" —\n // currently used by the playwright entry when no long-lived port\n // is available.\n const spec = entry.build(ctx);\n if (spec === null) continue;\n out[name] = spec;\n }\n // Node-assigned MCPs join every scope except cron (scheduled runs keep the\n // deliberately narrow built-in set).\n if (scope !== \"cron\") {\n Object.assign(out, buildNodeMcpSpecs(ctx.agent, filter));\n }\n return out;\n}\n\n/** DM session: catalog entries with `dm` scope, no whitelist. */\nexport function getDmMcpServers(opts: {\n userId: string;\n agent?: AgentKind;\n playwrightPort?: number;\n playwrightCapability?: string;\n}) {\n return buildScope(\"dm\", {\n userId: opts.userId,\n session: \"dm\",\n agent: opts.agent,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n });\n}\n\n/**\n * Manager session: lives in the caller's private General API topic. Owns topic CRUD,\n * invite/user admin, and cross-topic MCP toggling through `topic-admin`,\n * plus general utilities. Browser-heavy work belongs in dedicated topics, so\n * Playwright is intentionally excluded here.\n * No whitelist — manager-scope catalog entries are loaded as-is.\n */\nexport function getManagerMcpServers(opts: {\n userId: string;\n session?: string;\n topicId?: string;\n queryId?: string;\n wikiTopicId?: string;\n agent?: AgentKind;\n cwd?: string;\n model?: string;\n currentUserPrompt?: string;\n playwrightPort?: number;\n playwrightCapability?: string;\n autoContinue?: boolean;\n visualTools?: boolean;\n fileDeliveryTools?: boolean;\n}) {\n if (!opts.topicId) {\n throw new Error(\"getManagerMcpServers: private General topicId is required\");\n }\n const topicId = opts.topicId;\n return buildScope(\"manager\", {\n userId: opts.userId,\n session: opts.session ?? \"General\",\n topicId,\n queryId: opts.queryId,\n wikiTopicId: opts.wikiTopicId ?? topicId,\n agent: opts.agent,\n cwd: opts.cwd,\n model: opts.model,\n currentUserPrompt: opts.currentUserPrompt,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n autoContinue: opts.autoContinue,\n visualTools: opts.visualTools,\n fileDeliveryTools: opts.fileDeliveryTools,\n });\n}\n\n/**\n * Forum session: catalog entries with `forum` scope.\n * - `enabled === null` → all forum servers.\n * - `enabled` is an array → whitelist; required servers are always included.\n * - `extra` is merged on top, allowing one-off injections per topic.\n */\nexport function getForumMcpServers(opts: {\n userId: string;\n vaultUserId?: string;\n session: string;\n topicId?: string;\n subagentParentTopicId?: string;\n queryId?: string;\n wikiTopicId?: string;\n agent: AgentKind;\n cwd?: string;\n model?: string;\n currentUserPrompt?: string;\n playwrightPort?: number;\n playwrightCapability?: string;\n bgBashPort?: number;\n autoContinue?: boolean;\n visualTools?: boolean;\n fileDeliveryTools?: boolean;\n depth?: number;\n enabled?: string[] | null;\n extra?: Record<string, unknown>;\n silent?: boolean;\n peerBridge?: PeerRuntimeBridgeContext;\n}) {\n const {\n userId,\n vaultUserId,\n session,\n topicId,\n subagentParentTopicId,\n queryId,\n wikiTopicId,\n agent,\n cwd,\n model,\n currentUserPrompt,\n playwrightPort,\n playwrightCapability,\n depth = 0,\n enabled = null,\n extra = {},\n silent = false,\n bgBashPort,\n autoContinue,\n visualTools,\n fileDeliveryTools,\n peerBridge,\n } = opts;\n\n const filter = (name: string) => {\n if (silent && name === \"task\") return false;\n if (enabled === null) return true;\n return (\n enabled.includes(name) || (REQUIRED_FORUM_MCP_SERVERS as readonly string[]).includes(name)\n );\n };\n\n const base = buildScope(\n \"forum\",\n {\n userId,\n vaultUserId,\n session,\n topicId,\n subagentParentTopicId,\n queryId,\n wikiTopicId,\n agent,\n cwd,\n model,\n currentUserPrompt,\n depth,\n playwrightPort,\n playwrightCapability,\n bgBashPort,\n autoContinue,\n visualTools,\n fileDeliveryTools,\n silent,\n peerBridge,\n },\n filter,\n );\n\n return { ...base, ...extra };\n}\n\n/**\n * Cron session: scheduled background run for a concrete API topic. Keep the\n * catalog narrower than forum scope: runtime delivery, topic memory/status,\n * vault utilities and a caller-provided disposable Playwright port.\n */\nexport function getCronMcpServers(opts: {\n userId: string;\n session: string;\n topicId: string;\n queryId?: string;\n wikiTopicId?: string;\n agent: AgentKind;\n cwd?: string;\n model?: string;\n currentUserPrompt?: string;\n playwrightPort?: number;\n playwrightCapability?: string;\n visualTools?: boolean;\n fileDeliveryTools?: boolean;\n}) {\n return buildScope(\"cron\", {\n userId: opts.userId,\n session: opts.session,\n topicId: opts.topicId,\n queryId: opts.queryId,\n wikiTopicId: opts.wikiTopicId ?? opts.topicId,\n agent: opts.agent,\n cwd: opts.cwd,\n model: opts.model,\n currentUserPrompt: opts.currentUserPrompt,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n autoContinue: false,\n visualTools: opts.visualTools,\n fileDeliveryTools: opts.fileDeliveryTools,\n });\n}\n\n/**\n * Pick the right MCP server bundle for an agent query. DM/ephemeral sessions\n * get the DM bundle; forum sessions get the forum bundle with full options\n * forwarded. Returned shape is the Claude-SDK shape; Codex callers funnel it\n * through their own translator (`toCodexMcpServers`).\n */\nexport function getMcpServersForQuery(opts: AgentQueryOptions): Record<string, unknown> {\n if (opts.toolPolicy === \"none\") return {};\n if (opts.toolPolicy === \"compaction-log\") {\n const compactLog = opts.mcpExtra?.compact_log;\n return compactLog ? { compact_log: compactLog } : {};\n }\n if (opts.sessionType === \"cron\") {\n if (!opts.topicId) throw new Error(\"getMcpServersForQuery: cron sessionType requires topicId\");\n return getCronMcpServers({\n userId: opts.userId || \"local\",\n session: opts.session || \"cron\",\n topicId: opts.topicId,\n queryId: opts.queryId,\n wikiTopicId: opts.wikiTopicId,\n agent: opts.agent,\n cwd: opts.cwd,\n model: opts.model,\n currentUserPrompt: opts.prompt,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n visualTools: opts.visualTools,\n fileDeliveryTools: opts.fileDeliveryTools,\n });\n }\n if (opts.sessionType === \"dm\" || opts.sessionType === \"ephemeral\") {\n return getDmMcpServers({\n userId: opts.userId || \"local\",\n agent: opts.agent,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n });\n }\n if (opts.sessionType === \"manager\") {\n return getManagerMcpServers({\n userId: opts.userId || \"local\",\n session: opts.session,\n topicId: opts.topicId,\n queryId: opts.queryId,\n wikiTopicId: opts.wikiTopicId,\n agent: opts.agent,\n cwd: opts.cwd,\n model: opts.model,\n currentUserPrompt: opts.prompt,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n autoContinue: opts.autoContinue,\n visualTools: opts.visualTools,\n fileDeliveryTools: opts.fileDeliveryTools,\n });\n }\n return getForumMcpServers({\n userId: opts.userId || \"local\",\n vaultUserId: opts.vaultUserId,\n session: opts.session || \"default\",\n topicId: opts.topicId,\n subagentParentTopicId: opts.subagentParentTopicId,\n queryId: opts.queryId,\n wikiTopicId: opts.wikiTopicId,\n agent: opts.agent,\n cwd: opts.cwd,\n model: opts.model,\n currentUserPrompt: opts.prompt,\n playwrightPort: opts.playwrightPort,\n playwrightCapability: opts.playwrightCapability,\n bgBashPort: opts.bgBashPort,\n autoContinue: opts.autoContinue,\n visualTools: opts.visualTools,\n fileDeliveryTools: opts.fileDeliveryTools,\n depth: opts.depth,\n enabled: opts.mcpEnabled,\n extra: opts.mcpExtra,\n silent: opts.silent,\n peerBridge: opts.peerBridge,\n });\n}\n",
26
- "import { chmodSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DATA_DIR, VAULT_MASTER_KEY } from \"#platform/config\";\nimport { Database } from \"#storage/sqlite\";\nimport { decryptVaultValue, encryptVaultValue } from \"#storage/vault-crypto\";\n\nexport type VaultDatabase = Pick<InstanceType<typeof Database>, \"exec\" | \"prepare\">;\n\nexport interface VaultStorageOptions {\n database?: VaultDatabase;\n dataDir?: string;\n masterKey?: string;\n}\n\nlet vaultDb: VaultDatabase | undefined;\nlet vaultMasterKey = VAULT_MASTER_KEY;\n\nfunction initializeVaultDatabase(database: VaultDatabase): void {\n database.exec(\"PRAGMA journal_mode = WAL\");\n database.exec(\"PRAGMA busy_timeout = 5000\");\n database.exec(`\n CREATE TABLE IF NOT EXISTS vault (\n user_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n PRIMARY KEY (user_id, key)\n )\n `);\n\n // Migrate legacy schema where user_id was INTEGER (Telegram numeric ids only).\n // The Otium API authenticates with string user ids (\"otium-user-…\"), so user_id\n // is now TEXT for every channel. Rebuild + CAST existing rows so old Telegram\n // secrets survive; idempotent (no-op once user_id is already TEXT).\n {\n const cols = database.prepare(\"PRAGMA table_info(vault)\").all() as {\n name: string;\n type: string;\n }[];\n const uid = cols.find((c) => c.name === \"user_id\");\n if (uid && uid.type.toUpperCase() === \"INTEGER\") {\n database.exec(\"BEGIN\");\n database.exec(`\n CREATE TABLE vault_migrated (\n user_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n PRIMARY KEY (user_id, key)\n )\n `);\n database.exec(\n \"INSERT INTO vault_migrated SELECT CAST(user_id AS TEXT), key, value, description FROM vault\",\n );\n database.exec(\"DROP TABLE vault\");\n database.exec(\"ALTER TABLE vault_migrated RENAME TO vault\");\n database.exec(\"COMMIT\");\n }\n }\n}\n\nfunction openVaultDatabase(dataDir: string): VaultDatabase {\n const vaultDir = join(dataDir, \"vault\");\n const path = join(vaultDir, \"vault.db\");\n mkdirSync(vaultDir, { recursive: true, mode: 0o700 });\n const database = new Database(path, { create: true });\n // Defense in depth: the database and its sidecars are owner-only, while each\n // value is also encrypted independently by vault-crypto.\n chmodSync(path, 0o600);\n initializeVaultDatabase(database);\n return database;\n}\n\nfunction activeVaultDatabase(): VaultDatabase {\n if (!vaultDb) vaultDb = openVaultDatabase(DATA_DIR);\n return vaultDb;\n}\n\n/** Configure process-wide vault storage during embedding-host bootstrap. */\nexport function configureVaultStorage(options: VaultStorageOptions): () => void {\n if (options.database && options.dataDir) {\n throw new Error(\"configureVaultStorage accepts either database or dataDir, not both\");\n }\n const previousDb = vaultDb;\n const previousMasterKey = vaultMasterKey;\n const configuredDb = options.database ?? openVaultDatabase(options.dataDir ?? DATA_DIR);\n if (options.database) initializeVaultDatabase(configuredDb);\n vaultDb = configuredDb;\n vaultMasterKey = options.masterKey ?? VAULT_MASTER_KEY;\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n if (!options.database && \"close\" in configuredDb) {\n (configuredDb as VaultDatabase & { close(): void }).close();\n }\n vaultDb = previousDb;\n vaultMasterKey = previousMasterKey;\n };\n}\n\nexport interface VaultEntry {\n key: string;\n description: string;\n}\n\nexport interface VaultEntryWithValue extends VaultEntry {\n value: string;\n}\n\nexport const VAULT_KEY_PATTERN = /^[A-Z][A-Z0-9_]{0,127}$/;\nexport const VAULT_VALUE_MIN_BYTES = 4;\nexport const VAULT_VALUE_MAX_BYTES = 64 * 1024;\nexport const VAULT_DESCRIPTION_MAX_LENGTH = 500;\n\nexport function normalizeVaultKey(key: string): string {\n return key.trim().toUpperCase();\n}\n\nexport function validateVaultKey(key: string): boolean {\n return VAULT_KEY_PATTERN.test(normalizeVaultKey(key));\n}\n\nfunction decryptRow(userId: string, key: string, storedValue: string): string {\n const database = activeVaultDatabase();\n const decoded = decryptVaultValue(userId, key, storedValue, vaultMasterKey);\n if (decoded.legacyPlaintext) {\n database\n .prepare(\"UPDATE vault SET value = ? WHERE user_id = ? AND key = ? AND value = ?\")\n .run(encryptVaultValue(userId, key, decoded.value, vaultMasterKey), userId, key, storedValue);\n }\n return decoded.value;\n}\n\nexport function vaultListWithValues(userId: string): VaultEntryWithValue[] {\n const rows = activeVaultDatabase()\n .prepare(\"SELECT key, description, value FROM vault WHERE user_id = ? ORDER BY key\")\n .all(userId) as VaultEntryWithValue[];\n return rows.map((row) => ({\n key: row.key,\n description: row.description,\n value: decryptRow(userId, row.key, row.value),\n }));\n}\n\n/**\n * Return only rows that can still be authenticated with the active master key.\n *\n * This is intentionally limited to redaction indexes: one damaged credential\n * must not disable unrelated tools, while direct access to that credential\n * continues to fail closed through vaultGetValue().\n */\nexport function vaultListDecryptableValues(userId: string): VaultEntryWithValue[] {\n const rows = activeVaultDatabase()\n .prepare(\"SELECT key, description, value FROM vault WHERE user_id = ? ORDER BY key\")\n .all(userId) as VaultEntryWithValue[];\n const entries: VaultEntryWithValue[] = [];\n for (const row of rows) {\n try {\n entries.push({\n key: row.key,\n description: row.description,\n value: decryptRow(userId, row.key, row.value),\n });\n } catch {\n // A value that cannot be authenticated cannot be exposed by substitution,\n // so there is no plaintext form available to add to the redaction index.\n }\n }\n return entries;\n}\n\nexport function vaultSet(userId: string, key: string, value: string, description = \"\"): void {\n const normalizedKey = normalizeVaultKey(key);\n activeVaultDatabase()\n .prepare(\n `INSERT INTO vault (user_id, key, value, description) VALUES (?, ?, ?, ?)\n ON CONFLICT (user_id, key) DO UPDATE\n SET value = excluded.value, description = excluded.description`,\n )\n .run(\n userId,\n normalizedKey,\n encryptVaultValue(userId, normalizedKey, value, vaultMasterKey),\n description,\n );\n}\n\nexport function vaultHasKey(userId: string, key: string): boolean {\n const row = activeVaultDatabase()\n .prepare(\"SELECT 1 FROM vault WHERE user_id = ? AND key = ?\")\n .get(userId, normalizeVaultKey(key));\n return row != null;\n}\n\nexport function vaultDel(userId: string, key: string): boolean {\n const result = activeVaultDatabase()\n .prepare(\"DELETE FROM vault WHERE user_id = ? AND key = ?\")\n .run(userId, normalizeVaultKey(key)) as { changes: number };\n return result.changes > 0;\n}\n\nexport function vaultDeleteAllForUser(userId: string): number {\n const result = activeVaultDatabase()\n .prepare(\"DELETE FROM vault WHERE user_id = ?\")\n .run(userId) as {\n changes: number;\n };\n return result.changes;\n}\n\nexport function vaultList(userId: string): VaultEntry[] {\n return activeVaultDatabase()\n .prepare(\"SELECT key, description FROM vault WHERE user_id = ? ORDER BY key\")\n .all(userId) as VaultEntry[];\n}\n\nexport function vaultGetValue(userId: string, key: string): string | undefined {\n const normalizedKey = normalizeVaultKey(key);\n const row = activeVaultDatabase()\n .prepare(\"SELECT key, value FROM vault WHERE user_id = ? AND key = ?\")\n .get(userId, normalizedKey) as { key: string; value: string } | undefined;\n return row ? decryptRow(userId, row.key, row.value) : undefined;\n}\n\nexport interface VaultSubstitutionResult {\n text: string;\n usedKeys: string[];\n}\n\n/** Replace {{KEY}} placeholders and report which credentials were consumed. */\nexport function vaultSubstituteDetailed(userId: string, text: string): VaultSubstitutionResult {\n const entries = new Map<string, string | undefined>();\n const usedKeys = new Set<string>();\n const substituted = text.replace(/\\{\\{([^}]+)\\}\\}/g, (match, rawKey: string) => {\n const key = normalizeVaultKey(rawKey);\n if (!entries.has(key)) entries.set(key, vaultGetValue(userId, key));\n const value = entries.get(key);\n if (value === undefined) return match;\n usedKeys.add(key);\n return value;\n });\n return { text: substituted, usedKeys: [...usedKeys] };\n}\n\n/** Detect real {{KEY}} references without decrypting any Vault values. */\nexport function valueReferencesVaultKey(userId: string, value: unknown): boolean {\n const keys = new Set(vaultList(userId).map((entry) => entry.key));\n const visit = (candidate: unknown): boolean => {\n if (typeof candidate === \"string\") {\n for (const match of candidate.matchAll(/\\{\\{([^}]+)\\}\\}/g)) {\n if (keys.has(normalizeVaultKey(match[1] ?? \"\"))) return true;\n }\n return false;\n }\n if (Array.isArray(candidate)) return candidate.some(visit);\n if (candidate && typeof candidate === \"object\") {\n return Object.values(candidate as Record<string, unknown>).some(visit);\n }\n return false;\n };\n return visit(value);\n}\n\nfunction encodedSecretForms(value: string): string[] {\n const forms = new Set<string>([\n value,\n encodeURIComponent(value),\n Buffer.from(value, \"utf8\").toString(\"base64\"),\n Buffer.from(value, \"utf8\").toString(\"base64url\"),\n Buffer.from(value, \"utf8\").toString(\"hex\"),\n ]);\n forms.delete(\"\");\n return [...forms].sort((a, b) => b.length - a.length);\n}\n\n/** Scrub raw and common encoded forms before tool output reaches a model. */\nexport function redactVaultSecrets(userId: string, text: string): string {\n const candidates = vaultListDecryptableValues(userId)\n .flatMap((entry) => encodedSecretForms(entry.value).map((form) => ({ form, key: entry.key })))\n .sort((a, b) => b.form.length - a.form.length || a.key.localeCompare(b.key));\n if (candidates.length === 0) return text;\n const candidatesByFirstCharacter = new Map<string, typeof candidates>();\n for (const candidate of candidates) {\n const first = candidate.form[0];\n if (!first) continue;\n const bucket = candidatesByFirstCharacter.get(first) ?? [];\n bucket.push(candidate);\n candidatesByFirstCharacter.set(first, bucket);\n }\n\n let redacted = \"\";\n let offset = 0;\n while (offset < text.length) {\n const match = candidatesByFirstCharacter\n .get(text[offset] ?? \"\")\n ?.find((candidate) => text.startsWith(candidate.form, offset));\n if (!match) {\n redacted += text[offset];\n offset += 1;\n continue;\n }\n redacted += `[REDACTED:${match.key}]`;\n offset += match.form.length;\n }\n return redacted;\n}\n",
26
+ "import { chmodSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { VAULT_MASTER_KEY } from \"#platform/config\";\nimport { Database } from \"#storage/sqlite\";\nimport { resolveStorageDataDir } from \"#storage/storage-host\";\nimport { decryptVaultValue, encryptVaultValue } from \"#storage/vault-crypto\";\n\nexport type VaultDatabase = Pick<InstanceType<typeof Database>, \"exec\" | \"prepare\">;\n\nexport interface VaultStorageOptions {\n database?: VaultDatabase;\n dataDir?: string;\n masterKey?: string;\n}\n\nlet vaultDb: VaultDatabase | undefined;\nlet vaultMasterKey = VAULT_MASTER_KEY;\n\nfunction initializeVaultDatabase(database: VaultDatabase): void {\n database.exec(\"PRAGMA journal_mode = WAL\");\n database.exec(\"PRAGMA busy_timeout = 5000\");\n database.exec(`\n CREATE TABLE IF NOT EXISTS vault (\n user_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n PRIMARY KEY (user_id, key)\n )\n `);\n\n // Migrate legacy schema where user_id was INTEGER (Telegram numeric ids only).\n // The Otium API authenticates with string user ids (\"otium-user-…\"), so user_id\n // is now TEXT for every channel. Rebuild + CAST existing rows so old Telegram\n // secrets survive; idempotent (no-op once user_id is already TEXT).\n {\n const cols = database.prepare(\"PRAGMA table_info(vault)\").all() as {\n name: string;\n type: string;\n }[];\n const uid = cols.find((c) => c.name === \"user_id\");\n if (uid && uid.type.toUpperCase() === \"INTEGER\") {\n database.exec(\"BEGIN\");\n database.exec(`\n CREATE TABLE vault_migrated (\n user_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n PRIMARY KEY (user_id, key)\n )\n `);\n database.exec(\n \"INSERT INTO vault_migrated SELECT CAST(user_id AS TEXT), key, value, description FROM vault\",\n );\n database.exec(\"DROP TABLE vault\");\n database.exec(\"ALTER TABLE vault_migrated RENAME TO vault\");\n database.exec(\"COMMIT\");\n }\n }\n}\n\nfunction openVaultDatabase(dataDir: string): VaultDatabase {\n const vaultDir = join(dataDir, \"vault\");\n const path = join(vaultDir, \"vault.db\");\n mkdirSync(vaultDir, { recursive: true, mode: 0o700 });\n const database = new Database(path, { create: true });\n // Defense in depth: the database and its sidecars are owner-only, while each\n // value is also encrypted independently by vault-crypto.\n chmodSync(path, 0o600);\n initializeVaultDatabase(database);\n return database;\n}\n\nfunction activeVaultDatabase(): VaultDatabase {\n if (!vaultDb) {\n // `resolveStorageDataDir()`, not the import-time `DATA_DIR` constant: an\n // embedding host configures its data directory during bootstrap, and any\n // vault access that happens before `configureVaultStorage()` runs would\n // otherwise pin the vault to Negotium's own state directory for the life of\n // the process — silently, since both paths are valid and writable.\n vaultDb = openVaultDatabase(resolveStorageDataDir());\n }\n return vaultDb;\n}\n\n/** Configure process-wide vault storage during embedding-host bootstrap. */\nexport function configureVaultStorage(options: VaultStorageOptions): () => void {\n if (options.database && options.dataDir) {\n throw new Error(\"configureVaultStorage accepts either database or dataDir, not both\");\n }\n const previousDb = vaultDb;\n const previousMasterKey = vaultMasterKey;\n const configuredDb =\n options.database ?? openVaultDatabase(options.dataDir ?? resolveStorageDataDir());\n if (options.database) initializeVaultDatabase(configuredDb);\n vaultDb = configuredDb;\n vaultMasterKey = options.masterKey ?? VAULT_MASTER_KEY;\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n if (!options.database && \"close\" in configuredDb) {\n (configuredDb as VaultDatabase & { close(): void }).close();\n }\n vaultDb = previousDb;\n vaultMasterKey = previousMasterKey;\n };\n}\n\nexport interface VaultEntry {\n key: string;\n description: string;\n}\n\nexport interface VaultEntryWithValue extends VaultEntry {\n value: string;\n}\n\nexport const VAULT_KEY_PATTERN = /^[A-Z][A-Z0-9_]{0,127}$/;\nexport const VAULT_VALUE_MIN_BYTES = 4;\nexport const VAULT_VALUE_MAX_BYTES = 64 * 1024;\nexport const VAULT_DESCRIPTION_MAX_LENGTH = 500;\n\nexport function normalizeVaultKey(key: string): string {\n return key.trim().toUpperCase();\n}\n\nexport function validateVaultKey(key: string): boolean {\n return VAULT_KEY_PATTERN.test(normalizeVaultKey(key));\n}\n\nfunction decryptRow(userId: string, key: string, storedValue: string): string {\n const database = activeVaultDatabase();\n const decoded = decryptVaultValue(userId, key, storedValue, vaultMasterKey);\n if (decoded.legacyPlaintext) {\n database\n .prepare(\"UPDATE vault SET value = ? WHERE user_id = ? AND key = ? AND value = ?\")\n .run(encryptVaultValue(userId, key, decoded.value, vaultMasterKey), userId, key, storedValue);\n }\n return decoded.value;\n}\n\nexport function vaultListWithValues(userId: string): VaultEntryWithValue[] {\n const rows = activeVaultDatabase()\n .prepare(\"SELECT key, description, value FROM vault WHERE user_id = ? ORDER BY key\")\n .all(userId) as VaultEntryWithValue[];\n return rows.map((row) => ({\n key: row.key,\n description: row.description,\n value: decryptRow(userId, row.key, row.value),\n }));\n}\n\n/**\n * Return only rows that can still be authenticated with the active master key.\n *\n * This is intentionally limited to redaction indexes: one damaged credential\n * must not disable unrelated tools, while direct access to that credential\n * continues to fail closed through vaultGetValue().\n */\nexport function vaultListDecryptableValues(userId: string): VaultEntryWithValue[] {\n const rows = activeVaultDatabase()\n .prepare(\"SELECT key, description, value FROM vault WHERE user_id = ? ORDER BY key\")\n .all(userId) as VaultEntryWithValue[];\n const entries: VaultEntryWithValue[] = [];\n for (const row of rows) {\n try {\n entries.push({\n key: row.key,\n description: row.description,\n value: decryptRow(userId, row.key, row.value),\n });\n } catch {\n // A value that cannot be authenticated cannot be exposed by substitution,\n // so there is no plaintext form available to add to the redaction index.\n }\n }\n return entries;\n}\n\nexport function vaultSet(userId: string, key: string, value: string, description = \"\"): void {\n const normalizedKey = normalizeVaultKey(key);\n activeVaultDatabase()\n .prepare(\n `INSERT INTO vault (user_id, key, value, description) VALUES (?, ?, ?, ?)\n ON CONFLICT (user_id, key) DO UPDATE\n SET value = excluded.value, description = excluded.description`,\n )\n .run(\n userId,\n normalizedKey,\n encryptVaultValue(userId, normalizedKey, value, vaultMasterKey),\n description,\n );\n}\n\nexport function vaultHasKey(userId: string, key: string): boolean {\n const row = activeVaultDatabase()\n .prepare(\"SELECT 1 FROM vault WHERE user_id = ? AND key = ?\")\n .get(userId, normalizeVaultKey(key));\n return row != null;\n}\n\nexport function vaultDel(userId: string, key: string): boolean {\n const result = activeVaultDatabase()\n .prepare(\"DELETE FROM vault WHERE user_id = ? AND key = ?\")\n .run(userId, normalizeVaultKey(key)) as { changes: number };\n return result.changes > 0;\n}\n\nexport function vaultDeleteAllForUser(userId: string): number {\n const result = activeVaultDatabase()\n .prepare(\"DELETE FROM vault WHERE user_id = ?\")\n .run(userId) as {\n changes: number;\n };\n return result.changes;\n}\n\nexport function vaultList(userId: string): VaultEntry[] {\n return activeVaultDatabase()\n .prepare(\"SELECT key, description FROM vault WHERE user_id = ? ORDER BY key\")\n .all(userId) as VaultEntry[];\n}\n\nexport function vaultGetValue(userId: string, key: string): string | undefined {\n const normalizedKey = normalizeVaultKey(key);\n const row = activeVaultDatabase()\n .prepare(\"SELECT key, value FROM vault WHERE user_id = ? AND key = ?\")\n .get(userId, normalizedKey) as { key: string; value: string } | undefined;\n return row ? decryptRow(userId, row.key, row.value) : undefined;\n}\n\nexport interface VaultSubstitutionResult {\n text: string;\n usedKeys: string[];\n}\n\n/** Replace {{KEY}} placeholders and report which credentials were consumed. */\nexport function vaultSubstituteDetailed(userId: string, text: string): VaultSubstitutionResult {\n const entries = new Map<string, string | undefined>();\n const usedKeys = new Set<string>();\n const substituted = text.replace(/\\{\\{([^}]+)\\}\\}/g, (match, rawKey: string) => {\n const key = normalizeVaultKey(rawKey);\n if (!entries.has(key)) entries.set(key, vaultGetValue(userId, key));\n const value = entries.get(key);\n if (value === undefined) return match;\n usedKeys.add(key);\n return value;\n });\n return { text: substituted, usedKeys: [...usedKeys] };\n}\n\n/** Detect real {{KEY}} references without decrypting any Vault values. */\nexport function valueReferencesVaultKey(userId: string, value: unknown): boolean {\n const keys = new Set(vaultList(userId).map((entry) => entry.key));\n const visit = (candidate: unknown): boolean => {\n if (typeof candidate === \"string\") {\n for (const match of candidate.matchAll(/\\{\\{([^}]+)\\}\\}/g)) {\n if (keys.has(normalizeVaultKey(match[1] ?? \"\"))) return true;\n }\n return false;\n }\n if (Array.isArray(candidate)) return candidate.some(visit);\n if (candidate && typeof candidate === \"object\") {\n return Object.values(candidate as Record<string, unknown>).some(visit);\n }\n return false;\n };\n return visit(value);\n}\n\nfunction encodedSecretForms(value: string): string[] {\n const forms = new Set<string>([\n value,\n encodeURIComponent(value),\n Buffer.from(value, \"utf8\").toString(\"base64\"),\n Buffer.from(value, \"utf8\").toString(\"base64url\"),\n Buffer.from(value, \"utf8\").toString(\"hex\"),\n ]);\n forms.delete(\"\");\n return [...forms].sort((a, b) => b.length - a.length);\n}\n\n/** Scrub raw and common encoded forms before tool output reaches a model. */\nexport function redactVaultSecrets(userId: string, text: string): string {\n const candidates = vaultListDecryptableValues(userId)\n .flatMap((entry) => encodedSecretForms(entry.value).map((form) => ({ form, key: entry.key })))\n .sort((a, b) => b.form.length - a.form.length || a.key.localeCompare(b.key));\n if (candidates.length === 0) return text;\n const candidatesByFirstCharacter = new Map<string, typeof candidates>();\n for (const candidate of candidates) {\n const first = candidate.form[0];\n if (!first) continue;\n const bucket = candidatesByFirstCharacter.get(first) ?? [];\n bucket.push(candidate);\n candidatesByFirstCharacter.set(first, bucket);\n }\n\n let redacted = \"\";\n let offset = 0;\n while (offset < text.length) {\n const match = candidatesByFirstCharacter\n .get(text[offset] ?? \"\")\n ?.find((candidate) => text.startsWith(candidate.form, offset));\n if (!match) {\n redacted += text[offset];\n offset += 1;\n continue;\n }\n redacted += `[REDACTED:${match.key}]`;\n offset += match.form.length;\n }\n return redacted;\n}\n",
27
27
  "// Runtime-adaptive SQLite façade.\n//\n// Why this exists: Otium normally runs on bun and uses `bun:sqlite` (native,\n// fast, zero-build). But the `codex` agent's MCP servers must run on pure node\n// — codex 0.135's rmcp stdio client can't handshake with bun-spawned servers\n// (see serverLaunch in platform/mcp-config.ts). `bun:sqlite` doesn't exist\n// under node, so any MCP server that touches the DB would crash on import.\n//\n// This module picks the backend at runtime and re-exports it as `Database`:\n// - under bun → the real `bun:sqlite` Database (unchanged behavior)\n// - under node → a thin shim over node:sqlite's DatabaseSync exposing the\n// exact subset Otium uses: new Database(path, {readonly?,create?}),\n// .query()/.prepare() → statement, .exec(), .run(), .transaction(fn),\n// .close(); statements support positional `?` params via .run()/.get()/\n// .all(). (No named-object params / .values()/.iterate()/.as() are used in\n// this codebase, so the shim intentionally omits them.)\n//\n// The TYPE of the exported `Database` is bun:sqlite's own class type (imported\n// type-only, so it's erased at runtime and never resolved under node). That\n// keeps every existing call site — including generic `.query<Row, Params>()`\n// usages — type-checking exactly as before with zero changes.\n//\n// The bun branch uses a dynamic import so node never resolves the `bun:sqlite`\n// specifier (dead code under node), and the node branch's `node:sqlite` import\n// never runs under bun.\n\nimport type { Database as BunDatabase } from \"bun:sqlite\";\n\n// `mock.module()` can replace the Bun global while a test graph is being\n// evaluated. The runtime version flag is stable and is also the documented\n// cross-runtime discriminator.\nconst isBun = typeof process.versions.bun === \"string\";\n\ntype DatabaseCtor = typeof BunDatabase;\n\nlet Database: DatabaseCtor;\n\nif (isBun) {\n ({ Database } = await import(\"bun:sqlite\"));\n} else {\n // node:sqlite has no type declarations under our tsconfig (`types: bun-types`\n // only), and `bun-types` doesn't ship them — so type the dynamic import\n // locally and use a `string` specifier to keep tsc from trying to resolve it.\n type NodeStatement = {\n run(...params: unknown[]): unknown;\n get(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n };\n type NodeDatabaseSync = {\n prepare(sql: string): NodeStatement;\n exec(sql: string): void;\n close(): void;\n };\n type NodeSqliteModule = {\n DatabaseSync: new (path: string, options?: { readOnly?: boolean }) => NodeDatabaseSync;\n };\n // Keep Bun's resolver from eagerly resolving the Node-only builtin even\n // though this branch is dead there (notably under `bun test` + mock.module).\n const nodeSqliteSpecifier = [\"node\", \"sqlite\"].join(\":\");\n const { DatabaseSync } = (await import(nodeSqliteSpecifier)) as NodeSqliteModule;\n\n type DbOptions = { readonly?: boolean; create?: boolean };\n\n class NodeDatabase {\n #db: NodeDatabaseSync;\n\n constructor(path: string, options: DbOptions = {}) {\n // node:sqlite opens read-write and creates-if-missing by default, which\n // matches bun's `{create:true}`. For readonly we must not create.\n this.#db = options.readonly\n ? new DatabaseSync(path, { readOnly: true })\n : new DatabaseSync(path);\n }\n\n query(sql: string) {\n return this.#db.prepare(sql);\n }\n\n prepare(sql: string) {\n return this.#db.prepare(sql);\n }\n\n exec(sql: string): void {\n this.#db.exec(sql);\n }\n\n run(sql: string, ...params: unknown[]) {\n return this.#db.prepare(sql).run(...params);\n }\n\n transaction<Args extends unknown[], R>(fn: (...args: Args) => R): (...args: Args) => R {\n // bun's db.transaction(fn) returns a function that runs fn inside a\n // transaction when called. node:sqlite has no helper, so emulate with\n // BEGIN/COMMIT/ROLLBACK. It also exposes deferred/immediate/exclusive\n // variants; mirror those so Node-launched MCP servers can share call\n // sites with Bun.\n const run =\n (begin: \"BEGIN\" | \"BEGIN DEFERRED\" | \"BEGIN IMMEDIATE\" | \"BEGIN EXCLUSIVE\") =>\n (...args: Args): R => {\n this.#db.exec(begin);\n try {\n const result = fn(...args);\n this.#db.exec(\"COMMIT\");\n return result;\n } catch (err) {\n this.#db.exec(\"ROLLBACK\");\n throw err;\n }\n };\n const tx = run(\"BEGIN\") as ((...args: Args) => R) & {\n deferred: (...args: Args) => R;\n immediate: (...args: Args) => R;\n exclusive: (...args: Args) => R;\n };\n tx.deferred = run(\"BEGIN DEFERRED\");\n tx.immediate = run(\"BEGIN IMMEDIATE\");\n tx.exclusive = run(\"BEGIN EXCLUSIVE\");\n return tx;\n }\n\n close(): void {\n this.#db.close();\n }\n }\n\n Database = NodeDatabase as unknown as DatabaseCtor;\n}\n\nexport { Database };\n",
28
+ "import { mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { Database } from \"#storage/sqlite\";\nimport type { StorageDatabase, StorageHostConfig } from \"#storage/storage-contract\";\n\nexport type {\n StorageDatabase,\n StorageDatabaseAdapter,\n StorageDatabaseInput,\n StorageHostConfig,\n StorageHostOptions,\n StorageStatement,\n StorageTransaction,\n} from \"#storage/storage-contract\";\n\ntype InternalStorageDatabase = InstanceType<typeof Database>;\ntype OwnedStorageDatabase = InternalStorageDatabase & { close(): void };\n\ninterface StorageHostFrame {\n active: boolean;\n patch: Readonly<StorageHostConfig>;\n}\n\ntype StorageSchemaInitializer = (database: InternalStorageDatabase) => void;\ninterface RegisteredSchemaInitializer {\n initialize: StorageSchemaInitializer;\n priority: number;\n}\n\ninterface StorageHostState {\n configuredHost: Readonly<StorageHostConfig>;\n fallbackDatabase: OwnedStorageDatabase | null;\n fallbackDatabasePath: string | null;\n frames: StorageHostFrame[];\n schemaInitializers: RegisteredSchemaInitializer[];\n initializedSchemas: WeakMap<InternalStorageDatabase, Set<StorageSchemaInitializer>>;\n initializingDatabases: WeakSet<InternalStorageDatabase>;\n}\n\n/**\n * Which database an embedded Negotium uses is a property of the *process*, so\n * the state deciding it is keyed off a registered symbol rather than held in\n * module scope.\n *\n * Module scope would be equivalent only if every caller resolved to the same\n * module instance, and in the published package they do not:\n * `build-negotium-package.ts` emits most public entrypoints as independent\n * graphs, so each gets a private copy of this file. A host that configured\n * `negotium/storage` therefore left `negotium/agent-helpers` unconfigured, and\n * that copy opened a second database under the default state directory — with\n * no error, since both files are valid and writable.\n *\n * Merging those entrypoints into one graph looks tidier and does cut ~3MB from\n * `dist`, but Bun 1.2.15 (the pinned version) emits a shared chunk's export\n * list twice and the result is invalid ESM — \"Cannot export a duplicate name\".\n * That is bundler output with no counterpart in this source, so there is\n * nothing to de-duplicate here; it is fixed in Bun 1.3.14. Until the floor\n * moves, correctness cannot depend on how the package is chunked.\n */\nconst STORAGE_HOST_STATE = Symbol.for(\"negotium.storage-host.state.v1\");\n\nfunction storageState(): StorageHostState {\n const holder = globalThis as typeof globalThis & { [STORAGE_HOST_STATE]?: StorageHostState };\n const existing = holder[STORAGE_HOST_STATE];\n if (existing) return existing;\n const created: StorageHostState = {\n configuredHost: {},\n fallbackDatabase: null,\n fallbackDatabasePath: null,\n frames: [],\n schemaInitializers: [],\n initializedSchemas: new WeakMap(),\n initializingDatabases: new WeakSet(),\n };\n Object.defineProperty(holder, STORAGE_HOST_STATE, {\n value: created,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n return created;\n}\n\nfunction envPath(name: string, fallback: string): string {\n const value = process.env[name]?.trim();\n return resolve(value || fallback);\n}\n\nfunction defaultStateDir(): string {\n return envPath(\"NEGOTIUM_STATE_DIR\", join(homedir(), \".negotium\"));\n}\n\nfunction defaultDataDir(): string {\n return envPath(\"NEGOTIUM_DATA_DIR\", join(defaultStateDir(), \"data\"));\n}\n\nfunction defaultLogDir(): string {\n return envPath(\"NEGOTIUM_LOG_DIR\", join(defaultStateDir(), \"logs\"));\n}\n\nfunction defaultWorkspaceDir(): string {\n return envPath(\"NEGOTIUM_WORKSPACE_DIR\", join(defaultStateDir(), \"workspace\"));\n}\n\nfunction defaultSessionAsksDir(): string {\n const runDir = envPath(\"NEGOTIUM_RUN_DIR\", join(defaultStateDir(), \"runtime\"));\n return join(runDir, \"session-asks\");\n}\n\nfunction defaultSessionsDatabasePath(): string {\n return envPath(\"SESSIONS_DB_PATH\", join(resolveStorageDataDir(), \"sessions.db\"));\n}\n\nconst SQLITE_INIT_RETRY_MS = 25;\nconst SQLITE_INIT_TIMEOUT_MS = 5_000;\nconst SQLITE_INIT_SLEEP = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));\n\nfunction isSqliteBusy(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /database is (?:locked|busy)|SQLITE_(?:BUSY|LOCKED)/i.test(message);\n}\n\nfunction execWithBusyRetry(\n database: InternalStorageDatabase,\n sql: string,\n timeoutMs = SQLITE_INIT_TIMEOUT_MS,\n): void {\n const deadline = Date.now() + timeoutMs;\n while (true) {\n try {\n database.exec(sql);\n return;\n } catch (error) {\n if (!isSqliteBusy(error) || Date.now() >= deadline) throw error;\n Atomics.wait(SQLITE_INIT_SLEEP, 0, 0, Math.min(SQLITE_INIT_RETRY_MS, deadline - Date.now()));\n }\n }\n}\n\nexport function initializeDatabase(database: InternalStorageDatabase): void {\n // busy_timeout FIRST. Switching to WAL needs a brief exclusive lock, so when\n // two processes open the same database at the same moment — the node daemon\n // and an adapter, or two MCP servers — one of them hits SQLITE_BUSY. With the\n // timeout configured afterwards there was no retry budget in effect for the\n // statement that needed it most. Older Bun releases can still surface\n // SQLITE_BUSY immediately for journal_mode, so keep a bounded host-level\n // retry around that one exclusive transition as well.\n database.exec(\"PRAGMA busy_timeout = 5000\");\n execWithBusyRetry(database, \"PRAGMA journal_mode = WAL\");\n database.exec(\"PRAGMA foreign_keys = ON\");\n database.exec(\"PRAGMA wal_autocheckpoint = 1000\");\n try {\n database.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n } catch {\n // Non-fatal; a concurrent writer may hold the WAL briefly.\n }\n}\n\nfunction defaultDatabase(): InternalStorageDatabase {\n const path = defaultSessionsDatabasePath();\n const state = storageState();\n if (state.fallbackDatabase && state.fallbackDatabasePath === path) return state.fallbackDatabase;\n if (state.fallbackDatabase) state.fallbackDatabase.close();\n mkdirSync(dirname(path), { recursive: true });\n state.fallbackDatabase = new Database(path, { create: true }) as unknown as OwnedStorageDatabase;\n state.fallbackDatabasePath = path;\n initializeDatabase(state.fallbackDatabase);\n return state.fallbackDatabase;\n}\n\nexport function resolveStorageDatabase(): InternalStorageDatabase {\n return (storageState().configuredHost.database ?? defaultDatabase()) as InternalStorageDatabase;\n}\n\n/**\n * The host-injected connection, or null when Negotium owns its own store.\n *\n * Unlike {@link resolveStorageDatabase} this never opens anything. Callers that\n * manage their own short-lived connections need to know whether a host store\n * exists *before* deciding to open one by path: opening it anyway is how an\n * embedded Negotium ends up writing half its state into the host's database and\n * the other half into `~/.negotium`, with nothing reporting an error.\n */\nexport function configuredStorageDatabase(): InternalStorageDatabase | null {\n return (storageState().configuredHost.database as InternalStorageDatabase | undefined) ?? null;\n}\n\nexport function resolveStorageDataDir(): string {\n return storageState().configuredHost.dataDir ?? defaultDataDir();\n}\n\nexport function resolveStorageLogDir(): string {\n return storageState().configuredHost.logDir ?? defaultLogDir();\n}\n\nexport function resolveStorageSessionAsksDir(): string {\n return storageState().configuredHost.sessionAsksDir ?? defaultSessionAsksDir();\n}\n\nexport function resolveStorageWorkspaceDir(): string {\n return storageState().configuredHost.workspaceDir ?? defaultWorkspaceDir();\n}\n\nexport function resolveStorageSharedWikiDir(): string {\n return storageState().configuredHost.sharedWikiDir ?? join(resolveStorageWorkspaceDir(), \"wiki\");\n}\n\nexport function resolveStorageUsersLogDir(): string {\n return storageState().configuredHost.usersLogDir ?? join(resolveStorageDataDir(), \"users\");\n}\n\nconst STORAGE_PATH_KEYS = [\n \"dataDir\",\n \"logDir\",\n \"sessionAsksDir\",\n \"workspaceDir\",\n \"sharedWikiDir\",\n \"usersLogDir\",\n] as const;\n\nfunction normalizeStorageHostPatch(options: StorageHostConfig): Readonly<StorageHostConfig> {\n const patch: StorageHostConfig = {};\n if (options.database !== undefined) {\n options.database.exec(\"PRAGMA foreign_keys = ON\");\n patch.database = options.database;\n }\n for (const key of STORAGE_PATH_KEYS) {\n const value = options[key];\n if (value === undefined) continue;\n if (!value.trim()) throw new TypeError(`${key} must not be empty`);\n patch[key] = resolve(value);\n }\n return Object.freeze(patch);\n}\n\nfunction refreshConfiguredHost(): void {\n const state = storageState();\n state.configuredHost = Object.freeze(\n Object.assign({}, ...state.frames.filter((frame) => frame.active).map((frame) => frame.patch)),\n );\n}\n\n/**\n * Configure the process-local storage boundary for an embedding host.\n *\n * Resolution is lazy: importing `negotium/storage` never opens a database or\n * touches a filesystem path. The returned disposer restores the exact prior\n * host, which keeps tests and nested embeddings isolated.\n */\nexport function configureStorageHost(options: StorageHostConfig): () => void {\n const frame: StorageHostFrame = { active: true, patch: normalizeStorageHostPatch(options) };\n storageState().frames.push(frame);\n refreshConfiguredHost();\n return () => {\n if (!frame.active) return;\n frame.active = false;\n const frames = storageState().frames;\n const index = frames.indexOf(frame);\n if (index >= 0) frames.splice(index, 1);\n refreshConfiguredHost();\n };\n}\n\n/** Remove every configured host layer and restore standalone fallbacks. */\nexport function resetStorageHost(): void {\n const frames = storageState().frames;\n for (const frame of frames) frame.active = false;\n frames.length = 0;\n refreshConfiguredHost();\n}\n\n/** Close only Negotium's fallback connection. Injected connections are borrowed. */\nexport function closeStorageDatabase(): void {\n const state = storageState();\n if (!state.fallbackDatabase) return;\n state.fallbackDatabase.close();\n state.fallbackDatabase = null;\n state.fallbackDatabasePath = null;\n}\n\nexport function registerStorageSchemaInitializer(\n initialize: StorageSchemaInitializer,\n priority = 100,\n): void {\n const initializers = storageState().schemaInitializers;\n initializers.push({ initialize, priority });\n initializers.sort((a, b) => a.priority - b.priority);\n}\n\nexport function ensureStorageSchemas(\n database: InternalStorageDatabase = resolveStorageDatabase(),\n): void {\n const state = storageState();\n if (state.initializingDatabases.has(database)) return;\n let initialized = state.initializedSchemas.get(database);\n if (!initialized) {\n initialized = new Set();\n state.initializedSchemas.set(database, initialized);\n }\n state.initializingDatabases.add(database);\n try {\n for (const entry of state.schemaInitializers) {\n if (initialized.has(entry.initialize)) continue;\n // Mark first so a migration that calls through the public db proxy does\n // not recursively invoke itself. Remove on failure so the next call can retry.\n initialized.add(entry.initialize);\n try {\n entry.initialize(database);\n } catch (error) {\n initialized.delete(entry.initialize);\n throw error;\n }\n }\n } finally {\n state.initializingDatabases.delete(database);\n }\n}\n\n/** Stable proxy identity used by legacy imports and embedding hosts. */\nexport const internalStorageDatabase = new Proxy({} as InternalStorageDatabase, {\n get(_target, property) {\n const database = resolveStorageDatabase();\n ensureStorageSchemas(database);\n const value = Reflect.get(database as object, property, database);\n return typeof value === \"function\" ? value.bind(database) : value;\n },\n set(_target, property, value) {\n const database = resolveStorageDatabase();\n ensureStorageSchemas(database);\n return Reflect.set(database as object, property, value, database);\n },\n});\n\n/** Structurally typed view intended for embedding hosts. */\nexport const storageDatabase = internalStorageDatabase as unknown as StorageDatabase;\n",
28
29
  "import { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\n\nconst ENVELOPE_PREFIX = \"otium-vault:v1:\";\nconst IV_BYTES = 12;\nconst KEY_BYTES = 32;\n\nfunction encryptionKey(masterKey: string): Buffer {\n return createHash(\"sha256\")\n .update(\"otium-vault-value-v1\\0\", \"utf8\")\n .update(masterKey, \"utf8\")\n .digest()\n .subarray(0, KEY_BYTES);\n}\n\nfunction aad(userId: string, key: string): Buffer {\n return Buffer.from(`${userId}\\0${key.toUpperCase()}`, \"utf8\");\n}\n\nexport function isEncryptedVaultValue(value: string): boolean {\n return value.startsWith(ENVELOPE_PREFIX);\n}\n\nexport function encryptVaultValueWithKey(\n userId: string,\n key: string,\n value: string,\n masterKey: string,\n): string {\n const iv = randomBytes(IV_BYTES);\n const cipher = createCipheriv(\"aes-256-gcm\", encryptionKey(masterKey), iv);\n cipher.setAAD(aad(userId, key));\n const ciphertext = Buffer.concat([cipher.update(value, \"utf8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `${ENVELOPE_PREFIX}${iv.toString(\"base64url\")}.${ciphertext.toString(\"base64url\")}.${tag.toString(\"base64url\")}`;\n}\n\nexport function decryptVaultValueWithKey(\n userId: string,\n key: string,\n storedValue: string,\n masterKey: string,\n): { value: string; legacyPlaintext: boolean } {\n if (!isEncryptedVaultValue(storedValue)) {\n return { value: storedValue, legacyPlaintext: true };\n }\n\n const encoded = storedValue.slice(ENVELOPE_PREFIX.length);\n const [ivPart, ciphertextPart, tagPart, ...extra] = encoded.split(\".\");\n if (!ivPart || ciphertextPart === undefined || !tagPart || extra.length > 0) {\n throw new Error(\"Invalid encrypted vault value\");\n }\n\n const iv = Buffer.from(ivPart, \"base64url\");\n const ciphertext = Buffer.from(ciphertextPart, \"base64url\");\n const tag = Buffer.from(tagPart, \"base64url\");\n if (iv.length !== IV_BYTES || tag.length !== 16) {\n throw new Error(\"Invalid encrypted vault value\");\n }\n\n const decipher = createDecipheriv(\"aes-256-gcm\", encryptionKey(masterKey), iv);\n decipher.setAAD(aad(userId, key));\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return { value: plaintext.toString(\"utf8\"), legacyPlaintext: false };\n}\n",
29
30
  "import { VAULT_MASTER_KEY } from \"#platform/config\";\nimport {\n decryptVaultValueWithKey,\n encryptVaultValueWithKey,\n isEncryptedVaultValue,\n} from \"#storage/vault-crypto-core\";\n\nexport { isEncryptedVaultValue };\n\n/** Encrypt one vault row. The user/key binding prevents ciphertext row swapping. */\nexport function encryptVaultValue(\n userId: string,\n key: string,\n value: string,\n masterKey = VAULT_MASTER_KEY,\n): string {\n return encryptVaultValueWithKey(userId, key, value, masterKey);\n}\n\n/**\n * Decrypt a stored value. Plaintext rows are accepted for rolling upgrades and\n * are re-encrypted by the storage layer immediately after a successful read.\n */\nexport function decryptVaultValue(\n userId: string,\n key: string,\n storedValue: string,\n masterKey = VAULT_MASTER_KEY,\n): { value: string; legacyPlaintext: boolean } {\n return decryptVaultValueWithKey(userId, key, storedValue, masterKey);\n}\n",
30
31
  "import { FILE_TAG_REGEX } from \"#platform/config\";\nimport type { UnifiedEvent } from \"#types\";\n\n/**\n * Yield `file` events for explicit [FILE:...] tags in `text`.\n * Shared between provider implementations (claude.ts, codex.ts, maestro) so the\n * fallback tag recognition rule stays in one place.\n */\nexport function* extractFileEvents(text: string, source: string): Generator<UnifiedEvent> {\n const tagRegex = new RegExp(FILE_TAG_REGEX.source, \"gi\");\n let match: RegExpExecArray | null = tagRegex.exec(text);\n while (match !== null) {\n yield { type: \"file\", path: match[1], source, origin: \"tag\" };\n match = tagRegex.exec(text);\n }\n}\n\n/** Absolute paths referenced by explicit `[FILE:/abs/path]` tags, deduped,\n * in order of first appearance. Channel adapters use this to send produced\n * files alongside the text. */\nexport function extractFileTagPaths(text: string): string[] {\n const seen = new Set<string>();\n for (const event of extractFileEvents(text, \"tag\")) {\n if (event.type === \"file\") seen.add(event.path);\n }\n return [...seen];\n}\n\n/** Remove `[FILE:...]` tags from outbound text — the files are delivered as\n * real attachments by the channel, so the raw tags are just noise. */\nexport function stripFileTags(text: string): string {\n return text.replace(new RegExp(FILE_TAG_REGEX.source, \"gi\"), \"\").trim();\n}\n",
@@ -32,7 +33,7 @@
32
33
  "/** Default latest-request context occupancy that triggers a warning. */\nexport const DEFAULT_CONTEXT_WARNING_RATIO = 0.8;\n\n/** Provider-neutral context occupancy input for public consumers. */\nexport interface ContextOccupancy {\n contextTokens?: number | null;\n contextWindow?: number | null;\n}\n\n/** Minimal Claude request usage shape; intentionally independent of the Anthropic SDK types. */\nexport interface ClaudeRequestTokenUsage {\n input_tokens?: number | null;\n output_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n}\n\nexport interface ContextWarningTextOptions {\n topicTitle: string;\n usage: ContextOccupancy;\n /** Whether this consumer implements the compact command. Defaults to true. */\n supportsCompact?: boolean;\n compactCommand?: string;\n newCommand?: string;\n}\n\nexport interface ContextWarningOptions extends ContextWarningTextOptions {\n /** Caller-owned dedupe key, normally scoped to one user/topic session. */\n key: string;\n thresholdRatio?: number;\n}\n\n/** Caller-owned state. Create one per runtime/store boundary to avoid global key collisions. */\nexport interface ContextWarningState {\n readonly warnedKeys: Set<string>;\n}\n\nexport function createContextWarningState(\n warnedKeys: Set<string> = new Set(),\n): ContextWarningState {\n return { warnedKeys };\n}\n\n/** Latest-request context occupancy, or null when the provider did not report valid values. */\nexport function contextUsageRatio(usage: ContextOccupancy): number | null {\n const used = usage.contextTokens;\n const window = usage.contextWindow;\n if (\n used === undefined ||\n used === null ||\n window === undefined ||\n window === null ||\n !Number.isFinite(used) ||\n !Number.isFinite(window) ||\n used < 0 ||\n window <= 0\n ) {\n return null;\n }\n return used / window;\n}\n\nexport function shouldWarnForContext(\n usage: ContextOccupancy,\n thresholdRatio = DEFAULT_CONTEXT_WARNING_RATIO,\n): boolean {\n if (!Number.isFinite(thresholdRatio) || thresholdRatio < 0) return false;\n const ratio = contextUsageRatio(usage);\n return ratio !== null && ratio >= thresholdRatio;\n}\n\nexport function formatContextTokenCount(value: number): string {\n if (!Number.isFinite(value) || value < 0) return \"0K\";\n return value >= 1_000_000 ? `${(value / 1_000_000).toFixed(1)}M` : `${Math.round(value / 1000)}K`;\n}\n\n/** Build the shared warning copy while adapting command guidance to consumer capabilities. */\nexport function buildContextWarningText(options: ContextWarningTextOptions): string {\n const ratio = contextUsageRatio(options.usage) ?? 0;\n const used = options.usage.contextTokens ?? 0;\n const window = options.usage.contextWindow ?? 0;\n const compactCommand = options.compactCommand ?? \"/compact\";\n const newCommand = options.newCommand ?? \"/new\";\n const supportsCompact = options.supportsCompact ?? true;\n const guidance = supportsCompact\n ? `이 토픽에서 ${compactCommand} 를 입력하면 핵심 맥락을 요약해 이어가면서 context를 줄입니다. 완전히 새로 시작하려면 ${newCommand} 를 사용하세요.\\n\\n두 명령 모두 지금까지 주고받은 보이는 대화 내역은 그대로 유지합니다.`\n : `완전히 새 context로 시작하려면 ${newCommand} 를 사용하세요. 지금까지 주고받은 보이는 대화 내역은 그대로 유지합니다.`;\n\n return (\n `⚠️ \"${options.topicTitle}\" context가 ${Math.round(ratio * 100)}% 찼어요 ` +\n `(${formatContextTokenCount(used)} / ${formatContextTokenCount(window)} 토큰)\\n\\n` +\n guidance\n );\n}\n\n/**\n * Return and dedupe the next warning using state owned by the caller.\n * The key is marked only when the threshold is actually reached.\n */\nexport function nextContextWarning(\n state: ContextWarningState,\n options: ContextWarningOptions,\n): string | null {\n if (!shouldWarnForContext(options.usage, options.thresholdRatio)) return null;\n if (state.warnedKeys.has(options.key)) return null;\n state.warnedKeys.add(options.key);\n return buildContextWarningText(options);\n}\n\nexport function clearContextWarning(state: ContextWarningState, key: string): void {\n state.warnedKeys.delete(key);\n}\n\n/** Latest Claude request context tokens using the same fields Negotium providers receive. */\nexport function claudeRequestContextTokens(usage: ClaudeRequestTokenUsage): number | null {\n const values = [\n usage.input_tokens,\n usage.cache_creation_input_tokens,\n usage.cache_read_input_tokens,\n usage.output_tokens,\n ];\n if (values.every((value) => value === undefined || value === null)) return null;\n if (\n values.some(\n (value) => value !== undefined && value !== null && (!Number.isFinite(value) || value < 0),\n )\n ) {\n return null;\n }\n return values.reduce<number>((sum, value) => sum + (value ?? 0), 0);\n}\n",
33
34
  "import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport type {\n FileChangeItem,\n McpToolCallItem,\n ModelReasoningEffort,\n SandboxMode,\n ThreadOptions,\n} from \"@openai/codex-sdk\";\nimport { Codex } from \"@openai/codex-sdk\";\nimport {\n ensureCodexModelCache,\n writeCodexCatalogWithNativeMultiAgentDisabled,\n} from \"#agents/codex-native-multi-agent\";\nimport {\n acquireCodexSpawnLock,\n findNewCodexChildren,\n killCodexTrees,\n registerOwnedCodexPids,\n snapshotCodexChildren,\n unregisterOwnedCodexPids,\n} from \"#agents/codex-tree-kill\";\nimport {\n hostedCodexAuthFilePath,\n hostedCodexHomePath,\n hostedMcpServers,\n} from \"#agents/execution-host\";\nimport {\n type CodexTokenTotals,\n migrateCodexRolloutNativeMultiAgentMetadata,\n readCodexPatchCallIds,\n readLatestCodexContextUsage,\n readLatestCodexPatchPreview,\n readLatestCodexTokenTotals,\n} from \"#agents/rollout/codex\";\nimport { buildNumberedDiffSummary } from \"#agents/tool-format\";\nimport { extractFileEvents } from \"#media/file-events\";\nimport { errMsg } from \"#platform/error\";\nimport { logger } from \"#platform/logger\";\nimport {\n browserOwnerCapability,\n browserOwnerForContext,\n CODEX_BROWSER_CAPABILITY_ENV,\n} from \"#platform/mcp-config\";\nimport type { AgentQueryOptions, EffortLevel, UnifiedEvent } from \"#types\";\n\ntype CodexEventUsage = {\n input_tokens: number;\n output_tokens: number;\n cached_input_tokens?: number;\n cache_write_input_tokens?: number;\n};\n\nfunction sameCodexUsage(usage: CodexEventUsage, total: CodexTokenTotals): boolean {\n return (\n usage.input_tokens === total.inputTokens &&\n usage.output_tokens === total.outputTokens &&\n (usage.cached_input_tokens ?? 0) === total.cachedInputTokens &&\n (usage.cache_write_input_tokens ?? 0) === total.cacheWriteInputTokens\n );\n}\n\n/**\n * Some Codex CLI builds expose the thread-lifetime counter on turn.completed\n * despite the SDK declaring turn-local usage. Only subtract a rollout baseline\n * when the event exactly matches the rollout's cumulative counter.\n */\nexport function normalizeCodexTurnUsage(\n usage: CodexEventUsage,\n baseline: CodexTokenTotals | undefined,\n rolloutTotal: CodexTokenTotals | undefined,\n): CodexEventUsage {\n if (!baseline || !rolloutTotal || !sameCodexUsage(usage, rolloutTotal)) return usage;\n const delta = (current: number, previous: number) =>\n current >= previous ? current - previous : current;\n return {\n input_tokens: delta(rolloutTotal.inputTokens, baseline.inputTokens),\n output_tokens: delta(rolloutTotal.outputTokens, baseline.outputTokens),\n cached_input_tokens: delta(rolloutTotal.cachedInputTokens, baseline.cachedInputTokens),\n cache_write_input_tokens: delta(\n rolloutTotal.cacheWriteInputTokens,\n baseline.cacheWriteInputTokens,\n ),\n };\n}\n\n/**\n * Pass Otium's EffortLevel through to Codex's ModelReasoningEffort.\n *\n * Storage validation (`getRegistry(\"codex\").validateEffort` in the repository\n * setters) guarantees that any effort persisted on a codex topic is one of\n * codex's accepted set (`low | medium | high | xhigh`), so the SDK shape and\n * the stored shape are identical for codex topics. A `max` or `minimal`\n * reaching this function means storage validation was bypassed — we throw\n * instead of silently demoting so the bug surfaces rather than masking itself.\n */\nfunction mapEffort(effort?: EffortLevel): ModelReasoningEffort | undefined {\n if (!effort) return undefined;\n if (effort === \"max\" || (effort as string) === \"minimal\") {\n throw new Error(\n `codexProvider received effort='${effort}', which codex does not support — storage validation was bypassed`,\n );\n }\n return effort as ModelReasoningEffort;\n}\n\n/**\n * Convert Otium's mcp-config output (Claude SDK shape) to Codex's\n * `config.mcp_servers` shape. Codex supports two transports:\n * - stdio: `{ command, args?, env? }`\n * - streamable HTTP: `{ url }` (verified via `codex mcp add --url`)\n *\n * Entries with the SSE transport shape (`{ type: \"sse\", url }`) are dropped:\n * codex doesn't speak SSE. Callers must produce the streamable HTTP shape\n * for codex by passing `agent: \"codex\"` into the `playwright.build()` arm\n * in `mcp-config.ts` (which switches `/sse` → `/mcp`).\n */\ntype CodexMcpTimeouts = {\n enabled?: boolean;\n startup_timeout_sec?: number;\n tool_timeout_sec?: number;\n};\ntype CodexStdioServer = {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n} & CodexMcpTimeouts;\ntype CodexHttpServer = {\n url: string;\n http_headers?: Record<string, string>;\n env_http_headers?: Record<string, string>;\n} & CodexMcpTimeouts;\ntype CodexMcpServer = CodexStdioServer | CodexHttpServer;\n\nconst CODEX_MCP_SERVER_NAME_OVERRIDES: Record<string, string> = {\n // Codex merges per-turn `--config mcp_servers.<name>.*` overrides with the\n // user's global ~/.codex/config.toml. `playwright` is a common global stdio\n // server name, and adding Otium's per-topic HTTP `url` to that same table\n // makes Codex fail config parsing with \"url is not supported for stdio\".\n playwright: \"otium_playwright\",\n};\n\nfunction codexMcpServerName(name: string): string {\n return CODEX_MCP_SERVER_NAME_OVERRIDES[name] ?? name;\n}\n\nfunction globalCodexMcpServerNames(authFilePath: string): string[] {\n const configPath = join(dirname(authFilePath), \"config.toml\");\n if (!existsSync(configPath)) return [];\n try {\n const names = new Set<string>();\n for (const line of readFileSync(configPath, \"utf8\").split(\"\\n\")) {\n const match = line.match(\n /^\\s*\\[\\s*mcp_servers\\.((?:\"(?:\\\\.|[^\"])*\")|(?:'[^']*')|[^.\\]\\s]+)(?:[.\\]])/,\n );\n const raw = match?.[1];\n if (!raw) continue;\n if (raw.startsWith('\"')) {\n try {\n names.add(JSON.parse(raw));\n } catch {\n // Ignore malformed TOML; Codex itself will report the config error.\n }\n } else if (raw.startsWith(\"'\")) {\n names.add(raw.slice(1, -1));\n } else {\n names.add(raw);\n }\n }\n return [...names];\n } catch (error) {\n logger.warn({ err: error, configPath }, \"codexProvider: failed to inspect global MCP config\");\n return [];\n }\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number.parseInt(value, 10);\n return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction withCodexMcpServerOverrides(_name: string, server: CodexMcpServer): CodexMcpServer {\n // For codex, Otium launches MCP servers via node + tsx (see serverLaunch in\n // mcp-config.ts), which transpiles the .ts on the fly — cold start is slower\n // than `bun run`, so give the handshake a generous startup window. codex's\n // default startup timeout is short enough that a heavier server can miss it.\n return {\n startup_timeout_sec: parsePositiveInt(process.env.CODEX_MCP_STARTUP_TIMEOUT_SEC, 30),\n ...server,\n };\n}\n\nexport function toCodexMcpServers(\n claudeShape: Record<string, unknown>,\n): Record<string, CodexMcpServer> {\n // Codex merges turn config with ~/.codex/config.toml instead of replacing it.\n // Disable common global browser stdio servers so browser state can only flow\n // through Negotium's long-lived, owner-scoped HTTP server.\n const disabledBrowserStdio = (): CodexStdioServer => ({\n command: process.execPath,\n args: [\"-e\", \"process.exit(0)\"],\n enabled: false,\n });\n const out: Record<string, CodexMcpServer> = {\n playwright: disabledBrowserStdio(),\n \"browser-rs\": disabledBrowserStdio(),\n patchright: disabledBrowserStdio(),\n };\n for (const [name, srv] of Object.entries(claudeShape)) {\n if (!srv || typeof srv !== \"object\") continue;\n const s = srv as Record<string, unknown>;\n const codexName = codexMcpServerName(name);\n if (typeof s.command === \"string\") {\n out[codexName] = withCodexMcpServerOverrides(name, {\n command: s.command,\n ...(Array.isArray(s.args) ? { args: s.args as string[] } : {}),\n ...(s.env && typeof s.env === \"object\" ? { env: s.env as Record<string, string> } : {}),\n });\n continue;\n }\n if (typeof s.url === \"string\" && s.type !== \"sse\") {\n out[codexName] = withCodexMcpServerOverrides(name, {\n url: s.url,\n ...(s.http_headers && typeof s.http_headers === \"object\"\n ? { http_headers: s.http_headers as Record<string, string> }\n : {}),\n ...(s.env_http_headers && typeof s.env_http_headers === \"object\"\n ? { env_http_headers: s.env_http_headers as Record<string, string> }\n : {}),\n });\n }\n }\n return out;\n}\n\nfunction isMissingCodexRolloutError(err: unknown): boolean {\n const msg = errMsg(err);\n return /no rollout found|thread\\/resume failed/i.test(msg);\n}\n\n/**\n * Render an `mcp_tool_call` item's terminal payload into a short string for\n * the unified `tool_result` event. The SDK shape is\n * `result?: { content: ContentBlock[]; structured_content: unknown }` on\n * success, or `error?: { message: string }` on failure — neither is a raw\n * string, which is why the previous `typeof result === \"string\"` branch was\n * unreachable. Truncate to 200 chars to match command_execution behavior.\n */\nfunction summarizeMcpToolCallResult(item: McpToolCallItem): string {\n if (item.error) return item.error.message.slice(0, 200);\n if (!item.result) return \"\";\n const blocks = Array.isArray(item.result.content) ? item.result.content : [];\n const text = blocks\n .map((b) => {\n if (b && typeof b === \"object\" && \"type\" in b && b.type === \"text\" && \"text\" in b) {\n return String((b as { text?: unknown }).text ?? \"\");\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n if (text) return text.slice(0, 200);\n // Fall back to a JSON dump of structured_content for non-text content blocks.\n return JSON.stringify(item.result.structured_content ?? \"\").slice(0, 200);\n}\n\nconst CODEX_DIFF_FILE_LIMIT = 512 * 1024;\nconst CODEX_DIFF_BASELINE_FILE_LIMIT = 200;\nconst CODEX_DIFF_BASELINE_BYTE_LIMIT = 16 * 1024 * 1024;\n\nfunction canonicalPath(path: string): string {\n try {\n return realpathSync(resolve(path));\n } catch {\n return resolve(path);\n }\n}\n\nfunction textFile(path: string, maxBytes = CODEX_DIFF_FILE_LIMIT): string | null | undefined {\n if (!existsSync(path)) return null;\n try {\n const byteLimit = Math.min(CODEX_DIFF_FILE_LIMIT, Math.max(0, maxBytes));\n if (statSync(path).size > byteLimit) return undefined;\n const content = readFileSync(path);\n if (content.byteLength > byteLimit || content.includes(0)) return undefined;\n return content.toString(\"utf8\");\n } catch {\n return undefined;\n }\n}\n\ninterface CodexFilePreview {\n before?: string;\n after?: string;\n diff_preview?: string;\n}\n\n/**\n * Codex's SDK exposes only path + change kind, not the patch body. Capture the\n * dirty worktree at turn start and compare each completed file_change against\n * that moving baseline. This preserves user edits that already existed before\n * the turn and gives repeated edits to the same file their own +/- preview.\n */\nclass CodexFilePreviewTracker {\n readonly #cwd: string;\n readonly #root: string | null;\n readonly #baseline = new Map<string, string | null | undefined>();\n #baselineAvailable = false;\n\n constructor(cwd: string) {\n this.#cwd = canonicalPath(cwd);\n const root = this.#git([\"rev-parse\", \"--show-toplevel\"], this.#cwd)?.trim();\n this.#root = root ? canonicalPath(root) : null;\n if (!this.#root) return;\n const status = this.#git([\"status\", \"--porcelain=v1\", \"-z\", \"--untracked-files=all\"]);\n if (status === undefined) return;\n this.#baselineAvailable = true;\n let loadedFiles = 0;\n let loadedBytes = 0;\n const records = status.split(\"\\0\");\n for (let index = 0; index < records.length; index += 1) {\n const record = records[index];\n if (!record || record.length < 4) continue;\n const code = record.slice(0, 2);\n const path = record.slice(3);\n const remainingBytes = CODEX_DIFF_BASELINE_BYTE_LIMIT - loadedBytes;\n const content =\n loadedFiles < CODEX_DIFF_BASELINE_FILE_LIMIT && remainingBytes > 0\n ? textFile(resolve(this.#root, path), remainingBytes)\n : undefined;\n this.#baseline.set(path, content);\n if (typeof content === \"string\") {\n loadedFiles += 1;\n loadedBytes += Buffer.byteLength(content);\n }\n if (/[RC]/.test(code)) index += 1;\n }\n }\n\n preview(path: string, succeeded: boolean): CodexFilePreview {\n if (!this.#root || !this.#baselineAvailable || !succeeded) return {};\n const absolute = canonicalPath(isAbsolute(path) ? path : resolve(this.#cwd, path));\n const relativePath = relative(this.#root, absolute);\n if (!relativePath || relativePath.startsWith(\"..\") || isAbsolute(relativePath)) return {};\n\n const before = this.#baseline.has(relativePath)\n ? this.#baseline.get(relativePath)\n : this.#headFile(relativePath);\n const after = textFile(absolute);\n this.#baseline.set(relativePath, after);\n if (before === undefined || after === undefined) return {};\n\n const diff = buildNumberedDiffSummary(before ?? \"\", after ?? \"\");\n return {\n ...(diff.before !== undefined ? { before: diff.before } : {}),\n ...(diff.after !== undefined ? { after: diff.after } : {}),\n ...(diff.diffPreview !== undefined ? { diff_preview: diff.diffPreview } : {}),\n };\n }\n\n #headFile(path: string): string | null | undefined {\n const content = this.#git([\"show\", `HEAD:${path}`]);\n if (content === undefined) return null;\n return Buffer.byteLength(content) > CODEX_DIFF_FILE_LIMIT || content.includes(\"\\0\")\n ? undefined\n : content;\n }\n\n #git(args: string[], cwd = this.#root ?? undefined): string | undefined {\n try {\n return execFileSync(\"git\", [\"-C\", cwd ?? \".\", ...args], {\n encoding: \"utf8\",\n maxBuffer: CODEX_DIFF_FILE_LIMIT * 4,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return undefined;\n }\n }\n}\n\n// Codex emits file_change only after the patch finishes, so surface the\n// completed changes immediately as paired tool_use/tool_result events.\nasync function fileChangeEvents(\n item: FileChangeItem,\n previews: CodexFilePreviewTracker,\n cwd: string,\n threadId: string | null | undefined,\n consumedPatchCallIds: Set<string>,\n): Promise<UnifiedEvent[]> {\n const expectedPaths = item.changes.map((change) =>\n isAbsolute(change.path) ? change.path : resolve(cwd, change.path),\n );\n let nativePreview: ReturnType<typeof readLatestCodexPatchPreview>;\n // The SDK can emit item.completed a few milliseconds before Codex flushes\n // patch_apply_end to its rollout. Give that write a brief head start before\n // the first lookup, which also avoids matching an older patch for the same\n // path on resumed threads.\n if (threadId && item.status === \"completed\") {\n await new Promise((resolveDelay) => setTimeout(resolveDelay, 20));\n nativePreview = readLatestCodexPatchPreview(threadId, expectedPaths, consumedPatchCallIds);\n }\n for (const delayMs of [20, 40, 80, 120]) {\n if (nativePreview || !threadId || item.status !== \"completed\") break;\n await new Promise((resolveDelay) => setTimeout(resolveDelay, delayMs));\n nativePreview = readLatestCodexPatchPreview(threadId, expectedPaths, consumedPatchCallIds);\n }\n if (nativePreview) consumedPatchCallIds.add(nativePreview.callId);\n\n return item.changes.flatMap((change, index) => {\n const name = change.kind === \"add\" ? \"Write\" : change.kind === \"delete\" ? \"Delete\" : \"Edit\";\n const toolUseId = `${item.id}:${index}`;\n const success = item.status === \"completed\";\n const nativeChange = nativePreview?.changes[index];\n // Keep the moving filesystem baseline current even when the native patch\n // supplies the display preview. A later edit to the same file may need the\n // filesystem fallback, which must compare against this edit—not turn start.\n const fallbackPreview = previews.preview(change.path, success);\n const preview =\n success && nativeChange\n ? {\n ...(nativeChange.before !== undefined ? { before: nativeChange.before } : {}),\n ...(nativeChange.after !== undefined ? { after: nativeChange.after } : {}),\n ...(nativeChange.diffPreview !== undefined\n ? { diff_preview: nativeChange.diffPreview }\n : {}),\n }\n : fallbackPreview;\n return [\n {\n type: \"tool_use\" as const,\n name,\n input: { file_path: change.path, change_kind: change.kind, ...preview },\n toolUseId,\n },\n {\n type: \"tool_result\" as const,\n toolUseId,\n content: success\n ? `${change.kind} applied: ${change.path}`\n : `${change.kind} failed: ${change.path}`,\n // Explicit failure flag so clients don't have to parse the content\n // string to tell a failed file change from an applied one.\n ...(success ? {} : { isError: true as const }),\n },\n ];\n });\n}\n\nfunction promptForThread(opts: AgentQueryOptions, includeSystemPrompt: boolean): string {\n return includeSystemPrompt && opts.systemPrompt\n ? `[System Instructions]\\n${opts.systemPrompt}\\n\\n${opts.prompt}`\n : opts.prompt;\n}\n\n/**\n * Start a streamed turn and identify the codex PIDs we spawned, holding the\n * global spawn lock across the full window from baseline → first event.\n *\n * Why hold the lock across iteration: `@openai/codex-sdk`'s `runStreamed()`\n * returns a lazy async generator object. The actual `child_process.spawn()`\n * call happens on the first `iterator.next()`, not when `runStreamed()` is\n * awaited (see `node_modules/@openai/codex-sdk/dist/index.js:51-93,238`).\n * If we released the lock after `await runStreamed(...)`, a concurrent\n * codex caller's baseline would race against our actual spawn and one\n * caller would mis-attribute the other's PID.\n *\n * Returns the iterator (positioned just past the first event) plus the\n * first event itself, so the streaming loop can re-emit it before\n * resuming `iterator.next()`.\n */\ntype StartResult = {\n iter: AsyncIterator<unknown>;\n firstEvent: unknown;\n done: boolean;\n};\n\nasync function closeIterator(iter: AsyncIterator<unknown>): Promise<void> {\n try {\n await iter.return?.();\n } catch (err) {\n logger.warn({ err }, \"codexProvider: failed to close codex event iterator\");\n }\n}\n\n/**\n * Bound the spawn→first-event window. `thread.started` normally arrives within\n * a few seconds, so if NOTHING comes back in this window the codex turn is\n * genuinely stuck at startup (the bare-`/codex` hang symptom). We surface a\n * clear error fast instead of waiting out the much longer mid-stream heartbeat\n * (8 min) — a stuck startup never recovers, and retrying it is futile. Once the\n * first event arrives, the normal heartbeat governs long-running work.\n */\nconst CODEX_STARTUP_TIMEOUT_MS = 90_000;\n\nasync function startStreamedWithTracking(\n thread: ReturnType<Codex[\"startThread\"]>,\n prompt: string,\n abortSignal: AbortSignal | undefined,\n trackedPids: { pids: number[] },\n): Promise<StartResult> {\n const release = await acquireCodexSpawnLock();\n try {\n const baseline = snapshotCodexChildren();\n const runResult = await thread.runStreamed(prompt, {\n ...(abortSignal ? { signal: abortSignal } : {}),\n });\n const iter = (runResult.events as AsyncIterable<unknown>)[Symbol.asyncIterator]();\n // Force the first iterator step — this is when the SDK actually\n // child_process.spawn()s codex. After this awaits, the codex PID is\n // visible to pgrep as a child of our process.\n let first: IteratorResult<unknown>;\n // Startup watchdog: race the first event against CODEX_STARTUP_TIMEOUT_MS so\n // a codex that spawns but never emits anything can't hang the turn. On\n // timeout the iter.next() promise loses the race and we fall into the catch\n // below, which kills the spawned tree, closes the iterator, and rethrows the\n // clear error — surfaced to the user as an `error` event (no infinite wait).\n let startupTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const startupTimeout = new Promise<never>((_, reject) => {\n startupTimer = setTimeout(\n () =>\n reject(\n new Error(\n `Codex가 ${CODEX_STARTUP_TIMEOUT_MS / 1000}초 내 응답을 시작하지 않아 중단했습니다. 다시 시도해주세요.`,\n ),\n ),\n CODEX_STARTUP_TIMEOUT_MS,\n );\n });\n // Swallow a late rejection from the losing promise: if the startup\n // timeout wins the race, this dangling next() may settle later with\n // nobody awaiting it (would surface as an unhandledRejection).\n const nextP = iter.next();\n nextP.catch(() => {});\n first = await Promise.race([nextP, startupTimeout]);\n } catch (err) {\n // Abort OR startup-timeout after the SDK spawned codex but before the\n // first event resolves: the normal abort listener still sees no tracked\n // PID, so diff the baseline here and kill anything attributable before\n // propagating.\n const novel = findNewCodexChildren(baseline);\n if (novel.length > 0) {\n killCodexTrees(novel);\n }\n await closeIterator(iter);\n throw err;\n } finally {\n if (startupTimer) clearTimeout(startupTimer);\n }\n const novel = findNewCodexChildren(baseline);\n trackedPids.pids = novel;\n registerOwnedCodexPids(novel);\n return { iter, firstEvent: first.value, done: !!first.done };\n } finally {\n release();\n }\n}\n\n/**\n * Wrap an iterator into an AsyncIterable that first yields a pre-captured\n * `firstEvent` and then drains the underlying iterator. Lets the streaming\n * `for await` loop keep its existing switch over events without special-casing\n * the first iteration we already consumed during PID tracking.\n */\nfunction prependFirstEvent(\n iter: AsyncIterator<unknown>,\n firstEvent: unknown,\n alreadyDone: boolean,\n): AsyncIterable<unknown> {\n return {\n [Symbol.asyncIterator]() {\n let emittedFirst = false;\n let exhausted = alreadyDone;\n return {\n async next(): Promise<IteratorResult<unknown>> {\n if (!emittedFirst) {\n emittedFirst = true;\n if (alreadyDone) return { value: undefined, done: true };\n return { value: firstEvent, done: false };\n }\n if (exhausted) return { value: undefined, done: true };\n const r = await iter.next();\n if (r.done) exhausted = true;\n return r;\n },\n async return(value?: unknown): Promise<IteratorResult<unknown>> {\n exhausted = true;\n if (iter.return) return iter.return(value);\n return { value, done: true };\n },\n };\n },\n };\n}\n\n/**\n * Core Codex provider.\n * Same UnifiedEvent contract as claudeProvider. Uses @openai/codex-sdk.\n *\n * Notes:\n * - Codex has no `systemPrompt` option; prepend the current topic/system\n * instructions on every invocation, including resumed synthetic threads.\n * - Per-turn MCP isolation is achieved via CodexOptions.config.mcp_servers,\n * so the global ~/.codex/config.toml stays untouched.\n * - Streaming token-by-token text deltas are not exposed by the SDK; only\n * final agent_message and per-item updates. Callers that rely on\n * text_delta should still work because we yield a single text/result\n * event when the assistant message completes.\n */\nexport async function* codexProvider(opts: AgentQueryOptions): AsyncGenerator<UnifiedEvent> {\n const filePreviews = new CodexFilePreviewTracker(opts.cwd);\n // A resumed rollout may already contain patches for the same file. Mark\n // those calls consumed before this turn starts so a delayed new flush can\n // never be mistaken for the previous turn's edit.\n const consumedPatchCallIds = new Set(opts.sessionId ? readCodexPatchCallIds(opts.sessionId) : []);\n // Up-front auth file check — gives the user an actionable message\n // (\"`codex login` 으로 다시 로그인해주세요\") immediately instead of waiting\n // for the @openai/codex-sdk to spawn the codex binary and surface an\n // opaque OAuth failure on the first turn. Path is the default codex\n // location unless NEGOTIUM_CODEX_AUTH_FILE relocates it for this host.\n const codexAuthPath = hostedCodexAuthFilePath();\n if (!existsSync(codexAuthPath)) {\n yield {\n type: \"error\",\n content: `Codex auth file not found at ${codexAuthPath}. Run \\`codex login\\` to authenticate.`,\n };\n return;\n }\n\n let codexModelCatalogPath: string;\n try {\n const codexModelCachePath = await ensureCodexModelCache(codexAuthPath);\n codexModelCatalogPath = writeCodexCatalogWithNativeMultiAgentDisabled(\n codexAuthPath,\n codexModelCachePath,\n );\n if (opts.sessionId) migrateCodexRolloutNativeMultiAgentMetadata(opts.sessionId);\n } catch (err) {\n yield {\n type: \"error\",\n content: `Failed to enforce the Codex native multi-agent policy: ${errMsg(err)}`,\n };\n return;\n }\n\n const codexMcpServers = toCodexMcpServers(hostedMcpServers(opts));\n if (opts.toolPolicy) {\n const allowed = new Set(Object.keys(codexMcpServers));\n for (const name of globalCodexMcpServerNames(codexAuthPath)) {\n if (allowed.has(name)) continue;\n codexMcpServers[name] = {\n command: process.execPath,\n args: [\"-e\", \"process.exit(0)\"],\n enabled: false,\n };\n }\n }\n const browserOwner = browserOwnerForContext(opts);\n const scopedBrowserCapability =\n opts.playwrightCapability && browserOwner\n ? browserOwnerCapability(opts.playwrightCapability, browserOwner)\n : undefined;\n\n // Startup trace: codexProvider was otherwise silent until its first error or\n // heartbeat (8 min), so a stuck turn left \"0 lines of codex\" in the logs and\n // was impossible to localize (bug B). Record the resolved model/effort/cwd +\n // whether this is a fresh thread or a resume, so a future hang is pinpointed\n // to setup vs. the first stream step.\n logger.info(\n {\n model: opts.model ?? \"(sdk default)\",\n effort: opts.effort ?? \"(off)\",\n cwd: opts.cwd,\n cwdExists: existsSync(opts.cwd),\n resume: Boolean(opts.sessionId),\n mcpServerCount: Object.keys(codexMcpServers).length,\n },\n \"codexProvider: starting turn\",\n );\n\n const hostedCodexHome = hostedCodexHomePath();\n const inheritedCodexHome = process.env.CODEX_HOME || join(homedir(), \".codex\");\n const codexEnvironment =\n scopedBrowserCapability || resolve(hostedCodexHome) !== resolve(inheritedCodexHome)\n ? {\n ...Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n ),\n CODEX_HOME: hostedCodexHome,\n ...(scopedBrowserCapability\n ? { [CODEX_BROWSER_CAPABILITY_ENV]: scopedBrowserCapability }\n : {}),\n }\n : undefined;\n const codex = new Codex({\n ...(codexEnvironment ? { env: codexEnvironment } : {}),\n config: {\n // Otium exposes delegation through runtime.spawn_subagent so child work\n // gets its own room/card and its result is routed back to the parent.\n // Codex enables its provider-native collaboration tools from the user's\n // global config by default; explicitly turn that feature off so tools\n // such as spawn_agent/send_message cannot bypass Otium's orchestration\n // and so subagent rooms cannot recursively fan out through Codex.\n // Codex model metadata can override these flags. The authoritative\n // catalog above sets multi_agent_version=disabled as the hard stop; keep\n // all feature switches off as a second layer and for future CLI versions.\n features: { multi_agent: false, multi_agent_v2: false, enable_fanout: false },\n model_catalog_json: codexModelCatalogPath,\n mcp_servers: codexMcpServers,\n ...(opts.toolPolicy ? { sandbox_permissions: [] } : {}),\n },\n });\n\n const threadOptions: ThreadOptions = {\n workingDirectory: opts.cwd,\n skipGitRepoCheck: true,\n // Codex sandbox is intentionally disabled: Otium already assigns a managed\n // workspace cwd for the turn, and the bot is expected to act on it freely on\n // the user's behalf. SDK-level sandboxing would only constrain reach inside\n // that already-owned directory, which is not the threat model.\n sandboxMode: (opts.toolPolicy ? \"read-only\" : \"danger-full-access\") as SandboxMode,\n approvalPolicy: \"never\",\n ...(opts.toolPolicy\n ? {\n networkAccessEnabled: false,\n webSearchMode: \"disabled\" as const,\n webSearchEnabled: false,\n }\n : {}),\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.effort ? { modelReasoningEffort: mapEffort(opts.effort) } : {}),\n };\n\n let currentSessionId = opts.sessionId;\n let usageBaseline = currentSessionId ? readLatestCodexTokenTotals(currentSessionId) : undefined;\n\n // Codex SDK has no systemPrompt option. A resumed thread may have been\n // synthesized from a captured shell, so always refresh the current runtime\n // instructions instead of trusting historical developer/environment data.\n let thread = currentSessionId\n ? codex.resumeThread(currentSessionId, threadOptions)\n : codex.startThread(threadOptions);\n let prompt = promptForThread(opts, true);\n\n let agentTextSoFar = \"\";\n let currentAgentMessageId: string | undefined;\n let finalText = \"\";\n let stopReason = \"end_turn\";\n\n // Tree-kill instrumentation. The codex SDK spawns the `codex` binary as a\n // direct child of our process but does not expose the PID or place it in\n // its own process group. We identify our PIDs by diffing pgrep snapshots\n // around the SDK's first iterator step (when codex is actually spawned),\n // and SIGTERM the whole tree on abort with SIGKILL fallback inside\n // killCodexTrees().\n const trackedPids: { pids: number[] } = { pids: [] };\n const abortSignal = opts.abortController?.signal;\n const onAbortKill = () => {\n if (trackedPids.pids.length > 0) {\n killCodexTrees(trackedPids.pids);\n }\n };\n abortSignal?.addEventListener(\"abort\", onAbortKill, { once: true });\n\n // Heartbeat: if the Codex API emits no events within the window, abort the\n // current stream and resume the thread with a short continuation prompt.\n // The interval doubles each attempt (up to HEARTBEAT_MAX_MS) to avoid\n // interrupting genuinely long-running work on the first timeout.\n let heartbeatMs = 8 * 60 * 1000;\n let heartbeatAttempts = 0;\n const HEARTBEAT_MAX_MS = 16 * 60 * 1000;\n const HEARTBEAT_MAX_ATTEMPTS = 2;\n const HEARTBEAT_CONTINUATION = \"계속 진행해줘.\";\n\n try {\n while (true) {\n if (abortSignal?.aborted) return;\n\n // Per-attempt abort controller: lets the heartbeat timer abort only\n // this attempt's stream without touching the user-facing outer signal.\n const attemptAbort = new AbortController();\n const propagateOuter = () => attemptAbort.abort();\n abortSignal?.addEventListener(\"abort\", propagateOuter, { once: true });\n\n trackedPids.pids = [];\n let heartbeatTriggered = false;\n let attemptCompleted = false;\n let heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n\n const scheduleHeartbeat = () => {\n if (heartbeatTimer !== null) clearTimeout(heartbeatTimer);\n if (abortSignal?.aborted || attemptAbort.signal.aborted) return;\n heartbeatTimer = setTimeout(() => {\n heartbeatTriggered = true;\n if (trackedPids.pids.length > 0) killCodexTrees(trackedPids.pids);\n attemptAbort.abort();\n }, heartbeatMs);\n };\n\n try {\n scheduleHeartbeat();\n\n let startResult!: StartResult;\n try {\n startResult = await startStreamedWithTracking(\n thread,\n prompt,\n attemptAbort.signal,\n trackedPids,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") throw err;\n if (!currentSessionId || !isMissingCodexRolloutError(err)) throw err;\n if (opts.userId && opts.session) throw err;\n logger.warn(\n { staleSessionId: currentSessionId, err: errMsg(err) },\n \"codexProvider: stale/missing rollout, restarting fresh thread\",\n );\n thread = codex.startThread(threadOptions);\n prompt = promptForThread(opts, true);\n currentSessionId = undefined;\n usageBaseline = undefined;\n startResult = await startStreamedWithTracking(\n thread,\n prompt,\n attemptAbort.signal,\n trackedPids,\n );\n }\n\n // Cover the narrow window where abort fired between PID registration\n // and the abort listener actually running.\n if (attemptAbort.signal.aborted) {\n killCodexTrees(trackedPids.pids);\n await closeIterator(startResult.iter);\n throw Object.assign(new Error(\"heartbeat abort\"), { name: \"AbortError\" });\n }\n\n const eventStream = prependFirstEvent(\n startResult.iter,\n startResult.firstEvent,\n startResult.done,\n );\n\n for await (const rawEvent of eventStream) {\n scheduleHeartbeat();\n\n const event = rawEvent as {\n type: string;\n thread_id?: string;\n item?: {\n type: string;\n command?: string;\n tool?: string;\n arguments?: unknown;\n text?: string;\n id?: string;\n aggregated_output?: string;\n exit_code?: number;\n message?: string;\n status?: \"in_progress\" | \"completed\" | \"failed\";\n error?: { message?: string };\n };\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cached_input_tokens?: number;\n cache_write_input_tokens?: number;\n };\n error?: { message?: string };\n };\n\n switch (event.type) {\n case \"thread.started\": {\n if (event.thread_id) {\n currentSessionId = event.thread_id;\n yield { type: \"session\", sessionId: event.thread_id };\n }\n break;\n }\n\n case \"item.started\": {\n const item = event.item;\n if (!item) break;\n if (item.type === \"command_execution\") {\n const command = String(item.command ?? \"\");\n yield {\n type: \"tool_use\",\n name: \"Bash\",\n input: { command },\n toolUseId: String(item.id ?? \"\"),\n };\n } else if (item.type === \"mcp_tool_call\") {\n yield {\n type: \"tool_use\",\n name: String(item.tool ?? \"unknown\"),\n input:\n item.arguments && typeof item.arguments === \"object\"\n ? (item.arguments as Record<string, unknown>)\n : {},\n toolUseId: String(item.id ?? \"\"),\n };\n }\n break;\n }\n\n case \"item.updated\": {\n const item = event.item;\n if (!item) break;\n if (item.type === \"agent_message\") {\n const messageId = item.id != null ? String(item.id) : undefined;\n if (messageId !== currentAgentMessageId) {\n currentAgentMessageId = messageId;\n agentTextSoFar = \"\";\n }\n const text = String(item.text ?? \"\");\n const newChars = text.slice(agentTextSoFar.length);\n if (newChars) {\n yield { type: \"text_delta\", content: newChars };\n agentTextSoFar = text;\n }\n }\n break;\n }\n\n case \"item.completed\": {\n const item = event.item;\n if (!item) break;\n if (item.type === \"agent_message\") {\n finalText = String(item.text ?? \"\");\n agentTextSoFar = finalText;\n yield { type: \"text\", content: finalText };\n yield* extractFileEvents(finalText, \"text\");\n } else if (item.type === \"reasoning\") {\n const reasoning = String(item.text ?? \"\").trim();\n if (reasoning) yield { type: \"reasoning\", content: reasoning };\n } else if (item.type === \"mcp_tool_call\") {\n const isError = item.status === \"failed\" || Boolean(item.error);\n yield {\n type: \"tool_result\",\n toolUseId: String(item.id ?? \"\"),\n content: summarizeMcpToolCallResult(item as unknown as McpToolCallItem),\n ...(isError ? { isError: true } : {}),\n };\n } else if (item.type === \"command_execution\") {\n const isError =\n item.status === \"failed\" ||\n (typeof item.exit_code === \"number\" && item.exit_code !== 0);\n yield {\n type: \"tool_result\",\n toolUseId: String(item.id ?? \"\"),\n content: String(item.aggregated_output ?? \"\").slice(0, 200),\n ...(isError ? { isError: true } : {}),\n };\n } else if (item.type === \"file_change\") {\n const fileEvents = await fileChangeEvents(\n item as unknown as FileChangeItem,\n filePreviews,\n opts.cwd,\n currentSessionId,\n consumedPatchCallIds,\n );\n for (const fileEvent of fileEvents) {\n yield fileEvent;\n }\n } else if (item.type === \"error\") {\n yield { type: \"error\", content: String(item.message ?? \"\") };\n }\n break;\n }\n\n case \"turn.completed\": {\n const rawUsage = event.usage;\n if (!rawUsage) break;\n attemptCompleted = true;\n const usage = normalizeCodexTurnUsage(\n rawUsage,\n usageBaseline,\n currentSessionId ? readLatestCodexTokenTotals(currentSessionId) : undefined,\n );\n const contextUsage = currentSessionId\n ? readLatestCodexContextUsage(currentSessionId)\n : undefined;\n yield {\n type: \"result\",\n content: finalText,\n stopReason,\n usage: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheCreationInputTokens: usage.cache_write_input_tokens,\n cacheReadInputTokens: usage.cached_input_tokens,\n ...contextUsage,\n },\n };\n if (finalText) yield* extractFileEvents(finalText, \"result\");\n break;\n }\n\n case \"turn.failed\": {\n stopReason = \"error\";\n yield {\n type: \"error\",\n content: event.error?.message || \"Codex turn failed\",\n };\n break;\n }\n\n default:\n break;\n }\n }\n } catch (err) {\n if (abortSignal?.aborted) return;\n if (err instanceof Error && err.name === \"AbortError\") {\n if (!heartbeatTriggered) return;\n // Heartbeat abort — fall through to retry logic below\n } else {\n logger.error({ err }, \"codexProvider: attempt failed\");\n yield { type: \"error\", content: errMsg(err) };\n break;\n }\n } finally {\n if (heartbeatTimer !== null) clearTimeout(heartbeatTimer);\n abortSignal?.removeEventListener(\"abort\", propagateOuter);\n if (trackedPids.pids.length > 0) unregisterOwnedCodexPids(trackedPids.pids);\n }\n\n if (attemptCompleted || abortSignal?.aborted) break;\n if (!heartbeatTriggered) break;\n\n heartbeatAttempts++;\n if (heartbeatAttempts > HEARTBEAT_MAX_ATTEMPTS) {\n logger.warn(\n { attempts: heartbeatAttempts },\n \"codexProvider: max heartbeat attempts reached\",\n );\n yield {\n type: \"error\",\n content: `Codex가 ${HEARTBEAT_MAX_ATTEMPTS}회 재시도 후에도 응답하지 않았습니다.`,\n };\n break;\n }\n\n heartbeatMs = Math.min(heartbeatMs * 2, HEARTBEAT_MAX_MS);\n logger.info(\n { attempt: heartbeatAttempts, nextIntervalMs: heartbeatMs },\n \"codexProvider: heartbeat fired, resuming thread with continuation prompt\",\n );\n\n // The resumed turn's agent_message grows from \"\" again. Stale lengths\n // from the aborted attempt would mis-slice deltas (silence until the new\n // text outgrows the old, then an arbitrary mid-string fragment), and a\n // resumed turn that ends without an agent_message would ship the\n // previous attempt's finalText as its result.\n agentTextSoFar = \"\";\n finalText = \"\";\n\n thread = currentSessionId\n ? codex.resumeThread(currentSessionId, threadOptions)\n : codex.startThread(threadOptions);\n prompt = currentSessionId ? HEARTBEAT_CONTINUATION : promptForThread(opts, true);\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") return;\n if (abortSignal?.aborted) return;\n logger.error({ err }, \"codexProvider: setup failed\");\n yield { type: \"error\", content: errMsg(err) };\n } finally {\n abortSignal?.removeEventListener(\"abort\", onAbortKill);\n if (trackedPids.pids.length > 0) unregisterOwnedCodexPids(trackedPids.pids);\n }\n}\n",
34
35
  "import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n chmodSync,\n copyFileSync,\n existsSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { NEGOTIUM_VERSION } from \"#version\";\n\ntype CodexModel = Record<string, unknown>;\ntype CodexModelCache = {\n client_version?: unknown;\n models?: unknown;\n};\n\nconst moduleRequire = createRequire(import.meta.url);\nconst codexSdkPackagePath = moduleRequire.resolve(\"@openai/codex-sdk/package.json\");\nconst codexSdkRequire = createRequire(codexSdkPackagePath);\nconst bundledCodexPackagePath = codexSdkRequire.resolve(\"@openai/codex/package.json\");\n\nfunction readPackageVersion(packageJsonPath: string): string {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: unknown };\n if (typeof parsed.version !== \"string\" || !parsed.version.trim()) {\n throw new Error(`Codex package has no valid version: ${packageJsonPath}`);\n }\n return parsed.version;\n}\n\nexport const BUNDLED_CODEX_VERSION = readPackageVersion(bundledCodexPackagePath);\nconst SAFE_BUNDLED_CODEX_VERSION = BUNDLED_CODEX_VERSION.replace(/[^a-zA-Z0-9._-]/g, \"_\");\nconst NEGOTIUM_MODEL_CACHE = `negotium-models-cache-${SAFE_BUNDLED_CODEX_VERSION}.json`;\nconst NEGOTIUM_MODEL_CATALOG = `negotium-model-catalog-${SAFE_BUNDLED_CODEX_VERSION}.json`;\n\nexport function codexCliScriptPath(): string {\n return join(dirname(bundledCodexPackagePath), \"bin\", \"codex.js\");\n}\n\nfunction parseCodexModelCache(contents: string, sourcePath: string): CodexModelCache {\n let parsed: CodexModelCache;\n try {\n parsed = JSON.parse(contents) as CodexModelCache;\n } catch (error) {\n throw new Error(`Codex model cache is invalid JSON: ${sourcePath}`, { cause: error });\n }\n if (!Array.isArray(parsed.models) || parsed.models.length === 0) {\n throw new Error(`Codex model cache has no models: ${sourcePath}`);\n }\n return parsed;\n}\n\nfunction readCodexModelCache(cachePath: string): {\n contents: string;\n parsed: CodexModelCache;\n} {\n const contents = readFileSync(cachePath, \"utf8\");\n return { contents, parsed: parseCodexModelCache(contents, cachePath) };\n}\n\nfunction readCompatibleCodexModelCache(cachePath: string): {\n contents: string;\n parsed: CodexModelCache;\n} {\n const cache = readCodexModelCache(cachePath);\n if (cache.parsed.client_version !== BUNDLED_CODEX_VERSION) {\n const found =\n typeof cache.parsed.client_version === \"string\"\n ? cache.parsed.client_version\n : \"missing or invalid\";\n throw new Error(\n `Codex model cache version ${found} does not match Negotium's bundled Codex ${BUNDLED_CODEX_VERSION}: ${cachePath}`,\n );\n }\n return cache;\n}\n\nfunction writePrivateFileAtomic(path: string, contents: string): void {\n if (existsSync(path) && readFileSync(path, \"utf8\") === contents) return;\n\n const tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tempPath, contents, { encoding: \"utf8\", mode: 0o600 });\n renameSync(tempPath, path);\n chmodSync(path, 0o600);\n } finally {\n try {\n unlinkSync(tempPath);\n } catch {\n // renameSync normally consumed the temporary file.\n }\n }\n}\n\nexport function bundledCodexModelCachePath(authFilePath: string): string {\n return join(dirname(authFilePath), NEGOTIUM_MODEL_CACHE);\n}\n\nasync function bootstrapCodexModelCache(codexHome: string, cachePath: string): Promise<void> {\n const child = spawn(process.execPath, [codexCliScriptPath(), \"app-server\", \"--stdio\"], {\n env: { ...process.env, CODEX_HOME: codexHome },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n let stdoutBuffer = \"\";\n let stderr = \"\";\n const timer = setTimeout(\n () => finish(new Error(\"timed out while refreshing the Codex model catalog\")),\n 15_000,\n );\n\n const finish = (error?: Error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n try {\n child.stdin.end();\n child.kill();\n } catch {\n // The app server may already have exited after stdin closed.\n }\n if (error) reject(error);\n else if (!existsSync(cachePath)) reject(new Error(\"Codex did not create its model cache\"));\n else resolve();\n };\n\n const send = (message: Record<string, unknown>) => {\n child.stdin.write(`${JSON.stringify(message)}\\n`);\n };\n\n child.stderr.on(\"data\", (chunk) => {\n if (stderr.length < 4_096) stderr += String(chunk);\n });\n child.on(\"error\", (error) => finish(error));\n child.on(\"exit\", (code, signal) => {\n if (!settled) {\n finish(\n new Error(\n `Codex model catalog refresh exited with ${signal ? `signal ${signal}` : `code ${code ?? 1}`}${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`,\n ),\n );\n }\n });\n child.stdout.on(\"data\", (chunk) => {\n stdoutBuffer += String(chunk);\n for (;;) {\n const newline = stdoutBuffer.indexOf(\"\\n\");\n if (newline < 0) break;\n const line = stdoutBuffer.slice(0, newline);\n stdoutBuffer = stdoutBuffer.slice(newline + 1);\n let message: { id?: number; error?: { message?: string } };\n try {\n message = JSON.parse(line) as typeof message;\n } catch {\n continue;\n }\n if (message.id === 1) {\n if (message.error) {\n finish(new Error(message.error.message || \"Codex initialization failed\"));\n return;\n }\n send({ method: \"initialized\" });\n send({ id: 2, method: \"model/list\", params: { includeHidden: true } });\n } else if (message.id === 2) {\n if (message.error) {\n finish(new Error(message.error.message || \"Codex model listing failed\"));\n } else {\n finish();\n }\n return;\n }\n }\n });\n\n send({\n id: 1,\n method: \"initialize\",\n params: {\n clientInfo: { name: \"negotium\", version: NEGOTIUM_VERSION },\n capabilities: { experimentalApi: true },\n },\n });\n });\n}\n\nasync function bootstrapIsolatedCodexModelCache(\n authFilePath: string,\n bootstrap: (codexHome: string, cachePath: string) => Promise<void>,\n): Promise<string> {\n const sourceHome = dirname(authFilePath);\n const isolatedHome = mkdtempSync(join(tmpdir(), \"negotium-codex-models-\"));\n const isolatedCachePath = join(isolatedHome, \"models_cache.json\");\n\n try {\n const isolatedAuthPath = join(isolatedHome, \"auth.json\");\n copyFileSync(authFilePath, isolatedAuthPath);\n chmodSync(isolatedAuthPath, 0o600);\n\n // Preserve custom provider configuration while keeping the bundled CLI's\n // cache write completely outside the user's shared CODEX_HOME.\n const sourceConfigPath = join(sourceHome, \"config.toml\");\n if (existsSync(sourceConfigPath)) {\n const isolatedConfigPath = join(isolatedHome, \"config.toml\");\n copyFileSync(sourceConfigPath, isolatedConfigPath);\n chmodSync(isolatedConfigPath, 0o600);\n }\n\n await bootstrap(isolatedHome, isolatedCachePath);\n return readCompatibleCodexModelCache(isolatedCachePath).contents;\n } finally {\n rmSync(isolatedHome, { recursive: true, force: true });\n }\n}\n\nexport async function ensureCodexModelCache(\n authFilePath: string,\n bootstrap: (codexHome: string, cachePath: string) => Promise<void> = bootstrapCodexModelCache,\n): Promise<string> {\n const codexHome = dirname(authFilePath);\n const configuredCachePath = process.env.NEGOTIUM_CODEX_MODELS_CACHE_FILE;\n if (configuredCachePath) {\n if (!existsSync(configuredCachePath)) {\n throw new Error(`Configured Codex model cache does not exist: ${configuredCachePath}`);\n }\n readCompatibleCodexModelCache(configuredCachePath);\n return configuredCachePath;\n }\n\n // The global Codex CLI owns models_cache.json and may update it to a schema\n // newer than the SDK bundled by Negotium. Snapshot a cache generated for our\n // exact bundled version so later global CLI updates cannot break turns.\n const bundledCachePath = bundledCodexModelCachePath(authFilePath);\n const sharedCachePath = join(codexHome, \"models_cache.json\");\n if (existsSync(sharedCachePath)) {\n try {\n const shared = readCompatibleCodexModelCache(sharedCachePath);\n // Keep model metadata fresh while the global CLI remains compatible.\n writePrivateFileAtomic(bundledCachePath, shared.contents);\n return bundledCachePath;\n } catch {\n // A compatible private snapshot is safer than failing because another\n // process briefly exposed an incomplete shared-cache write.\n }\n }\n\n if (existsSync(bundledCachePath)) {\n try {\n readCompatibleCodexModelCache(bundledCachePath);\n return bundledCachePath;\n } catch {\n // Re-bootstrap below instead of passing a corrupt or version-mismatched\n // private snapshot into this SDK version.\n }\n }\n\n const refreshedContents = await bootstrapIsolatedCodexModelCache(authFilePath, bootstrap);\n writePrivateFileAtomic(bundledCachePath, refreshedContents);\n return bundledCachePath;\n}\n\n/**\n * Codex can resolve model metadata before `features.multi_agent=false`, so a\n * model-advertised v1/v2 value may still register native collaboration tools.\n * Feed Codex an authoritative copy of its own catalog with only that field\n * disabled. Runtime MCP delegation remains available independently.\n */\nexport function writeCodexCatalogWithNativeMultiAgentDisabled(\n authFilePath: string,\n sourcePath: string,\n): string {\n const codexHome = dirname(authFilePath);\n const outputPath = join(codexHome, NEGOTIUM_MODEL_CATALOG);\n\n const parsed = readCodexModelCache(sourcePath).parsed;\n\n const models = (parsed.models as unknown[]).map((model, index): CodexModel => {\n if (!model || typeof model !== \"object\" || Array.isArray(model)) {\n throw new Error(`Codex model cache entry ${index} is invalid: ${sourcePath}`);\n }\n return { ...(model as CodexModel), multi_agent_version: \"disabled\" };\n });\n const contents = `${JSON.stringify({ models }, null, 2)}\\n`;\n writePrivateFileAtomic(outputPath, contents);\n return outputPath;\n}\n",
35
- "export const NEGOTIUM_VERSION = \"0.2.19\";\n",
36
+ "export const NEGOTIUM_VERSION = \"0.2.21\";\n",
36
37
  "import { execFileSync } from \"node:child_process\";\nimport { type CodexTreeHost, createCodexTreeManager } from \"#agents/codex-tree-manager\";\nimport { logger } from \"#platform/logger\";\n\nfunction execText(command: string, args: string[]): string {\n try {\n return execFileSync(command, args, {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return \"\";\n }\n}\n\nconst posixHost: CodexTreeHost = {\n parentPid: process.pid,\n getDirectChildren(parentPid) {\n const output = execText(\"pgrep\", [\"-P\", String(parentPid)]);\n if (!output) return [];\n return output\n .split(\"\\n\")\n .map(Number)\n .filter((pid) => Number.isFinite(pid) && pid > 0);\n },\n getProcessName: (pid) => execText(\"ps\", [\"-p\", String(pid), \"-o\", \"comm=\"]),\n getProcessStart: (pid) => execText(\"ps\", [\"-p\", String(pid), \"-o\", \"lstart=\"]),\n kill: (pid, signal) => process.kill(pid, signal),\n logger,\n};\n\nconst manager = createCodexTreeManager(posixHost);\n\nexport type CodexProcStamp = { pid: number; lstart: string };\n\nexport const snapshotCodexChildren = manager.snapshotChildren;\nexport const findNewCodexChildren = manager.findNewChildren;\nexport const registerOwnedCodexPids = manager.registerOwnedPids;\nexport const unregisterOwnedCodexPids = manager.unregisterOwnedPids;\nexport const acquireCodexSpawnLock = manager.acquireSpawnLock;\nexport const withCodexSpawnSerial = manager.withSpawnSerial;\nexport const killCodexTrees = manager.killTrees;\nexport const killOwnedCodexTreesForShutdown = manager.killOwnedTreesForShutdown;\n\nexport {\n type CodexTreeHost,\n type CodexTreeLogger,\n type CodexTreeManager,\n type CodexTreeManagerOptions,\n createCodexTreeManager,\n} from \"#agents/codex-tree-manager\";\n",
37
38
  "export interface CodexTreeLogger {\n warn(fields: Record<string, unknown>, message: string): void;\n}\n\nexport interface CodexTreeHost {\n parentPid: number;\n getDirectChildren(parentPid: number): number[];\n getProcessName(pid: number): string;\n getProcessStart(pid: number): string;\n kill(pid: number, signal: 0 | \"SIGTERM\" | \"SIGKILL\"): void;\n logger: CodexTreeLogger;\n}\n\nexport interface CodexTreeManagerOptions {\n sigkillDelayMs?: number;\n treeDepthCap?: number;\n processNamePattern?: RegExp;\n}\n\nexport interface CodexTreeManager {\n snapshotChildren(): Map<number, string>;\n findNewChildren(baseline: Map<number, string>): number[];\n registerOwnedPids(pids: Iterable<number>): void;\n unregisterOwnedPids(pids: Iterable<number>): void;\n acquireSpawnLock(): Promise<() => void>;\n withSpawnSerial<T>(fn: () => Promise<T>): Promise<T>;\n killTrees(rootPids: number[]): void;\n killOwnedTreesForShutdown(graceMs?: number): Promise<void>;\n}\n\ntype KillPlan = {\n rootPids: number[];\n targets: Map<number, string>;\n};\n\n/** Caller-owned Codex process tracker and tree reaper. */\nexport function createCodexTreeManager(\n host: CodexTreeHost,\n options: CodexTreeManagerOptions = {},\n): CodexTreeManager {\n const sigkillDelayMs = options.sigkillDelayMs ?? 5_000;\n const treeDepthCap = options.treeDepthCap ?? 16;\n const processNamePattern = options.processNamePattern ?? /codex/i;\n const ownedPids = new Set<number>();\n let spawnChain: Promise<void> = Promise.resolve();\n\n function collectTree(rootPid: number, out = new Set<number>(), depth = 0): Set<number> {\n if (out.has(rootPid)) return out;\n out.add(rootPid);\n if (depth >= treeDepthCap) {\n host.logger.warn(\n { rootPid, depth, cap: treeDepthCap },\n \"codex-tree-kill: tree depth cap reached, descendants beyond this point not collected\",\n );\n return out;\n }\n for (const child of host.getDirectChildren(rootPid)) {\n collectTree(child, out, depth + 1);\n }\n return out;\n }\n\n function snapshotChildren(): Map<number, string> {\n const snapshot = new Map<number, string>();\n for (const pid of host.getDirectChildren(host.parentPid)) {\n const name = host.getProcessName(pid);\n if (!name || !processNamePattern.test(name)) continue;\n snapshot.set(pid, host.getProcessStart(pid));\n }\n return snapshot;\n }\n\n function registerOwnedPids(pids: Iterable<number>): void {\n for (const pid of pids) ownedPids.add(pid);\n }\n\n function unregisterOwnedPids(pids: Iterable<number>): void {\n for (const pid of pids) ownedPids.delete(pid);\n }\n\n function findNewChildren(baseline: Map<number, string>): number[] {\n const novel: number[] = [];\n for (const [pid, start] of snapshotChildren()) {\n const previousStart = baseline.get(pid);\n if (previousStart !== undefined && previousStart === start) continue;\n if (!ownedPids.has(pid)) novel.push(pid);\n }\n return novel;\n }\n\n async function acquireSpawnLock(): Promise<() => void> {\n const previous = spawnChain;\n let release!: () => void;\n let released = false;\n spawnChain = new Promise<void>((resolve) => {\n release = () => {\n if (released) return;\n released = true;\n resolve();\n };\n });\n await previous;\n return release;\n }\n\n async function withSpawnSerial<T>(fn: () => Promise<T>): Promise<T> {\n const release = await acquireSpawnLock();\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n function isAlive(pid: number): boolean {\n try {\n host.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n\n function isSameProcess(pid: number, start: string): boolean {\n return start !== \"\" && isAlive(pid) && host.getProcessStart(pid) === start;\n }\n\n function signalTrees(rootPids: number[]): KillPlan | null {\n if (rootPids.length === 0) return null;\n const targets = new Map<number, string>();\n for (const rootPid of rootPids) {\n for (const pid of collectTree(rootPid)) {\n if (!targets.has(pid)) targets.set(pid, host.getProcessStart(pid));\n }\n }\n host.logger.warn(\n { rootPids, totalPids: targets.size },\n \"codex-tree-kill: SIGTERM process tree\",\n );\n for (const pid of targets.keys()) {\n try {\n host.kill(pid, \"SIGTERM\");\n } catch {\n // The process already exited or is no longer signalable.\n }\n }\n return { rootPids, targets };\n }\n\n function hasSurvivors(targets: Map<number, string>): boolean {\n for (const [pid, start] of targets) {\n if (isSameProcess(pid, start)) return true;\n }\n return false;\n }\n\n function killStragglers(plan: KillPlan): void {\n const aliveTargets: number[] = [];\n let droppedAsPossibleReuse = 0;\n for (const [pid, start] of plan.targets) {\n if (isSameProcess(pid, start)) aliveTargets.push(pid);\n else if (isAlive(pid)) droppedAsPossibleReuse++;\n }\n if (aliveTargets.length === 0) return;\n\n const reachable = new Set(aliveTargets);\n for (const rootPid of plan.rootPids) {\n const start = plan.targets.get(rootPid);\n if (start && isSameProcess(rootPid, start)) {\n for (const pid of collectTree(rootPid)) reachable.add(pid);\n }\n }\n const stragglers: number[] = [];\n for (const pid of reachable) {\n const start = plan.targets.get(pid);\n if (start && isSameProcess(pid, start)) stragglers.push(pid);\n else if (isAlive(pid)) droppedAsPossibleReuse++;\n }\n host.logger.warn(\n {\n aliveRoots: plan.rootPids.filter((pid) => {\n const start = plan.targets.get(pid);\n return start ? isSameProcess(pid, start) : false;\n }),\n totalStragglers: stragglers.length,\n droppedAsPossibleReuse,\n },\n \"codex-tree-kill: SIGKILL fallback after SIGTERM timeout\",\n );\n for (const pid of stragglers) {\n try {\n host.kill(pid, \"SIGKILL\");\n } catch {\n // The process exited during the survivor check.\n }\n }\n }\n\n function killTrees(rootPids: number[]): void {\n const plan = signalTrees(rootPids);\n if (!plan) return;\n const timer = setTimeout(() => killStragglers(plan), sigkillDelayMs);\n timer.unref?.();\n }\n\n async function killOwnedTreesForShutdown(graceMs = 3_000): Promise<void> {\n const roots = new Set(ownedPids);\n for (const pid of snapshotChildren().keys()) roots.add(pid);\n const plan = signalTrees([...roots]);\n if (!plan) return;\n const deadline = Date.now() + Math.max(0, graceMs);\n while (Date.now() < deadline && hasSurvivors(plan.targets)) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, Math.min(100, Math.max(1, deadline - Date.now()))),\n );\n }\n killStragglers(plan);\n }\n\n return {\n snapshotChildren,\n findNewChildren,\n registerOwnedPids,\n unregisterOwnedPids,\n acquireSpawnLock,\n withSpawnSerial,\n killTrees,\n killOwnedTreesForShutdown,\n };\n}\n",
38
39
  "/**\n * Codex rollout encoder.\n *\n * Materializes a synthetic JSONL at\n * `~/.codex/sessions/<yyyy>/<mm>/<dd>/rollout-<ts>-<threadId>.jsonl` so a\n * subsequent `codex.resumeThread(threadId)` continues the cross-agent\n * conversation as if it had always been native. Verified by sandbox PoC\n * test-7c: the SDK accepts these without checksum gating, requiring only the\n * captured 5-entry SDK shell (`agents/fixtures/codex-shell.jsonl`) plus\n * synthesized `response_item`/`event_msg` pairs per turn.\n *\n * Tool history is folded into assistant text as `[Tool: ...]` annotations\n * (see shared.ts:extractChatPairs). Native same-agent forks use App Server's\n * `thread/fork`; this encoder remains the fallback and cross-agent bridge,\n * where synthetic tool_use IDs are too fragile to reconstruct structurally.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync, realpathSync, statSync, unlinkSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { hostedCodexHomePath } from \"#agents/execution-host\";\nimport {\n assertUuidLike,\n type ChatPair,\n clone,\n ensureCwdExists,\n extractChatPairs,\n FIXTURES_DIR,\n} from \"#agents/rollout/shared\";\nimport { parseJsonlText, writeJsonlFile } from \"#platform/jsonl\";\nimport { logger } from \"#platform/logger\";\nimport type { ConversationEntry } from \"#storage/conversations\";\nimport type { EffortLevel } from \"#types\";\n\ninterface CodexShell {\n sessionMeta: Record<string, unknown>;\n taskStarted: Record<string, unknown>;\n developerSetup: Record<string, unknown>;\n envContext: Record<string, unknown>;\n turnContext: Record<string, unknown>;\n}\n\nfunction codexSessionsDir(): string {\n return join(hostedCodexHomePath(), \"sessions\");\n}\n\nlet _shellCache: CodexShell | null = null;\nfunction loadCodexShell(): CodexShell {\n if (_shellCache) return _shellCache;\n const raw = readFileSync(join(FIXTURES_DIR, \"codex-shell.jsonl\"), \"utf8\");\n const lines = parseJsonlText<Record<string, unknown>>(raw);\n if (lines.length < 5) {\n throw new Error(\n `loadCodexShell: expected >=5 entries in codex-shell.jsonl, got ${lines.length}`,\n );\n }\n _shellCache = {\n sessionMeta: lines[0],\n taskStarted: lines[1],\n developerSetup: lines[2],\n envContext: lines[3],\n turnContext: lines[4],\n };\n return _shellCache;\n}\n\n/** UUIDv7 (Codex thread_id format). */\nfunction uuidv7(): string {\n const ts = Date.now();\n const tsHex = ts.toString(16).padStart(12, \"0\");\n const rand = randomBytes(10);\n rand[0] = (rand[0] & 0x0f) | 0x70; // version 7\n rand[2] = (rand[2] & 0x3f) | 0x80; // variant\n return [\n tsHex.slice(0, 8),\n tsHex.slice(8, 12),\n rand.slice(0, 2).toString(\"hex\"),\n rand.slice(2, 4).toString(\"hex\"),\n rand.slice(4, 10).toString(\"hex\"),\n ].join(\"-\");\n}\n\n/** Replace captured developer metadata with the policy used for resumed turns. */\nfunction patchDeveloperSetup(developerSetup: Record<string, unknown>): void {\n const payload = developerSetup.payload as Record<string, unknown> | undefined;\n if (!payload) return;\n payload.content = [\n {\n type: \"input_text\",\n text: [\n \"<permissions instructions>\",\n \"Filesystem sandboxing is disabled for this runtime turn (`danger-full-access`).\",\n \"Approval policy is `never`.\",\n \"</permissions instructions>\",\n ].join(\"\\n\"),\n },\n ];\n}\n\n/** Mutate captured `<environment_context>` fields to the current runtime. */\nfunction patchEnvContext(\n envContext: Record<string, unknown>,\n cwd: string,\n currentDate: string,\n timezone: string,\n): void {\n const payload = envContext.payload as Record<string, unknown> | undefined;\n if (!payload) return;\n const content = payload.content as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (block.type === \"input_text\" && typeof block.text === \"string\") {\n block.text = block.text\n .replace(/<cwd>[^<]*<\\/cwd>/, `<cwd>${cwd}</cwd>`)\n .replace(\n /<current_date>[^<]*<\\/current_date>/,\n `<current_date>${currentDate}</current_date>`,\n )\n .replace(/<timezone>[^<]*<\\/timezone>/, `<timezone>${timezone}</timezone>`);\n }\n }\n}\n\nexport interface CodexRolloutOptions {\n /** Working directory the resumed Codex thread will report. */\n cwd: string;\n /** Optional override; default = freshly generated UUIDv7. */\n threadId?: string;\n /** Override extracted pairs. */\n pairs?: ChatPair[];\n /** Source UnifiedEvent log when `pairs` is omitted. */\n entries?: ConversationEntry[];\n /** Effective model/effort that Codex will use when this thread is resumed. */\n model?: string;\n effort?: EffortLevel;\n}\n\nexport interface CodexRolloutResult {\n threadId: string;\n rolloutPath: string;\n}\n\nexport interface CodexContextUsage {\n contextTokens: number;\n contextWindow: number;\n}\n\nexport interface CodexTokenTotals {\n inputTokens: number;\n outputTokens: number;\n cachedInputTokens: number;\n cacheWriteInputTokens: number;\n}\n\nexport interface CodexPatchChangePreview {\n path: string;\n before?: string;\n after?: string;\n diffPreview?: string;\n}\n\nexport interface CodexPatchPreview {\n callId: string;\n changes: CodexPatchChangePreview[];\n}\n\nfunction codexRolloutPath(threadId: string, fallback: Date): string {\n const threadCreatedAt = decodeUuidV7Timestamp(threadId);\n const createdAt = threadCreatedAt === null ? fallback : new Date(threadCreatedAt);\n const yyyy = String(createdAt.getFullYear());\n const mm = String(createdAt.getMonth() + 1).padStart(2, \"0\");\n const dd = String(createdAt.getDate()).padStart(2, \"0\");\n const hh = String(createdAt.getHours()).padStart(2, \"0\");\n const min = String(createdAt.getMinutes()).padStart(2, \"0\");\n const ss = String(createdAt.getSeconds()).padStart(2, \"0\");\n const dir = join(codexSessionsDir(), yyyy, mm, dd);\n return join(dir, `rollout-${yyyy}-${mm}-${dd}T${hh}-${min}-${ss}-${threadId}.jsonl`);\n}\n\nfunction canonicalFilePath(path: string): string {\n const absolute = resolve(path);\n try {\n return realpathSync(absolute);\n } catch {\n try {\n return join(realpathSync(dirname(absolute)), basename(absolute));\n } catch {\n return absolute;\n }\n }\n}\n\nfunction changedPatchLines(value: string): Omit<CodexPatchChangePreview, \"path\"> {\n const removed: string[] = [];\n const added: string[] = [];\n const diffPreview: string[] = [];\n let oldLine = 0;\n let newLine = 0;\n let sawHunk = false;\n for (const line of value.split(\"\\n\")) {\n const hunk = /^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/.exec(line);\n if (hunk) {\n if (sawHunk) diffPreview.push(\"…\");\n sawHunk = true;\n oldLine = Number.parseInt(hunk[1] ?? \"0\", 10);\n newLine = Number.parseInt(hunk[2] ?? \"0\", 10);\n continue;\n }\n if (!sawHunk && (line.startsWith(\"--- \") || line.startsWith(\"+++ \"))) continue;\n if (line.startsWith(\"\\\\ No newline\")) continue;\n if (line.startsWith(\"-\")) {\n removed.push(line.slice(1));\n diffPreview.push(`${oldLine} -${line.slice(1)}`);\n oldLine += 1;\n continue;\n }\n if (line.startsWith(\"+\")) {\n added.push(line.slice(1));\n diffPreview.push(`${newLine} +${line.slice(1)}`);\n newLine += 1;\n continue;\n }\n if (line.startsWith(\" \")) {\n diffPreview.push(`${newLine} ${line.slice(1)}`);\n oldLine += 1;\n newLine += 1;\n }\n }\n return {\n ...(removed.length > 0 ? { before: removed.join(\"\\n\") } : {}),\n ...(added.length > 0 ? { after: added.join(\"\\n\") } : {}),\n ...(diffPreview.length > 0 ? { diffPreview: diffPreview.join(\"\\n\") } : {}),\n };\n}\n\n/**\n * Extract the newest native apply_patch result matching a Codex file_change.\n *\n * The public SDK intentionally reduces file changes to path + kind, while the\n * native rollout keeps the exact unified diff in patch_apply_end. Reading that\n * payload preserves the real per-edit +/- lines even when the topic cwd itself\n * is not a Git repository.\n */\nexport function extractLatestCodexPatchPreview(\n jsonl: string,\n expectedPaths: string[],\n consumedCallIds: ReadonlySet<string> = new Set(),\n expectedCallId?: string,\n): CodexPatchPreview | undefined {\n const expected = expectedPaths.map(canonicalFilePath);\n const lines = jsonl.trimEnd().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n try {\n const entry = JSON.parse(lines[index] ?? \"\") as {\n type?: string;\n payload?: {\n type?: string;\n call_id?: string;\n changes?: Record<\n string,\n { type?: string; unified_diff?: string; content?: string; move_path?: string | null }\n >;\n };\n };\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"patch_apply_end\") continue;\n const callId = entry.payload.call_id;\n const rawChanges = entry.payload.changes;\n if (\n !callId ||\n consumedCallIds.has(callId) ||\n (expectedCallId !== undefined && callId !== expectedCallId) ||\n !rawChanges\n ) {\n continue;\n }\n\n const entries = Object.entries(rawChanges);\n const matched = expected.map((path) =>\n entries.find(([candidate]) => canonicalFilePath(candidate) === path),\n );\n const complete = matched.filter(\n (change): change is NonNullable<typeof change> => change !== undefined,\n );\n if (complete.length !== expected.length) continue;\n\n return {\n callId,\n changes: complete.map(([path, change]) => {\n if (typeof change.unified_diff === \"string\") {\n return { path, ...changedPatchLines(change.unified_diff) };\n }\n const content =\n typeof change.content === \"string\" ? change.content.replace(/\\n$/, \"\") : undefined;\n return {\n path,\n ...(change.type === \"delete\" && content !== undefined ? { before: content } : {}),\n ...(change.type === \"add\" && content !== undefined ? { after: content } : {}),\n };\n }),\n };\n } catch {\n // A concurrently appended final line may be incomplete; keep scanning.\n }\n }\n return undefined;\n}\n\nexport function extractCodexPatchCallIds(jsonl: string): string[] {\n const callIds: string[] = [];\n for (const line of jsonl.trimEnd().split(\"\\n\")) {\n try {\n const entry = JSON.parse(line) as {\n type?: string;\n payload?: { type?: string; call_id?: string };\n };\n if (\n entry.type === \"event_msg\" &&\n entry.payload?.type === \"patch_apply_end\" &&\n typeof entry.payload.call_id === \"string\"\n ) {\n callIds.push(entry.payload.call_id);\n }\n } catch {\n // A concurrently appended final line may be incomplete.\n }\n }\n return callIds;\n}\n\n/** List native patch calls that already existed before a resumed turn. */\nexport function readCodexPatchCallIds(threadId: string): string[] {\n const path = latestCodexRolloutPath(threadId);\n if (!path) return [];\n try {\n return extractCodexPatchCallIds(readFileSync(path, \"utf8\"));\n } catch (error) {\n logger.debug({ error, threadId }, \"codex patch ids: rollout read failed\");\n return [];\n }\n}\n\n/** Resolve a thread's newest native apply_patch preview. */\nexport function readLatestCodexPatchPreview(\n threadId: string,\n expectedPaths: string[],\n consumedCallIds: ReadonlySet<string> = new Set(),\n expectedCallId?: string,\n): CodexPatchPreview | undefined {\n const path = latestCodexRolloutPath(threadId);\n if (!path) return undefined;\n try {\n return extractLatestCodexPatchPreview(\n readFileSync(path, \"utf8\"),\n expectedPaths,\n consumedCallIds,\n expectedCallId,\n );\n } catch (error) {\n logger.debug({ error, threadId }, \"codex patch preview: rollout read failed\");\n return undefined;\n }\n}\n\n/** Read the latest per-request context measurement from a Codex rollout. */\nexport function extractLatestCodexContextUsage(jsonl: string): CodexContextUsage | undefined {\n const lines = jsonl.trimEnd().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n try {\n const entry = JSON.parse(lines[index] ?? \"\") as {\n type?: string;\n payload?: {\n type?: string;\n info?: {\n last_token_usage?: { total_tokens?: number };\n model_context_window?: number;\n };\n };\n };\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") continue;\n const contextTokens = entry.payload.info?.last_token_usage?.total_tokens;\n const contextWindow = entry.payload.info?.model_context_window;\n if (\n typeof contextTokens === \"number\" &&\n Number.isFinite(contextTokens) &&\n contextTokens >= 0 &&\n typeof contextWindow === \"number\" &&\n Number.isFinite(contextWindow) &&\n contextWindow > 0\n ) {\n return { contextTokens, contextWindow };\n }\n } catch {\n // A concurrently appended final line may be incomplete; keep scanning.\n }\n }\n return undefined;\n}\n\n/** Latest cumulative token counter persisted in a native Codex rollout. */\nexport function extractLatestCodexTokenTotals(jsonl: string): CodexTokenTotals | undefined {\n const lines = jsonl.trimEnd().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n try {\n const entry = JSON.parse(lines[index] ?? \"\") as {\n type?: string;\n payload?: {\n type?: string;\n info?: {\n total_token_usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cached_input_tokens?: number;\n cache_write_input_tokens?: number;\n };\n };\n };\n };\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") continue;\n const usage = entry.payload.info?.total_token_usage;\n if (!usage) continue;\n const values = [\n usage.input_tokens,\n usage.output_tokens,\n usage.cached_input_tokens,\n usage.cache_write_input_tokens,\n ];\n if (values.some((value) => value !== undefined && (!Number.isFinite(value) || value < 0))) {\n continue;\n }\n return {\n inputTokens: usage.input_tokens ?? 0,\n outputTokens: usage.output_tokens ?? 0,\n cachedInputTokens: usage.cached_input_tokens ?? 0,\n cacheWriteInputTokens: usage.cache_write_input_tokens ?? 0,\n };\n } catch {\n // A concurrently appended final line may be incomplete; keep scanning.\n }\n }\n return undefined;\n}\n\n/** Resolve a thread's current rollout and return its latest context measurement. */\nexport function readLatestCodexContextUsage(threadId: string): CodexContextUsage | undefined {\n const path = latestCodexRolloutPath(threadId);\n if (!path) return undefined;\n try {\n return extractLatestCodexContextUsage(readFileSync(path, \"utf8\"));\n } catch (error) {\n logger.debug({ error, threadId }, \"codex context usage: rollout read failed\");\n return undefined;\n }\n}\n\nexport function readLatestCodexTokenTotals(threadId: string): CodexTokenTotals | undefined {\n const path = latestCodexRolloutPath(threadId);\n if (!path) return undefined;\n try {\n return extractLatestCodexTokenTotals(readFileSync(path, \"utf8\"));\n } catch (error) {\n logger.debug({ error, threadId }, \"codex token totals: rollout read failed\");\n return undefined;\n }\n}\n\n/**\n * Old and metadata-free Codex rollouts resume as native multi-agent v1 even\n * when the feature flag is false. Rewrite their runtime metadata in place so\n * the same thread can resume without losing provider conversation history.\n */\nexport function migrateCodexRolloutNativeMultiAgentMetadata(threadId: string): boolean {\n const path = latestCodexRolloutPath(threadId);\n if (!path) return false;\n try {\n const entries = parseJsonlText<{\n type?: string;\n payload?: Record<string, unknown>;\n }>(readFileSync(path, \"utf8\"));\n let changed = false;\n for (const entry of entries) {\n if (entry.type !== \"session_meta\" && entry.type !== \"turn_context\") continue;\n if (!entry.payload) entry.payload = {};\n if (entry.payload.multi_agent_version !== \"disabled\") {\n entry.payload.multi_agent_version = \"disabled\";\n changed = true;\n }\n }\n if (changed) {\n writeJsonlFile(path, entries);\n logger.info({ threadId, path }, \"codex rollout native multi-agent metadata disabled\");\n }\n return changed;\n } catch (error) {\n logger.error({ error, threadId, path }, \"codex rollout native multi-agent migration failed\");\n throw new Error(`Failed to migrate Codex rollout '${threadId}'`, { cause: error });\n }\n}\n\nexport function latestCodexRolloutPath(threadId: string): string | undefined {\n const sessionsDir = codexSessionsDir();\n const candidates: string[] = [];\n const buckets = candidateDateBuckets(threadId);\n try {\n if (buckets) {\n for (const bucket of buckets) {\n const dir = join(sessionsDir, bucket);\n if (!existsSync(dir)) continue;\n const glob = new Bun.Glob(`rollout-*-${threadId}.jsonl`);\n for (const rel of glob.scanSync({ cwd: dir, onlyFiles: true })) {\n candidates.push(join(dir, rel));\n }\n }\n }\n // The UUIDv7 timestamp is UTC, but Codex names session directories by the\n // local date, so a session opened in the evening of a negative-offset\n // timezone lands in the previous day's bucket. When the date-derived\n // buckets miss (or none were computed), fall back to a whole-tree scan so\n // that skew never silently drops the rollout.\n if (candidates.length === 0) {\n const glob = new Bun.Glob(`**/rollout-*-${threadId}.jsonl`);\n for (const rel of glob.scanSync({ cwd: sessionsDir, onlyFiles: true })) {\n candidates.push(join(sessionsDir, rel));\n }\n }\n return candidates.sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs)[0];\n } catch (error) {\n logger.debug({ error, threadId }, \"codex rollout lookup failed\");\n return undefined;\n }\n}\n\n/**\n * Materialize a Codex rollout JSONL with the provided dialogue and place it\n * at `~/.codex/sessions/<yyyy>/<mm>/<dd>/rollout-<ts>-<threadId>.jsonl` so a\n * subsequent `codex.resumeThread(threadId)` continues the conversation.\n */\nexport function writeCodexRollout(opts: CodexRolloutOptions): CodexRolloutResult {\n const threadId = opts.threadId ?? uuidv7();\n assertUuidLike(\"threadId\", threadId);\n ensureCwdExists(opts.cwd);\n const pairs = opts.pairs ?? extractChatPairs(opts.entries ?? []);\n const now = new Date();\n const tsIso = now.toISOString();\n const currentDate = [\n now.getFullYear(),\n String(now.getMonth() + 1).padStart(2, \"0\"),\n String(now.getDate()).padStart(2, \"0\"),\n ].join(\"-\");\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || process.env.TZ || \"UTC\";\n\n // Captured 5-entry SDK shell (session_meta, task_started, developer setup,\n // environment_context, turn_context). Cloned per call so the cached\n // fixture is never mutated; only id/timestamp/cwd are patched.\n const shell = loadCodexShell();\n const sessionMeta = clone(shell.sessionMeta);\n (sessionMeta.payload as Record<string, unknown>).id = threadId;\n (sessionMeta.payload as Record<string, unknown>).timestamp = tsIso;\n (sessionMeta.payload as Record<string, unknown>).cwd = opts.cwd;\n (sessionMeta.payload as Record<string, unknown>).multi_agent_version = \"disabled\";\n (sessionMeta as Record<string, unknown>).timestamp = tsIso;\n\n const taskStarted = clone(shell.taskStarted);\n (taskStarted as Record<string, unknown>).timestamp = tsIso;\n\n const developerSetup = clone(shell.developerSetup);\n (developerSetup as Record<string, unknown>).timestamp = tsIso;\n patchDeveloperSetup(developerSetup);\n\n const envContext = clone(shell.envContext);\n (envContext as Record<string, unknown>).timestamp = tsIso;\n patchEnvContext(envContext, opts.cwd, currentDate, timezone);\n\n const turnContext = clone(shell.turnContext);\n (turnContext as Record<string, unknown>).timestamp = tsIso;\n const turnPayload = turnContext.payload as Record<string, unknown>;\n turnPayload.cwd = opts.cwd;\n turnPayload.current_date = currentDate;\n turnPayload.timezone = timezone;\n turnPayload.approval_policy = \"never\";\n turnPayload.sandbox_policy = { type: \"danger-full-access\" };\n turnPayload.multi_agent_version = \"disabled\";\n delete turnPayload.permission_profile;\n if (opts.model) turnPayload.model = opts.model;\n const collaborationMode = turnPayload.collaboration_mode as Record<string, unknown> | undefined;\n const collaborationSettings = collaborationMode?.settings as Record<string, unknown> | undefined;\n if (collaborationSettings) {\n if (opts.model) collaborationSettings.model = opts.model;\n if (opts.effort !== undefined) collaborationSettings.reasoning_effort = opts.effort;\n }\n\n const lines: unknown[] = [sessionMeta, taskStarted, developerSetup, envContext, turnContext];\n\n for (const pair of pairs) {\n lines.push({\n timestamp: tsIso,\n type: \"response_item\",\n payload: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text: pair.userText }],\n },\n });\n lines.push({\n timestamp: tsIso,\n type: \"event_msg\",\n payload: {\n type: \"user_message\",\n message: pair.userText,\n images: [],\n local_images: [],\n text_elements: [],\n },\n });\n lines.push({\n timestamp: tsIso,\n type: \"event_msg\",\n payload: {\n type: \"agent_message\",\n message: pair.assistantText,\n phase: \"final_answer\",\n memory_citation: null,\n },\n });\n lines.push({\n timestamp: tsIso,\n type: \"response_item\",\n payload: {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: pair.assistantText }],\n phase: \"final_answer\",\n },\n });\n }\n\n lines.push({\n timestamp: tsIso,\n type: \"event_msg\",\n payload: { type: \"task_complete\" },\n });\n\n // Codex indexes a thread by the local wall-clock timestamp encoded in its\n // UUIDv7 creation time. A cross-agent round-trip may rewrite the rollout\n // much later, but the path must remain the original canonical path or\n // `thread/resume` rejects it as missing and the provider starts fresh.\n const path = codexRolloutPath(threadId, now);\n\n // Round-trip cleanup: when the caller reused a threadId (claude→codex→...\n // or maestro→codex→... cycles via `findLastSessionIdForAgent`), the SDK's\n // original rollout for that threadId still sits at its canonical path.\n // Sweep every prior file for this threadId BEFORE replacing that path so\n // legacy writers cannot leave ambiguous duplicates behind.\n //\n // Synchronous on purpose: writeCodexRollout's signature is sync (called\n // inside set_agent's DB transaction), and an async sweep would race with\n // the following `writeJsonlFile` — Bun.Glob would re-scan once the\n // microtask queue drains and could unlink the file we just wrote if today\n // and the original-write-date are the same. Sync glob/unlink completes\n // before the new file ever lands on disk.\n //\n // Only runs when `opts.threadId` was supplied; fresh-mint threadIds can't\n // have prior files. Errors are logged but non-fatal — losing the sweep on\n // a permission glitch is preferable to crashing the whole switch.\n if (opts.threadId) {\n sweepPriorRolloutsForThread(opts.threadId);\n }\n\n writeJsonlFile(path, lines);\n logger.info(\n { threadId, path, pairs: pairs.length },\n \"writeCodexRollout: synthetic rollout placed\",\n );\n return { threadId, rolloutPath: path };\n}\n\n/**\n * Synchronous unlink of every existing `rollout-*-<threadId>.jsonl` under\n * `~/.codex/sessions/**`. Same glob shape `codexRegistry.cleanupRollouts`\n * uses (kept duplicate rather than imported to avoid the registry → rollout\n * → registry cycle).\n */\nfunction sweepPriorRolloutsForThread(threadId: string): void {\n const sessionsDir = codexSessionsDir();\n const buckets = candidateDateBuckets(threadId);\n if (!buckets) {\n // Couldn't pin a date from the threadId — fall back to the safer (but\n // much slower) whole-tree scan so we still find every prior rollout.\n sweepPriorRolloutsFullTree(threadId, sessionsDir);\n return;\n }\n for (const bucket of buckets) {\n const dir = join(sessionsDir, bucket);\n if (!existsSync(dir)) continue;\n try {\n const glob = new Bun.Glob(`rollout-*-${threadId}.jsonl`);\n for (const rel of glob.scanSync({ cwd: dir, onlyFiles: true })) {\n const fullPath = join(dir, rel);\n try {\n unlinkSync(fullPath);\n } catch (e) {\n if ((e as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n logger.warn(\n { err: e, path: fullPath },\n \"writeCodexRollout: prior-rollout unlink failed (continuing)\",\n );\n }\n }\n }\n } catch (e) {\n logger.warn(\n { err: e, threadId, bucket },\n \"writeCodexRollout: prior-rollout bucket scan failed (continuing)\",\n );\n }\n }\n}\n\n/** Legacy whole-tree scan. Used only when `candidateDateBuckets` can't pin a\n * date set from the threadId (non-UUIDv7 ids, e.g. some test fixtures). */\nfunction sweepPriorRolloutsFullTree(threadId: string, sessionsDir: string): void {\n try {\n const glob = new Bun.Glob(`**/rollout-*-${threadId}.jsonl`);\n for (const rel of glob.scanSync({ cwd: sessionsDir, onlyFiles: true })) {\n const fullPath = join(sessionsDir, rel);\n try {\n unlinkSync(fullPath);\n } catch (e) {\n if ((e as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n logger.warn(\n { err: e, path: fullPath },\n \"writeCodexRollout: prior-rollout unlink failed (continuing)\",\n );\n }\n }\n }\n } catch (e) {\n logger.warn(\n { err: e, threadId },\n \"writeCodexRollout: full-tree prior-rollout sweep failed (continuing)\",\n );\n }\n}\n\n/**\n * UUIDv7 ids encode their creation time in the first 48 bits. Current writers\n * always use that canonical birth-date bucket, but older writers used the\n * rewrite date during cross-agent bridges. Enumerate the inclusive range from\n * birth date to today so cleanup also removes those legacy misplaced files.\n *\n * Returns null when:\n * - threadId isn't a parseable UUIDv7 (atypical fixture / future format)\n * - the day span exceeds MAX_DAY_SPAN (a month+-old re-bridge isn't worth\n * per-day enumeration; safer to scan the full tree than to enumerate\n * hundreds of dirs and still maybe miss something)\n * In both cases the caller falls back to the whole-tree sweep so safety\n * never degrades below the original implementation.\n */\nconst MAX_DAY_SPAN = 30;\nconst DAY_MS = 86_400_000;\nconst LOCAL_DATE_SKEW_DAYS = 1;\n\nfunction candidateDateBuckets(threadId: string): Set<string> | null {\n const tidMs = decodeUuidV7Timestamp(threadId);\n if (tidMs === null) return null;\n const nowMs = Date.now();\n // Day-floor each end so DST / minutes-of-day noise doesn't bloat the span.\n const tidDay = Math.floor(tidMs / DAY_MS);\n const todayDay = Math.floor(nowMs / DAY_MS);\n const minDay = Math.min(tidDay, todayDay);\n const maxDay = Math.max(tidDay, todayDay);\n const span = maxDay - minDay;\n if (span > MAX_DAY_SPAN) return null;\n const buckets = new Set<string>();\n // Codex buckets sessions by local calendar date while UUIDv7 timestamps are\n // UTC. Include one day on each edge so every date-bucketed caller (context\n // usage, migration, and prior-rollout cleanup) covers timezone skew without\n // falling back to a whole-tree scan.\n for (let d = minDay - LOCAL_DATE_SKEW_DAYS; d <= maxDay + LOCAL_DATE_SKEW_DAYS; d++) {\n buckets.add(formatDateBucket(new Date(d * DAY_MS)));\n }\n return buckets;\n}\n\n/**\n * Decode the 48-bit unix-ms timestamp out of a UUIDv7. The first 12 hex\n * chars of the dash-separated form are the timestamp. Returns null when the\n * input doesn't look like a UUIDv7 or the decoded value is outside a\n * plausibility window (defensive: a malformed id that fits the regex but\n * decodes to year 1972 would point the sweep at a non-existent bucket —\n * better to fall back to the whole-tree scan than to silently no-op).\n *\n * Exported for tests.\n */\nexport function decodeUuidV7Timestamp(threadId: string): number | null {\n if (typeof threadId !== \"string\") return null;\n const m =\n /^([0-9a-fA-F]{8})-([0-9a-fA-F]{4})-7[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.exec(\n threadId,\n );\n if (!m) return null;\n const hex = `${m[1]}${m[2]}`;\n const ms = Number.parseInt(hex, 16);\n if (!Number.isFinite(ms)) return null;\n const MIN = 1577836800000; // 2020-01-01T00:00:00Z\n const MAX = 4102444800000; // 2100-01-01T00:00:00Z\n if (ms < MIN || ms > MAX) return null;\n return ms;\n}\n\nfunction formatDateBucket(d: Date): string {\n const yyyy = d.getUTCFullYear();\n const mm = String(d.getUTCMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getUTCDate()).padStart(2, \"0\");\n return `${yyyy}/${mm}/${dd}`;\n}\n\n/** Internal export for tests. */\nexport const __candidateDateBuckets = candidateDateBuckets;\n",
@@ -42,7 +43,7 @@
42
43
  "import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\n\nexport type BundledClaudeRuntime =\n | { ok: true; sdkVersion: string; claudeCodeVersion: string }\n | { ok: false; error: string };\n\nlet cached: BundledClaudeRuntime | undefined;\n\nexport function inspectBundledClaudeRuntime(): BundledClaudeRuntime {\n if (cached) return cached;\n try {\n const require = createRequire(import.meta.url);\n const sdkDir = dirname(require.resolve(\"@anthropic-ai/claude-agent-sdk\"));\n const sdkPackage = JSON.parse(readFileSync(join(sdkDir, \"package.json\"), \"utf8\")) as {\n version?: unknown;\n };\n const manifest = JSON.parse(readFileSync(join(sdkDir, \"manifest.json\"), \"utf8\")) as {\n version?: unknown;\n };\n const sdkVersion = typeof sdkPackage.version === \"string\" ? sdkPackage.version : \"\";\n const claudeCodeVersion = typeof manifest.version === \"string\" ? manifest.version : \"\";\n if (!sdkVersion || !claudeCodeVersion) {\n cached = { ok: false, error: \"Claude Agent SDK runtime version metadata is incomplete\" };\n } else if (sdkVersion.split(\".\").at(-1) !== claudeCodeVersion.split(\".\").at(-1)) {\n cached = {\n ok: false,\n error: `Claude Agent SDK ${sdkVersion} does not match bundled Claude Code ${claudeCodeVersion}`,\n };\n } else {\n cached = { ok: true, sdkVersion, claudeCodeVersion };\n }\n } catch (error) {\n cached = {\n ok: false,\n error: `Failed to inspect bundled Claude runtime: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n return cached;\n}\n",
43
44
  "import { claudeProvider } from \"#agents/claude-provider\";\nimport { codexProvider } from \"#agents/codex-provider\";\nimport {\n type AgentExecutionHost,\n configureAgentExecutionHost,\n resolveAgentExecutionHost,\n transformHostedQueryOptions,\n withAgentExecutionHost,\n} from \"#agents/execution-host\";\nimport { maestroProvider } from \"#agents/maestro-provider\";\nimport { revokeCanonicalMcpBridgeTurn } from \"#mcp/canonical-bridge-config\";\nimport type { AgentQueryOptions, UnifiedEvent } from \"#types\";\n\nexport {\n buildClaudeDisallowedTools,\n claudeProvider,\n spawnClaudeCodeProcessWithTreeKill,\n} from \"#agents/claude-provider\";\nexport {\n type BundledClaudeRuntime,\n inspectBundledClaudeRuntime,\n} from \"#agents/claude-runtime-inspection\";\nexport { codexProvider, toCodexMcpServers } from \"#agents/codex-provider\";\nexport {\n buildMaestroDisallowedTools,\n buildMaestroToolHooks,\n maestroProvider,\n} from \"#agents/maestro-provider\";\nexport type { AgentQueryOptions, UnifiedEvent };\nexport { type AgentExecutionHost, configureAgentExecutionHost };\n\n/**\n * Provider-only execution entry point for embedding hosts.\n *\n * Conversation persistence, authorization, placement, and topic lifecycle are\n * deliberately not handled here; those remain the embedding host's concern.\n */\nexport async function* runHostedAgent(\n input: AgentQueryOptions,\n host?: Partial<AgentExecutionHost>,\n): AsyncGenerator<UnifiedEvent> {\n const executionHost = resolveAgentExecutionHost(host);\n const opts = await withAgentExecutionHost(executionHost, async () =>\n transformHostedQueryOptions({ ...input }),\n );\n try {\n let events: AsyncGenerator<UnifiedEvent>;\n switch (opts.agent) {\n case \"claude\":\n events = claudeProvider(opts);\n break;\n case \"codex\":\n events = codexProvider(opts);\n break;\n case \"maestro\":\n events = maestroProvider(opts);\n break;\n default: {\n const exhaustive: never = opts.agent;\n throw new Error(`runHostedAgent: unknown agent '${exhaustive}'`);\n }\n }\n while (true) {\n const next = await withAgentExecutionHost(executionHost, () => events.next());\n if (next.done) return;\n yield next.value;\n }\n } finally {\n if (opts.userId && opts.topicId && opts.queryId && opts.peerBridge) {\n revokeCanonicalMcpBridgeTurn({\n userId: opts.userId,\n topicId: opts.topicId,\n queryId: opts.queryId,\n peerBridge: opts.peerBridge,\n });\n }\n }\n}\n"
44
45
  ],
45
- "mappings": "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",
46
- "debugId": "AAFB3B393DF7264D64756E2164756E21",
46
+ "mappings": "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",
47
+ "debugId": "8986D026DD1A3D4964756E2164756E21",
47
48
  "names": []
48
49
  }