negotium 0.1.8 → 0.1.10

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 (202) hide show
  1. package/README.md +24 -0
  2. package/dist/canonical-mcp-bridge.js +14 -0
  3. package/dist/canonical-mcp-bridge.js.map +9 -0
  4. package/dist/{chunk-n17yxpa8.js → chunk-1jdws5ns.js} +3 -3
  5. package/dist/chunk-1msje2zf.js +23 -0
  6. package/dist/chunk-1msje2zf.js.map +10 -0
  7. package/dist/{chunk-0ay6cjdy.js → chunk-1vth6t3y.js} +10 -10
  8. package/dist/{chunk-0ay6cjdy.js.map → chunk-1vth6t3y.js.map} +1 -1
  9. package/dist/{chunk-gxma4c70.js → chunk-2p2hds67.js} +22 -17
  10. package/dist/{chunk-gxma4c70.js.map → chunk-2p2hds67.js.map} +2 -2
  11. package/dist/{chunk-j2behpy7.js → chunk-39czd64s.js} +9 -9
  12. package/dist/{chunk-5ahkew9c.js → chunk-4f43r1nd.js} +8 -108
  13. package/dist/{chunk-5ahkew9c.js.map → chunk-4f43r1nd.js.map} +6 -9
  14. package/dist/{chunk-hkdqhm34.js → chunk-4yvkqxmm.js} +1 -1
  15. package/dist/{chunk-ghs2j1fr.js → chunk-5rmbpqy9.js} +18 -15
  16. package/dist/{chunk-ghs2j1fr.js.map → chunk-5rmbpqy9.js.map} +2 -2
  17. package/dist/chunk-9krt5z40.js +113 -0
  18. package/dist/chunk-9krt5z40.js.map +12 -0
  19. package/dist/{chunk-hpa0cpzh.js → chunk-9webgemt.js} +24 -19
  20. package/dist/{chunk-hpa0cpzh.js.map → chunk-9webgemt.js.map} +2 -2
  21. package/dist/{chunk-9p0ww3tk.js → chunk-a3ypq5pp.js} +5 -3
  22. package/dist/{chunk-9p0ww3tk.js.map → chunk-a3ypq5pp.js.map} +2 -2
  23. package/dist/{chunk-e4407g8x.js → chunk-abme0zjm.js} +23 -18
  24. package/dist/{chunk-e4407g8x.js.map → chunk-abme0zjm.js.map} +2 -2
  25. package/dist/{chunk-t9zcg8f1.js → chunk-cp37k2wg.js} +24 -12
  26. package/dist/chunk-cp37k2wg.js.map +13 -0
  27. package/dist/{chunk-fka9eqe1.js → chunk-cphmr4g4.js} +24 -18
  28. package/dist/chunk-cphmr4g4.js.map +11 -0
  29. package/dist/{chunk-w13jjf4a.js → chunk-dj7cpy9k.js} +21 -16
  30. package/dist/{chunk-w13jjf4a.js.map → chunk-dj7cpy9k.js.map} +2 -2
  31. package/dist/{chunk-7xqj7aex.js → chunk-f5xgprg1.js} +2 -20
  32. package/dist/{chunk-7xqj7aex.js.map → chunk-f5xgprg1.js.map} +3 -4
  33. package/dist/{chunk-xfq68rch.js → chunk-f97qybwk.js} +3 -2
  34. package/dist/{chunk-xfq68rch.js.map → chunk-f97qybwk.js.map} +2 -2
  35. package/dist/{chunk-g82jygez.js → chunk-fcskj4xy.js} +6 -6
  36. package/dist/chunk-gdb8ywgf.js +981 -0
  37. package/dist/chunk-gdb8ywgf.js.map +16 -0
  38. package/dist/{chunk-q5bcpf23.js → chunk-grn9fxdn.js} +63 -55
  39. package/dist/{chunk-q5bcpf23.js.map → chunk-grn9fxdn.js.map} +3 -3
  40. package/dist/{chunk-6kctn20e.js → chunk-gsk494xn.js} +29 -24
  41. package/dist/{chunk-6kctn20e.js.map → chunk-gsk494xn.js.map} +2 -2
  42. package/dist/{chunk-gmy11efb.js → chunk-hsq7j9jk.js} +3 -2
  43. package/dist/{chunk-gmy11efb.js.map → chunk-hsq7j9jk.js.map} +2 -2
  44. package/dist/chunk-j0kjscb7.js +53 -0
  45. package/dist/chunk-j0kjscb7.js.map +10 -0
  46. package/dist/chunk-jkencnkw.js +2385 -0
  47. package/dist/chunk-jkencnkw.js.map +26 -0
  48. package/dist/chunk-k9z47mab.js.map +1 -1
  49. package/dist/{chunk-exd0v74a.js → chunk-ka8rv918.js} +155 -101
  50. package/dist/{chunk-exd0v74a.js.map → chunk-ka8rv918.js.map} +4 -4
  51. package/dist/{chunk-a92a7nrk.js → chunk-mamgm6gb.js} +1 -1
  52. package/dist/chunk-mhty3nna.js +150 -0
  53. package/dist/chunk-mhty3nna.js.map +11 -0
  54. package/dist/chunk-pkdmypdd.js +147 -0
  55. package/dist/chunk-pkdmypdd.js.map +11 -0
  56. package/dist/{chunk-p3cr2ejg.js → chunk-q00djwra.js} +39 -31
  57. package/dist/{chunk-p3cr2ejg.js.map → chunk-q00djwra.js.map} +3 -3
  58. package/dist/{chunk-ns3ke88n.js → chunk-rj7w44t0.js} +21 -16
  59. package/dist/{chunk-ns3ke88n.js.map → chunk-rj7w44t0.js.map} +2 -2
  60. package/dist/{chunk-cds1qxsf.js → chunk-rx58pnss.js} +162 -97
  61. package/dist/chunk-rx58pnss.js.map +18 -0
  62. package/dist/{chunk-sm6fh5c5.js → chunk-sxf7krrx.js} +20 -15
  63. package/dist/{chunk-sm6fh5c5.js.map → chunk-sxf7krrx.js.map} +2 -2
  64. package/dist/{chunk-naa09ags.js → chunk-tdxmdy6s.js} +28 -22
  65. package/dist/{chunk-naa09ags.js.map → chunk-tdxmdy6s.js.map} +3 -3
  66. package/dist/{chunk-fgrme9tr.js → chunk-waf61p58.js} +373 -2643
  67. package/dist/chunk-waf61p58.js.map +29 -0
  68. package/dist/{chunk-rafc55bs.js → chunk-wfhghtdz.js} +21 -16
  69. package/dist/{chunk-rafc55bs.js.map → chunk-wfhghtdz.js.map} +2 -2
  70. package/dist/{chunk-jzkw2f01.js → chunk-wgrk1d2n.js} +23 -18
  71. package/dist/{chunk-jzkw2f01.js.map → chunk-wgrk1d2n.js.map} +2 -2
  72. package/dist/{chunk-jkqq5ef6.js → chunk-y3de7fp3.js} +22 -17
  73. package/dist/{chunk-jkqq5ef6.js.map → chunk-y3de7fp3.js.map} +2 -2
  74. package/dist/{chunk-rbrxjvbj.js → chunk-yx2dvsye.js} +93 -36
  75. package/dist/chunk-yx2dvsye.js.map +24 -0
  76. package/dist/{chunk-jc0at0tc.js → chunk-z2xy5n2q.js} +3 -2
  77. package/dist/{chunk-jc0at0tc.js.map → chunk-z2xy5n2q.js.map} +2 -2
  78. package/dist/{chunk-e5pbggsh.js → chunk-z6654rf6.js} +21 -16
  79. package/dist/{chunk-e5pbggsh.js.map → chunk-z6654rf6.js.map} +2 -2
  80. package/dist/cron.js +12976 -0
  81. package/dist/cron.js.map +134 -0
  82. package/dist/hosted-agent.js +63 -0
  83. package/dist/hosted-agent.js.map +10 -0
  84. package/dist/main.js +12 -12
  85. package/dist/main.js.map +1 -1
  86. package/dist/mcp-servers.js +47 -0
  87. package/dist/mcp-servers.js.map +10 -0
  88. package/dist/prompts.js +451 -0
  89. package/dist/prompts.js.map +13 -0
  90. package/dist/registry.js +258 -0
  91. package/dist/registry.js.map +17 -0
  92. package/dist/rollout.js +43 -0
  93. package/dist/rollout.js.map +10 -0
  94. package/dist/runtime/cron/background-sessions.ts +91 -0
  95. package/dist/runtime/cron/context.ts +123 -0
  96. package/dist/runtime/cron/host.ts +67 -0
  97. package/dist/runtime/cron/index.ts +92 -0
  98. package/dist/runtime/cron/mcp-server.ts +517 -0
  99. package/dist/runtime/cron/module.ts +169 -0
  100. package/dist/runtime/cron/schedule.ts +211 -0
  101. package/dist/runtime/cron/scheduler.ts +444 -0
  102. package/dist/runtime/cron/scripts.ts +181 -0
  103. package/dist/runtime/cron/store.ts +1043 -0
  104. package/dist/runtime/cron/summarize.ts +115 -0
  105. package/dist/runtime/src/agents/execution-host.ts +20 -0
  106. package/dist/runtime/src/agents/hosted-agent.ts +23 -8
  107. package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +75 -1
  108. package/dist/runtime/src/agents/rollout/index.ts +20 -0
  109. package/dist/runtime/src/agents/rollout/shared.ts +36 -3
  110. package/dist/runtime/src/application/submit-user-message.ts +3 -0
  111. package/dist/runtime/src/mcp/runtime-spec.ts +3 -0
  112. package/dist/runtime/src/platform/mcp-config.ts +13 -0
  113. package/dist/runtime/src/prompts/builders.ts +21 -10
  114. package/dist/runtime/src/query/active-rooms.ts +33 -11
  115. package/dist/runtime/src/runtime/inbox.ts +146 -49
  116. package/dist/runtime/src/runtime/public-helpers.ts +11 -0
  117. package/dist/runtime/src/runtime/task-format.ts +18 -0
  118. package/dist/runtime/src/runtime/tasks.ts +2 -16
  119. package/dist/runtime/src/runtime/turn-runner.ts +78 -16
  120. package/dist/runtime/src/storage/runtime-turn-requests.ts +1 -0
  121. package/dist/runtime/src/storage/vault-crypto.ts +11 -5
  122. package/dist/runtime/src/storage/vault-public.ts +27 -0
  123. package/dist/runtime/src/storage/vault.ts +95 -42
  124. package/dist/runtime/src/types/api.ts +2 -0
  125. package/dist/runtime/src/types.ts +2 -0
  126. package/dist/runtime/src/version.ts +1 -1
  127. package/dist/runtime-helpers.js +465 -0
  128. package/dist/runtime-helpers.js.map +18 -0
  129. package/dist/types/apps/negotium/src/mcp-servers.d.ts +7 -0
  130. package/dist/types/packages/core/src/agents/claude-provider.d.ts +23 -0
  131. package/dist/types/packages/core/src/agents/claude-registry.d.ts +2 -0
  132. package/dist/types/packages/core/src/agents/codex-native-multi-agent.d.ts +8 -0
  133. package/dist/types/packages/core/src/agents/codex-provider.d.ts +45 -0
  134. package/dist/types/packages/core/src/agents/codex-registry.d.ts +2 -0
  135. package/dist/types/packages/core/src/agents/codex-tree-kill.d.ts +78 -0
  136. package/dist/types/packages/core/src/agents/contracts.d.ts +63 -0
  137. package/dist/types/packages/core/src/agents/deep-map.d.ts +2 -0
  138. package/dist/types/packages/core/src/agents/execution-host.d.ts +31 -0
  139. package/dist/types/packages/core/src/agents/hosted-agent.d.ts +11 -0
  140. package/dist/types/packages/core/src/agents/maestro-provider.d.ts +67 -0
  141. package/dist/types/packages/core/src/agents/maestro-registry.d.ts +17 -0
  142. package/dist/types/packages/core/src/agents/registry.d.ts +4 -0
  143. package/dist/types/packages/core/src/agents/rollout/claude.d.ts +72 -0
  144. package/dist/types/packages/core/src/agents/rollout/codex.d.ts +70 -0
  145. package/dist/types/packages/core/src/agents/rollout/index.d.ts +6 -0
  146. package/dist/types/packages/core/src/agents/rollout/shared.d.ts +50 -0
  147. package/dist/types/packages/core/src/agents/vault-tool-policy.d.ts +4 -0
  148. package/dist/types/packages/core/src/mcp/canonical-bridge-config.d.ts +21 -0
  149. package/dist/types/packages/core/src/mcp/runtime-spec.d.ts +36 -0
  150. package/dist/types/packages/core/src/mcp/session-comm/bridge-ipc-config.d.ts +6 -0
  151. package/dist/types/packages/core/src/media/file-events.d.ts +14 -0
  152. package/dist/types/packages/core/src/platform/config.d.ts +95 -0
  153. package/dist/types/packages/core/src/platform/error.d.ts +6 -0
  154. package/dist/types/packages/core/src/platform/file-utils.d.ts +6 -0
  155. package/dist/types/packages/core/src/platform/jsonl.d.ts +33 -0
  156. package/dist/types/packages/core/src/platform/logger.d.ts +14 -0
  157. package/dist/types/packages/core/src/platform/maestro-bootstrap-env.d.ts +0 -0
  158. package/dist/types/packages/core/src/platform/mcp-config.d.ts +227 -0
  159. package/dist/types/packages/core/src/prompts/builders.d.ts +32 -0
  160. package/dist/types/packages/core/src/runtime/attachments.d.ts +36 -0
  161. package/dist/types/packages/core/src/runtime/channel-context.d.ts +13 -0
  162. package/dist/types/packages/core/src/runtime/file-hooks.d.ts +38 -0
  163. package/dist/types/packages/core/src/runtime/public-helpers.d.ts +3 -0
  164. package/dist/types/packages/core/src/runtime/task-format.d.ts +4 -0
  165. package/dist/types/packages/core/src/runtime/visual-html.d.ts +13 -0
  166. package/dist/types/packages/core/src/security/sanitize.d.ts +16 -0
  167. package/dist/types/packages/core/src/security/sensitive-path.d.ts +1 -0
  168. package/dist/types/packages/core/src/storage/api-messages.d.ts +111 -0
  169. package/dist/types/packages/core/src/storage/conversations.d.ts +123 -0
  170. package/dist/types/packages/core/src/storage/forum-db.d.ts +1 -0
  171. package/dist/types/packages/core/src/storage/sqlite.d.ts +4 -0
  172. package/dist/types/packages/core/src/storage/vault-crypto.d.ts +11 -0
  173. package/dist/types/packages/core/src/storage/vault-public.d.ts +3 -0
  174. package/dist/types/packages/core/src/storage/vault.d.ts +39 -0
  175. package/dist/types/packages/core/src/types/api.d.ts +472 -0
  176. package/dist/types/packages/core/src/types.d.ts +249 -0
  177. package/dist/types/packages/core/src/version.d.ts +1 -0
  178. package/dist/types/packages/module-cron/src/background-sessions.d.ts +2 -0
  179. package/dist/types/packages/module-cron/src/context.d.ts +15 -0
  180. package/dist/types/packages/module-cron/src/host.d.ts +23 -0
  181. package/dist/types/packages/module-cron/src/index.d.ts +14 -0
  182. package/dist/types/packages/module-cron/src/module.d.ts +13 -0
  183. package/dist/types/packages/module-cron/src/schedule.d.ts +23 -0
  184. package/dist/types/packages/module-cron/src/scheduler.d.ts +46 -0
  185. package/dist/types/packages/module-cron/src/scripts.d.ts +23 -0
  186. package/dist/types/packages/module-cron/src/store.d.ts +127 -0
  187. package/dist/types/packages/module-cron/src/summarize.d.ts +4 -0
  188. package/dist/vault.js +533 -0
  189. package/dist/vault.js.map +15 -0
  190. package/package.json +52 -2
  191. package/dist/chunk-6cpn7ht2.js +0 -287
  192. package/dist/chunk-6cpn7ht2.js.map +0 -13
  193. package/dist/chunk-cds1qxsf.js.map +0 -17
  194. package/dist/chunk-fgrme9tr.js.map +0 -47
  195. package/dist/chunk-fka9eqe1.js.map +0 -11
  196. package/dist/chunk-rbrxjvbj.js.map +0 -23
  197. package/dist/chunk-t9zcg8f1.js.map +0 -13
  198. /package/dist/{chunk-n17yxpa8.js.map → chunk-1jdws5ns.js.map} +0 -0
  199. /package/dist/{chunk-j2behpy7.js.map → chunk-39czd64s.js.map} +0 -0
  200. /package/dist/{chunk-hkdqhm34.js.map → chunk-4yvkqxmm.js.map} +0 -0
  201. /package/dist/{chunk-g82jygez.js.map → chunk-fcskj4xy.js.map} +0 -0
  202. /package/dist/{chunk-a92a7nrk.js.map → chunk-mamgm6gb.js.map} +0 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/core/src/agents/codex-registry.ts", "../../../packages/core/src/agents/maestro-registry.ts", "../../../packages/core/src/agents/registry.ts"],
