@cjhyy/code-shell-core 0.5.0-rc.2 → 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 (387) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +3 -0
  3. package/dist/agent/agent-definition-registry.js +3 -1
  4. package/dist/agent/agent-definition.d.ts +15 -0
  5. package/dist/agent/agent-definition.js +27 -3
  6. package/dist/arena/context/context-tools.js +47 -4
  7. package/dist/arena/ledger.js +9 -1
  8. package/dist/arena/strategies/utils.d.ts +1 -4
  9. package/dist/arena/strategies/utils.js +7 -84
  10. package/dist/automation/cron-expr.d.ts +10 -0
  11. package/dist/automation/cron-expr.js +23 -5
  12. package/dist/automation/runner.d.ts +21 -4
  13. package/dist/automation/runner.js +48 -12
  14. package/dist/automation/scheduler.d.ts +38 -0
  15. package/dist/automation/scheduler.js +89 -12
  16. package/dist/automation/store.js +5 -2
  17. package/dist/capability-control/disabled-lists.d.ts +25 -0
  18. package/dist/capability-control/disabled-lists.js +57 -0
  19. package/dist/capability-control/overlay.d.ts +15 -0
  20. package/dist/capability-control/overlay.js +27 -0
  21. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  22. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  23. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  24. package/dist/cc-orchestrator/cc-capability.js +53 -0
  25. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  26. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  27. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  28. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  29. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  30. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  31. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  32. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  33. package/dist/cc-orchestrator/index.d.ts +8 -0
  34. package/dist/cc-orchestrator/index.js +8 -0
  35. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  36. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  37. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  38. package/dist/cc-orchestrator/session-discovery.js +125 -0
  39. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  40. package/dist/cc-orchestrator/session-history.js +67 -0
  41. package/dist/cli/agent-server-stdio.d.ts +15 -1
  42. package/dist/cli/agent-server-stdio.js +115 -17
  43. package/dist/cli/agent-server-tcp.js +40 -26
  44. package/dist/context/compaction.d.ts +56 -0
  45. package/dist/context/compaction.js +186 -0
  46. package/dist/context/manager.js +25 -4
  47. package/dist/cost-tracker.js +5 -61
  48. package/dist/credentials/cipher.d.ts +49 -0
  49. package/dist/credentials/cipher.js +45 -0
  50. package/dist/credentials/cookie-jar.d.ts +24 -0
  51. package/dist/credentials/cookie-jar.js +40 -0
  52. package/dist/credentials/index.d.ts +7 -0
  53. package/dist/credentials/index.js +5 -0
  54. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  55. package/dist/credentials/inject-credential-tool.js +130 -0
  56. package/dist/credentials/store.d.ts +72 -0
  57. package/dist/credentials/store.js +184 -0
  58. package/dist/credentials/types.d.ts +56 -0
  59. package/dist/credentials/use-credential-tool.d.ts +29 -0
  60. package/dist/credentials/use-credential-tool.js +205 -0
  61. package/dist/credentials/use-gate.d.ts +56 -0
  62. package/dist/credentials/use-gate.js +52 -0
  63. package/dist/data/model-metadata.d.ts +77 -0
  64. package/dist/data/model-metadata.js +56 -0
  65. package/dist/data/model-metadata.json +216 -0
  66. package/dist/data/openrouter-models.d.ts +18 -7
  67. package/dist/data/openrouter-models.js +35 -8
  68. package/dist/engine/aux-key.d.ts +10 -0
  69. package/dist/engine/aux-key.js +11 -0
  70. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  71. package/dist/engine/dynamic-tool-defs.js +36 -0
  72. package/dist/engine/engine.d.ts +267 -138
  73. package/dist/engine/engine.js +957 -191
  74. package/dist/engine/friendly-error.d.ts +18 -0
  75. package/dist/engine/friendly-error.js +63 -0
  76. package/dist/engine/goal.d.ts +145 -0
  77. package/dist/engine/goal.js +144 -0
  78. package/dist/engine/image-policy.d.ts +13 -0
  79. package/dist/engine/image-policy.js +24 -0
  80. package/dist/engine/model-connections-pool.d.ts +17 -0
  81. package/dist/engine/model-connections-pool.js +66 -0
  82. package/dist/engine/model-facade.d.ts +10 -0
  83. package/dist/engine/model-facade.js +25 -0
  84. package/dist/engine/patch-orphaned-tools.js +3 -0
  85. package/dist/engine/resolve-llm-config.d.ts +16 -0
  86. package/dist/engine/resolve-llm-config.js +44 -0
  87. package/dist/engine/runtime.js +2 -1
  88. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  89. package/dist/engine/sandbox-cache-key.js +9 -0
  90. package/dist/engine/sandbox-config.d.ts +31 -0
  91. package/dist/engine/sandbox-config.js +38 -0
  92. package/dist/engine/session-usage.d.ts +19 -0
  93. package/dist/engine/session-usage.js +25 -0
  94. package/dist/engine/steer-queue.d.ts +32 -0
  95. package/dist/engine/steer-queue.js +26 -0
  96. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  97. package/dist/engine/streaming-tool-queue.js +50 -10
  98. package/dist/engine/turn-loop.d.ts +67 -3
  99. package/dist/engine/turn-loop.js +292 -41
  100. package/dist/engine/types.d.ts +175 -0
  101. package/dist/engine/types.js +13 -0
  102. package/dist/external-agents/config.d.ts +2 -0
  103. package/dist/external-agents/config.js +15 -0
  104. package/dist/external-agents/types.d.ts +31 -0
  105. package/dist/external-agents/types.js +1 -0
  106. package/dist/git/utils.js +11 -6
  107. package/dist/git/worktree.d.ts +48 -0
  108. package/dist/git/worktree.js +86 -10
  109. package/dist/hooks/goal-stop-hook.d.ts +28 -0
  110. package/dist/hooks/goal-stop-hook.js +186 -9
  111. package/dist/hooks/registry.d.ts +8 -0
  112. package/dist/hooks/registry.js +19 -0
  113. package/dist/hooks/shell-runner.js +10 -21
  114. package/dist/index.d.ts +49 -6
  115. package/dist/index.js +60 -4
  116. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  117. package/dist/llm/capabilities/param-specs.js +62 -0
  118. package/dist/llm/capabilities/rules.js +4 -0
  119. package/dist/llm/capabilities/types.d.ts +10 -0
  120. package/dist/llm/client-base.d.ts +28 -1
  121. package/dist/llm/client-base.js +119 -13
  122. package/dist/llm/model-cache.js +4 -2
  123. package/dist/llm/model-pool.d.ts +14 -0
  124. package/dist/llm/model-pool.js +13 -0
  125. package/dist/llm/provider-auth.d.ts +41 -0
  126. package/dist/llm/provider-auth.js +76 -0
  127. package/dist/llm/provider-catalog.d.ts +4 -0
  128. package/dist/llm/providers/anthropic.js +64 -14
  129. package/dist/llm/providers/openai.d.ts +36 -0
  130. package/dist/llm/providers/openai.js +257 -51
  131. package/dist/llm/reasoning-setting.d.ts +3 -3
  132. package/dist/llm/reasoning-setting.js +9 -1
  133. package/dist/llm/stream-watchdog.js +5 -1
  134. package/dist/llm/token-counter.js +9 -2
  135. package/dist/llm/types.d.ts +4 -0
  136. package/dist/logging/sanitize-messages.js +22 -0
  137. package/dist/lsp/manager.d.ts +1 -1
  138. package/dist/lsp/manager.js +40 -10
  139. package/dist/model-catalog/builtin.d.ts +12 -0
  140. package/dist/model-catalog/builtin.js +407 -0
  141. package/dist/model-catalog/gen-connections.d.ts +20 -0
  142. package/dist/model-catalog/gen-connections.js +28 -0
  143. package/dist/model-catalog/index.d.ts +41 -0
  144. package/dist/model-catalog/index.js +90 -0
  145. package/dist/model-catalog/params.d.ts +20 -0
  146. package/dist/model-catalog/params.js +45 -0
  147. package/dist/model-catalog/resolve.d.ts +48 -0
  148. package/dist/model-catalog/resolve.js +33 -0
  149. package/dist/model-catalog/save-entry.d.ts +32 -0
  150. package/dist/model-catalog/save-entry.js +104 -0
  151. package/dist/model-catalog/types.d.ts +561 -0
  152. package/dist/model-catalog/types.js +93 -0
  153. package/dist/model-catalog/upsert.d.ts +9 -0
  154. package/dist/model-catalog/upsert.js +8 -0
  155. package/dist/onboarding.d.ts +12 -82
  156. package/dist/onboarding.js +61 -326
  157. package/dist/plugins/gitOps.d.ts +19 -0
  158. package/dist/plugins/gitOps.js +73 -4
  159. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  160. package/dist/plugins/installer/checkUpdate.js +32 -0
  161. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  162. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  163. package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
  164. package/dist/plugins/installer/codex/convertMcp.js +45 -5
  165. package/dist/plugins/installer/install.js +25 -1
  166. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  167. package/dist/plugins/installer/installFromArchive.js +134 -0
  168. package/dist/plugins/installer/installFromSource.js +8 -2
  169. package/dist/plugins/installer/loadPluginAgents.js +6 -2
  170. package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
  171. package/dist/plugins/installer/loadPluginMcp.js +35 -2
  172. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  173. package/dist/plugins/installer/pruneDisabled.js +73 -0
  174. package/dist/plugins/installer/types.d.ts +5 -2
  175. package/dist/plugins/installer/types.js +1 -0
  176. package/dist/plugins/installer/uninstall.js +4 -0
  177. package/dist/plugins/installer/unzip.d.ts +14 -0
  178. package/dist/plugins/installer/unzip.js +82 -0
  179. package/dist/plugins/installer/update.d.ts +14 -0
  180. package/dist/plugins/installer/update.js +53 -21
  181. package/dist/plugins/loadPluginHooks.d.ts +47 -1
  182. package/dist/plugins/loadPluginHooks.js +73 -1
  183. package/dist/plugins/marketplaceManager.d.ts +7 -0
  184. package/dist/plugins/marketplaceManager.js +20 -0
  185. package/dist/plugins/pluginCommandHook.js +4 -18
  186. package/dist/plugins/pluginContent.d.ts +30 -0
  187. package/dist/plugins/pluginContent.js +83 -0
  188. package/dist/plugins/pluginInstaller.d.ts +13 -0
  189. package/dist/plugins/pluginInstaller.js +42 -8
  190. package/dist/plugins/schemas.js +1 -0
  191. package/dist/plugins/types.d.ts +6 -0
  192. package/dist/preset/index.d.ts +7 -1
  193. package/dist/preset/index.js +96 -6
  194. package/dist/product/types.d.ts +1 -1
  195. package/dist/prompt/composer.d.ts +27 -0
  196. package/dist/prompt/composer.js +67 -21
  197. package/dist/prompt/instruction-scanner.js +5 -3
  198. package/dist/prompt/section-loader.js +1 -0
  199. package/dist/prompt/sections/base.md +1 -0
  200. package/dist/prompt/sections/browser.md +10 -0
  201. package/dist/prompt/sections/coding.md +4 -0
  202. package/dist/protocol/chat-session-manager.d.ts +8 -2
  203. package/dist/protocol/chat-session-manager.js +36 -0
  204. package/dist/protocol/chat-session.d.ts +65 -0
  205. package/dist/protocol/chat-session.js +94 -2
  206. package/dist/protocol/client.d.ts +27 -0
  207. package/dist/protocol/client.js +38 -0
  208. package/dist/protocol/server.d.ts +112 -0
  209. package/dist/protocol/server.js +586 -16
  210. package/dist/protocol/transport.js +3 -2
  211. package/dist/protocol/types.d.ts +46 -0
  212. package/dist/protocol/types.js +16 -0
  213. package/dist/quota/credentials.d.ts +3 -0
  214. package/dist/quota/credentials.js +80 -0
  215. package/dist/quota/index.d.ts +36 -0
  216. package/dist/quota/index.js +155 -0
  217. package/dist/quota/types.d.ts +48 -0
  218. package/dist/quota/types.js +13 -0
  219. package/dist/review/review-prompt.d.ts +28 -0
  220. package/dist/review/review-prompt.js +81 -0
  221. package/dist/run/FileRunStore.js +8 -3
  222. package/dist/run/RunApprovalBackend.js +25 -5
  223. package/dist/run/RunManager.d.ts +12 -0
  224. package/dist/run/RunManager.js +35 -0
  225. package/dist/run/factory.d.ts +1 -1
  226. package/dist/runtime/background-shell.d.ts +139 -0
  227. package/dist/runtime/background-shell.js +495 -0
  228. package/dist/runtime/output-clean.d.ts +24 -0
  229. package/dist/runtime/output-clean.js +41 -0
  230. package/dist/runtime/ring-file.d.ts +64 -0
  231. package/dist/runtime/ring-file.js +174 -0
  232. package/dist/runtime/safe-spawn.js +15 -34
  233. package/dist/runtime/spawn-common.d.ts +148 -0
  234. package/dist/runtime/spawn-common.js +303 -0
  235. package/dist/runtime/truncate-output.d.ts +22 -0
  236. package/dist/runtime/truncate-output.js +49 -0
  237. package/dist/runtime/utf8-cut.d.ts +11 -0
  238. package/dist/runtime/utf8-cut.js +23 -0
  239. package/dist/services/auto-dream.d.ts +4 -0
  240. package/dist/services/auto-dream.js +26 -26
  241. package/dist/services/diagnostics.d.ts +1 -2
  242. package/dist/services/diagnostics.js +12 -7
  243. package/dist/services/extract-memories.d.ts +14 -1
  244. package/dist/services/extract-memories.js +45 -6
  245. package/dist/services/memory-orchestrator.d.ts +21 -0
  246. package/dist/services/memory-orchestrator.js +125 -50
  247. package/dist/services/session-memory.js +24 -12
  248. package/dist/session/file-history.d.ts +124 -1
  249. package/dist/session/file-history.js +222 -6
  250. package/dist/session/memory.d.ts +116 -2
  251. package/dist/session/memory.js +250 -28
  252. package/dist/session/session-manager.d.ts +40 -0
  253. package/dist/session/session-manager.js +113 -3
  254. package/dist/session/simple-diff.d.ts +23 -0
  255. package/dist/session/simple-diff.js +84 -0
  256. package/dist/session/transcript.d.ts +25 -1
  257. package/dist/session/transcript.js +35 -2
  258. package/dist/session/undo-target.d.ts +67 -0
  259. package/dist/session/undo-target.js +144 -0
  260. package/dist/settings/disk-defaults.d.ts +9 -2
  261. package/dist/settings/disk-defaults.js +11 -2
  262. package/dist/settings/feature-flags.d.ts +64 -0
  263. package/dist/settings/feature-flags.js +61 -0
  264. package/dist/settings/manager.d.ts +68 -1
  265. package/dist/settings/manager.js +266 -29
  266. package/dist/settings/migrate-config.d.ts +45 -0
  267. package/dist/settings/migrate-config.js +125 -0
  268. package/dist/settings/schema-export.d.ts +25 -0
  269. package/dist/settings/schema-export.js +38 -0
  270. package/dist/settings/schema.d.ts +1186 -771
  271. package/dist/settings/schema.js +268 -97
  272. package/dist/skills/scanner.d.ts +9 -0
  273. package/dist/skills/scanner.js +30 -2
  274. package/dist/stt/resolve-transcribe.d.ts +31 -0
  275. package/dist/stt/resolve-transcribe.js +108 -0
  276. package/dist/stt/transcribe.d.ts +51 -0
  277. package/dist/stt/transcribe.js +65 -0
  278. package/dist/tool-system/browser-bridge.d.ts +226 -0
  279. package/dist/tool-system/browser-bridge.js +163 -0
  280. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  281. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  282. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  283. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  284. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  285. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  286. package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
  287. package/dist/tool-system/builtin/agent-registry.js +8 -0
  288. package/dist/tool-system/builtin/agent.d.ts +21 -1
  289. package/dist/tool-system/builtin/agent.js +489 -42
  290. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  291. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  292. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  293. package/dist/tool-system/builtin/apply-patch/index.js +0 -15
  294. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  295. package/dist/tool-system/builtin/background-jobs.js +124 -0
  296. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  297. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  298. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  299. package/dist/tool-system/builtin/background-work.js +86 -0
  300. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  301. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  302. package/dist/tool-system/builtin/bash.d.ts +5 -2
  303. package/dist/tool-system/builtin/bash.js +98 -62
  304. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  305. package/dist/tool-system/builtin/browser-tools.js +312 -0
  306. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  307. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  308. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  309. package/dist/tool-system/builtin/check-quota.js +34 -0
  310. package/dist/tool-system/builtin/config.js +7 -0
  311. package/dist/tool-system/builtin/cron.d.ts +7 -0
  312. package/dist/tool-system/builtin/cron.js +55 -3
  313. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  314. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  315. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  316. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  317. package/dist/tool-system/builtin/edit.js +20 -16
  318. package/dist/tool-system/builtin/eol.d.ts +29 -0
  319. package/dist/tool-system/builtin/eol.js +37 -0
  320. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  321. package/dist/tool-system/builtin/file-cache.js +8 -0
  322. package/dist/tool-system/builtin/generate-image.d.ts +35 -0
  323. package/dist/tool-system/builtin/generate-image.js +278 -50
  324. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  325. package/dist/tool-system/builtin/generate-video.js +361 -0
  326. package/dist/tool-system/builtin/glob.js +0 -7
  327. package/dist/tool-system/builtin/grep.js +6 -8
  328. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  329. package/dist/tool-system/builtin/image-providers.js +190 -0
  330. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  331. package/dist/tool-system/builtin/image-uploader.js +74 -0
  332. package/dist/tool-system/builtin/index.d.ts +7 -1
  333. package/dist/tool-system/builtin/index.js +249 -25
  334. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  335. package/dist/tool-system/builtin/memory.js +45 -7
  336. package/dist/tool-system/builtin/notebook-edit.js +0 -7
  337. package/dist/tool-system/builtin/powershell.js +4 -1
  338. package/dist/tool-system/builtin/read.js +10 -10
  339. package/dist/tool-system/builtin/repl.js +4 -1
  340. package/dist/tool-system/builtin/skill.js +9 -0
  341. package/dist/tool-system/builtin/sleep.js +3 -2
  342. package/dist/tool-system/builtin/tool-search.js +25 -7
  343. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  344. package/dist/tool-system/builtin/video-providers.js +235 -0
  345. package/dist/tool-system/builtin/web-fetch.js +12 -2
  346. package/dist/tool-system/builtin/web-search.js +21 -7
  347. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  348. package/dist/tool-system/builtin/worktree.js +31 -4
  349. package/dist/tool-system/builtin/write.js +0 -6
  350. package/dist/tool-system/context.d.ts +154 -6
  351. package/dist/tool-system/executor.d.ts +3 -1
  352. package/dist/tool-system/executor.js +172 -88
  353. package/dist/tool-system/investigation-guard.js +1 -1
  354. package/dist/tool-system/mcp-manager.d.ts +42 -4
  355. package/dist/tool-system/mcp-manager.js +186 -20
  356. package/dist/tool-system/path-policy.d.ts +5 -0
  357. package/dist/tool-system/path-policy.js +307 -8
  358. package/dist/tool-system/permission.d.ts +36 -1
  359. package/dist/tool-system/permission.js +281 -69
  360. package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
  361. package/dist/tool-system/plan-mode-allowlist.js +24 -2
  362. package/dist/tool-system/registry.d.ts +1 -0
  363. package/dist/tool-system/registry.js +16 -2
  364. package/dist/tool-system/sandbox/index.d.ts +8 -0
  365. package/dist/tool-system/sandbox/index.js +7 -2
  366. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  367. package/dist/tool-system/validate-tool-metadata.js +63 -0
  368. package/dist/types.d.ts +217 -6
  369. package/dist/updater.js +20 -9
  370. package/dist/utils/envUtils.d.ts +0 -9
  371. package/dist/utils/envUtils.js +3 -28
  372. package/dist/utils/exec.d.ts +40 -0
  373. package/dist/utils/exec.js +144 -0
  374. package/dist/utils/json.d.ts +12 -0
  375. package/dist/utils/json.js +92 -0
  376. package/dist/utils/theme.d.ts +1 -1
  377. package/dist/utils/theme.js +1 -1
  378. package/dist/utils/toolDisplay.js +0 -1
  379. package/package.json +13 -7
  380. package/dist/agent/coordinator.d.ts +0 -49
  381. package/dist/agent/coordinator.js +0 -77
  382. package/dist/settings/manager.test.js +0 -73
  383. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  384. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  385. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  386. package/dist/tool-system/builtin/send-message.js +0 -47
  387. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
