@cjhyy/code-shell-core 0.7.1 → 0.8.1

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 (595) 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/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,58 @@
1
+ import { type SessionBundle, type SessionStateFieldPatch } from "../session/session-manager.js";
2
+ import { type CumulativeUsageCounters } from "../session/usage.js";
3
+ import type { GoalTerminationReason } from "../goal/lifecycle.js";
4
+ import type { Message, TokenUsage } from "../types.js";
5
+ import type { LLMUsageTracker } from "../llm/types.js";
6
+ import type { LLMClientBase } from "../llm/client-base.js";
7
+ import type { HookEventName, HookResult } from "../hooks/events.js";
8
+ import type { TurnLoop } from "./turn-loop.js";
9
+ import type { EngineResult } from "./types.js";
10
+ import type { EngineRunOptions, RunBehaviorProfile } from "./run-types.js";
11
+ type TurnLoopRunResult = Awaited<ReturnType<TurnLoop["run"]>>;
12
+ /** engine.ts:headless 一次性 run 的后台子代理排水循环。 */
13
+ export declare function drainHeadlessBackgroundAgents(args: {
14
+ sid: string;
15
+ session: SessionBundle;
16
+ signal: AbortSignal | undefined;
17
+ initialResult: TurnLoopRunResult;
18
+ runTurnLoop: (messages: Message[]) => Promise<TurnLoopRunResult>;
19
+ applyGoalTermination: (termination: GoalTerminationReason | undefined, round: number | undefined) => void;
20
+ waitForBackgroundAgentChange: (sid: string, signal?: AbortSignal) => Promise<boolean>;
21
+ waitForBackgroundAgentChangeOrTimeout: (sid: string, ms: number) => Promise<boolean>;
22
+ getFirstGoalTermination: () => GoalTerminationReason | undefined;
23
+ setFirstGoalTermination: (t: GoalTerminationReason | undefined) => void;
24
+ }): Promise<TurnLoopRunResult>;
25
+ /** engine.ts:成功路径收尾(缓存/日志/钩子/记忆/标题/终态/结果)。 */
26
+ export declare function finalizeRunSuccess(args: {
27
+ session: SessionBundle;
28
+ result: TurnLoopRunResult;
29
+ firstGoalTermination: GoalTerminationReason | undefined;
30
+ turnCount: number;
31
+ getRunUsage: () => LLMUsageTracker;
32
+ usageBaseline: TokenUsage;
33
+ userContextMsg: Message | null;
34
+ dynamicContextMsg: Message | null;
35
+ setCompactedMessages: (sid: string, messages: Message[]) => void;
36
+ setLastMessages: (messages: Message[]) => void;
37
+ options: EngineRunOptions | undefined;
38
+ emitHook: (event: HookEventName, payload: Record<string, unknown>, signal?: AbortSignal) => Promise<HookResult>;
39
+ cwd: string;
40
+ llmClient: LLMClientBase;
41
+ auxSummaryClient: LLMClientBase;
42
+ recordExternalBilledUsage: (usage: TokenUsage) => CumulativeUsageCounters;
43
+ runMemoryPipeline: (transcript: SessionBundle["transcript"], sessionId: string, cwd: string, llmClient: LLMClientBase, recordExternalBilledUsage: (usage: TokenUsage) => CumulativeUsageCounters) => Promise<void> | void;
44
+ updatePersistedSessionState: (sid: string, patch: SessionStateFieldPatch) => void;
45
+ persistFinalRunState: (state: SessionBundle["state"]) => void;
46
+ markRunAccountingFinalized: () => void;
47
+ costStoreSerialize: (() => Record<string, unknown>) | undefined;
48
+ profile: RunBehaviorProfile | undefined;
49
+ getProfileReportedResults: () => Record<string, unknown> | undefined;
50
+ }): Promise<EngineResult>;
51
+ /** engine.ts catch 体:初始化失败 → model_error 终态 + 错误结果。 */
52
+ export declare function buildRunFailureResult(args: {
53
+ err: unknown;
54
+ session: SessionBundle;
55
+ options: EngineRunOptions | undefined;
56
+ persistFinalRunState: (state: SessionBundle["state"]) => void;
57
+ }): EngineResult;
58
+ export {};
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Run finalize — the headless background-agent drain loop, the success-path
3
+ * epilogue (persistence, hooks, memory pipeline trigger, session title,
4
+ * result assembly) and the initialization-failure terminal result.
5
+ */
6
+ import { asyncAgentRegistry } from "../tool-system/builtin/agent-registry.js";
7
+ import { buildNotificationMessage, notificationQueue, } from "../tool-system/builtin/agent-notifications.js";
8
+ import { logger } from "../logging/logger.js";
9
+ import { recordSessionEnd } from "../logging/session-recorder.js";
10
+ import { isEphemeralSessionState, } from "../session/session-manager.js";
11
+ import { foldRunUsage } from "../session/usage.js";
12
+ import { buildSessionTitle } from "./session-title.js";
13
+ import { formatFriendlyError } from "./friendly-error.js";
14
+ import { stripInjectedContextMessages } from "./injected-context-cache.js";
15
+ /** engine.ts:headless 一次性 run 的后台子代理排水循环。 */
16
+ export async function drainHeadlessBackgroundAgents(args) {
17
+ const { sid, session } = args;
18
+ let result = args.initialResult;
19
+ let aborted = args.signal?.aborted === true;
20
+ // Loop: a summarize turn can spawn a NEW background sub-agent; keep
21
+ // draining + summarizing until none remain. turnCount accumulates, so
22
+ // the turn-loop's maxTurns still bounds runaway re-summarization.
23
+ for (;;) {
24
+ while (!aborted && asyncAgentRegistry.hasRunningForSession(sid)) {
25
+ aborted = await args.waitForBackgroundAgentChange(sid, args.signal);
26
+ }
27
+ let pending = notificationQueue.drainAll(sid);
28
+ if (aborted && pending.length === 0) {
29
+ // Abort race: an agent calls markCompleted (registry notify) and only
30
+ // THEN enqueue (queue notify) as two separate statements. If the abort
31
+ // fired before that agent's completion `.then` ran, the while above
32
+ // exited on `aborted`, this drainAll caught nothing, and a naive
33
+ // `break` here would drop the agent's output. Give still-settling
34
+ // agents a bounded window to finish enqueuing, then drain once more.
35
+ // Each wait is timeout-bounded so a genuinely stuck (never-completing)
36
+ // agent can't hang abort cleanup forever — we'd rather lose nothing in
37
+ // the common case and not hang in the pathological one.
38
+ for (let i = 0; i < 20 && asyncAgentRegistry.hasRunningForSession(sid); i++) {
39
+ const changed = await args.waitForBackgroundAgentChangeOrTimeout(sid, 25);
40
+ if (!changed)
41
+ break; // timed out with no state change → stop waiting
42
+ }
43
+ pending = notificationQueue.drainAll(sid);
44
+ if (pending.length === 0)
45
+ break;
46
+ }
47
+ else if (pending.length === 0) {
48
+ break;
49
+ }
50
+ const injected = {
51
+ role: "user",
52
+ content: `<system-reminder>\n${buildNotificationMessage(pending)}\n</system-reminder>`,
53
+ };
54
+ if (aborted || args.getFirstGoalTermination()) {
55
+ // Mark injected: a synthetic notification, not the user's own input —
56
+ // the disk reader drops it on replay so no phantom user bubble.
57
+ // A goal termination is also a hard boundary: retain the notification
58
+ // for recovery, but never re-enter TurnLoop (which would reset its
59
+ // run-scoped goal budget tracker and could overwrite the first reason).
60
+ session.transcript.appendMessage(injected.role, injected.content, { injected: true });
61
+ result = { ...result, messages: [...result.messages, injected] };
62
+ break;
63
+ }
64
+ result = await args.runTurnLoop([...result.messages, injected]);
65
+ args.setFirstGoalTermination(args.getFirstGoalTermination() ?? result.goalTermination);
66
+ args.applyGoalTermination(result.goalTermination, result.goalTerminationRound);
67
+ }
68
+ return result;
69
+ }
70
+ /** engine.ts:成功路径收尾(缓存/日志/钩子/记忆/标题/终态/结果)。 */
71
+ export async function finalizeRunSuccess(args) {
72
+ const { session, result, firstGoalTermination, turnCount, getRunUsage, usageBaseline, userContextMsg, dynamicContextMsg, options, cwd, llmClient, auxSummaryClient, recordExternalBilledUsage, profile, } = args;
73
+ args.setLastMessages(result.messages);
74
+ const cachedMessages = stripInjectedContextMessages(result.messages, userContextMsg, dynamicContextMsg);
75
+ args.setCompactedMessages(session.state.sessionId, cachedMessages);
76
+ logger.info("engine.done", {
77
+ sessionId: session.state.sessionId,
78
+ reason: result.reason,
79
+ turns: turnCount,
80
+ tokens: getRunUsage().totalTokens,
81
+ });
82
+ recordSessionEnd(session.state.sessionId, {
83
+ reason: result.reason,
84
+ turns: turnCount,
85
+ cost: getRunUsage(),
86
+ });
87
+ // Session-level hook: fired symmetrically with on_session_start once
88
+ // the turn loop has resolved (completion, error, or abort). Handlers
89
+ // are notify-only — any returned messages are dropped because the run
90
+ // is already over and there's no next turn to inject into.
91
+ await args.emitHook("on_session_end", {
92
+ sessionId: session.state.sessionId,
93
+ reason: result.reason,
94
+ turnCount,
95
+ }, options?.signal);
96
+ // Ephemeral side chats must never leak into durable memory, even after
97
+ // the user explicitly elevates tool permissions for a turn. Lifecycle
98
+ // isolation is independent of the run-scoped behavior/permission mode.
99
+ if (!isEphemeralSessionState(session.state)) {
100
+ // Fire-and-forget memory pipeline: extract durable memories from the
101
+ // transcript, save a session summary, and conditionally trigger
102
+ // auto-dream consolidation. Doesn't block the Engine result.
103
+ void args.runMemoryPipeline(session.transcript, session.state.sessionId, cwd, llmClient, recordExternalBilledUsage);
104
+ }
105
+ // Fire-and-forget session title generation — only after the FIRST turn.
106
+ // Reuses the already-resolved auxSummaryClient (aux model, cheap). Best-
107
+ // effort: failures never touch the run result. The renderer writes the
108
+ // title into the sidebar on receipt of the session_title stream event.
109
+ {
110
+ const messageEvents = session.transcript.getEvents("message");
111
+ const userMsgEvents = messageEvents.filter((e) => e.data.role === "user");
112
+ const userMsgCount = userMsgEvents.length;
113
+ const onStream = options?.onStream;
114
+ if (userMsgCount === 1 && onStream && result.text) {
115
+ const sessionId = session.state.sessionId;
116
+ const rawContent = userMsgEvents[0]?.data?.content;
117
+ const firstUserText = typeof rawContent === "string" ? rawContent : JSON.stringify(rawContent ?? "");
118
+ void buildSessionTitle(auxSummaryClient, firstUserText, result.text, recordExternalBilledUsage)
119
+ .then((title) => {
120
+ if (title) {
121
+ // Persist the title so it survives a localStorage wipe / disk
122
+ // rebuild — it used to live only in the renderer's localStorage
123
+ // index. Read the latest persisted state at callback time and
124
+ // merge only title; the completed run's session.state snapshot
125
+ // may already be stale after later serial session updates.
126
+ args.updatePersistedSessionState(sessionId, { title });
127
+ onStream({
128
+ type: "session_title",
129
+ sessionId,
130
+ title,
131
+ });
132
+ }
133
+ })
134
+ .catch(() => { });
135
+ }
136
+ }
137
+ // Update session state. Persist the raw terminal reason as the status so
138
+ // callers can distinguish user-cancelled (aborted_streaming) from real
139
+ // failures (model_error, prompt_too_long, ...) — previously every
140
+ // non-completed outcome collapsed to "errored", which threw away the
141
+ // distinction and misled anyone reading state.json.
142
+ const transcriptFlushFailed = session.transcript.flushFailed();
143
+ if (transcriptFlushFailed) {
144
+ const failure = session.transcript.getFlushFailure();
145
+ logger.error("engine.transcript_persistence_failed", {
146
+ sessionId: session.state.sessionId,
147
+ terminalReason: result.reason,
148
+ degraded: true,
149
+ ...failure,
150
+ });
151
+ }
152
+ options?.onAgentProgress?.({ type: "phase", phase: "finalizing" });
153
+ session.state.turnCount = turnCount;
154
+ session.state.status = result.reason;
155
+ if (result.reason === "completed" && result.completionKind) {
156
+ session.state.lastCompletionKind = result.completionKind;
157
+ }
158
+ else {
159
+ delete session.state.lastCompletionKind;
160
+ }
161
+ if (result.reason === "completed") {
162
+ session.state.completedSnapshotVersion = 1;
163
+ if (!transcriptFlushFailed) {
164
+ session.state.completedThroughEventId = session.transcript.getEvents().at(-1)?.id;
165
+ }
166
+ }
167
+ // Session-cumulative (baseline + this run) for persistence...
168
+ const usage = getRunUsage();
169
+ session.state.tokenUsage = foldRunUsage(usageBaseline, usage);
170
+ if (args.costStoreSerialize) {
171
+ session.state.costState = args.costStoreSerialize();
172
+ }
173
+ args.persistFinalRunState(session.state);
174
+ args.markRunAccountingFinalized();
175
+ // Hook: agent end
176
+ await args.emitHook("on_agent_end", {
177
+ sessionId: session.state.sessionId,
178
+ reason: result.reason,
179
+ turnCount,
180
+ }, options?.signal);
181
+ // Emit completion
182
+ options?.onStream?.({
183
+ type: "turn_complete",
184
+ reason: result.reason,
185
+ ...(result.completionKind ? { completionKind: result.completionKind } : {}),
186
+ });
187
+ // Structured results the active profile's run services reported, keyed
188
+ // by profile id. petWorkDelegation stays as a compat mirror of
189
+ // extensions.pet?.workDelegation until pet-aware hosts migrate.
190
+ const profileReportedResults = args.getProfileReportedResults();
191
+ const runExtensions = profile && profileReportedResults ? { [profile.id]: profileReportedResults } : undefined;
192
+ const petWorkDelegationMirror = runExtensions?.pet?.workDelegation;
193
+ return {
194
+ text: result.text,
195
+ reason: result.reason,
196
+ goalTermination: firstGoalTermination,
197
+ sessionId: session.state.sessionId,
198
+ turnCount,
199
+ usage: {
200
+ promptTokens: usage.totalPromptTokens,
201
+ completionTokens: usage.totalCompletionTokens,
202
+ totalTokens: usage.totalTokens,
203
+ cacheReadTokens: usage.totalCacheReadTokens,
204
+ cacheCreationTokens: usage.totalCacheCreationTokens,
205
+ },
206
+ ...(runExtensions ? { extensions: runExtensions } : {}),
207
+ ...(petWorkDelegationMirror ? { petWorkDelegation: petWorkDelegationMirror } : {}),
208
+ };
209
+ }
210
+ /** engine.ts catch 体:初始化失败 → model_error 终态 + 错误结果。 */
211
+ export function buildRunFailureResult(args) {
212
+ const { err, session, options } = args;
213
+ // The session is already persisted as active before runWithSid starts.
214
+ // Initialization failures (client creation, MCP connection, prompt/hooks)
215
+ // therefore need the same terminal lifecycle treatment as turn-loop errors.
216
+ const error = formatFriendlyError(err);
217
+ session.state.status = "model_error";
218
+ delete session.state.lastCompletionKind;
219
+ args.persistFinalRunState(session.state);
220
+ session.transcript.appendError(error, { phase: "initialization" });
221
+ logger.error("engine.run_lifecycle_failed", {
222
+ sessionId: session.state.sessionId,
223
+ error: err instanceof Error ? err.message : String(err),
224
+ });
225
+ recordSessionEnd(session.state.sessionId, {
226
+ reason: "model_error",
227
+ turns: session.state.turnCount,
228
+ });
229
+ options?.onStream?.({ type: "error", error });
230
+ options?.onStream?.({ type: "turn_complete", reason: "model_error" });
231
+ const usage = session.state.tokenUsage;
232
+ return {
233
+ text: `ERROR: ${error}`,
234
+ reason: "model_error",
235
+ sessionId: session.state.sessionId,
236
+ turnCount: session.state.turnCount,
237
+ usage: {
238
+ promptTokens: usage.promptTokens ?? 0,
239
+ completionTokens: usage.completionTokens ?? 0,
240
+ totalTokens: usage.totalTokens ?? 0,
241
+ cacheReadTokens: usage.cacheReadTokens ?? 0,
242
+ cacheCreationTokens: usage.cacheCreationTokens ?? 0,
243
+ },
244
+ };
245
+ }
@@ -0,0 +1,58 @@
1
+ import type { StreamCallback, TokenUsage } from "../types.js";
2
+ import { type GoalConfig, type GoalTerminationReason, type PersistedGoalTerminationReason } from "../goal/lifecycle.js";
3
+ import { createGoalStopHook, type GoalJudgeRuntimeContext } from "../hooks/goal-stop-hook.js";
4
+ import type { HookRegistry } from "../hooks/registry.js";
5
+ import type { LLMClientBase } from "../llm/client-base.js";
6
+ import type { GoalTerminalSaveOutcome, SessionBundle, SessionManager } from "../session/session-manager.js";
7
+ import type { TurnLoop } from "./turn-loop.js";
8
+ import type { EngineConfig } from "./types.js";
9
+ import type { EngineRunOptions } from "./run-types.js";
10
+ export type GoalStopHookHandler = ReturnType<typeof createGoalStopHook>;
11
+ export interface GoalRunSlots {
12
+ getActiveRuntimeGoal(): GoalConfig | null;
13
+ setActiveRuntimeGoal(goal: GoalConfig | null): void;
14
+ getActivePersistedRunGoal(): GoalConfig | null;
15
+ setActivePersistedRunGoal(goal: GoalConfig | null): void;
16
+ getActiveGoalHook(): GoalStopHookHandler | null;
17
+ setActiveGoalHook(hook: GoalStopHookHandler | null): void;
18
+ setActiveGoalHookAttached(attached: boolean): void;
19
+ }
20
+ /** engine.ts:explicit/stored/fallback 归一化 + 持久化 + goal_set 事件。 */
21
+ export declare function resolveRunGoal(args: {
22
+ options: EngineRunOptions | undefined;
23
+ session: SessionBundle;
24
+ sessionManager: Pick<SessionManager, "saveActiveGoal">;
25
+ configGoal: EngineConfig["goal"];
26
+ isSubAgent: boolean;
27
+ sid: string;
28
+ onStream: StreamCallback | undefined;
29
+ }): {
30
+ normalizedGoal: GoalConfig | undefined;
31
+ persistedRunGoal: GoalConfig | undefined;
32
+ };
33
+ /** engine.ts:GoalStopHook 创建 + 注册 + 槽位登记。 */
34
+ export declare function armRunGoalHook(args: {
35
+ slots: GoalRunSlots;
36
+ hooks: HookRegistry;
37
+ llmClient: LLMClientBase;
38
+ isSubAgent: boolean;
39
+ normalizedGoal: GoalConfig | undefined;
40
+ persistedRunGoal: GoalConfig | undefined;
41
+ session: SessionBundle;
42
+ sessionManager: Pick<SessionManager, "markGoalWaiting" | "readActiveGoal">;
43
+ persistGoalTerminal: (state: SessionBundle["state"], goal: GoalConfig, reason: PersistedGoalTerminationReason) => boolean;
44
+ getJudgeContext: () => GoalJudgeRuntimeContext | undefined;
45
+ recordCumulativeUsage: (usage: TokenUsage) => unknown;
46
+ recordGoalJudgeUsage: (usage: TokenUsage | undefined) => ReturnType<TurnLoop["recordGoalJudgeUsage"]>;
47
+ }): GoalStopHookHandler | null;
48
+ /** engine.ts:goal 终态落盘 + 事件 + 钩子摘除(闭包工厂)。 */
49
+ export declare function createGoalTerminationApplier(args: {
50
+ slots: GoalRunSlots;
51
+ hooks: HookRegistry;
52
+ session: SessionBundle;
53
+ persistedRunGoal: GoalConfig | undefined;
54
+ goalHookHandler: GoalStopHookHandler | null;
55
+ persistGoalTerminalOutcome: (state: SessionBundle["state"], goal: GoalConfig, termination: PersistedGoalTerminationReason) => GoalTerminalSaveOutcome;
56
+ readActiveGoal: (sid: string) => GoalConfig | undefined | null;
57
+ onStream: StreamCallback | undefined;
58
+ }): (termination: GoalTerminationReason | undefined, round: number | undefined) => void;
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Run goal — persistent-goal resolution (explicit > stored > config default),
3
+ * arming the GoalStopHook for the run, and the terminal-outcome applier.
4
+ * Engine keeps ownership of its active-goal slots via GoalRunSlots.
5
+ */
6
+ import { randomUUID } from "node:crypto";
7
+ import { normalizeGoal, resolveGoalSetAt, goalConfigFromLifecycle, isGoalLifecycleCurrent, isSameGoalVersion, } from "../goal/lifecycle.js";
8
+ import { createGoalStopHook } from "../hooks/goal-stop-hook.js";
9
+ import { logger } from "../logging/logger.js";
10
+ /** engine.ts:explicit/stored/fallback 归一化 + 持久化 + goal_set 事件。 */
11
+ export function resolveRunGoal(args) {
12
+ const { options, session, sessionManager, configGoal, isSubAgent, sid, onStream } = args;
13
+ const explicitGoal = normalizeGoal(options?.goal);
14
+ const storedLifecycle = session.state.goalLifecycle;
15
+ const storedGoal = isSubAgent !== true && storedLifecycle && isGoalLifecycleCurrent(storedLifecycle)
16
+ ? goalConfigFromLifecycle(storedLifecycle)
17
+ : undefined;
18
+ if (storedGoal &&
19
+ !explicitGoal &&
20
+ session.state.goalLifecycle?.phase === "waiting" &&
21
+ !sessionManager.saveActiveGoal(session.state, storedGoal)) {
22
+ throw new Error(`Failed to arm waiting goal for session ${sid}`);
23
+ }
24
+ if (explicitGoal && isSubAgent !== true) {
25
+ // Supplying a goal on a run is an explicit arm/resume operation.
26
+ delete explicitGoal.paused;
27
+ const replaced = !!storedGoal && storedGoal.objective !== explicitGoal.objective;
28
+ // Stamp WHEN this goal was set so the judge can anchor relative deadlines
29
+ // ("做到3点") to the set time, not "now" — else once the clock passes the
30
+ // deadline the judge could read "3点" as tomorrow's and never stop. A new
31
+ // or changed objective gets a fresh stamp; re-sending the SAME objective
32
+ // keeps the original anchor (the goal continues, the user didn't restate a
33
+ // new deadline). User input never carries setAtMs, so we set it here.
34
+ const resolvedSetAt = resolveGoalSetAt(explicitGoal.objective, storedGoal, Date.now());
35
+ explicitGoal.setAtMs = resolvedSetAt;
36
+ explicitGoal.goalId = randomUUID();
37
+ explicitGoal.revision = 1;
38
+ if (!sessionManager.saveActiveGoal(session.state, explicitGoal, {
39
+ replaceCurrent: storedGoal !== undefined,
40
+ })) {
41
+ throw new Error(`Failed to persist active goal for session ${sid}`);
42
+ }
43
+ onStream?.({
44
+ type: "goal_set",
45
+ goalId: explicitGoal.goalId,
46
+ revision: explicitGoal.revision,
47
+ objective: explicitGoal.objective,
48
+ replaced,
49
+ });
50
+ }
51
+ const fallbackGoal = normalizeGoal(configGoal);
52
+ if (fallbackGoal && !fallbackGoal.goalId)
53
+ fallbackGoal.goalId = randomUUID();
54
+ if (fallbackGoal && !fallbackGoal.revision)
55
+ fallbackGoal.revision = 1;
56
+ const normalizedGoal = explicitGoal ??
57
+ (storedGoal?.paused === true ? undefined : storedGoal) ??
58
+ (fallbackGoal?.paused === true ? undefined : fallbackGoal);
59
+ // Snapshot the persisted goal identity owned by THIS run. Terminal
60
+ // cleanup compares against this immutable copy so an old run cannot
61
+ // delete a replacement goal installed while it was finishing.
62
+ const persistedRunGoal = normalizedGoal &&
63
+ session.state.goalLifecycle &&
64
+ isGoalLifecycleCurrent(session.state.goalLifecycle) &&
65
+ isSameGoalVersion(goalConfigFromLifecycle(session.state.goalLifecycle), normalizedGoal)
66
+ ? { ...normalizedGoal }
67
+ : undefined;
68
+ return { normalizedGoal, persistedRunGoal };
69
+ }
70
+ /** engine.ts:GoalStopHook 创建 + 注册 + 槽位登记。 */
71
+ export function armRunGoalHook(args) {
72
+ const { slots, hooks, llmClient, isSubAgent, normalizedGoal, persistedRunGoal, session, sessionManager, persistGoalTerminal, getJudgeContext, recordCumulativeUsage, recordGoalJudgeUsage, } = args;
73
+ let goalHookHandler = null;
74
+ if (isSubAgent !== true) {
75
+ // Keep a dormant hook even when this ordinary run inherited a paused
76
+ // persisted goal. A mid-run Resume can then arm Goal mode at the same
77
+ // safe step boundary as Steer instead of waiting for another submit.
78
+ slots.setActiveRuntimeGoal(normalizedGoal ?? null);
79
+ slots.setActivePersistedRunGoal(persistedRunGoal ?? null);
80
+ goalHookHandler = createGoalStopHook({
81
+ goal: normalizedGoal,
82
+ getGoal: () => slots.getActiveRuntimeGoal() ?? undefined,
83
+ llm: llmClient,
84
+ log: logger,
85
+ getJudgeContext: () => getJudgeContext(),
86
+ onJudgeUsage: (usage) => {
87
+ // The provider records this request into llmClient.getUsage() and the
88
+ // process-wide CostTracker. This separate callback feeds the session
89
+ // cumulative cache counters and the live Goal hard-budget tracker.
90
+ if (usage)
91
+ recordCumulativeUsage(usage);
92
+ // Charge the request even if an edit landed while the judge was
93
+ // awaiting its response. Revision fencing suppresses the old
94
+ // verdict, not the provider cost; otherwise repeated edits can
95
+ // bypass the Goal hard budget.
96
+ return recordGoalJudgeUsage(usage);
97
+ },
98
+ // Clear the persisted active goal the moment the judge says it's met,
99
+ // so a later bare send doesn't re-inherit a satisfied goal. The hook
100
+ // calls this from inside its met branch (single source of truth for
101
+ // "goal achieved"); engine owns the persistence side-effect.
102
+ onMet: () => {
103
+ const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
104
+ return runGoal ? persistGoalTerminal(session.state, runGoal, "completed") : true;
105
+ },
106
+ onWaiting: () => {
107
+ const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
108
+ return runGoal ? sessionManager.markGoalWaiting(session.state, runGoal) : true;
109
+ },
110
+ // Re-read the persisted goal each turn so a mid-run 清除 (clearGoal
111
+ // wrote state.json but this hook's frozen goal copy + the closure's
112
+ // in-RAM session are untouched) actually stops the judge. Reads disk
113
+ // via readActiveGoal — authoritative and independent of which session
114
+ // instance the run closure holds.
115
+ isGoalActive: (sid) => {
116
+ const runtimeGoal = slots.getActiveRuntimeGoal();
117
+ if (!runtimeGoal)
118
+ return false;
119
+ // A config-only Goal has no disk record to re-check.
120
+ if (!slots.getActivePersistedRunGoal())
121
+ return true;
122
+ const liveGoal = sessionManager.readActiveGoal(sid);
123
+ return liveGoal?.paused !== true && isSameGoalVersion(liveGoal, runtimeGoal);
124
+ },
125
+ });
126
+ if (normalizedGoal) {
127
+ hooks.register("on_stop", goalHookHandler, 0, "goal-stop");
128
+ slots.setActiveGoalHookAttached(true);
129
+ }
130
+ else {
131
+ slots.setActiveGoalHookAttached(false);
132
+ }
133
+ // Expose for edit/pause/resume/delete mid-run. Already guarded by
134
+ // isSubAgent above.
135
+ slots.setActiveGoalHook(goalHookHandler);
136
+ }
137
+ return goalHookHandler;
138
+ }
139
+ /** engine.ts:goal 终态落盘 + 事件 + 钩子摘除(闭包工厂)。 */
140
+ export function createGoalTerminationApplier(args) {
141
+ const { slots, hooks, session, persistedRunGoal, goalHookHandler, persistGoalTerminalOutcome, readActiveGoal, onStream, } = args;
142
+ return (termination, round) => {
143
+ const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
144
+ if (!termination || !runGoal)
145
+ return;
146
+ // Judge prompt overflow ends only this run. The objective is unfinished
147
+ // and may be resumed after the user reduces fixed judge context, so it
148
+ // must not get a terminal tombstone or be cleared from activeGoal.
149
+ if (termination === "judge_prompt_too_large")
150
+ return;
151
+ const outcome = persistGoalTerminalOutcome(session.state, runGoal, termination);
152
+ if (outcome === "failed") {
153
+ // No terminal event has been published. Re-assert the authoritative
154
+ // active Goal in case another optimistic control changed the client.
155
+ const authoritative = readActiveGoal(session.state.sessionId);
156
+ if (authoritative) {
157
+ onStream?.({
158
+ type: "goal_updated",
159
+ goalId: authoritative.goalId,
160
+ revision: authoritative.revision,
161
+ objective: authoritative.objective,
162
+ paused: authoritative.paused === true,
163
+ });
164
+ }
165
+ return;
166
+ }
167
+ if (outcome === "persisted") {
168
+ // The durable terminal transition is the publication barrier: clients
169
+ // must never observe an exhausted Goal that does not exist on disk.
170
+ onStream?.({
171
+ type: "goal_progress",
172
+ goalId: runGoal.goalId,
173
+ revision: runGoal.revision,
174
+ status: "exhausted",
175
+ round: round ?? 0,
176
+ });
177
+ }
178
+ if (goalHookHandler) {
179
+ hooks.unregister("on_stop", goalHookHandler);
180
+ if (slots.getActiveGoalHook() === goalHookHandler) {
181
+ slots.setActiveGoalHook(null);
182
+ slots.setActiveGoalHookAttached(false);
183
+ slots.setActiveRuntimeGoal(null);
184
+ slots.setActivePersistedRunGoal(null);
185
+ }
186
+ }
187
+ };
188
+ }
@@ -1,4 +1,4 @@
1
- import type { InputAttachmentMeta } from "../protocol/types.js";
1
+ import type { InputAttachmentMeta } from "../types.js";
2
2
  import type { ContentBlock, LLMConfig } from "../types.js";
