@cjhyy/code-shell-core 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,482 @@
1
+ /**
2
+ * Goal mode P0 — run-scoped budget guardrails.
3
+ *
4
+ * `GoalConfig` is the normalized internal shape. Public entry points
5
+ * (protocol/server, engine run) accept `string | GoalConfig` for
6
+ * back-compat and call `normalizeGoal()` once at the boundary; everything
7
+ * inward uses `GoalConfig`.
8
+ *
9
+ * The budget tracker is RUN-scoped (not per-turn like token-budget.ts):
10
+ * it accumulates total tokens across turns and stamps a wall-clock start,
11
+ * so an unattended goal run can't burn tokens or wall time without bound.
12
+ */
13
+ import { createHash, randomUUID } from "node:crypto";
14
+ function goalLifecycleConfig(goal) {
15
+ const { goalId: _goalId, revision: _revision, paused: _paused, ...config } = goal;
16
+ return config;
17
+ }
18
+ /** Build one canonical lifecycle record from the compatibility GoalConfig view. */
19
+ export function createGoalLifecycle(goal, phase = goal.paused === true
20
+ ? "paused"
21
+ : "active", nowMs = Date.now()) {
22
+ const base = {
23
+ version: 1,
24
+ goalId: goal.goalId ?? randomUUID(),
25
+ revision: Math.max(1, Math.floor(goal.revision ?? 1)),
26
+ config: goalLifecycleConfig(goal),
27
+ updatedAtMs: nowMs,
28
+ };
29
+ return { ...base, phase };
30
+ }
31
+ /** Compatibility view consumed by Engine/protocol while persistence uses the union. */
32
+ export function goalConfigFromLifecycle(lifecycle) {
33
+ return {
34
+ ...lifecycle.config,
35
+ goalId: lifecycle.goalId,
36
+ revision: lifecycle.revision,
37
+ ...(lifecycle.phase === "paused" ? { paused: true } : {}),
38
+ };
39
+ }
40
+ export function isGoalLifecycleArmable(lifecycle) {
41
+ return lifecycle.phase === "active" || lifecycle.phase === "waiting";
42
+ }
43
+ export function isGoalLifecycleCurrent(lifecycle) {
44
+ return lifecycle.phase !== "terminal";
45
+ }
46
+ /** Strict persisted decoder. Unknown versions and partial unions fail closed. */
47
+ export function decodeGoalLifecycle(value) {
48
+ if (!value || typeof value !== "object" || Array.isArray(value))
49
+ return undefined;
50
+ const candidate = value;
51
+ if (candidate.version !== 1)
52
+ return undefined;
53
+ if (typeof candidate.goalId !== "string" || candidate.goalId.length === 0)
54
+ return undefined;
55
+ if (typeof candidate.revision !== "number" ||
56
+ !Number.isInteger(candidate.revision) ||
57
+ candidate.revision < 1) {
58
+ return undefined;
59
+ }
60
+ if (typeof candidate.updatedAtMs !== "number" ||
61
+ !Number.isFinite(candidate.updatedAtMs) ||
62
+ candidate.updatedAtMs < 0) {
63
+ return undefined;
64
+ }
65
+ if (!candidate.config ||
66
+ typeof candidate.config !== "object" ||
67
+ Array.isArray(candidate.config)) {
68
+ return undefined;
69
+ }
70
+ const config = candidate.config;
71
+ // Identity and mutable lifecycle state have one canonical owner. Reject
72
+ // persisted payloads that duplicate them inside config instead of silently
73
+ // accepting two potentially conflicting truths.
74
+ for (const lifecycleKey of ["goalId", "revision", "paused"]) {
75
+ if (Object.prototype.hasOwnProperty.call(config, lifecycleKey))
76
+ return undefined;
77
+ }
78
+ if (typeof config.objective !== "string" || config.objective.trim().length === 0)
79
+ return undefined;
80
+ for (const key of ["tokenBudget", "timeBudgetMs", "maxTurns", "maxStopBlocks"]) {
81
+ const field = config[key];
82
+ if (field !== undefined &&
83
+ (typeof field !== "number" || !Number.isFinite(field) || field <= 0)) {
84
+ return undefined;
85
+ }
86
+ }
87
+ for (const key of ["maxTurns", "maxStopBlocks"]) {
88
+ const field = config[key];
89
+ if (field !== undefined && !Number.isInteger(field))
90
+ return undefined;
91
+ }
92
+ if (config.setAtMs !== undefined &&
93
+ (typeof config.setAtMs !== "number" || !Number.isFinite(config.setAtMs) || config.setAtMs < 0)) {
94
+ return undefined;
95
+ }
96
+ const phase = candidate.phase;
97
+ const base = {
98
+ version: 1,
99
+ goalId: candidate.goalId,
100
+ revision: candidate.revision,
101
+ config: { ...config, objective: config.objective.trim() },
102
+ updatedAtMs: candidate.updatedAtMs,
103
+ };
104
+ const hasWaitingFields = Object.prototype.hasOwnProperty.call(candidate, "waitingFor") ||
105
+ Object.prototype.hasOwnProperty.call(candidate, "waitingSinceMs");
106
+ const hasTerminalField = Object.prototype.hasOwnProperty.call(candidate, "terminal");
107
+ if (phase === "active" || phase === "paused") {
108
+ if (hasWaitingFields || hasTerminalField)
109
+ return undefined;
110
+ return { ...base, phase };
111
+ }
112
+ if (phase === "waiting") {
113
+ if (hasTerminalField)
114
+ return undefined;
115
+ if (candidate.waitingFor !== "finite_background_work" ||
116
+ typeof candidate.waitingSinceMs !== "number" ||
117
+ !Number.isFinite(candidate.waitingSinceMs) ||
118
+ candidate.waitingSinceMs < 0) {
119
+ return undefined;
120
+ }
121
+ return {
122
+ ...base,
123
+ phase,
124
+ waitingFor: "finite_background_work",
125
+ waitingSinceMs: candidate.waitingSinceMs,
126
+ };
127
+ }
128
+ if (phase === "terminal") {
129
+ if (hasWaitingFields)
130
+ return undefined;
131
+ if (!candidate.terminal || typeof candidate.terminal !== "object")
132
+ return undefined;
133
+ const terminal = candidate.terminal;
134
+ if (Object.keys(terminal).some((key) => key !== "reason" && key !== "atMs"))
135
+ return undefined;
136
+ const reasons = new Set([
137
+ "completed",
138
+ "cancelled",
139
+ "user_cleared",
140
+ "stop_blocks_exhausted",
141
+ "token_budget_exhausted",
142
+ "time_budget_exhausted",
143
+ "max_turns_exhausted",
144
+ ]);
145
+ if (!reasons.has(terminal.reason) ||
146
+ typeof terminal.atMs !== "number" ||
147
+ !Number.isFinite(terminal.atMs) ||
148
+ terminal.atMs < 0) {
149
+ return undefined;
150
+ }
151
+ return {
152
+ ...base,
153
+ phase,
154
+ terminal: { reason: terminal.reason, atMs: terminal.atMs },
155
+ };
156
+ }
157
+ return undefined;
158
+ }
159
+ export function waitGoalLifecycle(lifecycle, nowMs = Date.now()) {
160
+ if (lifecycle.phase !== "active")
161
+ return undefined;
162
+ return {
163
+ ...lifecycle,
164
+ phase: "waiting",
165
+ updatedAtMs: nowMs,
166
+ waitingSinceMs: nowMs,
167
+ waitingFor: "finite_background_work",
168
+ };
169
+ }
170
+ export function armGoalLifecycle(lifecycle, nowMs = Date.now()) {
171
+ if (lifecycle.phase === "active")
172
+ return lifecycle;
173
+ if (lifecycle.phase !== "waiting")
174
+ return undefined;
175
+ const { waitingSinceMs: _waitingSinceMs, waitingFor: _waitingFor, ...base } = lifecycle;
176
+ return { ...base, phase: "active", updatedAtMs: nowMs };
177
+ }
178
+ export function terminateGoalLifecycle(lifecycle, reason, nowMs = Date.now()) {
179
+ if (lifecycle.phase === "terminal")
180
+ return lifecycle;
181
+ return {
182
+ version: 1,
183
+ goalId: lifecycle.goalId,
184
+ revision: lifecycle.revision,
185
+ config: lifecycle.config,
186
+ phase: "terminal",
187
+ updatedAtMs: nowMs,
188
+ terminal: { reason, atMs: nowMs },
189
+ };
190
+ }
191
+ /** True only when both values identify the same concrete goal instance. */
192
+ export function isSameGoalInstance(left, right) {
193
+ if (!left || !right)
194
+ return false;
195
+ if (left.goalId !== undefined || right.goalId !== undefined) {
196
+ return !!left.goalId && left.goalId === right.goalId;
197
+ }
198
+ return left.objective === right.objective && left.setAtMs === right.setAtMs;
199
+ }
200
+ /** Same concrete goal and same edit/pause/resume revision. */
201
+ export function isSameGoalVersion(left, right) {
202
+ return (isSameGoalInstance(left, right) &&
203
+ Math.max(1, Math.floor(left?.revision ?? 1)) === Math.max(1, Math.floor(right?.revision ?? 1)));
204
+ }
205
+ /** Bound stale-writer protection while retaining enough recent terminal identities. */
206
+ export const MAX_GOAL_TERMINALS = 64;
207
+ /**
208
+ * Deterministic identity for a pre-goalId persisted goal. Two detached
209
+ * snapshots of the same session/legacy signature must migrate to the same id.
210
+ */
211
+ export function deriveLegacyGoalId(sessionId, goal) {
212
+ const signature = JSON.stringify([
213
+ sessionId,
214
+ goal.objective.trim(),
215
+ goal.setAtMs ?? null,
216
+ goal.tokenBudget ?? null,
217
+ goal.timeBudgetMs ?? null,
218
+ goal.maxTurns ?? null,
219
+ goal.maxStopBlocks ?? null,
220
+ ]);
221
+ return `legacy-${createHash("sha256").update(signature).digest("hex")}`;
222
+ }
223
+ /** Merge terminal identities oldest→newest, dedupe by instance, and cap growth. */
224
+ export function mergeGoalTerminals(...sources) {
225
+ const merged = new Map();
226
+ let order = 0;
227
+ for (const source of sources) {
228
+ const terminals = Array.isArray(source) ? source : source ? [source] : [];
229
+ for (const terminal of terminals) {
230
+ if (!terminal || typeof terminal.objective !== "string")
231
+ continue;
232
+ const key = terminal.goalId
233
+ ? `id:${terminal.goalId}:rev:${terminal.revision ?? 1}`
234
+ : `legacy:${terminal.objective}\0${terminal.setAtMs ?? ""}`;
235
+ const existing = merged.get(key);
236
+ const incomingAt = terminal.terminatedAtMs ?? Number.NEGATIVE_INFINITY;
237
+ const existingAt = existing?.terminal.terminatedAtMs ?? Number.NEGATIVE_INFINITY;
238
+ if (!existing || incomingAt >= existingAt) {
239
+ merged.set(key, { terminal, order: existing?.order ?? order });
240
+ }
241
+ order++;
242
+ }
243
+ }
244
+ return [...merged.values()]
245
+ .sort((left, right) => {
246
+ const leftAt = left.terminal.terminatedAtMs ?? Number.NEGATIVE_INFINITY;
247
+ const rightAt = right.terminal.terminatedAtMs ?? Number.NEGATIVE_INFINITY;
248
+ return leftAt - rightAt || left.order - right.order;
249
+ })
250
+ .slice(-MAX_GOAL_TERMINALS)
251
+ .map(({ terminal }) => terminal);
252
+ }
253
+ /** Whether this concrete goal is present in the bounded terminal identity set. */
254
+ export function isGoalTerminated(goal, terminals, latest) {
255
+ if (!goal)
256
+ return false;
257
+ return mergeGoalTerminals(terminals, latest).some((terminal) => {
258
+ if (goal.goalId) {
259
+ return terminal.goalId === goal.goalId && (terminal.revision ?? 1) === (goal.revision ?? 1);
260
+ }
261
+ // A legacy detached snapshot has no goalId. Compare its historical
262
+ // objective+setAt signature even when the terminal was recorded after the
263
+ // live instance was migrated to a UUID. Newly armed goals always have an
264
+ // id, so this fallback cannot suppress a genuine new instance.
265
+ return goal.objective === terminal.objective && goal.setAtMs === terminal.setAtMs;
266
+ });
267
+ }
268
+ /** Record one terminal identity on a state-like holder without losing prior identities. */
269
+ export function recordGoalTerminal(state, goal, reason, terminatedAtMs = Date.now()) {
270
+ const goalId = goal.goalId ?? randomUUID();
271
+ goal.goalId = goalId;
272
+ const revision = goal.revision ?? 1;
273
+ goal.revision = revision;
274
+ const terminal = {
275
+ goalId,
276
+ revision,
277
+ objective: goal.objective,
278
+ setAtMs: goal.setAtMs,
279
+ reason,
280
+ terminatedAtMs,
281
+ };
282
+ state.goalTerminals = mergeGoalTerminals(state.goalTerminals, state.goalTerminal, terminal);
283
+ state.goalTerminal = terminal;
284
+ return terminal;
285
+ }
286
+ /**
287
+ * Default consecutive-stop-block cap for goal runs. The real safety net for an
288
+ * unattended goal is the token/time budget + maxTurns; this cap only stops a
289
+ * goal that the judge keeps re-blocking with NO progress between blocks. 8 was
290
+ * too tight — a complex goal can legitimately get "not yet" several times while
291
+ * advancing — so we allow a generous streak before declaring it stuck.
292
+ */
293
+ export const GOAL_DEFAULT_MAX_STOP_BLOCKS = 25;
294
+ /**
295
+ * Consecutive-stop-block cap for NON-goal (interactive) runs. The 25-block goal
296
+ * default is far too loose for a plain interactive session: a plugin `on_stop`
297
+ * hook that keeps returning continueSession would loop 25× before the backstop
298
+ * bites (~3× the model calls). Non-goal runs fall back to this tighter cap —
299
+ * the historical value before the goal feature raised the goal-mode default.
300
+ */
301
+ export const INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS = 8;
302
+ /**
303
+ * Resolve the consecutive-stop-block cap for a run. Precedence:
304
+ * 1. explicit `configMaxStopBlocks` (engine/caller override)
305
+ * 2. `goal.maxStopBlocks`
306
+ * 3. GOAL_DEFAULT_MAX_STOP_BLOCKS when a goal is active,
307
+ * INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS otherwise (don't leak the loose goal
308
+ * cap onto plain interactive runs — see B3 in the redesign doc).
309
+ * Pure + injectable so engine and tests agree.
310
+ */
311
+ export function resolveMaxStopBlocks(configMaxStopBlocks, goal) {
312
+ if (typeof configMaxStopBlocks === "number" && configMaxStopBlocks > 0) {
313
+ return Math.floor(configMaxStopBlocks);
314
+ }
315
+ if (goal?.maxStopBlocks && goal.maxStopBlocks > 0)
316
+ return goal.maxStopBlocks;
317
+ return goal ? GOAL_DEFAULT_MAX_STOP_BLOCKS : INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS;
318
+ }
319
+ /**
320
+ * Turn ceiling applied when a goal is active and neither the GoalConfig nor
321
+ * the engine config set an explicit maxTurns. Higher than the interactive
322
+ * default (100) because goal runs are unattended and the stop-hook keeps the
323
+ * loop going until the objective is met — the real safety backstops are the
324
+ * token/time budgets and maxStopBlocks, not this ceiling. A round 300 gives
325
+ * long goals room while still bounding a pathological loop.
326
+ */
327
+ export const GOAL_DEFAULT_MAX_TURNS = 300;
328
+ /**
329
+ * Coerce a raw goal input into a normalized GoalConfig, or undefined when
330
+ * there is effectively no goal (empty objective). Drops non-positive
331
+ * budgets (0 / negative → "no limit", same as absent).
332
+ */
333
+ export function normalizeGoal(raw) {
334
+ if (raw == null)
335
+ return undefined;
336
+ const obj = typeof raw === "string" ? { objective: raw } : { ...raw };
337
+ const objective = (obj.objective ?? "").trim();
338
+ if (!objective)
339
+ return undefined;
340
+ const out = { objective };
341
+ if (typeof obj.goalId === "string" && obj.goalId.trim())
342
+ out.goalId = obj.goalId;
343
+ if (typeof obj.revision === "number" && obj.revision > 0) {
344
+ out.revision = Math.floor(obj.revision);
345
+ }
346
+ if (obj.paused === true)
347
+ out.paused = true;
348
+ if (typeof obj.tokenBudget === "number" && obj.tokenBudget > 0)
349
+ out.tokenBudget = obj.tokenBudget;
350
+ if (typeof obj.timeBudgetMs === "number" && obj.timeBudgetMs > 0)
351
+ out.timeBudgetMs = obj.timeBudgetMs;
352
+ if (typeof obj.maxTurns === "number" && obj.maxTurns > 0)
353
+ out.maxTurns = Math.floor(obj.maxTurns);
354
+ if (typeof obj.maxStopBlocks === "number" && obj.maxStopBlocks > 0) {
355
+ out.maxStopBlocks = Math.floor(obj.maxStopBlocks);
356
+ }
357
+ // Preserve a positive goal-set timestamp so a resumed/inherited goal keeps
358
+ // the anchor for relative deadlines. Non-positive/junk is dropped, matching
359
+ // the budget fields (a bogus anchor is worse than none).
360
+ if (typeof obj.setAtMs === "number" && obj.setAtMs > 0)
361
+ out.setAtMs = obj.setAtMs;
362
+ return out;
363
+ }
364
+ /**
365
+ * Decide the goal-set timestamp (setAtMs) to persist when a send supplies an
366
+ * explicit goal. Pure so the engine and tests agree on the anchor rule:
367
+ * - A NEW or CHANGED objective → stamp `nowMs` (the user just expressed a
368
+ * fresh goal; any relative deadline in it is anchored to now).
369
+ * - The SAME objective continuing (bare re-send inheriting the stored goal) →
370
+ * keep the stored anchor, so a re-send doesn't silently move the deadline.
371
+ * Falls back to `nowMs` if the stored goal predates this field.
372
+ * `stored` is the previously-persisted active goal (or undefined for the first
373
+ * goal on a session).
374
+ */
375
+ export function resolveGoalSetAt(explicitObjective, stored, nowMs) {
376
+ const sameGoalContinues = !!stored && stored.objective === explicitObjective;
377
+ return sameGoalContinues ? (stored.setAtMs ?? nowMs) : nowMs;
378
+ }
379
+ /** Interactive (no-goal) turn ceiling — a single prompt rarely needs more. */
380
+ export const INTERACTIVE_DEFAULT_MAX_TURNS = 100;
381
+ /**
382
+ * Resolve the turn ceiling for a run, honoring goal mode.
383
+ *
384
+ * Precedence (first defined wins):
385
+ * 1. `configMaxTurns` — an explicit engine/caller override (always wins).
386
+ * 2. `goal.maxTurns` — a per-goal cap from the GoalConfig.
387
+ * 3. `GOAL_DEFAULT_MAX_TURNS` when a goal is active (raise the unattended
388
+ * ceiling above the interactive default).
389
+ * 4. `INTERACTIVE_DEFAULT_MAX_TURNS` otherwise.
390
+ *
391
+ * Pure + injectable so the engine and tests agree on the rule.
392
+ */
393
+ export function resolveMaxTurns(configMaxTurns, goal) {
394
+ if (typeof configMaxTurns === "number" && configMaxTurns > 0)
395
+ return configMaxTurns;
396
+ if (goal)
397
+ return goal.maxTurns ?? GOAL_DEFAULT_MAX_TURNS;
398
+ return INTERACTIVE_DEFAULT_MAX_TURNS;
399
+ }
400
+ /** Warn when this many turns (or fewer) remain before maxTurns. */
401
+ export const APPROACH_TURNS = 5;
402
+ /** Warn when this many consecutive blocks (or fewer) remain before the cap. */
403
+ export const APPROACH_STOP_BLOCKS = 3;
404
+ /**
405
+ * Compute proximity to the two stop ceilings. Pure so turn-loop and tests
406
+ * agree. `nearest` favors stopBlocks when both are near, because the stop-block
407
+ * cap (default 25) is reached far sooner than maxTurns (default 300) for a
408
+ * goal the judge keeps re-blocking — it's the limit that actually bites.
409
+ */
410
+ export function limitProximity(turnCount, maxTurns, stopBlockCount, maxStopBlocks) {
411
+ const turnsRemaining = maxTurns - turnCount;
412
+ const stopBlocksRemaining = maxStopBlocks - stopBlockCount;
413
+ const turnsNear = turnsRemaining <= APPROACH_TURNS;
414
+ const blocksNear = stopBlocksRemaining <= APPROACH_STOP_BLOCKS;
415
+ return {
416
+ turnsRemaining,
417
+ stopBlocksRemaining,
418
+ approaching: turnsNear || blocksNear,
419
+ nearest: blocksNear ? "stopBlocks" : "turns",
420
+ };
421
+ }
422
+ /**
423
+ * Compute the new turn ceiling + goal budgets after a mid-run extension
424
+ * (TODO 3.1). Pure so the TurnLoop and tests agree on the arithmetic:
425
+ * - addTurns bumps the maxTurns ceiling (floored, positive only).
426
+ * - addTokenBudget/addTimeBudgetMs raise the goal's caps. When a cap was
427
+ * previously unset ("unlimited"), we seed it from CURRENT USAGE before
428
+ * adding — `tokensUsed` for tokens, `elapsedMs` for time — so extending an
429
+ * unbounded run sets a fresh cap ABOVE current usage rather than below it.
430
+ * (Seeding time from 0 was bug B1: a long-running unbounded goal would get
431
+ * a cap below its elapsed time and force-stop immediately on extend.)
432
+ * - addStopBlocks is handled by the caller (TurnLoop.extend) against the live
433
+ * config, not here, since it isn't part of the goal budget shape.
434
+ * `tokensUsed`/`elapsedMs` are the tracker's running totals (used only to seed
435
+ * unset caps). Returns the resulting limits; never mutates its inputs.
436
+ */
437
+ export function applyGoalExtension(currentMaxTurns, goal, tokensUsed, elapsedMs, ext) {
438
+ let maxTurns = currentMaxTurns;
439
+ if (typeof ext.addTurns === "number" && ext.addTurns > 0) {
440
+ maxTurns += Math.floor(ext.addTurns);
441
+ }
442
+ let tokenBudget = goal?.tokenBudget;
443
+ let timeBudgetMs = goal?.timeBudgetMs;
444
+ if (goal) {
445
+ if (typeof ext.addTokenBudget === "number" && ext.addTokenBudget > 0) {
446
+ tokenBudget = (tokenBudget ?? tokensUsed) + Math.floor(ext.addTokenBudget);
447
+ }
448
+ if (typeof ext.addTimeBudgetMs === "number" && ext.addTimeBudgetMs > 0) {
449
+ // Seed an unset cap from elapsed time (not 0), mirroring the token branch,
450
+ // so the new cap lands above current usage. Fixes B1.
451
+ timeBudgetMs = (timeBudgetMs ?? elapsedMs) + Math.floor(ext.addTimeBudgetMs);
452
+ }
453
+ }
454
+ return { maxTurns, tokenBudget, timeBudgetMs };
455
+ }
456
+ /** Create a run-scoped tracker. `nowMs` is injected for testability. */
457
+ export function createGoalBudgetTracker(goal, nowMs) {
458
+ return { goal, startedAtMs: nowMs, tokensUsed: 0 };
459
+ }
460
+ /** Add this turn's token usage to the running total. */
461
+ export function recordGoalUsage(tracker, turnTokens) {
462
+ if (turnTokens > 0)
463
+ tracker.tokensUsed += turnTokens;
464
+ }
465
+ /**
466
+ * Has the run exceeded any configured budget? `nowMs` is injected so callers
467
+ * pass the current clock (and tests pass a fixed value).
468
+ */
469
+ export function goalBudgetExceeded(tracker, nowMs) {
470
+ return goalBudgetTerminationReason(tracker, nowMs) !== undefined;
471
+ }
472
+ /** Identify which goal budget forced termination, preserving token-first precedence. */
473
+ export function goalBudgetTerminationReason(tracker, nowMs) {
474
+ const { tokenBudget, timeBudgetMs } = tracker.goal;
475
+ if (typeof tokenBudget === "number" && tracker.tokensUsed > tokenBudget) {
476
+ return "token_budget_exhausted";
477
+ }
478
+ if (typeof timeBudgetMs === "number" && nowMs - tracker.startedAtMs > timeBudgetMs) {
479
+ return "time_budget_exhausted";
480
+ }
481
+ return undefined;
482
+ }
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Hook event type definitions.
3
3
  */
