gsd-pi 2.68.0 → 2.68.1-dev.abc8f2b

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 (258) hide show
  1. package/README.md +66 -70
  2. package/dist/resources/extensions/gsd/auto-model-selection.js +27 -1
  3. package/dist/resources/extensions/gsd/auto.js +8 -2
  4. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  5. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -5
  6. package/dist/resources/extensions/gsd/guided-flow.js +25 -70
  7. package/dist/resources/extensions/gsd/model-router.js +85 -2
  8. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
  9. package/dist/resources/extensions/gsd/templates/context.md +34 -2
  10. package/dist/web/standalone/.next/BUILD_ID +1 -1
  11. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  12. package/dist/web/standalone/.next/build-manifest.json +3 -3
  13. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  14. package/dist/web/standalone/.next/required-server-files.json +3 -3
  15. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  16. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  26. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  36. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  37. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  38. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  40. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  41. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  42. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  54. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  74. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  84. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  90. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  106. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  110. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/index.html +1 -1
  120. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  121. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  122. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  123. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  125. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/page.js +2 -2
  127. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  129. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  130. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  131. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/middleware.js +2 -2
  133. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  135. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  136. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  137. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  138. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  139. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  140. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  141. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  142. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  143. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  144. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  145. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  146. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  147. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  148. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  149. package/dist/web/standalone/server.js +1 -1
  150. package/package.json +1 -1
  151. package/packages/pi-ai/dist/index.d.ts +3 -0
  152. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  153. package/packages/pi-ai/dist/index.js +2 -0
  154. package/packages/pi-ai/dist/index.js.map +1 -1
  155. package/packages/pi-ai/dist/providers/amazon-bedrock.js +2 -2
  156. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  157. package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -2
  158. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  159. package/packages/pi-ai/dist/providers/google-shared.js +2 -2
  160. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  161. package/packages/pi-ai/dist/providers/mistral.js +2 -2
  162. package/packages/pi-ai/dist/providers/mistral.js.map +1 -1
  163. package/packages/pi-ai/dist/providers/openai-completions.js +2 -2
  164. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  165. package/packages/pi-ai/dist/providers/openai-responses-shared.js +2 -2
  166. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  167. package/packages/pi-ai/dist/providers/provider-capabilities.d.ts +59 -0
  168. package/packages/pi-ai/dist/providers/provider-capabilities.d.ts.map +1 -0
  169. package/packages/pi-ai/dist/providers/provider-capabilities.js +173 -0
  170. package/packages/pi-ai/dist/providers/provider-capabilities.js.map +1 -0
  171. package/packages/pi-ai/dist/providers/provider-capabilities.test.d.ts +2 -0
  172. package/packages/pi-ai/dist/providers/provider-capabilities.test.d.ts.map +1 -0
  173. package/packages/pi-ai/dist/providers/provider-capabilities.test.js +132 -0
  174. package/packages/pi-ai/dist/providers/provider-capabilities.test.js.map +1 -0
  175. package/packages/pi-ai/dist/providers/transform-messages-report.test.d.ts +2 -0
  176. package/packages/pi-ai/dist/providers/transform-messages-report.test.d.ts.map +1 -0
  177. package/packages/pi-ai/dist/providers/transform-messages-report.test.js +172 -0
  178. package/packages/pi-ai/dist/providers/transform-messages-report.test.js.map +1 -0
  179. package/packages/pi-ai/dist/providers/transform-messages.d.ts +34 -1
  180. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  181. package/packages/pi-ai/dist/providers/transform-messages.js +73 -2
  182. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  183. package/packages/pi-ai/src/index.ts +3 -0
  184. package/packages/pi-ai/src/providers/amazon-bedrock.ts +2 -2
  185. package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -2
  186. package/packages/pi-ai/src/providers/google-shared.ts +2 -2
  187. package/packages/pi-ai/src/providers/mistral.ts +2 -2
  188. package/packages/pi-ai/src/providers/openai-completions.ts +2 -2
  189. package/packages/pi-ai/src/providers/openai-responses-shared.ts +2 -2
  190. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +174 -0
  191. package/packages/pi-ai/src/providers/provider-capabilities.ts +215 -0
  192. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +189 -0
  193. package/packages/pi-ai/src/providers/transform-messages.ts +94 -1
  194. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  195. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/extensions/loader.js +10 -1
  199. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  200. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
  201. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/extensions/runner.js +15 -0
  203. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -0
  205. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +1 -0
  208. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  210. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.d.ts +27 -0
  212. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.d.ts.map +1 -0
  213. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js +69 -0
  214. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js.map +1 -0
  215. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  216. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/index.js +3 -1
  218. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  219. package/packages/pi-coding-agent/package.json +1 -1
  220. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  221. package/packages/pi-coding-agent/src/core/extensions/loader.ts +11 -1
  222. package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
  223. package/packages/pi-coding-agent/src/core/extensions/types.ts +45 -0
  224. package/packages/pi-coding-agent/src/core/tools/index.ts +7 -0
  225. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +83 -0
  226. package/packages/pi-coding-agent/src/index.ts +9 -0
  227. package/pkg/package.json +1 -1
  228. package/src/resources/extensions/gsd/auto-model-selection.ts +36 -4
  229. package/src/resources/extensions/gsd/auto.ts +8 -2
  230. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -0
  231. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -5
  232. package/src/resources/extensions/gsd/guided-flow.ts +22 -84
  233. package/src/resources/extensions/gsd/model-router.ts +117 -10
  234. package/src/resources/extensions/gsd/preferences-types.ts +3 -1
  235. package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
  236. package/src/resources/extensions/gsd/templates/context.md +34 -2
  237. package/src/resources/extensions/gsd/tests/capability-router.test.ts +31 -7
  238. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -1
  239. package/src/resources/extensions/gsd/tests/model-router.test.ts +2 -2
  240. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +37 -0
  241. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +199 -0
  242. package/src/resources/extensions/gsd/tests/write-gate.test.ts +13 -16
  243. package/dist/resources/extensions/gsd/prompt-validation.js +0 -67
  244. package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +0 -424
  245. package/dist/resources/extensions/gsd/templates/context-enhanced.md +0 -138
  246. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  247. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  249. package/src/resources/extensions/gsd/prompt-validation.ts +0 -88
  250. package/src/resources/extensions/gsd/prompts/discuss-prepared.md +0 -424
  251. package/src/resources/extensions/gsd/templates/context-enhanced.md +0 -138
  252. package/src/resources/extensions/gsd/tests/adversarial-review-fixes.test.ts +0 -223
  253. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +0 -53
  254. package/src/resources/extensions/gsd/tests/integration-prepared-discussion.test.ts +0 -525
  255. package/src/resources/extensions/gsd/tests/preparation.test.ts +0 -1211
  256. package/src/resources/extensions/gsd/tests/prompt-builder.test.ts +0 -669
  257. /package/dist/web/standalone/.next/static/{ka3ShQTakcliYL-EXRRb6 → 3HMOXcBoys84RYd2F8a79}/_buildManifest.js +0 -0
  258. /package/dist/web/standalone/.next/static/{ka3ShQTakcliYL-EXRRb6 → 3HMOXcBoys84RYd2F8a79}/_ssgManifest.js +0 -0
