@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,51 @@
1
+ /**
2
+ * ReasoningSetting — the rich, normalized reasoning/thinking config that
3
+ * replaces the old binary `thinking: "enabled"|"disabled"`.
4
+ *
5
+ * - off : no thinking (openai-effort → disabledEffort; deepseek → type:disabled; openrouter → exclude)
6
+ * - on : binary "thinking on" for deepseek-thinking / zai (no effort levels)
7
+ * - effort : openai-effort / openrouter — pick a level
8
+ * - budget : anthropic-budget — explicit thinking token budget
9
+ *
10
+ * `normalizeReasoning` accepts the legacy "enabled"/"disabled" strings so any
11
+ * lingering caller/config still works (mapped to on/off).
12
+ */
13
+ import { z } from "zod";
14
+ import type { ReasoningEffort } from "./capabilities/types.js";
15
+ export declare const REASONING_EFFORTS: readonly ["minimal", "low", "medium", "high", "xhigh"];
16
+ export declare const ReasoningSettingSchema: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
17
+ mode: z.ZodLiteral<"off">;
18
+ }, "strip", z.ZodTypeAny, {
19
+ mode: "off";
20
+ }, {
21
+ mode: "off";
22
+ }>, z.ZodObject<{
23
+ mode: z.ZodLiteral<"on">;
24
+ }, "strip", z.ZodTypeAny, {
25
+ mode: "on";
26
+ }, {
27
+ mode: "on";
28
+ }>, z.ZodObject<{
29
+ mode: z.ZodLiteral<"effort">;
30
+ effort: z.ZodString;
31
+ }, "strip", z.ZodTypeAny, {
32
+ mode: "effort";
33
+ effort: string;
34
+ }, {
35
+ mode: "effort";
36
+ effort: string;
37
+ }>, z.ZodObject<{
38
+ mode: z.ZodLiteral<"budget">;
39
+ budgetTokens: z.ZodNumber;
40
+ }, "strip", z.ZodTypeAny, {
41
+ mode: "budget";
42
+ budgetTokens: number;
43
+ }, {
44
+ mode: "budget";
45
+ budgetTokens: number;
46
+ }>]>;
47
+ export type ReasoningSetting = z.infer<typeof ReasoningSettingSchema>;
48
+ /** Coerce legacy "enabled"/"disabled" or an object into a ReasoningSetting. */
49
+ export declare function normalizeReasoning(raw: ReasoningSetting | "enabled" | "disabled" | undefined): ReasoningSetting | undefined;
50
+ /** Effort to send when a model wants "thinking on" but the user picked no level. */
51
+ export declare const DEFAULT_EFFORT: ReasoningEffort;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * ReasoningSetting — the rich, normalized reasoning/thinking config that
3
+ * replaces the old binary `thinking: "enabled"|"disabled"`.
4
+ *
5
+ * - off : no thinking (openai-effort → disabledEffort; deepseek → type:disabled; openrouter → exclude)
6
+ * - on : binary "thinking on" for deepseek-thinking / zai (no effort levels)
7
+ * - effort : openai-effort / openrouter — pick a level
8
+ * - budget : anthropic-budget — explicit thinking token budget
9
+ *
10
+ * `normalizeReasoning` accepts the legacy "enabled"/"disabled" strings so any
11
+ * lingering caller/config still works (mapped to on/off).
12
+ */
13
+ import { z } from "zod";
14
+ // Recommended effort levels — used to render UI dropdowns and as capability
15
+ // hints. NOT a hard schema constraint: effort is a free-form, catalog-driven
16
+ // param (a model's real ladder is declared by its catalog ParamSpec, and models
17
+ // gain/rename levels over time — e.g. gpt-5.5 added "xhigh", some models accept
18
+ // "max"). The settings schema validates the *shape* (mode/field names), not the
19
+ // *value*; pinning effort to a closed enum here made one unknown level
20
+ // (a connection's paramValues.reasoning flowing through the legacy models[]
21
+ // bridge) throw in validateSettings and take the whole app down on boot.
22
+ export const REASONING_EFFORTS = ["minimal", "low", "medium", "high", "xhigh"];
23
+ export const ReasoningSettingSchema = z.discriminatedUnion("mode", [
24
+ z.object({ mode: z.literal("off") }),
25
+ z.object({ mode: z.literal("on") }),
26
+ z.object({ mode: z.literal("effort"), effort: z.string().min(1) }),
27
+ z.object({ mode: z.literal("budget"), budgetTokens: z.number().int().positive() }),
28
+ ]);
29
+ /** Coerce legacy "enabled"/"disabled" or an object into a ReasoningSetting. */
30
+ export function normalizeReasoning(raw) {
31
+ if (raw == null)
32
+ return undefined;
33
+ if (raw === "enabled")
34
+ return { mode: "on" };
35
+ if (raw === "disabled")
36
+ return { mode: "off" };
37
+ return raw;
38
+ }
39
+ /** Effort to send when a model wants "thinking on" but the user picked no level. */
40
+ export const DEFAULT_EFFORT = "medium";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared stop-reason helpers.
3
+ *
4
+ * Providers report "the response was cut off at the output-token cap" with
5
+ * different finish/stop-reason strings:
6
+ * - OpenAI / OpenAI-compat: finish_reason "length"
7
+ * - Anthropic: stop_reason "max_tokens"
8
+ *
9
+ * The turn loop uses this to decide whether to run a max-output
10
+ * continuation, so the check must accept both spellings.
11
+ */
12
+ /** True when the stop reason indicates the model hit its output-token cap. */
13
+ export declare function isTruncatedStop(stopReason: string | undefined): boolean;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared stop-reason helpers.
3
+ *
4
+ * Providers report "the response was cut off at the output-token cap" with
5
+ * different finish/stop-reason strings:
6
+ * - OpenAI / OpenAI-compat: finish_reason "length"
7
+ * - Anthropic: stop_reason "max_tokens"
8
+ *
9
+ * The turn loop uses this to decide whether to run a max-output
10
+ * continuation, so the check must accept both spellings.
11
+ */
12
+ const TRUNCATED_STOP_REASONS = new Set([
13
+ "length", // OpenAI / OpenAI-compatible
14
+ "max_tokens", // Anthropic
15
+ ]);
16
+ /** True when the stop reason indicates the model hit its output-token cap. */
17
+ export function isTruncatedStop(stopReason) {
18
+ if (!stopReason)
19
+ return false;
20
+ return TRUNCATED_STOP_REASONS.has(stopReason);
21
+ }
@@ -64,7 +64,11 @@ export function createStreamWatchdog(opts) {
64
64
  }
