@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
@@ -4,6 +4,8 @@
4
4
  * (see src/ui/components/OnboardingPrompt.tsx); this module only exposes
5
5
  * pure(-ish) helpers it consumes, so there's a single input stack.
6
6
  */
7
+ import { PROVIDERS, type ProviderDef } from "./data/model-metadata.js";
8
+ export { PROVIDERS, type ProviderDef };
7
9
  export interface OnboardingResult {
8
10
  /**
9
11
  * Pool alias key (e.g. "deepseek-v4-pro"). The engine uses this to switch
@@ -17,25 +19,6 @@ export interface OnboardingResult {
17
19
  apiKey: string;
18
20
  baseUrl: string;
19
21
  }
20
- export interface ProviderDef {
21
- id: string;
22
- name: string;
23
- envKey: string;
24
- provider: string;
25
- baseUrl: string;
26
- keyUrl: string;
27
- keyPrefix: string;
28
- /**
29
- * The catalog of model IDs to register for this provider. The first
30
- * entry doubles as the zero-config default — auto-activated when the
31
- * user boots with just an env key (no onboarding). Users override by
32
- * picking in the wizard or running `/model`.
33
- */
34
- models: string[];
35
- /** When true, skip API key prompt (e.g. local providers like Ollama). */
36
- noKey?: boolean;
37
- }
38
- export declare const PROVIDERS: ProviderDef[];
39
22
  /**
40
23
  * Resolve the model list a provider should expose right now. For
41
24
  * OpenRouter this comes from the snapshot; for direct providers it
@@ -65,26 +48,6 @@ export declare function validateApiKey(baseUrl: string, apiKey: string): Promise
65
48
  * Priority: 1) command-line option 2) settings.json 3) all provider env vars
66
49
  */
67
50
  export declare function resolveApiKey(optionsApiKey?: string, settingsApiKey?: string): string | undefined;
68
- /**
69
- * Look up a previously-persisted API key for a given provider in
70
- * ~/.code-shell/settings.json. Matches by baseUrl (each ProviderDef.baseUrl
71
- * is unique, while `provider` is a generic kind like "openai" shared across
72
- * multiple endpoints).
73
- *
74
- * Returns the first match found in: settings.models[] (preferred — newer),
75
- * then settings.model (legacy top-level). undefined when nothing matches.
76
- */
77
- export declare function findSavedKeyForProvider(provider: ProviderDef): {
78
- apiKey: string;
79
- baseUrl: string;
80
- } | undefined;
81
- /**
82
- * Return the list of model IDs previously saved under this provider
83
- * (matched by baseUrl). Used by the onboarding wizard to pre-populate the
84
- * "model pool" step with the user's prior choices instead of resetting to
85
- * just the provider's first model.
86
- */
87
- export declare function loadSavedModelsForProvider(provider: ProviderDef): string[];
88
51
  export declare function hasApiKey(): boolean;
89
52
  /**
90
53
  * Resolve a model's max-output-token budget. Lookup order:
@@ -135,55 +98,22 @@ export declare function buildModelPool(provider: ProviderDef, apiKey: string): A
135
98
  maxContextTokens?: number;
136
99
  }>;
137
100
  export declare function modelDisplayName(model: string): string;
138
- export declare function saveSettings(result: OnboardingResult, providerDef?: ProviderDef, poolModels?: string[]): void;
139
101
  /**
140
- * Append-only persistence for the new ProviderModelFlow-based onboarding.
141
- *
142
- * Writes the new shape:
143
- * - settings.activeKey — primary source of truth for active model
144
- * - settings.models[] — self-describing entries (key, provider,
145
- * model, baseUrl, apiKey, maxOutput, maxContext)
146
- * - settings.providers[] — credential source for the wizard
147
- * - settings.model.* — legacy mirror of the active entry, kept in
148
- * sync so legacy boot paths (cli/main.ts,
149
- * repl.ts, run.ts) keep working without
150
- * each having to learn about activeKey
151
- *
152
- * Append-only: never removes existing entries. To start over use /logout.
153
- * Writes atomically via tmp+rename.
102
+ * 持久化 onboarding 结果到统一 catalog(credentials + modelConnections +
103
+ * defaults.text)。Append-only:相同 instanceId 跳过。defaults.text 设为 activeId。
104
+ * 原子写(tmp+rename)。(旧版写 legacy model.* / models / providers / activeKey,已删)
154
105
  */