4
+ "sourcesContent": [
5
+ "import { unlinkSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentRegistry } from \"#agents/contracts\";\nimport { writeCodexRollout } from \"#agents/rollout/codex\";\nimport { logger } from \"#platform/logger\";\nimport { readConversation } from \"#storage/conversations\";\nimport { CODEX_EFFORT_VALUES, type EffortLevel } from \"#types\";\n\nconst VALID_EFFORTS = new Set<EffortLevel>(CODEX_EFFORT_VALUES);\n\n// Codex CLI's own empirical default is gpt-5.6-sol (`codex exec` 2026-07-10 →\n// \"model: gpt-5.6-sol\"), but we deliberately default to gpt-5.6-luna — the\n// cheapest/fastest GPT-5.6 tier — for a general always-on assistant where most\n// queries are light. Heavier work escalates to terra/sol via set_model. This\n// value is passed explicitly to the SDK (see event-processor resolveDefaultModel),\n// so the footer and the actual model stay in sync.\nexport const codexRegistry: AgentRegistry = {\n kind: \"codex\",\n defaultModel: \"gpt-5.6-luna\",\n // defaultEffort intentionally omitted — Codex SDK treats absence as\n // \"reasoning off\". Setting \"high\"/etc. would silently flip on reasoning.\n\n expandModelAlias(s) {\n return s;\n },\n\n validateModel(s) {\n // Codex doesn't publish a closed model list and OpenAI ships new IDs\n // (gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, o3, ...) frequently. Best-effort: accept any\n // non-empty string. Bad IDs surface at SDK call time with a clear error.\n return typeof s === \"string\" && s.length > 0;\n },\n\n validEfforts: CODEX_EFFORT_VALUES,\n validateEffort(s) {\n // GPT-5.6 accepts low/medium/high/xhigh/max; 'minimal'\n // was removed because the Codex API rejects it when default tools\n // (image_gen, web_search) are active.\n return VALID_EFFORTS.has(s);\n },\n\n footerLabel(model, effort) {\n // Codex omits effort to mean \"reasoning off\". Show `(off)` explicitly so\n // the user can distinguish from claude (which always has a default).\n return `${model} · ${effort ?? \"(off)\"}`;\n },\n\n writeRollout(opts) {\n // Codex SDK exposes the resume key as `threadId`; AgentRegistry unifies\n // the name to `sessionId` so callers don't branch on agent.\n // `reuseSessionId` (if any) is forwarded as `threadId` so claude→codex→claude\n // round-trips also keep one continuous codex thread instead of orphaning a\n // fresh uuidv7 on every switch.\n const { threadId, rolloutPath } = writeCodexRollout({\n cwd: opts.cwd,\n entries: opts.entries,\n model: opts.model ?? codexRegistry.defaultModel,\n ...(opts.effort ? { effort: opts.effort } : {}),\n ...(opts.reuseSessionId ? { threadId: opts.reuseSessionId } : {}),\n });\n return { sessionId: threadId, rolloutPath };\n },\n\n // Codex SDK has no fork API. We synthesize a rollout from the\n // provider-agnostic conversation log (same path as `set_agent` cross-agent\n // bridging). Caveats: extractChatPairs folds tool_use/tool_result into\n // assistant text as `[Tool: ...]` annotations, so structural tool history\n // is lost.\n async forkSession({ cwd, userId, topicName, model, effort }) {\n const entries = readConversation(userId, topicName);\n const { threadId, rolloutPath } = writeCodexRollout({\n cwd,\n entries,\n model: model ?? codexRegistry.defaultModel,\n ...(effort ? { effort } : {}),\n });\n return { forkId: threadId, rolloutPath };\n },\n\n // Codex stores rollouts at `~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-<ts>-<threadId>.jsonl`.\n // The date prefix is unknown at cleanup time (it's the *original* write\n // timestamp, not \"now\"), so we glob across the whole sessions tree by\n // threadId suffix. With at most a few thousand files in active use this\n // is well under a millisecond on a warm filesystem.\n async cleanupRollouts({ sessionIds }) {\n if (sessionIds.length === 0) return;\n const sessionsDir = join(process.env.CODEX_HOME || join(homedir(), \".codex\"), \"sessions\");\n const failures: unknown[] = [];\n // One Glob per threadId so a single corrupt entry can't poison the rest.\n // Bun.Glob's `scan` yields paths relative to its base dir.\n for (const tid of sessionIds) {\n try {\n const glob = new Bun.Glob(`**/rollout-*-${tid}.jsonl`);\n for await (const rel of glob.scan({ cwd: sessionsDir, onlyFiles: true })) {\n const path = join(sessionsDir, rel);\n try {\n unlinkSync(path);\n } catch (e) {\n if ((e as NodeJS.ErrnoException)?.code !== \"ENOENT\") {\n logger.warn({ err: e, path }, \"codex cleanupRollouts: unlink failed\");\n failures.push(e);\n }\n }\n }\n } catch (e) {\n logger.warn({ err: e, threadId: tid }, \"codex cleanupRollouts: scan failed\");\n failures.push(e);\n }\n }\n if (failures.length > 0) {\n throw new AggregateError(failures, \"codex cleanupRollouts failed\");\n }\n },\n};\n",
6
+ "/**\n * Maestro agent registry — local re-export of `maestro-agent-sdk` with\n * a project-specific default-model override.\n *\n * Mirrors the pattern of claude-registry.ts / codex-registry.ts so that\n * agents/registry.ts can resolve all three AgentRegistry instances from\n * sibling `@/agents/*` paths, keeping the import topology consistent.\n *\n * maestro-agent-sdk v0.1.39 is DeepSeek-only — the Anthropic and Codex\n * providers were removed. The SDK's own default is `deepseek-pro`, which\n * matches this override. The override is kept explicit so the intent is\n * clear if the upstream default ever changes; users can still switch to\n * `deepseek-flash` per-topic via `/model deepseek-flash`.\n */\nimport \"#platform/maestro-bootstrap-env\";\nimport {\n setConversationReader,\n maestroRegistry as upstreamMaestroRegistry,\n} from \"maestro-agent-sdk\";\nimport type { AgentRegistry } from \"#agents/contracts\";\nimport { readConversation } from \"#storage/conversations\";\n\n// The SDK intentionally defaults its conversation reader to `() => []` so it\n// can stay storage-agnostic. Wire Negotium's unified log into it once at module\n// load; otherwise Maestro forkSession() creates a valid but empty rollout.\nsetConversationReader(readConversation as Parameters<typeof setConversationReader>[0]);\n\nexport const maestroRegistry: AgentRegistry = {\n ...(upstreamMaestroRegistry as AgentRegistry),\n defaultModel: \"deepseek-pro\",\n};\n",
7
+ "import { claudeRegistry } from \"#agents/claude-registry\";\nimport { codexRegistry } from \"#agents/codex-registry\";\nimport type { AgentRegistry } from \"#agents/contracts\";\nimport { maestroRegistry } from \"#agents/maestro-registry\";\nimport type { AgentKind } from \"#types\";\n\nexport type {\n AgentRegistry,\n CleanupRolloutsOptions,\n ForkRegistryOptions,\n ForkRegistryResult,\n WriteRolloutOptions,\n WriteRolloutResult,\n} from \"#agents/contracts\";\n\nconst REGISTRIES: Record<AgentKind, AgentRegistry> = {\n claude: claudeRegistry,\n codex: codexRegistry,\n maestro: maestroRegistry,\n};\n\nexport function getRegistry(agent: AgentKind): AgentRegistry {\n return REGISTRIES[agent];\n}\n"
8
+ ],
9
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;AACA;AACA;AAOA,IAAM,gBAAgB,IAAI,IAAiB,mBAAmB;AAQvD,IAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,cAAc;AAAA,EAId,gBAAgB,CAAC,GAAG;AAAA,IAClB,OAAO;AAAA;AAAA,EAGT,aAAa,CAAC,GAAG;AAAA,IAIf,OAAO,OAAO,MAAM,YAAY,EAAE,SAAS;AAAA;AAAA,EAG7C,cAAc;AAAA,EACd,cAAc,CAAC,GAAG;AAAA,IAIhB,OAAO,cAAc,IAAI,CAAC;AAAA;AAAA,EAG5B,WAAW,CAAC,OAAO,QAAQ;AAAA,IAGzB,OAAO,GAAG,cAAU,UAAU;AAAA;AAAA,EAGhC,YAAY,CAAC,MAAM;AAAA,IAMjB,QAAQ,UAAU,gBAAgB,kBAAkB;AAAA,MAClD,KAAK,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,MACd,OAAO,KAAK,SAAS,cAAc;AAAA,SAC/B,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,SACzC,KAAK,iBAAiB,EAAE,UAAU,KAAK,eAAe,IAAI,CAAC;AAAA,IACjE,CAAC;AAAA,IACD,OAAO,EAAE,WAAW,UAAU,YAAY;AAAA;AAAA,OAQtC,YAAW,GAAG,KAAK,QAAQ,WAAW,OAAO,UAAU;AAAA,IAC3D,MAAM,UAAU,iBAAiB,QAAQ,SAAS;AAAA,IAClD,QAAQ,UAAU,gBAAgB,kBAAkB;AAAA,MAClD;AAAA,MACA;AAAA,MACA,OAAO,SAAS,cAAc;AAAA,SAC1B,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B,CAAC;AAAA,IACD,OAAO,EAAE,QAAQ,UAAU,YAAY;AAAA;AAAA,OAQnC,gBAAe,GAAG,cAAc;AAAA,IACpC,IAAI,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7B,MAAM,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,QAAQ,GAAG,QAAQ,GAAG,UAAU;AAAA,IACxF,MAAM,WAAsB,CAAC;AAAA,IAG7B,WAAW,OAAO,YAAY;AAAA,MAC5B,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,IAAI,KAAK,gBAAgB,WAAW;AAAA,QACrD,iBAAiB,OAAO,KAAK,KAAK,EAAE,KAAK,aAAa,WAAW,KAAK,CAAC,GAAG;AAAA,UACxE,MAAM,OAAO,KAAK,aAAa,GAAG;AAAA,UAClC,IAAI;AAAA,YACF,WAAW,IAAI;AAAA,YACf,OAAO,GAAG;AAAA,YACV,IAAK,GAA6B,SAAS,UAAU;AAAA,cACnD,OAAO,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,sCAAsC;AAAA,cACpE,SAAS,KAAK,CAAC;AAAA,YACjB;AAAA;AAAA,QAEJ;AAAA,QACA,OAAO,GAAG;AAAA,QACV,OAAO,KAAK,EAAE,KAAK,GAAG,UAAU,IAAI,GAAG,oCAAoC;AAAA,QAC3E,SAAS,KAAK,CAAC;AAAA;AAAA,IAEnB;AAAA,IACA,IAAI,SAAS,SAAS,GAAG;AAAA,MACvB,MAAM,IAAI,eAAe,UAAU,8BAA8B;AAAA,IACnE;AAAA;AAEJ;;;ACnGA;AAAA;AAAA,qBAEE;AAAA;AAQF,sBAAsB,gBAA+D;AAE9E,IAAM,kBAAiC;AAAA,KACxC;AAAA,EACJ,cAAc;AAChB;;;ACfA,IAAM,aAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,WAAW,CAAC,OAAiC;AAAA,EAC3D,OAAO,WAAW;AAAA;",
10
+ "debugId": "7423CB24D10F987664756E2164756E21",
11
+ "names": []
12
+ }
@@ -5,33 +5,38 @@ import {
5
5
  isEnrollmentPending,
6
6
  parseEnrollmentInvite,
7
7
  previewEnrollment
8
- } from "./chunk-a92a7nrk.js";
8
+ } from "./chunk-mamgm6gb.js";
9
9
  import {
10
10
  configureOtiumCentral,
11
11
  selfPeerNode
12
- } from "./chunk-ns3ke88n.js";
12
+ } from "./chunk-rj7w44t0.js";
13
13
  import {
14
14
  parseInviteCode,
15
15
  saveJoin
16
- } from "./chunk-e5pbggsh.js";
17
- import"./chunk-exd0v74a.js";
18
- import"./chunk-sm6fh5c5.js";
19
- import"./chunk-jc0at0tc.js";
16
+ } from "./chunk-z6654rf6.js";
17
+ import"./chunk-ka8rv918.js";
18
+ import"./chunk-x1arr7ze.js";
19
+ import"./chunk-sxf7krrx.js";
20
+ import"./chunk-z2xy5n2q.js";
20
21
  import"./chunk-sgsz2fpq.js";