65
65
  /** Environment-driven defaults. Read once at import time is fine — these never change inside a process. */
66
66
  export const STREAM_WATCHDOG_CONFIG = {
67
- enabled: process.env.CODESHELL_ENABLE_STREAM_WATCHDOG === "1",
67
+ // ON by default — a streamed response that connects then stalls mid-flight
68
+ // would otherwise hang until the SDK's (unreliable-for-half-dead-sockets)
69
+ // timeout, which we observed take 15–33 min in practice. Opt OUT with
70
+ // CODESHELL_ENABLE_STREAM_WATCHDOG=0 (rollback knob).
71
+ enabled: process.env.CODESHELL_ENABLE_STREAM_WATCHDOG !== "0",
68
72
  idleTimeoutMs: parseInt(process.env.CODESHELL_STREAM_IDLE_TIMEOUT_MS || "", 10) || 90_000,
69
73
  retries: parseInt(process.env.CODESHELL_STREAM_WATCHDOG_RETRIES || "", 10) || 2,
70
74
  };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * History-image stripping for non-vision models.
3
+ *
4
+ * Why this exists: the vision gate in `Engine.run` only rejects *new* image
5
+ * attachments on the current turn. But a conversation can accumulate image
6
+ * content blocks while a vision-capable model is active, then the user
7
+ * switches to a non-vision model (e.g. DeepSeek) mid-session. Those
8
+ * *historical* image blocks are still in the transcript and get re-serialized
9
+ * on every subsequent request — OpenAI-compat backends 400 with
10
+ * `unknown variant 'image_url', expected 'text'`, which then falls back out
11
+ * of streaming and degrades the turn.
12
+ *
13
+ * Fix: when the active model has `supportsVision: false`, replace each
14
+ * message's image blocks with a single text placeholder before the request
15
+ * is built. The transcript/store is untouched — only the outgoing copy is
16
+ * sanitized — so switching back to a vision model still sees the images.
17
+ *
18
+ * Pure function, no I/O. Tested in `strip-vision.test.ts`.
19
+ */
20
+ import type { Message } from "../types.js";
21
+ /** Text we substitute for an elided image block. Surfaced to the model so it
22
+ * knows an image *was* here (vs silently vanishing the context). */
23
+ export declare const VISION_PLACEHOLDER = "[\u56FE\u7247\u5DF2\u7701\u7565:\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u89C6\u89C9\u8F93\u5165]";
24
+ /**
25
+ * Return a copy of `messages` with image content blocks replaced by a text
26
+ * placeholder, but only when `supportsVision` is false.
27
+ *
28
+ * Identity-preserving: when vision is supported, or no message carries an
29
+ * image, the original array (and untouched message objects) are returned as-is
30
+ * so callers pay nothing on the common path.
31
+ */
32
+ export declare function stripVisionFromHistory(messages: Message[], supportsVision: boolean): Message[];
@@ -0,0 +1,94 @@
1
+ /**
2
+ * History-image stripping for non-vision models.
3
+ *
4
+ * Why this exists: the vision gate in `Engine.run` only rejects *new* image
5
+ * attachments on the current turn. But a conversation can accumulate image
6
+ * content blocks while a vision-capable model is active, then the user
7
+ * switches to a non-vision model (e.g. DeepSeek) mid-session. Those
8
+ * *historical* image blocks are still in the transcript and get re-serialized
9
+ * on every subsequent request — OpenAI-compat backends 400 with
10
+ * `unknown variant 'image_url', expected 'text'`, which then falls back out
11
+ * of streaming and degrades the turn.
12
+ *
13
+ * Fix: when the active model has `supportsVision: false`, replace each
14
+ * message's image blocks with a single text placeholder before the request
15
+ * is built. The transcript/store is untouched — only the outgoing copy is
16
+ * sanitized — so switching back to a vision model still sees the images.
17
+ *
18
+ * Pure function, no I/O. Tested in `strip-vision.test.ts`.
19
+ */
20
+ /** Text we substitute for an elided image block. Surfaced to the model so it
21
+ * knows an image *was* here (vs silently vanishing the context). */
22
+ export const VISION_PLACEHOLDER = "[图片已省略:当前模型不支持视觉输入]";
23
+ /**
24
+ * Return a copy of `messages` with image content blocks replaced by a text
25
+ * placeholder, but only when `supportsVision` is false.
26
+ *
27
+ * Identity-preserving: when vision is supported, or no message carries an
28
+ * image, the original array (and untouched message objects) are returned as-is
29
+ * so callers pay nothing on the common path.
30
+ */
31
+ export function stripVisionFromHistory(messages, supportsVision) {
32
+ if (supportsVision)
33
+ return messages;
34
+ let changed = false;
35
+ const out = messages.map((msg) => {
36
+ if (typeof msg.content === "string")
37
+ return msg;
38
+ // Need to process if there's a top-level image, OR a tool_result whose
39
+ // own content array carries a nested image (view_image-produced screenshots
40
+ // live in `tool_result.content: ContentBlock[]`).
41
+ if (!msg.content.some(needsStrip))
42
+ return msg;
43
+ changed = true;
44
+ const rebuilt = [];
45
+ let placeholderInserted = false;
46
+ for (const block of msg.content) {
47
+ if (block.type === "image") {
48
+ // Collapse runs of images into a single placeholder per message —
49
+ // five screenshots don't need five identical notes.
50
+ if (!placeholderInserted) {
51
+ rebuilt.push({ type: "text", text: VISION_PLACEHOLDER });
52
+ placeholderInserted = true;
53
+ }
54
+ continue;
55
+ }
56
+ if (block.type === "tool_result" &&
57
+ Array.isArray(block.content) &&
58
+ block.content.some((b) => b.type === "image")) {
59
+ rebuilt.push({ ...block, content: stripImageBlocks(block.content) });
60
+ continue;
61
+ }
62
+ rebuilt.push(block);
63
+ }
64
+ return { ...msg, content: rebuilt };
65
+ });
66
+ return changed ? out : messages;
67
+ }
68
+ /** True if this block holds an image we must elide — either it *is* an image,
69
+ * or it's a tool_result whose nested content array contains one. */
70
+ function needsStrip(block) {
71
+ if (block.type === "image")
72
+ return true;
73
+ return (block.type === "tool_result" &&
74
+ Array.isArray(block.content) &&
75
+ block.content.some((b) => b.type === "image"));
76
+ }
77
+ /** Replace image blocks in a ContentBlock[] with a single text placeholder
78
+ * (consecutive/multiple images collapse to one), preserving other blocks.
79
+ * Used for both the message top level and nested tool_result.content. */
80
+ function stripImageBlocks(blocks) {
81
+ const rebuilt = [];
82
+ let placeholderInserted = false;
83
+ for (const block of blocks) {
84
+ if (block.type === "image") {
85
+ if (!placeholderInserted) {
86
+ rebuilt.push({ type: "text", text: VISION_PLACEHOLDER });
87
+ placeholderInserted = true;
88
+ }
89
+ continue;
90
+ }
91
+ rebuilt.push(block);
92
+ }
93
+ return rebuilt;
94
+ }
@@ -18,9 +18,16 @@ async function getEncoder() {
18
18
  }
