@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +21 -3
  3. package/dist/agent/agent-definition-registry.js +49 -18
  4. package/dist/agent/agent-definition.d.ts +32 -0
  5. package/dist/agent/agent-definition.js +49 -4
  6. package/dist/arena/arena.js +11 -12
  7. package/dist/arena/context/context-tools.js +47 -6
  8. package/dist/arena/context/within-root.d.ts +7 -0
  9. package/dist/arena/context/within-root.js +15 -0
  10. package/dist/arena/iterate/phases/argue.js +8 -2
  11. package/dist/arena/iterate/phases/revise.js +1 -1
  12. package/dist/arena/iterate/phases/tournament.js +3 -3
  13. package/dist/arena/ledger.js +9 -1
  14. package/dist/arena/phases/adjudication.js +1 -4
  15. package/dist/arena/phases/build-consensus.js +1 -4
  16. package/dist/arena/phases/cross-review.js +2 -8
  17. package/dist/arena/phases/debate-rounds.js +1 -4
  18. package/dist/arena/phases/participant-research.js +1 -4
  19. package/dist/arena/phases/planning-detail-expansion.js +8 -10
  20. package/dist/arena/planner.js +0 -1
  21. package/dist/arena/providers/docs.d.ts +1 -0
  22. package/dist/arena/providers/docs.js +5 -2
  23. package/dist/arena/providers/repo.d.ts +1 -0
  24. package/dist/arena/providers/repo.js +5 -2
  25. package/dist/arena/strategies/utils.d.ts +1 -4
  26. package/dist/arena/strategies/utils.js +7 -51
  27. package/dist/arena/transitions.d.ts +7 -2
  28. package/dist/arena/transitions.js +9 -4
  29. package/dist/arena/types.d.ts +8 -2
  30. package/dist/automation/cron-expr.d.ts +41 -0
  31. package/dist/automation/cron-expr.js +169 -0
  32. package/dist/automation/index.d.ts +41 -0
  33. package/dist/automation/index.js +39 -0
  34. package/dist/automation/runner.d.ts +84 -0
  35. package/dist/automation/runner.js +92 -0
  36. package/dist/automation/scheduler.d.ts +194 -0
  37. package/dist/automation/scheduler.js +623 -0
  38. package/dist/automation/store.d.ts +39 -0
  39. package/dist/automation/store.js +122 -0
  40. package/dist/automation/write-policy.d.ts +34 -0
  41. package/dist/automation/write-policy.js +113 -0
  42. package/dist/automation/write-run.d.ts +51 -0
  43. package/dist/automation/write-run.js +38 -0
  44. package/dist/capability-control/disabled-lists.d.ts +25 -0
  45. package/dist/capability-control/disabled-lists.js +57 -0
  46. package/dist/capability-control/index.d.ts +5 -0
  47. package/dist/capability-control/index.js +3 -0
  48. package/dist/capability-control/overlay.d.ts +64 -0
  49. package/dist/capability-control/overlay.js +116 -0
  50. package/dist/capability-control/project.d.ts +65 -0
  51. package/dist/capability-control/project.js +147 -0
  52. package/dist/capability-control/service.d.ts +70 -0
  53. package/dist/capability-control/service.js +147 -0
  54. package/dist/capability-control/types.d.ts +62 -0
  55. package/dist/capability-control/types.js +17 -0
  56. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  57. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  58. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  59. package/dist/cc-orchestrator/cc-capability.js +53 -0
  60. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  61. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  62. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  63. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  64. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  65. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  66. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  67. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  68. package/dist/cc-orchestrator/index.d.ts +8 -0
  69. package/dist/cc-orchestrator/index.js +8 -0
  70. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  71. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  72. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  73. package/dist/cc-orchestrator/session-discovery.js +125 -0
  74. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  75. package/dist/cc-orchestrator/session-history.js +67 -0
  76. package/dist/cli/agent-server-stdio.d.ts +26 -1
  77. package/dist/cli/agent-server-stdio.js +221 -28
  78. package/dist/cli/agent-server-tcp.d.ts +20 -0
  79. package/dist/cli/agent-server-tcp.js +134 -0
  80. package/dist/cli/graceful-shutdown.d.ts +27 -0
  81. package/dist/cli/graceful-shutdown.js +30 -0
  82. package/dist/context/compaction.d.ts +56 -0
  83. package/dist/context/compaction.js +209 -15
  84. package/dist/context/manager.d.ts +0 -20
  85. package/dist/context/manager.js +25 -41
  86. package/dist/cost-tracker.js +5 -61
  87. package/dist/credentials/cipher.d.ts +49 -0
  88. package/dist/credentials/cipher.js +45 -0
  89. package/dist/credentials/cookie-jar.d.ts +24 -0
  90. package/dist/credentials/cookie-jar.js +40 -0
  91. package/dist/credentials/index.d.ts +7 -0
  92. package/dist/credentials/index.js +5 -0
  93. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  94. package/dist/credentials/inject-credential-tool.js +130 -0
  95. package/dist/credentials/store.d.ts +72 -0
  96. package/dist/credentials/store.js +184 -0
  97. package/dist/credentials/types.d.ts +56 -0
  98. package/dist/credentials/use-credential-tool.d.ts +29 -0
  99. package/dist/credentials/use-credential-tool.js +205 -0
  100. package/dist/credentials/use-gate.d.ts +56 -0
  101. package/dist/credentials/use-gate.js +52 -0
  102. package/dist/cron/cron-runtime.d.ts +2 -0
  103. package/dist/cron/cron-runtime.js +2 -0
  104. package/dist/cron/cron-store.d.ts +2 -0
  105. package/dist/cron/cron-store.js +2 -0
  106. package/dist/cron/scheduler.d.ts +5 -32
  107. package/dist/cron/scheduler.js +5 -113
  108. package/dist/data/model-metadata.d.ts +77 -0
  109. package/dist/data/model-metadata.js +56 -0
  110. package/dist/data/model-metadata.json +216 -0
  111. package/dist/data/openrouter-models.d.ts +18 -7
  112. package/dist/data/openrouter-models.js +35 -8
  113. package/dist/data/openrouter-sync.js +1 -1
  114. package/dist/engine/aux-key.d.ts +10 -0
  115. package/dist/engine/aux-key.js +11 -0
  116. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  117. package/dist/engine/dynamic-tool-defs.js +36 -0
  118. package/dist/engine/engine.d.ts +431 -108
  119. package/dist/engine/engine.js +1630 -279
  120. package/dist/engine/friendly-error.d.ts +18 -0
  121. package/dist/engine/friendly-error.js +63 -0
  122. package/dist/engine/goal.d.ts +187 -0
  123. package/dist/engine/goal.js +196 -0
  124. package/dist/engine/image-compression.d.ts +81 -0
  125. package/dist/engine/image-compression.js +186 -0
  126. package/dist/engine/image-policy.d.ts +165 -0
  127. package/dist/engine/image-policy.js +189 -0
  128. package/dist/engine/model-connections-pool.d.ts +17 -0
  129. package/dist/engine/model-connections-pool.js +66 -0
  130. package/dist/engine/model-facade.d.ts +10 -0
  131. package/dist/engine/model-facade.js +25 -0
  132. package/dist/engine/patch-orphaned-tools.js +3 -0
  133. package/dist/engine/reactive-threshold.d.ts +13 -0
  134. package/dist/engine/reactive-threshold.js +17 -0
  135. package/dist/engine/resolve-llm-config.d.ts +16 -0
  136. package/dist/engine/resolve-llm-config.js +44 -0
  137. package/dist/engine/runtime.js +9 -1
  138. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  139. package/dist/engine/sandbox-cache-key.js +9 -0
  140. package/dist/engine/sandbox-config.d.ts +31 -0
  141. package/dist/engine/sandbox-config.js +38 -0
  142. package/dist/engine/session-title.d.ts +13 -0
  143. package/dist/engine/session-title.js +34 -0
  144. package/dist/engine/session-usage.d.ts +19 -0
  145. package/dist/engine/session-usage.js +25 -0
  146. package/dist/engine/steer-queue.d.ts +32 -0
  147. package/dist/engine/steer-queue.js +26 -0
  148. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  149. package/dist/engine/streaming-tool-queue.js +50 -10
  150. package/dist/engine/turn-loop.d.ts +94 -9
  151. package/dist/engine/turn-loop.js +775 -342
  152. package/dist/engine/types.d.ts +175 -0
  153. package/dist/engine/types.js +13 -0
  154. package/dist/external-agents/config.d.ts +2 -0
  155. package/dist/external-agents/config.js +15 -0
  156. package/dist/external-agents/types.d.ts +31 -0
  157. package/dist/external-agents/types.js +1 -0
  158. package/dist/git/parse-log.d.ts +13 -0
  159. package/dist/git/parse-log.js +21 -0
  160. package/dist/git/utils.d.ts +8 -6
  161. package/dist/git/utils.js +62 -26
  162. package/dist/git/worktree.d.ts +48 -0
  163. package/dist/git/worktree.js +111 -20
  164. package/dist/hooks/events.d.ts +23 -1
  165. package/dist/hooks/goal-stop-hook.d.ts +58 -0
  166. package/dist/hooks/goal-stop-hook.js +279 -0
  167. package/dist/hooks/hook-output.d.ts +33 -0
  168. package/dist/hooks/hook-output.js +79 -0
  169. package/dist/hooks/registry.d.ts +15 -0
  170. package/dist/hooks/registry.js +57 -1
  171. package/dist/hooks/shell-runner.d.ts +2 -0
  172. package/dist/hooks/shell-runner.js +48 -18
  173. package/dist/index.d.ts +79 -11
  174. package/dist/index.js +89 -6
  175. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  176. package/dist/llm/capabilities/param-specs.js +62 -0
  177. package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
  178. package/dist/llm/capabilities/reasoning-control.js +38 -0
  179. package/dist/llm/capabilities/rules.js +37 -3
  180. package/dist/llm/capabilities/types.d.ts +32 -2
  181. package/dist/llm/clamp-max-tokens.d.ts +11 -0
  182. package/dist/llm/clamp-max-tokens.js +17 -0
  183. package/dist/llm/client-base.d.ts +69 -5
  184. package/dist/llm/client-base.js +185 -25
  185. package/dist/llm/client-factory.d.ts +3 -3
  186. package/dist/llm/client-factory.js +2 -2
  187. package/dist/llm/model-cache.js +4 -2
  188. package/dist/llm/model-pool.d.ts +29 -11
  189. package/dist/llm/model-pool.js +36 -20
  190. package/dist/llm/provider-auth.d.ts +41 -0
  191. package/dist/llm/provider-auth.js +76 -0
  192. package/dist/llm/provider-catalog.d.ts +6 -2
  193. package/dist/llm/providers/anthropic.d.ts +32 -2
  194. package/dist/llm/providers/anthropic.js +207 -18
  195. package/dist/llm/providers/openai.d.ts +47 -2
  196. package/dist/llm/providers/openai.js +478 -71
  197. package/dist/llm/reasoning-setting.d.ts +51 -0
  198. package/dist/llm/reasoning-setting.js +40 -0
  199. package/dist/llm/stop-reason.d.ts +13 -0
  200. package/dist/llm/stop-reason.js +21 -0
  201. package/dist/llm/stream-watchdog.js +5 -1
  202. package/dist/llm/strip-vision.d.ts +32 -0
  203. package/dist/llm/strip-vision.js +94 -0
  204. package/dist/llm/token-counter.js +9 -2
  205. package/dist/llm/types.d.ts +9 -6
  206. package/dist/logging/logger.js +18 -4
  207. package/dist/logging/sanitize-messages.d.ts +10 -0
  208. package/dist/logging/sanitize-messages.js +112 -0
  209. package/dist/lsp/client.js +28 -8
  210. package/dist/lsp/manager.d.ts +1 -1
  211. package/dist/lsp/manager.js +42 -11
  212. package/dist/lsp/root-path.d.ts +9 -0
  213. package/dist/lsp/root-path.js +12 -0
  214. package/dist/model-catalog/builtin.d.ts +12 -0
  215. package/dist/model-catalog/builtin.js +407 -0
  216. package/dist/model-catalog/gen-connections.d.ts +20 -0
  217. package/dist/model-catalog/gen-connections.js +28 -0
  218. package/dist/model-catalog/index.d.ts +41 -0
  219. package/dist/model-catalog/index.js +90 -0
  220. package/dist/model-catalog/params.d.ts +20 -0
  221. package/dist/model-catalog/params.js +45 -0
  222. package/dist/model-catalog/resolve.d.ts +48 -0
  223. package/dist/model-catalog/resolve.js +33 -0
  224. package/dist/model-catalog/save-entry.d.ts +32 -0
  225. package/dist/model-catalog/save-entry.js +104 -0
  226. package/dist/model-catalog/types.d.ts +561 -0
  227. package/dist/model-catalog/types.js +93 -0
  228. package/dist/model-catalog/upsert.d.ts +9 -0
  229. package/dist/model-catalog/upsert.js +8 -0
  230. package/dist/onboarding.d.ts +12 -82
  231. package/dist/onboarding.js +75 -333
  232. package/dist/plugins/gitOps.d.ts +53 -0
  233. package/dist/plugins/gitOps.js +130 -5
  234. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  235. package/dist/plugins/installer/checkUpdate.js +32 -0
  236. package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
  237. package/dist/plugins/installer/codex/convertAgents.js +55 -0
  238. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  239. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  240. package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
  241. package/dist/plugins/installer/codex/convertMcp.js +85 -0
  242. package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
  243. package/dist/plugins/installer/codex/convertSkills.js +33 -0
  244. package/dist/plugins/installer/detectFormat.d.ts +2 -0
  245. package/dist/plugins/installer/detectFormat.js +6 -0
  246. package/dist/plugins/installer/install.d.ts +7 -0
  247. package/dist/plugins/installer/install.js +123 -0
  248. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  249. package/dist/plugins/installer/installFromArchive.js +134 -0
  250. package/dist/plugins/installer/installFromSource.d.ts +13 -0
  251. package/dist/plugins/installer/installFromSource.js +51 -0
  252. package/dist/plugins/installer/list.d.ts +9 -0
  253. package/dist/plugins/installer/list.js +30 -0
  254. package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
  255. package/dist/plugins/installer/loadPluginAgents.js +27 -0
  256. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  257. package/dist/plugins/installer/loadPluginMcp.js +107 -0
  258. package/dist/plugins/installer/parseSource.d.ts +20 -0
  259. package/dist/plugins/installer/parseSource.js +74 -0
  260. package/dist/plugins/installer/paths.d.ts +5 -0
  261. package/dist/plugins/installer/paths.js +25 -0
  262. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  263. package/dist/plugins/installer/pruneDisabled.js +73 -0
  264. package/dist/plugins/installer/types.d.ts +52 -0
  265. package/dist/plugins/installer/types.js +28 -0
  266. package/dist/plugins/installer/uninstall.d.ts +2 -0
  267. package/dist/plugins/installer/uninstall.js +18 -0
  268. package/dist/plugins/installer/unzip.d.ts +14 -0
  269. package/dist/plugins/installer/unzip.js +82 -0
  270. package/dist/plugins/installer/update.d.ts +28 -0
  271. package/dist/plugins/installer/update.js +97 -0
  272. package/dist/plugins/loadPluginHooks.d.ts +54 -1
  273. package/dist/plugins/loadPluginHooks.js +83 -1
  274. package/dist/plugins/marketplaceManager.d.ts +15 -1
  275. package/dist/plugins/marketplaceManager.js +58 -4
  276. package/dist/plugins/pluginCommandHook.js +34 -14
  277. package/dist/plugins/pluginContent.d.ts +30 -0
  278. package/dist/plugins/pluginContent.js +83 -0
  279. package/dist/plugins/pluginInstaller.d.ts +34 -0
  280. package/dist/plugins/pluginInstaller.js +168 -35
  281. package/dist/plugins/schemas.js +41 -6
  282. package/dist/plugins/types.d.ts +10 -0
  283. package/dist/preset/index.d.ts +7 -1
  284. package/dist/preset/index.js +112 -6
  285. package/dist/product/types.d.ts +1 -1
  286. package/dist/prompt/composer.d.ts +31 -0
  287. package/dist/prompt/composer.js +95 -25
  288. package/dist/prompt/instruction-scanner.js +5 -3
  289. package/dist/prompt/section-loader.js +1 -0
  290. package/dist/prompt/sections/base.md +1 -0
  291. package/dist/prompt/sections/browser.md +10 -0
  292. package/dist/prompt/sections/coding.md +4 -0
  293. package/dist/prompt/sections/orchestration.md +8 -0
  294. package/dist/protocol/chat-session-manager.d.ts +15 -2
  295. package/dist/protocol/chat-session-manager.js +46 -0
  296. package/dist/protocol/chat-session.d.ts +82 -0
  297. package/dist/protocol/chat-session.js +121 -1
  298. package/dist/protocol/client.d.ts +27 -0
  299. package/dist/protocol/client.js +38 -0
  300. package/dist/protocol/redact.d.ts +50 -0
  301. package/dist/protocol/redact.js +71 -0
  302. package/dist/protocol/server.d.ts +153 -2
  303. package/dist/protocol/server.js +807 -39
  304. package/dist/protocol/tcp-transport.d.ts +45 -0
  305. package/dist/protocol/tcp-transport.js +74 -0
  306. package/dist/protocol/transport.js +3 -2
  307. package/dist/protocol/types.d.ts +69 -0
  308. package/dist/protocol/types.js +22 -0
  309. package/dist/quota/credentials.d.ts +3 -0
  310. package/dist/quota/credentials.js +80 -0
  311. package/dist/quota/index.d.ts +36 -0
  312. package/dist/quota/index.js +155 -0
  313. package/dist/quota/types.d.ts +48 -0
  314. package/dist/quota/types.js +13 -0
  315. package/dist/remote/bridge.d.ts +11 -2
  316. package/dist/remote/bridge.js +61 -33
  317. package/dist/review/review-prompt.d.ts +28 -0
  318. package/dist/review/review-prompt.js +81 -0
  319. package/dist/run/ArtifactTracker.js +5 -4
  320. package/dist/run/EngineRunner.d.ts +27 -1
  321. package/dist/run/EngineRunner.js +46 -8
  322. package/dist/run/FileRunStore.js +40 -11
  323. package/dist/run/RunApprovalBackend.js +25 -5
  324. package/dist/run/RunLock.d.ts +28 -2
  325. package/dist/run/RunLock.js +49 -7
  326. package/dist/run/RunManager.d.ts +12 -0
  327. package/dist/run/RunManager.js +86 -3
  328. package/dist/run/RunQueue.d.ts +1 -0
  329. package/dist/run/RunQueue.js +8 -2
  330. package/dist/run/factory.d.ts +8 -1
  331. package/dist/run/factory.js +1 -0
  332. package/dist/run/index.d.ts +2 -2
  333. package/dist/run/index.js +1 -1
  334. package/dist/run/redirect-target.d.ts +7 -0
  335. package/dist/run/redirect-target.js +13 -0
  336. package/dist/run/types.js +1 -1
  337. package/dist/runtime/background-shell.d.ts +139 -0
  338. package/dist/runtime/background-shell.js +495 -0
  339. package/dist/runtime/output-clean.d.ts +24 -0
  340. package/dist/runtime/output-clean.js +41 -0
  341. package/dist/runtime/ring-file.d.ts +64 -0
  342. package/dist/runtime/ring-file.js +174 -0
  343. package/dist/runtime/safe-spawn.js +15 -34
  344. package/dist/runtime/spawn-common.d.ts +148 -0
  345. package/dist/runtime/spawn-common.js +303 -0
  346. package/dist/runtime/truncate-output.d.ts +22 -0
  347. package/dist/runtime/truncate-output.js +49 -0
  348. package/dist/runtime/utf8-cut.d.ts +11 -0
  349. package/dist/runtime/utf8-cut.js +23 -0
  350. package/dist/services/auto-dream.d.ts +4 -0
  351. package/dist/services/auto-dream.js +26 -26
  352. package/dist/services/browser-open.d.ts +13 -0
  353. package/dist/services/browser-open.js +16 -0
  354. package/dist/services/diagnostics.d.ts +1 -2
  355. package/dist/services/diagnostics.js +12 -7
  356. package/dist/services/dream-consolidation.d.ts +57 -0
  357. package/dist/services/dream-consolidation.js +151 -0
  358. package/dist/services/extract-memories.d.ts +14 -1
  359. package/dist/services/extract-memories.js +45 -6
  360. package/dist/services/memory-orchestrator.d.ts +21 -0
  361. package/dist/services/memory-orchestrator.js +125 -32
  362. package/dist/services/notifier.d.ts +8 -0
  363. package/dist/services/notifier.js +39 -25
  364. package/dist/services/oauth.js +5 -7
  365. package/dist/services/session-memory-sort.d.ts +8 -0
  366. package/dist/services/session-memory-sort.js +9 -0
  367. package/dist/services/session-memory.js +30 -19
  368. package/dist/session/file-history.d.ts +124 -1
  369. package/dist/session/file-history.js +232 -9
  370. package/dist/session/memory.d.ts +116 -2
  371. package/dist/session/memory.js +250 -28
  372. package/dist/session/session-manager.d.ts +63 -1
  373. package/dist/session/session-manager.js +186 -5
  374. package/dist/session/simple-diff.d.ts +23 -0
  375. package/dist/session/simple-diff.js +84 -0
  376. package/dist/session/transcript.d.ts +25 -1
  377. package/dist/session/transcript.js +35 -2
  378. package/dist/session/undo-target.d.ts +67 -0
  379. package/dist/session/undo-target.js +144 -0
  380. package/dist/settings/disk-defaults.d.ts +42 -0
  381. package/dist/settings/disk-defaults.js +33 -0
  382. package/dist/settings/feature-flags.d.ts +64 -0
  383. package/dist/settings/feature-flags.js +61 -0
  384. package/dist/settings/manager.d.ts +101 -1
  385. package/dist/settings/manager.js +345 -15
  386. package/dist/settings/migrate-config.d.ts +45 -0
  387. package/dist/settings/migrate-config.js +125 -0
  388. package/dist/settings/personalization.d.ts +19 -0
  389. package/dist/settings/personalization.js +7 -0
  390. package/dist/settings/schema-export.d.ts +25 -0
  391. package/dist/settings/schema-export.js +38 -0
  392. package/dist/settings/schema.d.ts +1827 -396
  393. package/dist/settings/schema.js +361 -81
  394. package/dist/skills/scanner.d.ts +9 -0
  395. package/dist/skills/scanner.js +30 -2
  396. package/dist/stt/resolve-transcribe.d.ts +31 -0
  397. package/dist/stt/resolve-transcribe.js +108 -0
  398. package/dist/stt/transcribe.d.ts +51 -0
  399. package/dist/stt/transcribe.js +65 -0
  400. package/dist/tool-system/browser-bridge.d.ts +226 -0
  401. package/dist/tool-system/browser-bridge.js +163 -0
  402. package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
  403. package/dist/tool-system/builtin/add-marketplace.js +76 -0
  404. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  405. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  406. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  407. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  408. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  409. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  410. package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
  411. package/dist/tool-system/builtin/agent-registry.js +16 -4
  412. package/dist/tool-system/builtin/agent.d.ts +50 -11
  413. package/dist/tool-system/builtin/agent.js +576 -73
  414. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  415. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  416. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  417. package/dist/tool-system/builtin/apply-patch/index.js +7 -3
  418. package/dist/tool-system/builtin/arena.js +6 -7
  419. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  420. package/dist/tool-system/builtin/background-jobs.js +124 -0
  421. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  422. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  423. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  424. package/dist/tool-system/builtin/background-work.js +86 -0
  425. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  426. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  427. package/dist/tool-system/builtin/bash.d.ts +5 -2
  428. package/dist/tool-system/builtin/bash.js +98 -62
  429. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  430. package/dist/tool-system/builtin/browser-tools.js +312 -0
  431. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  432. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  433. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  434. package/dist/tool-system/builtin/check-quota.js +34 -0
  435. package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
  436. package/dist/tool-system/builtin/complete-goal.js +45 -0
  437. package/dist/tool-system/builtin/config.js +7 -0
  438. package/dist/tool-system/builtin/cron.d.ts +7 -0
  439. package/dist/tool-system/builtin/cron.js +105 -9
  440. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  441. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  442. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  443. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  444. package/dist/tool-system/builtin/edit.d.ts +2 -1
  445. package/dist/tool-system/builtin/edit.js +21 -12
  446. package/dist/tool-system/builtin/eol.d.ts +29 -0
  447. package/dist/tool-system/builtin/eol.js +37 -0
  448. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  449. package/dist/tool-system/builtin/file-cache.js +8 -0
  450. package/dist/tool-system/builtin/generate-image.d.ts +60 -0
  451. package/dist/tool-system/builtin/generate-image.js +374 -0
  452. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  453. package/dist/tool-system/builtin/generate-video.js +361 -0
  454. package/dist/tool-system/builtin/grep.js +6 -2
  455. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  456. package/dist/tool-system/builtin/image-providers.js +190 -0
  457. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  458. package/dist/tool-system/builtin/image-uploader.js +74 -0
  459. package/dist/tool-system/builtin/index.d.ts +24 -1
  460. package/dist/tool-system/builtin/index.js +310 -25
  461. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  462. package/dist/tool-system/builtin/memory.js +45 -7
  463. package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
  464. package/dist/tool-system/builtin/notebook-edit.js +1 -1
  465. package/dist/tool-system/builtin/powershell.js +4 -1
  466. package/dist/tool-system/builtin/read.d.ts +2 -1
  467. package/dist/tool-system/builtin/read.js +11 -3
  468. package/dist/tool-system/builtin/repl.js +4 -1
  469. package/dist/tool-system/builtin/skill.js +9 -0
  470. package/dist/tool-system/builtin/sleep.js +12 -5
  471. package/dist/tool-system/builtin/task.js +4 -1
  472. package/dist/tool-system/builtin/tool-search.js +25 -7
  473. package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
  474. package/dist/tool-system/builtin/update-automation-memory.js +60 -0
  475. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  476. package/dist/tool-system/builtin/video-providers.js +235 -0
  477. package/dist/tool-system/builtin/view-image.d.ts +18 -0
  478. package/dist/tool-system/builtin/view-image.js +96 -0
  479. package/dist/tool-system/builtin/web-fetch.js +12 -2
  480. package/dist/tool-system/builtin/web-search.d.ts +4 -1
  481. package/dist/tool-system/builtin/web-search.js +57 -10
  482. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  483. package/dist/tool-system/builtin/worktree.js +31 -4
  484. package/dist/tool-system/builtin/write.d.ts +2 -1
  485. package/dist/tool-system/builtin/write.js +1 -1
  486. package/dist/tool-system/context.d.ts +166 -6
  487. package/dist/tool-system/executor.d.ts +3 -2
  488. package/dist/tool-system/executor.js +197 -119
  489. package/dist/tool-system/investigation-guard.d.ts +4 -1
  490. package/dist/tool-system/investigation-guard.js +20 -4
  491. package/dist/tool-system/mcp-manager.d.ts +78 -16
  492. package/dist/tool-system/mcp-manager.js +357 -28
  493. package/dist/tool-system/path-policy.d.ts +99 -0
  494. package/dist/tool-system/path-policy.js +578 -0
  495. package/dist/tool-system/permission.d.ts +36 -1
  496. package/dist/tool-system/permission.js +322 -117
  497. package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
  498. package/dist/tool-system/plan-mode-allowlist.js +65 -0
  499. package/dist/tool-system/registry.d.ts +1 -0
  500. package/dist/tool-system/registry.js +26 -1
  501. package/dist/tool-system/sandbox/index.d.ts +8 -0
  502. package/dist/tool-system/sandbox/index.js +7 -2
  503. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  504. package/dist/tool-system/validate-tool-metadata.js +63 -0
  505. package/dist/tool-system/validation.d.ts +10 -0
  506. package/dist/tool-system/validation.js +16 -3
  507. package/dist/types.d.ts +301 -15
  508. package/dist/updater.js +20 -9
  509. package/dist/utils/envUtils.d.ts +0 -9
  510. package/dist/utils/envUtils.js +3 -28
  511. package/dist/utils/exec.d.ts +40 -0
  512. package/dist/utils/exec.js +144 -0
  513. package/dist/utils/format.js +4 -2
  514. package/dist/utils/json.d.ts +12 -0
  515. package/dist/utils/json.js +92 -0
  516. package/dist/utils/lockfile.js +9 -2
  517. package/dist/utils/theme.d.ts +7 -1
  518. package/dist/utils/theme.js +5 -3
  519. package/dist/utils/toolDisplay.js +0 -1
  520. package/package.json +14 -7
  521. package/dist/agent/coordinator.d.ts +0 -49
  522. package/dist/agent/coordinator.js +0 -77
  523. package/dist/settings/manager.test.js +0 -73
  524. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  525. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  526. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  527. package/dist/tool-system/builtin/send-message.js +0 -47
  528. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Built-in GenerateImage tool — text-to-image via the OpenAI Images API
