@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
@@ -2,6 +2,34 @@
2
2
  * Settings schema with Zod validation.
3
3
  */
4
4
  import { z } from "zod";
5
+ /**
6
+ * Tri-state project capability overlay. Lives in PROJECT settings only and
7
+ * layers over the global baseline (disabledSkills / disabledPlugins /
8
+ * mcpServers.<name>.enabled / disabledAgents). NOT a second denylist:
9
+ * - "on" → force enabled (even if globally disabled)
10
+ * - "off" → force disabled (even if globally enabled)
11
+ * - "inherit" → take the global baseline. We don't persist "inherit"; an
12
+ * absent key means inherit. See the project-scoped
13
+ * capabilities design (spec §4).
14
+ */
15
+ export const CapabilityOverrideSchema = z.enum(["inherit", "on", "off"]);
16
+ export const CapabilityOverridesSchema = z
17
+ .object({
18
+ skills: z.record(CapabilityOverrideSchema).optional(),
19
+ plugins: z.record(CapabilityOverrideSchema).optional(),
20
+ agents: z.record(CapabilityOverrideSchema).optional(),
21
+ mcp: z.record(CapabilityOverrideSchema).optional(),
22
+ builtin: z.record(CapabilityOverrideSchema).optional(),
23
+ /**
24
+ * Per-hook overlay for PLUGIN-provided hooks, keyed by
25
+ * `pluginHookKey()` (`<plugin>:<RawEvent>:<command>`). Finer-grained
26
+ * than `plugins` (which kills a whole plugin): "off" suppresses one
27
+ * hook for this project only. Only "off" is meaningful today — plugin
28
+ * hooks have no global disable list to force back "on" from.
29
+ */
30
+ pluginHooks: z.record(CapabilityOverrideSchema).optional(),
31
+ })
32
+ .optional();
5
33
  export const SettingsSchema = z
6
34
  .object({
7
35
  agent: z
@@ -12,16 +40,16 @@ export const SettingsSchema = z
12
40
  disabledBuiltinTools: z.array(z.string()).default([]),
13
41
  customSystemPrompt: z.string().optional(),
14
42
  appendSystemPrompt: z.string().optional(),
43
+ responseLanguage: z.string().optional(),
44
+ userProfile: z.string().optional(),
45
+ instructions: z
46
+ .object({
47
+ compatClaude: z.boolean().default(true),
48
+ compatCodex: z.boolean().default(true),
49
+ })
50
+ .optional(),
15
51
  })
16
52
  .default({}),
17
- /**
18
- * Primary source of truth for the active model is settings.activeKey
19
- * (points at models[].key). settings.model is a derived mirror of that
20
- * entry kept in sync for legacy boot paths (cli/main.ts, repl.ts, etc.)
21
- * which read provider/name/apiKey/baseUrl directly. Writers must update
22
- * both — appendOnboardingResult does this in one shot.
23
- */
24
- activeKey: z.string().optional(),
25
53
  /**
26
54
  * Toggle background auto-update. When true (default), code-shell checks
27
55
  * npm for newer versions and — if the npm global prefix is writable —
@@ -30,85 +58,115 @@ export const SettingsSchema = z
30
58
  * Can also be disabled via env var `DISABLE_AUTOUPDATER=1`.
31
59
  */
32
60
  autoUpdates: z.boolean().default(true),
33
- model: z
61
+ /**
62
+ * Image generation is a general capability, decoupled from LLM providers
63
+ * (TODO 7.1): a vendor may use different keys/endpoints/models for chat vs
64
+ * image, and image vendors (Gemini, and later 国内 模型) don't fit the LLM
65
+ * `providers[].kind` enum. `imageGen.providers[]` is the canonical config;
66
+ * each entry has a user-chosen `id` (selected via GenerateImage's
67
+ * `provider` arg) and a `kind` that picks the adapter. When `imageGen` is
68
+ * absent, resolution falls back to scanning LLM `providers[]` for an
69
+ * image-capable kind — so existing configs keep working with no migration.
70
+ */
71
+ imageGen: z
34
72
  .object({
35
- provider: z.string().default("openai"),
36
- name: z.string().default("anthropic/claude-opus-4-6"),
37
- apiKey: z.string().optional(),
38
- baseUrl: z.string().default("https://openrouter.ai/api/v1"),
39
- temperature: z.number().min(0).max(2).default(0.3),
40
- maxTokens: z.number().default(8192),
73
+ defaultProvider: z.string().optional(),
74
+ providers: z
75
+ .array(z.object({
76
+ /** User-chosen instance name; GenerateImage(provider) selects by this. */
77
+ id: z.string(),
78
+ /** Adapter selector — e.g. "openai", "google". */
79
+ kind: z.string(),
80
+ baseUrl: z.string(),
81
+ apiKey: z.string().optional(),
82
+ /** Default model for this instance when the call omits `model`. */
83
+ defaultModel: z.string().optional(),
84
+ /** Catalog template this instance was created from (for paramsDoc / displayName回显). */
85
+ catalogId: z.string().optional(),
86
+ /** Reuse another instance's key: id of the instance whose apiKey to use (when apiKey is empty). */
87
+ apiKeyRef: z.string().optional(),
88
+ }))
89
+ .default([]),
41
90
  })