package/dist/index.js CHANGED
@@ -3,11 +3,13 @@
3
3
  *
4
4
  * Public API exports.
5
5
  */
6
- export const VERSION = "0.5.0-rc.0";
6
+ export const VERSION = "0.5.0-rc.2";
7
7
  // ─── Exceptions ──────────────────────────────────────────────────
8
8
  export { FrameworkError, LLMError, LLMRateLimitError, ContextLimitError, ToolError, ToolNotFoundError, ToolExecutionError, ToolTimeoutError, PermissionDeniedError, SessionError, TranscriptError, ConfigError, SandboxUnavailableError, } from "./exceptions.js";
9
9
  // ─── Engine (primary API) ────────────────────────────────────────
10
10
  export { Engine, loadAgentDefinitionsForCwd } from "./engine/engine.js";
11
+ export { resolveLLMConfigForTag } from "./engine/resolve-llm-config.js";
12
+ export { resolveAuxKey } from "./engine/aux-key.js";
11
13
  export { parseAgentDefinition, serializeAgentDefinition, } from "./agent/agent-definition.js";
12
14
  export { AgentDefinitionRegistry, } from "./agent/agent-definition-registry.js";
13
15
  export { EngineRuntime } from "./engine/runtime.js";
@@ -18,13 +20,14 @@ export { createLLMClient, registerProvider } from "./llm/client-factory.js";
18
20
  export { AnthropicClient } from "./llm/providers/anthropic.js";
