@cjhyy/code-shell-core 0.7.0 → 0.8.0

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 (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -8,15 +8,70 @@
8
8
  * Edit, by design). See docs/.../2026-06-15-unified-model-catalog-design.md §7.
9
9
  */
10
10
  import { randomBytes } from "node:crypto";
11
- import { userCatalogPath } from "../../model-catalog/index.js";
11
+ import { BUILTIN_CATALOG, getMergedCatalog, loadUserCatalog, userCatalogPath, } from "../../model-catalog/index.js";
12
12
  import { saveCatalogEntry } from "../../model-catalog/save-entry.js";
13
- import { catalogEntrySchema } from "../../model-catalog/types.js";
13
+ import { catalogEntrySchema, modelPresetSchema, } from "../../model-catalog/types.js";
14
+ import { upsertModelPreset } from "../../model-catalog/upsert.js";
15
+ import { PROVIDER_KINDS } from "../../llm/provider-kinds.js";
16
+ const CATALOG_ADAPTER_KINDS = [...Object.keys(PROVIDER_KINDS), "fal"].join("|");
17
+ /**
18
+ * Recognise first-party provider hosts so the catalog tool can reject the
19
+ * dangerous-but-schema-valid combination that caused an OpenRouter model to be
20
+ * sent to api.openai.com. Unknown/custom hosts remain allowed.
21
+ */
22
+ function inferProviderKindFromBaseUrl(baseUrl) {
23
+ let host;
24
+ try {
25
+ host = new URL(baseUrl).host.toLowerCase();
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ for (const [kind, meta] of Object.entries(PROVIDER_KINDS)) {
31
+ if (!meta.defaultBaseUrl)
32
+ continue;
33
+ try {
34
+ if (new URL(meta.defaultBaseUrl).host.toLowerCase() === host)
35
+ return kind;
36
+ }
37
+ catch {
38
+ // A future custom kind may intentionally have no parseable default URL.
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ function providerIdentityError(entry) {
44
+ if (entry.tag !== "text")
45
+ return undefined;
46
+ const inferred = inferProviderKindFromBaseUrl(entry.defaultBaseUrl);
47
+ if (!inferred || inferred === "custom" || entry.adapterKind === inferred)
48
+ return undefined;
49
+ const protocolHint = inferred === "anthropic" ? "anthropic-style" : "openai-compat";
50
+ return (`provider mismatch: defaultBaseUrl points to ${inferred}, but adapterKind is ` +
51
+ `"${entry.adapterKind}". Use adapterKind="${inferred}" and ` +
52
+ `protocol="${protocolHint}". adapterKind identifies the provider/gateway account; ` +
53
+ `protocol only identifies the HTTP wire format.`);
54
+ }
55
+ let modelCatalogChangedSink = null;
56
+ export function setModelCatalogChangedSink(sink) {
57
+ modelCatalogChangedSink = sink;
58
+ }
59
+ function fireModelCatalogChanged() {
60
+ try {
61
+ modelCatalogChangedSink?.();
62
+ }
63
+ catch {
64
+ // Host notification is best-effort; the catalog write itself succeeded.
65
+ }
66
+ }
14
67
  export const editModelCatalogToolDef = {
15
68
  name: "EditModelCatalog",
16
- description: "Add or update a provider/model template in the user model catalog so it " +
17
- "appears in the connection page (text/image/video). Keyed by `id`: a new id " +
18
- "adds a provider, an existing id replaces that user-catalog entry. Backs up " +
19
- "the file before writing and " +
69
+ description: "Add a model to an existing provider, or add/replace a complete provider template, " +
70
+ "in the user model catalog so it appears in the connection page " +
71
+ "(text/image/video/audio). Prefer operation='upsertModel' whenever the provider " +
72
+ "already exists: it preserves all existing/built-in models and reuses that provider's " +
73
+ "credentials. Use operation='upsertProvider' only for a genuinely new provider/endpoint " +
74
+ "or an intentional full provider override. Backs up the file before writing and " +
20
75
  "validates the entry. Use after researching a model's real facts (id, context " +
21
76
  "window, supported params, modalities) — do NOT guess; verify against the " +
22
77
  "provider's official docs first (see the model-fact-finder skill). Does NOT set " +
@@ -24,23 +79,58 @@ export const editModelCatalogToolDef = {
24
79
  inputSchema: {
25
80
  type: "object",
26
81
  properties: {
82
+ operation: {
83
+ type: "string",
84
+ enum: ["upsertModel", "upsertProvider"],
85
+ description: "upsertModel appends/updates one model inside an existing provider; " +
86
+ "upsertProvider saves a complete provider template. Defaults from the supplied fields.",
87
+ },
88
+ providerId: {
89
+ type: "string",
90
+ description: "Existing provider id for upsertModel, e.g. 'openrouter'. Do not create a " +
91
+ "provider-per-model id such as 'openrouter-kimi'.",
92
+ },
93
+ modelPreset: {
94
+ type: "object",
95
+ description: "One complete ModelPreset for upsertModel: {value, label?, maxContextTokens?, " +
96
+ "maxOutputTokens?, supportsVision?, params?[]}. Existing model value updates in " +
97
+ "place; a new value appends without hiding the provider's other models.",
98
+ },
99
+ setAsDefault: {
100
+ type: "boolean",
101
+ description: "For upsertModel, also make this model the provider template default.",
102
+ },
27
103
  entry: {
28
104
  type: "object",
29
- description: "A full CatalogEntry. Required: id, tag (text|image|video), adapterKind " +
30
- "(an already-wired adapter: openai|anthropic|google|fal), displayName, " +
105
+ description: "For upsertProvider only: a full CatalogEntry. Required: id, tag " +
106
+ "(text|image|video|audio), adapterKind " +
107
+ `(the actual provider/gateway identity: ${CATALOG_ADAPTER_KINDS}), displayName, ` +
31
108
  "description, defaultBaseUrl. Optional: protocol (openai-compat|anthropic-style), " +
32
109
  "defaultModel, needsKey, signupUrl, test, modelPresets[] (each {value, label?, " +
33
110
  "maxContextTokens?, maxOutputTokens?, supportsVision?, params?[]}). Each param: " +
34
111
  "{name, label?, control (enum|number|toggle|text), options?[], min?, max?, default?, " +
35
112
  "doc?, wire?{field}}. Fill maxContextTokens with the model's REAL window; declare " +
36
- "params per-model (only what that model supports). To keep a custom provider " +
37
- "beside a built-in one, use a distinct id.",
113
+ "params per-model (only what that model supports). IMPORTANT: adapterKind is NOT " +
114
+ "the wire protocol. OpenRouter must use adapterKind='openrouter' with " +
115
+ "protocol='openai-compat'; never use adapterKind='openai' merely because an endpoint " +
116
+ "is OpenAI-compatible. Adding a model to OpenRouter is operation='upsertModel' with " +
117
+ "providerId='openrouter', not a new provider entry. For genuinely distinct custom " +
118
+ "providers, retain the real provider's adapterKind so credentials and capability " +
119
+ "rules stay in the correct provider family.",
38
120
  },
39
121
  },
40
- required: ["entry"],
41
122
  },
42
123
  };
43
124
  export async function editModelCatalogTool(args) {
125
+ const operation = args.operation ??
126
+ (args.providerId !== undefined || args.modelPreset !== undefined
127
+ ? "upsertModel"
128
+ : "upsertProvider");
129
+ if (operation === "upsertModel")
130
+ return upsertExistingProviderModel(args);
131
+ if (operation !== "upsertProvider") {
132
+ return "Error: `operation` must be `upsertModel` or `upsertProvider`.";
133
+ }
44
134
  const entry = args.entry;
45
135
  if (!entry || typeof entry !== "object") {
46
136
  return "Error: `entry` (a CatalogEntry object) is required.";
@@ -49,6 +139,9 @@ export async function editModelCatalogTool(args) {
49
139
  if (!parsed.success) {
50
140
  return `Error: invalid catalog entry: ${parsed.error.issues.map((i) => i.message).join("; ")}`;
51
141
  }
142
+ const identityError = providerIdentityError(parsed.data);
143
+ if (identityError)
144
+ return `Error: ${identityError}`;
52
145
  const stamp = `${Date.now()}-${randomBytes(3).toString("hex")}`;
53
146
  const r = saveCatalogEntry(parsed.data, {
54
147
  path: userCatalogPath(),
@@ -56,8 +149,75 @@ export async function editModelCatalogTool(args) {
56
149
  });
57
150
  if (!r.ok)
58
151
  return `Error: ${r.error}`;
152
+ fireModelCatalogChanged();
59
153
  return summarizeWrite(parsed.data, r.action ?? "added", r.backup);
60
154
  }
155
+ async function upsertExistingProviderModel(args) {
156
+ const providerId = typeof args.providerId === "string" ? args.providerId.trim() : "";
157
+ if (!providerId)
158
+ return "Error: `providerId` is required for `upsertModel`.";
159
+ const parsedPreset = modelPresetSchema.safeParse(args.modelPreset);
160
+ if (!parsedPreset.success) {
161
+ return `Error: invalid model preset: ${parsedPreset.error.issues.map((issue) => issue.message).join("; ")}`;
162
+ }
163
+ const builtin = BUILTIN_CATALOG.find((entry) => entry.id === providerId);
164
+ const userEntry = loadUserCatalog().find((entry) => entry.id === providerId);
165
+ const provider = userEntry ?? builtin;
166
+ if (!provider) {
167
+ return (`Error: provider "${providerId}" does not exist. ` +
168
+ "Create it first with operation=`upsertProvider`.");
169
+ }
170
+ const effective = getMergedCatalog().find((entry) => entry.id === providerId) ?? provider;
171
+ const existed = effective.modelPresets?.some((preset) => preset.value === parsedPreset.data.value);
172
+ // For built-ins, the user file stores only model-level additions/overrides.
173
+ // getMergedCatalog layers these over the current shipped presets, so app
174
+ // upgrades can add models without being frozen by a full user override.
175
+ const storedPresets = builtin ? (userEntry?.modelPresets ?? []) : (provider.modelPresets ?? []);
176
+ const nextEntry = {
177
+ ...(builtin ?? provider),
178
+ ...(userEntry ?? {}),
179
+ ...(builtin ? { modelPresetsMode: "merge" } : {}),
180
+ ...(args.setAsDefault === true ? { defaultModel: parsedPreset.data.value } : {}),
181
+ modelPresets: upsertModelPreset(storedPresets, parsedPreset.data),
182
+ };
183
+ const identityError = providerIdentityError(nextEntry);
184
+ if (identityError)
185
+ return `Error: ${identityError}`;
186
+ const stamp = `${Date.now()}-${randomBytes(3).toString("hex")}`;
187
+ const result = saveCatalogEntry(nextEntry, { path: userCatalogPath(), stamp });
188
+ if (!result.ok)
189
+ return `Error: ${result.error}`;
190
+ fireModelCatalogChanged();
191
+ return summarizeModelWrite(nextEntry, parsedPreset.data, existed ? "updated" : "added", result.backup);
192
+ }
193
+ function summarizeModelWrite(entry, preset, action, backup) {
194
+ const lines = [
195
+ `✅ ${action === "updated" ? "Updated" : "Added"} model "${preset.value}" in provider "${entry.id}".`,
196
+ `adapter: ${entry.adapterKind} | baseUrl: ${entry.defaultBaseUrl}`,
197
+ `merge: existing provider models preserved${entry.defaultModel === preset.value ? " | provider default: yes" : ""}`,
198
+ ];
199
+ const limits = [
200
+ preset.maxContextTokens ? `ctx ${preset.maxContextTokens}` : "",
201
+ preset.maxOutputTokens ? `out ${preset.maxOutputTokens}` : "",
202
+ ]
203
+ .filter(Boolean)
204
+ .join(", ");
205
+ if (limits)
206
+ lines.push(`limits: ${limits}`);
207
+ for (const param of preset.params ?? []) {
208
+ const details = param.control === "enum"
209
+ ? ` options=[${param.options?.join(", ") ?? ""}]`
210
+ : param.control === "number"
211
+ ? ` range=${param.min ?? "?"}..${param.max ?? "?"}`
212
+ : "";
213
+ const defaultValue = param.default !== undefined ? ` default=${JSON.stringify(param.default)}` : "";
214
+ lines.push(`- ${param.name} (${param.control})${details}${defaultValue}`);
215
+ }
216
+ lines.push(`Written to ${userCatalogPath()}.` + (backup ? ` Backup: ${backup}.` : ""));
217
+ lines.push("Hot-reloads — the connection page refreshes after this write.");
218
+ lines.push("⚠️ Relay this summary to the user and ask them to verify the model facts against official docs.");
219
+ return lines.join("\n");
220
+ }
61
221
  /**
62
222
  * Build a structured completion summary so the user can SEE exactly what was
63
223
  * written and catch a wrong value at a glance — every param's options/default
@@ -96,7 +256,7 @@ function summarizeWrite(entry, action, backup) {
96
256
  }
97
257
  }
98
258
  lines.push(`\nWritten to ${userCatalogPath()}.` + (backup ? ` Backup: ${backup}.` : ""));
99
- lines.push("Hot-reloads — the connection page refreshes once this turn completes.");
259
+ lines.push("Hot-reloads — the connection page refreshes after this write.");
100
260
  lines.push("⚠️ Relay this summary to the user and ask them to verify each param's options/default " +
101
261
  "match the provider's OFFICIAL docs — especially enum levels (a gateway's input aliases " +
102
262
  "are NOT the model's native values). To fix: edit this file directly, or ask me to.");
@@ -3,5 +3,6 @@
3
3
  */
4
4
  import type { ToolDefinition } from "../../types.js";
5
5
  import type { ToolContext } from "../context.js";
6
+ import type { ToolFailure } from "./index.js";
6
7
  export declare const editToolDef: ToolDefinition;
7
- export declare function editTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
8
+ export declare function editTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string | ToolFailure>;
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Built-in Edit file tool — exact string replacement.
3
3
  */
4
- import { readFile, writeFile } from "node:fs/promises";
4
+ import { readFile } from "node:fs/promises";
5
5
  import { existsSync } from "node:fs";
6
6
  import { isAbsolute, resolve } from "node:path";
7
7
  import { fileCache } from "./file-cache.js";
8
8
  import { detectEol, toLf, applyEol } from "./eol.js";
9
+ import { getFinalWritePathSnapshot, revalidateFinalWritePath, writeFileNoFollow, } from "../path-policy.js";
9
10
  export const editToolDef = {
10
11
  name: "Edit",
11
12
  description: "Perform exact string replacements in a file. " +
@@ -50,7 +51,11 @@ export async function editTool(args, ctx) {
50
51
  if (!existsSync(filePath))
51
52
  return `Error: File not found: ${filePath}`;
52
53
  try {
53
- const raw = await readFile(filePath, "utf-8");
54
+ const approvedPath = getFinalWritePathSnapshot(args, filePath, cwd);
55
+ const beforeRead = revalidateFinalWritePath(filePath, cwd, approvedPath);
56
+ if ("error" in beforeRead)
57
+ return { ok: false, error: beforeRead.error };
58
+ const raw = await readFile(beforeRead.resolvedPath, "utf-8");
54
59
  // CRLF handling: detect the file's line ending, then match/replace in LF
55
60
  // space (the model emits LF, so a CRLF file would never match otherwise),
56
61
  // and write back in the ORIGINAL EOL so a CRLF file stays CRLF (no whole-
@@ -69,14 +74,13 @@ export async function editTool(args, ctx) {
69
74
  return "Error: old_string is not unique in the file. Provide more context or use replace_all.";
70
75
  }
71
76
  }
72
- const updatedLf = replaceAll
73
- ? content.split(oldLf).join(newLf)
74
- : content.replace(oldLf, newLf);
75
- await writeFile(filePath, applyEol(updatedLf, eol), "utf-8");
77
+ const updatedLf = replaceAll ? content.split(oldLf).join(newLf) : content.replace(oldLf, newLf);
78
+ const beforeWrite = revalidateFinalWritePath(filePath, cwd, approvedPath);
79
+ if ("error" in beforeWrite)
80
+ return { ok: false, error: beforeWrite.error };
81
+ await writeFileNoFollow(beforeWrite.resolvedPath, applyEol(updatedLf, eol));
76
82
  fileCache.invalidate(filePath);
77
- const count = replaceAll
78
- ? (content.split(oldLf).length - 1)
79
- : 1;
83
+ const count = replaceAll ? content.split(oldLf).length - 1 : 1;
80
84
  // Generate a compact diff summary
81
85
  const oldLines = oldLf.split("\n");
82
86
  const newLines = newLf.split("\n");
@@ -84,7 +88,7 @@ export async function editTool(args, ctx) {
84
88
  return `Successfully edited ${filePath} (${count} replacement${count > 1 ? "s" : ""})\n${diffSummary}`;
85
89
  }
86
90
  catch (err) {
87
- return `Error editing file: ${err.message}`;
91
+ return { ok: false, error: `Error editing file: ${err.message}` };
88
92
  }
89
93
  }
90
94
  function generateCompactDiff(oldLines, newLines, filePath) {
@@ -14,4 +14,6 @@ declare class FileStateCache {
14
14
  get size(): number;
15
15
  }
16
16
  export declare const fileCache: FileStateCache;
17
+ /** Public capability seam: invalidate core's Read/Edit cache after an external file tool writes. */
18
+ export declare function invalidateFileCache(filePath: string): void;
17
19
  export {};
@@ -45,3 +45,7 @@ class FileStateCache {
45
45
  }
46
46
  }
47
47
  export const fileCache = new FileStateCache();
48
+ /** Public capability seam: invalidate core's Read/Edit cache after an external file tool writes. */
49
+ export function invalidateFileCache(filePath) {
50
+ fileCache.invalidate(filePath);
51
+ }
@@ -48,7 +48,10 @@ export function effectiveApiKey(inst, list) {
48
48
  */
49
49
  function resolveFromGenList(list, prefer, def) {
50
50
  const usable = (p) => !!p.apiKey && getImageProvider(p.kind) !== null;
51
- const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: p.apiKey });
51
+ const credsOf = (p) => ({
52
+ baseUrl: p.baseUrl,
53
+ apiKey: p.apiKey,
54
+ });
52
55
  if (prefer) {
53
56
  const chosen = list.find((p) => p.id === prefer);
54
57
  if (chosen && usable(chosen))
@@ -57,7 +60,9 @@ function resolveFromGenList(list, prefer, def) {
57
60
  }
58
61
  const preferred = def ? list.find((p) => p.id === def) : undefined;
59
62
  const chosen = (preferred && usable(preferred) ? preferred : undefined) ?? list.find(usable);
60
- return chosen ? { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel } : null;
63
+ return chosen
64
+ ? { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel }
65
+ : null;
61
66
  }
62
67
  const DEFAULT_SIZE = "1024x1024";
63
68
  const DEFAULT_QUALITY = "auto";
@@ -91,12 +96,12 @@ export const generateImageToolDef = {
91
96
  provider: {
92
97
  type: "string",
93
98
  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\"). " +
99
+ '(e.g. "gemini"); otherwise it\'s a provider kind (e.g. "openai"). ' +
95
100
  "Defaults to the configured default / first available. Only specify to override.",
96
101
  },
97
102
  model: {
98
103
  type: "string",
99
- description: "Image model id (e.g. \"gpt-image-2\"). Defaults to the provider's default model. " +
104
+ description: 'Image model id (e.g. "gpt-image-2"). Defaults to the provider\'s default model. ' +
100
105
  "Only specify to override.",
101
106
  },
102
107
  referenceImages: {
@@ -146,7 +151,10 @@ function resolveImageProvider(cwd, prefer) {
146
151
  if (imageGen && Array.isArray(imageGen.providers) && imageGen.providers.length > 0) {
147
152
  const list = imageGen.providers;
148
153
  const usable = (p) => !!effectiveApiKey(p, list) && getImageProvider(p.kind) !== null;
149
- const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: effectiveApiKey(p, list) });
154
+ const credsOf = (p) => ({
155
+ baseUrl: p.baseUrl,
156
+ apiKey: effectiveApiKey(p, list),
157
+ });
150
158
  if (prefer) {
151
159
  // Explicit request — respect the user's intent. If that exact instance
152
160
  // isn't usable (no key / no adapter), DON'T silently use another one.
@@ -171,7 +179,8 @@ function resolveImageProvider(cwd, prefer) {
171
179
  // 2. Back-compat: resolve from legacy LLM providers[] by kind. The field was
172
180
  // dropped from the schema; un-migrated settings.json still carry it via the
173
181
  // schema's .passthrough(), so read it through an inline cast.
174
- const legacyProviders = settings.providers ?? [];
182
+ const legacyProviders = settings
183
+ .providers ?? [];
175
184
  const kinds = prefer ? [prefer] : [...IMAGE_PROVIDER_KINDS];
176
185
  for (const kind of kinds) {
177
186
  if (!prefer && !IMAGE_PROVIDER_KINDS.includes(kind))
@@ -331,7 +340,7 @@ export async function generateImageTool(args, ctx) {
331
340
  if (!resolved) {
332
341
  return preferKind
333
342
  ? `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) ' +
343
+ : "Error: no image provider available. Configure an image provider (including an apiKey) " +
335
344
  "in your code-shell settings to use GenerateImage.";
336
345
  }
337
346
  const adapter = getImageProvider(resolved.kind);
@@ -363,9 +372,7 @@ export async function generateImageTool(args, ctx) {
363
372
  await writeFile(path, Buffer.from(result.b64, "base64"));
364
373
  // Name the provider/model actually used, so the user/agent knows which
365
374
  // 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
- : "";
375
+ const mode = inputImages?.length ? ` from ${inputImages.length} reference image(s)` : "";
369
376
  return `Generated image with ${resolved.kind} (${model})${mode}, saved to ${path}`;
370
377
  }
371
378
  catch (err) {
@@ -32,6 +32,10 @@ export declare function __normalizeImagesForTests(images: string[] | undefined,
32
32
  ok: false;
33
33
  error: string;
34
34
  }>;
35
+ export declare function __setVideoPollingLimitsForTests(limits: {
36
+ maxPollMs: number;
37
+ requestTimeoutMs: number;
38
+ } | null): void;
35
39
  export declare const generateVideoToolDef: ToolDefinition;
36
40
  export declare function __setVideoProviderForTests(p: VideoProvider | null): void;
37
41
  export declare function isGenerateVideoAvailable(cwd?: string, nowMs?: number): boolean;