@cjhyy/code-shell-core 0.7.0 → 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 (621) 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 +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /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 {};