19
21
  export { OpenAIClient } from "./llm/providers/openai.js";
20
22
  export { ModelPool } from "./llm/model-pool.js";
23
+ export { modelEntriesFromConnections } from "./engine/model-connections-pool.js";
21
24
  // ─── Tools ───────────────────────────────────────────────────────
22
25
  export { ToolRegistry } from "./tool-system/registry.js";
23
26
  export { ToolExecutor } from "./tool-system/executor.js";
24
27
  export { PermissionClassifier, HeadlessApprovalBackend, AutoApprovalBackend } from "./tool-system/permission.js";
25
28
  export { BUILTIN_TOOLS } from "./tool-system/builtin/index.js";
26
29
  export { makeUpdateAutomationMemoryTool } from "./tool-system/builtin/update-automation-memory.js";
27
- export { MCPManager } from "./tool-system/mcp-manager.js";
30
+ export { MCPManager, buildHttpHeaders, buildStdioEnv } from "./tool-system/mcp-manager.js";
28
31
  // ─── Hooks ───────────────────────────────────────────────────────
29
32
  export { HookRegistry } from "./hooks/registry.js";
30
33
  export { wrapHookMessages } from "./hooks/inject.js";
@@ -41,6 +44,8 @@ export { Methods, ErrorCodes, } from "./protocol/types.js";
41
44
  export { Transcript } from "./session/transcript.js";