21
22
  import"./chunk-1k7t7bnx.js";
22
- import"./chunk-rbrxjvbj.js";
23
- import"./chunk-ghs2j1fr.js";
24
- import"./chunk-fgrme9tr.js";
25
- import"./chunk-0ay6cjdy.js";
26
- import"./chunk-xfq68rch.js";
27
- import"./chunk-9p0ww3tk.js";
23
+ import"./chunk-yx2dvsye.js";
24
+ import"./chunk-5rmbpqy9.js";
25
+ import"./chunk-waf61p58.js";
26
+ import"./chunk-1vth6t3y.js";
27
+ import"./chunk-f97qybwk.js";
28
+ import"./chunk-a3ypq5pp.js";
29
+ import"./chunk-9krt5z40.js";
30
+ import"./chunk-mhty3nna.js";
28
31
  import"./chunk-vp2db42d.js";
29
- import"./chunk-gmy11efb.js";
30
- import"./chunk-t9zcg8f1.js";
31
- import"./chunk-7xqj7aex.js";
32
- import"./chunk-x1arr7ze.js";
33
- import"./chunk-5ahkew9c.js";
34
- import"./chunk-6cpn7ht2.js";
32
+ import"./chunk-hsq7j9jk.js";
33
+ import"./chunk-jkencnkw.js";
34
+ import"./chunk-4f43r1nd.js";
35
+ import"./chunk-pkdmypdd.js";
36
+ import"./chunk-j0kjscb7.js";
37
+ import"./chunk-cp37k2wg.js";
38
+ import"./chunk-1msje2zf.js";
39
+ import"./chunk-f5xgprg1.js";
35
40
  import"./chunk-k9z47mab.js";
36
41
  import {
37
42
  __require,
@@ -131,4 +136,4 @@ export {
131
136
  joinCommand
132
137
  };
133
138
 
134
- //# debugId=F6245554D39E3BE564756E2164756E21
139
+ //# debugId=E93FFD7D2301057764756E2164756E21
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * `negotium-otium join <code>` — attach this node to an otium workspace as a\n * worker. Production codes carry only `{v:2, central, token}`; the node\n * previews the workspace, creates an X25519 enrollment key, atomically claims\n * the invite, and decrypts the returned credential envelope. Credentials persist under\n * `${DATA_DIR}/otium-join.json` (0600); `negotium-otium serve` mounts the otium\n * peer routes whenever that file exists.\n */\n\nimport { configureOtiumCentral, selfPeerNode } from \"@/central\";\nimport {\n claimEnrollment,\n commitEnrollment,\n isEnrollmentPending,\n parseEnrollmentInvite,\n previewEnrollment,\n} from \"@/enrollment\";\nimport { parseInviteCode, saveJoin } from \"@/join\";\n\nfunction option(args: string[], name: string): string | undefined {\n const index = args.indexOf(`--${name}`);\n return index >= 0 ? args[index + 1]?.trim() : undefined;\n}\n\nasync function confirmEnrollment(message: string): Promise<boolean> {\n if (!process.stdin.isTTY) return false;\n const { createInterface } = await import(\"node:readline/promises\");\n const prompt = createInterface({ input: process.stdin, output: process.stdout });\n try {\n return /^(?:y|yes)$/i.test((await prompt.question(`${message} [y/N] `)).trim());\n } finally {\n prompt.close();\n }\n}\n\nexport async function joinCommand(args: string[]): Promise<void> {\n const code = args[0]?.trim();\n if (!code) {\n console.error(\n \"usage: negotium-otium join <invite-code> [--yes] [--name <node-name>] [--legacy] [--replace]\",\n );\n process.exitCode = 1;\n return;\n }\n\n let join: ReturnType<typeof parseInviteCode>;\n let productionEnrollment = false;\n if (args.includes(\"--legacy\")) {\n try {\n join = parseInviteCode(code);\n } catch (err) {\n console.error(`invalid legacy invite code: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n } else {\n try {\n const invite = parseEnrollmentInvite(code);\n const resuming = isEnrollmentPending(invite);\n let nodeName = option(args, \"name\");\n if (resuming) {\n console.log(`Resuming interrupted Otium enrollment with ${invite.central}`);\n } else {\n const preview = await previewEnrollment(invite);\n const workspace = preview.preview?.workspace;\n nodeName ||= preview.preview?.suggestedNodeName || undefined;\n console.log(`Otium workspace: ${workspace?.name ?? workspace?.slug ?? workspace?.id}`);\n console.log(` central: ${invite.central}`);\n console.log(` transport: ${preview.preview?.transport ?? \"relay\"}`);\n console.log(` access: ${preview.preview?.topics ?? \"explicitly shared topics only\"}`);\n const accepted =\n args.includes(\"--yes\") || (await confirmEnrollment(\"Join this workspace?\"));\n if (!accepted) {\n console.log(\"enrollment cancelled\");\n return;\n }\n }\n join = await claimEnrollment(invite, nodeName);\n productionEnrollment = true;\n } catch (err) {\n console.error(`enrollment failed: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n }\n\n let path: string;\n try {\n const saveOptions = { replaceExisting: args.includes(\"--replace\") };\n path = productionEnrollment ? commitEnrollment(join, saveOptions) : saveJoin(join, saveOptions);\n } catch (err) {\n console.error(`could not save join credentials: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n console.log(`otium join credentials saved to ${path}`);\n console.log(` central: ${join.central}`);\n console.log(` cellId: ${join.cellId}`);\n\n // Self check: confirm the assignment exists and surface the node name.\n configureOtiumCentral(join);\n try {\n const self = await selfPeerNode();\n if (self) {\n console.log(\n `attached to workspace as \"${self.nodeName ?? self.cellId}\" (baseUrl ${self.baseUrl})`,\n );\n } else {\n console.warn(\n \"warning: central answered but this cell has no visible assignment yet — check the workspace assignment\",\n );\n }\n } catch (err) {\n console.warn(\n `warning: could not verify against central (${err instanceof Error ? err.message : err}) — credentials saved anyway`,\n );\n } finally {\n configureOtiumCentral(null);\n }\n console.log(\"\\nnext: `negotium-otium serve` (mounts the otium peer routes automatically)\");\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "F6245554D39E3BE564756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "E93FFD7D2301057764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,8 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  getRegistry
4
- } from "./chunk-5ahkew9c.js";
5
- import"./chunk-6cpn7ht2.js";
4
+ } from "./chunk-9krt5z40.js";
5
+ import"./chunk-mhty3nna.js";
6
+ import"./chunk-4f43r1nd.js";
7
+ import"./chunk-pkdmypdd.js";
6
8
  import {
7
9
  logger
8
10
  } from "./chunk-k9z47mab.js";