4
+ import type { GoalTerminationReason } from "../goal/lifecycle.js";
4
5
  /**
5
6
  * Lifecycle hooks the engine emits.
6
7
  *
@@ -36,6 +37,10 @@
36
37
  * consecutive-block cap (maxStopBlocks)
37
38
  * and maxTurns. ctx.data carries `goal`,
38
39
  * `finalText`, `turnCount`. Distinct from
40
+ * the built-in Goal judge's recent
41
+ * conversation, which stays on a private
42
+ * TurnLoop-to-hook closure and is never
43
+ * exposed through HookContext.
39
44
  * HookResult.stop, which controls the hook
40
45
  * CHAIN, not agent termination.
41
46
  * - pre_tool_use / post_tool_use (executor.ts) — pre_tool_use honors
@@ -62,14 +67,24 @@
62
67
  * window/emergency), `beforeTokens`,
63
68
  * `afterTokens`. Microcompact is
64
69
  * intentionally suppressed.
65
- * - notification (agent.ts) fired when a background
66
- * sub-agent transitions to a terminal
67
- * state. ctx.data carries `kind`
68
- * ("agent_completed" / "agent_failed" /
69
- * "agent_cancelled"), `agentId`,
70
- * `name`, `description`, plus
71
- * `finalText` (completed) or `error`
72
- * (failed). Fired void — handler
70
+ * - notification — the fan-in "something happened"
71
+ * channel; ctx.data.kind discriminates:
72
+ * · agent_completed / agent_failed /
73
+ * agent_cancelled (agent.ts) bg
74
+ * sub-agent terminal states, plus
75
+ * agentId/name/finalText/error.
76
+ * · approval_requested /
77
+ * approval_resolved (engine.ts
78
+ * PermissionClassifier) — an
79
+ * interactive approval is waiting /
80
+ * was answered; data carries
81
+ * toolName, riskLevel, approved.
82
+ * · mcp_server_connected /
83
+ * mcp_server_failed (engine.ts ←
84
+ * MCPManager.connectAll) — per-server
85
+ * connect outcome; data carries
86
+ * server, error.
87
+ * Fired void — handler
73
88
  * latency does not block the main
74
89
  * loop. Not consumed by the engine
75
90
  * (bg-agent feed renders the same
@@ -87,7 +102,7 @@
87
102
  * ContextManager; current implementation only knows
88
103
  * after-the-fact (use post_compact instead).
89
104
  */