155
106
  export declare function appendOnboardingResult(opts: {
156
- /** Alias key the engine should switch to after writing. Matches one of addedModels[].key. */
157
- activeKey: string;
158
- /** Active entry's fields, used to mirror into the legacy settings.model.* block. */
159
- activeMirror: {
160
- provider: string;
161
- model: string;
162
- apiKey: string;
163
- baseUrl: string;
164
- };
165
- addedProvider?: {
166
- key: string;
167
- label?: string;
107
+ /** 本次新增的模型实例(每个成为一个 modelConnection + credential)。 */
108
+ models: Array<{
109
+ instanceId: string;
168
110
  kind: string;
169
- baseUrl: string;
170
- apiKey?: string;
171
- protocol?: string;
172
- modelsPath?: string;
173
- };
174
- addedModels: Array<{
175
- key: string;
176
- label?: string;
177
- providerKey?: string;
178
- /** LLM client/protocol ("openai"/"anthropic"). New canonical name. */
179
- protocol?: string;
180
- /** Legacy mirror of `protocol`. Both are written so legacy readers keep working. */
181
- provider?: string;
182
111
  model: string;
183
- baseUrl: string;
184
112
  apiKey?: string;
185
- maxContextTokens?: number;
186
- maxOutputTokens?: number;
113
+ baseUrl?: string;
187
114
  }>;
115
+ /** 选中的活跃实例 id(写入 defaults.text)。 */
116
+ activeId: string;
117
+ tag?: "text" | "image" | "video";
188
118
  }): void;
189
119
  export declare function saveArenaSettingsByKeys(keys: string[]): void;
@@ -4,137 +4,19 @@
4
4
  * (see src/ui/components/OnboardingPrompt.tsx); this module only exposes
5
5
  * pure(-ish) helpers it consumes, so there's a single input stack.
6
6
  */
7
- import { mkdirSync, writeFileSync, readFileSync, existsSync, renameSync } from "node:fs";
7
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, renameSync, rmSync, chmodSync } from "node:fs";
8
8
  import { join } from "node:path";
9
- import { homedir } from "node:os";
9
+ import { userHome } from "./settings/manager.js";
10
10
  import { getOpenRouterModels } from "./data/openrouter-models.js";
11
+ import { KNOWN_MAX_OUTPUT, KNOWN_CONTEXT_WINDOWS, OPENROUTER_VENDORS, PROVIDERS, } from "./data/model-metadata.js";
12
+ // Re-exported so existing importers (and tests) can keep importing from
13
+ // onboarding; the catalog data itself now lives in data/model-metadata.json.
14
+ export { PROVIDERS };
11
15
  import { sanitizeApiKey } from "./llm/api-key-sanitize.js";