@@ -38,4 +40,4 @@ export {
38
40
 
39
41
  export { forkAgentSession, cleanupAgentFork };
40
42
 
41
- //# debugId=F6D753EECB8A5F7C64756E2164756E21
43
+ //# debugId=4A4822D8848E3E0F64756E2164756E21
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "import { existsSync, unlinkSync } from \"node:fs\";\nimport { getRegistry } from \"#agents/registry\";\nimport { logger } from \"#platform/logger\";\nimport type { AgentKind, EffortLevel } from \"#types\";\n\n/**\n * Agent-aware fork primitives.\n *\n * Strategy lives in each agent's registry (`*-registry.ts:forkSession`).\n * Claude uses the SDK's native `forkSession` (byte-equivalent rollout copy);\n * Codex synthesizes a rollout from the provider-agnostic conversation log\n * because the SDK has no fork API. Both surfaces converge on `ForkHandle`.\n */\n\nexport interface ForkAgentSessionOptions {\n agent: AgentKind;\n /** Parent session/thread id to clone from. */\n parentSessionId: string;\n /** Workspace directory the resumed fork will report. Claude also writes\n * the rollout file under this directory. */\n cwd: string;\n /** Used to locate the conversation log for codex synthesis. */\n userId: number | string;\n /** Used to locate the conversation log for codex synthesis. */\n topicName: string;\n /** Optional title forwarded to Claude SDK forkSession; ignored by Codex. */\n title?: string;\n /** Effective model/effort the fork will use when it resumes. */\n model?: string;\n effort?: EffortLevel;\n}\n\nexport interface ForkHandle {\n agent: AgentKind;\n forkId: string;\n /** Absolute path of the rollout file to remove on cleanup. */\n rolloutPath: string;\n}\n\nexport async function forkAgentSession(opts: ForkAgentSessionOptions): Promise<ForkHandle> {\n const { forkId, rolloutPath } = await getRegistry(opts.agent).forkSession({\n parentSessionId: opts.parentSessionId,\n cwd: opts.cwd,\n userId: opts.userId,\n topicName: opts.topicName,\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.effort ? { effort: opts.effort } : {}),\n });\n return { agent: opts.agent, forkId, rolloutPath };\n}\n\n/** Best-effort cleanup of a fork's rollout file. Errors are logged, never thrown. */\nexport function cleanupAgentFork(handle: ForkHandle): void {\n try {\n if (existsSync(handle.rolloutPath)) {\n unlinkSync(handle.rolloutPath);\n }\n } catch (err) {\n logger.warn(\n { err, agent: handle.agent, forkId: handle.forkId, rolloutPath: handle.rolloutPath },\n \"cleanupAgentFork: failed to remove rollout\",\n );\n }\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;AAAA;AAuCA,eAAsB,gBAAgB,CAAC,MAAoD;AAAA,EACzF,QAAQ,QAAQ,gBAAgB,MAAM,YAAY,KAAK,KAAK,EAAE,YAAY;AAAA,IACxE,iBAAiB,KAAK;AAAA,IACtB,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,OACZ,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,OACtC,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,OACtC,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EAC/C,CAAC;AAAA,EACD,OAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,YAAY;AAAA;AAI3C,SAAS,gBAAgB,CAAC,QAA0B;AAAA,EACzD,IAAI;AAAA,IACF,IAAI,WAAW,OAAO,WAAW,GAAG;AAAA,MAClC,WAAW,OAAO,WAAW;AAAA,IAC/B;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,OAAO,KACL,EAAE,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO,QAAQ,aAAa,OAAO,YAAY,GACnF,4CACF;AAAA;AAAA;",
8
- "debugId": "F6D753EECB8A5F7C64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;AAAA;AAuCA,eAAsB,gBAAgB,CAAC,MAAoD;AAAA,EACzF,QAAQ,QAAQ,gBAAgB,MAAM,YAAY,KAAK,KAAK,EAAE,YAAY;AAAA,IACxE,iBAAiB,KAAK;AAAA,IACtB,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,OACZ,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,OACtC,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,OACtC,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EAC/C,CAAC;AAAA,EACD,OAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,YAAY;AAAA;AAI3C,SAAS,gBAAgB,CAAC,QAA0B;AAAA,EACzD,IAAI;AAAA,IACF,IAAI,WAAW,OAAO,WAAW,GAAG;AAAA,MAClC,WAAW,OAAO,WAAW;AAAA,IAC/B;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,OAAO,KACL,EAAE,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO,QAAQ,aAAa,OAAO,YAAY,GACnF,4CACF;AAAA;AAAA;",
8
+ "debugId": "4A4822D8848E3E0F64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -14,30 +14,35 @@ import {
14
14
  resetCronTopicContext,
15
15
  setCronJobEnabled,
16
16
  updateCronJobWithContextReset
17
- } from "./chunk-cds1qxsf.js";
18
- import"./chunk-exd0v74a.js";
19
- import"./chunk-sm6fh5c5.js";
20
- import"./chunk-jc0at0tc.js";
17
+ } from "./chunk-rx58pnss.js";
18
+ import"./chunk-ka8rv918.js";
19
+ import"./chunk-x1arr7ze.js";
20
+ import"./chunk-sxf7krrx.js";
21
+ import"./chunk-z2xy5n2q.js";
21
22
  import"./chunk-sgsz2fpq.js";
22
23
  import"./chunk-1k7t7bnx.js";
23
- import"./chunk-rbrxjvbj.js";
24
- import"./chunk-ghs2j1fr.js";
25
- import"./chunk-fgrme9tr.js";
26
- import"./chunk-0ay6cjdy.js";
24
+ import"./chunk-yx2dvsye.js";
25
+ import"./chunk-5rmbpqy9.js";
26
+ import"./chunk-waf61p58.js";
27
+ import"./chunk-1vth6t3y.js";
27
28
  import {
28
29
  getTopic,
29
30
  getTopicByNameForUser
30
- } from "./chunk-xfq68rch.js";
31
- import"./chunk-9p0ww3tk.js";
32
- import"./chunk-vp2db42d.js";
33
- import"./chunk-gmy11efb.js";
34
- import"./chunk-t9zcg8f1.js";
35
- import"./chunk-7xqj7aex.js";
36
- import"./chunk-x1arr7ze.js";
31
+ } from "./chunk-f97qybwk.js";
32
+ import"./chunk-a3ypq5pp.js";
37
33
  import {
38
34
  getRegistry
39
- } from "./chunk-5ahkew9c.js";
40
- import"./chunk-6cpn7ht2.js";
35
+ } from "./chunk-9krt5z40.js";
36
+ import"./chunk-mhty3nna.js";
37
+ import"./chunk-vp2db42d.js";
38
+ import"./chunk-hsq7j9jk.js";
39
+ import"./chunk-jkencnkw.js";
40
+ import"./chunk-4f43r1nd.js";
41
+ import"./chunk-pkdmypdd.js";
42
+ import"./chunk-j0kjscb7.js";
43
+ import"./chunk-cp37k2wg.js";
44
+ import"./chunk-1msje2zf.js";
45
+ import"./chunk-f5xgprg1.js";
41
46
  import {
42
47
  EFFORT_VALUES,
43
48
  isAgentKind
@@ -271,4 +276,4 @@ export {
271
276
  cronCommand
272
277
  };
273
278
 
274
- //# debugId=1B5E7ECBD9B667B364756E2164756E21
279
+ //# debugId=7C47FA5396346C1764756E2164756E21
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "/** `negotium cron ...` — persistent scheduled agent turns. */\n\nimport {\n EFFORT_VALUES,\n type EffortLevel,\n getRegistry,\n getTopic,\n getTopicByNameForUser,\n isAgentKind,\n} from \"@negotium/core\";\nimport {\n CRON_JOBS_DIR,\n createCronJob,\n cronScriptExists,\n deleteCronJob,\n getCronJob,\n getCronJobByOwnerAndName,\n listCronJobs,\n listCronRuns,\n queueCronPromptSummary,\n requestCronCancel,\n requestCronRun,\n resetCronTopicContext,\n setCronJobEnabled,\n updateCronJobWithContextReset,\n} from \"@negotium/module-cron\";\n\nconst USER_ID = \"local\";\n\nfunction flag(args: string[], name: string): string | undefined {\n return args.find((value) => value.startsWith(`--${name}=`))?.slice(name.length + 3);\n}\n\nfunction hasFlag(args: string[], name: string): boolean {\n return args.some((value) => value.startsWith(`--${name}=`));\n}\n\nfunction positional(args: string[]): string[] {\n return args.filter((value) => !value.startsWith(\"--\"));\n}\n\nfunction resolveJob(ref: string) {\n return getCronJob(ref) ?? getCronJobByOwnerAndName(USER_ID, ref);\n}\n\nfunction printJob(job: NonNullable<ReturnType<typeof getCronJob>>): void {\n const last = listCronRuns(job.id, 1)[0];\n console.log(\n `${job.name} ${job.enabled ? \"enabled\" : \"paused\"} ${job.schedule}` +\n `${job.timezone ? ` (${job.timezone})` : \"\"} next=${job.nextRunAt}` +\n `${last ? ` last=${last.status}` : \"\"} ${job.id}`,\n );\n}\n\nfunction usage(): void {\n console.log(\n [\n \"negotium cron commands:\",\n \" list\",\n \" create <topic> <name> '<schedule>' <prompt...> [--timezone=IANA] [--agent=...] [--model=...] [--effort=...]\",\n \" create <topic> <name> '<schedule>' --script=job.py [--timezone=IANA] [--agent=...]\",\n \" edit <name|id> [prompt...] [--name=...] [--topic=...] [--schedule=...] [--script=job.py]\",\n \" inspect|logs <name|id>\",\n \" run|pause|resume|restart|kill|reset|delete <name|id>\",\n \"\",\n \"The node must stay alive (`negotium serve`, chat, or an adapter) for schedules to run.\",\n `Python prompt scripts live in ${CRON_JOBS_DIR}.`,\n ].join(\"\\n\"),\n );\n}\n\nexport async function cronCommand(args: string[]): Promise<void> {\n const [sub, ...rest] = args;\n try {\n switch (sub) {\n case undefined:\n case \"help\":\n case \"--help\":\n usage();\n return;\n case \"list\": {\n const jobs = listCronJobs(USER_ID);\n if (jobs.length === 0) {\n console.log(\"no cron jobs\");\n return;\n }\n jobs.forEach(printJob);\n return;\n }\n case \"create\": {\n const values = positional(rest);\n const [topicName, name, schedule, ...promptParts] = values;\n const script = flag(rest, \"script\")?.trim() || undefined;\n if (!topicName || !name || !schedule || (promptParts.length === 0 && !script)) {\n usage();\n process.exitCode = 1;\n return;\n }\n if (script && promptParts.length > 0) {\n throw new Error(\"provide a prompt or --script, not both\");\n }\n if (script && !cronScriptExists(script))\n throw new Error(`cron script not found: ${script}`);\n const topic = getTopicByNameForUser(topicName, USER_ID);\n if (!topic?.agent) throw new Error(`topic not found or has no agent: ${topicName}`);\n const agentRaw = flag(rest, \"agent\");\n if (agentRaw && !isAgentKind(agentRaw)) throw new Error(`invalid agent: ${agentRaw}`);\n const agent = isAgentKind(agentRaw) ? agentRaw : undefined;\n const effectiveAgent = agent ?? topic.agent;\n const registry = getRegistry(effectiveAgent);\n const model = flag(rest, \"model\");\n if (model && !registry.validateModel(model)) {\n throw new Error(`model '${model}' is invalid for ${effectiveAgent}`);\n }\n const effortRaw = flag(rest, \"effort\");\n if (effortRaw && !(EFFORT_VALUES as readonly string[]).includes(effortRaw)) {\n throw new Error(`invalid effort: ${effortRaw}`);\n }\n const effort = effortRaw as EffortLevel | undefined;\n if (effort && !registry.validateEffort(effort)) {\n throw new Error(`effort '${effort}' is invalid for ${effectiveAgent}`);\n }\n const job = createCronJob({\n name,\n ownerUserId: USER_ID,\n topicId: topic.id,\n prompt: promptParts.length > 0 ? promptParts.join(\" \") : undefined,\n script,\n schedule,\n timezone: flag(rest, \"timezone\"),\n agent,\n model,\n effort,\n });\n if (job.prompt) queueCronPromptSummary(job.id, job.prompt);\n printJob(job);\n return;\n }\n case \"edit\": {\n const values = positional(rest);\n const [ref, ...promptParts] = values;\n if (!ref) throw new Error(\"provide a cron name or id\");\n const job = resolveJob(ref);\n if (!job || job.ownerUserId !== USER_ID) throw new Error(`cron job not found: ${ref}`);\n const topicName = flag(rest, \"topic\");\n const topic = topicName ? getTopicByNameForUser(topicName, USER_ID) : null;\n if (topicName && !topic?.agent)\n throw new Error(`topic not found or has no agent: ${topicName}`);\n const scriptTouched = hasFlag(rest, \"script\");\n const script = flag(rest, \"script\")?.trim() || undefined;\n if (script && !cronScriptExists(script))\n throw new Error(`cron script not found: ${script}`);\n if (script && promptParts.length > 0)\n throw new Error(\"provide a prompt or --script, not both\");\n const sourceTouched = scriptTouched || promptParts.length > 0;\n const nextPrompt =\n promptParts.length > 0 ? promptParts.join(\" \") : sourceTouched ? undefined : job.prompt;\n const nextScript = scriptTouched ? script : promptParts.length > 0 ? undefined : job.script;\n if (sourceTouched && Boolean(nextPrompt) === Boolean(nextScript)) {\n throw new Error(\"cron job requires exactly one of prompt or script\");\n }\n\n const agentRaw = flag(rest, \"agent\");\n const agent = agentRaw === \"default\" ? undefined : agentRaw;\n if (agent && !isAgentKind(agent)) throw new Error(`invalid agent: ${agent}`);\n const effectiveAgent =\n (isAgentKind(agent) ? agent : hasFlag(rest, \"agent\") ? undefined : job.agent) ??\n topic?.agent ??\n getTopic(job.topicId)?.agent;\n const modelRaw = flag(rest, \"model\");\n const model = modelRaw === \"default\" ? undefined : modelRaw?.trim() || undefined;\n const effortRaw = flag(rest, \"effort\");\n const effort = effortRaw === \"default\" ? undefined : effortRaw;\n if (effort && !(EFFORT_VALUES as readonly string[]).includes(effort)) {\n throw new Error(`invalid effort: ${effort}`);\n }\n if (effectiveAgent) {\n const registry = getRegistry(effectiveAgent);\n if (model && !registry.validateModel(model)) {\n throw new Error(`model '${model}' is invalid for ${effectiveAgent}`);\n }\n if (effort && !registry.validateEffort(effort as EffortLevel)) {\n throw new Error(`effort '${effort}' is invalid for ${effectiveAgent}`);\n }\n }\n\n const updated = await updateCronJobWithContextReset(job.id, {\n name: flag(rest, \"name\"),\n topicId: topic?.id,\n prompt: sourceTouched ? (nextPrompt ?? null) : undefined,\n script: sourceTouched ? (nextScript ?? null) : undefined,\n summary: sourceTouched ? null : undefined,\n schedule: flag(rest, \"schedule\"),\n timezone: hasFlag(rest, \"timezone\") ? flag(rest, \"timezone\") || null : undefined,\n agent: hasFlag(rest, \"agent\") ? (isAgentKind(agent) ? agent : null) : undefined,\n model: hasFlag(rest, \"model\") ? (model ?? null) : undefined,\n effort: hasFlag(rest, \"effort\")\n ? ((effort as EffortLevel | undefined) ?? null)\n : undefined,\n });\n if (!updated) throw new Error(`cron job not found: ${ref}`);\n if (sourceTouched && updated.prompt) queueCronPromptSummary(updated.id, updated.prompt);\n printJob(updated);\n return;\n }\n case \"inspect\":\n case \"logs\": {\n const ref = positional(rest)[0];\n if (!ref) throw new Error(\"provide a cron name or id\");\n const job = resolveJob(ref);\n if (!job || job.ownerUserId !== USER_ID) throw new Error(`cron job not found: ${ref}`);\n console.log(JSON.stringify({ ...job, runs: listCronRuns(job.id, 20) }, null, 2));\n return;\n }\n case \"run\":\n case \"pause\":\n case \"resume\":\n case \"restart\":\n case \"kill\":\n case \"reset\":\n case \"delete\": {\n const ref = positional(rest)[0];\n if (!ref) throw new Error(\"provide a cron name or id\");\n const job = resolveJob(ref);\n if (!job || job.ownerUserId !== USER_ID) throw new Error(`cron job not found: ${ref}`);\n if (sub === \"run\") {\n if (!job.enabled) throw new Error(\"job is disabled; resume it first\");\n console.log(`queued ${requestCronRun(job.id)}`);\n }\n if (sub === \"pause\") printJob(setCronJobEnabled(job.id, false)!);\n if (sub === \"resume\") printJob(setCronJobEnabled(job.id, true)!);\n if (sub === \"restart\") printJob(setCronJobEnabled(job.id, true)!);\n if (sub === \"kill\") console.log(`cancellation queued ${requestCronCancel(job.id)}`);\n if (sub === \"reset\") {\n await resetCronTopicContext(job.topicId);\n console.log(`reset shared Cron context for topic ${job.topicId}`);\n }\n if (sub === \"delete\") {\n deleteCronJob(job.id);\n console.log(`deleted ${job.name}`);\n }\n return;\n }\n default:\n usage();\n process.exitCode = 1;\n }\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "1B5E7ECBD9B667B364756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "7C47FA5396346C1764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,8 @@
1
1
  // @bun
2
2
  import {
3
3
  db
4
- } from "./chunk-7xqj7aex.js";
4
+ } from "./chunk-1msje2zf.js";
5
+ import"./chunk-f5xgprg1.js";
5
6
  import {
6
7
  logger
7
8
  } from "./chunk-k9z47mab.js";