42
45
  export { SessionManager } from "./session/session-manager.js";
43
46
  export { FileHistory } from "./session/file-history.js";
47
+ export { latestUndoTarget, earliestSnapshotsPerFile, latestTurnUndoTargets, latestRedoTargets, } from "./session/undo-target.js";
48
+ export { diffLines, renderDiffPreview } from "./session/simple-diff.js";
44
49
  export { MemoryManager } from "./session/memory.js";
45
50
  export { runDreamConsolidation, } from "./services/dream-consolidation.js";
46
51
  // ─── Prompt ──────────────────────────────────────────────────────
@@ -59,18 +64,23 @@ export { scanSkills, invalidateSkillCache } from "./skills/index.js";
59
64
  // ─── Capability control (扩展能力 backend) ───────────────────────
60
65
  export { CapabilityService, CapabilityNotFoundError, projectBuiltin, projectMcp, projectSkills, projectPlugins, } from "./capability-control/index.js";
61
66
  export { readInstalledPlugins } from "./plugins/installedPlugins.js";
67
+ export { computeEffectiveDisabledLists, } from "./capability-control/disabled-lists.js";
62
68
  // ─── Plugin installer (CC + Codex) ───────────────────────────────
63
69
  export { installPluginFromPath } from "./plugins/installer/install.js";
64
70
  export { installPluginFromSource } from "./plugins/installer/installFromSource.js";
71
+ export { installLocalPlugin, installPluginFromArchive, } from "./plugins/installer/installFromArchive.js";
65
72
  export { parseSource } from "./plugins/installer/parseSource.js";
66
73
  export { detectPluginFormat } from "./plugins/installer/detectFormat.js";
67
74
  export { CodexPluginManifest, CSMeta, PluginInstallError, } from "./plugins/installer/types.js";
68
75
  export { mergePluginMcpServers } from "./plugins/installer/loadPluginMcp.js";
76
+ export { listPluginHooks, pluginHookKey } from "./plugins/loadPluginHooks.js";
77
+ export { describePluginContent } from "./plugins/pluginContent.js";
69
78
  export { pluginAgentDirs } from "./plugins/installer/loadPluginAgents.js";
70
79
  export { appendInstallEntry, pluginInstallKey, removeInstallEntries, } from "./plugins/installedPlugins.js";
71
80
  export { uninstallPluginByName } from "./plugins/installer/uninstall.js";
72
81
  export { listInstalledPlugins } from "./plugins/installer/list.js";
73
82
  export { updatePluginByName } from "./plugins/installer/update.js";
83
+ export { checkPluginUpdate } from "./plugins/installer/checkUpdate.js";
74
84
  // ─── Arena ───────────────────────────────────────────────────────
75
85
  export { Arena } from "./arena/arena.js";
76
86
  export { MODEL_PRESETS, getMaxOutputTokens } from "./arena/model-presets.js";
@@ -112,24 +122,37 @@ export { defineProduct, } from "./product/index.js";
112
122
  export { logger } from "./logging/logger.js";
113
123
  // ─── Settings ────────────────────────────────────────────────────
114
124
  export { SettingsManager } from "./settings/manager.js";
125
+ export { migrateConfig, configVersionOf, CURRENT_CONFIG_VERSION, } from "./settings/migrate-config.js";
115
126
  export { SettingsSchema, validateSettings } from "./settings/schema.js";
127
+ export { settingsJsonSchema, writeSettingsSchemaFile } from "./settings/schema-export.js";
116
128
  export { personalizationFrom } from "./settings/personalization.js";