42
- .default({}),
43
- providers: z
91
+ .optional(),
92
+ /**
93
+ * Video generation config (TODO 7.1) — same shape as imageGen, decoupled
94
+ * from LLM providers. `videoGen.providers[]` each carry an `id` (selected
95
+ * via GenerateVideo's `provider` arg) + a `kind` picking the adapter. With
96
+ * no real adapters wired yet, this is config-ready: a future getVideoProvider
97
+ * case lights it up. Falls back to scanning LLM providers[] when absent.
98
+ */
99
+ videoGen: z
100
+ .object({
101
+ defaultProvider: z.string().optional(),
102
+ providers: z
103
+ .array(z.object({
104
+ id: z.string(),
105
+ kind: z.string(),
106
+ baseUrl: z.string(),
107
+ apiKey: z.string().optional(),
108
+ defaultModel: z.string().optional(),
109
+ /** Catalog template this instance was created from (for paramsDoc / displayName回显). */
110
+ catalogId: z.string().optional(),
111
+ /** Reuse another instance's key: id of the instance whose apiKey to use (when apiKey is empty). */
112
+ apiKeyRef: z.string().optional(),
113
+ }))
114
+ .default([]),
115
+ })
116
+ .optional(),
117
+ /**
118
+ * Credentials — independent key entities (统一模型接入方案 §3.3). A key
119
+ * lives here, not inlined on a connection, so deleting a connection never
120
+ * loses a key and many connections share one key by referencing the same
121
+ * credential id (LiteLLM credential_list model).
122
+ */
123
+ credentials: z
44
124
  .array(z.object({
45
- key: z.string(),
46
- label: z.string().optional(),
47
- kind: z.enum([
48
- "openai",
49
- "anthropic",
50
- "deepseek",
51
- "zai",
52
- "xai",
53
- "mistral",
54
- "groq",
55
- "google",
56
- "openrouter",
57
- "ollama",
58
- "custom",
59
- ]),
60
- baseUrl: z.string(),
125
+ /** User-chosen unique credential name. */
126
+ id: z.string(),
127
+ /** Catalog template this credential is for (a key belongs to one provider). */
128
+ catalogId: z.string(),
61
129
  apiKey: z.string().optional(),
62
- protocol: z.enum(["openai-compat", "anthropic-style"]).optional(),
63
- modelsPath: z.string().optional(),
64
- /**
65
- * DeepSeek V4 thinking-mode default for this provider. "enabled"
66
- * matches endpoint default; "disabled" makes V4 calls run in
67
- * non-thinking mode (faster, cheaper). Ignored by every provider
68
- * other than DeepSeek V4. Per-call overrides still win.
69
- */
70
- thinking: z.enum(["enabled", "disabled"]).optional(),
130
+ baseUrl: z.string().optional(),
71
131
  }))
72
132
  .default([]),