@@ -210,12 +211,21 @@ var AbortReason;
210
211
  // ../../packages/core/src/query/active-rooms.ts
211
212
  var activeByRoom = new Map;
212
213
  var leaseMonitors = new Map;
214
+ var ISOLATED_TURN_ROOM_MARKER = "::isolated-turn::";
215
+ function isolatedTurnRoomId(topicId, queryId) {
216
+ return `${topicId}${ISOLATED_TURN_ROOM_MARKER}${queryId}`;
217
+ }
218
+ function isIsolatedTurnRoomId(roomId) {
219
+ return roomId.includes(ISOLATED_TURN_ROOM_MARKER);
220
+ }
213
221
  function getRoomQuery(topicId) {
214
222
  return activeByRoom.get(topicId);
215
223
  }
216
224
  function listRunningTopicQueries() {
217
- const queries = new Map([...activeByRoom.values()].map((control) => [control.topicId, control.queryId]));
225
+ const queries = new Map([...activeByRoom.entries()].filter(([roomId]) => !isIsolatedTurnRoomId(roomId)).map(([roomId, control]) => [roomId, control.queryId]));
218
226
  for (const lease of listRuntimeTurnLeases()) {
227
+ if (isIsolatedTurnRoomId(lease.topicId))
228
+ continue;
219
229
  if (!queries.has(lease.topicId))
220
230
  queries.set(lease.topicId, lease.queryId);
221
231
  }
@@ -233,28 +243,29 @@ function getRoomQueryStatus(topicId, queryId) {
233
243
  return getRuntimeTurnLease(topicId)?.queryId === queryId ? "running" : "not_found";
234
244
  }
235
245
  function setRoomQuery(control) {
246
+ const roomId = control.roomId ?? control.topicId;
236
247
  control.startedAt ??= Date.now();
237
248
  const claimed = claimRuntimeTurnLease({
238
- topicId: control.topicId,
249
+ topicId: roomId,
239
250
  queryId: control.queryId,
240
251
  origin: control.origin
241
252
  });
242
253
  if (!claimed)
243
254
  return false;
244
- const previousMonitor = leaseMonitors.get(control.topicId);
255
+ const previousMonitor = leaseMonitors.get(roomId);
245
256
  if (previousMonitor)
246
257
  clearInterval(previousMonitor);
247
- activeByRoom.set(control.topicId, control);
258
+ activeByRoom.set(roomId, control);
248
259
  const monitor = setInterval(() => {
249
- const current = activeByRoom.get(control.topicId);
260
+ const current = activeByRoom.get(roomId);
250
261
  if (!current || current.queryId !== control.queryId) {
251
262
  clearInterval(monitor);
252
- if (leaseMonitors.get(control.topicId) === monitor) {
253
- leaseMonitors.delete(control.topicId);
263
+ if (leaseMonitors.get(roomId) === monitor) {
264
+ leaseMonitors.delete(roomId);
254
265
  }
255
266
  return;
256
267
  }
257
- const heartbeat = heartbeatRuntimeTurnLease(control.topicId, control.queryId);
268
+ const heartbeat = heartbeatRuntimeTurnLease(roomId, control.queryId);
258
269
  if (!heartbeat.owned) {
259
270
  control.abortReason = "external" /* External */;
260
271
  control.abortController.abort();
@@ -266,7 +277,7 @@ function setRoomQuery(control) {
266
277
  }
267
278
  }, 1000);
268
279
  monitor.unref?.();
269
- leaseMonitors.set(control.topicId, monitor);
280
+ leaseMonitors.set(roomId, monitor);
270
281
  return true;
271
282
  }
272
283
  function clearRoomQuery(topicId, queryId) {
@@ -479,6 +490,7 @@ export {
479
490
  setRoomQuery,
480
491
  listRunningTopicQueries,
481
492
  listRunningTopicIds,
493
+ isolatedTurnRoomId,
482
494
  isUserOrigin,
483
495
  isTopicRunning,
484
496
  interSessionQueue,
@@ -494,6 +506,6 @@ export {
494
506
  DeferredInjectBatcher
495
507
  };
496
508
 
497
- export { TOPIC_MAINTENANCE_STALE_MS, getRuntimeTopicEpoch, isRuntimeTopicMaintenance, beginRuntimeTopicMaintenance, RUNTIME_INSTANCE_ID, TURN_LEASE_STALE_MS, getRuntimeTurnLease, listRuntimeTurnLeases, claimRuntimeTurnLease, requestRuntimeTurnAbort, releaseRuntimeTurnLease, AbortReason, getRoomQuery, listRunningTopicQueries, listRunningTopicIds, isTopicRunning, setRoomQuery, clearRoomQuery, abortRoom, abortAllRooms, isUserOrigin, decideNewQuery, DeferredInjectBatcher, interSessionQueue, deferInject, takeDeferredInject, cancelDeferredInject, wsAbortReason };
509
+ export { TOPIC_MAINTENANCE_STALE_MS, getRuntimeTopicEpoch, isRuntimeTopicMaintenance, beginRuntimeTopicMaintenance, RUNTIME_INSTANCE_ID, TURN_LEASE_STALE_MS, getRuntimeTurnLease, listRuntimeTurnLeases, claimRuntimeTurnLease, requestRuntimeTurnAbort, releaseRuntimeTurnLease, AbortReason, isolatedTurnRoomId, getRoomQuery, listRunningTopicQueries, listRunningTopicIds, isTopicRunning, setRoomQuery, clearRoomQuery, abortRoom, abortAllRooms, isUserOrigin, decideNewQuery, DeferredInjectBatcher, interSessionQueue, deferInject, takeDeferredInject, cancelDeferredInject, wsAbortReason };
498
510
 
499
- //# debugId=9C61ECBAAB0F028064756E2164756E21
511
+ //# debugId=5F827946B984263664756E2164756E21
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/core/src/storage/runtime-leases.ts", "../../../packages/core/src/storage/runtime-topic-state.ts", "../../../packages/core/src/query/types.ts", "../../../packages/core/src/query/active-rooms.ts"],
4
+ "sourcesContent": [
5
+ "import { randomUUID } from \"node:crypto\";\nimport { db } from \"#storage/forum-db\";\nimport { TOPIC_MAINTENANCE_STALE_MS } from \"#storage/runtime-topic-state\";\n\nexport const RUNTIME_INSTANCE_ID = `${process.pid}-${randomUUID()}`;\nexport const TURN_LEASE_STALE_MS = 10_000;\n\nexport interface RuntimeTurnLease {\n topicId: string;\n queryId: string;\n ownerId: string;\n origin: string;\n startedAt: number;\n heartbeatAt: number;\n abortRequested: boolean;\n abortReason?: \"internal\" | \"external\";\n}\n\ninterface RuntimeTurnLeaseRow {\n topic_id: string;\n query_id: string;\n owner_id: string;\n origin: string;\n started_at: number | bigint;\n heartbeat_at: number | bigint;\n abort_requested: number;\n abort_reason: string | null;\n}\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS runtime_turn_leases (\n topic_id TEXT PRIMARY KEY,\n query_id TEXT NOT NULL UNIQUE,\n owner_id TEXT NOT NULL,\n origin TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n heartbeat_at INTEGER NOT NULL,\n abort_requested INTEGER NOT NULL DEFAULT 0 CHECK (abort_requested IN (0, 1)),\n abort_reason TEXT CHECK (abort_reason IS NULL OR abort_reason IN ('internal', 'external'))\n )\n`);\ndb.exec(\n \"CREATE INDEX IF NOT EXISTS idx_runtime_turn_leases_heartbeat ON runtime_turn_leases(heartbeat_at)\",\n);\n\nfunction rowToLease(row: RuntimeTurnLeaseRow): RuntimeTurnLease {\n const abortReason =\n row.abort_reason === \"internal\" || row.abort_reason === \"external\"\n ? row.abort_reason\n : undefined;\n return {\n topicId: row.topic_id,\n queryId: row.query_id,\n ownerId: row.owner_id,\n origin: row.origin,\n startedAt: Number(row.started_at),\n heartbeatAt: Number(row.heartbeat_at),\n abortRequested: row.abort_requested !== 0,\n abortReason,\n };\n}\n\nexport function getRuntimeTurnLease(topicId: string, now = Date.now()): RuntimeTurnLease | null {\n const row = db\n .query<RuntimeTurnLeaseRow, [string]>(\"SELECT * FROM runtime_turn_leases WHERE topic_id = ?\")\n .get(topicId);\n if (!row) return null;\n const lease = rowToLease(row);\n return now - lease.heartbeatAt <= TURN_LEASE_STALE_MS ? lease : null;\n}\n\nexport function listRuntimeTurnLeases(now = Date.now()): RuntimeTurnLease[] {\n return db\n .query<RuntimeTurnLeaseRow, []>(\"SELECT * FROM runtime_turn_leases ORDER BY started_at ASC\")\n .all()\n .map(rowToLease)\n .filter((lease) => now - lease.heartbeatAt <= TURN_LEASE_STALE_MS);\n}\n\nexport function claimRuntimeTurnLease(\n input: {\n topicId: string;\n queryId: string;\n origin: string;\n ownerId?: string;\n },\n now = Date.now(),\n): boolean {\n const ownerId = input.ownerId ?? RUNTIME_INSTANCE_ID;\n const result = db\n .query(\n `INSERT INTO runtime_turn_leases\n (topic_id, query_id, owner_id, origin, started_at, heartbeat_at, abort_requested, abort_reason)\n SELECT ?, ?, ?, ?, ?, ?, 0, NULL\n WHERE NOT EXISTS (\n SELECT 1 FROM runtime_topic_state\n WHERE topic_id = ? AND maintenance = 1 AND heartbeat_at >= ?\n )\n ON CONFLICT(topic_id) DO UPDATE SET\n query_id = excluded.query_id,\n owner_id = excluded.owner_id,\n origin = excluded.origin,\n started_at = excluded.started_at,\n heartbeat_at = excluded.heartbeat_at,\n abort_requested = 0,\n abort_reason = NULL\n WHERE (runtime_turn_leases.owner_id = excluded.owner_id\n OR runtime_turn_leases.heartbeat_at < ?)\n AND NOT EXISTS (\n SELECT 1 FROM runtime_topic_state\n WHERE topic_id = excluded.topic_id AND maintenance = 1 AND heartbeat_at >= ?\n )`,\n )\n .run(\n input.topicId,\n input.queryId,\n ownerId,\n input.origin,\n now,\n now,\n input.topicId,\n now - TOPIC_MAINTENANCE_STALE_MS,\n now - TURN_LEASE_STALE_MS,\n now - TOPIC_MAINTENANCE_STALE_MS,\n );\n return Number(result.changes ?? 0) > 0;\n}\n\nexport function heartbeatRuntimeTurnLease(\n topicId: string,\n queryId: string,\n ownerId = RUNTIME_INSTANCE_ID,\n now = Date.now(),\n): { owned: boolean; abortRequested: boolean; abortReason?: \"internal\" | \"external\" } {\n const updated = db\n .query(\n `UPDATE runtime_turn_leases\n SET heartbeat_at = ?\n WHERE topic_id = ? AND query_id = ? AND owner_id = ?`,\n )\n .run(now, topicId, queryId, ownerId);\n if (Number(updated.changes ?? 0) === 0) return { owned: false, abortRequested: false };\n\n const row = db\n .query<{ abort_requested: number; abort_reason: string | null }, [string, string, string]>(\n `SELECT abort_requested, abort_reason\n FROM runtime_turn_leases\n WHERE topic_id = ? AND query_id = ? AND owner_id = ?`,\n )\n .get(topicId, queryId, ownerId);\n const abortReason =\n row?.abort_reason === \"internal\" || row?.abort_reason === \"external\"\n ? row.abort_reason\n : undefined;\n return {\n owned: Boolean(row),\n abortRequested: row?.abort_requested !== 0,\n abortReason,\n };\n}\n\nexport function requestRuntimeTurnAbort(topicId: string, reason: \"internal\" | \"external\"): boolean {\n const result = db\n .query(\n `UPDATE runtime_turn_leases\n SET abort_requested = 1,\n abort_reason = CASE\n WHEN abort_reason = 'external' THEN abort_reason\n ELSE ?\n END\n WHERE topic_id = ? AND heartbeat_at >= ?`,\n )\n .run(reason, topicId, Date.now() - TURN_LEASE_STALE_MS);\n return Number(result.changes ?? 0) > 0;\n}\n\nexport function releaseRuntimeTurnLease(\n topicId: string,\n queryId: string,\n ownerId = RUNTIME_INSTANCE_ID,\n): boolean {\n const result = db\n .query(\n `DELETE FROM runtime_turn_leases\n WHERE topic_id = ? AND query_id = ? AND owner_id = ?`,\n )\n .run(topicId, queryId, ownerId);\n return Number(result.changes ?? 0) > 0;\n}\n",
6
+ "import { randomUUID } from \"node:crypto\";\nimport { db } from \"#storage/forum-db\";\n\nexport const TOPIC_MAINTENANCE_STALE_MS = 30_000;\nexport const TOPIC_MAINTENANCE_HEARTBEAT_MS = 1_000;\n\nexport interface RuntimeTopicState {\n topicId: string;\n epoch: number;\n maintenance: boolean;\n maintenanceOwner?: string;\n heartbeatAt?: number;\n}\n\nexport interface RuntimeTopicMaintenanceHandle {\n topicId: string;\n epoch: number;\n ownerId: string;\n isOwned(): boolean;\n finish(options?: { deleteState?: boolean }): void;\n}\n\ninterface RuntimeTopicStateRow {\n topic_id: string;\n epoch: number | bigint;\n maintenance: number;\n maintenance_owner: string | null;\n heartbeat_at: number | bigint | null;\n}\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS runtime_topic_state (\n topic_id TEXT PRIMARY KEY,\n epoch INTEGER NOT NULL DEFAULT 0,\n maintenance INTEGER NOT NULL DEFAULT 0 CHECK (maintenance IN (0, 1)),\n maintenance_owner TEXT,\n heartbeat_at INTEGER\n )\n`);\n\nfunction rowToState(row: RuntimeTopicStateRow, now = Date.now()): RuntimeTopicState {\n const heartbeatAt = row.heartbeat_at === null ? undefined : Number(row.heartbeat_at);\n const maintenance =\n row.maintenance !== 0 &&\n heartbeatAt !== undefined &&\n now - heartbeatAt <= TOPIC_MAINTENANCE_STALE_MS;\n return {\n topicId: row.topic_id,\n epoch: Number(row.epoch),\n maintenance,\n maintenanceOwner: maintenance ? (row.maintenance_owner ?? undefined) : undefined,\n heartbeatAt,\n };\n}\n\nexport function getRuntimeTopicState(topicId: string, now = Date.now()): RuntimeTopicState {\n const row = db\n .query<RuntimeTopicStateRow, [string]>(\"SELECT * FROM runtime_topic_state WHERE topic_id = ?\")\n .get(topicId);\n return row ? rowToState(row, now) : { topicId, epoch: 0, maintenance: false };\n}\n\nexport function getRuntimeTopicEpoch(topicId: string): number {\n return getRuntimeTopicState(topicId).epoch;\n}\n\nexport function isRuntimeTopicMaintenance(topicId: string, now = Date.now()): boolean {\n return getRuntimeTopicState(topicId, now).maintenance;\n}\n\n/**\n * Advance the topic execution epoch and hold an exclusive maintenance fence.\n * Turns from an older epoch can be identified and discarded in every process.\n */\nexport function beginRuntimeTopicMaintenance(\n topicId: string,\n options: { ownerId?: string; now?: number; heartbeatMs?: number } = {},\n): RuntimeTopicMaintenanceHandle | null {\n const ownerId = options.ownerId ?? `${process.pid}-${randomUUID()}`;\n const now = options.now ?? Date.now();\n const result = db\n .query(\n `INSERT INTO runtime_topic_state\n (topic_id, epoch, maintenance, maintenance_owner, heartbeat_at)\n VALUES (?, 1, 1, ?, ?)\n ON CONFLICT(topic_id) DO UPDATE SET\n epoch = runtime_topic_state.epoch + 1,\n maintenance = 1,\n maintenance_owner = excluded.maintenance_owner,\n heartbeat_at = excluded.heartbeat_at\n WHERE runtime_topic_state.maintenance = 0\n OR runtime_topic_state.heartbeat_at IS NULL\n OR runtime_topic_state.heartbeat_at < ?`,\n )\n .run(topicId, ownerId, now, now - TOPIC_MAINTENANCE_STALE_MS);\n if (Number(result.changes ?? 0) === 0) return null;\n\n const epoch = getRuntimeTopicEpoch(topicId);\n let finished = false;\n const heartbeatMs = options.heartbeatMs ?? TOPIC_MAINTENANCE_HEARTBEAT_MS;\n const timer = setInterval(() => {\n if (finished) return;\n const updated = db\n .query(\n `UPDATE runtime_topic_state\n SET heartbeat_at = ?\n WHERE topic_id = ? AND epoch = ? AND maintenance_owner = ? AND maintenance = 1`,\n )\n .run(Date.now(), topicId, epoch, ownerId);\n if (Number(updated.changes ?? 0) > 0) return;\n finished = true;\n clearInterval(timer);\n }, heartbeatMs);\n timer.unref?.();\n\n return {\n topicId,\n epoch,\n ownerId,\n isOwned() {\n if (finished) return false;\n const row = db\n .query<{ owned: number }, [string, number, string]>(\n `SELECT 1 AS owned FROM runtime_topic_state\n WHERE topic_id = ? AND epoch = ? AND maintenance_owner = ? AND maintenance = 1`,\n )\n .get(topicId, epoch, ownerId);\n return Boolean(row);\n },\n finish(finishOptions = {}) {\n if (finished) return;\n finished = true;\n clearInterval(timer);\n if (finishOptions.deleteState) {\n db.query(\n `DELETE FROM runtime_topic_state\n WHERE topic_id = ? AND epoch = ? AND maintenance_owner = ?`,\n ).run(topicId, epoch, ownerId);\n return;\n }\n db.query(\n `UPDATE runtime_topic_state\n SET maintenance = 0, maintenance_owner = NULL, heartbeat_at = NULL\n WHERE topic_id = ? AND epoch = ? AND maintenance_owner = ?`,\n ).run(topicId, epoch, ownerId);\n },\n };\n}\n",
7
+ "import type { ForkHandle } from \"#agents/fork\";\nimport type { AskReplySource } from \"#storage/session-asks\";\nimport type { AgentKind, EffortLevel } from \"#types\";\n\n/**\n * What `handleAgentQuery` did with the request. Callers that own resources\n * tied to the params (e.g. an ask-fork rollout) use this to decide cleanup:\n * \"ran\"/\"queued\" transfer ownership to the query layer, \"dropped\" returns it.\n */\nexport type HandleAgentQueryOutcome = \"ran\" | \"queued\" | \"dropped\";\n\n// --- Parameter interfaces ---\n\ninterface BaseQueryParams {\n chatId: number;\n userId: number;\n topicName: string;\n sessionId: string | null;\n prompt: string;\n}\n\ninterface OutputParams {\n messageThreadId?: number;\n systemPrompt: string;\n cwd?: string;\n sessionType?: \"dm\" | \"forum\" | \"ephemeral\" | \"manager\" | \"cron\";\n model?: string;\n silent?: boolean;\n effort?: EffortLevel;\n /** Override the topic-resolved agent backend. Used by callers like the\n * archiver that run on ephemeral topics and need an explicit provider. */\n agent?: AgentKind;\n}\n\ninterface InterSessionParams {\n from?: string; // \"user\" or sender session name\n depth?: number; // 0 = from user, 1+ = via tell_session\n // For silent ask-reply forks: caller's depth at ask time. When the fork's\n // reply is injected back to the caller, the caller resumes at this depth\n // so tell chain caps remain accurate across ask hops.\n fromDepth?: number;\n requestId?: string; // unique ID for dedup in interSessionQueue\n contextId?: string; // context ID for multi-turn inter-session conversations\n /**\n * Ask-fork rollout backing this inject's `sessionId`. Ownership travels\n * WITH the params: while the inject sits in `interSessionQueue` the rollout\n * must stay on disk (deleting it breaks the dequeued query's resume), and\n * `handleAgentQuery`'s finally removes it once the consuming query actually\n * finished (and no retry/requeue still references it).\n */\n forkHandle?: ForkHandle;\n /** Original ask_session replies represented by this inject, preserved across dequeueAll merges. */\n askReplySources?: AskReplySource[];\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}\n\ninterface RetryGuardParams {\n _sessionRetried?: boolean; // guard against infinite retry on session expiry\n}\n\nexport interface HandleAgentQueryParams\n extends BaseQueryParams,\n OutputParams,\n InterSessionParams,\n RetryGuardParams {}\n\n// --- Abort reason ---\n\nexport enum AbortReason {\n None = \"none\",\n Internal = \"internal\", // replaced by a newer query on the same topic\n External = \"external\", // /abort command or abort_session via session-inbox\n}\n",
8
+ "/**\n * Room-keyed in-flight query registry + abort-on-new-message priority +\n * inter-session inject queue (requestId dedup + mergeable-prefix merging).\n *\n * ActiveQueries + SessionInjectQueue semantics, adapted to Otium's REST/WS\n * model where the \"room\" is a `topicId` and the live runner is\n * `api/routes/ai.ts`.\n *\n * Invariant: AT MOST ONE in-flight AI turn per room (topicId). A new turn\n * arriving on a busy room is resolved by origin priority:\n * - incoming user, running user → abort running (superseded), replace\n * - incoming user, running inject → re-queue running inject, abort, replace\n * - incoming inject (any running) → defer incoming (the user keeps priority)\n */\n\nimport type { ForkHandle } from \"#agents/fork\";\nimport { logger } from \"#platform/logger\";\nimport {\n claimRuntimeTurnLease,\n getRuntimeTurnLease,\n heartbeatRuntimeTurnLease,\n listRuntimeTurnLeases,\n RUNTIME_INSTANCE_ID,\n type RuntimeTurnLease,\n releaseRuntimeTurnLease,\n requestRuntimeTurnAbort,\n} from \"#storage/runtime-leases\";\nimport type { AskReplySource } from \"#storage/session-asks\";\nimport type { AgentKind, PeerRuntimeBridgeContext } from \"#types\";\nimport { AbortReason } from \"./types\";\n\n/** Lazily create an isolated provider session immediately before execution. */\nexport type PrepareInjectSession = () => Promise<ForkHandle>;\n\n/** A turn started by a session-inject, replayed when its room frees up. */\nexport interface DeferredInject {\n topicId: string;\n /** Topic execution epoch captured when this work was accepted. */\n runtimeEpoch?: number;\n userId: string;\n prompt: string;\n /** Inject source — the topic name/id this inject came from (never \"user\"). */\n origin: string;\n /** Inter-session request id for dedup. */\n requestId?: string;\n /** Nesting depth (starts at 1 for the first cross-topic hop). */\n depth?: number;\n /** Whether this inject is silent (injected but hidden from the user). */\n silent?: boolean;\n /** Context chain id for continuing an inter-session conversation. */\n contextId?: string;\n /** Agent override for injected turns that must resume a provider-specific session. */\n agentOverride?: AgentKind;\n /** Model override for specialized internal turns such as cron. */\n modelOverride?: string;\n /** Effort override for specialized internal turns such as cron. */\n effortOverride?: import(\"#types\").EffortLevel;\n /** SDK-native session/thread id to resume for a forked injected turn. */\n sessionId?: string | null;\n /** Explicit provider-session ownership boundary. */\n sessionScope?: \"topic\" | \"isolated\";\n /** Scheduling boundary. Isolated turns do not occupy or wait for the topic room. */\n turnConcurrency?: \"topic\" | \"isolated\";\n /** Rollout file backing a synthetic/native fork; cleaned when the turn finishes. */\n forkHandle?: ForkHandle;\n /** Build a fresh isolated session at dispatch time (used by ask_session). */\n prepareSession?: PrepareInjectSession;\n /** Working directory override for provider-native resumed sessions. */\n cwd?: string;\n /** Conversation/session namespace override (cron jobs keep isolated rollouts). */\n sessionName?: string;\n /** MCP/tool scope override for a specialized internal turn. */\n sessionType?: \"dm\" | \"forum\" | \"ephemeral\" | \"manager\" | \"cron\";\n /** Adapter-granted access to Otium's visual panel tools. */\n visualTools?: boolean;\n /** Optional session owner; when present the topic's main session is not replaced. */\n onSessionId?: (sessionId: string) => void;\n /** Clear an externally-owned session after an unrecoverable expiry. */\n onSessionReset?: () => void;\n /** Rebuild a provider-native rollout from the shared conversation log when needed. */\n bridgeSessionFromHistory?: boolean;\n /** Final result hook for optional modules that own an internal turn. */\n onSettled?: (result: {\n queryId: string;\n kind: \"completed\" | \"aborted\" | \"error\";\n abortReason?: AbortReason;\n error?: string;\n }) => void;\n /** Canonical hub identity for a placed-room runtime turn. */\n peerBridge?: PeerRuntimeBridgeContext;\n /** True after a session-expired recovery retry has already been attempted. */\n _sessionRetried?: boolean;\n /** Original ask_session replies represented by this inject, preserved across dequeueAll merges. */\n askReplySources?: AskReplySource[];\n /** Source marker forwarded to startAiTurn (e.g. FROM_AUTO_CONTINUE). */\n from?: string;\n /** Fired with the AI turn's queryId once the deferred turn is dispatched. */\n onDispatched?: (queryId: string) => void;\n}\n\nexport interface RoomQueryControl {\n topicId: string;\n /** Runtime scheduling/lease key. Defaults to topicId for normal turns. */\n roomId?: string;\n queryId: string;\n /** \"user\" for a human message; otherwise the inject source topic name. */\n origin: string;\n /** Prompt currently being processed. User-turn preemption merges this with the new prompt. */\n prompt: string;\n /** Attachment ids currently being processed. User-turn preemption carries them forward. */\n attachments?: string[];\n /** Provider session id this turn resumed from. Superseding user turns restart from this base. */\n sessionId?: string | null;\n abortController: AbortController;\n abortReason: AbortReason;\n /** Epoch ms when this turn claimed the room (stale-abort guard). */\n startedAt?: number;\n /**\n * Set when this turn was started by a session-inject — the params needed to\n * re-enqueue it if a user message preempts it mid-flight. undefined for user\n * turns (a preempted user turn is simply discarded).\n */\n injectParams?: DeferredInject;\n /** True only after this process successfully queued a local replay. */\n injectRequeued?: boolean;\n}\n\n// ── Room-keyed in-flight registry ──────────────────────────────────────\n\nconst activeByRoom = new Map<string, RoomQueryControl>();\nconst leaseMonitors = new Map<string, ReturnType<typeof setInterval>>();\n\nconst ISOLATED_TURN_ROOM_MARKER = \"::isolated-turn::\";\n\n/** Build a private scheduling key for a forked turn that may run beside its topic. */\nexport function isolatedTurnRoomId(topicId: string, queryId: string): string {\n return `${topicId}${ISOLATED_TURN_ROOM_MARKER}${queryId}`;\n}\n\nfunction isIsolatedTurnRoomId(roomId: string): boolean {\n return roomId.includes(ISOLATED_TURN_ROOM_MARKER);\n}\n\nexport function getRoomQuery(topicId: string): RoomQueryControl | undefined {\n return activeByRoom.get(topicId);\n}\n\n/** Topic ids and query ids with an in-flight turn in this or another runtime process. */\nexport function listRunningTopicQueries(): Map<string, string> {\n const queries = new Map(\n [...activeByRoom.entries()]\n .filter(([roomId]) => !isIsolatedTurnRoomId(roomId))\n .map(([roomId, control]) => [roomId, control.queryId]),\n );\n for (const lease of listRuntimeTurnLeases()) {\n if (isIsolatedTurnRoomId(lease.topicId)) continue;\n if (!queries.has(lease.topicId)) queries.set(lease.topicId, lease.queryId);\n }\n return queries;\n}\n\nexport function listRunningTopicIds(): Set<string> {\n return new Set(listRunningTopicQueries().keys());\n}\n\n/** Single-topic status check for callers that do not need a list snapshot. */\nexport function isTopicRunning(topicId: string): boolean {\n return activeByRoom.has(topicId) || getRuntimeTurnLease(topicId) !== null;\n}\n\nexport function getRoomQueryStatus(topicId: string, queryId: string): \"running\" | \"not_found\" {\n if (activeByRoom.get(topicId)?.queryId === queryId) return \"running\";\n return getRuntimeTurnLease(topicId)?.queryId === queryId ? \"running\" : \"not_found\";\n}\n\nexport function setRoomQuery(control: RoomQueryControl): boolean {\n const roomId = control.roomId ?? control.topicId;\n control.startedAt ??= Date.now();\n const claimed = claimRuntimeTurnLease({\n topicId: roomId,\n queryId: control.queryId,\n origin: control.origin,\n });\n if (!claimed) return false;\n\n const previousMonitor = leaseMonitors.get(roomId);\n if (previousMonitor) clearInterval(previousMonitor);\n activeByRoom.set(roomId, control);\n const monitor = setInterval(() => {\n const current = activeByRoom.get(roomId);\n if (!current || current.queryId !== control.queryId) {\n clearInterval(monitor);\n if (leaseMonitors.get(roomId) === monitor) {\n leaseMonitors.delete(roomId);\n }\n return;\n }\n const heartbeat = heartbeatRuntimeTurnLease(roomId, control.queryId);\n if (!heartbeat.owned) {\n control.abortReason = AbortReason.External;\n control.abortController.abort();\n return;\n }\n if (heartbeat.abortRequested && !control.abortController.signal.aborted) {\n control.abortReason =\n heartbeat.abortReason === \"internal\" ? AbortReason.Internal : AbortReason.External;\n control.abortController.abort();\n }\n }, 1_000);\n monitor.unref?.();\n leaseMonitors.set(roomId, monitor);\n return true;\n}\n\n/**\n * Delete the room's in-flight entry, but ONLY if it is still this query — a\n * newer turn may have already replaced it (abort-and-replace), and the dying\n * turn's cleanup must not clobber its successor. Mirrors Otium's\n * \"Only delete our own entry\" guard.\n */\nexport function clearRoomQuery(topicId: string, queryId: string): void {\n const cur = activeByRoom.get(topicId);\n if (cur && cur.queryId === queryId) {\n activeByRoom.delete(topicId);\n const monitor = leaseMonitors.get(topicId);\n if (monitor) clearInterval(monitor);\n leaseMonitors.delete(topicId);\n }\n releaseRuntimeTurnLease(topicId, queryId);\n}\n\n/** Abort the currently-running turn in a room, if any. Cleanup is still owned by\n * the streaming turn's finally block so deferred injects drain in order. */\nexport function abortRoom(topicId: string, reason: AbortReason = AbortReason.External): boolean {\n const running = activeByRoom.get(topicId);\n if (running) {\n running.abortReason = reason;\n running.abortController.abort();\n requestRuntimeTurnAbort(topicId, reason === AbortReason.Internal ? \"internal\" : \"external\");\n return true;\n }\n return requestRuntimeTurnAbort(\n topicId,\n reason === AbortReason.Internal ? \"internal\" : \"external\",\n );\n}\n\n/** Abort every in-flight provider turn before the node tears down its resources. */\nexport function abortAllRooms(reason: AbortReason = AbortReason.External): number {\n let aborted = 0;\n for (const running of activeByRoom.values()) {\n running.abortReason = reason;\n if (!running.abortController.signal.aborted) {\n running.abortController.abort();\n aborted++;\n }\n }\n return aborted;\n}\n\nexport function isUserOrigin(origin: string | undefined): boolean {\n return !origin || origin === \"user\";\n}\n\n// ── Priority decision ──────────────────────────────────────────────────\n\nexport type NewQueryDecision =\n | { action: \"proceed\" }\n | { action: \"abort-replace\"; running: RoomQueryControl }\n | { action: \"defer\" }\n | { action: \"remote-defer\"; running: RuntimeTurnLease }\n | { action: \"remote-abort-wait\"; running: RuntimeTurnLease };\n\n/**\n * Decide what to do when a new turn (with `incomingOrigin`) arrives on a room.\n * Mirrors the abort-on-new-message priority used by live topic turns.\n */\nexport function decideNewQuery(topicId: string, incomingOrigin: string): NewQueryDecision {\n const running = activeByRoom.get(topicId);\n if (!running) {\n const remote = getRuntimeTurnLease(topicId);\n if (!remote || remote.ownerId === RUNTIME_INSTANCE_ID) return { action: \"proceed\" };\n return isUserOrigin(incomingOrigin)\n ? { action: \"remote-abort-wait\", running: remote }\n : { action: \"remote-defer\", running: remote };\n }\n // Topic-room session-injects never preempt — the user keeps priority. An\n // ask_session fork uses its own isolated room key and therefore reaches the\n // no-running branch above even while the visible topic room is occupied.\n if (!isUserOrigin(incomingOrigin)) return { action: \"defer\" };\n // Incoming is a user message → preempt the running turn and take its slot.\n return { action: \"abort-replace\", running };\n}\n\n// ── Session-inject queue (inter-session) ───────────────────────────────\n//\n// Session-inject queue for cross-topic ask/tell messages.\n// Key differences: Otium doesn't have per-user concurrency caps, so the key\n// is just the `topicId` (room).\n// `markPendingAskSources` is handled by the MCP layer; the queue here only\n// manages in-memory defer/replay.\n\nexport class InterSessionQueue {\n private queue = new Map<\n string,\n { items: DeferredInject[]; head: number; requestIds: Set<string> }\n >();\n\n private compactOrDelete(\n topicId: string,\n bucket: { items: DeferredInject[]; head: number; requestIds: Set<string> },\n ): void {\n if (bucket.head >= bucket.items.length) {\n this.queue.delete(topicId);\n return;\n }\n // Keep dequeue O(1) on the hot path; compact only when the reclaimed\n // prefix is large enough to justify copying the remaining references.\n if (bucket.head >= 64 && bucket.head * 2 >= bucket.items.length) {\n bucket.items = bucket.items.slice(bucket.head);\n bucket.head = 0;\n }\n }\n\n /** Enqueue inject if requestId is set and not a duplicate. Returns true if enqueued. */\n enqueue(topicId: string, inject: DeferredInject): boolean {\n if (!inject.requestId) {\n logger.error(\n { topicId, origin: inject.origin },\n \"BUG: session inject reached enqueue without requestId — DROPPING inject\",\n );\n return false;\n }\n let bucket = this.queue.get(topicId);\n if (!bucket) {\n bucket = { items: [], head: 0, requestIds: new Set<string>() };\n this.queue.set(topicId, bucket);\n }\n if (bucket.requestIds.has(inject.requestId)) {\n logger.info(\n { topicId, requestId: inject.requestId, origin: inject.origin },\n \"session inject deduped (existing entry with same requestId)\",\n );\n return false;\n }\n bucket.items.push(inject);\n bucket.requestIds.add(inject.requestId);\n logger.info(\n { topicId, origin: inject.origin, requestId: inject.requestId, depth: inject.depth },\n \"session inject enqueued\",\n );\n return true;\n }\n\n /** True when an entry with this requestId is still queued for this topic. */\n hasRequest(topicId: string, requestId: string): boolean {\n return this.queue.get(topicId)?.requestIds.has(requestId) ?? false;\n }\n\n /** Remove and return the next queued inject for this topic, or undefined if empty. */\n dequeueNext(topicId: string): DeferredInject | undefined {\n const bucket = this.queue.get(topicId);\n if (!bucket || bucket.head >= bucket.items.length) return undefined;\n const next = bucket.items[bucket.head++];\n if (next.requestId) bucket.requestIds.delete(next.requestId);\n this.compactOrDelete(topicId, bucket);\n return next;\n }\n\n /**\n * Remove and return the longest mergeable PREFIX of the queue as a single\n * entry, or undefined if empty. Multiple prompts are joined so they land in\n * one turn instead of chaining N turns for N queued injects.\n *\n * Merge rule (mirrors Otium): caller-bound ask_session replies can merge\n * even when they came from different target topics; ordinary inter-session\n * injects remain conservative and require the same origin/silent/session\n * shape. `onDispatched` callbacks from each merged entry are composed.\n */\n dequeueAll(topicId: string): DeferredInject | undefined {\n const bucket = this.queue.get(topicId);\n if (!bucket || bucket.head >= bucket.items.length) return undefined;\n const base = bucket.items[bucket.head];\n const isAskReplyInject = (e: DeferredInject) => !e.silent && Boolean(e.askReplySources?.length);\n const baseIsAskReplyInject = isAskReplyInject(base);\n const mergeable = (e: DeferredInject) =>\n (baseIsAskReplyInject\n ? isAskReplyInject(e)\n : !isAskReplyInject(e) &&\n e.origin === base.origin &&\n (e.silent ?? false) === (base.silent ?? false)) &&\n (e.onDispatched !== undefined) === (base.onDispatched !== undefined) &&\n (e.agentOverride ?? null) === (base.agentOverride ?? null) &&\n (e.modelOverride ?? null) === (base.modelOverride ?? null) &&\n (e.effortOverride ?? null) === (base.effortOverride ?? null) &&\n (e.runtimeEpoch ?? 0) === (base.runtimeEpoch ?? 0) &&\n (e.sessionId ?? null) === (base.sessionId ?? null) &&\n (e.forkHandle?.forkId ?? null) === (base.forkHandle?.forkId ?? null) &&\n (e.prepareSession ?? null) === (base.prepareSession ?? null) &&\n (e.cwd ?? null) === (base.cwd ?? null) &&\n (e.sessionName ?? null) === (base.sessionName ?? null) &&\n (e.sessionType ?? null) === (base.sessionType ?? null) &&\n (e.onSessionId ?? null) === (base.onSessionId ?? null) &&\n (e.onSessionReset ?? null) === (base.onSessionReset ?? null) &&\n (e.bridgeSessionFromHistory ?? false) === (base.bridgeSessionFromHistory ?? false) &&\n (e.onSettled ?? null) === (base.onSettled ?? null);\n let end = bucket.head + 1;\n while (end < bucket.items.length && mergeable(bucket.items[end])) end++;\n const batch = bucket.items.slice(bucket.head, end);\n bucket.head = end;\n for (const entry of batch) {\n if (entry.requestId) bucket.requestIds.delete(entry.requestId);\n }\n this.compactOrDelete(topicId, bucket);\n if (batch.length === 1) return batch[0];\n\n const callbacks = batch\n .map((e) => e.onDispatched)\n .filter((cb): cb is NonNullable<typeof cb> => !!cb);\n const askReplySources = batch.flatMap((e): AskReplySource[] => {\n if (e.askReplySources?.length) return e.askReplySources;\n if (!e.requestId || !e.origin) return [];\n return [{ from: e.origin, requestId: e.requestId, contextId: e.contextId }];\n });\n const depths = batch\n .map((e) => e.depth)\n .filter((depth): depth is number => typeof depth === \"number\");\n return {\n ...base,\n prompt: batch.map((e) => e.prompt).join(\"\\n\\n\"),\n origin: baseIsAskReplyInject\n ? [...new Set(batch.map((e) => e.origin).filter(Boolean))].join(\", \")\n : base.origin,\n depth: depths.length ? Math.min(...depths) : base.depth,\n requestId: `merged-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n // Same-origin batches share one context; only drop it when the batch\n // disagrees (a merged turn must not append to the wrong context).\n contextId: batch.every((e) => e.contextId === base.contextId) ? base.contextId : undefined,\n askReplySources,\n onDispatched: callbacks.length\n ? (queryId: string) => {\n callbacks.forEach((cb) => {\n cb(queryId);\n });\n }\n : undefined,\n };\n }\n\n /** All non-empty queue keys for this topic room. */\n keysForRoom(): string[] {\n return Array.from(this.queue.keys());\n }\n\n /** Drop all queued injects for a topic (e.g. after room abort). */\n drop(topicId: string): void {\n this.queue.delete(topicId);\n }\n\n /** Number of queued injects for a topic. */\n size(topicId: string): number {\n const bucket = this.queue.get(topicId);\n return bucket ? bucket.items.length - bucket.head : 0;\n }\n\n /** Remove one queued inject by request id. Used by bounded background queues. */\n remove(topicId: string, requestId: string): DeferredInject | undefined {\n const bucket = this.queue.get(topicId);\n if (!bucket?.requestIds.has(requestId)) return undefined;\n const index = bucket.items.findIndex(\n (entry, entryIndex) => entryIndex >= bucket.head && entry.requestId === requestId,\n );\n if (index < 0) return undefined;\n const [removed] = bucket.items.splice(index, 1);\n bucket.requestIds.delete(requestId);\n this.compactOrDelete(topicId, bucket);\n return removed;\n }\n}\n\nexport interface DeferredInjectBatcherOptions {\n queue: InterSessionQueue;\n delayMs: number;\n isBusy: (topicId: string) => boolean;\n dispatch: (inject: DeferredInject) => void;\n schedule?: (callback: () => void, delayMs: number) => unknown;\n}\n\n/**\n * Gives caller-bound ask replies a short window to collect before dispatch.\n * `dequeueAll()` only merges entries that are already queued, so the first\n * reply must pass through this gate too when its caller room is idle.\n */\nexport class DeferredInjectBatcher {\n private readonly timers = new Map<string, unknown>();\n private readonly scheduleTimer: (callback: () => void, delayMs: number) => unknown;\n\n constructor(private readonly options: DeferredInjectBatcherOptions) {\n this.scheduleTimer = options.schedule ?? ((callback, delayMs) => setTimeout(callback, delayMs));\n }\n\n enqueue(inject: DeferredInject): boolean {\n const queued = this.options.queue.enqueue(inject.topicId, inject);\n if (!queued) return false;\n if (this.timers.has(inject.topicId)) return true;\n\n const timer = this.scheduleTimer(() => {\n this.timers.delete(inject.topicId);\n // A busy room owns the drain in its turn-finally path. Leaving the\n // entries queued avoids a second dispatcher racing that owner.\n if (this.options.isBusy(inject.topicId)) return;\n const batch = this.options.queue.dequeueAll(inject.topicId);\n if (batch) this.options.dispatch(batch);\n }, this.options.delayMs);\n this.timers.set(inject.topicId, timer);\n return true;\n }\n\n isScheduled(topicId: string): boolean {\n return this.timers.has(topicId);\n }\n}\n\nexport const interSessionQueue = new InterSessionQueue();\n\n// ── Defer / drain helpers (thin wrappers around InterSessionQueue) ────\n\n/**\n * Enqueue a deferred inject. With the full queue, this also deduplicates by\n * requestId.\n */\nexport function deferInject(inject: DeferredInject): boolean {\n return interSessionQueue.enqueue(inject.topicId, inject);\n}\n\n/**\n * Remove and return the longest mergeable batch of deferred injects for a room,\n * or undefined if empty.\n */\nexport function takeDeferredInject(topicId: string): DeferredInject | undefined {\n return interSessionQueue.dequeueAll(topicId);\n}\n\n/** Cancel one deferred inject before it claims the room. */\nexport function cancelDeferredInject(topicId: string, requestId: string): boolean {\n return interSessionQueue.remove(topicId, requestId) !== undefined;\n}\n\n// ── WS discriminator ───────────────────────────────────────────────────\n\n/** Map the internal AbortReason → the WS `ai_aborted` discriminator. */\nexport function wsAbortReason(reason: AbortReason): \"superseded\" | \"stopped\" {\n return reason === AbortReason.Internal ? \"superseded\" : \"stopped\";\n}\n"
9
+ ],
10
+ "mappings": "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",
11
+ "debugId": "5F827946B984263664756E2164756E21",
12
+ "names": []
13
+ }
@@ -3,7 +3,7 @@ import {
3
3
  NODE_CONTROL_BASE_PATH,
4
4
  NODE_CONTROL_PROTOCOL_VERSION,
5
5
  startDefaultNode
6
- } from "./chunk-p3cr2ejg.js";
6
+ } from "./chunk-q00djwra.js";
7
7
  import"./chunk-edb07sjp.js";
8
8
  import {
9
9
  deleteVaultEntry,
@@ -15,16 +15,17 @@ import {
15
15
  switchTopicEffort,
16
16
  switchTopicModel,
17
17
  topicService
18
- } from "./chunk-exd0v74a.js";
19
- import"./chunk-sm6fh5c5.js";
20
- import"./chunk-jc0at0tc.js";
18
+ } from "./chunk-ka8rv918.js";
19
+ import"./chunk-x1arr7ze.js";
20
+ import"./chunk-sxf7krrx.js";
21
+ import"./chunk-z2xy5n2q.js";
21
22
  import"./chunk-sgsz2fpq.js";
22
23
  import"./chunk-1k7t7bnx.js";
23
- import"./chunk-rbrxjvbj.js";
24
+ import"./chunk-yx2dvsye.js";
24
25
  import {
25
26
  getVisibleTopics
26
- } from "./chunk-ghs2j1fr.js";
27
- import"./chunk-fgrme9tr.js";
27
+ } from "./chunk-5rmbpqy9.js";
28
+ import"./chunk-waf61p58.js";
28
29
  import {
29
30
  ensurePersonalGeneral,
30
31
  getAllMessagesForTopic,
@@ -32,20 +33,24 @@ import {
32
33
  listApiMessages,
33
34
  listRecentRuntimeEventsForTopic,
34
35
  runtimeBus
35
- } from "./chunk-0ay6cjdy.js";
36
- import"./chunk-xfq68rch.js";
37
- import"./chunk-9p0ww3tk.js";
36
+ } from "./chunk-1vth6t3y.js";
37
+ import"./chunk-f97qybwk.js";
38
+ import"./chunk-a3ypq5pp.js";
39
+ import"./chunk-9krt5z40.js";
40
+ import"./chunk-mhty3nna.js";
38
41
  import"./chunk-vp2db42d.js";
39
- import"./chunk-gmy11efb.js";
42
+ import"./chunk-hsq7j9jk.js";
43
+ import"./chunk-jkencnkw.js";
44
+ import"./chunk-4f43r1nd.js";
45
+ import"./chunk-pkdmypdd.js";
46
+ import"./chunk-j0kjscb7.js";
40
47
  import {
41
48
  listRunningTopicQueries
42
- } from "./chunk-t9zcg8f1.js";
49
+ } from "./chunk-cp37k2wg.js";
43
50
  import {
44
51
  db
45
- } from "./chunk-7xqj7aex.js";
46
- import"./chunk-x1arr7ze.js";
47
- import"./chunk-5ahkew9c.js";
48
- import"./chunk-6cpn7ht2.js";
52
+ } from "./chunk-1msje2zf.js";
53
+ import"./chunk-f5xgprg1.js";
49
54
  import"./chunk-k9z47mab.js";
50
55
  import"./chunk-hwy3n31w.js";
51
56
 
@@ -215,7 +220,8 @@ class EmbeddedNegotiumClient {
215
220
  topic,
216
221
  userId: this.#userId,
217
222
  text,
218
- sourceAdapter: "terminal"
223
+ sourceAdapter: "terminal",
224
+ visualTools: false
219
225
  }).message;
220
226
  }
221
227
  answerQuestion(topicId, messageId, label) {
@@ -578,4 +584,4 @@ export {
578
584
 
579
585
  export { MESSAGE_HISTORY_PAGE_SIZE, INITIAL_MESSAGE_HISTORY_LIMIT, EmbeddedNegotiumClient, RemoteNegotiumClient };
580
586
 
581
- //# debugId=47DB3AB4EF8FA0E864756E2164756E21
587
+ //# debugId=BFBE6191C0A68B8A64756E2164756E21