@cjhyy/code-shell-core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -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.
@@ -141,7 +141,10 @@ async function dispatchDreamTool(tc, toolRegistry, ctx, consumeWriteBudget) {
141
141
  }
142
142
  }
143
143
  try {
144
- 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 };
145
148
  const result = await toolRegistry.executeTool(tc.toolName, tc.args, { ctx: dreamCtx });
146
149
  if (result.isError)
147
150
  return result.error ?? `Error executing ${tc.toolName}`;
@@ -159,6 +162,12 @@ function checkDreamWriteGuard(tc, ctx) {
159
162
  error: `Error: dream loop may only write to scope "dream" or "user", got "${scope}".`,
160
163
  };
161
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
+ }
162
171
  const location = tc.args?.location === "global" ? "global" : "project";
163
172
  const mm = new MemoryManager({
164
173
  projectDir: location === "project" ? ctx.cwd : undefined,
@@ -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,
@@ -58,6 +58,9 @@ function validateOAuthRequestUrl(url) {
58
58
  export function createHardenedOAuthFetch(baseFetch = fetch, options = {}) {
59
59
  const maxRedirects = Math.max(0, Math.min(10, options.maxRedirects ?? 5));
60
60
  return (async (input, init) => {
61
+ // Bun and Node's undici declarations currently expose incompatible global
62
+ // Request overloads even though both accept the standard fetch input at
63
+ // runtime. Keep that ambient type conflict contained at this boundary.
61
64
  const initial = new Request(input, init);
62
65
  let currentUrl = new URL(initial.url);
63
66
  const initialLoopback = isLoopbackHostname(currentUrl.hostname);
@@ -69,7 +72,7 @@ export function createHardenedOAuthFetch(baseFetch = fetch, options = {}) {
69
72
  const secretBearing = (method !== "GET" && method !== "HEAD") || headers.has("authorization");
70
73
  for (let redirectCount = 0;; redirectCount++) {
71
74
  validateOAuthRequestUrl(currentUrl);
72
- const request = new Request(currentUrl, {
75
+ const request = new Request(currentUrl.toString(), {
73
76
  method,
74
77
  headers,
75
78
  body: body ? body.slice() : undefined,
@@ -15,19 +15,19 @@ export interface SessionMemoryEntry {
15
15
  /**
16
16
  * Save a session memory entry.
17
17
  */
18
- export declare function saveSessionMemory(entry: SessionMemoryEntry): void;
18
+ export declare function saveSessionMemory(entry: SessionMemoryEntry, baseDir?: string): void;
19
19
  /**
20
20
  * Load a session memory by session ID.
21
21
  */
22
- export declare function loadSessionMemory(sessionId: string): SessionMemoryEntry | null;
22
+ export declare function loadSessionMemory(sessionId: string, baseDir?: string): SessionMemoryEntry | null;
23
23
  /**
24
24
  * List all session memories, most recent first.
25
25
  */
26
- export declare function listSessionMemories(limit?: number): SessionMemoryEntry[];
26
+ export declare function listSessionMemories(limit?: number, baseDir?: string): SessionMemoryEntry[];
27
27
  /**
28
28
  * Search session memories by keyword.
29
29
  */
30
- export declare function searchSessionMemories(query: string): SessionMemoryEntry[];
30
+ export declare function searchSessionMemories(query: string, baseDir?: string): SessionMemoryEntry[];
31
31
  /**
32
32
  * Build a prompt for extracting session memory from a conversation.
33
33
  */
@@ -11,14 +11,17 @@ import { sortSessionMemoriesByRecency } from "./session-memory-sort.js";
11
11
  // Resolve per-call (NOT a module const): userHome() reads $HOME live, so a
12
12
  // relocated/test HOME redirects writes instead of pinning the real ~/.code-shell
13
13
  // at import time (bun freezes a module-level homedir() and never re-reads it).
14
- function memoryDir() {
15
- return join(userHome(), ".code-shell", "session-memories");
14
+ // `baseDir` is the explicit injection point (the `~/.code-shell`-equivalent
15
+ // root): when provided it wins over $HOME resolution — identity-scoped server
16
+ // deployments pass their per-user data root here.
17
+ function memoryDir(baseDir) {
18
+ return join(baseDir ?? join(userHome(), ".code-shell"), "session-memories");
16
19
  }
17
20
  /**
18
21
  * Save a session memory entry.
19
22
  */
20
- export function saveSessionMemory(entry) {
21
- const dir = memoryDir();
23
+ export function saveSessionMemory(entry, baseDir) {
24
+ const dir = memoryDir(baseDir);
22
25
  mkdirSync(dir, { recursive: true });
23
26
  const file = join(dir, `${entry.sessionId}.json`);
24
27
  writeFileSync(file, JSON.stringify(entry, null, 2), "utf-8");
@@ -26,8 +29,8 @@ export function saveSessionMemory(entry) {
26
29
  /**
27
30
  * Load a session memory by session ID.
28
31
  */
29
- export function loadSessionMemory(sessionId) {
30
- const file = join(memoryDir(), `${sessionId}.json`);
32
+ export function loadSessionMemory(sessionId, baseDir) {
33
+ const file = join(memoryDir(baseDir), `${sessionId}.json`);
31
34
  if (!existsSync(file))
32
35
  return null;
33
36
  try {
@@ -40,8 +43,8 @@ export function loadSessionMemory(sessionId) {
40
43
  /**
41
44
  * List all session memories, most recent first.
42
45
  */
43
- export function listSessionMemories(limit = 50) {
44
- const dir = memoryDir();
46
+ export function listSessionMemories(limit = 50, baseDir) {
47
+ const dir = memoryDir(baseDir);
45
48
  if (!existsSync(dir))
46
49
  return [];
47
50
  // Read all entries, then order by createdAt (not by filename — the filename
@@ -63,8 +66,8 @@ export function listSessionMemories(limit = 50) {
63
66
  /**
64
67
  * Search session memories by keyword.
65
68
  */
66
- export function searchSessionMemories(query) {
67
- const all = listSessionMemories(200);
69
+ export function searchSessionMemories(query, baseDir) {
70
+ const all = listSessionMemories(200, baseDir);
68
71
  const q = query.toLowerCase();
69
72
  return all.filter((m) => m.summary.toLowerCase().includes(q) ||
70
73
  m.keyTopics.some((t) => t.toLowerCase().includes(q)) ||
@@ -215,20 +215,21 @@ export declare class MemoryManager {
215
215
  now?: number;
216
216
  }): string;
217
217
  /**
218
- * Two-layer injection index (用户拍板). Merges GLOBAL (cross-project
219
- * experience) + PROJECT (this repo's facts) memories into a compact index —
220
- * one line per entry, name + description only, NO body. The model reads a
221
- * specific entry's full content on demand via MemoryRead (which records a
222
- * recall → drives TTL + UI visibility).
218
+ * Three-layer injection index (用户拍板). Merges GLOBAL (cross-project
219
+ * experience) + DIGITAL-HUMAN (portable profile experience) + PROJECT
220
+ * (this repo's facts) memories into a compact index one line per entry,
221
+ * name + description only, NO body.
223
222
  *
224
223
  * This is what fixes "global memory never shows up": global memories are now
225
224
  * injected alongside project ones, every session, regardless of cwd.
226
225
  *
227
- * Static because it must construct two managers (global = no projectDir,
228
- * project = with projectDir). `projectDir` undefined → only global is shown.
226
+ * Static because it must construct the managers for each configured layer.
227
+ * `projectDir` undefined no project layer; `profileDir` undefined → no
228
+ * digital-human layer.
229
229
  */
230
230
  static buildInjectionIndex(opts: {
231
231
  projectDir?: string;
232
+ profileDir?: string;
232
233
  baseDir?: string;
233
234
  maxAgeDays?: number;
234
235
  now?: number;
@@ -253,6 +254,24 @@ export declare class MemoryManager {
253
254
  * O(N²) re-read of every memory file on every save.
254
255
  */
255
256
  private ensureIndexCache;
257
+ /**
258
+ * Rewrite MEMORY.md from the CURRENT set of memory files on disk, under a
259
+ * cross-process lock.
260
+ *
261
+ * The in-memory `indexCache` is a per-instance optimisation, and several
262
+ * managers exist for the same directory (desktop main, agent worker, TUI, a
263
+ * second desktop instance). Writing the cache out verbatim meant a stale
264
+ * snapshot clobbered whatever another writer had added:
265
+ *
266
+ * A saves a → B loads {a}, saves b → A still holds {a}, saves c
267
+ * → files a, b, c all exist, but MEMORY.md lists only a and c.
268
+ *
269
+ * The individual `<name>.md` files are the source of truth; MEMORY.md is a
270
+ * derived index. So rather than trusting any cache, re-derive it from disk
271
+ * inside the lock. `pending` carries this writer's own change, which may not
272
+ * be visible on disk yet (a delete moves the file to trash first, a save
273
+ * writes it first) — it is applied on top of the freshly scanned set.
274
+ */
256
275
  private writeIndex;
257
276
  private generateId;
258
277
  private availableFileNameForId;