@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.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 (528) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +21 -3
  3. package/dist/agent/agent-definition-registry.js +49 -18
  4. package/dist/agent/agent-definition.d.ts +32 -0
  5. package/dist/agent/agent-definition.js +49 -4
  6. package/dist/arena/arena.js +11 -12
  7. package/dist/arena/context/context-tools.js +47 -6
  8. package/dist/arena/context/within-root.d.ts +7 -0
  9. package/dist/arena/context/within-root.js +15 -0
  10. package/dist/arena/iterate/phases/argue.js +8 -2
  11. package/dist/arena/iterate/phases/revise.js +1 -1
  12. package/dist/arena/iterate/phases/tournament.js +3 -3
  13. package/dist/arena/ledger.js +9 -1
  14. package/dist/arena/phases/adjudication.js +1 -4
  15. package/dist/arena/phases/build-consensus.js +1 -4
  16. package/dist/arena/phases/cross-review.js +2 -8
  17. package/dist/arena/phases/debate-rounds.js +1 -4
  18. package/dist/arena/phases/participant-research.js +1 -4
  19. package/dist/arena/phases/planning-detail-expansion.js +8 -10
  20. package/dist/arena/planner.js +0 -1
  21. package/dist/arena/providers/docs.d.ts +1 -0
  22. package/dist/arena/providers/docs.js +5 -2
  23. package/dist/arena/providers/repo.d.ts +1 -0
  24. package/dist/arena/providers/repo.js +5 -2
  25. package/dist/arena/strategies/utils.d.ts +1 -4
  26. package/dist/arena/strategies/utils.js +7 -51
  27. package/dist/arena/transitions.d.ts +7 -2
  28. package/dist/arena/transitions.js +9 -4
  29. package/dist/arena/types.d.ts +8 -2
  30. package/dist/automation/cron-expr.d.ts +41 -0
  31. package/dist/automation/cron-expr.js +169 -0
  32. package/dist/automation/index.d.ts +41 -0
  33. package/dist/automation/index.js +39 -0
  34. package/dist/automation/runner.d.ts +84 -0
  35. package/dist/automation/runner.js +92 -0
  36. package/dist/automation/scheduler.d.ts +194 -0
  37. package/dist/automation/scheduler.js +623 -0
  38. package/dist/automation/store.d.ts +39 -0
  39. package/dist/automation/store.js +122 -0
  40. package/dist/automation/write-policy.d.ts +34 -0
  41. package/dist/automation/write-policy.js +113 -0
  42. package/dist/automation/write-run.d.ts +51 -0
  43. package/dist/automation/write-run.js +38 -0
  44. package/dist/capability-control/disabled-lists.d.ts +25 -0
  45. package/dist/capability-control/disabled-lists.js +57 -0
  46. package/dist/capability-control/index.d.ts +5 -0
  47. package/dist/capability-control/index.js +3 -0
  48. package/dist/capability-control/overlay.d.ts +64 -0
  49. package/dist/capability-control/overlay.js +116 -0
  50. package/dist/capability-control/project.d.ts +65 -0
  51. package/dist/capability-control/project.js +147 -0
  52. package/dist/capability-control/service.d.ts +70 -0
  53. package/dist/capability-control/service.js +147 -0
  54. package/dist/capability-control/types.d.ts +62 -0
  55. package/dist/capability-control/types.js +17 -0
  56. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  57. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  58. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  59. package/dist/cc-orchestrator/cc-capability.js +53 -0
  60. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  61. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  62. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  63. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  64. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  65. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  66. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  67. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  68. package/dist/cc-orchestrator/index.d.ts +8 -0
  69. package/dist/cc-orchestrator/index.js +8 -0
  70. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  71. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  72. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  73. package/dist/cc-orchestrator/session-discovery.js +125 -0
  74. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  75. package/dist/cc-orchestrator/session-history.js +67 -0
  76. package/dist/cli/agent-server-stdio.d.ts +26 -1
  77. package/dist/cli/agent-server-stdio.js +221 -28
  78. package/dist/cli/agent-server-tcp.d.ts +20 -0
  79. package/dist/cli/agent-server-tcp.js +134 -0
  80. package/dist/cli/graceful-shutdown.d.ts +27 -0
  81. package/dist/cli/graceful-shutdown.js +30 -0
  82. package/dist/context/compaction.d.ts +56 -0
  83. package/dist/context/compaction.js +209 -15
  84. package/dist/context/manager.d.ts +0 -20
  85. package/dist/context/manager.js +25 -41
  86. package/dist/cost-tracker.js +5 -61
  87. package/dist/credentials/cipher.d.ts +49 -0
  88. package/dist/credentials/cipher.js +45 -0
  89. package/dist/credentials/cookie-jar.d.ts +24 -0
  90. package/dist/credentials/cookie-jar.js +40 -0
  91. package/dist/credentials/index.d.ts +7 -0
  92. package/dist/credentials/index.js +5 -0
  93. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  94. package/dist/credentials/inject-credential-tool.js +130 -0
  95. package/dist/credentials/store.d.ts +72 -0
  96. package/dist/credentials/store.js +184 -0
  97. package/dist/credentials/types.d.ts +56 -0
  98. package/dist/credentials/use-credential-tool.d.ts +29 -0
  99. package/dist/credentials/use-credential-tool.js +205 -0
  100. package/dist/credentials/use-gate.d.ts +56 -0
  101. package/dist/credentials/use-gate.js +52 -0
  102. package/dist/cron/cron-runtime.d.ts +2 -0
  103. package/dist/cron/cron-runtime.js +2 -0
  104. package/dist/cron/cron-store.d.ts +2 -0
  105. package/dist/cron/cron-store.js +2 -0
  106. package/dist/cron/scheduler.d.ts +5 -32
  107. package/dist/cron/scheduler.js +5 -113
  108. package/dist/data/model-metadata.d.ts +77 -0
  109. package/dist/data/model-metadata.js +56 -0
  110. package/dist/data/model-metadata.json +216 -0
  111. package/dist/data/openrouter-models.d.ts +18 -7
  112. package/dist/data/openrouter-models.js +35 -8
  113. package/dist/data/openrouter-sync.js +1 -1
  114. package/dist/engine/aux-key.d.ts +10 -0
  115. package/dist/engine/aux-key.js +11 -0
  116. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  117. package/dist/engine/dynamic-tool-defs.js +36 -0
  118. package/dist/engine/engine.d.ts +431 -108
  119. package/dist/engine/engine.js +1630 -279
  120. package/dist/engine/friendly-error.d.ts +18 -0
  121. package/dist/engine/friendly-error.js +63 -0
  122. package/dist/engine/goal.d.ts +187 -0
  123. package/dist/engine/goal.js +196 -0
  124. package/dist/engine/image-compression.d.ts +81 -0
  125. package/dist/engine/image-compression.js +186 -0
  126. package/dist/engine/image-policy.d.ts +165 -0
  127. package/dist/engine/image-policy.js +189 -0
  128. package/dist/engine/model-connections-pool.d.ts +17 -0
  129. package/dist/engine/model-connections-pool.js +66 -0
  130. package/dist/engine/model-facade.d.ts +10 -0
  131. package/dist/engine/model-facade.js +25 -0
  132. package/dist/engine/patch-orphaned-tools.js +3 -0
  133. package/dist/engine/reactive-threshold.d.ts +13 -0
  134. package/dist/engine/reactive-threshold.js +17 -0
  135. package/dist/engine/resolve-llm-config.d.ts +16 -0
  136. package/dist/engine/resolve-llm-config.js +44 -0
  137. package/dist/engine/runtime.js +9 -1
  138. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  139. package/dist/engine/sandbox-cache-key.js +9 -0
  140. package/dist/engine/sandbox-config.d.ts +31 -0
  141. package/dist/engine/sandbox-config.js +38 -0
  142. package/dist/engine/session-title.d.ts +13 -0
  143. package/dist/engine/session-title.js +34 -0
  144. package/dist/engine/session-usage.d.ts +19 -0
  145. package/dist/engine/session-usage.js +25 -0
  146. package/dist/engine/steer-queue.d.ts +32 -0
  147. package/dist/engine/steer-queue.js +26 -0
  148. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  149. package/dist/engine/streaming-tool-queue.js +50 -10
  150. package/dist/engine/turn-loop.d.ts +94 -9
  151. package/dist/engine/turn-loop.js +775 -342
  152. package/dist/engine/types.d.ts +175 -0
  153. package/dist/engine/types.js +13 -0
  154. package/dist/external-agents/config.d.ts +2 -0
  155. package/dist/external-agents/config.js +15 -0
  156. package/dist/external-agents/types.d.ts +31 -0
  157. package/dist/external-agents/types.js +1 -0
  158. package/dist/git/parse-log.d.ts +13 -0
  159. package/dist/git/parse-log.js +21 -0
  160. package/dist/git/utils.d.ts +8 -6
  161. package/dist/git/utils.js +62 -26
  162. package/dist/git/worktree.d.ts +48 -0
  163. package/dist/git/worktree.js +111 -20
  164. package/dist/hooks/events.d.ts +23 -1
  165. package/dist/hooks/goal-stop-hook.d.ts +58 -0
  166. package/dist/hooks/goal-stop-hook.js +279 -0
  167. package/dist/hooks/hook-output.d.ts +33 -0
  168. package/dist/hooks/hook-output.js +79 -0
  169. package/dist/hooks/registry.d.ts +15 -0
  170. package/dist/hooks/registry.js +57 -1
  171. package/dist/hooks/shell-runner.d.ts +2 -0
  172. package/dist/hooks/shell-runner.js +48 -18
  173. package/dist/index.d.ts +79 -11
  174. package/dist/index.js +89 -6
  175. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  176. package/dist/llm/capabilities/param-specs.js +62 -0
  177. package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
  178. package/dist/llm/capabilities/reasoning-control.js +38 -0
  179. package/dist/llm/capabilities/rules.js +37 -3
  180. package/dist/llm/capabilities/types.d.ts +32 -2
  181. package/dist/llm/clamp-max-tokens.d.ts +11 -0
  182. package/dist/llm/clamp-max-tokens.js +17 -0
  183. package/dist/llm/client-base.d.ts +69 -5
  184. package/dist/llm/client-base.js +185 -25
  185. package/dist/llm/client-factory.d.ts +3 -3
  186. package/dist/llm/client-factory.js +2 -2
  187. package/dist/llm/model-cache.js +4 -2
  188. package/dist/llm/model-pool.d.ts +29 -11
  189. package/dist/llm/model-pool.js +36 -20
  190. package/dist/llm/provider-auth.d.ts +41 -0
  191. package/dist/llm/provider-auth.js +76 -0
  192. package/dist/llm/provider-catalog.d.ts +6 -2
  193. package/dist/llm/providers/anthropic.d.ts +32 -2
  194. package/dist/llm/providers/anthropic.js +207 -18
  195. package/dist/llm/providers/openai.d.ts +47 -2
  196. package/dist/llm/providers/openai.js +478 -71
  197. package/dist/llm/reasoning-setting.d.ts +51 -0
  198. package/dist/llm/reasoning-setting.js +40 -0
  199. package/dist/llm/stop-reason.d.ts +13 -0
  200. package/dist/llm/stop-reason.js +21 -0
  201. package/dist/llm/stream-watchdog.js +5 -1
  202. package/dist/llm/strip-vision.d.ts +32 -0
  203. package/dist/llm/strip-vision.js +94 -0
  204. package/dist/llm/token-counter.js +9 -2
  205. package/dist/llm/types.d.ts +9 -6
  206. package/dist/logging/logger.js +18 -4
  207. package/dist/logging/sanitize-messages.d.ts +10 -0
  208. package/dist/logging/sanitize-messages.js +112 -0
  209. package/dist/lsp/client.js +28 -8
  210. package/dist/lsp/manager.d.ts +1 -1
  211. package/dist/lsp/manager.js +42 -11
  212. package/dist/lsp/root-path.d.ts +9 -0
  213. package/dist/lsp/root-path.js +12 -0
  214. package/dist/model-catalog/builtin.d.ts +12 -0
  215. package/dist/model-catalog/builtin.js +407 -0
  216. package/dist/model-catalog/gen-connections.d.ts +20 -0
  217. package/dist/model-catalog/gen-connections.js +28 -0
  218. package/dist/model-catalog/index.d.ts +41 -0
  219. package/dist/model-catalog/index.js +90 -0
  220. package/dist/model-catalog/params.d.ts +20 -0
  221. package/dist/model-catalog/params.js +45 -0
  222. package/dist/model-catalog/resolve.d.ts +48 -0
  223. package/dist/model-catalog/resolve.js +33 -0
  224. package/dist/model-catalog/save-entry.d.ts +32 -0
  225. package/dist/model-catalog/save-entry.js +104 -0
  226. package/dist/model-catalog/types.d.ts +561 -0
  227. package/dist/model-catalog/types.js +93 -0
  228. package/dist/model-catalog/upsert.d.ts +9 -0
  229. package/dist/model-catalog/upsert.js +8 -0
  230. package/dist/onboarding.d.ts +12 -82
  231. package/dist/onboarding.js +75 -333
  232. package/dist/plugins/gitOps.d.ts +53 -0
  233. package/dist/plugins/gitOps.js +130 -5
  234. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  235. package/dist/plugins/installer/checkUpdate.js +32 -0
  236. package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
  237. package/dist/plugins/installer/codex/convertAgents.js +55 -0
  238. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  239. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  240. package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
  241. package/dist/plugins/installer/codex/convertMcp.js +85 -0
  242. package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
  243. package/dist/plugins/installer/codex/convertSkills.js +33 -0
  244. package/dist/plugins/installer/detectFormat.d.ts +2 -0
  245. package/dist/plugins/installer/detectFormat.js +6 -0
  246. package/dist/plugins/installer/install.d.ts +7 -0
  247. package/dist/plugins/installer/install.js +123 -0
  248. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  249. package/dist/plugins/installer/installFromArchive.js +134 -0
  250. package/dist/plugins/installer/installFromSource.d.ts +13 -0
  251. package/dist/plugins/installer/installFromSource.js +51 -0
  252. package/dist/plugins/installer/list.d.ts +9 -0
  253. package/dist/plugins/installer/list.js +30 -0
  254. package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
  255. package/dist/plugins/installer/loadPluginAgents.js +27 -0
  256. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  257. package/dist/plugins/installer/loadPluginMcp.js +107 -0
  258. package/dist/plugins/installer/parseSource.d.ts +20 -0
  259. package/dist/plugins/installer/parseSource.js +74 -0
  260. package/dist/plugins/installer/paths.d.ts +5 -0
  261. package/dist/plugins/installer/paths.js +25 -0
  262. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  263. package/dist/plugins/installer/pruneDisabled.js +73 -0
  264. package/dist/plugins/installer/types.d.ts +52 -0
  265. package/dist/plugins/installer/types.js +28 -0
  266. package/dist/plugins/installer/uninstall.d.ts +2 -0
  267. package/dist/plugins/installer/uninstall.js +18 -0
  268. package/dist/plugins/installer/unzip.d.ts +14 -0
  269. package/dist/plugins/installer/unzip.js +82 -0
  270. package/dist/plugins/installer/update.d.ts +28 -0
  271. package/dist/plugins/installer/update.js +97 -0
  272. package/dist/plugins/loadPluginHooks.d.ts +54 -1
  273. package/dist/plugins/loadPluginHooks.js +83 -1
  274. package/dist/plugins/marketplaceManager.d.ts +15 -1
  275. package/dist/plugins/marketplaceManager.js +58 -4
  276. package/dist/plugins/pluginCommandHook.js +34 -14
  277. package/dist/plugins/pluginContent.d.ts +30 -0
  278. package/dist/plugins/pluginContent.js +83 -0
  279. package/dist/plugins/pluginInstaller.d.ts +34 -0
  280. package/dist/plugins/pluginInstaller.js +168 -35
  281. package/dist/plugins/schemas.js +41 -6
  282. package/dist/plugins/types.d.ts +10 -0
  283. package/dist/preset/index.d.ts +7 -1
  284. package/dist/preset/index.js +112 -6
  285. package/dist/product/types.d.ts +1 -1
  286. package/dist/prompt/composer.d.ts +31 -0
  287. package/dist/prompt/composer.js +95 -25
  288. package/dist/prompt/instruction-scanner.js +5 -3
  289. package/dist/prompt/section-loader.js +1 -0
  290. package/dist/prompt/sections/base.md +1 -0
  291. package/dist/prompt/sections/browser.md +10 -0
  292. package/dist/prompt/sections/coding.md +4 -0
  293. package/dist/prompt/sections/orchestration.md +8 -0
  294. package/dist/protocol/chat-session-manager.d.ts +15 -2
  295. package/dist/protocol/chat-session-manager.js +46 -0
  296. package/dist/protocol/chat-session.d.ts +82 -0
  297. package/dist/protocol/chat-session.js +121 -1
  298. package/dist/protocol/client.d.ts +27 -0
  299. package/dist/protocol/client.js +38 -0
  300. package/dist/protocol/redact.d.ts +50 -0
  301. package/dist/protocol/redact.js +71 -0
  302. package/dist/protocol/server.d.ts +153 -2
  303. package/dist/protocol/server.js +807 -39
  304. package/dist/protocol/tcp-transport.d.ts +45 -0
  305. package/dist/protocol/tcp-transport.js +74 -0
  306. package/dist/protocol/transport.js +3 -2
  307. package/dist/protocol/types.d.ts +69 -0
  308. package/dist/protocol/types.js +22 -0
  309. package/dist/quota/credentials.d.ts +3 -0
  310. package/dist/quota/credentials.js +80 -0
  311. package/dist/quota/index.d.ts +36 -0
  312. package/dist/quota/index.js +155 -0
  313. package/dist/quota/types.d.ts +48 -0
  314. package/dist/quota/types.js +13 -0
  315. package/dist/remote/bridge.d.ts +11 -2
  316. package/dist/remote/bridge.js +61 -33
  317. package/dist/review/review-prompt.d.ts +28 -0
  318. package/dist/review/review-prompt.js +81 -0
  319. package/dist/run/ArtifactTracker.js +5 -4
  320. package/dist/run/EngineRunner.d.ts +27 -1
  321. package/dist/run/EngineRunner.js +46 -8
  322. package/dist/run/FileRunStore.js +40 -11
  323. package/dist/run/RunApprovalBackend.js +25 -5
  324. package/dist/run/RunLock.d.ts +28 -2
  325. package/dist/run/RunLock.js +49 -7
  326. package/dist/run/RunManager.d.ts +12 -0
  327. package/dist/run/RunManager.js +86 -3
  328. package/dist/run/RunQueue.d.ts +1 -0
  329. package/dist/run/RunQueue.js +8 -2
  330. package/dist/run/factory.d.ts +8 -1
  331. package/dist/run/factory.js +1 -0
  332. package/dist/run/index.d.ts +2 -2
  333. package/dist/run/index.js +1 -1
  334. package/dist/run/redirect-target.d.ts +7 -0
  335. package/dist/run/redirect-target.js +13 -0
  336. package/dist/run/types.js +1 -1
  337. package/dist/runtime/background-shell.d.ts +139 -0
  338. package/dist/runtime/background-shell.js +495 -0
  339. package/dist/runtime/output-clean.d.ts +24 -0
  340. package/dist/runtime/output-clean.js +41 -0
  341. package/dist/runtime/ring-file.d.ts +64 -0
  342. package/dist/runtime/ring-file.js +174 -0
  343. package/dist/runtime/safe-spawn.js +15 -34
  344. package/dist/runtime/spawn-common.d.ts +148 -0
  345. package/dist/runtime/spawn-common.js +303 -0
  346. package/dist/runtime/truncate-output.d.ts +22 -0
  347. package/dist/runtime/truncate-output.js +49 -0
  348. package/dist/runtime/utf8-cut.d.ts +11 -0
  349. package/dist/runtime/utf8-cut.js +23 -0
  350. package/dist/services/auto-dream.d.ts +4 -0
  351. package/dist/services/auto-dream.js +26 -26
  352. package/dist/services/browser-open.d.ts +13 -0
  353. package/dist/services/browser-open.js +16 -0
  354. package/dist/services/diagnostics.d.ts +1 -2
  355. package/dist/services/diagnostics.js +12 -7
  356. package/dist/services/dream-consolidation.d.ts +57 -0
  357. package/dist/services/dream-consolidation.js +151 -0
  358. package/dist/services/extract-memories.d.ts +14 -1
  359. package/dist/services/extract-memories.js +45 -6
  360. package/dist/services/memory-orchestrator.d.ts +21 -0
  361. package/dist/services/memory-orchestrator.js +125 -32
  362. package/dist/services/notifier.d.ts +8 -0
  363. package/dist/services/notifier.js +39 -25
  364. package/dist/services/oauth.js +5 -7
  365. package/dist/services/session-memory-sort.d.ts +8 -0
  366. package/dist/services/session-memory-sort.js +9 -0
  367. package/dist/services/session-memory.js +30 -19
  368. package/dist/session/file-history.d.ts +124 -1
  369. package/dist/session/file-history.js +232 -9
  370. package/dist/session/memory.d.ts +116 -2
  371. package/dist/session/memory.js +250 -28
  372. package/dist/session/session-manager.d.ts +63 -1
  373. package/dist/session/session-manager.js +186 -5
  374. package/dist/session/simple-diff.d.ts +23 -0
  375. package/dist/session/simple-diff.js +84 -0
  376. package/dist/session/transcript.d.ts +25 -1
  377. package/dist/session/transcript.js +35 -2
  378. package/dist/session/undo-target.d.ts +67 -0
  379. package/dist/session/undo-target.js +144 -0
  380. package/dist/settings/disk-defaults.d.ts +42 -0
  381. package/dist/settings/disk-defaults.js +33 -0
  382. package/dist/settings/feature-flags.d.ts +64 -0
  383. package/dist/settings/feature-flags.js +61 -0
  384. package/dist/settings/manager.d.ts +101 -1
  385. package/dist/settings/manager.js +345 -15
  386. package/dist/settings/migrate-config.d.ts +45 -0
  387. package/dist/settings/migrate-config.js +125 -0
  388. package/dist/settings/personalization.d.ts +19 -0
  389. package/dist/settings/personalization.js +7 -0
  390. package/dist/settings/schema-export.d.ts +25 -0
  391. package/dist/settings/schema-export.js +38 -0
  392. package/dist/settings/schema.d.ts +1827 -396
  393. package/dist/settings/schema.js +361 -81
  394. package/dist/skills/scanner.d.ts +9 -0
  395. package/dist/skills/scanner.js +30 -2
  396. package/dist/stt/resolve-transcribe.d.ts +31 -0
  397. package/dist/stt/resolve-transcribe.js +108 -0
  398. package/dist/stt/transcribe.d.ts +51 -0
  399. package/dist/stt/transcribe.js +65 -0
  400. package/dist/tool-system/browser-bridge.d.ts +226 -0
  401. package/dist/tool-system/browser-bridge.js +163 -0
  402. package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
  403. package/dist/tool-system/builtin/add-marketplace.js +76 -0
  404. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  405. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  406. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  407. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  408. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  409. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  410. package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
  411. package/dist/tool-system/builtin/agent-registry.js +16 -4
  412. package/dist/tool-system/builtin/agent.d.ts +50 -11
  413. package/dist/tool-system/builtin/agent.js +576 -73
  414. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  415. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  416. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  417. package/dist/tool-system/builtin/apply-patch/index.js +7 -3
  418. package/dist/tool-system/builtin/arena.js +6 -7
  419. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  420. package/dist/tool-system/builtin/background-jobs.js +124 -0
  421. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  422. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  423. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  424. package/dist/tool-system/builtin/background-work.js +86 -0
  425. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  426. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  427. package/dist/tool-system/builtin/bash.d.ts +5 -2
  428. package/dist/tool-system/builtin/bash.js +98 -62
  429. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  430. package/dist/tool-system/builtin/browser-tools.js +312 -0
  431. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  432. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  433. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  434. package/dist/tool-system/builtin/check-quota.js +34 -0
  435. package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
  436. package/dist/tool-system/builtin/complete-goal.js +45 -0
  437. package/dist/tool-system/builtin/config.js +7 -0
  438. package/dist/tool-system/builtin/cron.d.ts +7 -0
  439. package/dist/tool-system/builtin/cron.js +105 -9
  440. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  441. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  442. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  443. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  444. package/dist/tool-system/builtin/edit.d.ts +2 -1
  445. package/dist/tool-system/builtin/edit.js +21 -12
  446. package/dist/tool-system/builtin/eol.d.ts +29 -0
  447. package/dist/tool-system/builtin/eol.js +37 -0
  448. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  449. package/dist/tool-system/builtin/file-cache.js +8 -0
  450. package/dist/tool-system/builtin/generate-image.d.ts +60 -0
  451. package/dist/tool-system/builtin/generate-image.js +374 -0
  452. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  453. package/dist/tool-system/builtin/generate-video.js +361 -0
  454. package/dist/tool-system/builtin/grep.js +6 -2
  455. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  456. package/dist/tool-system/builtin/image-providers.js +190 -0
  457. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  458. package/dist/tool-system/builtin/image-uploader.js +74 -0
  459. package/dist/tool-system/builtin/index.d.ts +24 -1
  460. package/dist/tool-system/builtin/index.js +310 -25
  461. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  462. package/dist/tool-system/builtin/memory.js +45 -7
  463. package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
  464. package/dist/tool-system/builtin/notebook-edit.js +1 -1
  465. package/dist/tool-system/builtin/powershell.js +4 -1
  466. package/dist/tool-system/builtin/read.d.ts +2 -1
  467. package/dist/tool-system/builtin/read.js +11 -3
  468. package/dist/tool-system/builtin/repl.js +4 -1
  469. package/dist/tool-system/builtin/skill.js +9 -0
  470. package/dist/tool-system/builtin/sleep.js +12 -5
  471. package/dist/tool-system/builtin/task.js +4 -1
  472. package/dist/tool-system/builtin/tool-search.js +25 -7
  473. package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
  474. package/dist/tool-system/builtin/update-automation-memory.js +60 -0
  475. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  476. package/dist/tool-system/builtin/video-providers.js +235 -0
  477. package/dist/tool-system/builtin/view-image.d.ts +18 -0
  478. package/dist/tool-system/builtin/view-image.js +96 -0
  479. package/dist/tool-system/builtin/web-fetch.js +12 -2
  480. package/dist/tool-system/builtin/web-search.d.ts +4 -1
  481. package/dist/tool-system/builtin/web-search.js +57 -10
  482. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  483. package/dist/tool-system/builtin/worktree.js +31 -4
  484. package/dist/tool-system/builtin/write.d.ts +2 -1
  485. package/dist/tool-system/builtin/write.js +1 -1
  486. package/dist/tool-system/context.d.ts +166 -6
  487. package/dist/tool-system/executor.d.ts +3 -2
  488. package/dist/tool-system/executor.js +197 -119
  489. package/dist/tool-system/investigation-guard.d.ts +4 -1
  490. package/dist/tool-system/investigation-guard.js +20 -4
  491. package/dist/tool-system/mcp-manager.d.ts +78 -16
  492. package/dist/tool-system/mcp-manager.js +357 -28
  493. package/dist/tool-system/path-policy.d.ts +99 -0
  494. package/dist/tool-system/path-policy.js +578 -0
  495. package/dist/tool-system/permission.d.ts +36 -1
  496. package/dist/tool-system/permission.js +322 -117
  497. package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
  498. package/dist/tool-system/plan-mode-allowlist.js +65 -0
  499. package/dist/tool-system/registry.d.ts +1 -0
  500. package/dist/tool-system/registry.js +26 -1
  501. package/dist/tool-system/sandbox/index.d.ts +8 -0
  502. package/dist/tool-system/sandbox/index.js +7 -2
  503. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  504. package/dist/tool-system/validate-tool-metadata.js +63 -0
  505. package/dist/tool-system/validation.d.ts +10 -0
  506. package/dist/tool-system/validation.js +16 -3
  507. package/dist/types.d.ts +301 -15
  508. package/dist/updater.js +20 -9
  509. package/dist/utils/envUtils.d.ts +0 -9
  510. package/dist/utils/envUtils.js +3 -28
  511. package/dist/utils/exec.d.ts +40 -0
  512. package/dist/utils/exec.js +144 -0
  513. package/dist/utils/format.js +4 -2
  514. package/dist/utils/json.d.ts +12 -0
  515. package/dist/utils/json.js +92 -0
  516. package/dist/utils/lockfile.js +9 -2
  517. package/dist/utils/theme.d.ts +7 -1
  518. package/dist/utils/theme.js +5 -3
  519. package/dist/utils/toolDisplay.js +0 -1
  520. package/package.json +14 -7
  521. package/dist/agent/coordinator.d.ts +0 -49
  522. package/dist/agent/coordinator.js +0 -77
  523. package/dist/settings/manager.test.js +0 -73
  524. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  525. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  526. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  527. package/dist/tool-system/builtin/send-message.js +0 -47
  528. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -67,7 +67,6 @@ export async function planArena(topic, llmConfig, flags, signal) {
67
67
  signal?.throwIfAborted();
68
68
  const client = await createLLMClient({
69
69
  ...llmConfig,
70
- enableStreaming: false,
71
70
  maxTokens: 1024,
72
71
  });
73
72
  const response = await client.createMessage({
@@ -4,3 +4,4 @@
4
4
  */
5
5
  import type { ArenaContextProvider } from "../types.js";
6
6
  export declare const docsProvider: ArenaContextProvider;
7
+ export declare function truncate(content: string): string;
@@ -99,10 +99,13 @@ function safeReadDoc(filePath) {
99
99
  return null;
100
100
  }
101
101
  }
102
- function truncate(content) {
102
+ export function truncate(content) {
103
103
  if (content.length <= MAX_DOC_CHARS)
104
104
  return content;
105
105
  const t = content.slice(0, MAX_DOC_CHARS);
106
106
  const lastNl = t.lastIndexOf("\n");
107
- return t.slice(0, lastNl) + `\n... (truncated, ${content.length} chars total)`;
107
+ // No newline in the window → lastNl is -1 and slice(0,-1) would drop just
108
+ // the last char; cut at MAX_DOC_CHARS instead.
109
+ const body = lastNl > 0 ? t.slice(0, lastNl) : t;
110
+ return body + `\n... (truncated, ${content.length} chars total)`;
108
111
  }
@@ -4,3 +4,4 @@
4
4
  */
5
5
  import type { ArenaContextProvider } from "../types.js";
6
6
  export declare const repoProvider: ArenaContextProvider;
7
+ export declare function truncate(content: string): string;
@@ -192,12 +192,15 @@ function safeReadFile(filePath) {
192
192
  return null;
193
193
  }
194
194
  }
195
- function truncate(content) {
195
+ export function truncate(content) {
196
196
  if (content.length <= MAX_FILE_CHARS)
197
197
  return content;
198
198
  const t = content.slice(0, MAX_FILE_CHARS);
199
199
  const lastNl = t.lastIndexOf("\n");
200
- return t.slice(0, lastNl) + `\n... (truncated, ${content.length} chars total)`;
200
+ // No newline in the window (e.g. a minified file) → lastNl is -1 and
201
+ // slice(0,-1) would drop just the last char; cut at MAX_FILE_CHARS instead.
202
+ const body = lastNl > 0 ? t.slice(0, lastNl) : t;
203
+ return body + `\n... (truncated, ${content.length} chars total)`;
201
204
  }
202
205
  async function safeGrep(pattern) {
203
206
  try {
@@ -1,9 +1,6 @@
1
1
  /** Shared utilities for arena strategy implementations. */
2
2
  import type { ArenaBaseContext, FindingReview, ParticipantReport, ArenaConsensus, ArenaRoadmapPhaseDetail, ClaimRecord, ClaimChallenge, ClaimAdjudication, ClaimStatusSummary, DebateTurn, RoundResearchDigest } from "../types.js";
3
- /** Extract JSON from text that might have markdown fences or surrounding text */
4
- export declare function extractJSON(text: string): string;
5
- /** Extract a JSON array from text */
6
- export declare function extractJSONArray(text: string): string;
3
+ export { extractJSON, extractJSONArray } from "../../utils/json.js";
7
4
  /** Format base context into a readable text block for LLM prompts */
8
5
  export declare function formatBaseContext(ctx: ArenaBaseContext): string;
9
6
  /** Format participant reports for cross-review or consensus prompts */
@@ -22,57 +22,13 @@ function sanitizeForPrompt(text) {
22
22
  .replace(/^(?:IGNORE|DISREGARD|FORGET|OVERRIDE|SYSTEM|INSTRUCTION)[:\s].*/gim, "")
23
23
  .slice(0, 3000);
24
24
  }
25
- /** Extract JSON from text that might have markdown fences or surrounding text */
26
- export function extractJSON(text) {
27
- // Try fenced code blocks — use GREEDY match to handle nested backticks
28
- const fenced = text.match(/```(?:json)?\s*\n([\s\S]*)\n\s*```/);
29
- if (fenced)
30
- return fenced[1].trim();
31
- // Try to find the outermost { ... } pair with balanced braces
32
- const start = text.indexOf("{");
33
- if (start !== -1) {
34
- let depth = 0;
35
- let inString = false;
36
- let escape = false;
37
- for (let i = start; i < text.length; i++) {
38
- const ch = text[i];
39
- if (escape) {
40
- escape = false;
41
- continue;
42
- }
43
- if (ch === "\\") {
44
- escape = true;
45
- continue;
46
- }
47
- if (ch === '"') {
48
- inString = !inString;
49
- continue;
50
- }
51
- if (inString)
52
- continue;
53
- if (ch === "{")
54
- depth++;
55
- else if (ch === "}") {
56
- depth--;
57
- if (depth === 0)
58
- return text.slice(start, i + 1);
59
- }
60
- }
61
- // Unbalanced — return from start to end as best effort
62
- return text.slice(start);
63
- }
64
- return text;
65
- }
66
- /** Extract a JSON array from text */
67
- export function extractJSONArray(text) {
68
- const fenced = text.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
69
- if (fenced)
70
- return fenced[1].trim();
71
- const arrayMatch = text.match(/\[[\s\S]*\]/);
72
- if (arrayMatch)
73
- return arrayMatch[0];
74
- return text;
75
- }
25
+ // extractJSON / extractJSONArray are generic JSON extractors with no Arena
26
+ // dependency. They moved to utils/json.ts so non-Arena consumers (e.g.
27
+ // services/memory-orchestrator) can use them without importing this Arena
28
+ // module that import made Arena a dependency of a core service. Re-exported
29
+ // here for back-compat with Arena's own callers and the existing test.
30
+ export { extractJSON, extractJSONArray } from "../../utils/json.js";
31
+ import { extractJSON, extractJSONArray } from "../../utils/json.js";
76
32
  /** Format base context into a readable text block for LLM prompts */
77
33
  export function formatBaseContext(ctx) {
78
34
  const sections = [];
@@ -5,9 +5,14 @@
5
5
  * consistent state transitions across phases.
6
6
  *
7
7
  * State machine:
8
- * proposed → under_review
9
- * under_review → verified | contested | rejected
8
+ * proposed → under_review | unresolved
9
+ * under_review → verified | contested | rejected | unresolved
10
10
  * contested → under_review | unresolved | verified | rejected
11
+ *
12
+ * `unresolved` is reachable from proposed/under_review (not just contested):
13
+ * adjudication sweeps any claims left in those states when the round/budget
14
+ * is exhausted (adjudication.ts) — without these edges markUnresolved() would
15
+ * silently no-op and the claims would be dropped from the consensus summary.
11
16
  */
12
17
  import type { ClaimRecord, ClaimStatus, ClaimChallenge } from "./types.js";
13
18
  /**
@@ -5,14 +5,19 @@
5
5
  * consistent state transitions across phases.
6
6
  *
7
7
  * State machine:
8
- * proposed → under_review
9
- * under_review → verified | contested | rejected
8
+ * proposed → under_review | unresolved
9
+ * under_review → verified | contested | rejected | unresolved
10
10
  * contested → under_review | unresolved | verified | rejected
11
+ *
12
+ * `unresolved` is reachable from proposed/under_review (not just contested):
13
+ * adjudication sweeps any claims left in those states when the round/budget
14
+ * is exhausted (adjudication.ts) — without these edges markUnresolved() would
15
+ * silently no-op and the claims would be dropped from the consensus summary.
11
16
  */
12
17
  /** Valid transitions from each status */
13
18
  const VALID_TRANSITIONS = {
14
- proposed: ["under_review"],
15
- under_review: ["verified", "contested", "rejected"],
19
+ proposed: ["under_review", "unresolved"],
20
+ under_review: ["verified", "contested", "rejected", "unresolved"],
16
21
  contested: ["under_review", "unresolved", "verified", "rejected"],
17
22
  verified: [],
18
23
  rejected: [],
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * V2 architecture: shared facts → independent research → findings → cross-review → consensus.
5
5
  */
6
- import type { LLMConfig } from "../types.js";
6
+ import type { ClientDefaults, LLMConfig } from "../types.js";
7
7
  /** Arena operating mode — determines prompts, output format, and default rounds */
8
8
  export type ArenaMode = "review" | "discussion" | "planning";
9
9
  /** Analysis lens — the perspective from which participants analyze */
@@ -87,8 +87,14 @@ export declare const ARENA_MODE_DEFAULTS: Record<ArenaMode, {
87
87
  export interface ArenaParticipant {
88
88
  /** Display name, e.g. "Claude Sonnet", "GPT-4o" */
89
89
  name: string;
90
- /** LLM config for this participant */
90
+ /** LLM config for this participant (pure model identity) */
91
91
  llm: LLMConfig;
92
+ /**
93
+ * Cross-model client knobs (temperature/timeout/etc.). Arena hardcodes
94
+ * temperature here so debate participants speak with consistent sampling
95
+ * regardless of the user's session preference.
96
+ */
97
+ clientDefaults?: ClientDefaults;
92
98
  }
93
99
  export interface ArenaBaseContext {
94
100
  /** Evidence-driven plan that drives the session */
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Minimal 5-field cron expression parser + timezone-aware next-trigger
3
+ * calculator. No third-party dependency (core keeps its dep set tight).
4
+ *
5
+ * Fields: minute(0-59) hour(0-23) dayOfMonth(1-31) month(1-12) dayOfWeek(0-6, 0=Sun)
6
+ * Syntax per field: star | star-slash-n | a | a-b | a-b-slash-n | comma-lists of those.
7
+ *
8
+ * Timezone handling uses Intl.DateTimeFormat with a timeZone option to derive
9
+ * the wall-clock parts of a candidate UTC instant in the target zone — correct
10
+ * across DST without a tz library. nextCronTime steps minute-by-minute from the
11
+ * reference and returns the first future instant whose wall-clock parts (in tz)
12
+ * match every field. Bounded to ~2 years so an unsatisfiable expression can't
13
+ * loop forever.
14
+ */
15
+ export interface ParsedCron {
16
+ minutes: Set<number>;
17
+ hours: Set<number>;
18
+ daysOfMonth: Set<number>;
19
+ months: Set<number>;
20
+ daysOfWeek: Set<number>;
21
+ /**
22
+ * Whether the dayOfMonth / dayOfWeek FIELD was restricted (anything other
23
+ * than a bare "*"). Vixie-cron semantics: when BOTH day fields are
24
+ * restricted, a tick matches if EITHER matches (OR); when only one is
25
+ * restricted, the "*" one is ignored and the restricted one governs. We
26
+ * can't recover this from the value Set alone ("*" and an explicit full
27
+ * range both expand to the full set), so we capture it at parse time.
28
+ */
29
+ domRestricted: boolean;
30
+ dowRestricted: boolean;
31
+ }
32
+ /** Cheap check: is this string a 5-field cron expression (vs an interval like "5m")? */
33
+ export declare function isCronExpression(s: string): boolean;
34
+ /** Parse a 5-field cron expression into per-field value sets. Throws on invalid input. */
35
+ export declare function parseCronExpression(expr: string): ParsedCron;
36
+ /**
37
+ * Return the next UTC instant (ms) strictly after `fromMs` whose wall-clock
38
+ * time in `timeZone` matches `cron`. Returns null if none within ~2 years
39
+ * (e.g. an impossible expression like Feb 30).
40
+ */
41
+ export declare function nextCronTime(cron: ParsedCron, timeZone: string, fromMs: number): number | null;
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Minimal 5-field cron expression parser + timezone-aware next-trigger
3
+ * calculator. No third-party dependency (core keeps its dep set tight).
4
+ *
5
+ * Fields: minute(0-59) hour(0-23) dayOfMonth(1-31) month(1-12) dayOfWeek(0-6, 0=Sun)
6
+ * Syntax per field: star | star-slash-n | a | a-b | a-b-slash-n | comma-lists of those.
7
+ *
8
+ * Timezone handling uses Intl.DateTimeFormat with a timeZone option to derive
9
+ * the wall-clock parts of a candidate UTC instant in the target zone — correct
10
+ * across DST without a tz library. nextCronTime steps minute-by-minute from the
11
+ * reference and returns the first future instant whose wall-clock parts (in tz)
12
+ * match every field. Bounded to ~2 years so an unsatisfiable expression can't
13
+ * loop forever.
14
+ */
15
+ const SPECS = [
16
+ { min: 0, max: 59 }, // minute
17
+ { min: 0, max: 23 }, // hour
18
+ { min: 1, max: 31 }, // day of month
19
+ { min: 1, max: 12 }, // month
20
+ { min: 0, max: 6 }, // day of week
21
+ ];
22
+ /** Cheap check: is this string a 5-field cron expression (vs an interval like "5m")? */
23
+ export function isCronExpression(s) {
24
+ if (typeof s !== "string")
25
+ return false;
26
+ const parts = s.trim().split(/\s+/);
27
+ if (parts.length !== 5)
28
+ return false;
29
+ // Every field must contain only cron field characters.
30
+ return parts.every((p) => /^[\d*/,-]+$/.test(p));
31
+ }
32
+ function parseField(field, spec) {
33
+ const out = new Set();
34
+ for (const part of field.split(",")) {
35
+ // Split optional step: "a-b/n" or "*/n" or "a/n"
36
+ const [rangePart, stepPart] = part.split("/");
37
+ const step = stepPart === undefined ? 1 : parseInt(stepPart, 10);
38
+ if (!Number.isInteger(step) || step <= 0) {
39
+ throw new Error(`Invalid cron step in "${field}"`);
40
+ }
41
+ let lo;
42
+ let hi;
43
+ if (rangePart === "*") {
44
+ lo = spec.min;
45
+ hi = spec.max;
46
+ }
47
+ else if (rangePart.includes("-")) {
48
+ const [a, b] = rangePart.split("-");
49
+ lo = parseInt(a, 10);
50
+ hi = parseInt(b, 10);
51
+ }
52
+ else {
53
+ lo = parseInt(rangePart, 10);
54
+ hi = lo;
55
+ }
56
+ if (!Number.isInteger(lo) || !Number.isInteger(hi)) {
57
+ throw new Error(`Invalid cron field "${field}"`);
58
+ }
59
+ if (lo < spec.min || hi > spec.max || lo > hi) {
60
+ throw new Error(`cron field "${field}" out of range [${spec.min}-${spec.max}]`);
61
+ }
62
+ for (let v = lo; v <= hi; v += step)
63
+ out.add(v);
64
+ }
65
+ return out;
66
+ }
67
+ /** Parse a 5-field cron expression into per-field value sets. Throws on invalid input. */
68
+ export function parseCronExpression(expr) {
69
+ const parts = expr.trim().split(/\s+/);
70
+ if (parts.length !== 5) {
71
+ throw new Error(`cron expression must have 5 fields, got ${parts.length}: "${expr}"`);
72
+ }
73
+ return {
74
+ minutes: parseField(parts[0], SPECS[0]),
75
+ hours: parseField(parts[1], SPECS[1]),
76
+ daysOfMonth: parseField(parts[2], SPECS[2]),
77
+ months: parseField(parts[3], SPECS[3]),
78
+ daysOfWeek: parseField(parts[4], SPECS[4]),
79
+ // A bare "*" is unrestricted; anything else (a number, range, list, or even
80
+ // "*/n") restricts the field for the OR rule below.
81
+ domRestricted: parts[2].trim() !== "*",
82
+ dowRestricted: parts[4].trim() !== "*",
83
+ };
84
+ }
85
+ // Cache one formatter per timezone — constructing Intl.DateTimeFormat is costly.
86
+ const formatterCache = new Map();
87
+ function getFormatter(timeZone) {
88
+ let fmt = formatterCache.get(timeZone);
89
+ if (!fmt) {
90
+ fmt = new Intl.DateTimeFormat("en-US", {
91
+ timeZone,
92
+ hour12: false,
93
+ year: "numeric",
94
+ month: "2-digit",
95
+ day: "2-digit",
96
+ hour: "2-digit",
97
+ minute: "2-digit",
98
+ weekday: "short",
99
+ });
100
+ formatterCache.set(timeZone, fmt);
101
+ }
102
+ return fmt;
103
+ }
104
+ const WEEKDAY_INDEX = {
105
+ Sun: 0,
106
+ Mon: 1,
107
+ Tue: 2,
108
+ Wed: 3,
109
+ Thu: 4,
110
+ Fri: 5,
111
+ Sat: 6,
112
+ };
113
+ /** Derive the wall-clock parts of a UTC instant `ms` as seen in `timeZone`. */
114
+ function wallClockInZone(ms, timeZone) {
115
+ const parts = getFormatter(timeZone).formatToParts(new Date(ms));
116
+ const get = (type) => parts.find((p) => p.type === type)?.value ?? "";
117
+ // hour can come back as "24" at midnight in some environments; normalize.
118
+ let hour = parseInt(get("hour"), 10);
119
+ if (hour === 24)
120
+ hour = 0;
121
+ return {
122
+ minute: parseInt(get("minute"), 10),
123
+ hour,
124
+ dayOfMonth: parseInt(get("day"), 10),
125
+ month: parseInt(get("month"), 10),
126
+ dayOfWeek: WEEKDAY_INDEX[get("weekday")] ?? 0,
127
+ };
128
+ }
129
+ function matches(cron, wc) {
130
+ if (!cron.minutes.has(wc.minute))
131
+ return false;
132
+ if (!cron.hours.has(wc.hour))
133
+ return false;
134
+ if (!cron.months.has(wc.month))
135
+ return false;
136
+ // Day-of-month vs day-of-week per Vixie/POSIX cron:
137
+ // - both restricted → match if EITHER matches (OR)
138
+ // - only one restricted → that one governs (the "*" one is ignored)
139
+ // - neither restricted → matches every day
140
+ const domHit = cron.daysOfMonth.has(wc.dayOfMonth);
141
+ const dowHit = cron.daysOfWeek.has(wc.dayOfWeek);
142
+ if (cron.domRestricted && cron.dowRestricted)
143
+ return domHit || dowHit;
144
+ if (cron.domRestricted)
145
+ return domHit;
146
+ if (cron.dowRestricted)
147
+ return dowHit;
148
+ return true;
149
+ }
150
+ const MINUTE_MS = 60_000;
151
+ // ~2 years of minutes — bounds the search for an unsatisfiable expression.
152
+ const MAX_STEPS = 2 * 366 * 24 * 60;
153
+ /**
154
+ * Return the next UTC instant (ms) strictly after `fromMs` whose wall-clock
155
+ * time in `timeZone` matches `cron`. Returns null if none within ~2 years
156
+ * (e.g. an impossible expression like Feb 30).
157
+ */
158
+ export function nextCronTime(cron, timeZone, fromMs) {
159
+ // Start at the next whole minute strictly after fromMs (cron has minute
160
+ // granularity; we never return the reference instant itself).
161
+ let candidate = Math.floor(fromMs / MINUTE_MS) * MINUTE_MS + MINUTE_MS;
162
+ for (let i = 0; i < MAX_STEPS; i++) {
163
+ const wc = wallClockInZone(candidate, timeZone);
164
+ if (matches(cron, wc))
165
+ return candidate;
166
+ candidate += MINUTE_MS;
167
+ }
168
+ return null;
169
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * automation/ — zero-environment-dependency scheduling module.
3
+ *
4
+ * Hosts (Electron main, future CLI server) load this module and inject their
5
+ * own store + runner. The module imports nothing from Electron/Ink and makes
6
+ * no GUI/TTY assumptions, so the same code runs in any host
7
+ * (docs/automation-plan-2026-05-31.md, D1).
8
+ */
9
+ import { CronScheduler } from "./scheduler.js";
10
+ import { type CronRunner, type RunSubmitter } from "./runner.js";
11
+ import type { CronStore } from "./store.js";
12
+ export interface StartAutomationDeps {
13
+ /** Persistence backend (injected; module never picks a path itself). */
14
+ store: CronStore;
15
+ /**
16
+ * Execution backend. Provide exactly one:
17
+ * - `runner`: a one-shot run callback (Phase 1 direct-Engine path).
18
+ * - `runManager`: a RunManager submitter (Phase 2 — runs land in RunStore
19
+ * with full history/checkpoint/resume).
20
+ */
21
+ runner?: CronRunner;
22
+ runManager?: RunSubmitter;
23
+ }
24
+ export interface AutomationHandle {
25
+ scheduler: CronScheduler;
26
+ /** Halt all timers and release the scheduler. Idempotent. */
27
+ stop(): void;
28
+ }
29
+ /**
30
+ * Wire a scheduler to a host-provided store + execution backend and restore
31
+ * persisted jobs. Returns a handle the host keeps for its lifetime. Prefers
32
+ * `runManager` when both are supplied (it gives run history).
33
+ */
34
+ export declare function startAutomation(deps: StartAutomationDeps): AutomationHandle;
35
+ export { CronScheduler, cronScheduler, type CronJob } from "./scheduler.js";
36
+ export { CronStore, defaultCronStorePath } from "./store.js";
37
+ export { bindCronToEngine, bindCronToRunManager, type CronRunner, type CronRunRequest, type CronRunResult, type RunSubmitter, } from "./runner.js";
38
+ export { isCronExpression, parseCronExpression, nextCronTime, type ParsedCron, } from "./cron-expr.js";
39
+ export type { CronPermissionLevel, CreateJobOptions, UpdateJobPatch } from "./scheduler.js";
40
+ export { resolveWritePolicy, wrapUntrustedInput, type WritePolicy, } from "./write-policy.js";
41
+ export { runWriteJobInWorktree, type WriteJobGitOps, type RunWriteJobInput, type RunWriteJobResult, } from "./write-run.js";
@@ -0,0 +1,39 @@
1
+ /**
2
+ * automation/ — zero-environment-dependency scheduling module.
3
+ *
4
+ * Hosts (Electron main, future CLI server) load this module and inject their
5
+ * own store + runner. The module imports nothing from Electron/Ink and makes
6
+ * no GUI/TTY assumptions, so the same code runs in any host
7
+ * (docs/automation-plan-2026-05-31.md, D1).
8
+ */
9
+ import { CronScheduler } from "./scheduler.js";
10
+ import { bindCronToEngine, bindCronToRunManager, } from "./runner.js";
11
+ /**
12
+ * Wire a scheduler to a host-provided store + execution backend and restore
13
+ * persisted jobs. Returns a handle the host keeps for its lifetime. Prefers
14
+ * `runManager` when both are supplied (it gives run history).
15
+ */
16
+ export function startAutomation(deps) {
17
+ const scheduler = new CronScheduler(deps.store);
18
+ if (deps.runManager) {
19
+ bindCronToRunManager(scheduler, deps.runManager);
20
+ }
21
+ else if (deps.runner) {
22
+ bindCronToEngine(scheduler, deps.runner);
23
+ }
24
+ else {
25
+ throw new Error("startAutomation requires either a runner or a runManager");
26
+ }
27
+ scheduler.loadJobs();
28
+ return {
29
+ scheduler,
30
+ stop: () => scheduler.stopAll(),
31
+ };
32
+ }
33
+ // Re-export the building blocks so hosts import everything from one place.
34
+ export { CronScheduler, cronScheduler } from "./scheduler.js";
35
+ export { CronStore, defaultCronStorePath } from "./store.js";
36
+ export { bindCronToEngine, bindCronToRunManager, } from "./runner.js";
37
+ export { isCronExpression, parseCronExpression, nextCronTime, } from "./cron-expr.js";
38
+ export { resolveWritePolicy, wrapUntrustedInput, } from "./write-policy.js";
39
+ export { runWriteJobInWorktree, } from "./write-run.js";
@@ -0,0 +1,84 @@
1
+ /**
2
+ * cron-runtime — wire the CronScheduler's executor to a real run backend.
3
+ *
4
+ * B1 fix: `CronScheduler.setExecutor` was never called in production, so cron
5
+ * jobs were created and ticked but did nothing on fire. `bindCronToEngine`
6
+ * installs an executor that, for each fired job, hands a one-shot headless run
7
+ * request to the caller-supplied `runner`.
8
+ *
9
+ * Security contract: cron runs unattended, so each job's permission tier
10
+ * (`job.permissionLevel`) is resolved through `resolveWritePolicy`, which maps
11
+ * the tier to a permissionMode + approval backend (see write-policy.ts). The
12
+ * mode stays "default" so the classifier doesn't add its own acceptEdits
13
+ * auto-allow rules ahead of the backend — the backend is the single source of
14
+ * truth for what a tier permits. An undefined/unknown tier falls back to the
15
+ * read-only backend.
16
+ */
17
+ import type { CronJob } from "./scheduler.js";
18
+ import type { CronScheduler } from "./scheduler.js";
19
+ import type { PermissionMode } from "../types.js";
20
+ import type { ApprovalBackend } from "../tool-system/permission.js";
21
+ import type { SandboxMode } from "../tool-system/sandbox/index.js";
22
+ /** What the executor hands to the run backend for one fired job. */
23
+ export interface CronRunRequest {
24
+ job: CronJob;
25
+ /** The prompt to run — `job.prompt`, surfaced for convenience. */
26
+ prompt: string;
27
+ /** Permission mode the run must use (see security contract above). */
28
+ permissionMode: PermissionMode;
29
+ /** Approval backend the run must install (resolved from the job's tier). */
30
+ approvalBackend: ApprovalBackend;
31
+ /** Sandbox mode the run should confine writes/shell to (resolved from the
32
+ * job's tier). The host runner must forward this to `Engine({ sandbox })`
33
+ * so even a `full` tier can't escape the workspace — defense in depth on
34
+ * top of the approval backend. */
35
+ sandboxMode: SandboxMode;
36
+ /** Abort signal for the run — tripped by `CronScheduler.abort(jobId)` when
37
+ * the run must be cancelled mid-flight (e.g. the user deletes its session
38
+ * while it's still executing). Forward to `Engine.run({ signal })`. */
39
+ signal?: AbortSignal;
40
+ }
41
+ export interface CronRunResult {
42
+ text: string;
43
+ reason: string;
44
+ /**
45
+ * When present, this fire hit a PERMANENT failure that will recur every tick
46
+ * (e.g. a `resumeSessionId` whose session was deleted). The scheduler should
47
+ * auto-disable the job with `stop.reason` rather than silently retrying
48
+ * forever. Absent = transient/normal outcome; keep scheduling.
49
+ */
50
+ stop?: {
51
+ reason: string;
52
+ };
53
+ }
54
+ /** The pluggable run backend. Production wires this to a headless Engine run;
55
+ * tests pass a stub. Phase 5 will swap this for a RunManager.submit() path. */
56
+ export type CronRunner = (req: CronRunRequest) => Promise<CronRunResult>;
57
+ /**
58
+ * Install the cron executor. After this call, a fired job invokes `runner`
59
+ * with a run request whose permission tier comes from the job. A thrown error
60
+ * is logged (`logCronFailure`) and re-thrown so the scheduler's catch records
61
+ * stats and keeps ticking — one transient bad run never stops future ticks. A
62
+ * PERMANENT failure the runner flags via `result.stop` (e.g. a resume target
63
+ * whose session was deleted) auto-disables the job with that reason, so it
64
+ * stops silently retrying forever.
65
+ */
66
+ export declare function bindCronToEngine(scheduler: CronScheduler, runner: CronRunner): void;
67
+ /** Minimal structural view of RunManager.submit the executor needs. */
68
+ export interface RunSubmitter {
69
+ submit(input: {
70
+ objective: string;
71
+ cwd?: string;
72
+ metadata?: Record<string, unknown>;
73
+ }): Promise<{
74
+ runId: string;
75
+ }>;
76
+ }
77
+ /**
78
+ * Wire the scheduler to submit each fired job into a RunManager. Records the
79
+ * resulting runId back onto the job (`lastRunId`) so the UI can link a job to
80
+ * its latest run in the RunStore. Read-only is enforced at the RunManager level
81
+ * by the host injecting `approvalBackend: HeadlessApprovalBackend("approve-read-only")`
82
+ * into createRunManager (Phase 2) until sandbox+write tiers land (Phase 4/5).
83
+ */
84
+ export declare function bindCronToRunManager(scheduler: CronScheduler, runManager: RunSubmitter): void;