129
+ export { CredentialStore, formatNetscapeCookies, parseCookieJar, useCredentialToolDef, useCredentialToolDefFor, sweepStaleCredentialCookies, PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./credentials/index.js";
117
130
  // ─── State (runtime singletons shared with TUI) ──────────────────
131
+ /** @internal Shared with the in-repo TUI/desktop hosts; not stable SDK surface. */
118
132
  export { getSessionId, switchSession, getOriginalCwd, setOriginalCwd, getProjectRoot, setProjectRoot, getCwdState, getIsInteractive, updateLastInteractionTime, flushInteractionTime, markScrollActivity, } from "./state.js";
119
133
  // ─── Utils (shared primitives used by TUI) ───────────────────────
134
+ /** @internal Shared primitives for the in-repo TUI/desktop hosts; not stable SDK surface. */
120
135
  export { getGraphemeSegmenter, firstGrapheme, lastGrapheme, getWordSegmenter, getRelativeTimeFormat, getTimeZone, getSystemLocaleLanguage, } from "./utils/intl.js";
121
136
  export { env } from "./utils/env.js";
122
137
  export { default as sliceAnsi } from "./utils/sliceAnsi.js";
123
138
  export { execFileNoThrow } from "./utils/execFileNoThrow.js";
139
+ export { findExecutable, resolveExecutable, setGitPathOverride, resolveGit, isGitAvailable, } from "./utils/exec.js";
124
140
  export { gte } from "./utils/semver.js";
141
+ // Cross-process file lock (proper-lockfile via createRequire, ESM-safe). Used by
142
+ // RunLock / CronStore internally; exported so other writers of shared files
143
+ // (e.g. desktop settings-service writing the same settings.json as the worker)
144
+ // can take the same advisory lock.
145
+ export { lock, lockSync, unlock, check } from "./utils/lockfile.js";
125
146
  export { logForDebugging } from "./utils/debug.js";
126
- export { isEnvTruthy, isEnvDefinedFalsy, getClaudeConfigHomeDir, isBareMode, parseEnvVars, shouldMaintainProjectWorkingDir, isRunningOnHomespace, getAWSRegion, getDefaultVertexRegion, getVertexRegionForModel, isInProtectedNamespace, } from "./utils/envUtils.js";
147
+ export { isEnvTruthy, isEnvDefinedFalsy, getClaudeConfigHomeDir, isBareMode, parseEnvVars, shouldMaintainProjectWorkingDir, getAWSRegion, getDefaultVertexRegion, getVertexRegionForModel, } from "./utils/envUtils.js";
127
148
  export { startCapturingEarlyInput, stopCapturingEarlyInput, consumeEarlyInput, hasEarlyInput, seedEarlyInput, isCapturingEarlyInput, } from "./utils/earlyInput.js";
128
149
  export { formatBytes, formatToolArgs, singleLine, MAX_LINE_WIDTH, TOOL_DOT_COLORS, } from "./utils/toolDisplay.js";
150
+ export { classifyBashLines, } from "./tool-system/builtin/bash-output-style.js";
129
151
  export { formatDuration, formatTokens } from "./utils/format.js";
130
152
  export { getTheme, } from "./utils/theme.js";
131
153
  export { resolveThemeSetting } from "./utils/systemTheme.js";
132
154
  // ─── Logging (extended) ──────────────────────────────────────────
155
+ /** @internal Host-lifecycle logging hooks for the in-repo TUI/desktop hosts; not stable SDK surface. */
133
156
  export { rotateLogs } from "./logging/logger.js";
134
157
  export { recordUIEvent } from "./logging/session-recorder.js";
135
158
  // ─── Cost Tracker ────────────────────────────────────────────────
@@ -141,7 +164,15 @@ export { hasApiKey, resolveApiKey, appendOnboardingResult, detectEnvKeys, saveAr
141
164
  export { getCurrentVersion, checkForUpdate, scheduleAutoInstallOnExit, getUpdateAvailable, getAutoUpdateDisabledReason, } from "./updater.js";
142
165
  // ─── Git Utilities ───────────────────────────────────────────────
143
166
  export { isGitRepo, getCurrentBranch, getGitStatus, getGitDiff, getGitDiffStat, getGitLog, gitAdd, gitCommit, gitListBranches, gitCheckout, ghAvailable, ghPrComments, } from "./git/utils.js";
167
+ // ─── Code review (TODO 7.3) ─────────────────────────────────────
168
+ export { buildReviewPrompt, parseDimensions, ALL_DIMENSIONS, } from "./review/review-prompt.js";
144
169
  // ─── Tool-system (extended for TUI) ─────────────────────────────
170
+ /**
171
+ * @internal Exports below are consumed by the in-repo TUI/desktop hosts, not
172
+ * part of the stable `@cjhyy/code-shell-core` SDK surface. They may change or
173
+ * move to a `/tui` subpath without a major bump. External SDK users: prefer the
174
+ * primary Engine/Protocol API above.
175
+ */
145
176
  export { getInteractiveApprovalBackend } from "./tool-system/permission.js";
146
177
  export { defaultSandboxConfig, } from "./tool-system/sandbox/index.js";
147
178
  export { buildNotificationMessage, buildNotificationSummary, notificationQueue, agentNotificationBus, notificationItemToStreamEvent, } from "./tool-system/builtin/agent-notifications.js";
@@ -149,18 +180,32 @@ export { buildNotificationMessage, buildNotificationSummary, notificationQueue,
149
180
  // + scheduler/store/runner). Hosts (Electron main, future CLI server) load
150
181
  // this and inject store + runner. See docs/automation-plan-2026-05-31.md.
151
182
  export { startAutomation, CronScheduler, cronScheduler, CronStore, defaultCronStorePath, bindCronToEngine, bindCronToRunManager, isCronExpression, parseCronExpression, nextCronTime, resolveWritePolicy, wrapUntrustedInput, runWriteJobInWorktree, } from "./automation/index.js";
183
+ // CC orchestrator (external claude-cli rooms + CC-aware scheduling).
184
+ export * from "./cc-orchestrator/index.js";
185
+ // Quota — remaining CC/Codex subscription usage (self-contained, plugin-liftable).
186
+ export { checkQuota, formatQuota } from "./quota/index.js";
187
+ export { resolveQuotaCredentials } from "./quota/credentials.js";
152
188
  export { asyncAgentRegistry, } from "./tool-system/builtin/agent-registry.js";
189
+ export { backgroundShellManager, BackgroundShellManager, } from "./runtime/background-shell.js";
190
+ export { getImageProvider, DEFAULT_IMAGE_MODEL, } from "./tool-system/builtin/image-providers.js";
191
+ // ─── Speech-to-text (voice input / 听写) ────────────────────────
192
+ export { transcribe, } from "./stt/transcribe.js";
193
+ export { resolveTranscribeProvider, isTranscribeAvailable, describeTranscribe, } from "./stt/resolve-transcribe.js";
194
+ export { BUILTIN_CATALOG, getMergedCatalog, loadUserCatalog, userCatalogPath, findCatalogEntry, saveCatalogEntry, deleteUserCatalogEntry, catalogEntryOrigins, } from "./model-catalog/index.js";
153
195
  // ─── Protocol (extended for TUI) ────────────────────────────────
196
+ /** @internal Extended protocol surface for the in-repo TUI/desktop hosts; not stable SDK surface. */
154
197
  export { createInProcessClient } from "./protocol/helpers.js";
155
198
  // ─── Arena (extended for TUI) ───────────────────────────────────
199
+ /** @internal Extended Arena surface for the in-repo TUI/desktop hosts; not stable SDK surface. */
156
200
  export { formatArenaResult, printArenaResult, renderProgress, createProgressRenderer, } from "./arena/render/terminal.js";
157
201
  export { formatArenaResultForSession } from "./arena/render/session.js";
158
202
  // ─── Plugins ─────────────────────────────────────────────────────
159
203
  export { installPlugin, uninstallPlugin, listInstalled, } from "./plugins/pluginInstaller.js";
160
- export { addMarketplace, removeMarketplace, listMarketplaces, loadMarketplace, } from "./plugins/marketplaceManager.js";
204
+ export { addMarketplace, refreshMarketplace, removeMarketplace, listMarketplaces, loadMarketplace, } from "./plugins/marketplaceManager.js";
161
205
  export { parseMarketplaceInput, deriveMarketplaceName, } from "./plugins/parseMarketplaceInput.js";
162
206
  export { scanPluginCommands, } from "./plugins/pluginCommandsLoader.js";
163
207
  // ─── LLM (extended for TUI) ─────────────────────────────────────
208
+ /** @internal Extended LLM surface for the in-repo TUI/desktop hosts; not stable SDK surface. */
164
209
  export { defaultCacheDir, } from "./llm/model-cache.js";
165
210
  export { fetchModelList, } from "./llm/model-fetcher.js";
166
211
  export { sanitizeApiKey, hasNonAsciiPrintable, } from "./llm/api-key-sanitize.js";
@@ -170,3 +215,14 @@ export { reasoningControlFor, } from "./llm/capabilities/reasoning-control.js";
170
215
  export { REASONING_EFFORTS, } from "./llm/reasoning-setting.js";
171
216
  // ─── Data ────────────────────────────────────────────────────────
172
217
  export { syncOpenRouterCatalog, getOpenRouterSnapshot, } from "./data/openrouter-sync.js";
218
+ // ─── External agent config (Mobile Web Remote Rooms) ─────────────
219
+ // Resolves the externalAgents settings block (notably claudeCode.trustedWorkspaces),
220
+ // the source of truth for a Room's permission mode. The former /cc & /codex
221
+ // managed-job path was removed — the phone now talks to resident Rooms only.
222
+ export { resolveExternalAgentConfig } from "./external-agents/config.js";
223
+ // ─── Browser automation bridge ───────────────────────────────────
224
+ // Driver-agnostic contract + the pure a11y-tree flattener. The desktop host's
225
+ // browser-driver module implements BrowserBridge on top of webContents.debugger
226
+ // (CDP), reusing flattenAxTree. See the MVP spec
227
+ // docs/superpowers/specs/2026-06-16-browser-automation-mvp.md.
228
+ export { flattenAxTree, renderElementList, cleanPageText, CONTENT_CHAR_CAP, buildExtractLinksScript, EXTRACT_LINK_CAP, } from "./tool-system/browser-bridge.js";
@@ -0,0 +1,14 @@
1
+ /**
2
+ * paramSpecsFromCapability — bridge the capability layer (rules.ts, the vetted
3
+ * single source of truth) into the unified catalog's ParamSpec[]. The catalog
4
+ * reuses this knowledge instead of re-hand-writing reasoning/vision per model.
5
+ * See docs/superpowers/specs/2026-06-15-unified-model-catalog-design.md §4.
6
+ */
7
+ import type { ProviderKindName } from "../provider-kinds.js";
8
+ import type { ParamSpec } from "../../model-catalog/types.js";
9
+ /**
10
+ * Project a (kind, model)'s capabilities into catalog ParamSpec[]. Currently
11
+ * covers reasoning (the param that diverges most across models); image
12
+ * size/quality live in their own catalog entries. Adaptive / none → no spec.
13
+ */
14
+ export declare function paramSpecsFromCapability(kind: ProviderKindName, model: string): ParamSpec[];
@@ -0,0 +1,62 @@
1
+ import { reasoningControlFor } from "./reasoning-control.js";
2
+ /** Where each provider kind's reasoning knob lands on the request body. */
3
+ function reasoningWireField(kind) {
4
+ switch (kind) {
5
+ case "anthropic":
6
+ return "thinking.budget_tokens";
7
+ case "deepseek":
8
+ case "zai":
9
+ return "thinking.type";
10
+ default:
11
+ // OpenAI-compat (openai/google/openrouter/xai/mistral/groq) use reasoning_effort.
12
+ return "reasoning_effort";
13
+ }
14
+ }
15
+ /**
16
+ * Project a (kind, model)'s capabilities into catalog ParamSpec[]. Currently
17
+ * covers reasoning (the param that diverges most across models); image
18
+ * size/quality live in their own catalog entries. Adaptive / none → no spec.
19
+ */
20
+ export function paramSpecsFromCapability(kind, model) {
21
+ const specs = [];
22
+ const control = reasoningControlFor(kind, model);
23
+ const wire = { field: reasoningWireField(kind) };
24
+ switch (control.kind) {
25
+ case "effort":
26
+ specs.push({
27
+ name: "reasoning",
28
+ label: "思考强度",
29
+ control: "enum",
30
+ options: control.options,
31
+ default: control.default,
32
+ doc: "Reasoning effort — how hard the model thinks before answering.",
33
+ wire,
34
+ });
35
+ break;
36
+ case "budget":
37
+ specs.push({
38
+ name: "reasoning",
39
+ label: "思考预算",
40
+ control: "number",
41
+ min: control.min,
42
+ default: control.default,
43
+ doc: "Thinking token budget — higher = more deliberate reasoning.",
44
+ wire,
45
+ });
46
+ break;
47
+ case "toggle":
48
+ specs.push({
49
+ name: "reasoning",
50
+ label: "思考",
51
+ control: "toggle",
52
+ default: control.default,
53
+ doc: "Toggle the model's thinking mode on/off.",
54
+ wire,
55
+ });
56
+ break;
57
+ case "adaptive":
58
+ case "none":
59
+ break; // nothing to set
60
+ }
61
+ return specs;
62
+ }
@@ -43,6 +43,10 @@ export const RULES = [
43
43
  kind: "openai-effort",
44
44
  disabledEffort: "none",
45
45
  supportedEfforts: ["low", "medium", "high", "xhigh"], // no "minimal"; adds "xhigh"
46
+ // gpt-5.5 400s when `reasoning_effort` rides alongside `tools` on
47
+ // /v1/chat/completions — drop the field up-front on tool turns instead
48
+ // of eating the 400 + 1s-backoff retry on every tool-using turn.
49
+ noEffortWithTools: true,
46
50
  },
47
51
  echoReasoning: "optional",
48
52
  // 400s on `max_tokens is too large: ... at most 128000`. Clamp here so a
@@ -47,6 +47,16 @@ export type ReasoningShape = {
47
47
  kind: "openai-effort";
48
48
  disabledEffort?: ReasoningEffort | "none";
49
49
  supportedEfforts?: ReasoningEffort[];
50
+ /**
51
+ * gpt-5.5+ rejects `reasoning_effort` whenever `tools` are also present on
52
+ * `/v1/chat/completions` ("Function tools with reasoning_effort are not
53
+ * supported … Please use /v1/responses instead"), 400-ing the request.
54
+ * When set, the OpenAI client OMITS `reasoning_effort` on any tool-bearing
55
+ * request up-front — so we never eat the 400 + retry on every tool turn.
56
+ * The reactive `_dropReasoningEffort` sticky still covers any variant we
57
+ * haven't tagged here.
58
+ */
59
+ noEffortWithTools?: boolean;
50
60
  }
51
61
  /** Anthropic Claude 4.x ≤ 4.5 — `{thinking: {type: "enabled", budget_tokens: N}}`. */
52
62
  | {
@@ -31,7 +31,34 @@ export declare abstract class LLMClientBase {
31
31
  abstract createMessage(options: CreateMessageOptions): Promise<LLMResponse>;
32
32
  protected recordUsage(usage: TokenUsage, options?: CreateMessageOptions): void;
33
33
  getUsage(): LLMUsageTracker;
34
- protected withRetry<T>(fn: () => Promise<T>, maxAttempts?: number): Promise<T>;
34
+ /** Zero all accumulated usage. Used when starting a fresh accounting window
35
+ * (e.g. after a model switch, where the prior model's cache stats no longer
36
+ * apply). */
37
+ resetUsage(): void;
38
+ /**
39
+ * Compose the caller's AbortSignal with a hard per-request deadline.
40
+ *
41
+ * The provider SDKs accept a `timeout`, but in practice it does NOT fire for
42
+ * a *half-dead socket* (TCP connected, keep-alives flowing, but no response
43
+ * bytes) — we have observed real requests hang 15–33 minutes before the SDK
44
+ * finally surfaced "Socket timeout". The streaming idle-watchdog only covers
45
+ * the gap BETWEEN chunks, not connection setup / first byte, and non-stream
46
+ * calls don't go through it at all. An explicit AbortSignal.timeout is the
47
+ * one mechanism that reliably tears such a request down.
48
+ *
49
+ * Returns a signal to hand the SDK (`{ signal }`) plus a `cleanup()` to clear
50
+ * the timer once the request settles. The deadline is generous (default 2×
51
+ * the SDK timeout, min 120s) — long enough for slow-but-alive generations,
52
+ * short enough that a wedged socket can't burn half an hour.
53
+ */
54
+ protected withRequestDeadline(callerSignal?: AbortSignal): {
55
+ signal: AbortSignal;
56
+ cleanup: () => void;
57
+ };
58
+ protected withRetry<T>(fn: (requestSignal?: AbortSignal) => Promise<T>, opts?: {
59
+ maxAttempts?: number;
60
+ signal?: AbortSignal;
61
+ }): Promise<T>;
35
62
  }
36
63
  /**
37
64
  * Detect HTTP 4xx errors from provider SDKs so withRetry can bail
@@ -3,6 +3,17 @@
3
3
  */
4
4
  import { LLMError, ContextLimitError, LLMRateLimitError } from "../exceptions.js";
5
5
  import { logger } from "../logging/logger.js";
6
+ function emptyUsageTracker() {
7
+ return {
8
+ records: [],
9
+ totalPromptTokens: 0,
10
+ totalCompletionTokens: 0,
11
+ totalTokens: 0,
12
+ totalCacheReadTokens: 0,
13
+ totalCacheCreationTokens: 0,
14
+ requestCount: 0,
15
+ };
16
+ }
6
17
  export class LLMClientBase {
7
18
  config;
8
19
  provider;
@@ -19,13 +30,7 @@ export class LLMClientBase {
19
30
  * each call site needing to remember.
20
31
  */
21
32
  static onUsage;
22
- usage = {
23
- records: [],
24
- totalPromptTokens: 0,
25
- totalCompletionTokens: 0,
26
- totalTokens: 0,
27
- requestCount: 0,
28
- };
33
+ usage = emptyUsageTracker();
29
34
  /**
30
35
  * `config` carries model identity (provider/model/apiKey/baseUrl/maxTokens/
31
36
  * thinking/providerKind). `defaults` carries cross-model runtime knobs
@@ -55,29 +60,104 @@ export class LLMClientBase {
55
60
  this.usage.totalPromptTokens += usage.promptTokens;
56
61
  this.usage.totalCompletionTokens += usage.completionTokens;
57
62
  this.usage.totalTokens += usage.totalTokens;
63
+ this.usage.totalCacheReadTokens += usage.cacheReadTokens ?? 0;
64
+ this.usage.totalCacheCreationTokens += usage.cacheCreationTokens ?? 0;
58
65
  this.usage.requestCount++;
59
66
  LLMClientBase.onUsage?.(this.model, usage);
60
67
  }
61
68
  getUsage() {
62
69
  return { ...this.usage };
63
70
  }
64
- async withRetry(fn, maxAttempts) {
65
- const attempts = maxAttempts ?? this.retryMaxAttempts;
71
+ /** Zero all accumulated usage. Used when starting a fresh accounting window
72
+ * (e.g. after a model switch, where the prior model's cache stats no longer
73
+ * apply). */
74
+ resetUsage() {
75
+ this.usage = emptyUsageTracker();
76
+ }
77
+ /**
78
+ * Compose the caller's AbortSignal with a hard per-request deadline.
79
+ *
80
+ * The provider SDKs accept a `timeout`, but in practice it does NOT fire for
81
+ * a *half-dead socket* (TCP connected, keep-alives flowing, but no response
82
+ * bytes) — we have observed real requests hang 15–33 minutes before the SDK
83
+ * finally surfaced "Socket timeout". The streaming idle-watchdog only covers
84
+ * the gap BETWEEN chunks, not connection setup / first byte, and non-stream
85
+ * calls don't go through it at all. An explicit AbortSignal.timeout is the
86
+ * one mechanism that reliably tears such a request down.
87
+ *
88
+ * Returns a signal to hand the SDK (`{ signal }`) plus a `cleanup()` to clear
89
+ * the timer once the request settles. The deadline is generous (default 2×
90
+ * the SDK timeout, min 120s) — long enough for slow-but-alive generations,
91
+ * short enough that a wedged socket can't burn half an hour.
92
+ */
93
+ withRequestDeadline(callerSignal) {
94
+ const deadlineMs = Math.max(this.timeout * 2, 120_000);
95
+ const deadline = AbortSignal.timeout(deadlineMs);
96
+ // AbortSignal.any is available in Node ≥20 / Bun; combine so EITHER the
97
+ // user's cancel OR the deadline aborts the request.
98
+ const signal = callerSignal
99
+ ? AbortSignal.any([callerSignal, deadline])
100
+ : deadline;
101
+ // AbortSignal.timeout's timer is unref'd by the runtime; no manual clear is
102
+ // strictly required, but expose cleanup for symmetry / future tightening.
103
+ return { signal, cleanup: () => { } };
104
+ }
105
+ async withRetry(fn, opts) {
106
+ const attempts = opts?.maxAttempts ?? this.retryMaxAttempts;
107
+ const signal = opts?.signal;
66
108
  let lastError;
67
109
  for (let attempt = 1; attempt <= attempts; attempt++) {
110
+ // Bail BEFORE issuing (or re-issuing) the request if the run was
111
+ // cancelled. Without this, a cancel that lands during a backoff sleep —
112
+ // or while a flaky connection hangs — still re-fires the same doomed
113
+ // request, so the user's Stop "does nothing" until all attempts +
114
+ // backoffs drain (~50 s for a 3× Connection-error loop). Checking here
115
+ // makes Cancel take effect at the next retry boundary.
116
+ if (signal?.aborted) {
117
+ throw new DOMException("Request cancelled", "AbortError");
118
+ }
119
+ // Per-attempt hard deadline composed with the caller's cancel signal.
120
+ // A half-dead socket that ignores the SDK timeout is torn down here.
121
+ const { signal: requestSignal, cleanup } = this.withRequestDeadline(signal);
68
122
  try {
69
- return await fn();
123
+ return await fn(requestSignal);
70
124
  }
71
125
  catch (err) {
72
126
  lastError = err;
73
127
  if (err instanceof ContextLimitError)
74
128
  throw err;
129
+ // Distinguish a deadline tear-down from a user cancel. When the caller
130
+ // did NOT abort but the request signal did, the per-request deadline
131
+ // fired (wedged socket). That is RETRYABLE — fall through to the normal
132
+ // retry/backoff path rather than the abort-no-retry guard below, since
133
+ // the upstream may have just recovered.
134
+ const deadlineFired = !signal?.aborted && requestSignal.aborted;
135
+ if (deadlineFired) {
136
+ logger.warn("llm.request_deadline", {
137
+ cat: "llm",
138
+ provider: this.provider,
139
+ model: this.model,
140
+ attempt,
141
+ of: attempts,
142
+ });
143
+ if (attempt < attempts) {
144
+ const backoff = Math.min(1000 * Math.pow(2, attempt - 1), 30_000);
145
+ if (await abortableSleep(backoff, signal)) {
146
+ throw new DOMException("Request cancelled during retry backoff", "AbortError");
147
+ }
148
+ continue;
149
+ }
150
+ throw new LLMError(`request exceeded deadline (${Math.max(this.timeout * 2, 120_000)}ms) — connection wedged`, this.provider);
151
+ }
75
152
  // User pressed ESC / Stop, or the run's AbortSignal fired. The SDK
76
153
  // throws APIUserAbortError (no HTTP status, so isClientError below
77
154
  // can't catch it). Retrying re-issues the same aborted request 3×
78
155
  // with growing backoff — ~40 s of dead time ending in llm.exhausted,
79
156
  // for work the user explicitly cancelled. Surface immediately.
80
- if (isAbortError(err)) {
157
+ // Also catch the case where the run aborted but the underlying error
158
+ // surfaced as a generic Connection error (not an SDK abort): the
159
+ // signal is the authoritative "user cancelled" source.
160
+ if (isAbortError(err) || signal?.aborted) {
81
161
  logger.warn("llm.abort_no_retry", {
82
162
  cat: "llm",
83
163
  provider: this.provider,
@@ -97,7 +177,9 @@ export class LLMClientBase {
97
177
  reason: "rate_limit",
98
178
  waitMs,
99
179
  });
100
- await new Promise((r) => setTimeout(r, waitMs));
180
+ if (await abortableSleep(waitMs, signal)) {
181
+ throw new DOMException("Request cancelled during retry backoff", "AbortError");
182
+ }
101
183
  continue;
102
184
  }
103
185
  // 4xx (except 429, handled above as LLMRateLimitError) is a
@@ -136,12 +218,36 @@ export class LLMClientBase {
136
218
  error: err.message,
137
219
  backoffMs: backoff,
138
220
  });
139
- await new Promise((r) => setTimeout(r, backoff));
221
+ if (await abortableSleep(backoff, signal)) {
222
+ throw new DOMException("Request cancelled during retry backoff", "AbortError");
223
+ }
140
224
  }
141
225
  }
142
226
  throw lastError ?? new LLMError("Unknown LLM error");
143
227
  }
144
228
  }
229
+ /**
230
+ * Sleep `ms`, but wake immediately if `signal` aborts. Returns true when it
231
+ * woke due to an abort (caller should bail), false on a normal timeout.
232
+ * Without this an abort during a retry backoff is invisible until the timer
233
+ * fires — the root cause of "Stop does nothing" during a flaky-connection
234
+ * retry loop.
235
+ */
236
+ function abortableSleep(ms, signal) {
237
+ if (signal?.aborted)
238
+ return Promise.resolve(true);
239
+ return new Promise((resolve) => {
240
+ const timer = setTimeout(() => {
241
+ signal?.removeEventListener("abort", onAbort);
242
+ resolve(false);
243
+ }, ms);
244
+ const onAbort = () => {
245
+ clearTimeout(timer);
246
+ resolve(true);
247
+ };
248
+ signal?.addEventListener("abort", onAbort, { once: true });
249
+ });
250
+ }
145
251
  /**
146
252
  * Detect HTTP 4xx errors from provider SDKs so withRetry can bail
147
253
  * without burning backoff time. OpenAI/Anthropic SDKs attach a numeric
@@ -6,8 +6,8 @@
6
6
  * reads, isStale just checks. Malformed/missing files yield undefined.
7
7
  */
8
8
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
9
- import { homedir } from "node:os";
10
9
  import { join } from "node:path";
10
+ import { userHome } from "../settings/manager.js";
11
11
  const TTL_MS = 7 * 24 * 3600 * 1000;
12
12
  export function readCache(cacheDir, providerKey) {
13
13
  const path = join(cacheDir, `${providerKey}.json`);
@@ -42,5 +42,7 @@ export function isStale(file, now = Date.now()) {
42
42
  return now - ts > TTL_MS;
43
43
  }
44
44
  export function defaultCacheDir() {
45
- return join(homedir(), ".code-shell", "cache", "models");
45
+ // userHome() (not raw homedir(), which bun caches at process start) so a
46
+ // relocated/test HOME redirects the cache dir instead of writing real ~/.code-shell.
47
+ return join(userHome(), ".code-shell", "cache", "models");
46
48
  }
@@ -23,18 +23,32 @@ export interface ModelEntry {
23
23
  model: string;
24
24
  baseUrl?: string;
25
25
  apiKey?: string;
26
+ /** Whether the catalog template requires a key (default true; false = local/
27
+ * no-auth provider). Used by resolveLLMConfigForTag to reject a key-needing
28
+ * connection that has no resolved key with a clear error rather than a 401. */
29
+ needsKey?: boolean;
26
30
  maxOutputTokens?: number;
27
31
  /** Per-model context window size. Falls back to config.maxContextTokens → 200_000. */
28
32
  maxContextTokens?: number;
29
33
  /** Optional reference into ProviderCatalog. When set, baseUrl/apiKey
30
34
  * come from the catalog unless the entry overrides them. */
31
35
  providerKey?: string;
36
+ /** Per-model external token command; overrides provider-level (TODO 7.2). */
37
+ authCommand?: string;
38
+ /** Per-model extra HTTP headers; merged over provider-level (TODO 7.2). */
39
+ httpHeaders?: Record<string, string>;
40
+ /** OpenAI `service_tier` request param (TODO 7.2). */
41
+ serviceTier?: string;
42
+ /** OpenAI reasoning `summary` control (TODO 7.2). */
43
+ reasoningSummary?: string;
32
44
  /**
33
45
  * Per-model reasoning override. Wins over the provider-level setting
34
46
  * (ProviderCatalog entry's `reasoning`). Useful when models in the same
35
47
  * provider need different defaults — e.g. one model off but another on.
36
48
  */
37
49
  reasoning?: import("./reasoning-setting.js").ReasoningSetting;
50
+ /** Catalog-driven extra request-body fields (wire-mapped paramValues). */
51
+ extraBody?: Record<string, unknown>;
38
52
  }
39
53
  export declare class ModelPool {
40
54
  private models;
@@ -232,9 +232,22 @@ export class ModelPool {
232
232
  ...(entry.reasoning ?? fromCat?.reasoning
233
233
  ? { reasoning: entry.reasoning ?? fromCat?.reasoning }
234
234
  : {}),
235
+ // Auth command: entry overrides catalog. (TODO 7.2)
236
+ ...(entry.authCommand ?? fromCat?.authCommand
237
+ ? { authCommand: entry.authCommand ?? fromCat?.authCommand }
238
+ : {}),
239
+ // HTTP headers: merge catalog (base) then entry (override). (TODO 7.2)
240
+ ...(fromCat?.httpHeaders || entry.httpHeaders
241
+ ? { httpHeaders: { ...fromCat?.httpHeaders, ...entry.httpHeaders } }
242
+ : {}),
243
+ ...(entry.serviceTier ? { serviceTier: entry.serviceTier } : {}),
244
+ ...(entry.reasoningSummary ? { reasoningSummary: entry.reasoningSummary } : {}),
235
245
  // Carry the catalog kind through so the capability layer can pick
236
246
  // per-(kind, model) request-shape rules.
237
247
  ...(fromCat?.kind ? { providerKind: fromCat.kind } : {}),
248
+ ...(entry.extraBody && Object.keys(entry.extraBody).length > 0
249
+ ? { extraBody: entry.extraBody }
250
+ : {}),
238
251
  };
239
252
  }
240
253
  /**
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Provider auth/header resolution for custom model providers (TODO 7.2).
3
+ *
4
+ * - `authCommand`: a shell command whose stdout is an auth token. Used for
5
+ * short-lived tokens vended by an external tool (gcloud, aws, vault…). The
6
+ * result is cached briefly so we don't re-run the command on every request.
7
+ * - `httpHeaders`: extra headers; a `$ENV_VAR` value is resolved from the
8
+ * environment at build time so secrets stay out of settings.json.
9
+ *
10
+ * The token-running side is isolated behind a `runCommand` injection so the
11
+ * env-var + caching logic is unit-testable without spawning a shell.
12
+ */
13
+ /** Resolve `$ENV` / `${ENV}` placeholders in a header value against `env`. */
14
+ export declare function resolveHeaderValue(value: string, env?: NodeJS.ProcessEnv): string;
15
+ /** Resolve every header value's env placeholders, dropping empties. */
16
+ export declare function resolveHeaders(headers: Record<string, string> | undefined, env?: NodeJS.ProcessEnv): Record<string, string>;
17
+ type RunCommand = (cmd: string) => string;
18
+ /**
19
+ * Run an auth command and return its trimmed first line as the token. Caches
20
+ * by command string for {@link TOKEN_TTL_MS}. `now`/`runCommand` are injectable
21
+ * for tests. Returns "" if the command yields no output.
22
+ */
23
+ export declare function resolveAuthCommand(command: string, opts?: {
24
+ runCommand?: RunCommand;
25
+ now?: number;
26
+ }): string;
27
+ /** Test seam: clear the token cache. */
28
+ export declare function __clearAuthTokenCache(): void;
29
+ /**
30
+ * Resolve the effective API key for a client: an explicit `apiKey` wins;
31
+ * otherwise run `authCommand` if present; otherwise fall back to `envKey`
32
+ * (e.g. process.env.OPENAI_API_KEY). Returns undefined when nothing resolves.
33
+ */
34
+ export declare function resolveApiKey(config: {
35
+ apiKey?: string;
36
+ authCommand?: string;
37
+ }, envKey?: string, opts?: {
38
+ runCommand?: RunCommand;
39
+ now?: number;
40
+ }): string | undefined;
41
+ export {};