73
- models: z
74
- .array(z
75
- .object({
76
- key: z.string(),
77
- label: z.string().optional(),
78
- providerKey: z.string().optional(),
133
+ /**
134
+ * Unified instance layer (统一模型接入方案, see
135
+ * docs/superpowers/specs/2026-06-15-unified-model-catalog-design.md §3.3).
136
+ * One store for text/image/video connections, each pointing at a catalog
137
+ * entry (catalogId), a credential (credentialId), its chosen model, and the
138
+ * param values the user picked. Replaces the legacy split of
139
+ * providers[]/models[]/imageGen/videoGen.
140
+ */
141
+ modelConnections: z
142
+ .array(z.object({
143
+ /** User-chosen unique instance name. */
144
+ id: z.string(),
145
+ /** Catalog template this instance was created from. */
146
+ catalogId: z.string(),
147
+ tag: z.enum(["text", "image", "video", "audio"]),
148
+ /** Selected modelId (from the entry's modelPresets). */
79
149
  model: z.string(),
80
- maxOutputTokens: z.number().optional(),
81
- maxContextTokens: z.number().optional(),
82
- /**
83
- * Which LLM client to use ("openai" or "anthropic"). New name —
84
- * the legacy field is `provider`, which we still accept and
85
- * fold into `protocol` below so old configs keep working.
86
- * NOT the brand/vendor — that's providerKey above.
87
- */
88
- protocol: z.string().optional(),
89
- provider: z.string().optional(),
150
+ /** Per-connection baseUrl override (else the credential's / catalog's). */
90
151
  baseUrl: z.string().optional(),
91
- apiKey: z.string().optional(),
92
- /**
93
- * Per-model thinking override. Wins over the provider-level
94
- * setting (settings.providers[].thinking). Use this when
95
- * different models under the same provider need different
96
- * defaults — e.g. DeepSeek V4 Pro off (faster) but V4 Flash on.
97
- */
98
- thinking: z.enum(["enabled", "disabled"]).optional(),
99
- })
100
- .transform((m) => {
101
- // Normalize: prefer `protocol`; fall back to legacy `provider`.
102
- // We keep `provider` populated as a mirror because engine code
103
- // and a few downstream readers still query it directly.
104
- const effective = m.protocol ?? m.provider;
105
- return {
106
- ...m,
107
- protocol: effective,
108
- provider: effective,
109
- };
152
+ /** Which credential supplies this connection's key. */
153
+ credentialId: z.string().optional(),
154
+ /** Values the user picked for the model's params, e.g. { reasoning: "high" }. */
155
+ paramValues: z.record(z.string(), z.unknown()).optional(),
110
156
  }))
111
157
  .default([]),
158
+ /** Default instance id per tag (replaces activeKey / defaultProvider). */
159
+ defaults: z
160
+ .object({
161
+ text: z.string().optional(),
162
+ image: z.string().optional(),
163
+ video: z.string().optional(),
164
+ /** Default speech-to-text (voice input) connection. */
165
+ audio: z.string().optional(),
166
+ /** Background-task model (replaces auxModelKey). */
167
+ auxText: z.string().optional(),
168
+ })
169
+ .default({}),
112
170
  permissions: z
113
171
  .object({
114
172
  defaultMode: z
@@ -127,8 +185,27 @@ export const SettingsSchema = z
127
185
  context: z
128
186
  .object({
129
187
  maxTokens: z.number().default(200_000),
130
- compactAtRatio: z.number().default(0.6),
131
- summarizeAtRatio: z.number().default(0.8),
188
+ // 压缩阈值(占上下文窗口的比例)。窗口越大可调越高:1M 窗口的模型
189
+ // 把 compactAtRatio 调到 0.95 能少浪费几十万 token。三档须满足
190
+ // floor < compact < summarize,否则运行时会 clamp 回安全顺序。
191
+ compactAtRatio: z
192
+ .number()
193
+ .min(0.1)
194
+ .max(0.98)
195
+ .default(0.85)
196
+ .describe("达到该比例开始压缩历史(先试摘要,再退化为窗口裁剪)。默认 0.85。"),
197
+ summarizeAtRatio: z
198
+ .number()
199
+ .min(0.1)
200
+ .max(0.99)
201
+ .default(0.92)
202
+ .describe("紧急阈值:到此比例做最激进的窗口压缩。须 ≥ compactAtRatio。默认 0.92。"),
203
+ microcompactFloorRatio: z
204
+ .number()
205
+ .min(0.1)
206
+ .max(0.95)
207
+ .default(0.7)
208
+ .describe("低于该比例不做 microcompact,保留早期工具输出、保住 prompt cache 前缀。默认 0.7。"),
132
209
  })
133
210
  .default({}),
134
211
  session: z
@@ -137,8 +214,31 @@ export const SettingsSchema = z
137
214
  maxHistory: z.number().default(100),
138
215
  })
139
216
  .default({}),
217
+ // The record key IS the server name at runtime (MCPManager.connectAll
218
+ // uses Object.entries keys; desktop's persist strips the `name` field and
219
+ // keys by it via stripNameFromServer). So `name` here is optional and
220
+ // backfilled from the key — a config keyed `{"23": {…}}` with no `name`
221
+ // field is valid, not a crash. The preprocess also tolerates a legacy
222
+ // array form (`[{name, …}]`) by re-keying it into a name → config record.
140
223
  mcpServers: z
141
- .record(z.object({
224
+ .preprocess((value) => {
225
+ const entries = Array.isArray(value)
226
+ ? value
227
+ .filter((v) => !!v && typeof v === "object")
228
+ .map((v, i) => [String(v.name ?? i), v])
229
+ : value && typeof value === "object"
230
+ ? Object.entries(value)
231
+ : [];
232
+ return Object.fromEntries(entries.map(([key, raw]) => [
233
+ key,
234
+ raw && typeof raw === "object"
235
+ ? { ...raw, name: raw.name ?? key }
236
+ : raw,
237
+ ]));
238
+ }, z.record(z.object({
239
+ // Always present here: the preprocess above backfills it from the
240
+ // record key, so a stored entry that omits `name` (the common
241
+ // desktop case, which strips it) still validates.
142
242
  name: z.string(),
143
243
  command: z.string().optional(),
144
244
  args: z.array(z.string()).optional(),
@@ -146,7 +246,34 @@ export const SettingsSchema = z
146
246
  url: z.string().optional(),
147
247
  transport: z.enum(["stdio", "sse", "streamable-http", "inprocess"]).optional(),
148
248
  headers: z.record(z.string()).optional(),
149
- }))
249
+ // Codex-style env-secret handling: store env-var NAMES, read the
250
+ // secret from process.env at connect time (never plaintext here).
251
+ envVars: z.array(z.string()).optional(), // (stdio) forward these env vars
252
+ bearerTokenEnvVar: z.string().optional(), // (HTTP) → Authorization: Bearer <env value>
253
+ envHeaders: z.record(z.string()).optional(), // (HTTP) header-name → env-var-name
254
+ credentialRef: z.string().optional(), // (HTTP) id of a stored credential → Bearer, resolved at connect time
255
+ // Codex-style on/off switch. Absent or true → connected; only
256
+ // literal false disables. Filtered in MCPManager.connectAll.
257
+ enabled: z.boolean().optional(),
258
+ })))
259
+ .default({}),
260
+ /**
261
+ * User supplements for PLUGIN-provided MCP servers, keyed by the server's
262
+ * `<plugin>:<server>` name. Layered onto the plugin config at merge time
263
+ * (mergePluginMcpServers). Only env/credential fields are accepted —
264
+ * command/args/url/transport are intentionally absent and `.strict()`
265
+ * rejects them, so a plugin update is never shadowed by a stale copy.
266
+ */
267
+ mcpServerOverrides: z
268
+ .record(z
269
+ .object({
270
+ env: z.record(z.string()).optional(),
271
+ envVars: z.array(z.string()).optional(),
272
+ credentialRef: z.string().optional(),
273
+ bearerTokenEnvVar: z.string().optional(),
274
+ envHeaders: z.record(z.string()).optional(),
275
+ })
276
+ .strict())
150
277
  .default({}),
151
278
  /**
152
279
  * Skill names hidden from the LLM. Names include the full
@@ -162,6 +289,46 @@ export const SettingsSchema = z
162
289
  * names (no colon suffix). See scanSkills(opts.disabledPlugins).
163
290
  */
164
291
  disabledPlugins: z.array(z.string()).default([]),
292
+ /**
293
+ * Sub-agent role names (the `name` in .code-shell/agents/*.md) to
294
+ * hide from the registry. A disabled role is filtered out at load
295
+ * so it never appears in registry.list()/get() — the Agent tool's
296
+ * agent_type list won't show it and the LLM can't pick it. Mirrors
297
+ * disabledSkills / disabledPlugins.
298
+ */
299
+ disabledAgents: z.array(z.string()).default([]),
300
+ /**
301
+ * Project-scoped tri-state capability overlay. Only meaningful in
302
+ * ${cwd}/.code-shell/settings.json; layered over the global baseline at
303
+ * capability-assembly time. Optional — absence === everything inherits.
304
+ */
305
+ capabilityOverrides: CapabilityOverridesSchema,
306
+ /**
307
+ * Feature flags overlay: a map of flag name → boolean that overrides the
308
+ * compiled-in defaults (see settings/feature-flags.ts FEATURE_FLAGS).
309
+ * Project settings override user settings via the normal merge, so a flag
310
+ * can be flipped per-workspace. Unknown flag names are tolerated (kept as
311
+ * data) for forward-compat; consumers only read known flags via
312
+ * isFeatureEnabled(). Passthrough record — values coerced to boolean.
313
+ */
314
+ featureFlags: z.record(z.string(), z.boolean()).default({}),
315
+ /**
316
+ * Cross-session memory knobs. Optional — absence keeps the built-in
317
+ * defaults (see services/extract-memories.ts). `maxCount` caps memories
318
+ * accepted per extraction pass; `maxAge`/`extractionModel` are reserved
319
+ * for the consolidation/extraction pipeline.
320
+ */
321
+ memories: z
322
+ .object({
323
+ maxCount: z.number().int().positive().optional(),
324
+ maxAge: z.number().int().positive().optional(),
325
+ extractionModel: z.string().optional(),
326
+ /** Master switch for end-of-session automatic memory extraction.
327
+ * Absent/true = extract (current behavior); false = skip extraction
328
+ * while keeping session summaries and Dream untouched. */
329
+ autoExtract: z.boolean().optional(),
330
+ })
331
+ .optional(),
165
332
  instructions: z
166
333
  .object({
167
334
  fileName: z.string().default("CODESHELL.md"),
@@ -204,6 +371,15 @@ export const SettingsSchema = z
204
371
  .record(z.enum(["serper", "tavily", "searxng"]), z.object({
205
372
  apiKey: z.string().optional(),
206
373
  baseUrl: z.string().optional(),
374
+ lastProbe: z
375
+ .object({
376
+ status: z.enum(["ok", "error", "unconfigured"]),
377
+ sampleTitles: z.array(z.string()).optional(),
378
+ errorMessage: z.string().optional(),
379
+ errorDetail: z.string().optional(),
380
+ lastProbedAt: z.string(),
381
+ })
382
+ .optional(),
207
383
  }))
208
384
  .optional(),
209
385
  })
@@ -213,6 +389,27 @@ export const SettingsSchema = z
213
389
  format: z.enum(["text", "json", "jsonl", "stream-json"]).default("text"),
214
390
  })
215
391
  .default({}),
392
+ /**
393
+ * Image attachment handling. Sub-fields:
394
+ * - detail: provider-agnostic image clarity. Drives the
395
+ * renderer-side downscale (low→~1024 / standard→~1568 /
396
+ * high→~2576 px long edge) so BOTH providers save tokens
397
+ * before send. Legacy "original" is migrated to "high".
398
+ * - mcpImageTokenBudget: per-turn cap on token cost of images
399
+ * returned by MCP tools. Codex doesn't enforce this; CC uses
400
+ * 25 000. Set to 0 to disable.
401
+ */
402
+ images: z
403
+ .object({
404
+ detail: z
405
+ .preprocess(
406
+ // Legacy migration: old settings stored "original"; map it to
407
+ // "high" so existing user.json doesn't fail validation on boot.
408
+ (v) => (v === "original" ? "high" : v), z.enum(["low", "standard", "high"]))
409
+ .optional(),
410
+ mcpImageTokenBudget: z.number().int().nonnegative().optional(),
411
+ })
412
+ .optional(),
216
413
  /**
217
414
  * OS-level sandbox for shell-tool execution. "auto" picks per platform:
218
415
  * Seatbelt on macOS, bubblewrap on Linux when installed, otherwise off.
@@ -227,6 +424,49 @@ export const SettingsSchema = z
227
424
  network: z.enum(["allow", "deny"]).optional(),
228
425
  })
229
426
  .optional(),
427
+ /**
428
+ * Top-level environment variables injected into tool subprocesses (the
429
+ * Bash tool, background shells). Mirrors Claude Code's `env` field: a
430
+ * KEY=VALUE map that can be set globally (~/.code-shell/settings.json) and
431
+ * overridden per-project (.code-shell/settings.json). The canonical home
432
+ * for API keys (e.g. OPENAI_API_KEY) that a skill's script reads — configure
433
+ * once globally and every project's skills can use it.
434
+ *
435
+ * Precedence when merged into the spawn env (lowest → highest):
436
+ * project localEnvironment.env → global env → project env
437
+ * None of these is filtered through the deny regex (see mergeShellEnv):
438
+ * they are values the user typed deliberately, a different trust class from
439
+ * the host process.env passthrough the deny machinery guards against.
440
+ */
441
+ env: z.record(z.string()).optional(),
442
+ /**
443
+ * Project-local environment profile. Mirrors Codex's local-environment
444
+ * shape at the settings layer: setup/cleanup scripts can be customized per
445
+ * platform, and env values are stored as KEY=VALUE pairs. Runtime wiring is
446
+ * intentionally separate from the MCP server env model above.
447
+ */
448
+ localEnvironment: z
449
+ .object({
450
+ name: z.string().optional(),
451
+ setupScripts: z
452
+ .object({
453
+ default: z.string().optional(),
454
+ macos: z.string().optional(),
455
+ linux: z.string().optional(),
456
+ windows: z.string().optional(),
457
+ })
458
+ .optional(),
459
+ cleanupScripts: z
460
+ .object({
461
+ default: z.string().optional(),
462
+ macos: z.string().optional(),
463
+ linux: z.string().optional(),
464
+ windows: z.string().optional(),
465
+ })
466
+ .optional(),
467
+ env: z.record(z.string()).optional(),
468
+ })
469
+ .optional(),
230
470
  /**
231
471
  * Shell-hook configuration. Each entry binds a HookEventName to a
232
472
  * shell command; the command receives ctx JSON on stdin and returns
@@ -244,8 +484,48 @@ export const SettingsSchema = z
244
484
  matcher: z.string().optional(),
245
485
  timeout_ms: z.number().int().positive().optional(),
246
486
  cwd: z.string().optional(),
487
+ /** Soft off-switch: the entry stays in the file (and the UI) but
488
+ * registerSettingsHooks skips it. Absent = enabled. */
489
+ disabled: z.boolean().optional(),
247
490
  }))
