@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
@@ -1,3 +1,4 @@
1
+ import { isAbortError } from "../llm/client-base.js";
1
2
  /**
2
3
  * One ChatSession per UI chat tab. Owns a single Engine, an AbortController
3
4
  * for the active turn, and a FIFO queue so a fast second send waits for the
@@ -19,6 +20,30 @@ export class ChatSession {
19
20
  active = null;
20
21
  controller = null;
21
22
  defaultOnStream;
23
+ /**
24
+ * Model-pool key requested via requestModelSwitch while a turn was in
25
+ * flight. Applied at the next run boundary (before the next turn starts) so
26
+ * we never swap the model out from under a running LLM client — the bug the
27
+ * session-isolation research flagged. null = nothing pending.
28
+ */
29
+ pendingModel = null;
30
+ /**
31
+ * Set by cancel() so the in-flight turn's abort error resolves as a clean
32
+ * "cancelled" result instead of rejecting (which the RPC layer would surface
33
+ * as a scary red Error in the UI for what was a user-initiated Stop). The
34
+ * onboarding flow cancels + immediately re-runs the same task; without this
35
+ * the cancelled first run popped "Error: Request cancelled".
36
+ */
37
+ cancelledActive = false;
38
+ /**
39
+ * Sticky flag: the user cancelled (Stop) and has not started a new turn
40
+ * since. cancel() leaves the session idle (active=null), so isBusy() can't
41
+ * distinguish "naturally idle" from "user just stopped me". A background-job
42
+ * completion that lands in this window must NOT auto-resume the session —
43
+ * that would defeat the Stop. Cleared the moment a real turn is enqueued
44
+ * (the user is engaging again) so normal wakeups resume working afterward.
45
+ */
46
+ cancelledSinceLastTurn = false;
22
47
  constructor(opts) {
23
48
  this.id = opts.id;
24
49
  this.engine = opts.engine;
@@ -26,11 +51,24 @@ export class ChatSession {
26
51
  }
27
52
  enqueueTurn(task, opts) {
28
53
  this.lastActivityAt = Date.now();
54
+ // The user (or a wakeup the guard already let through) is starting a turn —
55
+ // clear the post-Stop suppression so future background-job completions
56
+ // wake the session again.
57
+ this.cancelledSinceLastTurn = false;
29
58
  return new Promise((resolve, reject) => {
30
59
  this.queue.push({ task, opts, resolve, reject });
31
60
  this.pump();
32
61
  });
33
62
  }
63
+ /**
64
+ * True when the user hit Stop and hasn't started a new turn since. The server
65
+ * consults this before auto-waking an idle session on a background-job
66
+ * completion, so a download finishing right after Stop doesn't restart the
67
+ * agent the user just halted.
68
+ */
69
+ wasCancelledSinceLastTurn() {
70
+ return this.cancelledSinceLastTurn;
71
+ }
34
72
  /**
35
73
  * Abort the in-flight turn and drain queued turns.
36
74
  *
@@ -40,6 +78,12 @@ export class ChatSession {
40
78
  * are always rejected regardless.
41
79
  */
42
80
  cancel() {
81
+ // Mark the in-flight turn as user-cancelled so pump()'s catch resolves it
82
+ // as a clean aborted result rather than rejecting (→ UI Error).
83
+ if (this.active)
84
+ this.cancelledActive = true;
85
+ // Suppress auto-wakeup until the user engages again (see the field doc).
86
+ this.cancelledSinceLastTurn = true;
43
87
  this.controller?.abort();
44
88
  // Drain queued turns as cancelled
45
89
  const drained = this.queue.splice(0);
@@ -50,6 +94,55 @@ export class ChatSession {
50
94
  isBusy() {
51
95
  return this.active !== null;
52
96
  }
97
+ /**
98
+ * Extend the in-flight goal run's turn/budget ceilings (TODO 3.1). Delegates
99
+ * to the engine, which forwards to the active TurnLoop. Returns null when no
100
+ * run is active (or the run has no extendable loop). Mirrors the cancel()
101
+ * mid-run control path.
102
+ */
103
+ extendGoalRun(opts) {
104
+ return this.engine.extendGoalRun(opts);
105
+ }
106
+ /**
107
+ * Read this session's persisted active goal (state.activeGoal), or undefined
108
+ * when none. Cheap — reads only state.json. The host calls this on session
109
+ * load to re-surface the goal block + Cancel button after a reload.
110
+ */
111
+ getGoal() {
112
+ return this.engine.getGoal(this.id);
113
+ }
114
+ /**
115
+ * Clear this session's persisted active goal (CC /goal clear). Works idle or
116
+ * mid-run. Returns true if a goal was actually cleared.
117
+ */
118
+ clearGoal() {
119
+ return this.engine.clearGoal(this.id);
120
+ }
121
+ /**
122
+ * Switch this session's active model (per-session, not worker-global).
123
+ * Applies immediately when idle; defers to the next run boundary when a
124
+ * turn is in flight so a hot switch never mutates the model under a
125
+ * running LLM client.
126
+ */
127
+ requestModelSwitch(key) {
128
+ if (this.isBusy()) {
129
+ this.pendingModel = key;
130
+ return;
131
+ }
132
+ this.applyModelSwitch(key);
133
+ }
134
+ /**
135
+ * Perform the actual model switch for this session: rotate the engine's model
136
+ * and reset the session's cumulative usage on disk — a different model has a
137
+ * different prompt cache, so the old cache-hit stats no longer apply. The
138
+ * renderer zeroes its own cumulative display when it issues the switch (it's
139
+ * renderer-initiated), so no stream event is needed here. Shared by the idle
140
+ * path and the deferred run-boundary path.
141
+ */
142
+ applyModelSwitch(key) {
143
+ this.engine.switchModel(key);
144
+ this.engine.resetSessionUsage(this.id);
145
+ }
53
146
  queueDepth() {
54
147
  return this.queue.length;
55
148
  }
@@ -60,6 +153,7 @@ export class ChatSession {
60
153
  if (!next)
61
154
  return;
62
155
  this.active = next;
156
+ this.cancelledActive = false;
63
157
  this.controller = new AbortController();
64
158
  try {
65
159
  const onStream = next.opts.onStream ?? this.defaultOnStream;
@@ -68,16 +162,42 @@ export class ChatSession {
68
162
  sessionId: this.id,
69
163
  signal: this.controller.signal,
70
164
  onStream,
165
+ goal: next.opts.goal,
166
+ injected: next.opts.injected,
71
167
  });
72
168
  this.lastActivityAt = Date.now();
73
169
  next.resolve(result);
74
170
  }
75
171
  catch (err) {
76
- next.reject(err);
172
+ // A user-initiated cancel (Stop, or the onboarding cancel+rerun flow)
173
+ // aborts the in-flight run. That's not a failure — resolve it as a clean
174
+ // aborted result so the RPC layer doesn't surface "Error: Request
175
+ // cancelled" in the UI. Only abort errors on a cancelled turn are
176
+ // swallowed this way; a genuine error still rejects.
177
+ if (this.cancelledActive && (isAbortError(err) || this.controller?.signal.aborted)) {
178
+ next.resolve({
179
+ text: "",
180
+ reason: "aborted_streaming",
181
+ sessionId: this.id,
182
+ turnCount: 0,
183
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
184
+ });
185
+ }
186
+ else {
187
+ next.reject(err);
188
+ }
77
189
  }
78
190
  finally {
79
191
  this.active = null;
80
192
  this.controller = null;
193
+ this.cancelledActive = false;
194
+ // Run boundary: apply any model switch that was deferred because it was
195
+ // requested mid-run. Done here (not in pump) so it still applies when
196
+ // no further turn is queued.
197
+ if (this.pendingModel !== null) {
198
+ this.applyModelSwitch(this.pendingModel);
199
+ this.pendingModel = null;
200
+ }
81
201
  // Drain the next turn if one is waiting.
82
202
  if (this.queue.length > 0)
83
203
  void this.pump();
@@ -64,6 +64,33 @@ export declare class AgentClient {
64
64
  * Legacy form: cancel(reason?)
65
65
  */
66
66
  cancel(sessionId?: string, reason?: string): Promise<void>;
67
+ /**
68
+ * Clear a session's persisted active goal (CC `/goal clear`). Returns whether
69
+ * a goal was actually cleared (false = there was none).
70
+ */
71
+ goalClear(sessionId?: string): Promise<boolean>;
72
+ /**
73
+ * Read a session's persisted active goal objective, or null when there's
74
+ * none. The host calls this on session load to re-surface the goal block +
75
+ * Cancel button after a reload (a persistent goal isn't replayed from the
76
+ * transcript, so the live stream never re-announces it).
77
+ */
78
+ goalGet(sessionId: string): Promise<string | null>;
79
+ /**
80
+ * Steer an in-flight run: queue a user message spliced in at the next
81
+ * turn-loop step (不打断 — does not abort the current step). `id` is a stable
82
+ * host-side handle that rides through to the steer_injected event and lets
83
+ * unsteer() revoke a still-pending entry. Mirrors the server's handleSteer +
84
+ * the desktop preload's steer(); without it the SDK can't reach the method
85
+ * (request() is private) — the protocol was asymmetric after the steer merge.
86
+ */
87
+ steer(sessionId: string, text: string, id?: string): Promise<void>;
88
+ /**
89
+ * Revoke a still-pending steer entry by id (before the loop consumes it).
90
+ * Returns false when the loop already consumed it (not an error — it will
91
+ * arrive as a normal user bubble).
92
+ */
93
+ unsteer(sessionId: string, id: string): Promise<boolean>;
67
94
  /**
68
95
  * Update runtime configuration on the server.
69
96
  */
@@ -99,6 +99,44 @@ export class AgentClient {
99
99
  async cancel(sessionId, reason) {
100
100
  await this.request(Methods.Cancel, { sessionId, reason });
101
101
  }
102
+ /**
103
+ * Clear a session's persisted active goal (CC `/goal clear`). Returns whether
104
+ * a goal was actually cleared (false = there was none).
105
+ */
106
+ async goalClear(sessionId) {
107
+ const res = (await this.request(Methods.GoalClear, { sessionId }));
108
+ return res?.cleared === true;
109
+ }
110
+ /**
111
+ * Read a session's persisted active goal objective, or null when there's
112
+ * none. The host calls this on session load to re-surface the goal block +
113
+ * Cancel button after a reload (a persistent goal isn't replayed from the
114
+ * transcript, so the live stream never re-announces it).
115
+ */
116
+ async goalGet(sessionId) {
117
+ const res = (await this.request(Methods.GoalGet, { sessionId }));
118
+ return res?.goal ?? null;
119
+ }
120
+ /**
121
+ * Steer an in-flight run: queue a user message spliced in at the next
122
+ * turn-loop step (不打断 — does not abort the current step). `id` is a stable
123
+ * host-side handle that rides through to the steer_injected event and lets
124
+ * unsteer() revoke a still-pending entry. Mirrors the server's handleSteer +
125
+ * the desktop preload's steer(); without it the SDK can't reach the method
126
+ * (request() is private) — the protocol was asymmetric after the steer merge.
127
+ */
128
+ async steer(sessionId, text, id) {
129
+ await this.request(Methods.Steer, { sessionId, text, id });
130
+ }
131
+ /**
132
+ * Revoke a still-pending steer entry by id (before the loop consumes it).
133
+ * Returns false when the loop already consumed it (not an error — it will
134
+ * arrive as a normal user bubble).
135
+ */
136
+ async unsteer(sessionId, id) {
137
+ const res = (await this.request(Methods.Unsteer, { sessionId, id }));
138
+ return res?.removed === true;
139
+ }
102
140
  /**
103
141
  * Update runtime configuration on the server.
104
142
  */
@@ -0,0 +1,50 @@
1
+ /** Produce a short preview (`sk-…abcd`) so UIs can render presence without revealing the secret. */
2
+ export declare function makeApiKeyPreview(apiKey: string | undefined | null): string | undefined;
3
+ /**
4
+ * Return true when a dotted setting key path points at a secret field.
5
+ * Used to decide whether `config_get`'s response should redact the value.
6
+ */
7
+ export declare function isSecretKeyPath(key: string): boolean;
8
+ /**
9
+ * Redact a single value returned by config_get.
10
+ *
11
+ * Two-stage rule:
12
+ * 1. If the caller-supplied key path itself looks secret
13
+ * ("llm.apiKey", "headers.authorization", …) → collapse to "[redacted]".
14
+ * 2. Otherwise, if the value is an object/array (e.g. config_get("llm") or
15
+ * config_get("providers")), walk it with the shared secret redactor
16
+ * from logging/sanitize-messages so nested apiKey / token / Bearer
17
+ * fields don't slip through verbatim. Primitives pass unchanged.
18
+ *
19
+ * Pre-fix this only inspected the top-level key string, so
20
+ * config_get("providers") returned an array of provider objects with raw
21
+ * apiKey values intact. That defeated the purpose of the boundary.
22
+ */
23
+ export declare function maskSecretValue<T>(key: string, value: T): T | "[redacted]";
24
+ /**
25
+ * Shape of the LLM block returned to clients. We deliberately omit `apiKey`
26
+ * and surface presence/preview instead. Callers that need the raw key already
27
+ * have it server-side; clients should never see it.
28
+ */
29
+ export interface RedactedLlmConfig {
30
+ provider?: string;
31
+ model?: string;
32
+ baseUrl?: string;
33
+ maxTokens?: number;
34
+ /** True when an apiKey is configured. */
35
+ hasApiKey: boolean;
36
+ /** Short preview when an apiKey is configured; omitted otherwise. */
37
+ apiKeyPreview?: string;
38
+ }
39
+ /**
40
+ * Rewrite the LLM section of a config snapshot for transport. We only forward
41
+ * fields the client legitimately needs to render status; secrets become
42
+ * derived flags.
43
+ */
44
+ export declare function redactLlmConfig(llm: {
45
+ provider?: string;
46
+ model?: string;
47
+ apiKey?: string;
48
+ baseUrl?: string;
49
+ maxTokens?: number;
50
+ }): RedactedLlmConfig;
@@ -0,0 +1,71 @@
1
+ import { redactSecrets } from "../logging/sanitize-messages.js";
2
+ /**
3
+ * Redaction helpers for protocol query responses.
4
+ *
5
+ * The protocol exposes config snapshots to any connected client. Raw API keys,
6
+ * provider credentials, and authorization headers must never leave this
7
+ * boundary verbatim — the client can use derived fields (`hasApiKey`,
8
+ * `apiKeyPreview`) to render provider/model status without holding the secret.
9
+ *
10
+ * Two entry points:
11
+ * - redactConfigForResponse: rewrites the LLM section of the config-query
12
+ * payload, removing `apiKey` and adding derived presence/preview fields.
13
+ * - maskSecretValue: scrubs a single (key, value) pair returned by
14
+ * config_get, where the client picks the key — including `llm.apiKey`.
15
+ */
16
+ /** Match dotted/camel/snake variants of obviously secret keys. */
17
+ const SECRET_KEY_RE = /(^|[._-])(api[_-]?key|authorization|x[_-]api[_-]key|bearer[_-]?token|access[_-]?token|refresh[_-]?token|secret|password|client[_-]?secret)($|[._-])/i;
18
+ /** Produce a short preview (`sk-…abcd`) so UIs can render presence without revealing the secret. */
19
+ export function makeApiKeyPreview(apiKey) {
20
+ if (typeof apiKey !== "string" || apiKey.length === 0)
21
+ return undefined;
22
+ if (apiKey.length <= 8)
23
+ return "…";
24
+ return `${apiKey.slice(0, 3)}…${apiKey.slice(-4)}`;
25
+ }
26
+ /**
27
+ * Return true when a dotted setting key path points at a secret field.
28
+ * Used to decide whether `config_get`'s response should redact the value.
29
+ */
30
+ export function isSecretKeyPath(key) {
31
+ return SECRET_KEY_RE.test(key);
32
+ }
33
+ /**
34
+ * Redact a single value returned by config_get.
35
+ *
36
+ * Two-stage rule:
37
+ * 1. If the caller-supplied key path itself looks secret
38
+ * ("llm.apiKey", "headers.authorization", …) → collapse to "[redacted]".
39
+ * 2. Otherwise, if the value is an object/array (e.g. config_get("llm") or
40
+ * config_get("providers")), walk it with the shared secret redactor
41
+ * from logging/sanitize-messages so nested apiKey / token / Bearer
42
+ * fields don't slip through verbatim. Primitives pass unchanged.
43
+ *
44
+ * Pre-fix this only inspected the top-level key string, so
45
+ * config_get("providers") returned an array of provider objects with raw
46
+ * apiKey values intact. That defeated the purpose of the boundary.
47
+ */
48
+ export function maskSecretValue(key, value) {
49
+ if (isSecretKeyPath(key))
50
+ return "[redacted]";
51
+ if (value && typeof value === "object") {
52
+ return redactSecrets(value);
53
+ }
54
+ return value;
55
+ }
56
+ /**
57
+ * Rewrite the LLM section of a config snapshot for transport. We only forward
58
+ * fields the client legitimately needs to render status; secrets become
59
+ * derived flags.
60
+ */
61
+ export function redactLlmConfig(llm) {
62
+ const preview = makeApiKeyPreview(llm.apiKey);
63
+ return {
64
+ provider: llm.provider,
65
+ model: llm.model,
66
+ baseUrl: llm.baseUrl,
67
+ maxTokens: llm.maxTokens,
68
+ hasApiKey: typeof llm.apiKey === "string" && llm.apiKey.length > 0,
69
+ ...(preview ? { apiKeyPreview: preview } : {}),
70
+ };
71
+ }
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import type { Transport } from "./transport.js";
17
17
  import type { Engine } from "../engine/engine.js";
18
+ import type { ValidatedSettings } from "../settings/schema.js";
18
19
  import type { ChatSessionManager } from "./chat-session-manager.js";
19
20
  export interface AgentServerOptions {
20
21
  /**
@@ -29,11 +30,52 @@ export interface AgentServerOptions {
29
30
  */
30
31
  engine?: Engine;
31
32
  transport: Transport;
33
+ /**
34
+ * Reads fresh settings from disk for config hot-reload (layer 2). MUST be
35
+ * the SAME closure the engineFactory uses for new sessions (e.g.
36
+ * agent-server-stdio's `freshSettings`) so a reloaded running session and a
37
+ * newly-created session converge on identical disk config — no divergence.
38
+ * When absent, `configure({ reloadSettings })` returns an explicit error.
39
+ */
40
+ settingsReader?: () => ValidatedSettings;
41
+ /**
42
+ * Disk-only active-goal reader, used by agent/goalGet when the session is NOT
43
+ * live in chatManager. In worker (chatManager) mode there is no legacyEngine
44
+ * to fall back to, and a reopened-after-restart session isn't a live
45
+ * ChatSession yet (one is only created on agent/run), so chatManager.get()
46
+ * misses — without this the handler returned goal:null even though state.json
47
+ * still held the goal, and the UI's goal block never re-surfaced ("goal 还在
48
+ * 但页面不显示"). Wire it to SessionManager.readActiveGoal. Optional: legacy
49
+ * mode already reads disk via the engine, and tests that don't exercise the
50
+ * reopened-session path can omit it.
51
+ */
52
+ readActiveGoalFromDisk?: (sessionId: string) => import("../engine/goal.js").GoalConfig | undefined;
32
53
  }
33
54
  export declare class AgentServer {
34
55
  private readonly chatManager;
35
56
  private readonly legacyEngine;
57
+ private globalQueryEngine;
36
58
  private transport;
59
+ /** Fresh-disk settings reader for config hot-reload; null when not wired. */
60
+ private readonly settingsReader;
61
+ /** Disk-only active-goal reader for agent/goalGet on a non-live session. */
62
+ private readonly readActiveGoalFromDisk;
63
+ /**
64
+ * Monotonic config-reload version, bumped per reloadSettings request so each
65
+ * Engine.refreshRuntimeConfig can drop out-of-order (stale) deliveries (Q5).
66
+ */
67
+ private configVersion;
68
+ /**
69
+ * JSON of the last disk-default patch broadcast to ALL live sessions (#6).
70
+ * When a new reloadSettings request produces a byte-identical patch we SKIP
71
+ * the entire forEachSession broadcast — every session's refreshRuntimeConfig
72
+ * would otherwise unconditionally reloadHooks() (invalidate + full disk
73
+ * re-read + hook teardown/re-register) per call, and the personalization UI
74
+ * auto-saves on a 600ms debounce, so identical re-saves caused K× hook churn
75
+ * per keystroke-pause. A genuine change still differs in JSON → propagates.
76
+ * null until the first broadcast.
77
+ */
78
+ private lastBroadcastPatch;
37
79
  private running;
38
80
  private abortController;
39
81
  /** Pending approval requests: requestId → resolve function (legacy path) */
@@ -50,16 +92,89 @@ export declare class AgentServer {
50
92
  */
51
93
  private bgAgentBusUnsubscribe;
52
94
  constructor(options: AgentServerOptions);
95
+ /**
96
+ * Wake an IDLE chatManager session that has pending background-completion
97
+ * notifications, by enqueueing one turn whose task is the drained
98
+ * notification(s). The model then sees the completion and continues; the
99
+ * session's persisted goal (if any) is judged on that turn.
100
+ *
101
+ * Guards:
102
+ * - chatManager path only (the legacy single-engine / headless path drives
103
+ * its own loop and has no idle-session-resume concept).
104
+ * - Session must exist AND be idle. If it's busy, we do nothing: the in-flight
105
+ * run's end-of-turn `drainAll` already collects every pending notification,
106
+ * so a second run would be redundant — and `enqueueTurn` while busy would
107
+ * queue a spurious extra turn.
108
+ * - We `drainAll` exactly here and feed the items into the woken turn. This
109
+ * also merges a burst of near-simultaneous completions into one wakeup:
110
+ * the first drains all currently-pending items; subsequent bus events for
111
+ * the same session find it busy (or find an empty queue) and no-op.
112
+ *
113
+ * INVARIANT (the burst-merge correctness depends on it): the merge only
114
+ * holds because (a) the bus fans out to subscribers SYNCHRONOUSLY, and (b)
115
+ * `enqueueTurn` sets the session's `active` (→ isBusy()===true) SYNCHRONOUSLY
116
+ * before its first await. So when bus events #2..N arrive — still on the same
117
+ * synchronous fan-out as #1 — they already see the session as busy and no-op.
118
+ * If either path is ever made async (e.g. an await is added inside
119
+ * enqueueTurn before `active` is set, or the bus starts deferring delivery),
120
+ * this degrades into N concurrent wakeups for N completions. Keep both
121
+ * synchronous, or replace this comment's assumption with an explicit
122
+ * "wakeup in flight" guard flag.
123
+ */
124
+ private maybeWakeIdleSession;
53
125
  private handleRequest;
54
126
  private handleRun;
55
127
  private handleRunMulti;
56
128
  private handleRunLegacy;
57
129
  private handleApprove;
58
130
  private handleCancel;
131
+ /**
132
+ * Extend a running goal's turn/budget ceilings mid-run (TODO 3.1). Routed to
133
+ * a specific session (multi-session path). Returns the resulting effective
134
+ * limits, or an error if no session / no active run.
135
+ */
136
+ private handleGoalExtend;
137
+ /**
138
+ * Clear a session's persisted active goal (CC /goal clear). Routes to the
139
+ * named session, falling back to the legacy single engine (mirrors
140
+ * handleGoalExtend / handleCancel's dual path). Returns { ok, cleared }.
141
+ */
142
+ private handleGoalClear;
143
+ /**
144
+ * Read a session's persisted active goal so the host can re-surface the goal
145
+ * block + Cancel button on session load. A persistent goal lives only in
146
+ * state.activeGoal and is never replayed from the transcript, so a reloaded
147
+ * (or disk-rebuilt) session has no other way to learn it. Prefers a live
148
+ * chatManager session, else falls through to a disk read (readActiveGoalFromDisk
149
+ * in worker mode, or the legacy engine's disk read in single-engine mode) — the
150
+ * bug case is an aborted/reloaded session that is NOT live. Returns { ok, goal } where goal
151
+ * is the objective string, or null when there's no goal / unknown session.
152
+ * Never errors on "no goal" — null is the normal "nothing to show" answer.
153
+ */
154
+ private handleGoalGet;
155
+ /**
156
+ * Query/control a session's background shells for the desktop UI panel (TODO
157
+ * 3.2). Reads the singleton BackgroundShellManager directly (shells outlive
158
+ * the run that spawned them, so we don't need a live ChatSession). Actions:
159
+ * - (default) list → the session's shells
160
+ * - output → full retained output of one shell
161
+ * - kill → terminate one shell's process group
162
+ * All scoped by sessionId (manager enforces ownership on output/kill).
163
+ */
164
+ private handleBackgroundShells;
165
+ /**
166
+ * BackgroundWork — unified, list-only view of a session's background work
167
+ * across all three registries (shells + sub-agents + jobs) for the desktop
168
+ * background panel. Per-shell output/kill still flow through BackgroundShells
169
+ * (by shellId); this just answers "what's running in the background right now".
170
+ */
171
+ private handleBackgroundWork;
59
172
  private handleCloseSession;
60
173
  private handleConfigure;
61
174
  private handleQuery;
62
175
  private handleInject;
176
+ private handleSteer;
177
+ private handleUnsteer;
63
178
  /**
64
179
  * Ask the client to approve a tool operation (legacy single-engine path).
65
180
  */
@@ -67,14 +182,50 @@ export declare class AgentServer {
67
182
  /**
68
183
  * Ask the client to answer a question from the agent (legacy single-engine path).
69
184
  */
185
+ /**
186
+ * Per-session AskUserQuestion for the chatManager path. Mirrors
187
+ * requestAskUserFromClient but resolves via the SESSION's pendingApprovals
188
+ * (the chatManager approve handler looks there, keyed by sessionId+requestId)
189
+ * and tags the notify with sessionId so the renderer routes the question to
190
+ * the right chat tab.
191
+ */
192
+ private requestAskUserForSession;
193
+ /**
194
+ * Build a BrowserBridge whose every method routes a browser action to the
195
+ * client over the session's pendingApprovals channel (same as askUser). The
196
+ * client (Electron main) drives the webview via CDP and replies with a JSON
197
+ * result string we parse back into the typed result. On timeout / malformed
198
+ * reply we degrade to a safe error result rather than throwing.
199
+ */
200
+ private makeBrowserBridge;
201
+ private requestBrowserActionForSession;
202
+ /**
203
+ * Ask the client (Electron main) to inject a cookie credential into the
204
+ * built-in browser. Same pendingApprovals channel as browser actions; main
205
+ * calls restoreCookiesToBrowser and replies with a JSON result string we
206
+ * parse into { ok, count?, error? }. Degrades to ok:false on timeout/malformed.
207
+ */
208
+ private requestCredentialInjectForSession;
70
209
  private requestAskUserFromClient;
71
210
  private notify;
72
211
  /**
73
- * Get any available engine — used for global query ops when chatManager is
74
- * present but no legacyEngine was supplied. Borrows the first live session.
212
+ * Get any available engine — used for global query/configure ops when
213
+ * chatManager is present but no legacyEngine was supplied. Prefer a live chat
214
+ * session; before the first user turn, lazily build a detached engine through
215
+ * the manager's factory so global UI surfaces (/login, model manager, model
216
+ * selector) can query models/providers without requiring a chat session first.
75
217
  */
76
218
  private anyEngine;
77
219
  close(): void;
78
220
  private clearApprovalTimer;
221
+ /**
222
+ * Resolve all of a chat session's pending approvals as cancelled and clear
223
+ * the matching server-side approval timers. Used by handleCancel's
224
+ * per-session path so a Stop while a tool is awaiting approval doesn't leave
225
+ * the tool hanging until APPROVAL_TIMEOUT_MS (and leak the timer). Each
226
+ * requestId in the session map has a same-keyed entry in this.approvalTimers
227
+ * (see requestAskUserForSession / makeBrowserBridge).
228
+ */
229
+ private cancelSessionApprovals;
79
230
  private clearAllApprovalTimers;
80
231
  }