3
3
  import { type ParsedTask } from "./parse-task.js";
4
4
  import type { EngineResult } from "./types.js";
@@ -76,9 +76,11 @@ export async function prepareRunImageInput(args) {
76
76
  parsedTask = {
77
77
  text: [parsedTask.text, attachmentContext.text].filter(Boolean).join("\n\n"),
78
78
  images: [...parsedTask.images, ...attachmentContext.images],
79
- hasImages: parsedTask.hasImages ||
80
- attachmentContext.images.length > 0 ||
81
- attachmentContext.hasStructuredImageAttachments,
79
+ // A structured image attachment can intentionally degrade to textual
80
+ // metadata when the selected model has no vision support. Only actual
81
+ // image bytes require the vision gate below; the on-disk path remains
82
+ // useful to file-oriented tools and delegated Work Sessions.
83
+ hasImages: parsedTask.hasImages || attachmentContext.images.length > 0,
82
84
  };
83
85
  }
84
86
  if (parsedTask.hasImages) {
@@ -0,0 +1,41 @@
1
+ import type { Message, SessionKind } from "../types.js";
2
+ import type { SessionBundle, SessionManager } from "../session/session-manager.js";
3
+ import type { ParsedTask } from "./parse-task.js";
4
+ import type { buildRunUserMessageContent } from "./run-image-input.js";
5
+ import type { EngineConfig, EngineResult } from "./types.js";
6
+ import type { EngineRunOptions } from "./run-types.js";
7
+ export interface OpenRunSessionArgs {
8
+ sessionManager: SessionManager;
9
+ options: EngineRunOptions | undefined;
10
+ parsedTask: ParsedTask;
11
+ taskText: string;
12
+ userMessageContent: ReturnType<typeof buildRunUserMessageContent>;
13
+ cwd: string;
14
+ sessionKind: SessionKind;
15
+ sessionWorkspaceProfile: string | undefined;
16
+ /** Standing brief resent by the host each turn until the Session persists it. */
17
+ sessionBrief?: string;
18
+ llmModel: string;
19
+ llmProvider: string;
20
+ isSubAgent: boolean;
21
+ origin: EngineConfig["origin"];
22
+ costStore: EngineConfig["costStore"];
23
+ cachedCompactedMessages: Message[] | undefined;
24
+ onAgentDirectionsDelivered: ((envelopeIds: NonNullable<EngineRunOptions["agentDirection"]>["envelopeIds"]) => void) | undefined;
25
+ }
26
+ export interface OpenedRunSession {
27
+ session: SessionBundle;
28
+ messages: Message[];
29
+ freshImageMessage: Message | undefined;
30
+ resumedFromDisk: boolean;
31
+ claimClientMessageId: (bundle: SessionBundle, clientMessageId: string | undefined, source: "submit" | "steer") => boolean;
32
+ releaseClientMessageId: (clientMessageId: string) => void;
33
+ }
34
+ export type OpenRunSessionResult = {
35
+ ok: true;
36
+ opened: OpenedRunSession;
37
+ } | {
38
+ ok: false;
39
+ result: EngineResult;
40
+ };
41
+ export declare function openRunSession(args: OpenRunSessionArgs): OpenRunSessionResult;