3
+ * (`gpt-image-2`).
4
+ *
5
+ * Credentials come from config, not env: the tool finds the `kind: "openai"`
6
+ * entry in `settings.providers[]` and uses its `apiKey` + `baseUrl`. No
7
+ * `OPENAI_API_KEY` required, no new config — an existing OpenAI provider is
8
+ * reused as-is.
9
+ *
10
+ * The generated PNG is decoded from the API's base64 payload and written to
11
+ * `<cwd>/.code-shell/generated_images/<timestamp>.png`; the tool returns the
12
+ * absolute path so the model can Read or reference it on later turns. This
13
+ * mirrors codex's imagegen CLI fallback (`scripts/image_gen.py`): call API →
14
+ * take b64_json → decode → write → report path.
15
+ *
16
+ * Scope is deliberately narrow (text-to-image only). Edit/mask/transparent/
17
+ * batch are out of scope — see the design doc.
18
+ *
19
+ * Uses the native `fetch` (codeshell does not depend on the `openai` SDK).
20
+ */
21
+ import type { ToolDefinition } from "../../types.js";
22
+ import type { ToolContext } from "../context.js";
23
+ /** A configured imageGen/videoGen instance (subset used here). */
24
+ interface GenInstance {
25
+ id: string;
26
+ kind: string;
27
+ baseUrl: string;
28
+ apiKey?: string;
29
+ defaultModel?: string;
30
+ catalogId?: string;
31
+ apiKeyRef?: string;
32
+ }
33
+ /**
34
+ * Effective key for an instance: its own `apiKey`, or — when empty and
35
+ * `apiKeyRef` is set — the key of the referenced instance in the same list
36
+ * (reuse-key feature). Returns undefined when neither yields a key.
37
+ */
38
+ export declare function effectiveApiKey(inst: GenInstance, list: GenInstance[]): string | undefined;
39
+ export declare const generateImageToolDef: ToolDefinition;
40
+ /**
41
+ * List the configured, usable image providers for a workspace (TODO 7.1) —
42
+ * either `imageGen.providers[]` ids+kinds, or the back-compat LLM-provider
43
+ * kinds. Used to build a dynamic tool description so the model sees which
44
+ * backends are actually available. Returns [] on any read error.
45
+ */
46
+ export declare function listConfiguredImageProviders(cwd?: string): Array<{
47
+ id?: string;
48
+ kind: string;
49
+ catalogId?: string;
50
+ }>;
51
+ /**
52
+ * Build the GenerateImage tool description for a workspace, appending the
53
+ * configured providers so the model knows what's available and which `provider`
54
+ * values are valid (TODO 7.1). Falls back to the static description when none
55
+ * are configured (the guard hides the tool in that case anyway).
56
+ */
57
+ export declare function generateImageToolDefFor(cwd: string): ToolDefinition;
58
+ export declare function isGenerateImageAvailable(cwd?: string, nowMs?: number): boolean;
59
+ export declare function generateImageTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
60
+ export {};
@@ -0,0 +1,374 @@
1
+ /**
2
+ * Built-in GenerateImage tool — text-to-image via the OpenAI Images API
3
+ * (`gpt-image-2`).
4
+ *
5
+ * Credentials come from config, not env: the tool finds the `kind: "openai"`
6
+ * entry in `settings.providers[]` and uses its `apiKey` + `baseUrl`. No
7
+ * `OPENAI_API_KEY` required, no new config — an existing OpenAI provider is
8
+ * reused as-is.
9
+ *
10
+ * The generated PNG is decoded from the API's base64 payload and written to
11
+ * `<cwd>/.code-shell/generated_images/<timestamp>.png`; the tool returns the
12
+ * absolute path so the model can Read or reference it on later turns. This
13
+ * mirrors codex's imagegen CLI fallback (`scripts/image_gen.py`): call API →
14
+ * take b64_json → decode → write → report path.
15
+ *
16
+ * Scope is deliberately narrow (text-to-image only). Edit/mask/transparent/
17
+ * batch are out of scope — see the design doc.
18
+ *
19
+ * Uses the native `fetch` (codeshell does not depend on the `openai` SDK).
20
+ */
21
+ import { writeFile, mkdir, readFile } from "node:fs/promises";
22
+ import { join, isAbsolute, resolve as resolvePath, basename, extname } from "node:path";
23
+ import { randomBytes } from "node:crypto";
24
+ import { SettingsManager } from "../../settings/manager.js";
25
+ import { getImageProvider, DEFAULT_IMAGE_MODEL, } from "./image-providers.js";
26
+ import { getMergedCatalog, findCatalogEntry } from "../../model-catalog/index.js";
27
+ import { genInstancesFromConnections } from "../../model-catalog/gen-connections.js";
28
+ /**
29
+ * Effective key for an instance: its own `apiKey`, or — when empty and
30
+ * `apiKeyRef` is set — the key of the referenced instance in the same list
31
+ * (reuse-key feature). Returns undefined when neither yields a key.
32
+ */
33
+ export function effectiveApiKey(inst, list) {
34
+ if (inst.apiKey)
35
+ return inst.apiKey;
36
+ if (inst.apiKeyRef) {
37
+ const ref = list.find((p) => p.id === inst.apiKeyRef);
38
+ if (ref?.apiKey)
39
+ return ref.apiKey;
40
+ }
41
+ return undefined;
42
+ }
43
+ /**
44
+ * Resolve a ResolvedImageProvider from a candidate list whose entries already
45
+ * carry a direct `apiKey` (the unified store dereferences credentials upfront).
46
+ * `prefer` selects by id (explicit → no silent fallback); else `def` then the
47
+ * first usable. Shared by the unified-store path.
48
+ */
49
+ function resolveFromGenList(list, prefer, def) {
50
+ const usable = (p) => !!p.apiKey && getImageProvider(p.kind) !== null;
51
+ const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: p.apiKey });
52
+ if (prefer) {
53
+ const chosen = list.find((p) => p.id === prefer);
54
+ if (chosen && usable(chosen))
55
+ return { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel };
56
+ return null;
57
+ }
58
+ const preferred = def ? list.find((p) => p.id === def) : undefined;
59
+ const chosen = (preferred && usable(preferred) ? preferred : undefined) ?? list.find(usable);
60
+ return chosen ? { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel } : null;
61
+ }
62
+ const DEFAULT_SIZE = "1024x1024";
63
+ const DEFAULT_QUALITY = "auto";
64
+ /** Provider `kind`s that have an image adapter, in resolution preference. */
65
+ const IMAGE_PROVIDER_KINDS = ["openai", "google"];
66
+ export const generateImageToolDef = {
67
+ name: "GenerateImage",
68
+ description: "Generate an image from a text prompt, or edit/re-imagine existing image(s) by passing " +
69
+ "`referenceImages` (image-to-image). Saves a PNG into the workspace and returns its " +
70
+ "absolute path; read or reference that path on later turns. Defaults to the OpenAI Images " +
71
+ "API (gpt-image-2); requires a matching provider configured in settings. " +
72
+ "For raster assets (photos, illustrations, mockups, textures) — not for " +
73
+ "SVG/vector icons or anything better built directly in code.",
74
+ inputSchema: {
75
+ type: "object",
76
+ properties: {
77
+ prompt: {
78
+ type: "string",
79
+ description: "Description of the image to generate",
80
+ },
81
+ size: {
82
+ type: "string",
83
+ enum: ["1024x1024", "1536x1024", "1024x1536", "auto"],
84
+ description: "Image dimensions (default 1024x1024)",
85
+ },
86
+ quality: {
87
+ type: "string",
88
+ enum: ["low", "medium", "high", "auto"],
89
+ description: "Render quality (default auto). Use low for drafts, high for final assets.",
90
+ },
91
+ provider: {
92
+ type: "string",
93
+ description: "Image provider to use. With imageGen configured, this is the instance `id` " +
94
+ "(e.g. \"gemini\"); otherwise it's a provider kind (e.g. \"openai\"). " +
95
+ "Defaults to the configured default / first available. Only specify to override.",
96
+ },
97
+ model: {
98
+ type: "string",
99
+ description: "Image model id (e.g. \"gpt-image-2\"). Defaults to the provider's default model. " +
100
+ "Only specify to override.",
101
+ },
102
+ referenceImages: {
103
+ type: "array",
104
+ items: { type: "string" },
105
+ description: "Optional workspace image path(s) to use as visual references (image-to-image / " +
106
+ "edit). When provided, the prompt edits/re-imagines these inputs instead of " +
107
+ "generating from scratch — use it to keep a subject, style, or composition. " +
108
+ "Paths are relative to the workspace (or absolute). PNG/JPEG/WebP, up to 16.",
109
+ },
110
+ },
111
+ required: ["prompt"],
112
+ },
113
+ };
114
+ /**
115
+ * Resolve an image provider from settings (TODO 7.1). Preference order:
116
+ *
117
+ * 1. `imageGen.providers[]` — the canonical, LLM-decoupled config. `prefer`
118
+ * selects an instance by its `id`; otherwise `imageGen.defaultProvider`,
119
+ * else the first entry. Each instance names its own adapter `kind`.
120
+ * 2. Fallback (no `imageGen`): scan LLM `providers[]` for an image-capable
121
+ * `kind` — keeps existing configs working with no migration. Here
122
+ * `prefer` is treated as a kind.
123
+ *
124
+ * Returns null when nothing usable is configured (or the requested one lacks
125
+ * a key / has no adapter).
126
+ */
127
+ function resolveImageProvider(cwd, prefer) {
128
+ const settings = new SettingsManager(cwd, "full").get();
129
+ // 0. Unified store (统一模型接入方案): modelConnections (tag=image) +
130
+ // credentials. Takes precedence over the legacy imageGen.providers[] so the
131
+ // unified connection page drives image generation. Falls through to the
132
+ // legacy paths below when no image connection is configured.
133
+ const conns = settings.modelConnections;
134
+ const creds = settings.credentials;
135
+ if (Array.isArray(conns) && conns.some((c) => c.tag === "image")) {
136
+ const list = genInstancesFromConnections(conns, (Array.isArray(creds) ? creds : []), getMergedCatalog(), "image");
137
+ const def = settings.defaults?.image;
138
+ const resolved = resolveFromGenList(list, prefer, def);
139
+ if (resolved)
140
+ return resolved;
141
+ if (prefer)
142
+ return null; // explicit request not usable → don't silently fall back
143
+ }
144
+ // 1. Canonical imageGen config.
145
+ const imageGen = settings.imageGen;
146
+ if (imageGen && Array.isArray(imageGen.providers) && imageGen.providers.length > 0) {
147
+ const list = imageGen.providers;
148
+ const usable = (p) => !!effectiveApiKey(p, list) && getImageProvider(p.kind) !== null;
149
+ const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: effectiveApiKey(p, list) });
150
+ if (prefer) {
151
+ // Explicit request — respect the user's intent. If that exact instance
152
+ // isn't usable (no key / no adapter), DON'T silently use another one.
153
+ const chosen = list.find((p) => p.id === prefer);
154
+ if (chosen && usable(chosen)) {
155
+ return { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel };
156
+ }
157
+ return null;
158
+ }
159
+ // No explicit request: prefer defaultProvider, but if it isn't usable
160
+ // (e.g. configured but no key yet) fall back to the first usable entry,
161
+ // rather than erroring. (User-confirmed: default-with-no-key → fall back.)
162
+ const preferred = imageGen.defaultProvider
163
+ ? list.find((p) => p.id === imageGen.defaultProvider)
164
+ : undefined;
165
+ const chosen = (preferred && usable(preferred) ? preferred : undefined) ?? list.find(usable);
166
+ if (chosen) {
167
+ return { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel };
168
+ }
169
+ return null;
170
+ }
171
+ // 2. Back-compat: resolve from legacy LLM providers[] by kind. The field was
172
+ // dropped from the schema; un-migrated settings.json still carry it via the
173
+ // schema's .passthrough(), so read it through an inline cast.
174
+ const legacyProviders = settings.providers ?? [];
175
+ const kinds = prefer ? [prefer] : [...IMAGE_PROVIDER_KINDS];
176
+ for (const kind of kinds) {
177
+ if (!prefer && !IMAGE_PROVIDER_KINDS.includes(kind))
178
+ continue;
179
+ const provider = legacyProviders.find((p) => p.kind === kind);
180
+ if (provider && provider.apiKey) {
181
+ return { kind, creds: { baseUrl: provider.baseUrl, apiKey: provider.apiKey } };
182
+ }
183
+ }
184
+ return null;
185
+ }
186
+ /**
187
+ * Tool-visibility guard: GenerateImage needs a kind:"openai" provider with a
188
+ * key. resolveOpenAIProvider returns null when none is configured.
189
+ *
190
+ * Cached per-cwd with a short TTL: the guard runs on EVERY message's toolDefs
191
+ * assembly (engine.ts), and resolveOpenAIProvider reads + parses settings from
192
+ * disk each call. The 1s TTL collapses the back-to-back reads (same message,
193
+ * rapid turns) while still picking up a newly-configured key well within the
194
+ * gap before the user's next message. The execution path
195
+ * (resolveOpenAIProvider) is intentionally NOT cached — only this boolean.
196
+ */
197
+ const availCache = new Map();
198
+ const AVAIL_TTL_MS = 1000;
199
+ /**
200
+ * List the configured, usable image providers for a workspace (TODO 7.1) —
201
+ * either `imageGen.providers[]` ids+kinds, or the back-compat LLM-provider
202
+ * kinds. Used to build a dynamic tool description so the model sees which
203
+ * backends are actually available. Returns [] on any read error.
204
+ */
205
+ export function listConfiguredImageProviders(cwd = process.cwd()) {
206
+ try {
207
+ const settings = new SettingsManager(cwd, "full").get();
208
+ const imageGen = settings.imageGen;
209
+ if (imageGen?.providers?.length) {
210
+ const list = imageGen.providers;
211
+ return list
212
+ .filter((p) => !!effectiveApiKey(p, list) && getImageProvider(p.kind) !== null)
213
+ .map((p) => ({ id: p.id, kind: p.kind, catalogId: p.catalogId }));
214
+ }
215
+ // Legacy LLM providers[] back-compat (field dropped from schema; read via
216
+ // .passthrough() with an inline cast).
217
+ const legacyProviders = settings.providers ?? [];
218
+ return legacyProviders
219
+ .filter((p) => p.apiKey &&
220
+ IMAGE_PROVIDER_KINDS.includes(p.kind))
221
+ .map((p) => ({ kind: p.kind }));
222
+ }
223
+ catch {
224
+ return [];
225
+ }
226
+ }
227
+ /**
228
+ * Build the GenerateImage tool description for a workspace, appending the
229
+ * configured providers so the model knows what's available and which `provider`
230
+ * values are valid (TODO 7.1). Falls back to the static description when none
231
+ * are configured (the guard hides the tool in that case anyway).
232
+ */
233
+ export function generateImageToolDefFor(cwd) {
234
+ const providers = listConfiguredImageProviders(cwd);
235
+ if (providers.length === 0)
236
+ return generateImageToolDef;
237
+ const names = providers.map((p) => p.id ?? p.kind).join(", ");
238
+ // Per-instance params hints from the catalog (paramsDoc) — so the model knows
239
+ // what each configured model accepts (different models differ).
240
+ const catalog = getMergedCatalog();
241
+ const paramLines = providers
242
+ .map((p) => {
243
+ const entry = findCatalogEntry(catalog, p.catalogId, p.kind);
244
+ return entry?.paramsDoc ? ` - ${p.id ?? p.kind}: ${entry.paramsDoc}` : null;
245
+ })
246
+ .filter((x) => x !== null);
247
+ const paramsBlock = paramLines.length ? `\nParams per provider:\n${paramLines.join("\n")}` : "";
248
+ return {
249
+ ...generateImageToolDef,
250
+ description: generateImageToolDef.description +
251
+ ` Configured provider(s): ${names}. Pass \`provider\` to pick one.` +
252
+ paramsBlock,
253
+ };
254
+ }
255
+ export function isGenerateImageAvailable(cwd = process.cwd(), nowMs = Date.now()) {
256
+ const hit = availCache.get(cwd);
257
+ if (hit && nowMs - hit.at < AVAIL_TTL_MS)
258
+ return hit.value;
259
+ let value = false;
260
+ try {
261
+ value = resolveImageProvider(cwd) !== null;
262
+ }
263
+ catch {
264
+ value = false;
265
+ }
266
+ availCache.set(cwd, { at: nowMs, value });
267
+ return value;
268
+ }
269
+ /** Map a file extension to an image MIME type the image APIs accept. */
270
+ const IMAGE_MIME_BY_EXT = {
271
+ ".png": "image/png",
272
+ ".jpg": "image/jpeg",
273
+ ".jpeg": "image/jpeg",
274
+ ".webp": "image/webp",
275
+ ".gif": "image/gif",
276
+ };
277
+ /**
278
+ * Read reference-image paths (workspace-relative or absolute) into decoded
279
+ * {@link InputImage}s for image-to-image. Returns either the loaded images or a
280
+ * user-facing error string (bad path, unreadable, unsupported type, too many).
281
+ */
282
+ async function loadReferenceImages(paths, cwd) {
283
+ if (paths.length > 16) {
284
+ return { ok: false, error: `too many reference images (${paths.length}); max is 16` };
285
+ }
286
+ const images = [];
287
+ for (const p of paths) {
288
+ if (typeof p !== "string" || !p.trim()) {
289
+ return { ok: false, error: "referenceImages entries must be non-empty path strings" };
290
+ }
291
+ const ext = extname(p).toLowerCase();
292
+ const mimeType = IMAGE_MIME_BY_EXT[ext];
293
+ if (!mimeType) {
294
+ return {
295
+ ok: false,
296
+ error: `unsupported reference image type "${ext || "(none)"}" for ${p}; use PNG/JPEG/WebP/GIF`,
297
+ };
298
+ }
299
+ const abs = isAbsolute(p) ? p : resolvePath(cwd, p);
300
+ let bytes;
301
+ try {
302
+ bytes = await readFile(abs);
303
+ }
304
+ catch (err) {
305
+ return { ok: false, error: `could not read reference image ${p}: ${err.message}` };
306
+ }
307
+ images.push({ filename: basename(abs), mimeType, bytes });
308
+ }
309
+ return { ok: true, images };
310
+ }
311
+ export async function generateImageTool(args, ctx) {
312
+ const prompt = args.prompt;
313
+ if (typeof prompt !== "string" || !prompt.trim()) {
314
+ return "Error: prompt is required";
315
+ }
316
+ const size = typeof args.size === "string" ? args.size : DEFAULT_SIZE;
317
+ const quality = typeof args.quality === "string" ? args.quality : DEFAULT_QUALITY;
318
+ const preferKind = typeof args.provider === "string" && args.provider ? args.provider : undefined;
319
+ const overrideModel = typeof args.model === "string" && args.model ? args.model : undefined;
320
+ const cwd = ctx?.cwd ?? process.cwd();
321
+ // Optional reference images → image-to-image. Resolve + decode before the
322
+ // provider call so a bad path fails fast with a clear message.
323
+ let inputImages;
324
+ if (Array.isArray(args.referenceImages) && args.referenceImages.length > 0) {
325
+ const loaded = await loadReferenceImages(args.referenceImages, cwd);
326
+ if (!loaded.ok)
327
+ return `Error: ${loaded.error}`;
328
+ inputImages = loaded.images;
329
+ }
330
+ const resolved = resolveImageProvider(cwd, preferKind);
331
+ if (!resolved) {
332
+ return preferKind
333
+ ? `Error: no image provider "${preferKind}" is available (unknown id/kind, or it has no API key). Configure it in your code-shell settings, or omit \`provider\` to use the default.`
334
+ : 'Error: no image provider available. Configure an image provider (including an apiKey) ' +
335
+ "in your code-shell settings to use GenerateImage.";
336
+ }
337
+ const adapter = getImageProvider(resolved.kind);
338
+ if (!adapter) {
339
+ return `Error: image generation is not supported for provider kind "${resolved.kind}".`;
340
+ }
341
+ // Model precedence: call arg > instance defaultModel (imageGen) > kind default.
342
+ const model = overrideModel ?? resolved.defaultModel ?? DEFAULT_IMAGE_MODEL[resolved.kind] ?? "gpt-image-2";
343
+ const result = await adapter.generate({
344
+ prompt,
345
+ size,
346
+ quality,
347
+ model,
348
+ creds: resolved.creds,
349
+ inputImages,
350
+ signal: ctx?.signal,
351
+ });
352
+ if (!result.ok) {
353
+ return `Error generating image: ${result.error}`;
354
+ }
355
+ try {
356
+ const dir = join(cwd, ".code-shell", "generated_images");
357
+ await mkdir(dir, { recursive: true });
358
+ // Timestamp keeps names sortable/recognizable; the random suffix prevents
359
+ // collisions when multiple GenerateImage calls run concurrently in one turn
360
+ // (Date.now() alone repeats within the same millisecond → writeFile would
361
+ // silently overwrite and drop an image).
362
+ const path = join(dir, `${Date.now()}-${randomBytes(3).toString("hex")}.png`);
363
+ await writeFile(path, Buffer.from(result.b64, "base64"));
364
+ // Name the provider/model actually used, so the user/agent knows which
365
+ // image backend produced this (esp. when a default fell back to another).
366
+ const mode = inputImages?.length
367
+ ? ` from ${inputImages.length} reference image(s)`
368
+ : "";
369
+ return `Generated image with ${resolved.kind} (${model})${mode}, saved to ${path}`;
370
+ }
371
+ catch (err) {
372
+ return `Error saving generated image: ${err.message}`;
373
+ }
374
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Built-in GenerateVideo tool (TODO 7.1 块3) — text-to-video via a
3
+ * {@link VideoProvider} adapter (submit / poll / download).
4
+ *
5
+ * Video generation is always slow (tens of seconds to minutes), so this tool
6
+ * is fire-and-forget by design: it submits the job, returns a handle
7
+ * immediately, and polls in the BACKGROUND. When the job finishes it writes
8
+ * the file to `<cwd>/.code-shell/generated_videos/` and enqueues a completion
9
+ * notification (same notificationQueue path as background agents / shells), so
10
+ * the main turn is never blocked (consistent with TODO 3.2 / 4.1).
11
+ *
12
+ * Concrete provider adapters (Seedance / Kling) are not wired yet — their
13
+ * private APIs need confirmed docs. Until then the only resolvable provider is
14
+ * the test-injected fake, so in production this tool is dormant (returns a
15
+ * "no video provider configured" message) rather than half-working.
16
+ */
17
+ import type { ToolDefinition } from "../../types.js";
18
+ import type { ToolContext } from "../context.js";
19
+ import { type VideoProvider, type VideoProviderCreds } from "./video-providers.js";
20
+ import { type ImageUploader, type UploaderCreds } from "./image-uploader.js";
21
+ /**
22
+ * Normalize image inputs (URLs or local paths) into public URLs the provider
23
+ * can consume. `images[]` wins over the single `image`. Local paths are
24
+ * uploaded via the injected {@link ImageUploader}; URLs pass through. Caps at
25
+ * {@link MAX_IMAGES} (fal reference-to-video allows up to 9).
26
+ */
27
+ export declare function __normalizeImagesForTests(images: string[] | undefined, image: string | undefined, uploader: ImageUploader, creds: UploaderCreds, signal?: AbortSignal): Promise<{
28
+ ok: true;
29
+ urls: string[];
30
+ } | {
31
+ ok: false;
32
+ error: string;
33
+ }>;
34
+ export declare const generateVideoToolDef: ToolDefinition;
35
+ export declare function __setVideoProviderForTests(p: VideoProvider | null): void;
36
+ export declare function isGenerateVideoAvailable(cwd?: string, nowMs?: number): boolean;
37
+ /**
38
+ * List configured, usable video providers (TODO 7.1). Returns [] when no
39
+ * adapters are wired (VIDEO_PROVIDER_KINDS empty) or none configured.
40
+ */
41
+ export declare function listConfiguredVideoProviders(cwd?: string): Array<{
42
+ id?: string;
43
+ kind: string;
44
+ catalogId?: string;
45
+ }>;
46
+ /** Dynamic GenerateVideo description naming configured providers (TODO 7.1). */
47
+ export declare function generateVideoToolDefFor(cwd: string): ToolDefinition;
48
+ interface ResolvedVideoProvider {
49
+ kind: string;
50
+ creds: VideoProviderCreds;
51
+ defaultModel?: string;
52
+ }
53
+ export declare function __resolveVideoProviderForTests(cwd: string, preferKind?: string): ResolvedVideoProvider | null;
54
+ export declare function generateVideoTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
55
+ export {};