@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
@@ -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;