@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
@@ -14,6 +14,22 @@ import { isCronExpression, parseCronExpression, nextCronTime } from "./cron-expr
14
14
  * normal timer jitter, while still catching a multi-minute/hour sleep drift.
15
15
  */
16
16
  const CRON_MISFIRE_GRACE_MS = 90_000;
17
+ /**
18
+ * Largest delay a Node/Electron timer accepts (2^31 - 1 ms, ~24.8 days).
19
+ *
20
+ * Above this, `setTimeout` does not wait longer — it warns
21
+ * (`TimeoutOverflowWarning`) and clamps the delay to **1ms**, so a long
22
+ * schedule fired instantly instead of far in the future. `armAt()` sleeps in
23
+ * chunks no larger than this.
24
+ */
25
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
26
+ /**
27
+ * Hard ceiling on a schedule interval: ~10 years. Anything beyond this is far
28
+ * more likely a unit mistake (passing microseconds, or a raw epoch timestamp as
29
+ * "milliseconds from now") than a real intent, and `nextRun` bookkeeping should
30
+ * not silently carry a nonsense value.
31
+ */
32
+ const MAX_SCHEDULE_INTERVAL_MS = 10 * 365 * 24 * 60 * 60 * 1000;
17
33
  /**
18
34
  * True when a cron timer fired too far past its scheduled instant to be a
19
35
  * legitimate on-time run — i.e. the host slept through the scheduled time and
@@ -39,6 +55,7 @@ export class CronScheduler {
39
55
  runningControllers = new Map();
40
56
  nextId = 1;
41
57
  onExecute;
58
+ onJobEvent;
42
59
  /** Optional persistence backend. When set, every create/delete/pause/resume
43
60
  * writes the full job set to disk so jobs survive a restart. */
44
61
  store;