12
- export const PROVIDERS = [
13
- {
14
- id: "openrouter",
15
- name: "OpenRouter (推荐 — 支持所有模型)",
16
- envKey: "OPENROUTER_API_KEY",
17
- provider: "openai",
18
- baseUrl: "https://openrouter.ai/api/v1",
19
- keyUrl: "https://openrouter.ai/keys",
20
- keyPrefix: "sk-or-",
21
- // First entry is the zero-config default (auto-activated when the
22
- // user starts with only an env key, no onboarding). Sonnet beats Opus
23
- // here because it's ~5x cheaper and a safer pick for someone who
24
- // hasn't picked yet — Opus stays one slot away for anyone who wants it.
25
- models: [
26
- "anthropic/claude-sonnet-4.6",
27
- "anthropic/claude-opus-4.7",
28
- "anthropic/claude-haiku-4.5",
29
- "openai/gpt-5",
30
- "openai/gpt-5-mini",
31
- "openai/gpt-4o",
32
- "openai/o4-mini",
33
- "openai/o3",
34
- "google/gemini-2.5-pro",
35
- "google/gemini-2.5-flash",
36
- "deepseek/deepseek-chat",
37
- "deepseek/deepseek-reasoner",
38
- "qwen/qwen3-coder",
39
- "meta-llama/llama-4-maverick",
40
- ],
41
- },
42
- {
43
- id: "anthropic",
44
- name: "Anthropic (直连 Claude API)",
45
- envKey: "ANTHROPIC_API_KEY",
46
- provider: "anthropic",
47
- baseUrl: "https://api.anthropic.com",
48
- keyUrl: "https://console.anthropic.com/settings/keys",
49
- keyPrefix: "sk-ant-",
50
- models: [
51
- "claude-sonnet-4-6",
52
- "claude-opus-4-7",
53
- "claude-haiku-4-5",
54
- ],
55
- },
56
- {
57
- id: "openai",
58
- name: "OpenAI",
59
- envKey: "OPENAI_API_KEY",
60
- provider: "openai",
61
- baseUrl: "https://api.openai.com/v1",
62
- keyUrl: "https://platform.openai.com/api-keys",
63
- keyPrefix: "sk-",
64
- models: ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-4o", "o4-mini", "o3"],
65
- },
66
- {
67
- id: "deepseek",
68
- name: "DeepSeek (官方直连)",
69
- envKey: "DEEPSEEK_API_KEY",
70
- provider: "openai",
71
- baseUrl: "https://api.deepseek.com/v1",
72
- keyUrl: "https://platform.deepseek.com/api_keys",
73
- keyPrefix: "sk-",
74
- models: ["deepseek-v4-pro", "deepseek-v4-flash", "deepseek-chat"],
75
- },
76
- {
77
- id: "zai",
78
- name: "Z.AI (GLM 官方)",
79
- envKey: "ZAI_API_KEY",
80
- provider: "openai",
81
- baseUrl: "https://api.z.ai/api/paas/v4",
82
- keyUrl: "https://z.ai/manage-apikey/apikey-list",
83
- keyPrefix: "",
84
- models: ["glm-5.1", "glm-4.6", "glm-4.5-air"],
85
- },
86
- {
87
- id: "gemini",
88
- name: "Google Gemini (官方直连)",
89
- envKey: "GEMINI_API_KEY",
90
- provider: "openai",
91
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
92
- keyUrl: "https://aistudio.google.com/apikey",
93
- keyPrefix: "",
94
- models: [
95
- "gemini-2.5-pro",
96
- "gemini-2.5-flash",
97
- "gemini-2.0-flash",
98
- ],
99
- },
100
- {
101
- id: "ollama",
102
- name: "Ollama (本地,无需 Key)",
103
- envKey: "",
104
- provider: "openai",
105
- baseUrl: "http://localhost:11434/v1",
106
- keyUrl: "https://ollama.com/library",
107
- keyPrefix: "",
108
- models: ["llama3.1", "qwen2.5-coder", "deepseek-r1", "mistral", "gemma3"],
109
- noKey: true,
110
- },
111
- {
112
- id: "custom",
113
- name: "自定义 (任何 OpenAI 兼容 API)",
114
- envKey: "",
115
- provider: "openai",
116
- baseUrl: "",
117
- keyUrl: "",
118
- keyPrefix: "",
119
- models: [],
120
- },
121
- ];
16
+ import { getMergedCatalog } from "./model-catalog/index.js";
17
+ // ProviderDef 类型 + PROVIDERS 目录已外移到 data/model-metadata.json
18
+ // (loader: data/model-metadata.ts),并在文件顶部 re-export。core 只读目录数据。
122
19
  // ─── Dynamic model list (OpenRouter snapshot) ────────────────────