90
- export type HookEventName = "on_agent_start" | "on_agent_end" | "on_turn_start" | "on_turn_end" | "on_stop" | "on_tool_start" | "on_tool_end" | "on_permission_check" | "on_session_start" | "on_session_end" | "pre_tool_use" | "post_tool_use" | "user_prompt_submit" | "pre_compact" | "post_compact" | "file_changed" | "notification";
105
+ export type HookEventName = "on_agent_start" | "on_agent_end" | "on_turn_start" | "on_turn_end" | "on_stop" | "on_tool_start" | "on_tool_end" | "on_permission_check" | "on_session_start" | "on_session_end" | "pre_tool_use" | "post_tool_use" | "user_prompt_submit" | "agent_direction_submit" | "pre_compact" | "post_compact" | "file_changed" | "notification";
91
106
  export interface HookContext {
92
107
  eventName: HookEventName;
93
108
  data: Record<string, unknown>;
@@ -104,6 +119,8 @@ export interface HookResult {
104
119
  * chain). Ignored for non-on_stop events. Bounded by maxStopBlocks.
105
120
  */
106
121
  continueSession?: boolean;
122
+ /** For on_stop: typed Goal-run stop outcome propagated to TurnLoop/Engine. */
123
+ goalTermination?: GoalTerminationReason;
107
124
  /** Modified data to pass along */
108
125
  data?: Record<string, unknown>;
109
126
  /** Additional messages to inject */
@@ -1,4 +1 @@
1
- /**
2
- * Hook event type definitions.
3
- */
4
1
  export {};
@@ -1,8 +1,10 @@
1
1
  import type { HookHandler } from "./registry.js";
2
- import type { LLMResponse, ToolResult } from "../types.js";
3
- import { type GoalConfig } from "../engine/goal.js";
2
+ import type { LLMResponse, Message, TokenUsage } from "../types.js";
3
+ import { type GoalConfig } from "../goal/lifecycle.js";
4
4
  /** Narrow LLM surface the judge needs — just a one-shot completion. */
5
5
  export interface GoalJudgeLLM {
6
+ /** Main-generation request timeout; the judge derives a shorter ceiling. */
7
+ readonly timeout?: number;
6
8
  createMessage(options: {
7
9
  systemPrompt: string;
8
10
  messages: {
@@ -11,7 +13,8 @@ export interface GoalJudgeLLM {
11
13
  }[];
12
14
  stream?: boolean;
13
15
  maxTokens?: number;
14
- recordUsage?: boolean;
16
+ billingEnabled?: boolean;
17
+ requestVisible?: boolean;
15
18
  signal?: AbortSignal;
16
19
  /** Reasoning control — the judge always asks for it OFF (see call site). */
17
20
  reasoning?: import("../llm/reasoning-setting.js").ReasoningSetting;
@@ -27,6 +30,8 @@ export interface GoalStopHookOptions {
27
30
  log: GoalLogger;
28
31
  /** Override the goal instead of reading ctx.data.goal (mainly for tests). */
29
32
  goal?: string | GoalConfig;
33
+ /** Live goal accessor used by edit/pause controls during a running loop. */
34
+ getGoal?: () => GoalConfig | undefined;
30
35
  /**
31
36
  * Re-check whether the session STILL has a live persisted goal, evaluated
32
37
  * fresh each time the hook fires. The hook's `goal` above is frozen at
@@ -45,7 +50,10 @@ export interface GoalStopHookOptions {
45
50
  * a later bare send doesn't re-inherit a satisfied goal. Optional so tests /
46
51
  * non-persistent callers can omit it.
47
52
  */
48
- onMet?: () => void;
53
+ /** Return false when durable cleanup failed; the hook will keep Goal mode active. */
54
+ onMet?: () => boolean | void;
55
+ /** Persist active → waiting before allowing a finite-background-work stop. */
56
+ onWaiting?: () => boolean | void;
49
57
  /**
50
58
  * Clock source for the current time fed to the judge. Injectable so tests
51
59
  * pin a fixed instant (the judge prompt is a fresh sub-call, not part of the
@@ -58,33 +66,24 @@ export interface GoalStopHookOptions {
58
66
  * It deliberately lives on this closure rather than HookContext.data so
59
67
  * third-party/public stop hooks do not gain access to tool output.
60
68
  */
61
- getJudgeContext?: () => GoalJudgeRuntimeContext | undefined;
69
+ getJudgeContext: () => GoalJudgeRuntimeContext | undefined;
70
+ /** Dedicated judge deadline. Defaults to 15s and never exceeds the main timeout. */
71
+ judgeTimeoutMs?: number;
72
+ /**
73
+ * Private usage seam into TurnLoop's Goal ledger. Returning a termination
74
+ * reason prevents verdict side effects and lets the loop stop immediately.
75
+ */
76
+ onJudgeUsage?: (usage: TokenUsage | undefined, judgedGoal?: GoalConfig) => "token_budget_exhausted" | "time_budget_exhausted" | undefined;
62
77
  }
63
78
  export interface GoalJudgeRuntimeContext {
64
- /** Recent irreversible projections from this run, newest evidence retained by TurnLoop. */
65
- toolResults: GoalJudgeToolResult[];
66
- progress: {
67
- turnCount: number;
68
- /** One-based natural-stop/judge round for this run. */
69
- stopRound: number;
70
- elapsedMs: number;
71
- tokensUsed: number;
72
- tokenBudget?: number;
73
- timeBudgetMs?: number;
74
- maxTurns?: number;
75
- maxStopBlocks?: number;
76
- };
77
- }
78
- export interface GoalJudgeToolResult {
79
- turnCount: number;
80
- toolName: string;
81
- status: "success" | "error";
82
- /** Bounded plain text only; absent for sensitive or purely non-text results. */
83
- text?: string;
84
- /** True when image/binary/structured blocks were replaced with a placeholder. */
85
- omittedNonText?: true;
79
+ conversation: Message[];
80
+ renderedConversation: string;
81
+ digest: string;
82
+ selectedRoundCount: number;
83
+ sourceRoundCount: number;
84
+ estimatedTokens: number;
85
+ chars: number;
86
+ truncated: boolean;
86
87
  }
87
- /** Build the bounded, irreversible value retained beyond the current model round. */
88
- export declare function projectGoalJudgeToolResult(result: ToolResult, turnCount: number): GoalJudgeToolResult;
89
88
  export declare function createGoalStopHook(opts: GoalStopHookOptions): HookHandler;
90
89
  export {};