@@ -0,0 +1,215 @@
1
+ // GSD-2 — Provider Capabilities Registry (ADR-005 Phase 1)
2
+ // Declarative registry of what each API provider supports, consolidating
3
+ // scattered knowledge from *-shared.ts files into a queryable data structure.
4
+
5
+ import type { Api } from "../types.js";
6
+
7
+ // ─── Types ──────────────────────────────────────────────────────────────────
8
+
9
+ /**
10
+ * Declarative capability profile for an API provider.
11
+ * Used by the model router to filter incompatible models and by the tool
12
+ * system to adjust tool sets per provider.
13
+ */
14
+ export interface ProviderCapabilities {
15
+ /** Whether models from this provider support tool/function calling */
16
+ toolCalling: boolean;
17
+ /** Maximum number of tools the provider handles well (0 = unlimited) */
18
+ maxTools: number;
19
+ /** Whether tool results can contain images */
20
+ imageToolResults: boolean;
21
+ /** Whether the provider supports structured JSON output */
22
+ structuredOutput: boolean;
23
+ /** Tool call ID format constraints */
24
+ toolCallIdFormat: {
25
+ maxLength: number;
26
+ allowedChars: RegExp;
27
+ };
28
+ /** Whether thinking/reasoning blocks are preserved cross-turn */
29
+ thinkingPersistence: "full" | "text-only" | "none";
30
+ /** Schema features NOT supported (tools using these get filtered) */
31
+ unsupportedSchemaFeatures: string[];
32
+ }
33
+
34
+ // ─── Registry ───────────────────────────────────────────────────────────────
35
+
36
+ /**
37
+ * Built-in provider capability profiles.
38
+ *
39
+ * Sources (consolidated from scattered *-shared.ts files):
40
+ * - anthropic-shared.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])
41
+ * - openai-responses-shared.ts: ID normalization (64-char, fc_ prefix), image-in-tool-result workaround
42
+ * - google-shared.ts: sanitizeSchemaForGoogle (patternProperties, const), requiresToolCallId
43
+ * - mistral.ts: MISTRAL_TOOL_CALL_ID_LENGTH = 9
44
+ * - amazon-bedrock.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])
45
+ */
46
+ export const PROVIDER_CAPABILITIES: Record<string, ProviderCapabilities> = {
47
+ "anthropic-messages": {
48
+ toolCalling: true,
49
+ maxTools: 0,
50
+ imageToolResults: true,
51
+ structuredOutput: true,
52
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
53
+ thinkingPersistence: "full",
54
+ unsupportedSchemaFeatures: [],
55
+ },
56
+ "anthropic-vertex": {
57
+ toolCalling: true,
58
+ maxTools: 0,
59
+ imageToolResults: true,
60
+ structuredOutput: true,
61
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
62
+ thinkingPersistence: "full",
63
+ unsupportedSchemaFeatures: [],
64
+ },
65
+ "openai-responses": {
66
+ toolCalling: true,
67
+ maxTools: 0,
68
+ imageToolResults: false, // images sent as separate user message, not in tool result
69
+ structuredOutput: true,
70
+ toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },
71
+ thinkingPersistence: "text-only",
72
+ unsupportedSchemaFeatures: [],
73
+ },
74
+ "azure-openai-responses": {
75
+ toolCalling: true,
76
+ maxTools: 0,
77
+ imageToolResults: false,
78
+ structuredOutput: true,
79
+ toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },
80
+ thinkingPersistence: "text-only",
81
+ unsupportedSchemaFeatures: [],
82
+ },
83
+ "openai-codex-responses": {
84
+ toolCalling: true,
85
+ maxTools: 0,
86
+ imageToolResults: false,
87
+ structuredOutput: true,
88
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
89
+ thinkingPersistence: "text-only",
90
+ unsupportedSchemaFeatures: [],
91
+ },
92
+ "openai-completions": {
93
+ toolCalling: true,
94
+ maxTools: 0,
95
+ imageToolResults: false,
96
+ structuredOutput: true,
97
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
98
+ thinkingPersistence: "text-only",
99
+ unsupportedSchemaFeatures: [],
100
+ },
101
+ "google-generative-ai": {
102
+ toolCalling: true,
103
+ maxTools: 0,
104
+ imageToolResults: true,
105
+ structuredOutput: true,
106
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
107
+ thinkingPersistence: "text-only",
108
+ unsupportedSchemaFeatures: ["patternProperties", "const"],
109
+ },
110
+ "google-gemini-cli": {
111
+ toolCalling: true,
112
+ maxTools: 0,
113
+ imageToolResults: true,
114
+ structuredOutput: true,
115
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
116
+ thinkingPersistence: "text-only",
117
+ unsupportedSchemaFeatures: ["patternProperties", "const"],
118
+ },
119
+ "google-vertex": {
120
+ toolCalling: true,
121
+ maxTools: 0,
122
+ imageToolResults: true,
123
+ structuredOutput: true,
124
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
125
+ thinkingPersistence: "text-only",
126
+ unsupportedSchemaFeatures: ["patternProperties", "const"],
127
+ },
128
+ "mistral-conversations": {
129
+ toolCalling: true,
130
+ maxTools: 0,
131
+ imageToolResults: false,
132
+ structuredOutput: true,
133
+ toolCallIdFormat: { maxLength: 9, allowedChars: /^[a-zA-Z0-9]+$/ },
134
+ thinkingPersistence: "none",
135
+ unsupportedSchemaFeatures: [],
136
+ },
137
+ "bedrock-converse-stream": {
138
+ toolCalling: true,
139
+ maxTools: 0,
140
+ imageToolResults: true, // Bedrock supports image content blocks in tool results
141
+ structuredOutput: true,
142
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
143
+ thinkingPersistence: "text-only",
144
+ unsupportedSchemaFeatures: [],
145
+ },
146
+ "ollama-chat": {
147
+ toolCalling: true,
148
+ maxTools: 0,
149
+ imageToolResults: false,
150
+ structuredOutput: false,
151
+ toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },
152
+ thinkingPersistence: "none",
153
+ unsupportedSchemaFeatures: [],
154
+ },
155
+ };
156
+
157
+ // ─── Default (permissive) profile for unknown providers ─────────────────────
158
+
159
+ const DEFAULT_CAPABILITIES: ProviderCapabilities = {
160
+ toolCalling: true,
161
+ maxTools: 0,
162
+ imageToolResults: true,
163
+ structuredOutput: true,
164
+ toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },
165
+ thinkingPersistence: "text-only",
166
+ unsupportedSchemaFeatures: [],
167
+ };
168
+
169
+ // ─── Public API ─────────────────────────────────────────────────────────────
170
+
171
+ /**
172
+ * Get capabilities for a provider API. Returns a permissive default for
173
+ * unknown providers (preserving existing behavior per ADR-005 principle 5).
174
+ */
175
+ export function getProviderCapabilities(api: string): ProviderCapabilities {
176
+ return PROVIDER_CAPABILITIES[api] ?? DEFAULT_CAPABILITIES;
177
+ }
178
+
179
+ /**
180
+ * Check if a provider supports all required schema features.
181
+ * Returns the list of unsupported features (empty if all supported).
182
+ */
183
+ export function getUnsupportedFeatures(api: string, requiredFeatures: string[]): string[] {
184
+ const caps = getProviderCapabilities(api);
185
+ return requiredFeatures.filter(f => caps.unsupportedSchemaFeatures.includes(f));
186
+ }
187
+
188
+ /**
189
+ * Deep-merge user-provided capability overrides with built-in defaults.
190
+ * Partial overrides merge with the built-in profile for the given API.
191
+ */
192
+ export function mergeCapabilityOverrides(
193
+ api: string,
194
+ overrides: Partial<Omit<ProviderCapabilities, "toolCallIdFormat">> & {
195
+ toolCallIdFormat?: Partial<ProviderCapabilities["toolCallIdFormat"]>;
196
+ },
197
+ ): ProviderCapabilities {
198
+ const base = getProviderCapabilities(api);
199
+ return {
200
+ ...base,
201
+ ...overrides,
202
+ toolCallIdFormat: overrides.toolCallIdFormat
203
+ ? { ...base.toolCallIdFormat, ...overrides.toolCallIdFormat }
204
+ : base.toolCallIdFormat,
205
+ };
206
+ }
207
+
208
+ /**
209
+ * Get all registered API names in the capability registry.
210
+ * Used by lint rules to verify all providers in register-builtins.ts
211
+ * have corresponding capability entries.
212
+ */
213
+ export function getRegisteredApis(): string[] {
214
+ return Object.keys(PROVIDER_CAPABILITIES);
215
+ }
@@ -0,0 +1,189 @@
1
+ // GSD-2 — ProviderSwitchReport Tests (ADR-005 Phase 3)
2
+ import { describe, test } from "node:test";
3
+ import assert from "node:assert/strict";
4
+
5
+ import { transformMessages, createEmptyReport, hasTransformations } from "./transform-messages.js";
6
+ import type { ProviderSwitchReport } from "./transform-messages.js";
7
+ import type { Message, Model, AssistantMessage, ToolCall } from "../types.js";
8
+
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+
11
+ function makeModel(overrides: Partial<Model<any>> = {}): Model<any> {
12
+ return {
13
+ id: "claude-sonnet-4-6",
14
+ name: "Claude Sonnet 4.6",
15
+ api: "anthropic-messages",
16
+ provider: "anthropic",
17
+ baseUrl: "",
18
+ reasoning: false,
19
+ input: ["text", "image"],
20
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
21
+ contextWindow: 200000,
22
+ maxTokens: 8192,
23
+ ...overrides,
24
+ } as Model<any>;
25
+ }
26
+
27
+ function makeAssistantMsg(overrides: Partial<AssistantMessage> = {}): AssistantMessage {
28
+ return {
29
+ role: "assistant",
30
+ content: [],
31
+ api: "anthropic-messages",
32
+ provider: "anthropic",
33
+ model: "claude-sonnet-4-6",
34
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
35
+ stopReason: "stop",
36
+ timestamp: Date.now(),
37
+ ...overrides,
38
+ };
39
+ }
40
+
41
+ // ─── createEmptyReport / hasTransformations ─────────────────────────────────
42
+
43
+ describe("createEmptyReport", () => {
44
+ test("creates report with zero counters", () => {
45
+ const report = createEmptyReport("anthropic-messages", "openai-responses");
46
+ assert.equal(report.fromApi, "anthropic-messages");
47
+ assert.equal(report.toApi, "openai-responses");
48
+ assert.equal(report.thinkingBlocksDropped, 0);
49
+ assert.equal(report.thinkingBlocksDowngraded, 0);
50
+ assert.equal(report.toolCallIdsRemapped, 0);
51
+ assert.equal(report.syntheticToolResultsInserted, 0);
52
+ assert.equal(report.thoughtSignaturesDropped, 0);
53
+ });
54
+ });
55
+
56
+ describe("hasTransformations", () => {
57
+ test("returns false for empty report", () => {
58
+ const report = createEmptyReport("a", "b");
59
+ assert.equal(hasTransformations(report), false);
60
+ });
61
+
62
+ test("returns true when any counter is non-zero", () => {
63
+ const report = createEmptyReport("a", "b");
64
+ report.thinkingBlocksDropped = 1;
65
+ assert.equal(hasTransformations(report), true);
66
+ });
67
+ });
68
+
69
+ // ─── Report Tracking in transformMessages ───────────────────────────────────
70
+
71
+ describe("transformMessages with report tracking", () => {
72
+ test("tracks thinking blocks dropped for redacted cross-model", () => {
73
+ const model = makeModel({ id: "gpt-5", api: "openai-responses", provider: "openai" });
74
+ const messages: Message[] = [
75
+ makeAssistantMsg({
76
+ content: [
77
+ { type: "thinking", thinking: "", redacted: true },
78
+ { type: "text", text: "Hello" },
79
+ ],
80
+ }),
81
+ ];
82
+ const report = createEmptyReport("anthropic-messages", "openai-responses");
83
+ transformMessages(messages, model, undefined, report);
84
+ assert.equal(report.thinkingBlocksDropped, 1);
85
+ });
86
+
87
+ test("tracks thinking blocks downgraded to plain text", () => {
88
+ const model = makeModel({ id: "gpt-5", api: "openai-responses", provider: "openai" });
89
+ const messages: Message[] = [
90
+ makeAssistantMsg({
91
+ content: [
92
+ { type: "thinking", thinking: "Let me think about this..." },
93
+ { type: "text", text: "Here is my answer" },
94
+ ],
95
+ }),
96
+ ];
97
+ const report = createEmptyReport("anthropic-messages", "openai-responses");
98
+ transformMessages(messages, model, undefined, report);
99
+ assert.equal(report.thinkingBlocksDowngraded, 1);
100
+ });
101
+
102
+ test("tracks tool call IDs remapped", () => {
103
+ const model = makeModel({ id: "claude-sonnet-4-6", api: "anthropic-messages", provider: "anthropic" });
104
+ const toolCall: ToolCall = {
105
+ type: "toolCall",
106
+ id: "original-long-id-that-needs-normalization|with-special-chars",
107
+ name: "bash",
108
+ arguments: { command: "ls" },
109
+ };
110
+ const messages: Message[] = [
111
+ makeAssistantMsg({
112
+ provider: "openai",
113
+ api: "openai-responses",
114
+ model: "gpt-5",
115
+ content: [toolCall],
116
+ }),
117
+ ];
118
+ const normalizer = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 64);
119
+ const report = createEmptyReport("openai-responses", "anthropic-messages");
120
+ transformMessages(messages, model, normalizer, report);
121
+ assert.equal(report.toolCallIdsRemapped, 1);
122
+ });
123
+
124
+ test("tracks thought signatures dropped", () => {
125
+ const model = makeModel({ id: "claude-sonnet-4-6", api: "anthropic-messages", provider: "anthropic" });
126
+ const toolCall: ToolCall = {
127
+ type: "toolCall",
128
+ id: "tc_001",
129
+ name: "bash",
130
+ arguments: { command: "ls" },
131
+ thoughtSignature: "some-opaque-signature",
132
+ };
133
+ const messages: Message[] = [
134
+ makeAssistantMsg({
135
+ provider: "google",
136
+ api: "google-generative-ai",
137
+ model: "gemini-2.5-pro",
138
+ content: [toolCall],
139
+ }),
140
+ ];
141
+ const report = createEmptyReport("google-generative-ai", "anthropic-messages");
142
+ transformMessages(messages, model, undefined, report);
143
+ assert.equal(report.thoughtSignaturesDropped, 1);
144
+ });
145
+
146
+ test("tracks synthetic tool results inserted", () => {
147
+ const model = makeModel();
148
+ const toolCall: ToolCall = {
149
+ type: "toolCall",
150
+ id: "tc_orphan",
151
+ name: "bash",
152
+ arguments: { command: "ls" },
153
+ };
154
+ // Assistant message with tool call followed by another assistant (no tool result)
155
+ const messages: Message[] = [
156
+ makeAssistantMsg({ content: [toolCall, { type: "text", text: "Using bash" }] }),
157
+ makeAssistantMsg({ content: [{ type: "text", text: "Next message" }] }),
158
+ ];
159
+ const report = createEmptyReport("anthropic-messages", "anthropic-messages");
160
+ transformMessages(messages, model, undefined, report);
161
+ assert.equal(report.syntheticToolResultsInserted, 1);
162
+ });
163
+
164
+ test("does not count transformations for same-model messages", () => {
165
+ const model = makeModel();
166
+ const messages: Message[] = [
167
+ makeAssistantMsg({
168
+ content: [
169
+ { type: "thinking", thinking: "Let me think..." },
170
+ { type: "text", text: "Answer" },
171
+ ],
172
+ }),
173
+ ];
174
+ const report = createEmptyReport("anthropic-messages", "anthropic-messages");
175
+ transformMessages(messages, model, undefined, report);
176
+ assert.equal(report.thinkingBlocksDowngraded, 0);
177
+ assert.equal(report.thinkingBlocksDropped, 0);
178
+ });
179
+
180
+ test("works without report parameter (backward compatible)", () => {
181
+ const model = makeModel();
182
+ const messages: Message[] = [
183
+ makeAssistantMsg({ content: [{ type: "text", text: "Hello" }] }),
184
+ ];
185
+ // Should not throw
186
+ const result = transformMessages(messages, model);
187
+ assert.ok(Array.isArray(result));
188
+ });
189
+ });
@@ -1,5 +1,87 @@
1
1
  import type { Api, AssistantMessage, Message, Model, ToolCall, ToolResultMessage } from "../types.js";