248
491
  .optional(),
492
+ /**
493
+ * External coding-agent orchestration (Claude Code / Codex CLI).
494
+ * Used by the Mobile Web Remote to launch managed jobs. dangerousArgs
495
+ * is config-provided (not hardcoded) so it tracks CLI flag changes;
496
+ * project-default dangerous mode only applies inside trustedWorkspaces.
497
+ */
498
+ externalAgents: z
499
+ .object({
500
+ claudeCode: z
501
+ .object({
502
+ command: z.string().optional(),
503
+ defaultMode: z.enum(["safe", "dangerous"]).optional(),
504
+ dangerousArgs: z.array(z.string()).optional(),
505
+ trustedWorkspaces: z.array(z.string()).optional(),
506
+ autoStartInTrustedWorkspaces: z.boolean().optional(),
507
+ })
508
+ .optional(),
509
+ codex: z
510
+ .object({
511
+ command: z.string().optional(),
512
+ args: z.array(z.string()).optional(),
513
+ })
514
+ .optional(),
515
+ })
516
+ .optional(),
517
+ /**
518
+ * Credential-use gate (凭证模块第二期). Controls whether the AI's
519
+ * `UseCredential` tool prompts before handing a stored credential to a
520
+ * command. `autoApprove: true` skips the prompt entirely (默认关 — every
521
+ * use asks, or is remembered for the session). See
522
+ * docs/superpowers/specs/2026-06-16-credential-use-gate-design.md §5.
523
+ */
524
+ credentialUse: z
525
+ .object({
526
+ autoApprove: z.boolean().optional(),
527
+ })
528
+ .optional(),
249
529
  })