123
- /**
124
- * Curated vendors and how many of their newest models to surface in the
125
- * onboarding picker. Order matters — first vendors appear first.
126
- * Tweak this if a new vendor becomes worth exposing in the picker.
127
- */
128
- const OPENROUTER_VENDORS = [
129
- { prefix: "anthropic/", take: 4 },
130
- { prefix: "openai/", take: 5 },
131
- { prefix: "google/", take: 3 },
132
- { prefix: "deepseek/", take: 3 },
133
- { prefix: "x-ai/", take: 2 },
134
- { prefix: "qwen/", take: 2 },
135
- { prefix: "meta-llama/", take: 2 },
136
- { prefix: "mistralai/", take: 1 },
137
- ];
138
20
  /**
139
21
  * Build the OpenRouter model picker list from the bundled snapshot.
140
22
  * Filters out `:free`/preview variants for the default picker (still
@@ -226,9 +108,12 @@ export function detectProviderFromApiKey(apiKey, baseUrl) {
226
108
  // ─── API key validation ────────────────────────────────────────────
227
109
  export async function validateApiKey(baseUrl, apiKey) {
228
110
  try {
111
+ // 10s timeout so a hung/slow provider doesn't block the onboarding wizard
112
+ // until the OS socket timeout — AbortError is caught below → "let it pass".
229
113
  if (baseUrl.includes("openrouter")) {
230
114
  const res = await fetch("https://openrouter.ai/api/v1/auth/key", {
231
115
  headers: { Authorization: `Bearer ${apiKey}` },
116
+ signal: AbortSignal.timeout(10_000),
232
117
  });
233
118
  const data = await res.json();
234
119
  return !data.error;
@@ -236,6 +121,7 @@ export async function validateApiKey(baseUrl, apiKey) {
236
121
  const url = baseUrl.replace(/\/$/, "") + "/models";
237
122
  const res = await fetch(url, {
238
123
  headers: { Authorization: `Bearer ${apiKey}` },
124
+ signal: AbortSignal.timeout(10_000),
239
125
  });
240
126
  return res.status !== 401 && res.status !== 403;
241
127
  }
@@ -257,92 +143,31 @@ export function resolveApiKey(optionsApiKey, settingsApiKey) {
257
143
  if (!p.envKey)
258
144
  continue;
259
145
  const v = process.env[p.envKey];
260
- if (v && v.trim())
261
- return v.trim();
262
- }
263
- return undefined;
264
- }
265
- /**
266
- * Look up a previously-persisted API key for a given provider in
267
- * ~/.code-shell/settings.json. Matches by baseUrl (each ProviderDef.baseUrl
268
- * is unique, while `provider` is a generic kind like "openai" shared across
269
- * multiple endpoints).
270
- *
271
- * Returns the first match found in: settings.models[] (preferred — newer),
272
- * then settings.model (legacy top-level). undefined when nothing matches.
273
- */
274
- export function findSavedKeyForProvider(provider) {
275
- const file = join(homedir(), ".code-shell", "settings.json");
276
- if (!existsSync(file))
277
- return undefined;
278
- let data;
279
- try {
280
- data = JSON.parse(readFileSync(file, "utf-8"));
281
- }
282
- catch {
283
- return undefined;
284
- }
285
- if (Array.isArray(data?.models)) {
286
- for (const m of data.models) {
287
- if (m?.apiKey && m?.baseUrl === provider.baseUrl) {
288
- return { apiKey: String(m.apiKey), baseUrl: String(m.baseUrl) };
289
- }
290
- }
291
- }
292
- if (data?.model?.apiKey && data?.model?.baseUrl === provider.baseUrl) {
293
- return {
294
- apiKey: String(data.model.apiKey),
295
- baseUrl: String(data.model.baseUrl),
296
- };
146
+ if (!v)
147
+ continue;
148
+ // Same sanitization boundary as detectEnvKeys — env-sourced keys carry
149
+ // CRLF/BOM/zero-width/control chars; .trim() alone misses interior ones.
150
+ const cleaned = sanitizeApiKey(v).value;
151
+ if (cleaned)
152
+ return cleaned;
297
153
  }
298
154
  return undefined;
299
155
  }