19
19
  let encoderSync = null;
20
20
  // Kick off the import so synchronous callers can use it on the next tick.
21
- // First call still falls back to a length estimate.
22
- void getEncoder().then((fn) => {
21
+ // First call still falls back to a length estimate. The .catch keeps a failed
22
+ // import (corrupt node_modules / packaging error) from becoming an unhandled
23
+ // rejection — the chars/4 fallback below IS the intended degradation, so a
24
+ // load failure should stay silent, not surface as a process-level warning/crash.
25
+ void getEncoder()
26
+ .then((fn) => {
23
27
  encoderSync = fn;
28
+ })
29
+ .catch(() => {
30
+ /* encoder unavailable — count() falls back to the length estimate */
24
31
  });
25
32
  /**
26
33
  * Count tokens in `text`. Synchronous. If the encoder isn't loaded yet,
@@ -20,18 +20,21 @@ export interface CreateMessageOptions {
20
20
  */
21
21
  recordUsage?: boolean;
22
22
  /**
23
- * DeepSeek V4 thinking-mode switch. "enabled" is the endpoint default;
24
- * "disabled" turns reasoning off (faster, cheaper, no `reasoning_content`
25
- * on the reply). Ignored by every provider except DeepSeek V4 — the OpenAI
26
- * SDK forwards unknown top-level fields verbatim, so it's harmless on
27
- * other compatible endpoints.
23
+ * Reasoning/thinking setting for this call. Overrides LLMConfig.reasoning.
24
+ * Rich shape ({mode:"off"|"on"} | {mode:"effort",effort} |
25
+ * {mode:"budget",budgetTokens}) translated to the per-vendor wire form by
26
+ * the client's capability layer.
28
27
  */
29
- thinking?: "enabled" | "disabled";
28
+ reasoning?: import("./reasoning-setting.js").ReasoningSetting;
30
29
  }
31
30
  export interface LLMUsageTracker {
32
31
  records: TokenUsage[];
33
32
  totalPromptTokens: number;
34
33
  totalCompletionTokens: number;
35
34
  totalTokens: number;
35
+ /** Sum of cache-read tokens across responses (0 when no provider reported any). */
36
+ totalCacheReadTokens: number;
37
+ /** Sum of cache-creation tokens across responses. */
38
+ totalCacheCreationTokens: number;
36
39
  requestCount: number;
37
40
  }
@@ -25,6 +25,7 @@ import { appendFileSync, mkdirSync, existsSync, readdirSync, unlinkSync, readFil
25
25
  import { join, dirname } from "node:path";
26
26
  import { homedir } from "node:os";
27
27
  import { AsyncLocalStorage } from "node:async_hooks";
28
+ import { redactSecrets } from "./sanitize-messages.js";
28
29
  const LEVEL_ORDER = {
29
30
  debug: 0,
30
31
  info: 1,
@@ -246,7 +247,14 @@ class Logger {
246
247
  recordError(msg, data) {
247
248
  if (inMemoryErrors.length >= MAX_IN_MEMORY_ERRORS)
248
249
  inMemoryErrors.shift();
249
- inMemoryErrors.push({ msg, t: new Date().toISOString(), data });
250
+ // Scrub secrets out of msg + data before parking the entry in the in-
251
+ // memory ring. The ring is exposed via diagnostics endpoints, so
252
+ // anything that survives here is reachable by protocol clients.
253
+ inMemoryErrors.push({
254
+ msg: redactSecrets(msg),
255
+ t: new Date().toISOString(),
256
+ data: data ? redactSecrets(data) : undefined,
257
+ });
250
258
  }
251
259
  write(level, msg, data) {
252
260
  if (!this.enabled)
@@ -262,7 +270,13 @@ class Logger {
262
270
  return;
263
271
  }
264
272
  const t = new Date().toISOString();
265
- const entry = { t, l: level, msg, ...this.context };
273
+ // Scrub msg + data before the entry is built. msg is a plain string so
274
+ // only bearer-tokens / URL secret query params can hide there; data is
275
+ // arbitrary so it gets the full recursive walk. Done at the boundary so
276
+ // every level/category sink shares the same redaction rules.
277
+ const safeMsg = redactSecrets(msg);
278
+ const safeData = data ? redactSecrets(data) : undefined;
279
+ const entry = { t, l: level, msg: safeMsg, ...this.context };
266
280
  if (cat && !entry.cat)
267
281
  entry.cat = cat;
268
282
  // Stamp the current process-wide session id unless this logger's
@@ -270,8 +284,8 @@ class Logger {
270
284
  // children created before Engine.run() still pick up the real sid.
271
285
  if (entry.sid === undefined)
272
286
  entry.sid = getCurrentSid();
273
- if (data)
274
- entry.d = data;
287
+ if (safeData)
288
+ entry.d = safeData;
275
289
  const line = JSON.stringify(entry) + "\n";
276
290
  if (this.stderrEcho) {
277
291
  process.stderr.write(line);
@@ -32,6 +32,16 @@ export declare function sanitizeContent(content: Message["content"]): Message["c
32
32
  * path for the overwhelmingly common pure-text case).
33
33
  */
34
34
  export declare function sanitizeMessages(messages: readonly Message[]): Message[];
35
+ /**
36
+ * Recursively walk a value and return a *new* value with secret-looking
37
+ * fields replaced by "[redacted]". Used by the logger (so anything ending up
38
+ * in `entry.d` is scrubbed) and by diagnostics / in-memory error capture.
39
+ *
40
+ * Pure / no I/O. Does not mutate the input — important because the same
41
+ * object may also be on its way to a transcript or UI stream where the
42
+ * unredacted form is correct.
43
+ */
44
+ export declare function redactSecrets<T>(value: T, depth?: number): T;
35
45
  /**
36
46
  * Sanitize a free-form task string before logging.
37
47
  *
@@ -129,6 +129,118 @@ export function sanitizeMessages(messages) {
129
129
  }
130
130
  return touched ? out : messages;
131
131
  }
132
+ // ─────────────────────────────────────────────────────────────────────
133
+ // Secret redaction
134
+ // ─────────────────────────────────────────────────────────────────────
135
+ //
136
+ // Beyond image payloads, log/diagnostics entries can carry API keys,
137
+ // authorization headers, provider tokens, and similar secrets via
138
+ // `data` blobs (settings dumps, provider configs, error responses, …).
139
+ // These walkers redact secrets *in place on a deep clone* so the caller
140
+ // can still log "useful shape, scrubbed values".
141
+ const SECRET_KEY_RE = /(^|[._-])(api[_-]?key|authorization|x[_-]api[_-]key|bearer[_-]?token|access[_-]?token|refresh[_-]?token|session[_-]?token|token|secret|password|client[_-]?secret|cookie)($|[._-])/i;
142
+ // Header containers whose VALUES are all header values — any of them can carry
143
+ // a bespoke auth token under a non-secret-looking key name (e.g.
144
+ // `x-custom-auth`), which SECRET_KEY_RE alone would miss. Treat the whole
145
+ // container as sensitive: every non-empty value inside is redacted.
146
+ const HEADERS_CONTAINER_RE = /^(httpHeaders|headers|defaultHeaders|envHeaders)$/;
147
+ /** Redact all non-empty string/scalar values of a headers container object. */
148
+ function redactHeaderValues(headers) {
149
+ const out = {};
150
+ for (const [hName, hVal] of Object.entries(headers)) {
151
+ // Preserve present-vs-absent for empty/null, redact everything else.
152
+ if (hVal === null || hVal === undefined || hVal === "")
153
+ out[hName] = hVal;
154
+ else
155
+ out[hName] = REDACTED;
156
+ }
157
+ return out;
158
+ }
159
+ const BEARER_RE = /\bBearer\s+[A-Za-z0-9._\-+/=~]{8,}/g;
160
+ // URL query parameters that look like credentials. Conservative — only
161
+ // trigger on a small named set so a normal `?id=…&q=…` URL passes through.
162
+ const URL_SECRET_QS_RE = /([?&](?:key|api_key|apikey|access_token|token|auth|sig|signature)=)[^&#\s]+/gi;
163
+ const REDACTED = "[redacted]";
164
+ const MAX_DEPTH = 10;
165
+ function isSecretKey(key) {
166
+ return SECRET_KEY_RE.test(key);
167
+ }
168
+ /** Scrub bare `Bearer <token>` and credential-looking URL query params from a string. */
169
+ function redactSecretsInString(s) {
170
+ let out = s;
171
+ if (BEARER_RE.test(out))
172
+ out = out.replace(BEARER_RE, "Bearer [redacted]");
173
+ if (URL_SECRET_QS_RE.test(out))
174
+ out = out.replace(URL_SECRET_QS_RE, "$1[redacted]");
175
+ return out;
176
+ }
177
+ /**
178
+ * Recursively walk a value and return a *new* value with secret-looking
179
+ * fields replaced by "[redacted]". Used by the logger (so anything ending up
180
+ * in `entry.d` is scrubbed) and by diagnostics / in-memory error capture.
181
+ *
182
+ * Pure / no I/O. Does not mutate the input — important because the same
183
+ * object may also be on its way to a transcript or UI stream where the
184
+ * unredacted form is correct.
185
+ */
186
+ export function redactSecrets(value, depth = 0) {
187
+ if (value === null || value === undefined)
188
+ return value;
189
+ if (depth > MAX_DEPTH)
190
+ return value;
191
+ const t = typeof value;
192
+ if (t === "string")
193
+ return redactSecretsInString(value);
194
+ if (t === "number" || t === "boolean" || t === "bigint" || t === "symbol")
195
+ return value;
196
+ if (t === "function")
197
+ return value;
198
+ if (Array.isArray(value)) {
199
+ return value.map((v) => redactSecrets(v, depth + 1));
200
+ }
201
+ // Error objects: preserve name/message/stack shape but redact within.
202
+ if (value instanceof Error) {
203
+ const clone = {
204
+ name: value.name,
205
+ message: redactSecretsInString(value.message),
206
+ ...(value.stack ? { stack: redactSecretsInString(value.stack) } : {}),
207
+ };
208
+ // Some libraries attach extra properties (`.response`, `.config`, …) —
209
+ // walk them as well.
210
+ for (const key of Object.keys(value)) {
211
+ if (key === "name" || key === "message" || key === "stack")
212
+ continue;
213
+ const v = value[key];
214
+ clone[key] = isSecretKey(key) ? REDACTED : redactSecrets(v, depth + 1);
215
+ }
216
+ return clone;
217
+ }
218
+ if (t === "object") {
219
+ const obj = value;
220
+ const out = {};
221
+ for (const [k, v] of Object.entries(obj)) {
222
+ if (isSecretKey(k)) {
223
+ // Preserve presence (null/undefined stay as-is so consumers can
224
+ // still distinguish "key present" vs "key absent"; non-empty values
225
+ // collapse to [redacted]).
226
+ if (v === null || v === undefined || v === "")
227
+ out[k] = v;
228
+ else
229
+ out[k] = REDACTED;
230
+ }
231
+ else if (HEADERS_CONTAINER_RE.test(k) && v && typeof v === "object" && !Array.isArray(v)) {
232
+ // Blanket-redact header values regardless of the inner header name, so a
233
+ // custom `x-custom-auth` doesn't leak in cleartext.
234
+ out[k] = redactHeaderValues(v);
235
+ }
236
+ else {
237
+ out[k] = redactSecrets(v, depth + 1);
238
+ }
239
+ }
240
+ return out;
241
+ }
242
+ return value;
243
+ }
132
244
  /**
133
245
  * Sanitize a free-form task string before logging.
134
246
  *
@@ -10,7 +10,12 @@ export class LSPClient extends EventEmitter {
10
10
  process;
11
11
  nextId = 1;
12
12
  pending = new Map();
13
- buffer = "";
13
+ // The LSP framing uses byte-counted Content-Length, so we buffer bytes,
14
+ // not characters. Joining chunks as strings (`data.toString()` + string
15
+ // concat) can split a multibyte UTF-8 codepoint across chunks and de-
16
+ // synchronize against Content-Length. Stay in Buffer-land until we've
17
+ // sliced out exactly the right body length.
18
+ buffer = Buffer.alloc(0);
14
19
  contentLength = -1;
15
20
  initialized = false;
16
21
  constructor(command, args = [], cwd) {
@@ -24,7 +29,7 @@ export class LSPClient extends EventEmitter {
24
29
  cwd: this.cwd,
25
30
  stdio: ["pipe", "pipe", "pipe"],
26
31
  });
27
- this.process.stdout?.on("data", (data) => this.handleData(data.toString()));
32
+ this.process.stdout?.on("data", (data) => this.handleData(data));
28
33
  this.process.stderr?.on("data", (_data) => {
29
34
  // LSP servers often log to stderr — ignore
30
35
  });
@@ -116,26 +121,41 @@ export class LSPClient extends EventEmitter {
116
121
  return this.process !== undefined && !this.process.killed;
117
122
  }
118
123
  handleData(data) {
119
- this.buffer += data;
124
+ // Append the new chunk as bytes. Buffer.concat avoids the UTF-8
125
+ // boundary corruption that string concatenation produces — a
126
+ // multibyte codepoint split across two TCP/pipe chunks decodes to
127
+ // U+FFFD, mangles the buffer length count, and breaks framing.
128
+ this.buffer = Buffer.concat([this.buffer, data]);
120
129
  while (true) {
121
130
  if (this.contentLength < 0) {
131
+ // Search for the header terminator in bytes, not chars.
122
132
  const headerEnd = this.buffer.indexOf("\r\n\r\n");
123
133
  if (headerEnd < 0)
124
134
  break;
125
- const header = this.buffer.slice(0, headerEnd);
135
+ // Headers are ASCII per spec, so toString("ascii") is safe and
136
+ // avoids paying for a UTF-8 decode on the framing band.
137
+ const header = this.buffer.slice(0, headerEnd).toString("ascii");
126
138
  const match = header.match(/Content-Length:\s*(\d+)/i);
127
139
  if (!match) {
128
- this.buffer = this.buffer.slice(headerEnd + 4);
140
+ this.buffer = this.buffer.subarray(headerEnd + 4);
129
141
  continue;
130
142
  }
131
143
  this.contentLength = parseInt(match[1], 10);
132
- this.buffer = this.buffer.slice(headerEnd + 4);
144
+ this.buffer = this.buffer.subarray(headerEnd + 4);
133
145
  }
146
+ // Content-Length is a BYTE count — compare against the buffer's
147
+ // byte length, not its character length. Pre-fix this compared
148
+ // string lengths; with multibyte responses (e.g. CJK identifiers,
149
+ // emoji in diagnostics) we'd block waiting for bytes that had
150
+ // already arrived.
134
151
  if (this.buffer.length < this.contentLength)
135
152
  break;
136
- const content = this.buffer.slice(0, this.contentLength);
137
- this.buffer = this.buffer.slice(this.contentLength);
153
+ const bodyBytes = this.buffer.subarray(0, this.contentLength);
154
+ this.buffer = this.buffer.subarray(this.contentLength);
138
155
  this.contentLength = -1;
156
+ // Decode the full body in one shot — at this point we have the
157
+ // exact byte count, so the UTF-8 boundary issue is fully gone.
158
+ const content = bodyBytes.toString("utf8");
139
159
  try {
140
160
  const message = JSON.parse(content);
141
161
  if ("id" in message && this.pending.has(message.id)) {
@@ -33,8 +33,8 @@ export declare class LSPServerManager {
33
33
  * Shutdown all servers.
34
34
  */
35
35
  shutdownAll(): Promise<void>;
36
- private isCommandAvailable;
37
36
  }
37
+ export declare function isCommandAvailable(command: string, env?: NodeJS.ProcessEnv): boolean;
38
38
  export declare function initializeLSPManager(cwd: string): LSPServerManager;
39
39
  export declare function getLSPManager(): LSPServerManager | undefined;
40
40
  export {};