@cjhyy/code-shell-core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) 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/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /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;