300
- /**
301
- * Return the list of model IDs previously saved under this provider
302
- * (matched by baseUrl). Used by the onboarding wizard to pre-populate the
303
- * "model pool" step with the user's prior choices instead of resetting to
304
- * just the provider's first model.
305
- */
306
- export function loadSavedModelsForProvider(provider) {
307
- const file = join(homedir(), ".code-shell", "settings.json");
308
- if (!existsSync(file))
309
- return [];
310
- let data;
311
- try {
312
- data = JSON.parse(readFileSync(file, "utf-8"));
313
- }
314
- catch {
315
- return [];
316
- }
317
- if (!Array.isArray(data?.models))
318
- return [];
319
- const out = [];
320
- for (const m of data.models) {
321
- if (m?.baseUrl === provider.baseUrl && typeof m?.model === "string") {
322
- out.push(m.model);
323
- }
324
- }
325
- return out;
326
- }
327
156
  export function hasApiKey() {
328
157
  // Env variables alone are NOT enough to skip onboarding — they're surfaced
329
158
  // as a one-click option on the provider page instead. We only skip when the
330
- // user has explicitly persisted a config. Checks all three locations the
331
- // wizard might write to: top-level model.apiKey (legacy), models[].apiKey
332
- // (per-pool-entry), providers[].apiKey (per-provider what the current
333
- // ProviderModelFlow actually writes). Missing any one of these made
334
- // /logout look like a no-op when the others still held credentials.
159
+ // user has explicitly persisted a config. Unified catalog: a credential with
160
+ // an apiKey, or any configured modelConnection, counts as "set up". The
161
+ // legacy model.apiKey / models[] / providers[] locations were removed.
335
162
  // Reads ~/.code-shell/ only — ~/.claude/ compat was dropped because Claude
336
163
  // Code's settings schema diverges and merging broke boot.
337
- const p = join(homedir(), ".code-shell", "settings.json");
164
+ const p = join(userHome(), ".code-shell", "settings.json");
338
165
  if (existsSync(p)) {
339
166
  try {
340
167
  const data = JSON.parse(readFileSync(p, "utf-8"));
341
- if (data?.model?.apiKey)
342
- return true;
343
- if (Array.isArray(data?.models) && data.models.some((m) => m?.apiKey))
168
+ if (Array.isArray(data?.credentials) && data.credentials.some((c) => c?.apiKey))
344
169
  return true;
345
- if (Array.isArray(data?.providers) && data.providers.some((p) => p?.apiKey))
170
+ if (Array.isArray(data?.modelConnections) && data.modelConnections.length > 0)
346
171
  return true;
347
172
  }
348
173
  catch { /* ignore */ }
@@ -350,54 +175,8 @@ export function hasApiKey() {
350
175
  return false;
351
176
  }
352
177
  // ─── Model pool helpers ───────────────────────────────────────────
353
- /** Known max output tokens for common models. */
354
- const KNOWN_MAX_OUTPUT = {
355
- "anthropic/claude-opus-4.7": 32000,
356
- "anthropic/claude-opus-4-7": 32000,
357
- "claude-opus-4-7": 32000,
358
- "anthropic/claude-sonnet-4.6": 16000,
359
- "anthropic/claude-sonnet-4-6": 16000,
360
- "claude-sonnet-4-6": 16000,
361
- "anthropic/claude-haiku-4.5": 8192,
362
- "anthropic/claude-haiku-4-5": 8192,
363
- "claude-haiku-4-5": 8192,
364
- "openai/gpt-5": 32000,
365
- "openai/gpt-5-mini": 32000,
366
- "openai/gpt-5-nano": 16000,
367
- "gpt-5": 32000,
368
- "gpt-5-mini": 32000,
369
- "gpt-5-nano": 16000,
370
- "openai/gpt-4o": 16384,
371
- "gpt-4o": 16384,
372
- "openai/o4-mini": 100000,
373
- "o4-mini": 100000,
374
- "openai/o3": 100000,
375
- "o3": 100000,
376
- "google/gemini-2.5-pro": 65536,
377
- "google/gemini-2.5-flash": 65536,
378
- "gemini-2.5-pro": 65536,
379
- "gemini-2.5-flash": 65536,
380
- "gemini-2.0-flash": 8192,
381
- "deepseek/deepseek-v3.2": 8192,
382
- "deepseek/deepseek-r1": 8192,
383
- "deepseek-v4-flash": 8192,
384
- "deepseek-v4-pro": 65536,
385
- "deepseek-chat": 8192,
386
- "qwen/qwen3-coder": 16384,
387
- "meta-llama/llama-4-maverick": 32000,
388
- };
389
- /**
390
- * Known context window sizes for direct-provider models (not routed through OpenRouter).
391
- * These are the models whose IDs don't include a "vendor/" prefix.
392
- */
393
- const KNOWN_CONTEXT_WINDOWS = {
394
- "deepseek-v4-pro": 1_000_000,
395
- "deepseek-v4-flash": 1_000_000,
396
- "deepseek-chat": 1_000_000,
397
- "deepseek/deepseek-chat": 1_000_000,
398
- "deepseek/deepseek-v4-pro": 1_000_000,
399
- "deepseek/deepseek-v4-flash": 1_000_000,
400
- };
178
+ // KNOWN_MAX_OUTPUT / KNOWN_CONTEXT_WINDOWS now live in data/model-metadata.json
179
+ // (imported above) so they can be updated without a code change.
401
180
  /**
402
181
  * Resolve a model's max-output-token budget. Lookup order:
403
182
  * 1. KNOWN_MAX_OUTPUT (covers direct providers like Anthropic/DeepSeek
@@ -500,58 +279,23 @@ export function modelDisplayName(model) {
500
279
  return `Gemini ${parts.slice(1).join("-")}`;
501
280
  return base.charAt(0).toUpperCase() + base.slice(1);
502
281
  }
503
- export function saveSettings(result, providerDef, poolModels) {
504
- const dir = join(homedir(), ".code-shell");
505
- const file = join(dir, "settings.json");
506
- mkdirSync(dir, { recursive: true });
507
- let existing = {};
508
- if (existsSync(file)) {
509
- try {
510
- existing = JSON.parse(readFileSync(file, "utf-8"));
511
- }
512
- catch { }
513
- }
514
- const updated = {
515
- ...existing,
516
- model: {
517
- ...(typeof existing.model === "object" ? existing.model : {}),
518
- provider: result.provider,
519
- name: result.model,
520
- apiKey: result.apiKey,
521
- baseUrl: result.baseUrl,
522
- },
523
- };
524
- // Merge model pool: keep entries from other providers (matched by baseUrl)
525
- // and replace just the current provider's slice. A naive overwrite would
526
- // wipe out every other provider's models every time the wizard runs.
527
- if (providerDef && poolModels && poolModels.length > 0) {
528
- const newEntries = buildModelPool(providerDef, result.apiKey).filter((e) => new Set(poolModels).has(e.model));
529
- const existingModels = Array.isArray(existing.models)
530
- ? existing.models
531
- : [];
532
- const otherProvider = existingModels.filter((e) => e?.baseUrl !== providerDef.baseUrl);
533
- updated.models = [...otherProvider, ...newEntries];
534
- }
535
- writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", "utf-8");
282
+ /**
283
+ * Map a provider kind → catalogId. If a builtin (or user) TEXT catalog entry
284
+ * with id===kind exists, use it; otherwise fall back to the generic "custom"
285
+ * OpenAI-compatible entry. resolveInstance() returns null for an unknown
286
+ * catalogId, so every connection's catalogId MUST exist in the merged catalog.
287
+ */
288
+ function catalogIdForKind(kind) {
289
+ return getMergedCatalog().some((e) => e.id === kind && e.tag === "text") ? kind : "custom";
536
290
  }
537
291
  /**
538
- * Append-only persistence for the new ProviderModelFlow-based onboarding.
539
- *
540
- * Writes the new shape:
541
- * - settings.activeKey — primary source of truth for active model
542
- * - settings.models[] — self-describing entries (key, provider,
543
- * model, baseUrl, apiKey, maxOutput, maxContext)
544
- * - settings.providers[] — credential source for the wizard
545
- * - settings.model.* — legacy mirror of the active entry, kept in
546
- * sync so legacy boot paths (cli/main.ts,
547
- * repl.ts, run.ts) keep working without
548
- * each having to learn about activeKey
549
- *
550
- * Append-only: never removes existing entries. To start over use /logout.
551
- * Writes atomically via tmp+rename.
292
+ * 持久化 onboarding 结果到统一 catalog(credentials + modelConnections +
293
+ * defaults.text)。Append-only:相同 instanceId 跳过。defaults.text 设为 activeId。
294
+ * 原子写(tmp+rename)。(旧版写 legacy model.* / models / providers / activeKey,已删)
552
295
  */
553
296
  export function appendOnboardingResult(opts) {
554
- const dir = join(homedir(), ".code-shell");
297
+ const tag = opts.tag ?? "text";
298
+ const dir = join(userHome(), ".code-shell");
555
299
  const file = join(dir, "settings.json");
556
300
  mkdirSync(dir, { recursive: true });
557
301
  let existing = {};
@@ -559,56 +303,50 @@ export function appendOnboardingResult(opts) {
559
303
  try {
560
304
  existing = JSON.parse(readFileSync(file, "utf-8"));
561
305
  }
562
- catch {
563
- /* ignore — corrupt file is replaced */
564
- }
306
+ catch { /* corrupt → replace */ }
565
307
  }
566
- // Append provider (skip if key already present).
567
- const existingProviders = Array.isArray(existing.providers)
568
- ? existing.providers
569
- : [];
570
- let providersOut = existingProviders;
571
- if (opts.addedProvider) {
572
- const has = existingProviders.some((p) => p?.key === opts.addedProvider.key);
573
- if (!has)
574
- providersOut = [...existingProviders, opts.addedProvider];
308
+ const creds = Array.isArray(existing.credentials)
309
+ ? [...existing.credentials] : [];
310
+ const conns = Array.isArray(existing.modelConnections)
311
+ ? [...existing.modelConnections] : [];
312
+ for (const m of opts.models) {
313
+ const catalogId = catalogIdForKind(m.kind);
314
+ const credId = `${m.instanceId}-key`;
315
+ if (!creds.some((c) => c?.id === credId)) {
316
+ creds.push({ id: credId, catalogId, apiKey: m.apiKey, baseUrl: m.baseUrl });
317
+ }
318
+ if (!conns.some((c) => c?.id === m.instanceId)) {
319
+ conns.push({
320
+ id: m.instanceId, catalogId, tag, model: m.model, credentialId: credId,
321
+ ...(m.baseUrl ? { baseUrl: m.baseUrl } : {}),
322
+ });
323
+ }
575
324
  }
576
- // Append models (skip entries whose key already exists — the wizard
577
- // already derives unique keys via deriveModelPoolKey, so a collision
578
- // means the user re-added the exact same alias and we leave the older
579
- // entry alone rather than silently overwriting credentials).
580
- const existingModels = Array.isArray(existing.models)
581
- ? existing.models
582
- : [];
583
- const existingKeys = new Set(existingModels.map((m) => m?.key));
584
- const modelsToAppend = opts.addedModels.filter((m) => !existingKeys.has(m.key));
325
+ const existingDefaults = (typeof existing.defaults === "object" && existing.defaults)
326
+ ? existing.defaults : {};
585
327
  const updated = {
586
328
  ...existing,
587
- activeKey: opts.activeKey,
588
- model: {
589
- ...(typeof existing.model === "object" && existing.model ? existing.model : {}),
590
- provider: opts.activeMirror.provider,
591
- name: opts.activeMirror.model,
592
- apiKey: opts.activeMirror.apiKey,
593
- baseUrl: opts.activeMirror.baseUrl,
594
- },
595
- providers: providersOut,
596
- models: [...existingModels, ...modelsToAppend],
329
+ credentials: creds,
330
+ modelConnections: conns,
331
+ defaults: { ...existingDefaults, [tag]: opts.activeId },
597
332
  };
598
333
  // Atomic write: tmp file in the same dir, then rename (atomic on POSIX).
334
+ // mode 0o600 — settings.json holds plaintext API keys, must be owner-only.
599
335
  const tmp = `${file}.${process.pid}.tmp`;
600
- writeFileSync(tmp, JSON.stringify(updated, null, 2) + "\n", "utf-8");
336
+ writeFileSync(tmp, JSON.stringify(updated, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
601
337
  try {
602
338
  renameSync(tmp, file);
603
339
  }
604
340
  catch {
605
- // Fallback: best-effort direct write if rename fails (e.g. cross-device).
606
- writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", "utf-8");
341
+ // Fallback: best-effort direct write if rename fails (e.g. cross-device),
342
+ // then remove the orphaned temp file the failed rename left behind.
343
+ writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
344
+ rmSync(tmp, { force: true });
607
345
  }
608
346
  }
609
347
  // saveArenaSettings removed — replaced by saveArenaSettingsByKeys
610
348
  export function saveArenaSettingsByKeys(keys) {
611
- const dir = join(homedir(), ".code-shell");
349
+ const dir = join(userHome(), ".code-shell");
612
350
  const file = join(dir, "settings.json");
613
351
  let existing = {};
614
352
  if (existsSync(file)) {
@@ -621,5 +359,9 @@ export function saveArenaSettingsByKeys(keys) {
621
359
  ...existing,
622
360
  arena: { participants: keys },
623
361
  };
624
- writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", "utf-8");
362
+ writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
363
+ try {
364
+ chmodSync(file, 0o600);
365
+ }
366
+ catch { /* best-effort */ }
625
367
  }