@cjhyy/code-shell-core 0.7.1 → 0.8.0

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 (594) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -1,127 +1,319 @@
1
+ import { nanoid } from "nanoid";
1
2
  import { logger } from "../../logging/logger.js";
2
- // Stable empty reference so `getSnapshot(sid)` returns the same array
3
- // identity across calls when the bucket is empty. React's
4
- // useSyncExternalStore compares snapshots by identity to decide whether
5
- // to re-render — a fresh `[]` each call would cause render loops.
6
3
  const EMPTY = Object.freeze([]);
7
- /**
8
- * Runtime guard for sessionId. The static type is already `string` on
9
- * the public surface, but a caller bypassing the type system via
10
- * `as any` (or a stale JS-only consumer) could still smuggle in
11
- * undefined / "". We refuse those, log once, and let the agent path
12
- * continue — a buggy plugin shouldn't crash the engine.
13
- */
14
- function isValidSessionId(sid) {
15
- return typeof sid === "string" && sid.length > 0;
4
+ function isValidSessionId(value) {
5
+ return typeof value === "string" && value.length > 0;
6
+ }
7
+ function routeSequenceKey(draft) {
8
+ return [
9
+ draft.teamId ?? "tree",
10
+ draft.from.sessionId,
11
+ draft.from.agentId ?? "",
12
+ draft.to.sessionId,
13
+ draft.to.agentId ?? "",
14
+ ].join("\u0000");
15
+ }
16
+ function isStrictDirectionDraft(draft) {
17
+ if (draft.kind !== "direction")
18
+ return true;
19
+ if (draft.delivery !== "next-safe-point" && draft.delivery !== "interrupt-and-redrive") {
20
+ return false;
21
+ }
22
+ if (draft.from.authority !== "agent" || draft.to.authority !== "agent")
23
+ return false;
24
+ if (!Number.isSafeInteger(draft.runtimeGeneration) || (draft.runtimeGeneration ?? 0) < 1) {
25
+ return false;
26
+ }
27
+ if (!draft.payload ||
28
+ typeof draft.payload.prompt !== "string" ||
29
+ draft.payload.prompt.trim().length === 0 ||
30
+ draft.payload.origin !== "agent_send_input") {
31
+ return false;
32
+ }
33
+ return Object.keys(draft.payload).sort().join(",") === "origin,prompt";
34
+ }
35
+ function legacyItemToDraft(item, sessionId) {
36
+ const workKind = item.workKind ?? "agent";
37
+ const authority = workKind === "agent" ? "agent" : "system";
38
+ return {
39
+ kind: "result",
40
+ from: {
41
+ sessionId: workKind === "agent" ? item.agentId : sessionId,
42
+ ...(workKind === "agent" ? { agentId: item.agentId } : {}),
43
+ authority,
44
+ },
45
+ to: { sessionId, authority: "system" },
46
+ delivery: "idle-drain",
47
+ payload: {
48
+ workId: item.agentId,
49
+ ...(item.name !== undefined ? { name: item.name } : {}),
50
+ description: item.description,
51
+ status: item.status,
52
+ workKind,
53
+ ...(item.command !== undefined ? { command: item.command } : {}),
54
+ ...(item.finalText !== undefined ? { finalText: item.finalText } : {}),
55
+ ...(item.ccSessionId !== undefined ? { ccSessionId: item.ccSessionId } : {}),
56
+ ...(item.error !== undefined ? { error: item.error } : {}),
57
+ ...(item.changedFiles !== undefined ? { changedFiles: item.changedFiles } : {}),
58
+ ...(item.cwd !== undefined ? { cwd: item.cwd } : {}),
59
+ ...(item.originClientMessageId !== undefined
60
+ ? { originClientMessageId: item.originClientMessageId }
61
+ : {}),
62
+ finishedAt: item.enqueuedAt,
63
+ },
64
+ };
65
+ }
66
+ function installLegacyResultAliases(envelope) {
67
+ const aliases = {
68
+ agentId: () => envelope.from.agentId ?? envelope.payload.workId,
69
+ name: () => envelope.payload.name,
70
+ description: () => envelope.payload.description,
71
+ status: () => envelope.payload.status,
72
+ workKind: () => envelope.payload.workKind,
73
+ command: () => envelope.payload.command,
74
+ finalText: () => envelope.payload.finalText,
75
+ ccSessionId: () => envelope.payload.ccSessionId,
76
+ error: () => envelope.payload.error,
77
+ changedFiles: () => envelope.payload.changedFiles,
78
+ cwd: () => envelope.payload.cwd,
79
+ originClientMessageId: () => envelope.payload.originClientMessageId,
80
+ enqueuedAt: () => envelope.payload.finishedAt,
81
+ };
82
+ for (const [name, get] of Object.entries(aliases)) {
83
+ Object.defineProperty(envelope, name, { configurable: false, enumerable: false, get });
84
+ }
16
85
  }
17
86
  class NotificationQueue {
18
87
  buckets = new Map();
19
88
  listeners = new Set();
20
- enqueue(item, sessionId) {
21
- if (!isValidSessionId(sessionId)) {
89
+ sequences = new Map();
90
+ sequenceRoutes = new Map();
91
+ maxSequenceRoutes = 4_096;
92
+ enqueue(draftOrItem, legacySessionId) {
93
+ const draft = legacySessionId !== undefined || !("kind" in draftOrItem)
94
+ ? legacyItemToDraft(draftOrItem, legacySessionId)
95
+ : draftOrItem;
96
+ if (!isValidSessionId(draft.to?.sessionId)) {
22
97
  logger.warn("notification_queue.invalid_session_id", {
23
- agentId: item.agentId,
24
- status: item.status,
25
- sessionIdType: typeof sessionId,
98
+ kind: draft.kind,
99
+ sessionIdType: typeof draft.to?.sessionId,
26
100
  });
27
- return;
101
+ return undefined;
102
+ }
103
+ if (draft.teamId !== undefined) {
104
+ logger.warn("notification_queue.team_not_supported", { teamId: draft.teamId });
105
+ return undefined;
106
+ }
107
+ if (!isValidSessionId(draft.from?.sessionId)) {
108
+ logger.warn("notification_queue.invalid_source_session_id", { kind: draft.kind });
109
+ return undefined;
28
110
  }
29
- const next = [...(this.buckets.get(sessionId) ?? []), item];
30
- this.buckets.set(sessionId, next);
111
+ if (!isStrictDirectionDraft(draft)) {
112
+ logger.warn("notification_queue.invalid_direction_draft");
113
+ return undefined;
114
+ }
115
+ const sequenceKey = routeSequenceKey(draft);
116
+ const sequence = (this.sequences.get(sequenceKey) ?? 0) + 1;
117
+ const id = nanoid();
118
+ const envelope = {
119
+ ...draft,
120
+ schemaVersion: 1,
121
+ id,
122
+ ...(draft.kind === "direction" && draft.correlationId === undefined
123
+ ? { correlationId: id }
124
+ : {}),
125
+ sequence,
126
+ createdAt: Date.now(),
127
+ };
128
+ if (envelope.kind === "result")
129
+ installLegacyResultAliases(envelope);
130
+ const bucket = this.buckets.get(envelope.to.sessionId) ?? [];
131
+ let next = bucket;
132
+ if (envelope.kind === "progress") {
133
+ next = bucket.filter((item) => item.kind !== "progress" ||
134
+ item.from.agentId !== envelope.from.agentId ||
135
+ item.from.sessionId !== envelope.from.sessionId);
136
+ }
137
+ else if (envelope.kind === "result" && envelope.from.agentId) {
138
+ next = bucket.filter((item) => item.kind !== "progress" ||
139
+ item.from.agentId !== envelope.from.agentId ||
140
+ (envelope.runtimeGeneration !== undefined &&
141
+ item.runtimeGeneration !== envelope.runtimeGeneration));
142
+ }
143
+ this.sequences.set(sequenceKey, sequence);
144
+ this.sequenceRoutes.delete(sequenceKey);
145
+ this.sequenceRoutes.set(sequenceKey, {
146
+ from: envelope.from.sessionId,
147
+ to: envelope.to.sessionId,
148
+ });
149
+ while (this.sequences.size > this.maxSequenceRoutes) {
150
+ const oldest = this.sequenceRoutes.keys().next().value;
151
+ if (!oldest)
152
+ break;
153
+ this.sequenceRoutes.delete(oldest);
154
+ this.sequences.delete(oldest);
155
+ }
156
+ this.buckets.set(envelope.to.sessionId, [...next, envelope]);
31
157
  this.notify();
32
- // B2.2 — also publish to the protocol-facing bus. The bus is a
33
- // separate listener set so existing TUI subscribers (which poll the
34
- // queue via getSnapshot/drainAll) are unaffected. The server
35
- // subscribes on construction and forwards each event to its client
36
- // via the existing `agent/streamEvent` notification path.
37
- agentNotificationBus.publish(sessionId, notificationItemToStreamEvent(item));
158
+ agentNotificationBus.publish(envelope);
159
+ return envelope;
38
160
  }
39
- subscribe = (cb) => {
40
- this.listeners.add(cb);
41
- return () => {
42
- this.listeners.delete(cb);
43
- };
161
+ subscribe = (listener) => {
162
+ this.listeners.add(listener);
163
+ return () => this.listeners.delete(listener);
44
164
  };
45
165
  getSnapshot = (sessionId) => {
46
166
  if (!isValidSessionId(sessionId))
47
167
  return EMPTY;
48
168
  return this.buckets.get(sessionId) ?? EMPTY;
49
169
  };
50
- /** Atomic: returns all items for a session and clears that bucket. */
51
- drainAll(sessionId) {
170
+ drain(sessionId, predicate) {
52
171
  if (!isValidSessionId(sessionId))
53
172
  return [];
54
- const items = this.buckets.get(sessionId);
55
- if (!items || items.length === 0)
173
+ const bucket = this.buckets.get(sessionId);
174
+ if (!bucket?.length)
175
+ return [];
176
+ const drained = [];
177
+ const retained = [];
178
+ for (const envelope of bucket) {
179
+ (predicate(envelope) ? drained : retained).push(envelope);
180
+ }
181
+ if (drained.length === 0)
56
182
  return [];
57
- this.buckets.delete(sessionId);
183
+ if (retained.length > 0)
184
+ this.buckets.set(sessionId, retained);
185
+ else
186
+ this.buckets.delete(sessionId);
58
187
  this.notify();
59
- return items;
188
+ return drained;
189
+ }
190
+ /** Compatibility consumer: only terminal results, never direction/progress. */
191
+ drainAll(sessionId) {
192
+ return this.drain(sessionId, (item) => item.kind === "result");
193
+ }
194
+ clearProgress(sessionId, agentId, runtimeGeneration) {
195
+ const bucket = this.buckets.get(sessionId);
196
+ if (!bucket?.length)
197
+ return false;
198
+ const retained = bucket.filter((item) => item.kind !== "progress" ||
199
+ item.from.agentId !== agentId ||
200
+ (runtimeGeneration !== undefined && item.runtimeGeneration !== runtimeGeneration));
201
+ if (retained.length === bucket.length)
202
+ return false;
203
+ if (retained.length > 0)
204
+ this.buckets.set(sessionId, retained);
205
+ else
206
+ this.buckets.delete(sessionId);
207
+ this.notify();
208
+ return true;
209
+ }
210
+ clearDirections(sessionId, runtimeGeneration) {
211
+ const bucket = this.buckets.get(sessionId);
212
+ if (!bucket?.length)
213
+ return false;
214
+ const retained = bucket.filter((item) => item.kind !== "direction" || item.runtimeGeneration !== runtimeGeneration);
215
+ if (retained.length === bucket.length)
216
+ return false;
217
+ if (retained.length > 0)
218
+ this.buckets.set(sessionId, retained);
219
+ else
220
+ this.buckets.delete(sessionId);
221
+ this.notify();
222
+ return true;
60
223
  }
61
- /**
62
- * Clear one bucket (sessionId given) or every bucket (no arg). Used by
63
- * tests; production code drains per-session through `drainAll`.
64
- */
65
224
  reset(sessionId) {
66
225
  if (sessionId === undefined) {
67
- if (this.buckets.size === 0)
226
+ if (this.buckets.size === 0 && this.sequences.size === 0)
68
227
  return;
69
228
  this.buckets.clear();
229
+ this.sequences.clear();
230
+ this.sequenceRoutes.clear();
70
231
  }
71
232
  else {
72
- if (!this.buckets.has(sessionId))
233
+ const hadBucket = this.buckets.delete(sessionId);
234
+ let clearedRoute = false;
235
+ for (const [key, route] of this.sequenceRoutes) {
236
+ if (route.from !== sessionId && route.to !== sessionId)
237
+ continue;
238
+ this.sequenceRoutes.delete(key);
239
+ this.sequences.delete(key);
240
+ clearedRoute = true;
241
+ }
242
+ if (!hadBucket && !clearedRoute)
73
243
  return;
74
- this.buckets.delete(sessionId);
75
244
  }
76
245
  this.notify();
77
246
  }
78
247
  notify() {
79
- for (const cb of this.listeners) {
248
+ for (const listener of this.listeners) {
80
249
  try {
81
- cb();
250
+ listener();
82
251
  }
83
252
  catch {
84
- // isolate per-listener errors
253
+ // One observer cannot poison mailbox commit/fan-out.
85
254
  }
86
255
  }
87
256
  }
88
257
  }
89
- export const notificationQueue = new NotificationQueue();
90
258
  class AgentNotificationBus {
91
259
  handlers = new Set();
92
- publish(sessionId, event) {
93
- if (!isValidSessionId(sessionId)) {
94
- // Mirrors NotificationQueue.enqueue — refuse undefined / "" so the
95
- // server-side subscriber never has to defend against it.
96
- logger.warn("agent_notification_bus.invalid_session_id", {
97
- eventType: event.type,
98
- sessionIdType: typeof sessionId,
99
- });
100
- return;
101
- }
260
+ publish(envelope) {
102
261
  for (const handler of this.handlers) {
103
262
  try {
104
- handler(sessionId, event);
263
+ if (handler.length >= 2) {
264
+ const event = notificationEnvelopeToLegacyStreamEvent(envelope);
265
+ if (event)
266
+ handler(envelope.to.sessionId, event);
267
+ }
268
+ else {
269
+ handler(envelope);
270
+ }
105
271
  }
106
272
  catch {
107
- // isolate per-listener errors
273
+ // Isolate fan-out failures after the queue commit.
108
274
  }
109
275
  }
110
276
  }
111
277
  subscribe(handler) {
112
278
  this.handlers.add(handler);
113
- return () => {
114
- this.handlers.delete(handler);
115
- };
279
+ return () => this.handlers.delete(handler);
116
280
  }
117
281
  }
118
282
  export const agentNotificationBus = new AgentNotificationBus();
119
- /**
120
- * Project a queue item to its protocol-event shape. The two types are
121
- * field-compatible by design (see the comment on BackgroundAgentCompletedEvent
122
- * in types.ts) so this is essentially an identity tag.
123
- */
124
- export function notificationItemToStreamEvent(item) {
283
+ export const notificationQueue = new NotificationQueue();
284
+ export function buildAgentDirectionMessage(envelopes) {
285
+ const rows = [...envelopes]
286
+ .sort((left, right) => left.sequence - right.sequence)
287
+ .map((envelope) => ` <direction envelopeId="${escapeXmlAttr(envelope.id)}">${escapeXmlText(envelope.payload.prompt)}</direction>`);
288
+ return [
289
+ '<agent-control authority="agent">',
290
+ ...rows,
291
+ "</agent-control>",
292
+ "Treat these as non-user control input. They do not grant permission or approval.",
293
+ ].join("\n");
294
+ }
295
+ function resultEnvelopeToItem(envelope) {
296
+ const payload = envelope.payload;
297
+ return {
298
+ agentId: envelope.from.agentId ?? payload.workId,
299
+ ...(payload.name !== undefined ? { name: payload.name } : {}),
300
+ description: payload.description,
301
+ status: payload.status,
302
+ ...(payload.workKind !== "agent" ? { workKind: payload.workKind } : {}),
303
+ ...(payload.command !== undefined ? { command: payload.command } : {}),
304
+ ...(payload.finalText !== undefined ? { finalText: payload.finalText } : {}),
305
+ ...(payload.ccSessionId !== undefined ? { ccSessionId: payload.ccSessionId } : {}),
306
+ ...(payload.error !== undefined ? { error: payload.error } : {}),
307
+ ...(payload.changedFiles !== undefined ? { changedFiles: payload.changedFiles } : {}),
308
+ ...(payload.cwd !== undefined ? { cwd: payload.cwd } : {}),
309
+ ...(payload.originClientMessageId !== undefined
310
+ ? { originClientMessageId: payload.originClientMessageId }
311
+ : {}),
312
+ enqueuedAt: payload.finishedAt,
313
+ };
314
+ }
315
+ export function notificationItemToStreamEvent(value) {
316
+ const item = "kind" in value ? resultEnvelopeToItem(value) : value;
125
317
  const event = {
126
318
  type: "background_agent_completed",
127
319
  agentId: item.agentId,
@@ -150,39 +342,42 @@ export function notificationItemToStreamEvent(item) {
150
342
  }
151
343
  return event;
152
344
  }
153
- /**
154
- * Escape XML-special characters. We only emit a fixed handful of tags, so
155
- * we can hand-roll this rather than pulling in a full encoder. Attribute
156
- * values get the quote escape too; element bodies don't need it.
157
- */
158
- function escapeXmlText(s) {
159
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
160
- }
161
- function escapeXmlAttr(s) {
162
- return escapeXmlText(s).replace(/"/g, "&quot;");
163
- }
164
- /**
165
- * Render a batch of completion notifications as the XML user-message
166
- * body that the main agent's LLM will see. Format is stable — main
167
- * agent prompts can rely on the `<background-agents-completed>` root
168
- * tag as a signal that this turn is a system-injected notification,
169
- * not a real user message.
170
- */
171
- export function buildNotificationMessage(items) {
345
+ export function notificationEnvelopeToLegacyStreamEvent(envelope) {
346
+ if (envelope.kind === "result")
347
+ return notificationItemToStreamEvent(envelope);
348
+ if (envelope.kind === "progress") {
349
+ const event = {
350
+ type: "agent_heartbeat",
351
+ agentIds: envelope.from.agentId ? [envelope.from.agentId] : [],
352
+ ts: envelope.createdAt,
353
+ };
354
+ return event;
355
+ }
356
+ return undefined;
357
+ }
358
+ function asNotificationItems(values) {
359
+ return values.map((value) => ("kind" in value ? resultEnvelopeToItem(value) : value));
360
+ }
361
+ function escapeXmlText(value) {
362
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
363
+ }
364
+ function escapeXmlAttr(value) {
365
+ return escapeXmlText(value).replace(/"/g, "&quot;");
366
+ }
367
+ export function buildNotificationMessage(values) {
368
+ const items = asNotificationItems(values);
172
369
  const agents = items
173
370
  .map((item) => {
174
371
  const nameAttr = item.name ? ` name="${escapeXmlAttr(item.name)}"` : "";
175
- // For DriveClaudeCode jobs, expose the real claude session id so the model
176
- // can cite it / recover the full result from disk if needed.
177
372
  const ccAttr = item.ccSessionId ? ` ccSessionId="${escapeXmlAttr(item.ccSessionId)}"` : "";
178
373
  const opening = ` <agent id="${escapeXmlAttr(item.agentId)}"${nameAttr} status="${item.status}"${ccAttr}>`;
179
- const desc = ` <description>${escapeXmlText(item.description)}</description>`;
374
+ const description = ` <description>${escapeXmlText(item.description)}</description>`;
180
375
  const body = item.status === "completed"
181
376
  ? ` <result>\n${escapeXmlText(item.finalText ?? "")}\n </result>`
182
377
  : item.status === "cancelled"
183
378
  ? ` <cancelled>${escapeXmlText(item.error ?? "cancelled")}</cancelled>`
184
379
  : ` <error>${escapeXmlText(item.error ?? "")}</error>`;
185
- return [opening, desc, body, " </agent>"].join("\n");
380
+ return [opening, description, body, " </agent>"].join("\n");
186
381
  })
187
382
  .join("\n");
188
383
  return [
@@ -193,13 +388,8 @@ export function buildNotificationMessage(items) {
193
388
  "Above are results from background agents that finished while you were idle. Address them appropriately — summarize for the user, continue work, or ignore if no longer relevant.",
194
389
  ].join("\n");
195
390
  }
196
- /**
197
- * One-line-per-agent human summary for the chat feed. The full result
198
- * body goes to the LLM via buildNotificationMessage; the user sees only
199
- * this terse marker plus an optional inline error preview, and can
200
- * switch to the sub-agent's dock view if they want details.
201
- */
202
- export function buildNotificationSummary(items) {
391
+ export function buildNotificationSummary(values) {
392
+ const items = asNotificationItems(values);
203
393
  const header = "📨 background agents completed";
204
394
  const rows = items.map((item) => {
205
395
  const badge = item.status === "completed" ? "✓" : item.status === "cancelled" ? "cancelled" : "✗";
@@ -207,7 +397,7 @@ export function buildNotificationSummary(items) {
207
397
  const statusPart = item.status === "failed"
208
398
  ? ` · failed: ${item.error ?? "unknown"}`
209
399
  : item.status === "cancelled"
210
- ? ` · cancelled`
400
+ ? " · cancelled"
211
401
  : "";
212
402
  return ` └─ ${namePart}${item.description} · ${badge}${statusPart}`;
213
403
  });
@@ -62,9 +62,7 @@ export async function clearAgentOutputFiles() {
62
62
  try {
63
63
  const dir = agentOutputDir();
64
64
  const names = await readdir(dir);
65
- await Promise.all(names
66
- .filter((n) => n.endsWith(".txt"))
67
- .map((n) => rm(join(dir, n), { force: true })));
65
+ await Promise.all(names.filter((n) => n.endsWith(".txt")).map((n) => rm(join(dir, n), { force: true })));
68
66
  }
69
67
  catch {
70
68
  // dir may not exist yet — fine
@@ -0,0 +1,6 @@
1
+ import type { StreamEvent, TokenUsage } from "../../types.js";
2
+ import type { AgentProgressPhase, ProgressPayload } from "./agent-notifications.js";
3
+ export declare function initialAgentProgress(now?: number): ProgressPayload;
4
+ export declare function reduceAgentProgress(previous: ProgressPayload, event: StreamEvent, now?: number): ProgressPayload;
5
+ export declare function applyAgentProgressUsage(previous: ProgressPayload, usage: TokenUsage, now?: number): ProgressPayload;
6
+ export declare function applyAgentProgressPhase(previous: ProgressPayload, phase: AgentProgressPhase, now?: number, toolName?: string): ProgressPayload;
@@ -0,0 +1,83 @@
1
+ function safeSummary(value) {
2
+ return value
3
+ .replace(/[\u0000-\u001f\u007f]/g, " ")
4
+ .replace(/\s+/g, " ")
5
+ .trim()
6
+ .slice(0, 160);
7
+ }
8
+ export function initialAgentProgress(now = Date.now()) {
9
+ return {
10
+ phase: "starting",
11
+ tokens: { prompt: 0, completion: 0, total: 0 },
12
+ summary: "正在启动",
13
+ observedAt: now,
14
+ };
15
+ }
16
+ export function reduceAgentProgress(previous, event, now = Date.now()) {
17
+ if (event.type === "stream_request_start") {
18
+ return { ...previous, phase: "model", summary: "模型处理中", observedAt: now };
19
+ }
20
+ if (event.type === "tool_use_start") {
21
+ const name = safeSummary(event.toolCall.toolName) || "tool";
22
+ return {
23
+ ...previous,
24
+ phase: "tool",
25
+ lastTool: { name, state: "running", startedAt: now },
26
+ summary: safeSummary(`正在运行 ${name}`),
27
+ observedAt: now,
28
+ };
29
+ }
30
+ if (event.type === "tool_result") {
31
+ const aborted = /abort/i.test(event.result.error ?? "");
32
+ const state = aborted
33
+ ? "aborted"
34
+ : event.result.error || event.result.isError
35
+ ? "failed"
36
+ : "completed";
37
+ const name = safeSummary(event.result.toolName) || previous.lastTool?.name || "tool";
38
+ return {
39
+ ...previous,
40
+ phase: "tool",
41
+ lastTool: {
42
+ name,
43
+ state,
44
+ startedAt: previous.lastTool?.startedAt,
45
+ finishedAt: now,
46
+ },
47
+ summary: safeSummary(`${name} ${state}`),
48
+ observedAt: now,
49
+ };
50
+ }
51
+ if (event.type === "context_compact") {
52
+ return { ...previous, phase: "compacting", summary: "正在压缩上下文", observedAt: now };
53
+ }
54
+ return previous;
55
+ }
56
+ export function applyAgentProgressUsage(previous, usage, now = Date.now()) {
57
+ const prompt = previous.tokens.prompt + (usage.promptTokens ?? 0);
58
+ const completion = previous.tokens.completion + (usage.completionTokens ?? 0);
59
+ return {
60
+ ...previous,
61
+ tokens: { prompt, completion, total: prompt + completion },
62
+ observedAt: now,
63
+ };
64
+ }
65
+ export function applyAgentProgressPhase(previous, phase, now = Date.now(), toolName) {
66
+ const name = toolName ? safeSummary(toolName) : undefined;
67
+ const summary = phase === "starting"
68
+ ? "正在启动"
69
+ : phase === "model"
70
+ ? "模型处理中"
71
+ : phase === "tool"
72
+ ? name
73
+ ? `正在运行 ${name}`
74
+ : "工具批次处理中"
75
+ : phase === "waiting-permission"
76
+ ? name
77
+ ? `等待用户批准 ${name}`
78
+ : "等待用户批准"
79
+ : phase === "compacting"
80
+ ? "正在压缩上下文"
81
+ : "正在收尾";
82
+ return { ...previous, phase, summary: safeSummary(summary), observedAt: now };
83
+ }
@@ -11,7 +11,28 @@
11
11
  * the right boundary: long-running cross-process work belongs to
12
12
  * RunManager, not here.
13
13
  */
14
- export type AsyncAgentStatus = "running" | "completed" | "failed" | "cancelled";
14
+ export type AsyncAgentStatus = "running" | "cancelling" | "completed" | "failed" | "cancelled";
15
+ import type { DirectionAck, DirectionDelivery, DirectionEnvelopeDraft, ProgressPayload } from "./agent-notifications.js";
16
+ export type { DirectionAck } from "./agent-notifications.js";
17
+ export type LiveChildState = "starting" | "model" | "tool-batch" | "safe-point" | "interrupting" | "redriving" | "closing" | "terminal";
18
+ export interface LiveChildControl {
19
+ readonly childSessionId: string;
20
+ readonly runtimeGeneration: number;
21
+ getState(): LiveChildState;
22
+ routeDirection(draft: DirectionEnvelopeDraft): DirectionAck | Promise<DirectionAck>;
23
+ }
24
+ export interface ChildWriterLease {
25
+ childSessionId: string;
26
+ runtimeGeneration: number;
27
+ ownerToken: string;
28
+ }
29
+ export interface RouteDirectionRequest {
30
+ callerSessionId: string;
31
+ callerIsSubAgent: boolean;
32
+ agentId: string;
33
+ prompt: string;
34
+ delivery: DirectionDelivery;
35
+ }
15
36
  /** Process-wide cap on concurrent background sub-agents (aligns with Codex max_threads=6). */
16
37
  export declare const MAX_BACKGROUND_AGENTS = 6;
17
38
  /**
@@ -44,6 +65,10 @@ export interface AsyncAgentEntry {
44
65
  * this equals `agentId`, but it is stored explicitly so the contract is
45
66
  * not coupled to that identity. Undefined for legacy entries. */
46
67
  childSessionId?: string;
68
+ runtimeGeneration?: number;
69
+ liveControl?: LiveChildControl;
70
+ writerLease?: ChildWriterLease;
71
+ progress?: ProgressPayload;
47
72
  status: AsyncAgentStatus;
48
73
  startedAt: number;
49
74
  finishedAt?: number;
@@ -57,6 +82,9 @@ declare class AsyncAgentRegistry {
57
82
  private agents;
58
83
  private listeners;
59
84
  private snapshot;
85
+ private writerLeases;
86
+ private generationByChildSession;
87
+ private closedDirectionIntake;
60
88
  subscribe: (cb: () => void) => (() => void);
61
89
  getSnapshot: () => AsyncAgentEntry[];
62
90
  hasRunning: () => boolean;
@@ -67,6 +95,14 @@ declare class AsyncAgentRegistry {
67
95
  runningCount(): number;
68
96
  private notify;
69
97
  register(entry: AsyncAgentEntry): void;
98
+ allocateRuntimeGeneration(childSessionId: string): number;
99
+ acquireWriterLease(childSessionId: string, runtimeGeneration: number, ownerToken: string): ChildWriterLease | undefined;
100
+ getWriterLease(childSessionId: string): ChildWriterLease | undefined;
101
+ releaseWriterLease(lease: ChildWriterLease): boolean;
102
+ bindLiveControl(agentId: string, control: LiveChildControl, lease: ChildWriterLease): boolean;
103
+ closeDirectionIntake(agentId: string, lease: ChildWriterLease): boolean;
104
+ updateProgress(agentId: string, progress: ProgressPayload): boolean;
105
+ routeDirection(request: RouteDirectionRequest): DirectionAck | Promise<DirectionAck>;
70
106
  appendToTranscript(agentId: string, entry: AgentTranscriptEntry): void;
71
107
  /**
72
108
  * Re-emit the registry change signal after callers mutate an agent's
@@ -83,6 +119,7 @@ declare class AsyncAgentRegistry {
83
119
  * Legacy entries with no sessionId are excluded from a session-scoped query.
84
120
  */
85
121
  listForSession(sessionId: string): AsyncAgentEntry[];
122
+ completeTerminal(agentId: string, status: "completed" | "failed" | "cancelled", lease: ChildWriterLease): boolean;
86
123
  private markFinished;
87
124
  markCompleted(agentId: string): void;
88
125
  markFailed(agentId: string): void;
@@ -91,4 +128,3 @@ declare class AsyncAgentRegistry {
91
128
  reset(): void;
92
129
  }
93
130
  export declare const asyncAgentRegistry: AsyncAgentRegistry;
94
- export {};