@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
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Map a raw error into a user-friendly message with a concrete next step
3
+ * (TODO 3.4). The turn loop emits `{type:"error", error}` to the UI; routing
4
+ * the message through here turns opaque provider strings ("401", "ETIMEDOUT")
5
+ * into something a user can act on. Pure + testable — no I/O.
6
+ *
7
+ * Heuristic, message-pattern based: we don't have typed error codes from every
8
+ * provider, so we match on substrings. Unknown errors pass through unchanged
9
+ * (with no suggestion) rather than getting a misleading canned message.
10
+ */
11
+ export interface FriendlyError {
12
+ message: string;
13
+ /** A concrete next step, or undefined when we have nothing useful to add. */
14
+ suggestion?: string;
15
+ }
16
+ export declare function friendlyError(err: unknown): FriendlyError;
17
+ /** One-line form: "<message> (<suggestion>)" — what the UI shows. */
18
+ export declare function formatFriendlyError(err: unknown): string;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Map a raw error into a user-friendly message with a concrete next step
3
+ * (TODO 3.4). The turn loop emits `{type:"error", error}` to the UI; routing
4
+ * the message through here turns opaque provider strings ("401", "ETIMEDOUT")
5
+ * into something a user can act on. Pure + testable — no I/O.
6
+ *
7
+ * Heuristic, message-pattern based: we don't have typed error codes from every
8
+ * provider, so we match on substrings. Unknown errors pass through unchanged
9
+ * (with no suggestion) rather than getting a misleading canned message.
10
+ */
11
+ const RULES = [
12
+ {
13
+ test: /\b(401|403|invalid api key|unauthorized|authentication)\b/i,
14
+ message: () => "Authentication failed — the API key was rejected.",
15
+ suggestion: "Check the provider's apiKey/authCommand in settings (run /login to reconfigure), then retry.",
16
+ },
17
+ {
18
+ test: /\b(429|rate.?limit|too many requests)\b/i,
19
+ message: () => "Rate limited by the provider.",
20
+ suggestion: "Wait a moment and retry, lower request frequency, or switch to a model with more headroom.",
21
+ },
22
+ {
23
+ test: /\b(timed? ?out|etimedout|esockettimedout|deadline)\b/i,
24
+ suggestion: "The request timed out — check your network, then retry. Long tasks can run in the background (run_in_background).",
25
+ },
26
+ {
27
+ test: /\b(econnrefused|enotfound|econnreset|network|fetch failed|socket hang up)\b/i,
28
+ message: () => "Network error reaching the provider.",
29
+ suggestion: "Check your connection and the provider baseUrl, then retry. Transient errors are retried automatically.",
30
+ },
31
+ {
32
+ test: /\bcontext (limit|length|window)|too long|maximum context|prompt is too long\b/i,
33
+ message: () => "The conversation exceeded the model's context window.",
34
+ suggestion: "Start a new session, /compact the history, or switch to a model with a larger context window.",
35
+ },
36
+ {
37
+ test: /\b(insufficient_quota|quota|billing|payment|credit)\b/i,
38
+ message: () => "The provider rejected the request for billing/quota reasons.",
39
+ suggestion: "Check the provider account's quota/billing, then retry.",
40
+ },
41
+ {
42
+ test: /\b(500|502|503|504|overloaded|server error|service unavailable)\b/i,
43
+ message: () => "The provider had a server-side error.",
44
+ suggestion: "This is usually transient — retry shortly, or switch models if it persists.",
45
+ },
46
+ ];
47
+ export function friendlyError(err) {
48
+ const raw = err instanceof Error ? err.message : typeof err === "string" ? err : String(err);
49
+ for (const rule of RULES) {
50
+ if (rule.test.test(raw)) {
51
+ return {
52
+ message: rule.message ? rule.message(raw) : raw,
53
+ suggestion: rule.suggestion,
54
+ };
55
+ }
56
+ }
57
+ return { message: raw };
58
+ }
59
+ /** One-line form: "<message> (<suggestion>)" — what the UI shows. */
60
+ export function formatFriendlyError(err) {
61
+ const f = friendlyError(err);
62
+ return f.suggestion ? `${f.message}\n→ ${f.suggestion}` : f.message;
63
+ }
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Goal mode P0 — run-scoped budget guardrails.
3
+ *
4
+ * `GoalConfig` is the normalized internal shape. Public entry points
5
+ * (protocol/server, engine run) accept `string | GoalConfig` for
6
+ * back-compat and call `normalizeGoal()` once at the boundary; everything
7
+ * inward uses `GoalConfig`.
8
+ *
9
+ * The budget tracker is RUN-scoped (not per-turn like token-budget.ts):
10
+ * it accumulates total tokens across turns and stamps a wall-clock start,
11
+ * so an unattended goal run can't burn tokens or wall time without bound.
12
+ */
13
+ export interface GoalConfig {
14
+ /** The objective text shown to the judge / injected into context. */
15
+ objective: string;
16
+ /** Hard cap on total tokens (prompt+completion) for the whole goal run. */
17
+ tokenBudget?: number;
18
+ /** Hard cap on wall-clock duration of the whole goal run, in ms. */
19
+ timeBudgetMs?: number;
20
+ /**
21
+ * Hard cap on total turns for this goal run. When set, it overrides the
22
+ * engine's interactive maxTurns default — a goal ("keep going until done")
23
+ * routinely needs more turns than a single interactive prompt, and the
24
+ * stop-hook keeps re-blocking completion, so the 100-turn interactive
25
+ * ceiling would silently truncate a long unattended goal. Drops
26
+ * non-positive values to "no override". See GOAL_DEFAULT_MAX_TURNS for the
27
+ * fallback applied when a goal is active but no explicit cap was given.
28
+ */
29
+ maxTurns?: number;
30
+ /**
31
+ * Max CONSECUTIVE times the on_stop judge may block termination before the
32
+ * loop forces a stop (the "stuck on an unsatisfiable goal" backstop). A goal
33
+ * that keeps legitimately making progress resets this every accepted turn, so
34
+ * this only bites when the judge re-blocks over and over with no completion.
35
+ * Overrides GOAL_DEFAULT_MAX_STOP_BLOCKS. Non-positive values are dropped.
36
+ */
37
+ maxStopBlocks?: number;
38
+ /**
39
+ * Epoch-ms timestamp of when the user last set/replaced this goal. The judge
40
+ * uses it to anchor RELATIVE deadlines written in the objective ("做到3点"、
41
+ * "until 15:00"): a bare "3点" is read as the first such time AFTER the goal
42
+ * was set, not after "now" — otherwise, once the clock passes the deadline,
43
+ * the judge could misread it as tomorrow's 3点 and never stop. Stamped at the
44
+ * override site (Engine), preserved through normalize so a resumed/inherited
45
+ * goal keeps its original anchor. Absent for goals created before this field
46
+ * existed → the judge falls back to reasoning from current time alone.
47
+ */
48
+ setAtMs?: number;
49
+ }
50
+ /**
51
+ * Default consecutive-stop-block cap for goal runs. The real safety net for an
52
+ * unattended goal is the token/time budget + maxTurns; this cap only stops a
53
+ * goal that the judge keeps re-blocking with NO progress between blocks. 8 was
54
+ * too tight — a complex goal can legitimately get "not yet" several times while
55
+ * advancing — so we allow a generous streak before declaring it stuck.
56
+ */
57
+ export declare const GOAL_DEFAULT_MAX_STOP_BLOCKS = 25;
58
+ /**
59
+ * Consecutive-stop-block cap for NON-goal (interactive) runs. The 25-block goal
60
+ * default is far too loose for a plain interactive session: a plugin `on_stop`
61
+ * hook that keeps returning continueSession would loop 25× before the backstop
62
+ * bites (~3× the model calls). Non-goal runs fall back to this tighter cap —
63
+ * the historical value before the goal feature raised the goal-mode default.
64
+ */
65
+ export declare const INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS = 8;
66
+ /**
67
+ * Resolve the consecutive-stop-block cap for a run. Precedence:
68
+ * 1. explicit `configMaxStopBlocks` (engine/caller override)
69
+ * 2. `goal.maxStopBlocks`
70
+ * 3. GOAL_DEFAULT_MAX_STOP_BLOCKS when a goal is active,
71
+ * INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS otherwise (don't leak the loose goal
72
+ * cap onto plain interactive runs — see B3 in the redesign doc).
73
+ * Pure + injectable so engine and tests agree.
74
+ */
75
+ export declare function resolveMaxStopBlocks(configMaxStopBlocks: number | undefined, goal: GoalConfig | undefined): number;
76
+ /**
77
+ * Turn ceiling applied when a goal is active and neither the GoalConfig nor
78
+ * the engine config set an explicit maxTurns. Higher than the interactive
79
+ * default (100) because goal runs are unattended and the stop-hook keeps the
80
+ * loop going until the objective is met — the real safety backstops are the
81
+ * token/time budgets and maxStopBlocks, not this ceiling. A round 300 gives
82
+ * long goals room while still bounding a pathological loop.
83
+ */
84
+ export declare const GOAL_DEFAULT_MAX_TURNS = 300;
85
+ /**
86
+ * Coerce a raw goal input into a normalized GoalConfig, or undefined when
87
+ * there is effectively no goal (empty objective). Drops non-positive
88
+ * budgets (0 / negative → "no limit", same as absent).
89
+ */
90
+ export declare function normalizeGoal(raw: string | GoalConfig | undefined): GoalConfig | undefined;
91
+ /**
92
+ * Decide the goal-set timestamp (setAtMs) to persist when a send supplies an
93
+ * explicit goal. Pure so the engine and tests agree on the anchor rule:
94
+ * - A NEW or CHANGED objective → stamp `nowMs` (the user just expressed a
95
+ * fresh goal; any relative deadline in it is anchored to now).
96
+ * - The SAME objective continuing (bare re-send inheriting the stored goal) →
97
+ * keep the stored anchor, so a re-send doesn't silently move the deadline.
98
+ * Falls back to `nowMs` if the stored goal predates this field.
99
+ * `stored` is the previously-persisted active goal (or undefined for the first
100
+ * goal on a session).
101
+ */
102
+ export declare function resolveGoalSetAt(explicitObjective: string, stored: GoalConfig | undefined, nowMs: number): number;
103
+ /** Interactive (no-goal) turn ceiling — a single prompt rarely needs more. */
104
+ export declare const INTERACTIVE_DEFAULT_MAX_TURNS = 100;
105
+ /**
106
+ * Resolve the turn ceiling for a run, honoring goal mode.
107
+ *
108
+ * Precedence (first defined wins):
109
+ * 1. `configMaxTurns` — an explicit engine/caller override (always wins).
110
+ * 2. `goal.maxTurns` — a per-goal cap from the GoalConfig.
111
+ * 3. `GOAL_DEFAULT_MAX_TURNS` when a goal is active (raise the unattended
112
+ * ceiling above the interactive default).
113
+ * 4. `INTERACTIVE_DEFAULT_MAX_TURNS` otherwise.
114
+ *
115
+ * Pure + injectable so the engine and tests agree on the rule.
116
+ */
117
+ export declare function resolveMaxTurns(configMaxTurns: number | undefined, goal: GoalConfig | undefined): number;
118
+ /**
119
+ * How close a run is to either hard ceiling. Both maxTurns and maxStopBlocks
120
+ * can force-stop a goal, so the "approaching limit" UX must watch BOTH — the
121
+ * old code only watched maxTurns (turnsRemaining===2), but a re-blocked goal
122
+ * almost always hits the much-tighter stop-block cap first. See redesign doc.
123
+ */
124
+ export interface LimitProximity {
125
+ /** Turns left before maxTurns (maxTurns - turnCount). */
126
+ turnsRemaining: number;
127
+ /** Consecutive blocks left before maxStopBlocks (cap - stopBlockCount). */
128
+ stopBlocksRemaining: number;
129
+ /** True when EITHER dimension is within its approach threshold. */
130
+ approaching: boolean;
131
+ /** Which ceiling is closest — drives UI copy and the extend default. */
132
+ nearest: "turns" | "stopBlocks";
133
+ }
134
+ /** Warn when this many turns (or fewer) remain before maxTurns. */
135
+ export declare const APPROACH_TURNS = 5;
136
+ /** Warn when this many consecutive blocks (or fewer) remain before the cap. */
137
+ export declare const APPROACH_STOP_BLOCKS = 3;
138
+ /**
139
+ * Compute proximity to the two stop ceilings. Pure so turn-loop and tests
140
+ * agree. `nearest` favors stopBlocks when both are near, because the stop-block
141
+ * cap (default 25) is reached far sooner than maxTurns (default 300) for a
142
+ * goal the judge keeps re-blocking — it's the limit that actually bites.
143
+ */
144
+ export declare function limitProximity(turnCount: number, maxTurns: number, stopBlockCount: number, maxStopBlocks: number): LimitProximity;
145
+ export interface GoalExtension {
146
+ addTurns?: number;
147
+ addTokenBudget?: number;
148
+ addTimeBudgetMs?: number;
149
+ /** Raise the consecutive-stop-block cap — the limit that usually bites. */
150
+ addStopBlocks?: number;
151
+ }
152
+ /**
153
+ * Compute the new turn ceiling + goal budgets after a mid-run extension
154
+ * (TODO 3.1). Pure so the TurnLoop and tests agree on the arithmetic:
155
+ * - addTurns bumps the maxTurns ceiling (floored, positive only).
156
+ * - addTokenBudget/addTimeBudgetMs raise the goal's caps. When a cap was
157
+ * previously unset ("unlimited"), we seed it from CURRENT USAGE before
158
+ * adding — `tokensUsed` for tokens, `elapsedMs` for time — so extending an
159
+ * unbounded run sets a fresh cap ABOVE current usage rather than below it.
160
+ * (Seeding time from 0 was bug B1: a long-running unbounded goal would get
161
+ * a cap below its elapsed time and force-stop immediately on extend.)
162
+ * - addStopBlocks is handled by the caller (TurnLoop.extend) against the live
163
+ * config, not here, since it isn't part of the goal budget shape.
164
+ * `tokensUsed`/`elapsedMs` are the tracker's running totals (used only to seed
165
+ * unset caps). Returns the resulting limits; never mutates its inputs.
166
+ */
167
+ export declare function applyGoalExtension(currentMaxTurns: number, goal: GoalConfig | undefined, tokensUsed: number, elapsedMs: number, ext: GoalExtension): {
168
+ maxTurns: number;
169
+ tokenBudget?: number;
170
+ timeBudgetMs?: number;
171
+ };
172
+ export interface GoalBudgetTracker {
173
+ goal: GoalConfig;
174
+ /** Wall-clock start (ms epoch), captured at run start. */
175
+ startedAtMs: number;
176
+ /** Accumulated total tokens (prompt + completion) across all turns. */
177
+ tokensUsed: number;
178
+ }
179
+ /** Create a run-scoped tracker. `nowMs` is injected for testability. */
180
+ export declare function createGoalBudgetTracker(goal: GoalConfig, nowMs: number): GoalBudgetTracker;
181
+ /** Add this turn's token usage to the running total. */
182
+ export declare function recordGoalUsage(tracker: GoalBudgetTracker, turnTokens: number): void;
183
+ /**
184
+ * Has the run exceeded any configured budget? `nowMs` is injected so callers
185
+ * pass the current clock (and tests pass a fixed value).
186
+ */
187
+ export declare function goalBudgetExceeded(tracker: GoalBudgetTracker, nowMs: number): boolean;
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Goal mode P0 — run-scoped budget guardrails.
3
+ *
4
+ * `GoalConfig` is the normalized internal shape. Public entry points
5
+ * (protocol/server, engine run) accept `string | GoalConfig` for
6
+ * back-compat and call `normalizeGoal()` once at the boundary; everything
7
+ * inward uses `GoalConfig`.
8
+ *
9
+ * The budget tracker is RUN-scoped (not per-turn like token-budget.ts):
10
+ * it accumulates total tokens across turns and stamps a wall-clock start,
11
+ * so an unattended goal run can't burn tokens or wall time without bound.
12
+ */
13
+ /**
14
+ * Default consecutive-stop-block cap for goal runs. The real safety net for an
15
+ * unattended goal is the token/time budget + maxTurns; this cap only stops a
16
+ * goal that the judge keeps re-blocking with NO progress between blocks. 8 was
17
+ * too tight — a complex goal can legitimately get "not yet" several times while
18
+ * advancing — so we allow a generous streak before declaring it stuck.
19
+ */
20
+ export const GOAL_DEFAULT_MAX_STOP_BLOCKS = 25;
21
+ /**
22
+ * Consecutive-stop-block cap for NON-goal (interactive) runs. The 25-block goal
23
+ * default is far too loose for a plain interactive session: a plugin `on_stop`
24
+ * hook that keeps returning continueSession would loop 25× before the backstop
25
+ * bites (~3× the model calls). Non-goal runs fall back to this tighter cap —
26
+ * the historical value before the goal feature raised the goal-mode default.
27
+ */
28
+ export const INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS = 8;
29
+ /**
30
+ * Resolve the consecutive-stop-block cap for a run. Precedence:
31
+ * 1. explicit `configMaxStopBlocks` (engine/caller override)
32
+ * 2. `goal.maxStopBlocks`
33
+ * 3. GOAL_DEFAULT_MAX_STOP_BLOCKS when a goal is active,
34
+ * INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS otherwise (don't leak the loose goal
35
+ * cap onto plain interactive runs — see B3 in the redesign doc).
36
+ * Pure + injectable so engine and tests agree.
37
+ */
38
+ export function resolveMaxStopBlocks(configMaxStopBlocks, goal) {
39
+ if (typeof configMaxStopBlocks === "number" && configMaxStopBlocks > 0) {
40
+ return Math.floor(configMaxStopBlocks);
41
+ }
42
+ if (goal?.maxStopBlocks && goal.maxStopBlocks > 0)
43
+ return goal.maxStopBlocks;
44
+ return goal ? GOAL_DEFAULT_MAX_STOP_BLOCKS : INTERACTIVE_DEFAULT_MAX_STOP_BLOCKS;
45
+ }
46
+ /**
47
+ * Turn ceiling applied when a goal is active and neither the GoalConfig nor
48
+ * the engine config set an explicit maxTurns. Higher than the interactive
49
+ * default (100) because goal runs are unattended and the stop-hook keeps the
50
+ * loop going until the objective is met — the real safety backstops are the
51
+ * token/time budgets and maxStopBlocks, not this ceiling. A round 300 gives
52
+ * long goals room while still bounding a pathological loop.
53
+ */
54
+ export const GOAL_DEFAULT_MAX_TURNS = 300;
55
+ /**
56
+ * Coerce a raw goal input into a normalized GoalConfig, or undefined when
57
+ * there is effectively no goal (empty objective). Drops non-positive
58
+ * budgets (0 / negative → "no limit", same as absent).
59
+ */
60
+ export function normalizeGoal(raw) {
61
+ if (raw == null)
62
+ return undefined;
63
+ const obj = typeof raw === "string" ? { objective: raw } : { ...raw };
64
+ const objective = (obj.objective ?? "").trim();
65
+ if (!objective)
66
+ return undefined;
67
+ const out = { objective };
68
+ if (typeof obj.tokenBudget === "number" && obj.tokenBudget > 0)
69
+ out.tokenBudget = obj.tokenBudget;
70
+ if (typeof obj.timeBudgetMs === "number" && obj.timeBudgetMs > 0)
71
+ out.timeBudgetMs = obj.timeBudgetMs;
72
+ if (typeof obj.maxTurns === "number" && obj.maxTurns > 0)
73
+ out.maxTurns = Math.floor(obj.maxTurns);
74
+ if (typeof obj.maxStopBlocks === "number" && obj.maxStopBlocks > 0) {
75
+ out.maxStopBlocks = Math.floor(obj.maxStopBlocks);
76
+ }
77
+ // Preserve a positive goal-set timestamp so a resumed/inherited goal keeps
78
+ // the anchor for relative deadlines. Non-positive/junk is dropped, matching
79
+ // the budget fields (a bogus anchor is worse than none).
80
+ if (typeof obj.setAtMs === "number" && obj.setAtMs > 0)
81
+ out.setAtMs = obj.setAtMs;
82
+ return out;
83
+ }
84
+ /**
85
+ * Decide the goal-set timestamp (setAtMs) to persist when a send supplies an
86
+ * explicit goal. Pure so the engine and tests agree on the anchor rule:
87
+ * - A NEW or CHANGED objective → stamp `nowMs` (the user just expressed a
88
+ * fresh goal; any relative deadline in it is anchored to now).
89
+ * - The SAME objective continuing (bare re-send inheriting the stored goal) →
90
+ * keep the stored anchor, so a re-send doesn't silently move the deadline.
91
+ * Falls back to `nowMs` if the stored goal predates this field.
92
+ * `stored` is the previously-persisted active goal (or undefined for the first
93
+ * goal on a session).
94
+ */
95
+ export function resolveGoalSetAt(explicitObjective, stored, nowMs) {
96
+ const sameGoalContinues = !!stored && stored.objective === explicitObjective;
97
+ return sameGoalContinues ? stored.setAtMs ?? nowMs : nowMs;
98
+ }
99
+ /** Interactive (no-goal) turn ceiling — a single prompt rarely needs more. */
100
+ export const INTERACTIVE_DEFAULT_MAX_TURNS = 100;
101
+ /**
102
+ * Resolve the turn ceiling for a run, honoring goal mode.
103
+ *
104
+ * Precedence (first defined wins):
105
+ * 1. `configMaxTurns` — an explicit engine/caller override (always wins).
106
+ * 2. `goal.maxTurns` — a per-goal cap from the GoalConfig.
107
+ * 3. `GOAL_DEFAULT_MAX_TURNS` when a goal is active (raise the unattended
108
+ * ceiling above the interactive default).
109
+ * 4. `INTERACTIVE_DEFAULT_MAX_TURNS` otherwise.
110
+ *
111
+ * Pure + injectable so the engine and tests agree on the rule.
112
+ */
113
+ export function resolveMaxTurns(configMaxTurns, goal) {
114
+ if (typeof configMaxTurns === "number" && configMaxTurns > 0)
115
+ return configMaxTurns;
116
+ if (goal)
117
+ return goal.maxTurns ?? GOAL_DEFAULT_MAX_TURNS;
118
+ return INTERACTIVE_DEFAULT_MAX_TURNS;
119
+ }
120
+ /** Warn when this many turns (or fewer) remain before maxTurns. */
121
+ export const APPROACH_TURNS = 5;
122
+ /** Warn when this many consecutive blocks (or fewer) remain before the cap. */
123
+ export const APPROACH_STOP_BLOCKS = 3;
124
+ /**
125
+ * Compute proximity to the two stop ceilings. Pure so turn-loop and tests
126
+ * agree. `nearest` favors stopBlocks when both are near, because the stop-block
127
+ * cap (default 25) is reached far sooner than maxTurns (default 300) for a
128
+ * goal the judge keeps re-blocking — it's the limit that actually bites.
129
+ */
130
+ export function limitProximity(turnCount, maxTurns, stopBlockCount, maxStopBlocks) {
131
+ const turnsRemaining = maxTurns - turnCount;
132
+ const stopBlocksRemaining = maxStopBlocks - stopBlockCount;
133
+ const turnsNear = turnsRemaining <= APPROACH_TURNS;
134
+ const blocksNear = stopBlocksRemaining <= APPROACH_STOP_BLOCKS;
135
+ return {
136
+ turnsRemaining,
137
+ stopBlocksRemaining,
138
+ approaching: turnsNear || blocksNear,
139
+ nearest: blocksNear ? "stopBlocks" : "turns",
140
+ };
141
+ }
142
+ /**
143
+ * Compute the new turn ceiling + goal budgets after a mid-run extension
144
+ * (TODO 3.1). Pure so the TurnLoop and tests agree on the arithmetic:
145
+ * - addTurns bumps the maxTurns ceiling (floored, positive only).
146
+ * - addTokenBudget/addTimeBudgetMs raise the goal's caps. When a cap was
147
+ * previously unset ("unlimited"), we seed it from CURRENT USAGE before
148
+ * adding — `tokensUsed` for tokens, `elapsedMs` for time — so extending an
149
+ * unbounded run sets a fresh cap ABOVE current usage rather than below it.
150
+ * (Seeding time from 0 was bug B1: a long-running unbounded goal would get
151
+ * a cap below its elapsed time and force-stop immediately on extend.)
152
+ * - addStopBlocks is handled by the caller (TurnLoop.extend) against the live
153
+ * config, not here, since it isn't part of the goal budget shape.
154
+ * `tokensUsed`/`elapsedMs` are the tracker's running totals (used only to seed
155
+ * unset caps). Returns the resulting limits; never mutates its inputs.
156
+ */
157
+ export function applyGoalExtension(currentMaxTurns, goal, tokensUsed, elapsedMs, ext) {
158
+ let maxTurns = currentMaxTurns;
159
+ if (typeof ext.addTurns === "number" && ext.addTurns > 0) {
160
+ maxTurns += Math.floor(ext.addTurns);
161
+ }
162
+ let tokenBudget = goal?.tokenBudget;
163
+ let timeBudgetMs = goal?.timeBudgetMs;
164
+ if (goal) {
165
+ if (typeof ext.addTokenBudget === "number" && ext.addTokenBudget > 0) {
166
+ tokenBudget = (tokenBudget ?? tokensUsed) + Math.floor(ext.addTokenBudget);
167
+ }
168
+ if (typeof ext.addTimeBudgetMs === "number" && ext.addTimeBudgetMs > 0) {
169
+ // Seed an unset cap from elapsed time (not 0), mirroring the token branch,
170
+ // so the new cap lands above current usage. Fixes B1.
171
+ timeBudgetMs = (timeBudgetMs ?? elapsedMs) + Math.floor(ext.addTimeBudgetMs);
172
+ }
173
+ }
174
+ return { maxTurns, tokenBudget, timeBudgetMs };
175
+ }
176
+ /** Create a run-scoped tracker. `nowMs` is injected for testability. */
177
+ export function createGoalBudgetTracker(goal, nowMs) {
178
+ return { goal, startedAtMs: nowMs, tokensUsed: 0 };
179
+ }
180
+ /** Add this turn's token usage to the running total. */
181
+ export function recordGoalUsage(tracker, turnTokens) {
182
+ if (turnTokens > 0)
183
+ tracker.tokensUsed += turnTokens;
184
+ }
185
+ /**
186
+ * Has the run exceeded any configured budget? `nowMs` is injected so callers
187
+ * pass the current clock (and tests pass a fixed value).
188
+ */
189
+ export function goalBudgetExceeded(tracker, nowMs) {
190
+ const { tokenBudget, timeBudgetMs } = tracker.goal;
191
+ if (typeof tokenBudget === "number" && tracker.tokensUsed > tokenBudget)
192
+ return true;
193
+ if (typeof timeBudgetMs === "number" && nowMs - tracker.startedAtMs > timeBudgetMs)
194
+ return true;
195
+ return false;
196
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Engine-side image compression — the fallback for hosts that didn't
3
+ * pre-compress.
4
+ *
5
+ * The desktop renderer already compresses via <canvas> + Blob before
6
+ * sending; the TUI and MCP image-returning tools historically didn't.
7
+ * When the {@link enforceImagePolicy} gate would otherwise refuse a
8
+ * turn for "image too large", we try to bring the offender(s) under
9
+ * the limit first by:
10
+ *
11
+ * 1. Decoding the base64 payload.
12
+ * 2. Resizing the longest edge down to {@link IMAGE_TARGETS.targetMaxDimension}.
13
+ * 3. Re-encoding as JPEG at {@link IMAGE_TARGETS.jpegQuality}.
14
+ *
15
+ * jimp is the obvious pick — pure-JS, no native binaries, runs in
16
+ * both Node and Bun, supports PNG / JPEG / WebP input. But shipping
17
+ * it as a hard `core` dep would balloon the published bundle for
18
+ * every consumer. So we resolve it dynamically: hosts that want
19
+ * automatic compression just `npm install jimp`; everyone else gets
20
+ * the existing "image too large" refusal.
21
+ *
22
+ * Hosts can also inject a custom {@link ImageCompressor} via
23
+ * {@link setEngineImageCompressor} — useful for tests, future
24
+ * sharp-based compressors, or arena agents with different size
25
+ * targets.
26
+ *
27
+ * The defaults must stay pure-JS so this module is safe to bundle for
28
+ * Electron preload / browser worker contexts. Anything that needs
29
+ * native code (e.g. sharp) should be injected explicitly.
30
+ */
31
+ import type { ParsedImage } from "./parse-task.js";
32
+ /**
33
+ * Outcome of one compression attempt. `compressed` is set only when
34
+ * the host actually re-encoded the image — callers can compare bytes
35
+ * before/after to decide whether to log the optimization.
36
+ */
37
+ export interface ImageCompressionResult {
38
+ /** The (possibly) re-encoded image, ready to replace the original. */
39
+ image: ParsedImage;
40
+ /** True if the host actually produced new bytes. */
41
+ compressed: boolean;
42
+ /** Source size in decoded bytes (informational only). */
43
+ originalBytes: number;
44
+ /** Final size in decoded bytes (informational only). */
45
+ finalBytes: number;
46
+ }
47
+ /**
48
+ * Compressor strategy. Implementations should be idempotent — re-
49
+ * running compression on an already-small image should be a no-op,
50
+ * returning `compressed: false`.
51
+ */
52
+ export interface ImageCompressor {
53
+ /**
54
+ * Attempt to bring `image` under `maxBytes`. Implementations may
55
+ * downscale, re-encode, or otherwise transform the payload. Return
56
+ * the original image with `compressed: false` if nothing helped.
57
+ *
58
+ * Implementations MUST NOT mutate `image` — return a new ParsedImage
59
+ * with the new base64.
60
+ */
61
+ compress(image: ParsedImage, maxBytes: number): Promise<ImageCompressionResult>;
62
+ }
63
+ /**
64
+ * Override the engine's active compressor. Pass `null` to clear the
65
+ * override and fall back to lazy jimp resolution. Hosts that want
66
+ * deterministic behavior in tests typically call this with a stub.
67
+ */
68
+ export declare function setEngineImageCompressor(c: ImageCompressor | null): void;
69
+ /** Reset state — for tests. */
70
+ export declare function resetEngineImageCompressor(): void;
71
+ /**
72
+ * Try compressing every image in the batch so it fits under the
73
+ * single-image cap. Returns the (possibly transformed) batch plus a
74
+ * summary of what changed. Callers should hand the returned images
75
+ * back into {@link enforceImagePolicy} to confirm; this function
76
+ * doesn't itself decide whether the result is acceptable.
77
+ */
78
+ export declare function tryCompressImages(images: readonly ParsedImage[]): Promise<{
79
+ images: ParsedImage[];
80
+ anyCompressed: boolean;
81
+ }>;