2
2
 
3
+ /**
4
+ * Report of context transformations during a cross-provider switch (ADR-005 Phase 3).
5
+ * Tracks what was lost or downgraded when replaying conversation history to a different provider.
6
+ */
7
+ export interface ProviderSwitchReport {
8
+ /** API of the messages being transformed from */
9
+ fromApi: string;
10
+ /** API of the target model */
11
+ toApi: string;
12
+ /** Number of thinking blocks completely dropped (redacted/encrypted, cross-model) */
13
+ thinkingBlocksDropped: number;
14
+ /** Number of thinking blocks downgraded from structured to plain text */
15
+ thinkingBlocksDowngraded: number;
16
+ /** Number of tool call IDs that were remapped/normalized */
17
+ toolCallIdsRemapped: number;
18
+ /** Number of synthetic tool results inserted for orphaned tool calls */
19
+ syntheticToolResultsInserted: number;
20
+ /** Number of thought signatures dropped (Google-specific opaque context) */
21
+ thoughtSignaturesDropped: number;
22
+ }
23
+
24
+ /**
25
+ * Create an empty provider switch report.
26
+ */
27
+ export function createEmptyReport(fromApi: string, toApi: string): ProviderSwitchReport {
28
+ return {
29
+ fromApi,
30
+ toApi,
31
+ thinkingBlocksDropped: 0,
32
+ thinkingBlocksDowngraded: 0,
33
+ toolCallIdsRemapped: 0,
34
+ syntheticToolResultsInserted: 0,
35
+ thoughtSignaturesDropped: 0,
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Check if a provider switch report has any non-zero transformations.
41
+ */
42
+ export function hasTransformations(report: ProviderSwitchReport): boolean {
43
+ return (
44
+ report.thinkingBlocksDropped > 0 ||
45
+ report.thinkingBlocksDowngraded > 0 ||
46
+ report.toolCallIdsRemapped > 0 ||
47
+ report.syntheticToolResultsInserted > 0 ||
48
+ report.thoughtSignaturesDropped > 0
49
+ );
50
+ }
51
+
52
+ /**
53
+ * Create a report, run transformMessages, and log if non-empty.
54
+ * Convenience wrapper for provider adapters (ADR-005).
55
+ */
56
+ export function transformMessagesWithReport<TApi extends Api>(
57
+ messages: Message[],
58
+ model: Model<TApi>,
59
+ normalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string,
60
+ sourceApi?: string,
61
+ ): Message[] {
62
+ const report = createEmptyReport(sourceApi ?? "unknown", model.api);
63
+ const result = transformMessages(messages, model, normalizeToolCallId, report);
64
+ if (hasTransformations(report)) {
65
+ logProviderSwitchReport(report);
66
+ }
67
+ return result;
68
+ }
69
+
70
+ /** Log a non-empty ProviderSwitchReport as a debug-level warning. */
71
+ function logProviderSwitchReport(report: ProviderSwitchReport): void {
72
+ const parts: string[] = [`Provider switch ${report.fromApi} → ${report.toApi}:`];
73
+ if (report.thinkingBlocksDropped > 0) parts.push(`${report.thinkingBlocksDropped} thinking blocks dropped`);
74
+ if (report.thinkingBlocksDowngraded > 0) parts.push(`${report.thinkingBlocksDowngraded} thinking blocks downgraded`);
75
+ if (report.toolCallIdsRemapped > 0) parts.push(`${report.toolCallIdsRemapped} tool call IDs remapped`);
76
+ if (report.syntheticToolResultsInserted > 0) parts.push(`${report.syntheticToolResultsInserted} synthetic tool results inserted`);
77
+ if (report.thoughtSignaturesDropped > 0) parts.push(`${report.thoughtSignaturesDropped} thought signatures dropped`);
78
+ // Use process.stderr for debug output — this is observable in verbose/debug modes
79
+ // without polluting stdout which may be used for structured output (RPC/MCP).
80
+ if (process.env.GSD_VERBOSE === "1" || process.env.PI_VERBOSE === "1") {
81
+ process.stderr.write(`[provider-switch] ${parts.join(", ")}\n`);
82
+ }
83
+ }
84
+
3
85
  /**
4
86
  * Normalize tool call ID for cross-provider compatibility.
5
87
  * OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.
@@ -9,6 +91,7 @@ export function transformMessages<TApi extends Api>(
9
91
  messages: Message[],
10
92
  model: Model<TApi>,
11
93
  normalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string,
94
+ report?: ProviderSwitchReport,
12
95
  ): Message[] {
13
96
  // Build a map of original tool call IDs to normalized IDs
14
97
  const toolCallIdMap = new Map<string, string>();
@@ -42,14 +125,20 @@ export function transformMessages<TApi extends Api>(
42
125
  // Redacted thinking is opaque encrypted content, only valid for the same model.
43
126
  // Drop it for cross-model to avoid API errors.
44
127
  if (block.redacted) {
128
+ if (!isSameModel && report) report.thinkingBlocksDropped++;
45
129
  return isSameModel ? block : [];
46
130
  }
47
131
  // For same model: keep thinking blocks with signatures (needed for replay)
48
132
  // even if the thinking text is empty (OpenAI encrypted reasoning)
49
133
  if (isSameModel && block.thinkingSignature) return block;
50
134
  // Skip empty thinking blocks, convert others to plain text
51
- if (!block.thinking || block.thinking.trim() === "") return [];
135
+ if (!block.thinking || block.thinking.trim() === "") {
136
+ if (!isSameModel && report) report.thinkingBlocksDropped++;
137
+ return [];
138
+ }
52
139
  if (isSameModel) return block;
140
+ // Downgrade: structured thinking → plain text
141
+ if (report) report.thinkingBlocksDowngraded++;
53
142
  return {
54
143
  type: "text" as const,
55
144
  text: block.thinking,
@@ -71,6 +160,7 @@ export function transformMessages<TApi extends Api>(
71
160
  if (!isSameModel && toolCall.thoughtSignature) {
72
161
  normalizedToolCall = { ...toolCall };
73
162
  delete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;
163
+ if (report) report.thoughtSignaturesDropped++;
74
164
  }
75
165
 
76
166
  if (!isSameModel && normalizeToolCallId) {
@@ -78,6 +168,7 @@ export function transformMessages<TApi extends Api>(
78
168
  if (normalizedId !== toolCall.id) {
79
169
  toolCallIdMap.set(toolCall.id, normalizedId);
80
170
  normalizedToolCall = { ...normalizedToolCall, id: normalizedId };
171
+ if (report) report.toolCallIdsRemapped++;
81
172
  }
82
173
  }
83
174
 
@@ -117,6 +208,7 @@ export function transformMessages<TApi extends Api>(
117
208
  isError: true,
118
209
  timestamp: Date.now(),
119
210
  } as ToolResultMessage);
211
+ if (report) report.syntheticToolResultsInserted++;
120
212
  }
121
213
  }
122
214
  pendingToolCalls = [];
@@ -157,6 +249,7 @@ export function transformMessages<TApi extends Api>(
157
249
  isError: true,
158
250
  timestamp: Date.now(),
159
251
  } as ToolResultMessage);
252
+ if (report) report.syntheticToolResultsInserted++;
160
253
  }
161
254
  }
162
255
  pendingToolCalls = [];
@@ -9,7 +9,7 @@ export type { SlashCommandInfo, SlashCommandLocation, SlashCommandSource } from
9
9
  export { createExtensionRuntime, discoverAndLoadExtensions, getUntrustedExtensionPaths, importExtensionModule, isProjectTrusted, loadExtensionFromFactory, loadExtensions, trustProject, } from "./loader.js";
10
10
  export type { ExtensionErrorListener, ForkHandler, NavigateTreeHandler, NewSessionHandler, ShutdownHandler, SwitchSessionHandler, } from "./runner.js";
11
11
  export { ExtensionRunner } from "./runner.js";
12
- export type { AgentEndEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppAction, BashToolCallEvent, BashToolResultEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, CompactOptions, ContextEvent, ContextEventResult, ContextUsage, CustomToolCallEvent, CustomToolResultEvent, EditToolCallEvent, EditToolResultEvent, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, FindToolResultEvent, GrepToolCallEvent, GrepToolResultEvent, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, LsToolResultEvent, MessageEndEvent, MessageRenderer, MessageRenderOptions, MessageStartEvent, MessageUpdateEvent, ModelSelectEvent, ModelSelectSource, ProviderConfig, ProviderModelConfig, LifecycleHookContext, LifecycleHookHandler, LifecycleHookMap, LifecycleHookPhase, LifecycleHookScope, ReadToolCallEvent, ReadToolResultEvent, RegisteredCommand, RegisteredTool, ResourcesDiscoverEvent, ResourcesDiscoverResult, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionCompactEvent, SessionDirectoryEvent, SessionDirectoryHandler, SessionDirectoryResult, SessionEvent, SessionForkEvent, SessionShutdownEvent, SessionStartEvent, SessionSwitchEvent, SessionTreeEvent, TerminalInputHandler, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TreePreparation, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, BashTransformEvent, BashTransformEventResult, WidgetPlacement, WriteToolCallEvent, WriteToolResultEvent, } from "./types.js";
12
+ export type { AgentEndEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppAction, BashToolCallEvent, BashToolResultEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, CompactOptions, AdjustToolSetEvent, AdjustToolSetResult, ContextEvent, ContextEventResult, ContextUsage, CustomToolCallEvent, CustomToolResultEvent, EditToolCallEvent, EditToolResultEvent, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, FindToolResultEvent, GrepToolCallEvent, GrepToolResultEvent, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, LsToolResultEvent, MessageEndEvent, MessageRenderer, MessageRenderOptions, MessageStartEvent, MessageUpdateEvent, ModelSelectEvent, ModelSelectSource, ProviderConfig, ProviderModelConfig, LifecycleHookContext, LifecycleHookHandler, LifecycleHookMap, LifecycleHookPhase, LifecycleHookScope, ReadToolCallEvent, ReadToolResultEvent, RegisteredCommand, RegisteredTool, ResourcesDiscoverEvent, ResourcesDiscoverResult, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionCompactEvent, SessionDirectoryEvent, SessionDirectoryHandler, SessionDirectoryResult, SessionEvent, SessionForkEvent, SessionShutdownEvent, SessionStartEvent, SessionSwitchEvent, SessionTreeEvent, TerminalInputHandler, ToolCallEvent, ToolCallEventResult, ToolCompatibility, ToolDefinition, ToolExecutionEndEvent, ToolExecutionStartEvent, ToolExecutionUpdateEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TreePreparation, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, BashTransformEvent, BashTransformEventResult, WidgetPlacement, WriteToolCallEvent, WriteToolResultEvent, } from "./types.js";
13
13
  export { isToolCallEventType, isToolResultEventType } from "./types.js";
14
14
  export { wrapRegisteredTool, wrapRegisteredTools, wrapToolsWithExtensions, wrapToolWithExtensions, } from "./wrapper.js";
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,YAAY,GACZ,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmI9C,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { ExtensionManifest } from \"./extension-manifest.js\";\nexport { readManifest, readManifestFromEntryPath } from \"./extension-manifest.js\";\nexport type { SortResult, SortWarning } from \"./extension-sort.js\";\nexport { sortExtensionPaths } from \"./extension-sort.js\";\nexport type { SlashCommandInfo, SlashCommandLocation, SlashCommandSource } from \"../slash-commands.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tgetUntrustedExtensionPaths,\n\timportExtensionModule,\n\tisProjectTrusted,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n\ttrustProject,\n} from \"./loader.js\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.js\";\nexport { ExtensionRunner } from \"./runner.js\";\nexport type {\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\t// App keybindings (for custom editors)\n\tAppAction,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tLifecycleHookContext,\n\tLifecycleHookHandler,\n\tLifecycleHookMap,\n\tLifecycleHookPhase,\n\tLifecycleHookScope,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionDirectoryEvent,\n\tSessionDirectoryHandler,\n\tSessionDirectoryResult,\n\tSessionEvent,\n\tSessionForkEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionSwitchEvent,\n\tSessionTreeEvent,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - User Bash\n\tUserBashEvent,\n\tUserBashEventResult,\n\tBashTransformEvent,\n\tBashTransformEventResult,\n\tWidgetPlacement,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.js\";\n// Type guards\nexport { isToolCallEventType, isToolResultEventType } from \"./types.js\";\nexport {\n\twrapRegisteredTool,\n\twrapRegisteredTools,\n\twrapToolsWithExtensions,\n\twrapToolWithExtensions,\n} from \"./wrapper.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,YAAY,GACZ,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuI9C,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { ExtensionManifest } from \"./extension-manifest.js\";\nexport { readManifest, readManifestFromEntryPath } from \"./extension-manifest.js\";\nexport type { SortResult, SortWarning } from \"./extension-sort.js\";\nexport { sortExtensionPaths } from \"./extension-sort.js\";\nexport type { SlashCommandInfo, SlashCommandLocation, SlashCommandSource } from \"../slash-commands.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tgetUntrustedExtensionPaths,\n\timportExtensionModule,\n\tisProjectTrusted,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n\ttrustProject,\n} from \"./loader.js\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.js\";\nexport { ExtensionRunner } from \"./runner.js\";\nexport type {\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\t// App keybindings (for custom editors)\n\tAppAction,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\t// Context\n\tCompactOptions,\n\t// Events - Adjust Tool Set (ADR-005)\n\tAdjustToolSetEvent,\n\tAdjustToolSetResult,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tLifecycleHookContext,\n\tLifecycleHookHandler,\n\tLifecycleHookMap,\n\tLifecycleHookPhase,\n\tLifecycleHookScope,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionDirectoryEvent,\n\tSessionDirectoryHandler,\n\tSessionDirectoryResult,\n\tSessionEvent,\n\tSessionForkEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionSwitchEvent,\n\tSessionTreeEvent,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolCompatibility,\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - User Bash\n\tUserBashEvent,\n\tUserBashEventResult,\n\tBashTransformEvent,\n\tBashTransformEventResult,\n\tWidgetPlacement,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.js\";\n// Type guards\nexport { isToolCallEventType, isToolResultEventType } from \"./types.js\";\nexport {\n\twrapRegisteredTool,\n\twrapRegisteredTools,\n\twrapToolsWithExtensions,\n\twrapToolWithExtensions,\n} from \"./wrapper.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAEhB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAsTpB,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAI/G;AA6BD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAqCzD;AAsLD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAeD;;;;;GAKG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAwKD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AAmHD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAEhB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAsTpB,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAI/G;AA6BD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAsCzD;AA8LD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAeD;;;;;GAKG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAwKD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AAmHD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B"}
@@ -35,6 +35,7 @@ import { createEventBus } from "../event-bus.js";
35
35
  import { execCommand } from "../exec.js";
36
36
  import { getUntrustedExtensionPaths } from "./project-trust.js";
37
37
  export { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from "./project-trust.js";
38
+ import { registerToolCompatibility } from "../tools/tool-compatibility-registry.js";
38
39
  /**
39
40
  * Statically imported modules for Bun binary virtualModules.
40
41
  * Maps specifier -> module object for subpaths that must be available in compiled binaries.
@@ -375,8 +376,9 @@ export function createExtensionRuntime() {
375
376
  unregisterProvider: (name) => {
376
377
  runtime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);
377
378
  },
378
- // Stub replaced by ExtensionRunner at construction time via bindEmitMethods().
379
+ // Stubs replaced by ExtensionRunner at construction time via bindEmitMethods().
379
380
  emitBeforeModelSelect: async () => undefined,
381
+ emitAdjustToolSet: async () => undefined,
380
382
  };
381
383
  return runtime;
382
384
  }
@@ -398,6 +400,10 @@ function createExtensionAPI(extension, runtime, cwd, eventBus) {
398
400
  definition: tool,
399
401
  extensionPath: extension.path,
400
402
  });
403
+ // ADR-005: auto-register tool compatibility metadata
404
+ if (tool.compatibility) {
405
+ registerToolCompatibility(tool.name, tool.compatibility);
406
+ }
401
407
  runtime.refreshTools();
402
408
  },
403
409
  registerCommand(name, options) {
@@ -488,6 +494,9 @@ function createExtensionAPI(extension, runtime, cwd, eventBus) {
488
494
  async emitBeforeModelSelect(event) {
489
495
  return runtime.emitBeforeModelSelect(event);
490
496
  },
497
+ async emitAdjustToolSet(event) {
498
+ return runtime.emitAdjustToolSet(event);
499
+ },
491
500
  events: eventBus,
492
501
  };
493
502
  return api;