@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
@@ -13,7 +13,7 @@
13
13
  import { nanoid } from "nanoid";
14
14
  import { logger } from "../logging/logger.js";
15
15
  import { RunQueue } from "./RunQueue.js";
16
- import { EngineRunner } from "./EngineRunner.js";
16
+ import { EngineRunner, } from "./EngineRunner.js";
17
17
  import { CheckpointWriter } from "./CheckpointWriter.js";
18
18
  import { ArtifactTracker } from "./ArtifactTracker.js";
19
19
  import { RunLock } from "./RunLock.js";
@@ -21,6 +21,8 @@ import { Heartbeat } from "./Heartbeat.js";
21
21
  import { NoopEvaluator } from "./Evaluator.js";
22
22
  import { assertSafeRunFileId, assertSafeRunId } from "./ids.js";
23
23
  import { VALID_TRANSITIONS } from "./types.js";
24
+ import { composeArtifactDetectors, resolveCapabilities, } from "../capabilities/index.js";
25
+ import { resolveAgentPreset } from "../preset/index.js";
24
26
  function hasOwnString(value, key) {
25
27
  return (value !== undefined &&
26
28
  Object.prototype.hasOwnProperty.call(value, key) &&
@@ -32,9 +34,19 @@ export class RunManager {
32
34
  runner;
33
35
  lock;
34
36
  heartbeat;
37
+ /**
38
+ * Page size for crash-recovery scans (see listAllByStatus).
39
+ *
40
+ * Deliberately NOT a constructor option: hosts have no reason to tune it, and
41
+ * exposing it would invite a caller to re-introduce the UI's 50-row default.
42
+ * Tests override it to exercise the multi-page loop cheaply.
43
+ */
44
+ recoverPageSize = 200;
35
45
  evaluator;
36
46
  defaultTags;
37
47
  defaultMetadata;
48
+ defaultPreset;
49
+ artifactDetectors;
38
50
  subscribers = new Map();
39
51
  abortControllers = new Map();
40
52
  /** Active execution handles — used to resolve pending approvals/input while Engine is suspended */
@@ -53,10 +65,13 @@ export class RunManager {
53
65
  constructor(config) {
54
66
  this.store = config.store;
55
67
  this.queue = new RunQueue({ concurrency: config.concurrency ?? 1 });
68
+ const localCapabilities = config.capabilities ??
69
+ (isRunExecutor(config.executor) ? [] : (config.executor.capabilities ?? []));
70
+ const capabilities = resolveCapabilities(localCapabilities);
56
71
  // Accept either a RunExecutor instance or an EngineRunnerConfig
57
72
  this.runner = isRunExecutor(config.executor)
58
73
  ? config.executor
59
- : new EngineRunner(config.executor);
74
+ : new EngineRunner({ ...config.executor, capabilities });
60
75
  this.lock = new RunLock({
61
76
  runsDir: config.runsDir,
62
77
  staleMs: config.staleLockMs,
@@ -68,6 +83,8 @@ export class RunManager {
68
83
  this.evaluator = config.evaluator ?? new NoopEvaluator();
69
84
  this.defaultTags = config.defaultTags ?? [];
70
85
  this.defaultMetadata = config.defaultMetadata ?? {};
86
+ this.defaultPreset = resolveAgentPreset(undefined, capabilities).name;
87
+ this.artifactDetectors = composeArtifactDetectors(capabilities);
71
88
  // Wire queue executor
72
89
  this.queue.setExecutor((runId) => this.executeRun(runId));
73
90
  }
@@ -81,7 +98,7 @@ export class RunManager {
81
98
  const snapshot = {
82
99
  runId,
83
100
  objective: input.objective,
84
- preset: input.preset ?? "terminal-coding",
101
+ preset: input.preset ?? this.defaultPreset,
85
102
  cwd: input.cwd ?? process.cwd(),
86
103
  status: "queued",
87
104
  createdAt: now,
@@ -280,14 +297,26 @@ export class RunManager {
280
297
  * Returns the IDs of recovered runs.
281
298
  */
282
299
  async recover() {
283
- const runs = await this.store.list({ status: "running" });
300
+ const runs = await this.listAllByStatus("running");
284
301
  const recovered = [];
285
302
  for (const run of runs) {
286
303
  const processAlive = this.heartbeat.isProcessAlive(run.runId);
287
304
  const stale = this.heartbeat.isStale(run.runId);
288
- if (processAlive && !stale) {
289
- // Still actively running in another process leave it alone
290
- logger.info("run.recover.skip", { runId: run.runId, reason: "process alive" });
305
+ // Process liveness has VETO power: never recover a run whose owning
306
+ // process is still alive. A live process can miss a heartbeat window for
307
+ // benign reasons (a long synchronous tool call, GC pause, a suspended
308
+ // laptop), and recovering it force-unlocks the lock and re-queues work
309
+ // that is still executing — the same run then runs twice.
310
+ //
311
+ // This matches the documented contract above ("stale AND dead → recover").
312
+ // The old condition (`processAlive && !stale`) recovered a live-but-stale
313
+ // run, which was reproducible with a run owning the current PID and a
314
+ // 60s-old heartbeat.
315
+ if (processAlive || !stale) {
316
+ logger.info("run.recover.skip", {
317
+ runId: run.runId,
318
+ reason: processAlive ? "process alive" : "heartbeat recent",
319
+ });
291
320
  continue;
292
321
  }
293
322
  // Process is dead or heartbeat is stale — recover
@@ -324,7 +353,7 @@ export class RunManager {
324
353
  }
325
354
  // Also check waiting runs with stale heartbeats (process died while waiting)
326
355
  for (const status of ["waiting_input", "waiting_approval"]) {
327
- const waitingRuns = await this.store.list({ status });
356
+ const waitingRuns = await this.listAllByStatus(status);
328
357
  for (const run of waitingRuns) {
329
358
  const stale = this.heartbeat.isStale(run.runId);
330
359
  if (stale && !this.heartbeat.isProcessAlive(run.runId)) {
@@ -337,6 +366,45 @@ export class RunManager {
337
366
  }
338
367
  return recovered;
339
368
  }
369
+ /**
370
+ * Drain EVERY run with the given status, page by page.
371
+ *
372
+ * `store.list()` defaults to `limit: 50` because it backs a UI list. Crash
373
+ * recovery must not inherit a UI page size: with 55 stale running runs, the
374
+ * bare `list({ status })` call recovered the first 50 and left the remaining 5
375
+ * pinned in "running" forever (no later pass would revisit them, because
376
+ * recovery only runs at startup).
377
+ *
378
+ * Pages until a short page arrives. `maxPages` is a runaway guard for a store
379
+ * that ignores `offset` — without it a buggy store would loop forever.
380
+ */
381
+ async listAllByStatus(status) {
382
+ // Overridable so a test can force the multi-page path without creating more
383
+ // rows than the production page size (which cost ~30s under load).
384
+ const pageSize = this.recoverPageSize;
385
+ const maxPages = 10_000;
386
+ const all = [];
387
+ const seen = new Set();
388
+ for (let page = 0; page < maxPages; page += 1) {
389
+ const batch = await this.store.list({
390
+ status,
391
+ limit: pageSize,
392
+ offset: page * pageSize,
393
+ });
394
+ for (const run of batch) {
395
+ // Dedupe defensively: concurrent writes can shift the offset window and
396
+ // surface the same run twice, which would double-recover it.
397
+ if (seen.has(run.runId))
398
+ continue;
399
+ seen.add(run.runId);
400
+ all.push(run);
401
+ }
402
+ if (batch.length < pageSize)
403
+ return all;
404
+ }
405
+ logger.warn("run.recover.page_limit", { status, scanned: all.length });
406
+ return all;
407
+ }
340
408
  /**
341
409
  * Graceful shutdown — stop all heartbeats and release all locks.
342
410
  */
@@ -388,7 +456,11 @@ export class RunManager {
388
456
  objective: run.objective,
389
457
  store: this.store,
390
458
  });
391
- const artifactTracker = new ArtifactTracker({ runId, store: this.store });
459
+ const artifactTracker = new ArtifactTracker({
460
+ runId,
461
+ store: this.store,
462
+ detectors: this.artifactDetectors,
463
+ });
392
464
  // Build lifecycle hooks so Engine can notify us about approval/input needs
393
465
  const lifecycleHooks = {
394
466
  onApprovalNeeded: async (request) => {
@@ -413,8 +485,7 @@ export class RunManager {
413
485
  // suppresses sub-agent session_started upstream (engine.ts:830-835),
414
486
  // but a custom RunExecutor could forward sub-agent events — and only
415
487
  // the MAIN run's session should identify the run, never a sub-agent's.
416
- if (event.type === "session_started" &&
417
- !event.agentId) {
488
+ if (event.type === "session_started" && !event.agentId) {
418
489
  try {
419
490
  const run = await this.getOrThrow(runId);
420
491
  if (run.sessionId !== event.sessionId) {
@@ -20,6 +20,7 @@
20
20
  import type { LLMConfig, PermissionMode } from "../types.js";
21
21
  import type { EngineConfig, EngineHookConfig } from "../engine/types.js";
22
22
  import type { Evaluator } from "./Evaluator.js";
23
+ import type { CapabilityModule } from "../capabilities/index.js";
23
24
  import { RunManager } from "./RunManager.js";
24
25
  export interface CreateRunManagerOptions {
25
26
  /** LLM configuration (required). */
@@ -63,6 +64,8 @@ export interface CreateRunManagerOptions {
63
64
  * the interactive run-aware backend.
64
65
  */
65
66
  approvalBackend?: import("../tool-system/permission.js").ApprovalBackend;
67
+ /** Product/domain capabilities installed into each Engine. */
68
+ capabilities?: readonly CapabilityModule[];
66
69
  }
67
70
  /**
68
71
  * Create a fully configured RunManager with one call.
@@ -41,6 +41,7 @@ export function createRunManager(options) {
41
41
  customSystemPrompt: options.customSystemPrompt,
42
42
  appendSystemPrompt: options.appendSystemPrompt,
43
43
  hooks: options.hooks,
44
+ capabilities: options.capabilities,
44
45
  ...(options.approvalBackend ? { approvalBackend: options.approvalBackend } : {}),
45
46
  },
46
47
  concurrency: options.concurrency ?? 1,
@@ -48,5 +49,6 @@ export function createRunManager(options) {
48
49
  evaluator: options.evaluator,
49
50
  defaultTags: options.defaultTags,
50
51
  defaultMetadata: options.defaultMetadata,
52
+ capabilities: options.capabilities,
51
53
  });
52
54
  }
@@ -52,6 +52,12 @@ export interface SafeSpawnOptions {
52
52
  ioDrainGraceMs?: number;
53
53
  /** Optional cancellation signal. If already aborted, SafeSpawn resolves immediately without spawning. */
54
54
  signal?: AbortSignal;
55
+ /**
56
+ * POSIX only: launch the direct child as a process-group leader so timeout
57
+ * and abort terminate helpers such as git-remote-https as well. Windows
58
+ * already uses taskkill /T for direct children.
59
+ */
60
+ processGroup?: boolean;
55
61
  }
56
62
  export interface SafeSpawnShellOptions extends SafeSpawnOptions {
57
63
  /** Optional sandbox to wrap the command through. Required for shell-mode. If omitted, the command runs through `shell ?? /bin/bash -c`. */
@@ -35,7 +35,7 @@
35
35
  */
36
36
  import { spawn } from "node:child_process";
37
37
  import { StringDecoder } from "node:string_decoder";
38
- import { resolveSpawnTarget, defaultShellBinary, killChildTree, killProcessGroup } from "./spawn-common.js";
38
+ import { resolveSpawnTarget, defaultShellBinary, killChildTree, killProcessGroup, } from "./spawn-common.js";
39
39
  export const DEFAULT_MAX_OUTPUT_BYTES = 1_000_000;
40
40
  export const DEFAULT_IO_DRAIN_GRACE_MS = 100;
41
41
  const TIMEOUT_SIGKILL_GRACE_MS = 2000;
@@ -51,6 +51,7 @@ export function safeSpawn(file, args, opts) {
51
51
  opts,
52
52
  cleanup: undefined,
53
53
  resolveMs: undefined,
54
+ detached: opts.processGroup === true && process.platform !== "win32",
54
55
  });
55
56
  }
56
57
  /**
@@ -85,7 +86,7 @@ export function safeSpawnShell(command, opts) {
85
86
  detached: true,
86
87
  });
87
88
  }
88
- function runLifecycle({ file, args, opts, cleanup, resolveMs, detached }) {
89
+ function runLifecycle({ file, args, opts, cleanup, resolveMs, detached, }) {
89
90
  const maxBytes = opts.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
90
91
  const abortGrace = opts.ioDrainGraceMs ?? DEFAULT_IO_DRAIN_GRACE_MS;
91
92
  const lifecycleStartedAt = spawnProfileEnabled() ? performance.now() : 0;
@@ -225,11 +226,7 @@ function runLifecycle({ file, args, opts, cleanup, resolveMs, detached }) {
225
226
  // throw above, so we surface the same reason. If timeout or abort
226
227
  // fired concurrently, give those precedence — the user-facing cause
227
228
  // is the cancel/timeout, not the resulting process death.
228
- const reason = timedOut
229
- ? "timeout"
230
- : aborted
231
- ? "aborted"
232
- : "spawn_failed";
229
+ const reason = timedOut ? "timeout" : aborted ? "aborted" : "spawn_failed";
233
230
  finish({
234
231
  reason,
235
232
  stdout,
@@ -268,11 +265,7 @@ function runLifecycle({ file, args, opts, cleanup, resolveMs, detached }) {
268
265
  stderr += tailErr;
269
266
  }
270
267
  }
271
- const reason = timedOut
272
- ? "timeout"
273
- : aborted
274
- ? "aborted"
275
- : "ok";
268
+ const reason = timedOut ? "timeout" : aborted ? "aborted" : "ok";
276
269
  finish({
277
270
  reason,
278
271
  stdout,
@@ -305,7 +298,9 @@ function safeCleanup(cleanup) {
305
298
  try {
306
299
  cleanup();
307
300
  }
308
- catch { /* best-effort */ }
301
+ catch {
302
+ /* best-effort */
303
+ }
309
304
  }
310
305
  function emptyResult(overrides) {
311
306
  return {
@@ -19,11 +19,23 @@ export declare function shouldAutoDream(config?: AutoDreamConfig): boolean;
19
19
  /**
20
20
  * Record that a session was completed (increment counter).
21
21
  */
22
+ /**
23
+ * Sessions counted since the last consolidation.
24
+ *
25
+ * Callers snapshot this BEFORE starting an async dream run and pass it back to
26
+ * `recordDreamComplete`, so sessions finishing mid-run are not swallowed.
27
+ */
28
+ export declare function sessionsSinceLastDream(): number;
22
29
  export declare function recordSession(): void;
23
30
  /**
24
31
  * Record that a dream run completed.
32
+ *
33
+ * `consumed` is how many sessions the finished run accounted for — captured
34
+ * BEFORE it started. Subtracting it (instead of zeroing) preserves sessions that
35
+ * completed while the run was in flight: `runDream()` is async, so blindly
36
+ * resetting to 0 threw away increments that belonged to the next cycle.
25
37
  */
26
- export declare function recordDreamComplete(): void;
38
+ export declare function recordDreamComplete(consumed?: number): void;
27
39
  /**
28
40
  * System prompt for the auto-dream tool-call loop.
29
41
  *
@@ -7,6 +7,7 @@
7
7
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { resolveMemoryBaseDir } from "../session/memory.js";
10
+ import { mutateJsonFile } from "../utils/file-mutex.js";
10
11
  const DEFAULT_CONFIG = {
11
12
  minSessionsBetween: 5,
12
13
  minTimeBetween: 24 * 60 * 60 * 1000, // 24 hours
@@ -33,6 +34,33 @@ function saveState(state) {
33
34
  mkdirSync(resolveMemoryBaseDir(), { recursive: true });
34
35
  writeFileSync(stateFile, JSON.stringify(state, null, 2), "utf-8");
35
36
  }
37
+ /**
38
+ * Read-modify-write the cadence state under a cross-process lock.
39
+ *
40
+ * The reload happens inside the lock, so a writer that lost the race still sees
41
+ * the winner's value and applies its own change on top instead of overwriting it.
42
+ */
43
+ function mutateState(change) {
44
+ mkdirSync(resolveMemoryBaseDir(), { recursive: true });
45
+ mutateJsonFile(getStateFile(), {
46
+ parse: (raw) => {
47
+ if (raw === undefined)
48
+ return { lastDreamAt: null, sessionsSinceLastDream: 0 };
49
+ try {
50
+ const parsed = JSON.parse(raw);
51
+ return {
52
+ lastDreamAt: parsed.lastDreamAt ?? null,
53
+ sessionsSinceLastDream: Number(parsed.sessionsSinceLastDream) || 0,
54
+ };
55
+ }
56
+ catch {
57
+ return { lastDreamAt: null, sessionsSinceLastDream: 0 };
58
+ }
59
+ },
60
+ serialize: (state) => JSON.stringify(state, null, 2),
61
+ mutation: (current) => ({ value: change(current) }),
62
+ });
63
+ }
36
64
  /**
37
65
  * Check if auto-dream should run.
38
66
  */
@@ -54,19 +82,39 @@ export function shouldAutoDream(config = DEFAULT_CONFIG) {
54
82
  /**
55
83
  * Record that a session was completed (increment counter).
56
84
  */
85
+ /**
86
+ * Sessions counted since the last consolidation.
87
+ *
88
+ * Callers snapshot this BEFORE starting an async dream run and pass it back to
89
+ * `recordDreamComplete`, so sessions finishing mid-run are not swallowed.
90
+ */
91
+ export function sessionsSinceLastDream() {
92
+ return loadState().sessionsSinceLastDream;
93
+ }
57
94
  export function recordSession() {
58
- const state = loadState();
59
- state.sessionsSinceLastDream++;
60
- saveState(state);
95
+ // Cross-process increment. Desktop worker, Desktop main/automation, TUI and a
96
+ // standalone agent server can share one CODE_SHELL_HOME, so this was a real
97
+ // multi-writer path: an unlocked read → +1 → write dropped nearly everything
98
+ // (48 concurrent processes recorded 1–2 increments). The cadence then never
99
+ // reached its threshold and auto-consolidation silently stopped happening.
100
+ mutateState((state) => ({
101
+ ...state,
102
+ sessionsSinceLastDream: state.sessionsSinceLastDream + 1,
103
+ }));
61
104
  }
62
105
  /**
63
106
  * Record that a dream run completed.
107
+ *
108
+ * `consumed` is how many sessions the finished run accounted for — captured
109
+ * BEFORE it started. Subtracting it (instead of zeroing) preserves sessions that
110
+ * completed while the run was in flight: `runDream()` is async, so blindly
111
+ * resetting to 0 threw away increments that belonged to the next cycle.
64
112
  */
65
- export function recordDreamComplete() {
66
- const state = loadState();
67
- state.lastDreamAt = new Date().toISOString();
68
- state.sessionsSinceLastDream = 0;
69
- saveState(state);
113
+ export function recordDreamComplete(consumed) {
114
+ mutateState((state) => ({
115
+ lastDreamAt: new Date().toISOString(),
116
+ sessionsSinceLastDream: consumed === undefined ? 0 : Math.max(0, state.sessionsSinceLastDream - consumed),
117
+ }));
70
118
  }
71
119
  /**
72
120
  * System prompt for the auto-dream tool-call loop.
@@ -21,6 +21,7 @@
21
21
  import type { LLMClientBase } from "../llm/client-base.js";
22
22
  import type { ToolRegistry } from "../tool-system/registry.js";
23
23
  import type { ToolContext } from "../tool-system/context.js";
24
+ import type { TokenUsage } from "../types.js";
24
25
  export interface DreamConsolidationInput {
25
26
  /** LLM client for the consolidation calls. */
26
27
  llmClient: LLMClientBase;
@@ -36,6 +37,8 @@ export interface DreamConsolidationInput {
36
37
  projectDir?: string;
37
38
  /** For log attribution. */
38
39
  sessionId?: string;
40
+ /** Owning Engine session/Goal recorder; process billing already happened. */
41
+ onUsage?: (usage: TokenUsage) => void;
39
42
  }
40
43
  export interface DreamConsolidationResult {
41
44
  /** True if the loop ran (with or without writes); false if it bailed early. */
@@ -71,9 +71,12 @@ export async function runDreamConsolidation(input) {
71
71
  messages,
72
72
  tools: toolDefs,
73
73
  maxTokens: 2048,
74
- recordUsage: false,
74
+ billingEnabled: true,
75
+ requestVisible: false,
75
76
  reasoning: { mode: "off" },
76
77
  });
78
+ if (resp.usage)
79
+ input.onUsage?.(resp.usage);
77
80
  if (resp.toolCalls.length === 0) {
78
81
  logger.info("memory.dream_finished", {
79
82
  sessionId,
@@ -138,7 +141,10 @@ async function dispatchDreamTool(tc, toolRegistry, ctx, consumeWriteBudget) {
138
141
  }
139
142
  }
140
143
  try {
141
- const dreamCtx = { ...ctx, __dreamLoop: true };
144
+ // Portable profile memory is intentionally not part of automatic dream
145
+ // routing. Normal profile-bound runs may manage it explicitly, but the
146
+ // consolidation loop remains limited to its existing global/project stores.
147
+ const dreamCtx = { ...ctx, profileMemoryDir: undefined, __dreamLoop: true };
142
148
  const result = await toolRegistry.executeTool(tc.toolName, tc.args, { ctx: dreamCtx });
143
149
  if (result.isError)
144
150
  return result.error ?? `Error executing ${tc.toolName}`;
@@ -156,6 +162,12 @@ function checkDreamWriteGuard(tc, ctx) {
156
162
  error: `Error: dream loop may only write to scope "dream" or "user", got "${scope}".`,
157
163
  };
158
164
  }
165
+ if (tc.args?.location === "profile") {
166
+ return {
167
+ ok: false,
168
+ error: "Error: dream loop does not manage portable profile memory.",
169
+ };
170
+ }
159
171
  const location = tc.args?.location === "global" ? "global" : "project";
160
172
  const mm = new MemoryManager({
161
173
  projectDir: location === "project" ? ctx.cwd : undefined,
@@ -2,7 +2,7 @@
2
2
  * Services index — re-exports all service modules.
3
3
  */
4
4
  export { analytics, trackEvent } from "./analytics.js";
5
- export { authorize, refreshToken, type OAuthConfig, type OAuthTokens } from "./oauth.js";
5
+ export { authorize, refreshToken, generatePKCE, createHardenedOAuthFetch, type OAuthConfig, type OAuthTokens, type OAuthAuthorizeOptions, type OAuthRefreshOptions, type HardenedOAuthFetchOptions, } from "./oauth.js";
6
6
  export { notify, notifyComplete, notifyError } from "./notifier.js";
7
7
  export { diagnostics } from "./diagnostics.js";
8
8
  export { buildExtractionPrompt, parseExtractionResponse, type ExtractedMemory, } from "./extract-memories.js";
@@ -8,7 +8,7 @@ export { analytics, trackEvent } from "./analytics.js";
8
8
  // `microCompact` that truncated long *messages* by char count, unrelated
9
9
  // to the tool_result-based microcompact in ContextManager). Removed to end
10
10
  // the "which microcompact?" ambiguity — the source of truth is ContextManager.
11
- export { authorize, refreshToken } from "./oauth.js";
11
+ export { authorize, refreshToken, generatePKCE, createHardenedOAuthFetch, } from "./oauth.js";
12
12
  export { notify, notifyComplete, notifyError } from "./notifier.js";
13
13
  export { diagnostics } from "./diagnostics.js";
14
14
  export { buildExtractionPrompt, parseExtractionResponse, } from "./extract-memories.js";
@@ -17,7 +17,7 @@ import { buildExtractionPrompt, parseExtractionResponse, } from "./extract-memor
17
17
  import { saveSessionMemory, buildSessionMemoryPrompt } from "./session-memory.js";
18
18
  import { extractJSON } from "../utils/json.js";
19
19
  import { redactSecrets } from "../logging/sanitize-messages.js";
20
- import { shouldAutoDream, recordSession, recordDreamComplete, buildDreamSystemPrompt, buildDreamUserPrompt, } from "./auto-dream.js";
20
+ import { shouldAutoDream, recordSession, recordDreamComplete, sessionsSinceLastDream, buildDreamSystemPrompt, buildDreamUserPrompt, } from "./auto-dream.js";
21
21
  import { applyGlobalDreamPromotionGate, detectUserDirectGlobalPreference, } from "./global-dream-promotion.js";
22
22
  import { logger } from "../logging/logger.js";
23
23
  export class MemoryOrchestrator {
@@ -259,13 +259,17 @@ export class MemoryOrchestrator {
259
259
  ? new MemoryManager({ scope: "dream" }).loadScope("dream")
260
260
  : [];
261
261
  if (userMems.length + dreamMems.length + globalDreamMems.length > 0) {
262
+ // Snapshot the cadence counter BEFORE the (async) run so sessions that
263
+ // finish while it is in flight are carried into the next cycle rather
264
+ // than being zeroed away on completion.
265
+ const consumed = sessionsSinceLastDream();
262
266
  const ran = await this.options.runDream({
263
267
  systemPrompt: buildDreamSystemPrompt(),
264
268
  userPrompt: buildDreamUserPrompt(userMems, dreamMems, globalDreamMems),
265
269
  projectDir: this.options.projectDir,
266
270
  });
267
271
  if (ran) {
268
- recordDreamComplete();
272
+ recordDreamComplete(consumed);
269
273
  dreamTriggered = true;
270
274
  logger.info("memory.auto_dream_done", {
271
275
  sessionId,
@@ -1,27 +1,51 @@
1
- /**
2
- * OAuth service — OAuth 2.0 authorization code flow with PKCE.
3
- *
4
- * Supports browser-based login flow for API authentication.
5
- */
1
+ /** OAuth 2.0 authorization-code + PKCE primitives for host applications. */
6
2
  export interface OAuthConfig {
7
3
  clientId: string;
4
+ clientSecret?: string;
8
5
  authorizationEndpoint: string;
9
6
  tokenEndpoint: string;
10
7
  redirectUri?: string;
11
8
  scopes?: string[];
9
+ resource?: string;
12
10
  }
13
11
  export interface OAuthTokens {
14
12
  accessToken: string;
15
13
  refreshToken?: string;
16
14
  expiresAt?: number;
17
15
  tokenType: string;
16
+ scope?: string;
17
+ }
18
+ export interface OAuthAuthorizeOptions {
19
+ signal?: AbortSignal;
20
+ timeoutMs?: number;
21
+ openExternal?: (url: string) => Promise<void> | void;
22
+ fetch?: typeof fetch;
23
+ callbackHost?: "127.0.0.1";
24
+ /** Zero asks the OS for an ephemeral port. */
25
+ callbackPort?: number;
26
+ }
27
+ export interface OAuthRefreshOptions {
28
+ fetch?: typeof fetch;
29
+ now?: number;
30
+ }
31
+ export interface HardenedOAuthFetchOptions {
32
+ /** Maximum redirects followed after the initial request. */
33
+ maxRedirects?: number;
18
34
  }
19
35
  /**
20
- * Run the OAuth authorization code flow.
21
- * Opens a browser for user login and waits for the callback.
36
+ * Wrap fetch with OAuth-specific redirect handling. Every hop is validated;
37
+ * POST/Authorization requests never cross origins, so authorization codes,
38
+ * verifiers, refresh tokens, client secrets, and revocation tokens cannot be
39
+ * forwarded by an upstream 30x response.
22
40
  */
23
- export declare function authorize(config: OAuthConfig): Promise<OAuthTokens>;
41
+ export declare function createHardenedOAuthFetch(baseFetch?: typeof fetch, options?: HardenedOAuthFetchOptions): typeof fetch;
42
+ export declare function generatePKCE(): {
43
+ verifier: string;
44
+ challenge: string;
45
+ };
24
46
  /**
25
- * Refresh an access token using a refresh token.
47
+ * Run an OAuth authorization-code flow. The host owns browser launching and
48
+ * injects `openExternal`; core only listens on an ephemeral loopback port.
26
49
  */
27
- export declare function refreshToken(config: OAuthConfig, refreshTokenValue: string): Promise<OAuthTokens>;
50
+ export declare function authorize(config: OAuthConfig, options?: OAuthAuthorizeOptions): Promise<OAuthTokens>;
51
+ export declare function refreshToken(config: OAuthConfig, refreshTokenValue: string, options?: OAuthRefreshOptions): Promise<OAuthTokens>;