@cjhyy/code-shell-core 0.7.1 → 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 (594) 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 +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /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.");
@@ -74,17 +74,13 @@ export async function editTool(args, ctx) {
74
74
  return "Error: old_string is not unique in the file. Provide more context or use replace_all.";
75
75
  }
76
76
  }
77
- const updatedLf = replaceAll
78
- ? content.split(oldLf).join(newLf)
79
- : content.replace(oldLf, newLf);
77
+ const updatedLf = replaceAll ? content.split(oldLf).join(newLf) : content.replace(oldLf, newLf);
80
78
  const beforeWrite = revalidateFinalWritePath(filePath, cwd, approvedPath);
81
79
  if ("error" in beforeWrite)
82
80
  return { ok: false, error: beforeWrite.error };
83
81
  await writeFileNoFollow(beforeWrite.resolvedPath, applyEol(updatedLf, eol));
84
82
  fileCache.invalidate(filePath);
85
- const count = replaceAll
86
- ? (content.split(oldLf).length - 1)
87
- : 1;
83
+ const count = replaceAll ? content.split(oldLf).length - 1 : 1;
88
84
  // Generate a compact diff summary
89
85
  const oldLines = oldLf.split("\n");
90
86
  const newLines = newLf.split("\n");
@@ -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) {
@@ -21,7 +21,7 @@ import { notificationQueue } from "./agent-notifications.js";
21
21
  import { backgroundJobRegistry } from "./background-jobs.js";
22
22
  import { logger } from "../../logging/logger.js";
23
23
  import { getVideoProvider, DEFAULT_VIDEO_MODEL, } from "./video-providers.js";
24
- import { getImageUploader, isHttpUrl } from "./image-uploader.js";
24
+ import { getImageUploader, isHttpUrl, } from "./image-uploader.js";
25
25
  import { effectiveApiKey } from "./generate-image.js";
26
26
  import { getMergedCatalog, findCatalogEntry } from "../../model-catalog/index.js";
27
27
  import { genInstancesFromConnections } from "../../model-catalog/gen-connections.js";
@@ -78,7 +78,10 @@ export const generateVideoToolDef = {
78
78
  description: "Video provider kind to use. Defaults to the first configured video provider.",
79
79
  },
80
80
  model: { type: "string", description: "Video model id. Defaults to the provider's default." },
81
- image: { type: "string", description: "Image URL (http/https) for image-to-video. When set, an image-to-video model is used." },
81
+ image: {
82
+ type: "string",
83
+ description: "Image URL (http/https) for image-to-video. When set, an image-to-video model is used.",
84
+ },
82
85
  images: {
83
86
  type: "array",
84
87
  items: { type: "string" },
@@ -87,7 +90,7 @@ export const generateVideoToolDef = {
87
90
  videos: {
88
91
  type: "array",
89
92
  items: { type: "string" },
90
- description: "Reference/continuation video URLs (http/https only — NOT local paths) for video extension. Forces reference-to-video (Seedance model required). Up to 3. Refer to them in prompt as @Video1, @Video2 (e.g. \"continue from @Video1\").",
93
+ description: 'Reference/continuation video URLs (http/https only — NOT local paths) for video extension. Forces reference-to-video (Seedance model required). Up to 3. Refer to them in prompt as @Video1, @Video2 (e.g. "continue from @Video1").',
91
94
  },
92
95
  },
93
96
  required: ["prompt"],
@@ -184,7 +187,10 @@ function resolveVideoProvider(cwd, preferKind) {
184
187
  const list = genInstancesFromConnections(conns, (Array.isArray(creds) ? creds : []), getMergedCatalog(), "video");
185
188
  const def = settings.defaults?.video;
186
189
  const usable = (p) => !!p.apiKey && getVideoProvider(p.kind) !== null;
187
- const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: p.apiKey });
190
+ const credsOf = (p) => ({
191
+ baseUrl: p.baseUrl,
192
+ apiKey: p.apiKey,
193
+ });
188
194
  if (preferKind) {
189
195
  const chosen = list.find((p) => (p.id === preferKind || p.kind === preferKind) && usable(p));
190
196
  if (chosen)
@@ -202,7 +208,10 @@ function resolveVideoProvider(cwd, preferKind) {
202
208
  if (videoGen?.providers?.length) {
203
209
  const list = videoGen.providers;
204
210
  const usable = (p) => !!effectiveApiKey(p, list) && getVideoProvider(p.kind) !== null;
205
- const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: effectiveApiKey(p, list) });
211
+ const credsOf = (p) => ({
212
+ baseUrl: p.baseUrl,
213
+ apiKey: effectiveApiKey(p, list),
214
+ });
206
215
  if (preferKind) {
207
216
  const chosen = list.find((p) => (p.id === preferKind || p.kind === preferKind) && usable(p));
208
217
  if (chosen)
@@ -220,7 +229,8 @@ function resolveVideoProvider(cwd, preferKind) {
220
229
  // Back-compat: scan legacy LLM providers[] for a video-capable kind. The
221
230
  // field was dropped from the schema; un-migrated settings.json still carry it
222
231
  // via .passthrough(), so read it through an inline cast.
223
- const legacyProviders = settings.providers ?? [];
232
+ const legacyProviders = settings
233
+ .providers ?? [];
224
234
  const kinds = preferKind ? [preferKind] : VIDEO_PROVIDER_KINDS;
225
235
  for (const kind of kinds) {
226
236
  const provider = legacyProviders.find((p) => p.kind === kind);
@@ -290,7 +300,15 @@ export async function generateVideoTool(args, ctx) {
290
300
  const norm = await __normalizeImagesForTests(imagesArg, image, uploader, { baseUrl: creds.baseUrl, apiKey: creds.apiKey }, ctx?.signal);
291
301
  if (!norm.ok)
292
302
  return `Error: ${norm.error}`;
293
- const submit = await adapter.submit({ prompt, model, image: undefined, images: norm.urls, videos: videosArg, creds, signal: ctx?.signal });
303
+ const submit = await adapter.submit({
304
+ prompt,
305
+ model,
306
+ image: undefined,
307
+ images: norm.urls,
308
+ videos: videosArg,
309
+ creds,
310
+ signal: ctx?.signal,
311
+ });
294
312
  if (!submit.ok) {
295
313
  return `Error submitting video job: ${submit.error}`;
296
314
  }
@@ -333,6 +351,7 @@ export async function generateVideoTool(args, ctx) {
333
351
  clearTimeout(totalTimer);
334
352
  ctx?.signal?.removeEventListener("abort", onTurnAbort);
335
353
  });
354
+ ctx?.runYield?.request("background_notification");
336
355
  return [
337
356
  `Video generation started in the background.`,
338
357
  `job_id: ${jobId} (internal — do not show to user)`,
@@ -135,7 +135,7 @@ export async function grepTool(args, ctx) {
135
135
  if (isCommandNotFound(rgErr) || isCommandNotFound(grepErr)) {
136
136
  return await runNodeGrep(pattern, searchPath, fileGlob, context, maxResults, outputMode, caseInsensitive, ctx?.signal);
137
137
  }
138
- throw new Error(`Error in search: ${grepErr.message}`);
138
+ throw new Error(`Error in search: ${grepErr.message}`, { cause: grepErr });
139
139
  }
140
140
  }
141
141
  }
@@ -227,7 +227,7 @@ async function runNodeGrep(pattern, path, fileGlob, context, maxResults, outputM
227
227
  regex = new RegExp(pattern, caseInsensitive ? "i" : "");
228
228
  }
229
229
  catch (err) {
230
- throw new Error(`Error in search: ${err.message}`);
230
+ throw new Error(`Error in search: ${err.message}`, { cause: err });
231
231
  }
232
232
  const matches = [];
233
233
  await walkTextFiles(path, fileGlob, async (file) => {
@@ -10,7 +10,13 @@ export function isHttpUrl(s) {
10
10
  }
11
11
  function mimeFromName(name) {
12
12
  const ext = name.toLowerCase().split(".").pop() ?? "";
13
- const map = { png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", webp: "image/webp", gif: "image/gif" };
13
+ const map = {
14
+ png: "image/png",
15
+ jpg: "image/jpeg",
16
+ jpeg: "image/jpeg",
17
+ webp: "image/webp",
18
+ gif: "image/gif",
19
+ };
14
20
  return map[ext] ?? "application/octet-stream";
15
21
  }
16
22
  export class FalStorageUploader {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Built-in tool registration.
3
3
  */
4
- import type { RegisteredTool } from "../../types.js";
4
+ import type { PermissionRule, RegisteredTool } from "../../types.js";
5
5
  import type { ToolVisibilityContext } from "../context.js";
6
6
  /**
7
7
  * Tool executor signature.
@@ -51,14 +51,39 @@ export type BuiltinToolGuard = (ctx: ToolVisibilityContext) => boolean;
51
51
  export interface BuiltinTool {
52
52
  definition: RegisteredTool;
53
53
  execute: BuiltinToolFn;
54
+ exposure: BuiltinToolExposure;
55
+ }
56
+ export interface BuiltinToolExposure {
57
+ /** Empty means explicit enableBuiltinTools-only. */
58
+ presetTags: readonly string[];
59
+ /** Execution policy is explicit and never inferred from permissionDefault. */
60
+ defaultPermissionRules?: readonly PermissionRule[];
61
+ /** Prompt sections enabled whenever at least one contributing tool is active. */
62
+ promptSections?: readonly string[];
63
+ /** Complete capability companions that must share every preset tag. */
64
+ requires?: readonly string[];
65
+ /** Shared by model visibility and the executor's second safety gate. */
66
+ availability?: BuiltinToolGuard;
67
+ /**
68
+ * Per-turn dynamic rewrite of the tool definition the model sees (e.g. a
69
+ * closed enum derived from run-scoped state). Pure; must not mutate `def`.
70
+ */
71
+ rewriteDefinition?: (def: import("../../types.js").ToolDefinition, ctx: ToolVisibilityContext) => import("../../types.js").ToolDefinition;
54
72
  }
55
73
  export declare const BUILTIN_TOOLS: BuiltinTool[];
56
- /**
57
- * Per-tool availability predicates. A tool listed here is filtered OUT of the
58
- * exposed toolDefs when its predicate returns false for the active cwd (see
59
- * engine.ts toolDefs assembly). Tools NOT listed here are always visible.
60
- * Keyed by the tool's `name` (must match the toolDef name).
61
- */
74
+ export declare function validateBuiltinToolExposures(tools?: readonly BuiltinTool[]): void;
75
+ /** Derive a preset's tool list and safe defaults from any composed tool catalog. */
76
+ export declare function derivePresetExposure(tag: string, tools?: readonly BuiltinTool[]): {
77
+ builtinTools: string[];
78
+ defaultPermissionRules: PermissionRule[];
79
+ };
80
+ /** Backwards-compatible name for callers deriving only from the core catalog. */
81
+ export declare function deriveBuiltinPresetExposure(tag: string): {
82
+ builtinTools: string[];
83
+ defaultPermissionRules: PermissionRule[];
84
+ };
85
+ export declare function deriveToolGatedPromptSections(tools?: readonly BuiltinTool[]): Record<string, string[]>;
86
+ /** Compatibility view consumed by engine + executor; metadata is authoritative. */
62
87
  export declare const BUILTIN_TOOL_GUARDS: Map<string, BuiltinToolGuard>;
63
88
  /** UseCredential is available when the cwd's credential metadata has ≥1 entry. */
64
89
  export declare function isUseCredentialAvailable(cwd: string, settingsScope?: import("../../settings/manager.js").SettingsScope): boolean;