@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,698 +0,0 @@
1
- import { runAgentOnce } from "../../cc-orchestrator/external-agent-driver.js";
2
- import { claudeAdapter, codexAdapter } from "../../cc-orchestrator/agent-adapter.js";
3
- import { backgroundJobRegistry } from "./background-jobs.js";
4
- import { readExternalChangedFiles } from "../../cc-orchestrator/external-agent-changes.js";
5
- import { isExistingDirectory, normalizeCwdPath } from "../../cc-orchestrator/cwd-normalize.js";
6
- import { notificationQueue } from "./agent-notifications.js";
7
- import { existsSync, realpathSync, statSync } from "node:fs";
8
- import { extname, isAbsolute, relative, resolve, sep } from "node:path";
9
- import { externalAgentSessionStore, } from "../../cc-orchestrator/external-agent-session-store.js";
10
- import { logger } from "../../logging/logger.js";
11
- export const DRIVE_AGENT_FOREGROUND_HANDOFF_MS = 110_000;
12
- export const DRIVE_AGENT_TOOL_TIMEOUT_MS = 1_800_000;
13
- const CLI_ADAPTERS = {
14
- claude: { adapter: claudeAdapter, command: "claude" },
15
- codex: { adapter: codexAdapter, command: "codex" },
16
- };
17
- export const driveAgentToolDef = {
18
- name: "DriveAgent",
19
- description: "Delegate a task to an external coding-agent CLI — drives `claude` (Claude Code) or `codex` " +
20
- "(OpenAI Codex) for one turn. Pick with `cli` (defaults to claude). Use to hand a coding/" +
21
- "research task to the agent, or continue an existing session of it. " +
22
- "Runs in the BACKGROUND by default — these tasks are typically long (minutes to hours), so this " +
23
- "returns immediately and the result is delivered to you later via a completion notification " +
24
- "that wakes you. Do NOT sleep-poll for it; just continue or end your turn — you'll be woken " +
25
- "with the result. " +
26
- "Before launching writable work in a cwd, call DriveAgentJobs(action:'list', cwd) to see any " +
27
- "already-running DriveAgent jobs there, their prompt summaries, owner sessions, CLI kind, and " +
28
- "known changed files; use DriveAgentJobs(action:'cancel', jobId) if you must stop one. " +
29
- "For a quick task where you want the answer inline, pass background:false. " +
30
- "It has NO time concept of its own: for 'in N minutes' / 'every N' / looping, use CronCreate " +
31
- "instead (never sleep). A scheduled CronCreate job runs one codeshell turn whose prompt can " +
32
- "instruct it to call DriveAgent; to continue a prior session across runs, have that turn pass " +
33
- "the sessionId this tool returned as resumeSessionId (same cli). To make the single turn work " +
34
- "longer/deeper, write that into `prompt` (e.g. 'keep working until done'). " +
35
- "Pass `resumeSessionId` to continue a prior session of the SAME cli (keeps context); omit to start fresh.\n" +
36
- "SCOPE & BUDGET (read before fanning out): each driven agent consumes a large, SHARED token budget. " +
37
- "Do NOT launch many agents at once to 'cover more ground' — that burns the budget and leaves every " +
38
- "task half-done. Default to ONE agent at a time; only run a few in parallel when the work TRULY splits " +
39
- "into independent pieces, and even then keep the count small (≈2-3). Prefer finishing one task before " +
40
- "starting the next. " +
41
- "Make each `prompt` a COMPLETE, self-contained task that instructs the agent to finish the whole thing " +
42
- "end-to-end and verify its own work before returning — never a vague 'start looking into X'. " +
43
- "Give it a concrete definition of done and, for open-ended work, a bound (files/scope/steps) so it " +
44
- "doesn't sprawl. If a big job must be split, split it into a SEQUENCE you drive one at a time (resume " +
45
- "the same session), not a swarm launched simultaneously.",
46
- inputSchema: {
47
- type: "object",
48
- properties: {
49
- prompt: {
50
- type: "string",
51
- description: "The task for the agent. Make it COMPLETE and self-contained: state the goal, a concrete definition of done, and (for open-ended work) an explicit scope bound so it finishes end-to-end and verifies its own work rather than sprawling or stopping half-way.",
52
- },
53
- cli: {
54
- type: "string",
55
- enum: ["claude", "codex"],
56
- description: "Which external CLI to drive. 'claude' = Claude Code (default), 'codex' = OpenAI Codex. resumeSessionId is only valid against the same cli that produced it.",
57
- },
58
- resumeSessionId: {
59
- type: "string",
60
- description: "Existing session id to resume (keeps context). Must come from a prior run of the SAME cli. Omit for a fresh session.",
61
- },
62
- model: {
63
- type: "string",
64
- description: "Optional model override, passed through to `claude --model` / `codex exec --model`. Omit to use the CLI default; only pass when the user explicitly requests a model.",
65
- },
66
- cwd: { type: "string", description: "Working directory the run operates in." },
67
- attachmentPaths: {
68
- type: "array",
69
- items: { type: "string" },
70
- description: "Optional local file paths to hand to the driven agent. Paths must resolve inside cwd. Images are also passed to Codex with -i when the installed Codex CLI supports it; otherwise all paths are listed in the prompt.",
71
- },
72
- permissionMode: {
73
- type: "string",
74
- enum: ["default", "acceptEdits", "bypassPermissions"],
75
- description: "Permission/sandbox level. Defaults to 'bypassPermissions' (full auto — needed so the agent's tools run unattended; there is no interactive approval loop here). For codex: default→read-only sandbox, acceptEdits→workspace-write, bypassPermissions→no sandbox. Pass 'default'/'acceptEdits' to gate.",
76
- },
77
- background: {
78
- type: "boolean",
79
- description: "Defaults to TRUE: run in the background and notify you on completion (right for long tasks). Pass false to run in the foreground and get the result inline (only for quick tasks).",
80
- },
81
- },
82
- required: ["prompt", "cwd"],
83
- },
84
- };
85
- const defaultRunner = (opts) => {
86
- const { adapter, command } = CLI_ADAPTERS[opts.cli];
87
- return runAgentOnce(adapter, {
88
- command,
89
- prompt: opts.prompt,
90
- resumeSessionId: opts.resumeSessionId,
91
- model: opts.model,
92
- cwd: opts.cwd,
93
- permissionMode: opts.permissionMode ?? "default",
94
- imagePaths: opts.imagePaths,
95
- }, opts.signal);
96
- };
97
- function newDriveJobId() {
98
- return `cc-${process.hrtime.bigint().toString(36)}`;
99
- }
100
- function summarizePrompt(prompt, max = 120) {
101
- const oneLine = prompt.replace(/\s+/g, " ").trim();
102
- if (oneLine.length <= max)
103
- return oneLine;
104
- return `${oneLine.slice(0, Math.max(0, max - 3))}...`;
105
- }
106
- function isDriveAgentJob(job) {
107
- return job.kind === "drive-agent" || job.description.startsWith("DriveAgent(");
108
- }
109
- function changedFilesSummary(job) {
110
- const files = job.changedFiles ?? [];
111
- if (files.length === 0)
112
- return "unknown";
113
- if (files.length <= 4)
114
- return files.join(",");
115
- return `${files.slice(0, 4).join(",")} (+${files.length - 4} more)`;
116
- }
117
- /**
118
- * Canonicalize external transcript paths against the DriveAgent cwd. Claude
119
- * normally records absolute paths while Codex apply_patch normally records
120
- * relative paths; returning a cwd-relative display path for in-workspace files
121
- * gives the renderer one stable identity and removes duplicate transcript hits.
122
- */
123
- function normalizeChangedFiles(cwd, files) {
124
- const seen = new Set();
125
- const out = [];
126
- for (const file of files) {
127
- if (typeof file !== "string" || !file.trim())
128
- continue;
129
- const absolute = resolve(cwd, file.trim());
130
- if (seen.has(absolute))
131
- continue;
132
- seen.add(absolute);
133
- const rel = relative(cwd, absolute);
134
- out.push(rel && rel !== ".." && !rel.startsWith(`..${sep}`) ? rel : absolute);
135
- }
136
- return out;
137
- }
138
- function jobDurationSeconds(job) {
139
- const end = job.finishedAt ?? Date.now();
140
- return `${Math.max(0, (end - job.startedAt) / 1000).toFixed(1)}s`;
141
- }
142
- function formatDriveJobListLine(job) {
143
- const prompt = job.promptSummary || job.description || "(no prompt summary)";
144
- const cwd = job.cwd ?? "(unknown cwd)";
145
- const cli = job.cli ?? "unknown";
146
- return [
147
- `${job.jobId}`,
148
- `status=${job.status}`,
149
- `cli=${cli}`,
150
- `session=${job.sessionId}`,
151
- `cwd=${cwd}`,
152
- `startedAt=${new Date(job.startedAt).toISOString()}`,
153
- `duration=${jobDurationSeconds(job)}`,
154
- `changedFiles=${changedFilesSummary(job)}`,
155
- `prompt="${prompt}"`,
156
- ].join(" ");
157
- }
158
- function isValidSessionId(sessionId) {
159
- return typeof sessionId === "string" && sessionId.length > 0;
160
- }
161
- function argSignal(args) {
162
- const signal = args.__signal;
163
- return signal &&
164
- typeof signal === "object" &&
165
- typeof signal.aborted === "boolean" &&
166
- typeof signal.addEventListener === "function"
167
- ? signal
168
- : undefined;
169
- }
170
- function startRun(runner, opts) {
171
- return Promise.resolve().then(() => runner(opts));
172
- }
173
- function resolveAttachmentPaths(raw, cwd) {
174
- if (raw === undefined)
175
- return { paths: [] };
176
- if (!Array.isArray(raw))
177
- return { paths: [], error: "attachmentPaths must be an array of strings" };
178
- const cwdReal = realpathSync(cwd);
179
- const paths = [];
180
- for (const item of raw) {
181
- if (typeof item !== "string" || !item.trim()) {
182
- return { paths: [], error: "attachmentPaths must contain only non-empty strings" };
183
- }
184
- const candidate = isAbsolute(item) ? item : resolve(cwd, item);
185
- if (!existsSync(candidate))
186
- return { paths: [], error: `attachment path not found: ${item}` };
187
- const real = realpathSync(candidate);
188
- const rel = relative(cwdReal, real);
189
- if (rel === "" || rel === ".." || rel.startsWith(`..${sep}`)) {
190
- return { paths: [], error: `attachment path is outside cwd: ${item}` };
191
- }
192
- const info = statSync(real);
193
- if (!info.isFile())
194
- return { paths: [], error: `attachment path is not a file: ${item}` };
195
- paths.push(real);
196
- }
197
- return { paths };
198
- }
199
- const DRIVE_IMAGE_EXTS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp"]);
200
- function appendAttachmentPrompt(prompt, paths) {
201
- if (paths.length === 0)
202
- return prompt;
203
- const lines = ["", "Attached files:"];
204
- for (const path of paths) {
205
- const kind = DRIVE_IMAGE_EXTS.has(extname(path).toLowerCase()) ? "image" : "file";
206
- lines.push(`- ${path} (${kind})`);
207
- }
208
- return `${prompt}\n${lines.join("\n")}`;
209
- }
210
- function recordSuccessfulSession(store, cli, cwd, result, includeErroredSession = false) {
211
- if ((!includeErroredSession && result.isError) || !result.sessionId)
212
- return;
213
- try {
214
- store.record({ cli, sessionId: result.sessionId, cwd });
215
- }
216
- catch (err) {
217
- logger.warn("drive_agent.session_binding_record_failed", {
218
- cat: "cc",
219
- cli,
220
- sessionId: result.sessionId,
221
- cwd,
222
- error: err instanceof Error ? err.message : String(err),
223
- });
224
- }
225
- }
226
- function duplicateCwdWarning(cwd, writable) {
227
- if (!writable)
228
- return undefined;
229
- const running = backgroundJobRegistry.listRunningByCwd(cwd).filter(isDriveAgentJob);
230
- if (running.length === 0)
231
- return undefined;
232
- const jobs = running.map(formatDriveJobListLine).join("; ");
233
- return (`Warning: another DriveAgent job is already running in cwd ${cwd}. ` +
234
- "Concurrent writable agents in the same directory can overwrite each other's work. " +
235
- `Run DriveAgentJobs(action:"list", cwd:"${cwd}") before dispatching parallel work for details/cancellation. ` +
236
- `Running: ${jobs}`);
237
- }
238
- function attachDriveCompletion(params) {
239
- const { jobId, sessionId, label, cli, cwd, run, sessionStore, readChangedFiles, recordExternalFileChanges, originClientMessageId, } = params;
240
- void run
241
- .then((r) => {
242
- const jobStatus = backgroundJobRegistry.get(jobId)?.status;
243
- if (jobStatus !== "running" && jobStatus !== "cancelling")
244
- return;
245
- const cancelling = jobStatus === "cancelling";
246
- recordSuccessfulSession(sessionStore, cli, cwd, r, cancelling);
247
- // Attribute external changes BEFORE publishing completion. Previously the
248
- // notification event was emitted first and carried no files; changedFiles
249
- // only reached the background-work registry/panel, so the chat turn card
250
- // could never count DriveAgent edits.
251
- const rawChangedFiles = r.sessionId ? readChangedFiles(cli, cwd, r.sessionId) : [];
252
- const changedFiles = normalizeChangedFiles(cwd, rawChangedFiles);
253
- if (changedFiles.length > 0) {
254
- recordExternalFileChanges?.({
255
- jobId,
256
- description: label,
257
- cli,
258
- cwd,
259
- status: cancelling ? "cancelled" : r.isError ? "failed" : "completed",
260
- changedFiles,
261
- ...(originClientMessageId ? { originClientMessageId } : {}),
262
- });
263
- }
264
- logger.debug("changed_files.drive_completion", {
265
- cat: "changed_files",
266
- jobId,
267
- sessionId,
268
- externalSessionId: r.sessionId || undefined,
269
- cli,
270
- cwd,
271
- originClientMessageId,
272
- rawSize: rawChangedFiles.length,
273
- size: changedFiles.length,
274
- files: changedFiles,
275
- });
276
- if (cancelling) {
277
- backgroundJobRegistry.recordArtifacts(jobId, {
278
- ccSessionId: r.sessionId || undefined,
279
- changedFiles,
280
- });
281
- return;
282
- }
283
- // Deliver the result back so the woken agent actually sees the answer
284
- // (not just "a job finished"). Mirrors the video/sub-agent completion
285
- // path — enqueue lands in the same notificationQueue the wakeup drains.
286
- notificationQueue.enqueue(r.isError
287
- ? {
288
- agentId: jobId,
289
- description: label,
290
- status: "failed",
291
- workKind: "cc",
292
- error: r.finalText || "(no output)",
293
- ccSessionId: r.sessionId || undefined,
294
- ...(changedFiles.length ? { changedFiles, cwd } : {}),
295
- ...(originClientMessageId ? { originClientMessageId } : {}),
296
- enqueuedAt: Date.now(),
297
- }
298
- : {
299
- agentId: jobId,
300
- description: label,
301
- status: "completed",
302
- workKind: "cc",
303
- finalText: r.finalText,
304
- ccSessionId: r.sessionId || undefined,
305
- ...(changedFiles.length ? { changedFiles, cwd } : {}),
306
- ...(originClientMessageId ? { originClientMessageId } : {}),
307
- enqueuedAt: Date.now(),
308
- }, sessionId);
309
- // Retain the job in the panel with its result + the external CLI
310
- // session id + changed files.
311
- backgroundJobRegistry.finish(jobId, {
312
- status: r.isError ? "failed" : "completed",
313
- finalText: r.finalText || undefined,
314
- ccSessionId: r.sessionId || undefined,
315
- ...(changedFiles.length ? { changedFiles } : {}),
316
- });
317
- })
318
- .catch((err) => {
319
- if (backgroundJobRegistry.get(jobId)?.status !== "running")
320
- return;
321
- const msg = err?.message ?? String(err);
322
- notificationQueue.enqueue({
323
- agentId: jobId,
324
- description: label,
325
- status: "failed",
326
- workKind: "cc",
327
- error: msg,
328
- enqueuedAt: Date.now(),
329
- }, sessionId);
330
- backgroundJobRegistry.finish(jobId, { status: "failed", finalText: msg });
331
- });
332
- }
333
- function trackBackgroundRun(params) {
334
- const warning = duplicateCwdWarning(params.cwd, params.writable);
335
- const jobId = newDriveJobId();
336
- const run = params.start();
337
- backgroundJobRegistry.start(jobId, params.sessionId, params.label, {
338
- kind: "drive-agent",
339
- cwd: params.cwd,
340
- cli: params.cli,
341
- promptSummary: params.promptSummary,
342
- originClientMessageId: params.originClientMessageId,
343
- abort: async () => {
344
- params.abort();
345
- await run.catch(() => undefined);
346
- },
347
- });
348
- attachDriveCompletion({ ...params, jobId, run });
349
- return { jobId, ...(warning ? { warning } : {}) };
350
- }
351
- async function waitForForegroundOrHandoff(run, handoffMs) {
352
- if (handoffMs < 0) {
353
- return { kind: "completed", result: await run };
354
- }
355
- let timer;
356
- try {
357
- return await Promise.race([
358
- run.then((result) => ({ kind: "completed", result })),
359
- new Promise((resolve) => {
360
- timer = setTimeout(() => resolve({ kind: "handoff" }), handoffMs);
361
- }),
362
- ]);
363
- }
364
- finally {
365
- if (timer)
366
- clearTimeout(timer);
367
- }
368
- }
369
- function makeAbortController(parent, linkParent = false) {
370
- const controller = new AbortController();
371
- if (!parent)
372
- return controller;
373
- if (parent.aborted) {
374
- controller.abort(parent.reason);
375
- }
376
- else if (linkParent) {
377
- parent.addEventListener("abort", () => controller.abort(parent.reason), { once: true });
378
- }
379
- return controller;
380
- }
381
- /** Factory so tests can inject a fake runner. `fixedCli` (back-compat) forces a
382
- * cli and hides the `cli` arg — that's how DriveClaudeCode stays a thin alias. */
383
- export function makeDriveAgentTool(runner = defaultRunner, fixedCli, options = {}) {
384
- return async (args, ctx) => {
385
- const prompt = typeof args.prompt === "string" ? args.prompt : "";
386
- const rawRequestedCwd = typeof args.cwd === "string" ? args.cwd : process.cwd();
387
- const requestedCwd = normalizeCwdPath(rawRequestedCwd);
388
- if (!prompt)
389
- return "Error: prompt is required";
390
- const cli = fixedCli ??
391
- (args.cli === "codex"
392
- ? "codex"
393
- : args.cli === "claude" || args.cli === undefined
394
- ? "claude"
395
- : "invalid");
396
- if (cli === "invalid")
397
- return `Error: unknown cli "${String(args.cli)}" (expected "claude" or "codex")`;
398
- const resumeSessionId = typeof args.resumeSessionId === "string" ? args.resumeSessionId : undefined;
399
- const model = typeof args.model === "string" && args.model.trim() ? args.model : undefined;
400
- const sessionStore = options.sessionStore ?? externalAgentSessionStore;
401
- let cwd = requestedCwd;
402
- let resumeNote = "";
403
- if (resumeSessionId) {
404
- const binding = sessionStore.get(cli, resumeSessionId);
405
- if (binding) {
406
- const storedCwd = normalizeCwdPath(binding.cwd);
407
- if (!isExistingDirectory(storedCwd)) {
408
- return `Error: cannot resume ${cli} session ${resumeSessionId}: stored cwd no longer exists or is not a directory: ${storedCwd}`;
409
- }
410
- if (storedCwd !== requestedCwd) {
411
- cwd = storedCwd;
412
- resumeNote = `Note: resume session ${resumeSessionId} is bound to stored cwd ${storedCwd}; ignoring requested cwd ${requestedCwd}.`;
413
- logger.info("drive_agent.resume_forced_stored_cwd", {
414
- cat: "cc",
415
- cli,
416
- sessionId: resumeSessionId,
417
- requestedCwd,
418
- storedCwd,
419
- });
420
- }
421
- }
422
- }
423
- // Default to bypassPermissions: this tool is a fire-one-turn delegation to
424
- // an external CLI with nobody watching for approvals, and there is no
425
- // interactive approval loop here — so under "default" a tool that needs
426
- // approval (WebSearch/WebFetch/Write) silently can't run (the
427
- // "DriveClaudeCode 没有联网能力" report). A caller that wants gating passes
428
- // an explicit mode, which is honored. (For codex, the mode maps to a sandbox
429
- // tier inside codexAdapter.)
430
- const permissionMode = args.permissionMode === "default" ||
431
- args.permissionMode === "acceptEdits" ||
432
- args.permissionMode === "bypassPermissions"
433
- ? args.permissionMode
434
- : "bypassPermissions";
435
- const resolvedAttachmentPaths = resolveAttachmentPaths(args.attachmentPaths, cwd);
436
- if (resolvedAttachmentPaths.error)
437
- return `Error: ${resolvedAttachmentPaths.error}`;
438
- const attachmentPaths = resolvedAttachmentPaths.paths;
439
- const promptWithAttachments = appendAttachmentPrompt(prompt, attachmentPaths);
440
- const imagePaths = cli === "codex"
441
- ? attachmentPaths.filter((path) => DRIVE_IMAGE_EXTS.has(extname(path).toLowerCase()))
442
- : [];
443
- const cliName = cli === "codex" ? "Codex" : "Claude Code";
444
- const label = `DriveAgent(${cli}): ${prompt.slice(0, 40)}`;
445
- const promptSummary = summarizePrompt(prompt);
446
- const callerSignal = ctx?.signal ?? argSignal(args);
447
- const runOptsBase = {
448
- cli,
449
- prompt: promptWithAttachments,
450
- resumeSessionId,
451
- model,
452
- cwd,
453
- permissionMode,
454
- imagePaths,
455
- };
456
- const foregroundHandoffMs = options.foregroundHandoffMs ?? DRIVE_AGENT_FOREGROUND_HANDOFF_MS;
457
- const isWritableRun = permissionMode !== "default";
458
- // Background by default (these tasks are typically long). Only an explicit
459
- // background:false runs in the foreground and returns the result inline.
460
- const background = args.background !== false;
461
- if (background) {
462
- // Fail loud on a missing sessionId: a background job whose completion
463
- // notification can't be routed (enqueue drops invalid/empty sessionId)
464
- // would run to completion and then silently vanish — nobody gets woken
465
- // with the result. Refuse up front instead of launching disappearing work.
466
- const sessionId = ctx?.sessionId;
467
- if (typeof sessionId !== "string" || sessionId.length === 0) {
468
- return `Error: cannot start a background ${cliName} job without a session — its result notification would be dropped. Retry with background:false, or ensure the tool runs inside a session.`;
469
- }
470
- const abortController = makeAbortController(callerSignal, false);
471
- const tracked = trackBackgroundRun({
472
- sessionId,
473
- label,
474
- cli,
475
- cwd,
476
- promptSummary,
477
- start: () => startRun(runner, { ...runOptsBase, signal: abortController.signal }),
478
- abort: () => abortController.abort(),
479
- sessionStore,
480
- writable: isWritableRun,
481
- readChangedFiles: options.readChangedFiles ?? readExternalChangedFiles,
482
- recordExternalFileChanges: ctx?.recordExternalFileChanges,
483
- originClientMessageId: ctx?.originClientMessageId,
484
- });
485
- return [
486
- resumeNote,
487
- `已在后台启动 ${cliName}(jobId ${tracked.jobId})。完成后会通知你结果,无需轮询。`,
488
- tracked.warning,
489
- ]
490
- .filter(Boolean)
491
- .join("\n");
492
- }
493
- const foregroundAbort = makeAbortController(callerSignal, true);
494
- const run = startRun(runner, { ...runOptsBase, signal: foregroundAbort.signal });
495
- const result = await waitForForegroundOrHandoff(run, foregroundHandoffMs);
496
- if (result.kind === "handoff" && isValidSessionId(ctx?.sessionId)) {
497
- const tracked = trackBackgroundRun({
498
- sessionId: ctx.sessionId,
499
- label,
500
- cli,
501
- cwd,
502
- promptSummary,
503
- start: () => run,
504
- abort: () => foregroundAbort.abort(),
505
- sessionStore,
506
- writable: isWritableRun,
507
- readChangedFiles: options.readChangedFiles ?? readExternalChangedFiles,
508
- recordExternalFileChanges: ctx?.recordExternalFileChanges,
509
- originClientMessageId: ctx?.originClientMessageId,
510
- });
511
- return [
512
- resumeNote,
513
- `${cliName} foreground run exceeded ${foregroundHandoffMs}ms; moved it to background (jobId ${tracked.jobId}). Completion will notify this session, so do not poll.`,
514
- tracked.warning,
515
- ]
516
- .filter(Boolean)
517
- .join("\n");
518
- }
519
- const r = result.kind === "completed" ? result.result : await run;
520
- recordSuccessfulSession(sessionStore, cli, cwd, r);
521
- const prefix = resumeNote ? `${resumeNote}\n` : "";
522
- if (r.isError)
523
- return `${prefix}${cliName} 运行出错(session ${r.sessionId}):\n${r.finalText}`;
524
- return `${prefix}${cliName} 完成(session ${r.sessionId}):\n${r.finalText}`;
525
- };
526
- }
527
- export const driveAgentTool = makeDriveAgentTool();
528
- export const driveAgentJobsToolDef = {
529
- name: "DriveAgentJobs",
530
- description: "List, inspect, or cancel background DriveAgent jobs. Use action:'list' before launching " +
531
- "writable DriveAgent work in a cwd to see already-running jobs there, including prompt " +
532
- "summary, owner session, cwd, CLI kind, status, start time, and known changed files. " +
533
- "Use action:'inspect' with jobId for full details, or action:'cancel' with jobId to abort " +
534
- "a running DriveAgent external CLI process and deliver a cancellation notification.",
535
- inputSchema: {
536
- type: "object",
537
- properties: {
538
- action: {
539
- type: "string",
540
- enum: ["list", "inspect", "cancel"],
541
- description: "What to do. Defaults to list.",
542
- },
543
- jobId: {
544
- type: "string",
545
- description: "DriveAgent jobId for inspect or cancel.",
546
- },
547
- cwd: {
548
- type: "string",
549
- description: "When listing, restrict to DriveAgent jobs in this cwd. This is cross-session so it can catch same-directory write conflicts before dispatch.",
550
- },
551
- status: {
552
- type: "string",
553
- enum: ["running", "all"],
554
- description: "When listing: running (default) or all retained DriveAgent jobs.",
555
- },
556
- all: {
557
- type: "boolean",
558
- description: "When listing without cwd: true lists DriveAgent jobs from every session; default lists only this session when session context exists.",
559
- },
560
- },
561
- },
562
- };
563
- function jobIdArg(args) {
564
- const camel = typeof args.jobId === "string" ? args.jobId.trim() : "";
565
- if (camel)
566
- return camel;
567
- const snake = typeof args.job_id === "string" ? args.job_id.trim() : "";
568
- return snake || undefined;
569
- }
570
- function listDriveAgentJobs(args, ctx) {
571
- const rawCwd = typeof args.cwd === "string" && args.cwd.trim() ? args.cwd : undefined;
572
- const cwd = rawCwd ? normalizeCwdPath(rawCwd) : undefined;
573
- const sessionId = ctx?.sessionId;
574
- const listAllSessions = args.all === true || !!cwd || !sessionId;
575
- const status = args.status === "all" ? "all" : "running";
576
- let jobs = listAllSessions || !sessionId
577
- ? backgroundJobRegistry.list()
578
- : backgroundJobRegistry.listForSession(sessionId);
579
- jobs = jobs.filter(isDriveAgentJob);
580
- if (cwd)
581
- jobs = jobs.filter((job) => job.cwd === cwd);
582
- if (status === "running") {
583
- jobs = jobs.filter((job) => job.status === "running" || job.status === "cancelling");
584
- }
585
- if (jobs.length === 0) {
586
- if (cwd)
587
- return `No ${status} DriveAgent jobs in cwd ${cwd}.`;
588
- if (listAllSessions)
589
- return `No ${status} DriveAgent jobs in this process.`;
590
- return `No ${status} DriveAgent jobs in this session.`;
591
- }
592
- return jobs.map(formatDriveJobListLine).join("\n");
593
- }
594
- function inspectDriveAgentJob(jobId) {
595
- if (!jobId)
596
- return "Error: jobId is required.";
597
- const job = backgroundJobRegistry.get(jobId);
598
- if (!job || !isDriveAgentJob(job))
599
- return `Error: DriveAgent jobId "${jobId}" not found.`;
600
- const lines = [
601
- `jobId: ${job.jobId}`,
602
- `status: ${job.status}`,
603
- `cli: ${job.cli ?? "unknown"}`,
604
- `session: ${job.sessionId}`,
605
- `cwd: ${job.cwd ?? "(unknown cwd)"}`,
606
- `startedAt: ${new Date(job.startedAt).toISOString()}`,
607
- `duration: ${jobDurationSeconds(job)}`,
608
- `prompt: ${job.promptSummary || job.description || "(no prompt summary)"}`,
609
- `description: ${job.description}`,
610
- ];
611
- if (job.finishedAt !== undefined)
612
- lines.push(`finishedAt: ${new Date(job.finishedAt).toISOString()}`);
613
- if (job.ccSessionId)
614
- lines.push(`ccSessionId: ${job.ccSessionId}`);
615
- if (job.changedFiles && job.changedFiles.length > 0) {
616
- lines.push("changedFiles:", ...job.changedFiles.map((file) => `- ${file}`));
617
- }
618
- else {
619
- lines.push("changedFiles: unknown");
620
- }
621
- if (job.finalText)
622
- lines.push("finalText:", job.finalText);
623
- return lines.join("\n");
624
- }
625
- async function cancelDriveAgentJob(jobId) {
626
- if (!jobId)
627
- return "Error: jobId is required.";
628
- const job = backgroundJobRegistry.get(jobId);
629
- if (!job || !isDriveAgentJob(job))
630
- return `Error: DriveAgent jobId "${jobId}" not found.`;
631
- if (job.status !== "running") {
632
- return `DriveAgent job ${jobId} is already ${job.status}; nothing to cancel.`;
633
- }
634
- if (!job.abort) {
635
- return `Error: DriveAgent job ${jobId} has no cancellation handle recorded.`;
636
- }
637
- const finalText = `DriveAgent job ${jobId} cancelled by DriveAgentJobs.`;
638
- const ok = await backgroundJobRegistry.cancel(jobId, { finalText });
639
- if (!ok)
640
- return `Failed to cancel DriveAgent job ${jobId}.`;
641
- notificationQueue.enqueue({
642
- agentId: jobId,
643
- description: job.description,
644
- status: "cancelled",
645
- workKind: "cc",
646
- error: finalText,
647
- ccSessionId: job.ccSessionId,
648
- ...(job.changedFiles?.length ? { changedFiles: job.changedFiles, cwd: job.cwd } : {}),
649
- ...(job.originClientMessageId ? { originClientMessageId: job.originClientMessageId } : {}),
650
- enqueuedAt: Date.now(),
651
- }, job.sessionId);
652
- return `DriveAgent job ${jobId} cancelled.`;
653
- }
654
- export async function driveAgentJobsTool(args, ctx) {
655
- const action = args.action === "inspect" || args.action === "cancel" || args.action === "list"
656
- ? args.action
657
- : "list";
658
- if (action === "inspect")
659
- return inspectDriveAgentJob(jobIdArg(args));
660
- if (action === "cancel")
661
- return await cancelDriveAgentJob(jobIdArg(args));
662
- return listDriveAgentJobs(args, ctx);
663
- }
664
- // ── Back-compat: DriveClaudeCode = DriveAgent pinned to cli:"claude" ──────────
665
- // Kept so old prompts / memories / call sites that reference DriveClaudeCode
666
- // keep working. It's a thin alias over the same machinery (fixedCli "claude").
667
- export const driveClaudeCodeToolDef = {
668
- ...driveAgentToolDef,
669
- name: "DriveClaudeCode",
670
- description: "(Alias of DriveAgent with cli:claude.) Delegate a task to the external Claude Code CLI " +
671
- "(drives `claude` for one turn). Prefer DriveAgent for new calls; this name is kept for " +
672
- "compatibility. " +
673
- driveAgentToolDef.description,
674
- inputSchema: {
675
- type: "object",
676
- properties: {
677
- // intentionally omit `cli` — this alias is always claude
678
- prompt: driveAgentToolDef.inputSchema.properties.prompt,
679
- resumeSessionId: {
680
- type: "string",
681
- description: "Existing CC session id to resume (keeps context). Omit for a fresh session.",
682
- },
683
- model: driveAgentToolDef.inputSchema.properties.model,
684
- cwd: driveAgentToolDef.inputSchema.properties.cwd,
685
- attachmentPaths: driveAgentToolDef.inputSchema.properties.attachmentPaths,
686
- permissionMode: driveAgentToolDef.inputSchema.properties.permissionMode,
687
- background: driveAgentToolDef.inputSchema.properties.background,
688
- },
689
- required: ["prompt", "cwd"],
690
- },
691
- };
692
- export function makeDriveClaudeCodeTool(runner, options) {
693
- const generic = runner
694
- ? ({ prompt, resumeSessionId, model, cwd, permissionMode, signal }) => runner({ prompt, resumeSessionId, model, cwd, permissionMode, signal })
695
- : undefined;
696
- return makeDriveAgentTool(generic ?? defaultRunner, "claude", options);
697
- }
698
- export const driveClaudeCodeTool = makeDriveClaudeCodeTool();