@@ -70,6 +87,24 @@ export class CronScheduler {
70
87
  setExecutor(fn) {
71
88
  this.onExecute = fn;
72
89
  }
90
+ /**
91
+ * Observe job execution lifecycle
92
+ * (job_start → job_end | job_stopped | job_cancelled | job_error). Hosts
93
+ * wire this to their notification surface so scheduled runs — especially
94
+ * failures, which `fire()` otherwise swallows — are no longer silent.
95
+ * Listener errors are swallowed; observation never affects scheduling.
96
+ */
97
+ setJobEventListener(listener) {
98
+ this.onJobEvent = listener;
99
+ }
100
+ emitJobEvent(event) {
101
+ try {
102
+ this.onJobEvent?.(event);
103
+ }
104
+ catch {
105
+ /* observers must not affect the tick loop */
106
+ }
107
+ }
73
108
  /**
74
109
  * Abort the in-flight run of `jobId`, if any. Aborts the AbortSignal handed
75
110
  * to the executor (which Engine.run cooperates with — it resolves with
@@ -268,6 +303,7 @@ export class CronScheduler {
268
303
  ...(opts?.permissionLevel !== undefined ? { permissionLevel: opts.permissionLevel } : {}),
269
304
  ...(opts?.once === true ? { once: true } : {}),
270
305
  ...(opts?.resumeSessionId !== undefined ? { resumeSessionId: opts.resumeSessionId } : {}),
306
+ ...(opts?.templateSource !== undefined ? { templateSource: opts.templateSource } : {}),
271
307
  };
272
308
  this.refreshNextRunForDisplay(job);
273
309
  return { jobs: [...jobs, job], result: job };
@@ -289,6 +325,7 @@ export class CronScheduler {
289
325
  ...(opts?.permissionLevel !== undefined ? { permissionLevel: opts.permissionLevel } : {}),
290
326
  ...(opts?.once === true ? { once: true } : {}),
291
327
  ...(opts?.resumeSessionId !== undefined ? { resumeSessionId: opts.resumeSessionId } : {}),
328
+ ...(opts?.templateSource !== undefined ? { templateSource: opts.templateSource } : {}),
292
329
  };
293
330
  this.jobs.set(id, job);
294
331
  this.arm(job);
@@ -525,22 +562,53 @@ export class CronScheduler {
525
562
  this.armInterval(job, intervalMs, nextRun);
526
563
  }
527
564
  }
565
+ /**
566
+ * Wait until an ABSOLUTE instant, in `setTimeout`-safe chunks.
567
+ *
568
+ * Node/Electron timers take a 32-bit signed delay: anything above
569
+ * 2,147,483,647ms (~24.8 days) does NOT wait longer — it emits
570
+ * `TimeoutOverflowWarning` and is coerced to **1ms**. A `30d` interval or a
571
+ * monthly cron therefore fired almost immediately and then kept re-firing,
572
+ * because the next absolute target was still out of range.
573
+ *
574
+ * So never hand a raw long delay to setTimeout. Sleep at most
575
+ * MAX_TIMER_DELAY_MS at a time and re-check the clock; only run `onDue` once
576
+ * the real instant has arrived. Chunked waiting also self-corrects for clock
577
+ * drift and sleep/wake, since each hop recomputes from `Date.now()`.
578
+ */
579
+ armAt(jobId, scheduledFor, onDue) {
580
+ const step = () => {
581
+ const remaining = scheduledFor - Date.now();
582
+ if (remaining <= 0) {
583
+ this.timers.delete(jobId);
584
+ onDue();
585
+ return;
586
+ }
587
+ const timer = setTimeout(step, Math.min(remaining, MAX_TIMER_DELAY_MS));
588
+ this.timers.set(jobId, timer);
589
+ };
590
+ step();
591
+ }
528
592
  armInterval(job, intervalMs, scheduledFor) {
529
593
  job.nextRun = scheduledFor;
530
- const delay = Math.max(0, scheduledFor - Date.now());
531
- const timer = setTimeout(() => {
532
- this.timers.delete(job.id);
594
+ this.armAt(job.id, scheduledFor, () => {
533
595
  const rearm = () => {
534
596
  if (!this.executionEnabled || !job.enabled || !this.jobs.has(job.id))
535
597
  return;
536
598
  this.armInterval(job, intervalMs, this.nextIntervalRunAfter(scheduledFor, intervalMs, Date.now()));
537
599
  };
600
+ // Interval jobs get the same misfire semantics cron already had: if we
601
+ // wake far PAST the target (host slept through it), skip this occurrence
602
+ // and re-arm on the next absolute slot instead of firing late.
603
+ if (isCronMisfire(scheduledFor, Date.now())) {
604
+ rearm();
605
+ return;
606
+ }
538
607
  void this.fire(job, rearm).then((ran) => {
539
608
  if (!ran)
540
609
  rearm();
541
610
  });
542
- }, delay);
543
- this.timers.set(job.id, timer);
611
+ });
544
612
  }
545
613
  nextIntervalRunAfter(scheduledFor, intervalMs, now) {
546
614
  let next = scheduledFor + intervalMs;
@@ -560,9 +628,7 @@ export class CronScheduler {
560
628
  }
561
629
  job.nextRun = next;
562
630
  const scheduledFor = next;
563
- const delay = Math.max(0, next - Date.now());
564
- const timer = setTimeout(() => {
565
- this.timers.delete(job.id);
631
+ this.armAt(job.id, scheduledFor, () => {
566
632
  // Misfire guard for sleep/wake drift. A setTimeout pauses while the host
567
633
  // sleeps, then fires the instant the machine wakes — which can be hours
568
634
  // off the scheduled wall-clock (observed: a `0 9 * * *` job running at
@@ -586,8 +652,7 @@ export class CronScheduler {
586
652
  if (!ran)
587
653
  rearm();
588
654
  });
589
- }, delay);
590
- this.timers.set(job.id, timer);
655
+ });
591
656
  }