250
530
  .passthrough();
251
531
  export function validateSettings(raw) {
@@ -33,6 +33,15 @@ export interface SkillDefinition {
33
33
  export interface ScanSkillsOptions {
34
34
  disabledSkills?: string[];
35
35
  disabledPlugins?: string[];
36
+ /**
37
+ * Hard skill isolation for sub-agents. When set, ONLY skills whose name is
38
+ * in this list survive — every other skill is dropped from the result
39
+ * regardless of the disabled lists. Undefined → no allowlist filtering
40
+ * (parent inherits the full pool). An empty array → no skills at all.
41
+ * Applied after the disabled-list filters, so a skill must be both allowed
42
+ * AND not disabled to appear.
43
+ */
44
+ skillAllowlist?: string[];
36
45
  }
37
46
  export declare function scanSkills(cwd: string, opts?: ScanSkillsOptions): SkillDefinition[];
38
47
  export declare function invalidateSkillCache(): void;
@@ -157,18 +157,46 @@ function installedPluginsMtime() {
157
157
  return "0";
158
158
  }
159
159
  }
160
- const memoized = memoize(scanOnce, (cwd) => `${cwd}\0${userHome()}\0${installedPluginsMtime()}`);
160
+ /**
161
+ * mtime of each local skills base dir (project + user). A directory's mtime
162
+ * changes when a child entry is added/removed, so installing a new skill into
163
+ * `<cwd>/.code-shell/skills` or `~/.code-shell/skills` busts the cache on the
164
+ * next scan — the just-installed skill becomes visible to the running session
165
+ * without a restart. (Editing an existing skill's *contents* does not bump the
166
+ * dir mtime; install paths additionally call invalidateSkillCache() to cover
167
+ * that, so this is the passive half of a two-part guard.)
168
+ */
169
+ function skillsDirsMtime(cwd) {
170
+ return bases(cwd)
171
+ .map((b) => {
172
+ try {
173
+ return statSync(b.dir).mtimeMs.toString();
174
+ }
175
+ catch {
176
+ return "0";
177
+ }
178
+ })
179
+ .join("|");
180
+ }
181
+ const memoized = memoize(scanOnce, (cwd) => `${cwd}\0${userHome()}\0${installedPluginsMtime()}\0${skillsDirsMtime(cwd)}`);
161
182
  export function scanSkills(cwd, opts) {
162
183
  const all = memoized(cwd);
163
184
  const disabledSkills = opts?.disabledSkills;
164
185
  const disabledPlugins = opts?.disabledPlugins;
186
+ const skillAllowlist = opts?.skillAllowlist;
165
187
  const hasSkillFilter = disabledSkills && disabledSkills.length > 0;
166
188
  const hasPluginFilter = disabledPlugins && disabledPlugins.length > 0;
167
- if (!hasSkillFilter && !hasPluginFilter)
189
+ // An allowlist of [] is meaningful (no skills at all), so check for
190
+ // presence with !== undefined, not truthiness/length.
191
+ const hasAllowlist = skillAllowlist !== undefined;
192
+ if (!hasSkillFilter && !hasPluginFilter && !hasAllowlist)
168
193
  return all;
169
194
  const skillSet = hasSkillFilter ? new Set(disabledSkills) : null;
170
195
  const pluginSet = hasPluginFilter ? new Set(disabledPlugins) : null;
196
+ const allowSet = hasAllowlist ? new Set(skillAllowlist) : null;
171
197
  return all.filter((s) => {
198
+ if (allowSet && !allowSet.has(s.name))
199
+ return false;
172
200
  if (skillSet && skillSet.has(s.name))
173
201
  return false;
174
202
  if (pluginSet) {
@@ -0,0 +1,31 @@
1
+ import type { TranscribeCreds } from "./transcribe.js";
2
+ export interface ResolvedTranscribeProvider {
3
+ creds: TranscribeCreds;
4
+ /** Model id to transcribe with (e.g. gpt-4o-transcribe). */
5
+ model: string;
6
+ }
7
+ export declare function resolveTranscribeProvider(cwd: string, prefer?: string): ResolvedTranscribeProvider | null;
8
+ /** Tool/UI-visibility guard: is voice input usable (some transcribe provider
9
+ * resolvable)? Lets the desktop disable/enable the mic button. */
10
+ export declare function isTranscribeAvailable(cwd: string): boolean;
11
+ /**
12
+ * A renderer-safe description of what voice input will ACTUALLY use right now —
13
+ * so the UI can show "currently using gpt-4o-transcribe, reusing your OpenAI key
14
+ * sk-…1234" instead of looking unconfigured when the fallback is silently in
15
+ * effect. The key is MASKED (never ship the full secret to the renderer for
16
+ * display). `source`:
17
+ * - "connection": an explicit audio modelConnection is configured
18
+ * - "fallback": no audio connection; reusing an OpenAI-family credential
19
+ * - "none": nothing usable — voice input unavailable
20
+ */
21
+ export interface TranscribeDescription {
22
+ source: "connection" | "fallback" | "none";
23
+ model?: string;
24
+ baseUrl?: string;
25
+ /** Masked key for display (e.g. "sk-123...cdef"). */
26
+ maskedKey?: string;
27
+ /** For "fallback": the credential id/catalog whose key is being reused. */
28
+ reusedCredentialId?: string;
29
+ reusedCredentialCatalogId?: string;
30
+ }
31
+ export declare function describeTranscribe(cwd: string): TranscribeDescription;