592
657
  clearTimer(id) {
593
658
  const t = this.timers.get(id);
@@ -626,11 +691,33 @@ export class CronScheduler {
626
691
  afterStats();
627
692
  // Persist updated run stats so runCount/lastRun/nextRun survive a restart.
628
693
  this.persistRunStats(job);
694
+ const startedAt = Date.now();
695
+ this.emitJobEvent({ type: "job_start", job });
629
696
  try {
630
- await this.onExecute?.(job, controller.signal);
697
+ const outcome = await this.onExecute?.(job, controller.signal);
698
+ this.emitJobEvent({
699
+ type: controller.signal.aborted
700
+ ? "job_cancelled"
701
+ : outcome?.stoppedReason
702
+ ? "job_stopped"
703
+ : "job_end",
704
+ job,
705
+ durationMs: Date.now() - startedAt,
706
+ ...(outcome?.stoppedReason ? { reason: outcome.stoppedReason } : {}),
707
+ });
631
708
  }
632
- catch {
633
- // Job execution failed continue scheduling.
709
+ catch (err) {
710
+ // Cancellation is an owner decision, not a job failure. A transport may
711
+ // reject on AbortSignal instead of resolving, so classify from the
712
+ // scheduler-owned signal on both terminal paths.
713
+ this.emitJobEvent({
714
+ type: controller.signal.aborted ? "job_cancelled" : "job_error",
715
+ job,
716
+ durationMs: Date.now() - startedAt,
717
+ ...(controller.signal.aborted
718
+ ? {}
719
+ : { error: err instanceof Error ? err.message : String(err) }),
720
+ });
634
721
  }
635
722
  finally {
636
723
  // The executor may have recorded lastRunId on the job. Persist only run
@@ -651,13 +738,15 @@ export class CronScheduler {
651
738
  }
652
739
  }
653
740
  /** Validate a schedule string (interval or cron expr) without scheduling. Throws on invalid. */
654
- function validateSchedule(schedule, timezone) {
741
+ export function validateSchedule(schedule, timezone) {
742
+ // A supplied timezone must always be a real IANA zone, even for interval
743
+ // schedules where it is currently display-only. Persisting inert garbage
744
+ // would later become executable if the schedule is edited to cron.
745
+ if (timezone !== undefined) {
746
+ new Intl.DateTimeFormat("en-US", { timeZone: timezone });
747
+ }
655
748
  if (isCronExpression(schedule)) {
656
749
  parseCronExpression(schedule); // throws on bad fields
657
- // Validate timezone is acceptable to Intl (throws RangeError if not).
658
- if (timezone !== undefined) {
659
- new Intl.DateTimeFormat("en-US", { timeZone: timezone });
660
- }
661
750
  return;
662
751
  }
663
752
  parseSchedule(schedule); // throws on bad interval
@@ -671,6 +760,17 @@ function validateSchedule(schedule, timezone) {
671
760
  * 10 minutes (review-2026-05-30).
672
761
  */
673
762
  export function parseSchedule(schedule) {
763
+ // Reject anything that is not a finite, safe, in-range interval. Long values
764
+ // are no longer an overflow hazard (armAt sleeps in chunks), but a value that
765
+ // cannot survive arithmetic — beyond Number.MAX_SAFE_INTEGER, or an absurd
766
+ // "10 years from now" — is a caller mistake, not a schedule. Failing here
767
+ // keeps `nextRun` and the re-arm math meaningful.
768
+ const accept = (ms) => {
769
+ if (!Number.isSafeInteger(ms) || ms <= 0 || ms > MAX_SCHEDULE_INTERVAL_MS) {
770
+ throw new Error(`Invalid schedule: ${JSON.stringify(schedule)}. Interval must be between 1ms and ${MAX_SCHEDULE_INTERVAL_MS}ms (~10 years).`);
771
+ }
772
+ return ms;
773
+ };
674
774
  const match = schedule.match(/^(\d+)(s|m|h|d)$/);
675
775
  if (match) {
676
776
  const value = parseInt(match[1], 10);
@@ -680,13 +780,13 @@ export function parseSchedule(schedule) {
680
780
  if (value > 0) {
681
781
  switch (match[2]) {
682
782
  case "s":
683
- return value * 1000;
783
+ return accept(value * 1000);
684
784
  case "m":
685
- return value * 60 * 1000;
785
+ return accept(value * 60 * 1000);
686
786
  case "h":
687
- return value * 60 * 60 * 1000;
787
+ return accept(value * 60 * 60 * 1000);
688
788
  case "d":
689
- return value * 24 * 60 * 60 * 1000;
789
+ return accept(value * 24 * 60 * 60 * 1000);
690
790
  }
691
791
  }
692
792
  }
@@ -695,7 +795,7 @@ export function parseSchedule(schedule) {
695
795
  if (/^\d+$/.test(schedule)) {
696
796
  const ms = parseInt(schedule, 10);
697
797
  if (ms > 0)
698
- return ms;
798
+ return accept(ms);
699
799
  }
700
800
  throw new Error(`Invalid schedule: ${JSON.stringify(schedule)}. Use "30s"/"5m"/"1h"/"1d" or a positive number of milliseconds.`);
701
801
  }
@@ -12,8 +12,12 @@
12
12
  * with a stale in-memory snapshot.
13
13
  */
14
14
  import type { CronJob } from "./scheduler.js";
15
- /** Default global location. Mirrors FileRunStore's `~/.code-shell/...` layout. */
16
- export declare function defaultCronStorePath(): string;
15
+ /**
16
+ * Default global location. Mirrors FileRunStore's `~/.code-shell/...` layout.
17
+ * An explicit `root` (a `~/.code-shell`-equivalent data root) overrides the
18
+ * default; absent → today's behavior byte-for-byte.
19
+ */
20
+ export declare function defaultCronStorePath(root?: string): string;
17
21
  export declare class CronStore {
18
22
  private readonly file;
19
23
  constructor(file?: string);
@@ -16,9 +16,13 @@ import { dirname, join } from "node:path";
16
16
  import { homedir } from "node:os";
17
17
  import { logger } from "../logging/logger.js";
18
18
  import { lockSync } from "../utils/lockfile.js";
19
- /** Default global location. Mirrors FileRunStore's `~/.code-shell/...` layout. */
20
- export function defaultCronStorePath() {
21
- return join(homedir(), ".code-shell", "cron.json");
19
+ /**
20
+ * Default global location. Mirrors FileRunStore's `~/.code-shell/...` layout.
21
+ * An explicit `root` (a `~/.code-shell`-equivalent data root) overrides the
22
+ * default; absent → today's behavior byte-for-byte.
23
+ */
24
+ export function defaultCronStorePath(root) {
25
+ return join(root ?? join(homedir(), ".code-shell"), "cron.json");
22
26
  }
23
27
  export class CronStore {
24
28
  file;
@@ -0,0 +1,109 @@
1
+ import type { AgentPreset } from "../preset/index.js";
2
+ import type { BuiltinTool } from "../tool-system/builtin/index.js";
3
+ import type { SandboxBackend } from "../tool-system/sandbox/index.js";
4
+ import type { SessionManager } from "../session/session-manager.js";
5
+ import type { ArtifactKind, ArtifactRole } from "../run/types.js";
6
+ import type { HookEventName } from "../hooks/events.js";
7
+ import type { HookHandler } from "../hooks/registry.js";
8
+ /**
9
+ * A host-installable slice of agent behavior.
10
+ *
11
+ * Core owns the lifecycle and execution contracts; product packages contribute
12
+ * tools, presets, and prompt text through this boundary. Modules are plain data
13
+ * so a host can compose them per Engine without mutating process-global state.
14
+ */
15
+ export interface CapabilityModule {
16
+ id: string;
17
+ tools?: readonly BuiltinTool[];
18
+ presets?: readonly AgentPreset[];
19
+ /** Preset selected when this capability is installed and the host did not choose one. */
20
+ defaultPreset?: string;
21
+ promptSections?: Readonly<Record<string, string>>;
22
+ /** Volatile, capability-owned context appended after the cacheable prompt prefix. */
23
+ dynamicContextProviders?: readonly CapabilityDynamicContextProvider[];
24
+ /** Optional project boundary for layered instruction discovery. */
25
+ instructionBoundary?: CapabilityInstructionBoundaryFinder;
26
+ /** Runtime services exposed only to this capability's tools. */
27
+ createToolService?(host: CapabilityToolServiceHost): unknown;
28
+ /** Capability-specific run artifact recognition. */
29
+ artifactDetectors?: readonly CapabilityArtifactDetector[];
30
+ /** Pre-mutation snapshot targets for capability-owned compound file tools. */
31
+ fileHistory?: readonly CapabilityFileHistoryContribution[];
32
+ /** Optional validation for persisted product-specific workspace pointers. */
33
+ sessionWorkspace?: SessionWorkspaceCapability;
34
+ /** Trusted in-process handlers joined to this Engine's normal hook chain. */
35
+ engineHooks?: readonly CapabilityEngineHookContribution[];
36
+ adjustToolSelection?(names: Set<string>, context: CapabilityToolSelectionContext): void;
37
+ }
38
+ export interface CapabilityEngineHookContribution {
39
+ event: HookEventName;
40
+ handler: HookHandler;
41
+ priority?: number;
42
+ name?: string;
43
+ }
44
+ export interface ResolvedCapabilityEngineHook extends CapabilityEngineHookContribution {
45
+ capabilityId: string;
46
+ priority: number;
47
+ name: string;
48
+ }
49
+ export interface CapabilityDynamicContext {
50
+ cwd: string;
51
+ preset: AgentPreset;
52
+ }
53
+ export type CapabilityDynamicContextProvider = (context: CapabilityDynamicContext) => string | undefined | Promise<string | undefined>;
54
+ export type CapabilityInstructionBoundaryFinder = (cwd: string) => string | null;
55
+ /** Generic host services from which a capability may build its private tool service. */
56
+ export interface CapabilityToolServiceHost {
57
+ readonly isSubAgent: boolean;
58
+ readonly settings: {
59
+ get(): unknown;
60
+ getForScope(scope: "user" | "project", cwd?: string): unknown;
61
+ };
62
+ resolveSandbox(cwd: string): Promise<SandboxBackend>;
63
+ readShellEnv(cwd?: string): Record<string, string> | undefined;
64
+ getSessionManager(): SessionManager;
65
+ }
66
+ export interface CapabilityArtifact {
67
+ kind: ArtifactKind;
68
+ role: ArtifactRole;
69
+ title: string;
70
+ locator: string;
71
+ metadata?: Record<string, unknown>;
72
+ }
73
+ export interface CapabilityArtifactDetectionContext {
74
+ toolName: string;
75
+ args: Record<string, unknown>;
76
+ resultText?: string;
77
+ }
78
+ export type CapabilityArtifactDetector = (context: CapabilityArtifactDetectionContext) => CapabilityArtifact | readonly CapabilityArtifact[] | undefined;
79
+ export interface CapabilityToolSelectionContext {
80
+ preset: string;
81
+ host?: string;
82
+ }
83
+ export interface SessionWorkspaceCapability {
84
+ validateRoot(root: string): Promise<boolean>;
85
+ branchExists(mainRoot: string, branch: string): Promise<boolean>;
86
+ }
87
+ export interface CapabilityFileHistoryContribution {
88
+ toolName: string;
89
+ resolveTargets(args: Record<string, unknown>, cwd: string): readonly string[];
90
+ }
91
+ /**
92
+ * Install a capability at a process composition root (CLI/desktop worker).
93
+ * Library consumers should prefer EngineConfig.capabilities for isolation.
94
+ */
95
+ export declare function registerCapability(capability: CapabilityModule): void;
96
+ /** Primarily useful for isolated hosts and tests that own their process. */
97
+ export declare function unregisterCapability(id: string): void;
98
+ export declare function listRegisteredCapabilities(): CapabilityModule[];
99
+ /** Merge process-installed and per-Engine modules, rejecting ambiguous IDs. */
100
+ export declare function resolveCapabilities(local?: readonly CapabilityModule[]): CapabilityModule[];
101
+ export declare function composeToolCatalog(coreTools: readonly BuiltinTool[], capabilities: readonly CapabilityModule[], extensionModules?: readonly {
102
+ catalogTools?: readonly BuiltinTool[];
103
+ }[]): BuiltinTool[];
104
+ export declare function composePromptSections(capabilities: readonly CapabilityModule[]): Record<string, string>;
105
+ export declare function composeDynamicContextProviders(capabilities: readonly CapabilityModule[]): CapabilityDynamicContextProvider[];
106
+ export declare function composeArtifactDetectors(capabilities: readonly CapabilityModule[]): CapabilityArtifactDetector[];
107
+ /** Normalize code hooks with deterministic names and a product-module priority. */
108
+ export declare function composeCapabilityEngineHooks(capabilities: readonly CapabilityModule[]): ResolvedCapabilityEngineHook[];
109
+ export declare function resolveInstructionBoundary(cwd: string, capabilities: readonly CapabilityModule[]): string | null;
@@ -0,0 +1,80 @@
1
+ const installedCapabilities = new Map();
2
+ /**
3
+ * Install a capability at a process composition root (CLI/desktop worker).
4
+ * Library consumers should prefer EngineConfig.capabilities for isolation.
5
+ */
6
+ export function registerCapability(capability) {
7
+ const existing = installedCapabilities.get(capability.id);
8
+ if (existing === capability)
9
+ return;
10
+ if (existing)
11
+ throw new Error(`Capability '${capability.id}' is already registered`);
12
+ installedCapabilities.set(capability.id, capability);
13
+ }
14
+ /** Primarily useful for isolated hosts and tests that own their process. */
15
+ export function unregisterCapability(id) {
16
+ installedCapabilities.delete(id);
17
+ }
18
+ export function listRegisteredCapabilities() {
19
+ return [...installedCapabilities.values()];
20
+ }
21
+ /** Merge process-installed and per-Engine modules, rejecting ambiguous IDs. */
22
+ export function resolveCapabilities(local = []) {
23
+ const resolved = new Map(installedCapabilities);
24
+ for (const capability of local) {
25
+ const existing = resolved.get(capability.id);
26
+ if (existing && existing !== capability) {
27
+ throw new Error(`Capability '${capability.id}' was provided more than once`);
28
+ }
29
+ resolved.set(capability.id, capability);
30
+ }
31
+ return [...resolved.values()];
32
+ }
33
+ export function composeToolCatalog(coreTools, capabilities, extensionModules = []) {
34
+ const catalog = new Map();
35
+ for (const tool of [
36
+ ...coreTools,
37
+ ...capabilities.flatMap((capability) => [...(capability.tools ?? [])]),
38
+ ...extensionModules.flatMap((module) => [...(module.catalogTools ?? [])]),
39
+ ]) {
40
+ const name = tool.definition.name;
41
+ if (catalog.has(name))
42
+ throw new Error(`Tool '${name}' is contributed more than once`);
43
+ catalog.set(name, tool);
44
+ }
45
+ return [...catalog.values()];
46
+ }
47
+ export function composePromptSections(capabilities) {
48
+ const sections = {};
49
+ for (const capability of capabilities) {
50
+ for (const [name, content] of Object.entries(capability.promptSections ?? {})) {
51
+ if (name in sections)
52
+ throw new Error(`Prompt section '${name}' is contributed more than once`);
53
+ sections[name] = content;
54
+ }
55
+ }
56
+ return sections;
57
+ }
58
+ export function composeDynamicContextProviders(capabilities) {
59
+ return capabilities.flatMap((capability) => [...(capability.dynamicContextProviders ?? [])]);
60
+ }
61
+ export function composeArtifactDetectors(capabilities) {
62
+ return capabilities.flatMap((capability) => [...(capability.artifactDetectors ?? [])]);
63
+ }
64
+ /** Normalize code hooks with deterministic names and a product-module priority. */
65
+ export function composeCapabilityEngineHooks(capabilities) {
66
+ return capabilities.flatMap((capability) => (capability.engineHooks ?? []).map((hook, index) => ({
67
+ ...hook,
68
+ capabilityId: capability.id,
69
+ priority: hook.priority ?? 20,
70
+ name: `capability:${capability.id}:${hook.name ?? `${hook.event}:${index}`}`,
71
+ })));
72
+ }
73
+ export function resolveInstructionBoundary(cwd, capabilities) {
74
+ for (const capability of capabilities) {
75
+ const boundary = capability.instructionBoundary?.(cwd);
76
+ if (boundary)
77
+ return boundary;
78
+ }
79
+ return null;
80
+ }
@@ -11,6 +11,7 @@
11
11
  * fold through here so "project on overrides global off" holds everywhere.
12
12
  */
13
13
  import { SettingsManager } from "../settings/manager.js";
14
+ import type { CapabilityOverrides } from "../settings/schema.js";
14
15
  export interface EffectiveDisabledLists {
15
16
  disabledSkills: string[];
16
17
  disabledPlugins: string[];
@@ -22,4 +23,4 @@ export interface EffectiveDisabledLists {
22
23
  * Compute the effective disabled lists for `cwd`. Never throws — any read
23
24
  * error falls back to empty lists (same contract as Engine.readDisabledLists).
24
25
  */
25
- export declare function computeEffectiveDisabledLists(sm: SettingsManager, cwd: string | undefined): EffectiveDisabledLists;
26
+ export declare function computeEffectiveDisabledLists(sm: SettingsManager, cwd: string | undefined, explicitProfileOverrides?: CapabilityOverrides): EffectiveDisabledLists;
@@ -13,20 +13,18 @@
13
13
  import { noRepoDir } from "../settings/manager.js";
14
14
  import { scanSkills } from "../skills/scanner.js";
15
15
  import { readInstalledPlugins } from "../plugins/installedPlugins.js";
16
- import { effectiveDisabledList, whitelistDisabledList } from "./overlay.js";
16
+ import { effectiveDisabledList, effectiveProjectOverrides, whitelistDisabledList, } from "./overlay.js";
17
17
  /**
18
18
  * Compute the effective disabled lists for `cwd`. Never throws — any read
19
19
  * error falls back to empty lists (same contract as Engine.readDisabledLists).
20
20
  */
21
- export function computeEffectiveDisabledLists(sm, cwd) {
21
+ export function computeEffectiveDisabledLists(sm, cwd, explicitProfileOverrides) {
22
22
  try {
23
23
  const settings = sm.get();
24
24
  // Read the project overlay UNMERGED (getForScope), not the merged get(),
25
25
  // so tri-state inheritance survives. No cwd / no overlay → the baseline
26
26
  // is returned unchanged (zero regression).
27
- const overrides = cwd
28
- ? sm.getForScope("project", cwd).capabilityOverrides
29
- : undefined;
27
+ const overrides = effectiveProjectOverrides(sm, cwd, explicitProfileOverrides);
30
28
  // no-repo "conversation" scope: INVERT skill/plugin filtering to a
31
29
  // whitelist (default-all-off, only explicit "on" survives). Only this
32
30
  // fixed cwd flips; every real project keeps the denylist below. agent/
@@ -12,8 +12,9 @@
12
12
  * See docs/superpowers/specs/2026-06-01-project-scoped-capabilities-and-session-isolation-design.md
13
13
  */
14
14
  import type { CapabilityOverride, CapabilityOverrides } from "../settings/schema.js";
15
+ import type { SettingsManager } from "../settings/manager.js";
15
16
  import type { CapabilityDescriptor } from "./types.js";
16
- /** Buckets in capabilityOverrides: "skills" | "plugins" | "agents" | "mcp" | "builtin". */
17
+ /** Buckets in capabilityOverrides. */
17
18
  export type OverrideBucket = keyof NonNullable<CapabilityOverrides>;
18
19
  /** Apply a tri-state override to a baseline. inherit/garbage → baseline. */
19
20
  export declare function applyOverride(globalEnabled: boolean, override?: CapabilityOverride): boolean;
@@ -62,3 +63,15 @@ export declare function effectiveBuiltinLists(globalEnabled: string[], globalDis
62
63
  enabledBuiltinTools: string[];
63
64
  disabledBuiltinTools: string[];
64
65
  };
66
+ /**
67
+ * 合并两层三态 overlay:`top`(用户手写 capabilityOverrides)按 key 赢过
68
+ * `base`(profile.overrides 快照)。Pet visibility 属于 host/project 策略,
69
+ * 不可由 portable profile 注入;只保留 top 的直接项目设置。
70
+ */
71
+ export declare function mergeCapabilityOverrides(base: CapabilityOverrides | undefined, top: CapabilityOverrides | undefined): CapabilityOverrides | undefined;
72
+ /**
73
+ * 项目 overrides 的唯一读取咽喉:profile 快照垫底、用户手写覆盖。
74
+ * 所有折叠消费方(engine / disabled-lists / capability service)必须
75
+ * 经这里读,不得再直接 getForScope().capabilityOverrides。
76
+ */
77
+ export declare function effectiveProjectOverrides(settings: Pick<SettingsManager, "getForScope">, cwd: string | undefined, explicitProfileOverrides?: CapabilityOverrides): CapabilityOverrides | undefined;
@@ -114,3 +114,43 @@ export function effectiveBuiltinLists(globalEnabled, globalDisabled, bucket) {
114
114
  disabledBuiltinTools: [...disabled],
115
115
  };
116
116
  }
117
+ const PROFILE_MERGED_OVERRIDE_BUCKETS = [
118
+ "skills",
119
+ "plugins",
120
+ "agents",
121
+ "mcp",
122
+ "builtin",
123
+ "pluginHooks",
124
+ ];
125
+ /**
126
+ * 合并两层三态 overlay:`top`(用户手写 capabilityOverrides)按 key 赢过
127
+ * `base`(profile.overrides 快照)。Pet visibility 属于 host/project 策略,
128
+ * 不可由 portable profile 注入;只保留 top 的直接项目设置。
129
+ */
130
+ export function mergeCapabilityOverrides(base, top) {
131
+ const merged = {};
132
+ for (const bucket of PROFILE_MERGED_OVERRIDE_BUCKETS) {
133
+ const combined = { ...(base?.[bucket] ?? {}), ...(top?.[bucket] ?? {}) };
134
+ if (Object.keys(combined).length > 0)
135
+ merged[bucket] = combined;
136
+ }
137
+ if (top?.pet && Object.keys(top.pet).length > 0)
138
+ merged.pet = { ...top.pet };
139
+ return Object.keys(merged).length > 0 ? merged : undefined;
140
+ }
141
+ /**
142
+ * 项目 overrides 的唯一读取咽喉:profile 快照垫底、用户手写覆盖。
143
+ * 所有折叠消费方(engine / disabled-lists / capability service)必须
144
+ * 经这里读,不得再直接 getForScope().capabilityOverrides。
145
+ */
146
+ export function effectiveProjectOverrides(settings, cwd, explicitProfileOverrides) {
147
+ if (!cwd)
148
+ return undefined;
149
+ try {
150
+ const scoped = settings.getForScope("project", cwd);
151
+ return mergeCapabilityOverrides(explicitProfileOverrides ?? scoped.profile?.overrides, scoped.capabilityOverrides);
152
+ }
153
+ catch {
154
+ return undefined;
155
+ }
156
+ }
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import { CapabilityNotFoundError } from "./types.js";
15
15
  import { projectBuiltin, projectMcp, projectSkills, projectPlugins, projectAgents, } from "./project.js";
16
- import { applyOverride, bucketForKind, overrideTokenForId, overrideFor } from "./overlay.js";
16
+ import { applyOverride, bucketForKind, effectiveProjectOverrides, overrideTokenForId, overrideFor, } from "./overlay.js";
17
17
  export class CapabilityService {
18
18
  deps;
19
19
  constructor(deps) {
@@ -59,19 +59,21 @@ export class CapabilityService {
59
59
  disabledAgents: s.disabledAgents ?? [],
60
60
  }),
61
61
  ];
62
- const overrides = cwd
62
+ const userOverrides = cwd
63
63
  ? this.deps.settings.getForScope("project", cwd).capabilityOverrides
64
64
  : undefined;
65
+ const foldedOverrides = cwd ? effectiveProjectOverrides(this.deps.settings, cwd) : undefined;
65
66
  return base.map((d) => {
66
67
  const globalEnabled = d.enabled;
67
68
  const token = overrideTokenForId(d.id);
68
- const ov = cwd ? overrideFor(overrides, d.kind, token) : undefined;
69
+ const ov = cwd ? overrideFor(foldedOverrides, d.kind, token) : undefined;
70
+ const userOverride = cwd ? overrideFor(userOverrides, d.kind, token) : undefined;
69
71
  const enabled = applyOverride(globalEnabled, ov);
70
72
  return {
71
73
  ...d,
72
74
  enabled,
73
75
  globalEnabled,
74
- projectOverride: ov,
76
+ projectOverride: userOverride,
75
77
  effectiveSource: ov ? "project" : cwd ? "default" : "user",
76
78
  };
77
79
  });
@@ -37,7 +37,7 @@ import { type ValidatedSettings } from "../settings/schema.js";
37
37
  * reached session engines (slice arrived with only permissionMode+cwd).
38
38
  */
39
39
  export declare function resolveSessionAgentConfig(slice: EngineConfigSlice, settings: ValidatedSettings): {
40
- preset: string;
40
+ preset: string | undefined;
41
41
  customSystemPrompt: string | undefined;
42
42
  appendSystemPrompt: string | undefined;
43
43
  };