@code-yeongyu/senpi 2026.8.11-2 → 2026.8.11-3

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 (256) hide show
  1. package/CHANGELOG.md +66 -1
  2. package/dist/cli-main.d.ts +1 -1
  3. package/dist/cli-main.d.ts.map +1 -1
  4. package/dist/cli-main.js +1 -0
  5. package/dist/cli-main.js.map +1 -1
  6. package/dist/cli.d.ts +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +1 -0
  9. package/dist/cli.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +8 -2
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +63 -7
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +2 -0
  15. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -0
  16. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +24 -0
  17. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -0
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js +5 -2
  21. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +6 -1
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +16 -0
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
  26. package/dist/core/extensions/builtin/goal/transitions.js +2 -1
  27. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -1
  28. package/dist/core/extensions/builtin/imagegen/auth.d.ts +45 -0
  29. package/dist/core/extensions/builtin/imagegen/auth.d.ts.map +1 -0
  30. package/dist/core/extensions/builtin/imagegen/auth.js +137 -0
  31. package/dist/core/extensions/builtin/imagegen/auth.js.map +1 -0
  32. package/dist/core/extensions/builtin/imagegen/index.d.ts +5 -0
  33. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -0
  34. package/dist/core/extensions/builtin/imagegen/index.js +46 -0
  35. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -0
  36. package/dist/core/extensions/builtin/imagegen/paths.d.ts +26 -0
  37. package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -0
  38. package/dist/core/extensions/builtin/imagegen/paths.js +52 -0
  39. package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -0
  40. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +67 -0
  41. package/dist/core/extensions/builtin/imagegen/state.d.ts +26 -0
  42. package/dist/core/extensions/builtin/imagegen/state.d.ts.map +1 -0
  43. package/dist/core/extensions/builtin/imagegen/state.js +35 -0
  44. package/dist/core/extensions/builtin/imagegen/state.js.map +1 -0
  45. package/dist/core/extensions/builtin/imagegen/tool.d.ts +31 -0
  46. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -0
  47. package/dist/core/extensions/builtin/imagegen/tool.js +174 -0
  48. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -0
  49. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/index.js +9 -1
  51. package/dist/core/extensions/builtin/index.js.map +1 -1
  52. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts +14 -0
  53. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts.map +1 -0
  54. package/dist/core/extensions/builtin/mcp/control-inventory.js +22 -0
  55. package/dist/core/extensions/builtin/mcp/control-inventory.js.map +1 -0
  56. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +2 -44
  57. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/mcp/expose/native-search.js +3 -97
  59. package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
  60. package/dist/core/extensions/builtin/mcp/expose/proxy.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/mcp/expose/proxy.js +15 -4
  62. package/dist/core/extensions/builtin/mcp/expose/proxy.js.map +1 -1
  63. package/dist/core/extensions/builtin/mcp/expose/session.d.ts +2 -1
  64. package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/mcp/expose/session.js +2 -2
  66. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  67. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +13 -11
  68. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +58 -59
  70. package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
  71. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  72. package/dist/core/extensions/builtin/mcp/index.js +28 -36
  73. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  74. package/dist/core/extensions/builtin/mcp/service-register.d.ts +2 -1
  75. package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
  76. package/dist/core/extensions/builtin/mcp/service-register.js +2 -2
  77. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  78. package/dist/core/extensions/builtin/mcp/service-types.d.ts +4 -0
  79. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  81. package/dist/core/extensions/builtin/mcp/service.d.ts +6 -11
  82. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  83. package/dist/core/extensions/builtin/mcp/service.js +79 -41
  84. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  85. package/dist/core/extensions/builtin/mcp/wrap.d.ts +2 -0
  86. package/dist/core/extensions/builtin/mcp/wrap.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/mcp/wrap.js +3 -0
  88. package/dist/core/extensions/builtin/mcp/wrap.js.map +1 -1
  89. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts +27 -0
  90. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/openai-image-gen/externalize.js +133 -0
  92. package/dist/core/extensions/builtin/openai-image-gen/externalize.js.map +1 -0
  93. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts +21 -0
  94. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts.map +1 -0
  95. package/dist/core/extensions/builtin/openai-image-gen/gate.js +63 -0
  96. package/dist/core/extensions/builtin/openai-image-gen/gate.js.map +1 -0
  97. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts +14 -0
  98. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts.map +1 -0
  99. package/dist/core/extensions/builtin/openai-image-gen/index.js +77 -0
  100. package/dist/core/extensions/builtin/openai-image-gen/index.js.map +1 -0
  101. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +15 -0
  102. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -0
  103. package/dist/core/extensions/builtin/openai-image-gen/inject.js +42 -0
  104. package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -0
  105. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/terminal/monitor-notify.js +8 -1
  107. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  108. package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -1
  109. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/terminal/notify.js +4 -1
  111. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  112. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts +22 -0
  113. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts.map +1 -0
  114. package/dist/core/extensions/builtin/{mcp/expose → tool-search/engine}/bm25.js +16 -31
  115. package/dist/core/extensions/builtin/tool-search/engine/bm25.js.map +1 -0
  116. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts +14 -0
  117. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts.map +1 -0
  118. package/dist/core/extensions/builtin/tool-search/engine/document.js +2 -0
  119. package/dist/core/extensions/builtin/tool-search/engine/document.js.map +1 -0
  120. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts +55 -0
  121. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts.map +1 -0
  122. package/dist/core/extensions/builtin/tool-search/engine/marker.js +189 -0
  123. package/dist/core/extensions/builtin/tool-search/engine/marker.js.map +1 -0
  124. package/dist/core/extensions/builtin/tool-search/index.d.ts +7 -0
  125. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -0
  126. package/dist/core/extensions/builtin/tool-search/index.js +71 -0
  127. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -0
  128. package/dist/core/extensions/builtin/tool-search/native-search.d.ts +52 -0
  129. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -0
  130. package/dist/core/extensions/builtin/tool-search/native-search.js +116 -0
  131. package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -0
  132. package/dist/core/extensions/builtin/tool-search/service.d.ts +38 -0
  133. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -0
  134. package/dist/core/extensions/builtin/tool-search/service.js +200 -0
  135. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -0
  136. package/dist/core/extensions/builtin/tool-search/tool.d.ts +21 -0
  137. package/dist/core/extensions/builtin/tool-search/tool.d.ts.map +1 -0
  138. package/dist/core/extensions/builtin/tool-search/tool.js +95 -0
  139. package/dist/core/extensions/builtin/tool-search/tool.js.map +1 -0
  140. package/dist/core/extensions/loader.d.ts.map +1 -1
  141. package/dist/core/extensions/loader.js +3 -0
  142. package/dist/core/extensions/loader.js.map +1 -1
  143. package/dist/core/extensions/types.d.ts +44 -4
  144. package/dist/core/extensions/types.d.ts.map +1 -1
  145. package/dist/core/extensions/types.js +11 -0
  146. package/dist/core/extensions/types.js.map +1 -1
  147. package/dist/core/provider-composer.d.ts +10 -1
  148. package/dist/core/provider-composer.d.ts.map +1 -1
  149. package/dist/core/provider-composer.js +9 -0
  150. package/dist/core/provider-composer.js.map +1 -1
  151. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  152. package/dist/modes/provider-native-rendering.js +33 -0
  153. package/dist/modes/provider-native-rendering.js.map +1 -1
  154. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  155. package/dist/modes/rpc/connection-handler.js +130 -4
  156. package/dist/modes/rpc/connection-handler.js.map +1 -1
  157. package/dist/modes/rpc/rpc-types.d.ts +31 -0
  158. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  159. package/dist/modes/rpc/rpc-types.js.map +1 -1
  160. package/dist/senpi +1 -0
  161. package/dist/valid-cwd.d.ts +2 -0
  162. package/dist/valid-cwd.d.ts.map +1 -0
  163. package/dist/valid-cwd.js +14 -0
  164. package/dist/valid-cwd.js.map +1 -0
  165. package/docs/environment-variables.md +7 -0
  166. package/docs/extensions.md +50 -13
  167. package/docs/mcp.md +2 -0
  168. package/docs/rpc.md +54 -0
  169. package/docs/skills.md +8 -0
  170. package/examples/extensions/searchable-tools.ts +49 -0
  171. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  172. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  173. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  174. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +5 -1
  175. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  176. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +4 -1
  177. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  178. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
  179. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  180. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -0
  181. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  182. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  183. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  184. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  185. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +7 -3
  186. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  187. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +8 -0
  188. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -0
  189. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +222 -0
  190. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -0
  191. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts +3 -0
  192. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts.map +1 -0
  193. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js +10 -0
  194. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js.map +1 -0
  195. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  196. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +113 -4
  197. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  198. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  199. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  200. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  201. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts +5 -0
  202. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  203. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +2 -1
  204. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  205. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +10 -0
  206. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  207. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  208. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +32 -0
  209. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +32 -0
  211. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  212. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  213. package/node_modules/@earendil-works/pi-ai/dist/models.js +36 -13
  214. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  215. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts +2 -0
  216. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts.map +1 -1
  217. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.js.map +1 -1
  218. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  219. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -1
  220. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  221. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  222. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  223. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  224. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  225. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  227. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts +1 -0
  229. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  230. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +18 -0
  231. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  232. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts +3 -0
  233. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts.map +1 -0
  234. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js +16 -0
  235. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js.map +1 -0
  236. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  237. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  238. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  239. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  240. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +7 -0
  241. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  242. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  243. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  244. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  245. package/package.json +8 -8
  246. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts +0 -30
  247. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts.map +0 -1
  248. package/dist/core/extensions/builtin/mcp/expose/bm25.js.map +0 -1
  249. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts +0 -15
  250. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts.map +0 -1
  251. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js +0 -33
  252. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js.map +0 -1
  253. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +0 -43
  254. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +0 -1
  255. package/dist/core/extensions/builtin/mcp/expose/tool-search.js +0 -125
  256. package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"provider-composer.js","sourceRoot":"","sources":["../../src/core/provider-composer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype Credential,\n\tgetApiProvider,\n\tgetProtocol,\n\tgetToolCallFormat,\n\tlazyStream,\n\ttype Model,\n\ttype OAuthAuth,\n\ttype OAuthCredentials,\n\ttype OAuthLoginCallbacks,\n\ttype Provider,\n\ttype ProviderHeaders,\n\ttype RefreshModelsContext,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n\ttransformContext,\n\twrapStreamWithToolCallMiddleware,\n} from \"@earendil-works/pi-ai\";\nimport type { ModelConfig, ModelsJsonModel, ModelsJsonModelOverride, ModelsJsonProvider } from \"./model-config.ts\";\nimport { composeApiKeyAuth, configuredApiKey, configuredHeaders, withConfiguredAuth } from \"./provider-api-key-auth.ts\";\nimport { configuredHeaderAuthStatus, type HeaderAuthStatusSource } from \"./provider-header-auth.ts\";\nimport {\n\tclearConfigValueCache,\n\tgetConfigValueEnvVarNames,\n\tisCommandConfigValue,\n\tisConfigValueConfigured,\n\tresolveHeadersOrThrow,\n} from \"./resolve-config-value.ts\";\n\nexport interface ExtensionOAuthConfig {\n\tname: string;\n\t/** @deprecated Retained for extension source compatibility; ignored by canonical auth flows. */\n\tusesCallbackServer?: boolean;\n\tlogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;\n\trefreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;\n\tgetApiKey(credentials: OAuthCredentials): string;\n\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n}\n\n/** Input type for the extension registerProvider API. */\nexport interface ProviderConfigInput {\n\tname?: string;\n\tbaseUrl?: string;\n\tapiKey?: string;\n\tapi?: Api;\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\theaders?: Record<string, string>;\n\textraBody?: Record<string, unknown>;\n\tauthHeader?: boolean;\n\toauth?: ExtensionOAuthConfig;\n\tmodels?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\tupstreamModelId?: string;\n\t\tserviceTier?: \"auto\" | \"flex\" | \"priority\";\n\t\tpromptPreset?: string;\n\t\trecoverTextToolCalls?: boolean;\n\t\tapi?: Api;\n\t\tbaseUrl?: string;\n\t\treasoning: boolean;\n\t\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t\tinput: (\"text\" | \"image\" | \"video\")[];\n\t\tcost: Model<Api>[\"cost\"];\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t\tcacheRetention?: Model<Api>[\"cacheRetention\"];\n\t\tcompat?: Model<Api>[\"compat\"];\n\t}>;\n\trefreshModels?(context: RefreshModelsContext): Promise<NonNullable<ProviderConfigInput[\"models\"]>>;\n}\n\nexport type AuthStatus = {\n\tconfigured: boolean;\n\tsource?:\n\t\t| \"stored\"\n\t\t| \"runtime\"\n\t\t| \"environment\"\n\t\t| \"fallback\"\n\t\t| \"models_json_key\"\n\t\t| \"models_json_command\"\n\t\t| HeaderAuthStatusSource;\n\tlabel?: string;\n};\n\nexport const clearApiKeyCache = clearConfigValueCache;\n\ntype ModelWithConfigMetadata = Model<Api> & {\n\tpromptPreset?: string;\n};\n\nfunction mergeCompat(\n\tbase: Model<Api>[\"compat\"],\n\toverride: Model<Api>[\"compat\"] | ModelsJsonModelOverride[\"compat\"],\n): Model<Api>[\"compat\"] {\n\tif (!override) return base;\n\tconst merged = { ...base, ...override } as NonNullable<Model<Api>[\"compat\"]>;\n\tconst baseNested = base as Record<string, unknown> | undefined;\n\tconst overrideNested = override as Record<string, unknown>;\n\tconst mergedNested = merged as Record<string, unknown>;\n\tfor (const key of [\"openRouterRouting\", \"vercelGatewayRouting\", \"chatTemplateKwargs\"] as const) {\n\t\tconst baseValue = baseNested?.[key];\n\t\tconst overrideValue = overrideNested[key];\n\t\tif (\n\t\t\t(typeof baseValue === \"object\" && baseValue !== null) ||\n\t\t\t(typeof overrideValue === \"object\" && overrideValue !== null)\n\t\t) {\n\t\t\tmergedNested[key] = { ...(baseValue as object | undefined), ...(overrideValue as object | undefined) };\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction applyModelOverride(model: Model<Api>, override: ModelsJsonModelOverride): ModelWithConfigMetadata {\n\treturn {\n\t\t...model,\n\t\tname: override.name ?? model.name,\n\t\tpromptPreset: override.promptPreset ?? (model as Model<Api> & { promptPreset?: string }).promptPreset,\n\t\trecoverTextToolCalls: override.recoverTextToolCalls ?? model.recoverTextToolCalls,\n\t\treasoning: override.reasoning ?? model.reasoning,\n\t\tthinkingLevelMap: override.thinkingLevelMap\n\t\t\t? override.thinkingLevelMapMode === \"replace\"\n\t\t\t\t? override.thinkingLevelMap\n\t\t\t\t: { ...model.thinkingLevelMap, ...override.thinkingLevelMap }\n\t\t\t: model.thinkingLevelMap,\n\t\tinput: (override.input as (\"text\" | \"image\" | \"video\")[] | undefined) ?? model.input,\n\t\tcost: override.cost\n\t\t\t? {\n\t\t\t\t\tinput: override.cost.input ?? model.cost.input,\n\t\t\t\t\toutput: override.cost.output ?? model.cost.output,\n\t\t\t\t\tcacheRead: override.cost.cacheRead ?? model.cost.cacheRead,\n\t\t\t\t\tcacheWrite: override.cost.cacheWrite ?? model.cost.cacheWrite,\n\t\t\t\t\ttiers: override.cost.tiers ?? model.cost.tiers,\n\t\t\t\t}\n\t\t\t: model.cost,\n\t\tcontextWindow: override.contextWindow ?? model.contextWindow,\n\t\tmaxTokens: override.maxTokens ?? model.maxTokens,\n\t\tcacheRetention: override.cacheRetention ?? model.cacheRetention,\n\t\tcompat: mergeCompat(model.compat, override.compat),\n\t};\n}\n\nfunction modelFromJson(\n\tproviderId: string,\n\tdefinition: ModelsJsonModel,\n\tproviderConfig: ModelsJsonProvider,\n\tdefaults: Model<Api> | undefined,\n): ModelWithConfigMetadata {\n\tconst api = definition.api ?? providerConfig.api ?? defaults?.api;\n\tif (!api) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t);\n\t}\n\tconst baseUrl = definition.baseUrl ?? providerConfig.baseUrl ?? defaults?.baseUrl;\n\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\tif (definition.contextWindow !== undefined && definition.contextWindow <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);\n\t}\n\tif (definition.maxTokens !== undefined && definition.maxTokens <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);\n\t}\n\treturn {\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tpromptPreset: definition.promptPreset,\n\t\trecoverTextToolCalls: definition.recoverTextToolCalls,\n\t\tapi: api as Api,\n\t\tprovider: providerId,\n\t\tbaseUrl,\n\t\treasoning: definition.reasoning ?? false,\n\t\tthinkingLevelMap: definition.thinkingLevelMap,\n\t\tinput: (definition.input ?? [\"text\"]) as (\"text\" | \"image\" | \"video\")[],\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t\theaders: undefined,\n\t\tcacheRetention: definition.cacheRetention ?? providerConfig.cacheRetention,\n\t\tcompat: mergeCompat(providerConfig.compat, definition.compat),\n\t};\n}\n\nfunction applyModelsJson(\n\tproviderId: string,\n\tbaseModels: readonly Model<Api>[],\n\tconfig: ModelsJsonProvider | undefined,\n): Model<Api>[] {\n\tif (!config) return [...baseModels];\n\tif (config.oauth && !config.baseUrl) {\n\t\tthrow new Error(`Provider ${providerId}: \"baseUrl\" is required when \"oauth\" is set.`);\n\t}\n\tconst hasOverrides = config.modelOverrides && Object.keys(config.modelOverrides).length > 0;\n\tif (\n\t\t!config.models?.length &&\n\t\t!config.baseUrl &&\n\t\t!config.headers &&\n\t\t!config.extraBody &&\n\t\t!config.compat &&\n\t\t!hasOverrides &&\n\t\t!config.whitelist &&\n\t\t!config.blacklist &&\n\t\t!config.apiKey &&\n\t\t!config.oauth &&\n\t\tconfig.authHeader === undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}: must specify \"baseUrl\", \"headers\", \"extraBody\", \"compat\", \"modelOverrides\", or \"models\".`,\n\t\t);\n\t}\n\n\t// An explicit local Ollama catalog replaces Cloud discovery instead of rebinding its dynamic tags to localhost.\n\tconst configuredBaseModels = providerId === \"ollama\" && config.models?.length ? [] : baseModels;\n\tconst models: Model<Api>[] = configuredBaseModels.map((model) => ({\n\t\t...model,\n\t\tbaseUrl: config.oauth === \"radius\" ? model.baseUrl : (config.baseUrl ?? model.baseUrl),\n\t\tcompat: mergeCompat(model.compat, config.compat),\n\t}));\n\tfor (const definition of config.models ?? []) {\n\t\tconst existingIndex = models.findIndex((model) => model.id === definition.id);\n\t\tconst defaults = existingIndex >= 0 ? models[existingIndex] : models[0];\n\t\tconst model = modelFromJson(providerId, definition, config, defaults);\n\t\tif (existingIndex >= 0) models[existingIndex] = model;\n\t\telse models.push(model);\n\t}\n\tconst whitelist = config.whitelist ? new Set(config.whitelist) : undefined;\n\tconst blacklist = config.blacklist ? new Set(config.blacklist) : undefined;\n\treturn models.filter(\n\t\t(model) =>\n\t\t\t(whitelist === undefined || whitelist.has(model.id)) && (blacklist === undefined || !blacklist.has(model.id)),\n\t);\n}\n\nfunction applyExtension(\n\tproviderId: string,\n\tmodels: readonly Model<Api>[],\n\tconfig: ProviderConfigInput | undefined,\n): Model<Api>[] {\n\tif (!config) return [...models];\n\tif (!config.models) {\n\t\treturn config.baseUrl ? models.map((model) => ({ ...model, baseUrl: config.baseUrl! })) : [...models];\n\t}\n\treturn config.models.map((definition) => {\n\t\tconst defaults = models.find((model) => model.id === definition.id) ?? models[0];\n\t\tconst api = definition.api ?? config.api ?? defaults?.api;\n\t\tif (!api) {\n\t\t\tthrow new Error(\n\t\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t\t);\n\t\t}\n\t\tconst baseUrl = definition.baseUrl ?? config.baseUrl ?? defaults?.baseUrl;\n\t\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\t\treturn {\n\t\t\t...definition,\n\t\t\tapi,\n\t\t\tprovider: providerId,\n\t\t\tbaseUrl,\n\t\t\theaders: undefined,\n\t\t};\n\t});\n}\n\nfunction adaptOAuth(config: ExtensionOAuthConfig): OAuthAuth {\n\treturn {\n\t\tname: config.name,\n\t\tlogin: async (callbacks) => {\n\t\t\tconst credential = await config.login({\n\t\t\t\tonAuth: (info) => callbacks.notify({ type: \"auth_url\", ...info }),\n\t\t\t\tonDeviceCode: (info) => callbacks.notify({ type: \"device_code\", ...info }),\n\t\t\t\tonPrompt: (prompt) => callbacks.prompt({ type: \"text\", ...prompt }),\n\t\t\t\tonProgress: (message) => callbacks.notify({ type: \"progress\", message }),\n\t\t\t\tonManualCodeInput: () => callbacks.prompt({ type: \"manual_code\", message: \"Paste the authorization code\" }),\n\t\t\t\tonSelect: (prompt) => callbacks.prompt({ type: \"select\", ...prompt }),\n\t\t\t\tsignal: callbacks.signal,\n\t\t\t});\n\t\t\treturn { ...credential, type: \"oauth\" };\n\t\t},\n\t\trefresh: async (credential) => ({ ...(await config.refreshToken(credential)), type: \"oauth\" }),\n\t\ttoAuth: async (credential) => ({ apiKey: config.getApiKey(credential) }),\n\t};\n}\n\nfunction composeOAuthAuth(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): OAuthAuth | undefined {\n\tconst oauth = extension?.oauth ? adaptOAuth(extension.oauth) : base?.auth.oauth;\n\tif (!oauth) return undefined;\n\tconst rawHeaders = configuredHeaders(config, extension);\n\tconst authHeader = extension?.authHeader ?? config?.authHeader ?? false;\n\treturn {\n\t\t...oauth,\n\t\ttoAuth: async (credential) => {\n\t\t\tconst auth = await oauth.toAuth(credential);\n\t\t\tconst env = credential.env;\n\t\t\tconst headers = resolveHeadersOrThrow(\n\t\t\t\trawHeaders,\n\t\t\t\t`provider \"${providerId}\"`,\n\t\t\t\ttypeof env === \"object\" && env !== null ? (env as Record<string, string>) : undefined,\n\t\t\t);\n\t\t\treturn withConfiguredAuth(auth, headers, authHeader);\n\t\t},\n\t};\n}\n\nfunction rawModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, string> | undefined {\n\tconst definition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst headers = {\n\t\t...config?.modelOverrides?.[model.id]?.headers,\n\t\t...definition?.headers,\n\t\t...extensionModel?.headers,\n\t};\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction rawModelExtraBody(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, unknown> | undefined {\n\tconst definition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst extraBody = {\n\t\t...config?.modelOverrides?.[model.id]?.extraBody,\n\t\t...definition?.extraBody,\n\t\t...extensionModel?.extraBody,\n\t};\n\treturn Object.keys(extraBody).length > 0 ? extraBody : undefined;\n}\n\nexport function validateExtensionProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelsConfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput,\n): void {\n\tif (extension.streamSimple && !extension.api) {\n\t\tthrow new Error(`Provider ${providerId}: \"api\" is required when registering streamSimple.`);\n\t}\n\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], modelsConfig), extension);\n}\n\n/** Compose built-in, models.json, and extension layers without reading credentials. */\nexport function composeModelProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelConfig: ModelConfig,\n\textension: ProviderConfigInput | undefined,\n): Provider {\n\tconst config = modelConfig.getProvider(providerId);\n\tlet extensionOAuthCredential: OAuthCredentials | undefined;\n\tlet refreshedExtensionModels: ProviderConfigInput[\"models\"];\n\tconst currentExtension = (): ProviderConfigInput | undefined =>\n\t\textension && refreshedExtensionModels ? { ...extension, models: refreshedExtensionModels } : extension;\n\t// models.json modelOverrides are the topmost user-config layer: they apply once,\n\t// after custom-model upserts, extension model replacement, and legacy OAuth projection.\n\tconst getModels = () => {\n\t\tlet models = applyExtension(\n\t\t\tproviderId,\n\t\t\tapplyModelsJson(providerId, base?.getModels() ?? [], config),\n\t\t\tcurrentExtension(),\n\t\t);\n\t\tif (extensionOAuthCredential && extension?.oauth?.modifyModels) {\n\t\t\tmodels = extension.oauth.modifyModels(models, extensionOAuthCredential);\n\t\t}\n\t\treturn models.map((model) => {\n\t\t\tconst override = config?.modelOverrides?.[model.id];\n\t\t\treturn override ? applyModelOverride(model, override) : model;\n\t\t});\n\t};\n\t// Validate eagerly so registration/reload reports structural errors immediately.\n\tgetModels();\n\tconst apiKey = composeApiKeyAuth(providerId, base, config, extension);\n\tconst oauth = composeOAuthAuth(providerId, base, config, extension);\n\tif (!apiKey && !oauth) throw new Error(`Provider ${providerId}: no authentication method configured.`);\n\t// The documented local `ollama` models.json catalog must not invoke the Cloud builtin's refresh with its\n\t// placeholder key. Other dynamic providers (notably custom Radius gateways) keep their provider-owned refresh.\n\tconst refreshBase = providerId === \"ollama\" && config?.models?.length ? undefined : base?.refreshModels?.bind(base);\n\n\tconst supportsBaseApi = (model: Model<Api>) => base?.getModels().some((entry) => entry.api === model.api) ?? false;\n\tconst streamWith = (\n\t\tmodel: Model<Api>,\n\t\tcontext: Context,\n\t\toptions: StreamOptions | undefined,\n\t\tsimple: boolean,\n\t): AssistantMessageEventStream =>\n\t\tlazyStream(model, async () => {\n\t\t\tconst format = getToolCallFormat(model);\n\t\t\tif (format && context.tools && context.tools.length > 0) {\n\t\t\t\tconst protocol = getProtocol(format);\n\t\t\t\tconst transformedContext = transformContext(context, protocol);\n\t\t\t\tconst innerStream = streamWith(model, transformedContext, options, simple);\n\t\t\t\treturn wrapStreamWithToolCallMiddleware(innerStream, protocol, context.tools);\n\t\t\t}\n\t\t\tif (extension?.streamSimple && model.api === extension.api) {\n\t\t\t\treturn extension.streamSimple(model, context, options as SimpleStreamOptions);\n\t\t\t}\n\t\t\tif (base && supportsBaseApi(model)) {\n\t\t\t\treturn simple\n\t\t\t\t\t? base.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t\t: base.stream(model, context, options);\n\t\t\t}\n\t\t\tconst api = getApiProvider(model.api);\n\t\t\tif (!api) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No API provider registered for api: ${model.api} (model \"${model.provider}/${model.id}\"). ` +\n\t\t\t\t\t\t`Load the extension that implements this api, or fix the \"api\" value for provider \"${providerId}\" in models.json.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn simple\n\t\t\t\t? api.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t: api.stream(model, context, options);\n\t\t});\n\n\treturn {\n\t\tid: providerId,\n\t\tname: extension?.name ?? config?.name ?? base?.name ?? extension?.oauth?.name ?? providerId,\n\t\tbaseUrl: extension?.baseUrl ?? config?.baseUrl ?? base?.baseUrl,\n\t\theaders: base?.headers,\n\t\tauth: { ...(apiKey ? { apiKey } : {}), ...(oauth ? { oauth } : {}) },\n\t\tgetModels,\n\t\trefreshModels:\n\t\t\trefreshBase || extension?.refreshModels || extension?.oauth?.modifyModels\n\t\t\t\t? async (context) => {\n\t\t\t\t\t\tawait refreshBase?.(context);\n\t\t\t\t\t\tif (extension?.refreshModels) {\n\t\t\t\t\t\t\tconst refreshed = await extension.refreshModels(context);\n\t\t\t\t\t\t\tif (!context.signal?.aborted) {\n\t\t\t\t\t\t\t\t// Validate before publishing the new synchronous list.\n\t\t\t\t\t\t\t\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], config), {\n\t\t\t\t\t\t\t\t\t...extension,\n\t\t\t\t\t\t\t\t\tmodels: refreshed,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\trefreshedExtensionModels = refreshed;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\textensionOAuthCredential = context.credential?.type === \"oauth\" ? context.credential : undefined;\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\tfilterModels: base?.filterModels\n\t\t\t? (models, credential: Credential | undefined) => base.filterModels!(models, credential)\n\t\t\t: undefined,\n\t\tstream: (model, context, options) => streamWith(model, context, options, false),\n\t\tstreamSimple: (model, context, options) => streamWith(model, context, options, true),\n\t};\n}\n\nexport function resolveConfiguredModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n\tenv?: Record<string, string>,\n): Record<string, string> | undefined {\n\treturn resolveHeadersOrThrow(\n\t\trawModelHeaders(model, config, extension),\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t\tenv,\n\t);\n}\n\nexport interface CompatibilityRequestConfig {\n\theaders?: ProviderHeaders;\n\textraBody?: Record<string, unknown>;\n\tupstreamModelId?: string;\n\tserviceTier?: \"auto\" | \"flex\" | \"priority\";\n\tauthHeader: boolean;\n}\n\nexport function resolveCompatibilityRequestConfig(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n\tenv?: Record<string, string>,\n): CompatibilityRequestConfig {\n\tconst configured = resolveHeadersOrThrow(\n\t\t{ ...configuredHeaders(config, extension), ...rawModelHeaders(model, config, extension) },\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t\tenv,\n\t);\n\tconst modelDefinition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst configuredExtraBody = {\n\t\t...config?.extraBody,\n\t\t...extension?.extraBody,\n\t\t...rawModelExtraBody(model, config, extension),\n\t};\n\treturn {\n\t\theaders: model.headers || configured ? { ...model.headers, ...configured } : undefined,\n\t\textraBody: Object.keys(configuredExtraBody).length > 0 ? configuredExtraBody : undefined,\n\t\tupstreamModelId: extensionModel?.upstreamModelId ?? modelDefinition?.upstreamModelId ?? model.upstreamModelId,\n\t\tserviceTier: extensionModel?.serviceTier ?? modelDefinition?.serviceTier ?? model.serviceTier,\n\t\tauthHeader: extension?.authHeader ?? config?.authHeader ?? false,\n\t};\n}\n\nexport function configuredRequestAuthStatus(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): AuthStatus | undefined {\n\tconst value = configuredApiKey(config, extension);\n\tif (value === undefined) {\n\t\treturn configuredHeaderAuthStatus(config?.headers, extension?.headers);\n\t}\n\tif (isCommandConfigValue(value)) return { configured: true, source: \"models_json_command\" };\n\tconst names = getConfigValueEnvVarNames(value);\n\tif (names.length > 0) {\n\t\treturn isConfigValueConfigured(value)\n\t\t\t? { configured: true, source: \"environment\", label: names.join(\", \") }\n\t\t\t: { configured: false };\n\t}\n\treturn { configured: true, source: extension?.apiKey !== undefined ? \"fallback\" : \"models_json_key\" };\n}\n"]}
1
+ {"version":3,"file":"provider-composer.js","sourceRoot":"","sources":["../../src/core/provider-composer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessageEventStream,\n\ttype AuthCheck,\n\ttype AuthContext,\n\ttype Context,\n\ttype Credential,\n\tgetApiProvider,\n\tgetProtocol,\n\tgetToolCallFormat,\n\tlazyStream,\n\ttype Model,\n\ttype OAuthAuth,\n\ttype OAuthCredential,\n\ttype OAuthCredentials,\n\ttype OAuthLoginCallbacks,\n\ttype Provider,\n\ttype ProviderHeaders,\n\ttype RefreshModelsContext,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n\ttransformContext,\n\twrapStreamWithToolCallMiddleware,\n} from \"@earendil-works/pi-ai\";\nimport type { ModelConfig, ModelsJsonModel, ModelsJsonModelOverride, ModelsJsonProvider } from \"./model-config.ts\";\nimport { composeApiKeyAuth, configuredApiKey, configuredHeaders, withConfiguredAuth } from \"./provider-api-key-auth.ts\";\nimport { configuredHeaderAuthStatus, type HeaderAuthStatusSource } from \"./provider-header-auth.ts\";\nimport {\n\tclearConfigValueCache,\n\tgetConfigValueEnvVarNames,\n\tisCommandConfigValue,\n\tisConfigValueConfigured,\n\tresolveHeadersOrThrow,\n} from \"./resolve-config-value.ts\";\n\nexport interface ExtensionOAuthConfig {\n\tname: string;\n\t/** Optional availability check forwarded to `OAuthAuth.check`; absent means any stored OAuth credential counts as configured. */\n\tcheck?(input: { ctx: AuthContext; credential?: OAuthCredentials }): Promise<AuthCheck | undefined>;\n\t/** @deprecated Retained for extension source compatibility; ignored by canonical auth flows. */\n\tusesCallbackServer?: boolean;\n\tcheck?(input: { ctx: AuthContext; credential?: OAuthCredential }): Promise<AuthCheck | undefined>;\n\tlogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;\n\trefreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;\n\tgetApiKey(credentials: OAuthCredentials): string;\n\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n}\n\n/** Input type for the extension registerProvider API. */\nexport interface ProviderConfigInput {\n\tname?: string;\n\tbaseUrl?: string;\n\tapiKey?: string;\n\tapi?: Api;\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\theaders?: Record<string, string>;\n\textraBody?: Record<string, unknown>;\n\tauthHeader?: boolean;\n\toauth?: ExtensionOAuthConfig;\n\tmodels?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\tupstreamModelId?: string;\n\t\tserviceTier?: \"auto\" | \"flex\" | \"priority\";\n\t\tpromptPreset?: string;\n\t\trecoverTextToolCalls?: boolean;\n\t\tapi?: Api;\n\t\tbaseUrl?: string;\n\t\treasoning: boolean;\n\t\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t\tinput: (\"text\" | \"image\" | \"video\")[];\n\t\tcost: Model<Api>[\"cost\"];\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t\tcacheRetention?: Model<Api>[\"cacheRetention\"];\n\t\tcompat?: Model<Api>[\"compat\"];\n\t}>;\n\trefreshModels?(context: RefreshModelsContext): Promise<NonNullable<ProviderConfigInput[\"models\"]>>;\n}\n\nexport type AuthStatus = {\n\tconfigured: boolean;\n\tsource?:\n\t\t| \"stored\"\n\t\t| \"runtime\"\n\t\t| \"environment\"\n\t\t| \"fallback\"\n\t\t| \"models_json_key\"\n\t\t| \"models_json_command\"\n\t\t| HeaderAuthStatusSource;\n\tlabel?: string;\n};\n\nexport const clearApiKeyCache = clearConfigValueCache;\n\ntype ModelWithConfigMetadata = Model<Api> & {\n\tpromptPreset?: string;\n};\n\nfunction mergeCompat(\n\tbase: Model<Api>[\"compat\"],\n\toverride: Model<Api>[\"compat\"] | ModelsJsonModelOverride[\"compat\"],\n): Model<Api>[\"compat\"] {\n\tif (!override) return base;\n\tconst merged = { ...base, ...override } as NonNullable<Model<Api>[\"compat\"]>;\n\tconst baseNested = base as Record<string, unknown> | undefined;\n\tconst overrideNested = override as Record<string, unknown>;\n\tconst mergedNested = merged as Record<string, unknown>;\n\tfor (const key of [\"openRouterRouting\", \"vercelGatewayRouting\", \"chatTemplateKwargs\"] as const) {\n\t\tconst baseValue = baseNested?.[key];\n\t\tconst overrideValue = overrideNested[key];\n\t\tif (\n\t\t\t(typeof baseValue === \"object\" && baseValue !== null) ||\n\t\t\t(typeof overrideValue === \"object\" && overrideValue !== null)\n\t\t) {\n\t\t\tmergedNested[key] = { ...(baseValue as object | undefined), ...(overrideValue as object | undefined) };\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction applyModelOverride(model: Model<Api>, override: ModelsJsonModelOverride): ModelWithConfigMetadata {\n\treturn {\n\t\t...model,\n\t\tname: override.name ?? model.name,\n\t\tpromptPreset: override.promptPreset ?? (model as Model<Api> & { promptPreset?: string }).promptPreset,\n\t\trecoverTextToolCalls: override.recoverTextToolCalls ?? model.recoverTextToolCalls,\n\t\treasoning: override.reasoning ?? model.reasoning,\n\t\tthinkingLevelMap: override.thinkingLevelMap\n\t\t\t? override.thinkingLevelMapMode === \"replace\"\n\t\t\t\t? override.thinkingLevelMap\n\t\t\t\t: { ...model.thinkingLevelMap, ...override.thinkingLevelMap }\n\t\t\t: model.thinkingLevelMap,\n\t\tinput: (override.input as (\"text\" | \"image\" | \"video\")[] | undefined) ?? model.input,\n\t\tcost: override.cost\n\t\t\t? {\n\t\t\t\t\tinput: override.cost.input ?? model.cost.input,\n\t\t\t\t\toutput: override.cost.output ?? model.cost.output,\n\t\t\t\t\tcacheRead: override.cost.cacheRead ?? model.cost.cacheRead,\n\t\t\t\t\tcacheWrite: override.cost.cacheWrite ?? model.cost.cacheWrite,\n\t\t\t\t\ttiers: override.cost.tiers ?? model.cost.tiers,\n\t\t\t\t}\n\t\t\t: model.cost,\n\t\tcontextWindow: override.contextWindow ?? model.contextWindow,\n\t\tmaxTokens: override.maxTokens ?? model.maxTokens,\n\t\tcacheRetention: override.cacheRetention ?? model.cacheRetention,\n\t\tcompat: mergeCompat(model.compat, override.compat),\n\t};\n}\n\nfunction modelFromJson(\n\tproviderId: string,\n\tdefinition: ModelsJsonModel,\n\tproviderConfig: ModelsJsonProvider,\n\tdefaults: Model<Api> | undefined,\n): ModelWithConfigMetadata {\n\tconst api = definition.api ?? providerConfig.api ?? defaults?.api;\n\tif (!api) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t);\n\t}\n\tconst baseUrl = definition.baseUrl ?? providerConfig.baseUrl ?? defaults?.baseUrl;\n\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\tif (definition.contextWindow !== undefined && definition.contextWindow <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);\n\t}\n\tif (definition.maxTokens !== undefined && definition.maxTokens <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);\n\t}\n\treturn {\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tpromptPreset: definition.promptPreset,\n\t\trecoverTextToolCalls: definition.recoverTextToolCalls,\n\t\tapi: api as Api,\n\t\tprovider: providerId,\n\t\tbaseUrl,\n\t\treasoning: definition.reasoning ?? false,\n\t\tthinkingLevelMap: definition.thinkingLevelMap,\n\t\tinput: (definition.input ?? [\"text\"]) as (\"text\" | \"image\" | \"video\")[],\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t\theaders: undefined,\n\t\tcacheRetention: definition.cacheRetention ?? providerConfig.cacheRetention,\n\t\tcompat: mergeCompat(providerConfig.compat, definition.compat),\n\t};\n}\n\nfunction applyModelsJson(\n\tproviderId: string,\n\tbaseModels: readonly Model<Api>[],\n\tconfig: ModelsJsonProvider | undefined,\n): Model<Api>[] {\n\tif (!config) return [...baseModels];\n\tif (config.oauth && !config.baseUrl) {\n\t\tthrow new Error(`Provider ${providerId}: \"baseUrl\" is required when \"oauth\" is set.`);\n\t}\n\tconst hasOverrides = config.modelOverrides && Object.keys(config.modelOverrides).length > 0;\n\tif (\n\t\t!config.models?.length &&\n\t\t!config.baseUrl &&\n\t\t!config.headers &&\n\t\t!config.extraBody &&\n\t\t!config.compat &&\n\t\t!hasOverrides &&\n\t\t!config.whitelist &&\n\t\t!config.blacklist &&\n\t\t!config.apiKey &&\n\t\t!config.oauth &&\n\t\tconfig.authHeader === undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}: must specify \"baseUrl\", \"headers\", \"extraBody\", \"compat\", \"modelOverrides\", or \"models\".`,\n\t\t);\n\t}\n\n\t// An explicit local Ollama catalog replaces Cloud discovery instead of rebinding its dynamic tags to localhost.\n\tconst configuredBaseModels = providerId === \"ollama\" && config.models?.length ? [] : baseModels;\n\tconst models: Model<Api>[] = configuredBaseModels.map((model) => ({\n\t\t...model,\n\t\tbaseUrl: config.oauth === \"radius\" ? model.baseUrl : (config.baseUrl ?? model.baseUrl),\n\t\tcompat: mergeCompat(model.compat, config.compat),\n\t}));\n\tfor (const definition of config.models ?? []) {\n\t\tconst existingIndex = models.findIndex((model) => model.id === definition.id);\n\t\tconst defaults = existingIndex >= 0 ? models[existingIndex] : models[0];\n\t\tconst model = modelFromJson(providerId, definition, config, defaults);\n\t\tif (existingIndex >= 0) models[existingIndex] = model;\n\t\telse models.push(model);\n\t}\n\tconst whitelist = config.whitelist ? new Set(config.whitelist) : undefined;\n\tconst blacklist = config.blacklist ? new Set(config.blacklist) : undefined;\n\treturn models.filter(\n\t\t(model) =>\n\t\t\t(whitelist === undefined || whitelist.has(model.id)) && (blacklist === undefined || !blacklist.has(model.id)),\n\t);\n}\n\nfunction applyExtension(\n\tproviderId: string,\n\tmodels: readonly Model<Api>[],\n\tconfig: ProviderConfigInput | undefined,\n): Model<Api>[] {\n\tif (!config) return [...models];\n\tif (!config.models) {\n\t\treturn config.baseUrl ? models.map((model) => ({ ...model, baseUrl: config.baseUrl! })) : [...models];\n\t}\n\treturn config.models.map((definition) => {\n\t\tconst defaults = models.find((model) => model.id === definition.id) ?? models[0];\n\t\tconst api = definition.api ?? config.api ?? defaults?.api;\n\t\tif (!api) {\n\t\t\tthrow new Error(\n\t\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t\t);\n\t\t}\n\t\tconst baseUrl = definition.baseUrl ?? config.baseUrl ?? defaults?.baseUrl;\n\t\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\t\treturn {\n\t\t\t...definition,\n\t\t\tapi,\n\t\t\tprovider: providerId,\n\t\t\tbaseUrl,\n\t\t\theaders: undefined,\n\t\t};\n\t});\n}\n\nfunction adaptOAuth(config: ExtensionOAuthConfig): OAuthAuth {\n\treturn {\n\t\tname: config.name,\n\t\t...(config.check ? { check: config.check } : {}),\n\t\tlogin: async (callbacks) => {\n\t\t\tconst credential = await config.login({\n\t\t\t\tonAuth: (info) => callbacks.notify({ type: \"auth_url\", ...info }),\n\t\t\t\tonDeviceCode: (info) => callbacks.notify({ type: \"device_code\", ...info }),\n\t\t\t\tonPrompt: (prompt) => callbacks.prompt({ type: \"text\", ...prompt }),\n\t\t\t\tonProgress: (message) => callbacks.notify({ type: \"progress\", message }),\n\t\t\t\tonManualCodeInput: () => callbacks.prompt({ type: \"manual_code\", message: \"Paste the authorization code\" }),\n\t\t\t\tonSelect: (prompt) => callbacks.prompt({ type: \"select\", ...prompt }),\n\t\t\t\tsignal: callbacks.signal,\n\t\t\t});\n\t\t\treturn { ...credential, type: \"oauth\" };\n\t\t},\n\t\trefresh: async (credential) => ({ ...(await config.refreshToken(credential)), type: \"oauth\" }),\n\t\ttoAuth: async (credential) => ({ apiKey: config.getApiKey(credential) }),\n\t\t...(config.check\n\t\t\t? {\n\t\t\t\t\tcheck: (input: { ctx: AuthContext; credential?: OAuthCredentials }) => {\n\t\t\t\t\t\tconst check = config.check;\n\t\t\t\t\t\treturn check ? check(input) : Promise.resolve(undefined);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction composeOAuthAuth(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): OAuthAuth | undefined {\n\tconst oauth = extension?.oauth ? adaptOAuth(extension.oauth) : base?.auth.oauth;\n\tif (!oauth) return undefined;\n\tconst rawHeaders = configuredHeaders(config, extension);\n\tconst authHeader = extension?.authHeader ?? config?.authHeader ?? false;\n\treturn {\n\t\t...oauth,\n\t\ttoAuth: async (credential) => {\n\t\t\tconst auth = await oauth.toAuth(credential);\n\t\t\tconst env = credential.env;\n\t\t\tconst headers = resolveHeadersOrThrow(\n\t\t\t\trawHeaders,\n\t\t\t\t`provider \"${providerId}\"`,\n\t\t\t\ttypeof env === \"object\" && env !== null ? (env as Record<string, string>) : undefined,\n\t\t\t);\n\t\t\treturn withConfiguredAuth(auth, headers, authHeader);\n\t\t},\n\t};\n}\n\nfunction rawModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, string> | undefined {\n\tconst definition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst headers = {\n\t\t...config?.modelOverrides?.[model.id]?.headers,\n\t\t...definition?.headers,\n\t\t...extensionModel?.headers,\n\t};\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction rawModelExtraBody(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, unknown> | undefined {\n\tconst definition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst extraBody = {\n\t\t...config?.modelOverrides?.[model.id]?.extraBody,\n\t\t...definition?.extraBody,\n\t\t...extensionModel?.extraBody,\n\t};\n\treturn Object.keys(extraBody).length > 0 ? extraBody : undefined;\n}\n\nexport function validateExtensionProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelsConfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput,\n): void {\n\tif (extension.streamSimple && !extension.api) {\n\t\tthrow new Error(`Provider ${providerId}: \"api\" is required when registering streamSimple.`);\n\t}\n\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], modelsConfig), extension);\n}\n\n/** Compose built-in, models.json, and extension layers without reading credentials. */\nexport function composeModelProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelConfig: ModelConfig,\n\textension: ProviderConfigInput | undefined,\n): Provider {\n\tconst config = modelConfig.getProvider(providerId);\n\tlet extensionOAuthCredential: OAuthCredentials | undefined;\n\tlet refreshedExtensionModels: ProviderConfigInput[\"models\"];\n\tconst currentExtension = (): ProviderConfigInput | undefined =>\n\t\textension && refreshedExtensionModels ? { ...extension, models: refreshedExtensionModels } : extension;\n\t// models.json modelOverrides are the topmost user-config layer: they apply once,\n\t// after custom-model upserts, extension model replacement, and legacy OAuth projection.\n\tconst getModels = () => {\n\t\tlet models = applyExtension(\n\t\t\tproviderId,\n\t\t\tapplyModelsJson(providerId, base?.getModels() ?? [], config),\n\t\t\tcurrentExtension(),\n\t\t);\n\t\tif (extensionOAuthCredential && extension?.oauth?.modifyModels) {\n\t\t\tmodels = extension.oauth.modifyModels(models, extensionOAuthCredential);\n\t\t}\n\t\treturn models.map((model) => {\n\t\t\tconst override = config?.modelOverrides?.[model.id];\n\t\t\treturn override ? applyModelOverride(model, override) : model;\n\t\t});\n\t};\n\t// Validate eagerly so registration/reload reports structural errors immediately.\n\tgetModels();\n\tconst apiKey = composeApiKeyAuth(providerId, base, config, extension);\n\tconst oauth = composeOAuthAuth(providerId, base, config, extension);\n\tif (!apiKey && !oauth) throw new Error(`Provider ${providerId}: no authentication method configured.`);\n\t// The documented local `ollama` models.json catalog must not invoke the Cloud builtin's refresh with its\n\t// placeholder key. Other dynamic providers (notably custom Radius gateways) keep their provider-owned refresh.\n\tconst refreshBase = providerId === \"ollama\" && config?.models?.length ? undefined : base?.refreshModels?.bind(base);\n\n\tconst supportsBaseApi = (model: Model<Api>) => base?.getModels().some((entry) => entry.api === model.api) ?? false;\n\tconst streamWith = (\n\t\tmodel: Model<Api>,\n\t\tcontext: Context,\n\t\toptions: StreamOptions | undefined,\n\t\tsimple: boolean,\n\t): AssistantMessageEventStream =>\n\t\tlazyStream(model, async () => {\n\t\t\tconst format = getToolCallFormat(model);\n\t\t\tif (format && context.tools && context.tools.length > 0) {\n\t\t\t\tconst protocol = getProtocol(format);\n\t\t\t\tconst transformedContext = transformContext(context, protocol);\n\t\t\t\tconst innerStream = streamWith(model, transformedContext, options, simple);\n\t\t\t\treturn wrapStreamWithToolCallMiddleware(innerStream, protocol, context.tools);\n\t\t\t}\n\t\t\tif (extension?.streamSimple && model.api === extension.api) {\n\t\t\t\treturn extension.streamSimple(model, context, options as SimpleStreamOptions);\n\t\t\t}\n\t\t\tif (base && supportsBaseApi(model)) {\n\t\t\t\treturn simple\n\t\t\t\t\t? base.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t\t: base.stream(model, context, options);\n\t\t\t}\n\t\t\tconst api = getApiProvider(model.api);\n\t\t\tif (!api) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No API provider registered for api: ${model.api} (model \"${model.provider}/${model.id}\"). ` +\n\t\t\t\t\t\t`Load the extension that implements this api, or fix the \"api\" value for provider \"${providerId}\" in models.json.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn simple\n\t\t\t\t? api.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t: api.stream(model, context, options);\n\t\t});\n\n\treturn {\n\t\tid: providerId,\n\t\tname: extension?.name ?? config?.name ?? base?.name ?? extension?.oauth?.name ?? providerId,\n\t\tbaseUrl: extension?.baseUrl ?? config?.baseUrl ?? base?.baseUrl,\n\t\theaders: base?.headers,\n\t\tauth: { ...(apiKey ? { apiKey } : {}), ...(oauth ? { oauth } : {}) },\n\t\tgetModels,\n\t\trefreshModels:\n\t\t\trefreshBase || extension?.refreshModels || extension?.oauth?.modifyModels\n\t\t\t\t? async (context) => {\n\t\t\t\t\t\tawait refreshBase?.(context);\n\t\t\t\t\t\tif (extension?.refreshModels) {\n\t\t\t\t\t\t\tconst refreshed = await extension.refreshModels(context);\n\t\t\t\t\t\t\tif (!context.signal?.aborted) {\n\t\t\t\t\t\t\t\t// Validate before publishing the new synchronous list.\n\t\t\t\t\t\t\t\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], config), {\n\t\t\t\t\t\t\t\t\t...extension,\n\t\t\t\t\t\t\t\t\tmodels: refreshed,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\trefreshedExtensionModels = refreshed;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\textensionOAuthCredential = context.credential?.type === \"oauth\" ? context.credential : undefined;\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\tfilterModels: base?.filterModels\n\t\t\t? (models, credential: Credential | undefined) => base.filterModels!(models, credential)\n\t\t\t: undefined,\n\t\tstream: (model, context, options) => streamWith(model, context, options, false),\n\t\tstreamSimple: (model, context, options) => streamWith(model, context, options, true),\n\t};\n}\n\nexport function resolveConfiguredModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n\tenv?: Record<string, string>,\n): Record<string, string> | undefined {\n\treturn resolveHeadersOrThrow(\n\t\trawModelHeaders(model, config, extension),\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t\tenv,\n\t);\n}\n\nexport interface CompatibilityRequestConfig {\n\theaders?: ProviderHeaders;\n\textraBody?: Record<string, unknown>;\n\tupstreamModelId?: string;\n\tserviceTier?: \"auto\" | \"flex\" | \"priority\";\n\tauthHeader: boolean;\n}\n\nexport function resolveCompatibilityRequestConfig(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n\tenv?: Record<string, string>,\n): CompatibilityRequestConfig {\n\tconst configured = resolveHeadersOrThrow(\n\t\t{ ...configuredHeaders(config, extension), ...rawModelHeaders(model, config, extension) },\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t\tenv,\n\t);\n\tconst modelDefinition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst configuredExtraBody = {\n\t\t...config?.extraBody,\n\t\t...extension?.extraBody,\n\t\t...rawModelExtraBody(model, config, extension),\n\t};\n\treturn {\n\t\theaders: model.headers || configured ? { ...model.headers, ...configured } : undefined,\n\t\textraBody: Object.keys(configuredExtraBody).length > 0 ? configuredExtraBody : undefined,\n\t\tupstreamModelId: extensionModel?.upstreamModelId ?? modelDefinition?.upstreamModelId ?? model.upstreamModelId,\n\t\tserviceTier: extensionModel?.serviceTier ?? modelDefinition?.serviceTier ?? model.serviceTier,\n\t\tauthHeader: extension?.authHeader ?? config?.authHeader ?? false,\n\t};\n}\n\nexport function configuredRequestAuthStatus(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): AuthStatus | undefined {\n\tconst value = configuredApiKey(config, extension);\n\tif (value === undefined) {\n\t\treturn configuredHeaderAuthStatus(config?.headers, extension?.headers);\n\t}\n\tif (isCommandConfigValue(value)) return { configured: true, source: \"models_json_command\" };\n\tconst names = getConfigValueEnvVarNames(value);\n\tif (names.length > 0) {\n\t\treturn isConfigValueConfigured(value)\n\t\t\t? { configured: true, source: \"environment\", label: names.join(\", \") }\n\t\t\t: { configured: false };\n\t}\n\treturn { configured: true, source: extension?.apiKey !== undefined ? \"fallback\" : \"models_json_key\" };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-native-rendering.d.ts","sourceRoot":"","sources":["../../src/modes/provider-native-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AA+PrF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAM5D;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,OAAO,GACf,MAAM,CASR;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAWlG"}
1
+ {"version":3,"file":"provider-native-rendering.d.ts","sourceRoot":"","sources":["../../src/modes/provider-native-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAkSrF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAM5D;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,OAAO,GACf,MAAM,CASR;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAWlG"}
@@ -95,6 +95,31 @@ function formatSources(sources, label, expanded) {
95
95
  }
96
96
  return lines;
97
97
  }
98
+ /** Decoded size of a base64 payload, computed without allocating the bytes. */
99
+ function base64ByteLength(value) {
100
+ const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
101
+ return Math.max(0, Math.floor(value.length / 4) * 3 - padding);
102
+ }
103
+ /**
104
+ * Renders an OpenAI `image_generation_call` without ever echoing the payload.
105
+ * The base64 result is deliberately reduced to a byte count, and no path is shown:
106
+ * the file only exists once the message_end externalization pass has replaced this
107
+ * block with text, which this renderer never sees.
108
+ */
109
+ function formatImageGenerationCallBody(raw) {
110
+ const record = isRecord(raw) ? raw : undefined;
111
+ if (!record)
112
+ return undefined;
113
+ const status = readString(record, "status");
114
+ const result = readString(record, "result");
115
+ const revisedPrompt = readString(record, "revised_prompt");
116
+ const lines = [
117
+ ...(status ? [`status: ${status}`] : []),
118
+ ...(result ? [`${base64ByteLength(result)} bytes`] : []),
119
+ ...(revisedPrompt?.trim() ? [`revised prompt: ${shorten(revisedPrompt, 200)}`] : []),
120
+ ];
121
+ return lines.length > 0 ? lines.join("\n") : undefined;
122
+ }
98
123
  function formatServerToolUseBody(raw) {
99
124
  const record = isRecord(raw) ? raw : undefined;
100
125
  const input = readRecord(record, "input");
@@ -184,6 +209,11 @@ function formatSpecializedProviderNativeSummary(message, content, expanded) {
184
209
  const status = readString(raw, "status");
185
210
  return `${marker} ${provider}web_search${status ? ` · ${status}` : " · web_search_call"}`;
186
211
  }
212
+ if (content.subtype === "image_generation_call") {
213
+ const raw = isRecord(content.raw) ? content.raw : undefined;
214
+ const status = readString(raw, "status");
215
+ return `${marker} ${provider}image_generation${status ? ` · ${status}` : " · image_generation_call"}`;
216
+ }
187
217
  if (content.subtype === "groundingMetadata") {
188
218
  const body = formatGoogleGroundingMetadataBody(content.raw, expanded);
189
219
  if (body) {
@@ -208,6 +238,9 @@ function formatSpecializedProviderNativeBody(content, expanded) {
208
238
  if (content.subtype === "web_search_call") {
209
239
  return formatOpenAiWebSearchCallBody(content.raw, expanded);
210
240
  }
241
+ if (content.subtype === "image_generation_call") {
242
+ return formatImageGenerationCallBody(content.raw);
243
+ }
211
244
  if (content.subtype === "groundingMetadata") {
212
245
  return formatGoogleGroundingMetadataBody(content.raw, expanded);
213
246
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provider-native-rendering.js","sourceRoot":"","sources":["../../src/modes/provider-native-rendering.ts"],"names":[],"mappings":"AAWA,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,UAAU,CAAC,MAAgC,EAAE,GAAW;IAChE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC;AAED,SAAS,SAAS,CAAC,MAAgC,EAAE,GAAW;IAC/D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,UAAU,CAAC,MAAgC,EAAE,GAAW;IAChE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,MAAgC,EAAE,GAAW;IACrE,OAAO,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAyB;IACpD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAM,GAAG,GAAG,QAAQ,GAAG;IAC1E,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,GAAW;IAC1C,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACpE,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,MAAM,CAAC,MAAgB;IAC/B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY;IACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,mBAAmB,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAgC;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxE,MAAM,GAAG,GACR,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;QACzB,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;QACzB,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC;QAClC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC,MAAM,OAAO,GACZ,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7B,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7B,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACxF,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACjH,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAoB;IAC3D,OAAO,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,OAAiB;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,aAAa,CAAC,OAAuB,EAAE,KAAkC,EAAE,QAAiB;IACpG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,SAAS,KAAK,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAY;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,UAAU,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,kCAAkC,CAAC,GAAY,EAAE,QAAiB;IAC1E,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,OAAO,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAY,EAAE,QAAiB;IACrE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG;QACf,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC;KACrC,CAAC;IACF,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG;QACb,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,aAAa,CAAC,OAAO,CAAC;QACzB,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAC7C,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,iCAAiC,CAAC,GAAY,EAAE,QAAiB;IACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,kCAAkC,CAAC,GAAY,EAAE,QAAiB;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACnE,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,sCAAsC,CAC9C,OAAyB,EACzB,OAA8B,EAC9B,QAAiB;IAEjB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,IAAI,OAAO,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,MAAM,IAAI,QAAQ,GAAG,IAAI,oBAAoB,CAAC;QACzD,CAAC;IACF,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,wBAAwB,EAAE,CAAC;QAClD,OAAO,GAAG,MAAM,IAAI,QAAQ,oBAAoB,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,MAAM,IAAI,QAAQ,aAAa,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC3F,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,iCAAiC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtE,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,MAAM,IAAI,QAAQ,uBAAuB,CAAC;QACrD,CAAC;IACF,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,kCAAkC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvE,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,MAAM,IAAI,QAAQ,qBAAqB,CAAC;QACnD,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,mCAAmC,CAAC,OAA8B,EAAE,QAAiB;IAC7F,IAAI,OAAO,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC3C,OAAO,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,wBAAwB,EAAE,CAAC;QAClD,OAAO,kCAAkC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC3C,OAAO,6BAA6B,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;QAC7C,OAAO,iCAAiC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;QAC9C,OAAO,kCAAkC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAY;IACnD,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAC1C,OAAyB,EACzB,OAA8B,EAC9B,QAAiB;IAEjB,MAAM,WAAW,GAAG,sCAAsC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvF,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,OAAO,GAAG,MAAM,IAAI,QAAQ,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA8B,EAAE,QAAiB;IACzF,MAAM,WAAW,GAAG,mCAAmC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3E,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC;AACrC,CAAC","sourcesContent":["import type { AssistantMessage, ProviderNativeContent } from \"@earendil-works/pi-ai\";\n\ntype NativeRecord = Record<string, unknown>;\n\ninterface SearchSource {\n\ttitle?: string;\n\turl?: string;\n\tsnippet?: string;\n\tstatus?: string;\n}\n\nfunction isRecord(value: unknown): value is NativeRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readRecord(record: NativeRecord | undefined, key: string): NativeRecord | undefined {\n\tconst value = record?.[key];\n\treturn isRecord(value) ? value : undefined;\n}\n\nfunction readArray(record: NativeRecord | undefined, key: string): unknown[] {\n\tconst value = record?.[key];\n\treturn Array.isArray(value) ? value : [];\n}\n\nfunction readString(record: NativeRecord | undefined, key: string): string | undefined {\n\tconst value = record?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStringArray(record: NativeRecord | undefined, key: string): string[] {\n\treturn readArray(record, key).filter((value): value is string => typeof value === \"string\");\n}\n\nfunction formatProviderName(message: AssistantMessage): string {\n\treturn message.provider ? `${message.provider} · ` : \"\";\n}\n\nfunction pluralize(count: number, singular: string, plural = `${singular}s`): string {\n\treturn `${count} ${count === 1 ? singular : plural}`;\n}\n\nfunction shorten(value: string, max: number): string {\n\treturn value.length <= max ? value : `${value.slice(0, max - 1)}…`;\n}\n\nfunction quoted(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction unique(values: string[]): string[] {\n\treturn [...new Set(values)];\n}\n\nfunction getWebSearchResults(raw: unknown): NativeRecord[] | undefined {\n\tif (!isRecord(raw) || !Array.isArray(raw.content)) {\n\t\treturn undefined;\n\t}\n\n\treturn raw.content.filter(isRecord).filter((item) => readString(item, \"type\") === \"web_search_result\");\n}\n\nfunction sourceFromRecord(record: NativeRecord | undefined): SearchSource | undefined {\n\tif (!record) return undefined;\n\tconst title = readString(record, \"title\") ?? readString(record, \"name\");\n\tconst url =\n\t\treadString(record, \"url\") ??\n\t\treadString(record, \"uri\") ??\n\t\treadString(record, \"retrievedUrl\") ??\n\t\treadString(record, \"sourceUrl\");\n\tconst snippet =\n\t\treadString(record, \"snippet\") ??\n\t\treadString(record, \"text\") ??\n\t\treadString(record, \"summary\") ??\n\t\treadString(record, \"page_age\");\n\tconst status = readString(record, \"status\") ?? readString(record, \"urlRetrievalStatus\");\n\tif (!title && !url && !snippet && !status) return undefined;\n\treturn { ...(title && { title }), ...(url && { url }), ...(snippet && { snippet }), ...(status && { status }) };\n}\n\nfunction sourceFromGoogleGroundingChunk(record: NativeRecord): SearchSource | undefined {\n\treturn sourceFromRecord(readRecord(record, \"web\") ?? record);\n}\n\nfunction formatQueries(queries: string[]): string[] {\n\tconst values = unique(queries);\n\tif (values.length === 0) return [];\n\tif (values.length === 1) return [`query: ${quoted(values[0])}`];\n\treturn [\"queries:\", ...values.map((query) => `- ${quoted(query)}`)];\n}\n\nfunction formatSources(sources: SearchSource[], label: \"result\" | \"source\" | \"url\", expanded: boolean): string[] {\n\tif (sources.length === 0) return [];\n\n\tconst visibleSources = expanded ? sources : sources.slice(0, 3);\n\tconst lines = [pluralize(sources.length, label)];\n\tfor (const source of visibleSources) {\n\t\tconst title = source.title ? shorten(source.title, 100) : undefined;\n\t\tconst url = source.url ? shorten(source.url, 120) : undefined;\n\t\tconst status = source.status ? ` (${source.status})` : \"\";\n\t\tif (title && url) {\n\t\t\tlines.push(`${title} ${url}${status}`);\n\t\t} else if (title) {\n\t\t\tlines.push(`${title}${status}`);\n\t\t} else if (url) {\n\t\t\tlines.push(`${url}${status}`);\n\t\t} else if (source.status) {\n\t\t\tlines.push(source.status);\n\t\t}\n\t\tif (source.snippet) {\n\t\t\tlines.push(` ${shorten(source.snippet, 160)}`);\n\t\t}\n\t}\n\tif (!expanded && sources.length > visibleSources.length) {\n\t\tlines.push(`… ${sources.length - visibleSources.length} more ${label}s`);\n\t}\n\treturn lines;\n}\n\nfunction formatServerToolUseBody(raw: unknown): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tconst input = readRecord(record, \"input\");\n\tconst query = readString(input, \"query\");\n\tif (query) {\n\t\treturn `query: ${quoted(query)}`;\n\t}\n\tconst name = readString(record, \"name\");\n\tif (name) {\n\t\treturn `name: ${name}`;\n\t}\n\treturn undefined;\n}\n\nfunction formatAnthropicWebSearchResultBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst results = getWebSearchResults(raw);\n\tif (!results) {\n\t\treturn undefined;\n\t}\n\tif (results.length === 0) {\n\t\treturn \"0 results\";\n\t}\n\n\tconst sources = results.flatMap((result) => {\n\t\tconst source = sourceFromRecord(result);\n\t\treturn source ? [source] : [];\n\t});\n\treturn formatSources(sources, \"result\", expanded).join(\"\\n\");\n}\n\nfunction formatOpenAiWebSearchCallBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst action = readRecord(record, \"action\");\n\tconst status = readString(record, \"status\");\n\tconst queries = [\n\t\t...(readString(action, \"query\") ? [readString(action, \"query\") as string] : []),\n\t\t...readStringArray(action, \"queries\"),\n\t];\n\tconst sources = readArray(action, \"sources\").flatMap((rawSource) => {\n\t\tconst source = sourceFromRecord(isRecord(rawSource) ? rawSource : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [\n\t\t...(status ? [`status: ${status}`] : []),\n\t\t...formatQueries(queries),\n\t\t...formatSources(sources, \"source\", expanded),\n\t];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleGroundingMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst queries = readStringArray(record, \"webSearchQueries\");\n\tconst sources = readArray(record, \"groundingChunks\").flatMap((rawChunk) => {\n\t\tconst source = isRecord(rawChunk) ? sourceFromGoogleGroundingChunk(rawChunk) : undefined;\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [...formatQueries(queries), ...formatSources(sources, \"source\", expanded)];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleUrlContextMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst sources = readArray(record, \"urlMetadata\").flatMap((rawUrl) => {\n\t\tconst source = sourceFromRecord(isRecord(rawUrl) ? rawUrl : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = formatSources(sources, \"url\", expanded);\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatSpecializedProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string | undefined {\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\tif (content.subtype === \"server_tool_use\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst name = readString(raw, \"name\");\n\t\tif (name) {\n\t\t\treturn `${marker} ${provider}${name} · server_tool_use`;\n\t\t}\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn `${marker} ${provider}web_search results`;\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst status = readString(raw, \"status\");\n\t\treturn `${marker} ${provider}web_search${status ? ` · ${status}` : \" · web_search_call\"}`;\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\tconst body = formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}google_search results`;\n\t\t}\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\tconst body = formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}url_context results`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction formatSpecializedProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string | undefined {\n\tif (content.subtype === \"server_tool_use\") {\n\t\treturn formatServerToolUseBody(content.raw);\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn formatAnthropicWebSearchResultBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\treturn formatOpenAiWebSearchCallBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\treturn formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\treturn formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t}\n\treturn undefined;\n}\n\nexport function stringifyProviderNative(raw: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(raw, null, 2) ?? \"null\";\n\t} catch {\n\t\treturn String(raw);\n\t}\n}\n\nexport function formatProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string {\n\tconst specialized = formatSpecializedProviderNativeSummary(message, content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\treturn `${marker} ${provider}providerNative · ${content.subtype}`;\n}\n\nexport function formatProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string {\n\tconst specialized = formatSpecializedProviderNativeBody(content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst rawJson = stringifyProviderNative(content.raw);\n\tif (expanded || rawJson.length <= 2000) {\n\t\treturn rawJson;\n\t}\n\treturn `${rawJson.slice(0, 2000)}…`;\n}\n"]}
1
+ {"version":3,"file":"provider-native-rendering.js","sourceRoot":"","sources":["../../src/modes/provider-native-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ProviderNativeContent } from \"@earendil-works/pi-ai\";\n\ntype NativeRecord = Record<string, unknown>;\n\ninterface SearchSource {\n\ttitle?: string;\n\turl?: string;\n\tsnippet?: string;\n\tstatus?: string;\n}\n\nfunction isRecord(value: unknown): value is NativeRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readRecord(record: NativeRecord | undefined, key: string): NativeRecord | undefined {\n\tconst value = record?.[key];\n\treturn isRecord(value) ? value : undefined;\n}\n\nfunction readArray(record: NativeRecord | undefined, key: string): unknown[] {\n\tconst value = record?.[key];\n\treturn Array.isArray(value) ? value : [];\n}\n\nfunction readString(record: NativeRecord | undefined, key: string): string | undefined {\n\tconst value = record?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStringArray(record: NativeRecord | undefined, key: string): string[] {\n\treturn readArray(record, key).filter((value): value is string => typeof value === \"string\");\n}\n\nfunction formatProviderName(message: AssistantMessage): string {\n\treturn message.provider ? `${message.provider} · ` : \"\";\n}\n\nfunction pluralize(count: number, singular: string, plural = `${singular}s`): string {\n\treturn `${count} ${count === 1 ? singular : plural}`;\n}\n\nfunction shorten(value: string, max: number): string {\n\treturn value.length <= max ? value : `${value.slice(0, max - 1)}…`;\n}\n\nfunction quoted(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction unique(values: string[]): string[] {\n\treturn [...new Set(values)];\n}\n\nfunction getWebSearchResults(raw: unknown): NativeRecord[] | undefined {\n\tif (!isRecord(raw) || !Array.isArray(raw.content)) {\n\t\treturn undefined;\n\t}\n\n\treturn raw.content.filter(isRecord).filter((item) => readString(item, \"type\") === \"web_search_result\");\n}\n\nfunction sourceFromRecord(record: NativeRecord | undefined): SearchSource | undefined {\n\tif (!record) return undefined;\n\tconst title = readString(record, \"title\") ?? readString(record, \"name\");\n\tconst url =\n\t\treadString(record, \"url\") ??\n\t\treadString(record, \"uri\") ??\n\t\treadString(record, \"retrievedUrl\") ??\n\t\treadString(record, \"sourceUrl\");\n\tconst snippet =\n\t\treadString(record, \"snippet\") ??\n\t\treadString(record, \"text\") ??\n\t\treadString(record, \"summary\") ??\n\t\treadString(record, \"page_age\");\n\tconst status = readString(record, \"status\") ?? readString(record, \"urlRetrievalStatus\");\n\tif (!title && !url && !snippet && !status) return undefined;\n\treturn { ...(title && { title }), ...(url && { url }), ...(snippet && { snippet }), ...(status && { status }) };\n}\n\nfunction sourceFromGoogleGroundingChunk(record: NativeRecord): SearchSource | undefined {\n\treturn sourceFromRecord(readRecord(record, \"web\") ?? record);\n}\n\nfunction formatQueries(queries: string[]): string[] {\n\tconst values = unique(queries);\n\tif (values.length === 0) return [];\n\tif (values.length === 1) return [`query: ${quoted(values[0])}`];\n\treturn [\"queries:\", ...values.map((query) => `- ${quoted(query)}`)];\n}\n\nfunction formatSources(sources: SearchSource[], label: \"result\" | \"source\" | \"url\", expanded: boolean): string[] {\n\tif (sources.length === 0) return [];\n\n\tconst visibleSources = expanded ? sources : sources.slice(0, 3);\n\tconst lines = [pluralize(sources.length, label)];\n\tfor (const source of visibleSources) {\n\t\tconst title = source.title ? shorten(source.title, 100) : undefined;\n\t\tconst url = source.url ? shorten(source.url, 120) : undefined;\n\t\tconst status = source.status ? ` (${source.status})` : \"\";\n\t\tif (title && url) {\n\t\t\tlines.push(`${title} ${url}${status}`);\n\t\t} else if (title) {\n\t\t\tlines.push(`${title}${status}`);\n\t\t} else if (url) {\n\t\t\tlines.push(`${url}${status}`);\n\t\t} else if (source.status) {\n\t\t\tlines.push(source.status);\n\t\t}\n\t\tif (source.snippet) {\n\t\t\tlines.push(` ${shorten(source.snippet, 160)}`);\n\t\t}\n\t}\n\tif (!expanded && sources.length > visibleSources.length) {\n\t\tlines.push(`… ${sources.length - visibleSources.length} more ${label}s`);\n\t}\n\treturn lines;\n}\n\n/** Decoded size of a base64 payload, computed without allocating the bytes. */\nfunction base64ByteLength(value: string): number {\n\tconst padding = value.endsWith(\"==\") ? 2 : value.endsWith(\"=\") ? 1 : 0;\n\treturn Math.max(0, Math.floor(value.length / 4) * 3 - padding);\n}\n\n/**\n * Renders an OpenAI `image_generation_call` without ever echoing the payload.\n * The base64 result is deliberately reduced to a byte count, and no path is shown:\n * the file only exists once the message_end externalization pass has replaced this\n * block with text, which this renderer never sees.\n */\nfunction formatImageGenerationCallBody(raw: unknown): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst status = readString(record, \"status\");\n\tconst result = readString(record, \"result\");\n\tconst revisedPrompt = readString(record, \"revised_prompt\");\n\tconst lines = [\n\t\t...(status ? [`status: ${status}`] : []),\n\t\t...(result ? [`${base64ByteLength(result)} bytes`] : []),\n\t\t...(revisedPrompt?.trim() ? [`revised prompt: ${shorten(revisedPrompt, 200)}`] : []),\n\t];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatServerToolUseBody(raw: unknown): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tconst input = readRecord(record, \"input\");\n\tconst query = readString(input, \"query\");\n\tif (query) {\n\t\treturn `query: ${quoted(query)}`;\n\t}\n\tconst name = readString(record, \"name\");\n\tif (name) {\n\t\treturn `name: ${name}`;\n\t}\n\treturn undefined;\n}\n\nfunction formatAnthropicWebSearchResultBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst results = getWebSearchResults(raw);\n\tif (!results) {\n\t\treturn undefined;\n\t}\n\tif (results.length === 0) {\n\t\treturn \"0 results\";\n\t}\n\n\tconst sources = results.flatMap((result) => {\n\t\tconst source = sourceFromRecord(result);\n\t\treturn source ? [source] : [];\n\t});\n\treturn formatSources(sources, \"result\", expanded).join(\"\\n\");\n}\n\nfunction formatOpenAiWebSearchCallBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst action = readRecord(record, \"action\");\n\tconst status = readString(record, \"status\");\n\tconst queries = [\n\t\t...(readString(action, \"query\") ? [readString(action, \"query\") as string] : []),\n\t\t...readStringArray(action, \"queries\"),\n\t];\n\tconst sources = readArray(action, \"sources\").flatMap((rawSource) => {\n\t\tconst source = sourceFromRecord(isRecord(rawSource) ? rawSource : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [\n\t\t...(status ? [`status: ${status}`] : []),\n\t\t...formatQueries(queries),\n\t\t...formatSources(sources, \"source\", expanded),\n\t];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleGroundingMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst queries = readStringArray(record, \"webSearchQueries\");\n\tconst sources = readArray(record, \"groundingChunks\").flatMap((rawChunk) => {\n\t\tconst source = isRecord(rawChunk) ? sourceFromGoogleGroundingChunk(rawChunk) : undefined;\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [...formatQueries(queries), ...formatSources(sources, \"source\", expanded)];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleUrlContextMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst sources = readArray(record, \"urlMetadata\").flatMap((rawUrl) => {\n\t\tconst source = sourceFromRecord(isRecord(rawUrl) ? rawUrl : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = formatSources(sources, \"url\", expanded);\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatSpecializedProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string | undefined {\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\tif (content.subtype === \"server_tool_use\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst name = readString(raw, \"name\");\n\t\tif (name) {\n\t\t\treturn `${marker} ${provider}${name} · server_tool_use`;\n\t\t}\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn `${marker} ${provider}web_search results`;\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst status = readString(raw, \"status\");\n\t\treturn `${marker} ${provider}web_search${status ? ` · ${status}` : \" · web_search_call\"}`;\n\t}\n\tif (content.subtype === \"image_generation_call\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst status = readString(raw, \"status\");\n\t\treturn `${marker} ${provider}image_generation${status ? ` · ${status}` : \" · image_generation_call\"}`;\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\tconst body = formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}google_search results`;\n\t\t}\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\tconst body = formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}url_context results`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction formatSpecializedProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string | undefined {\n\tif (content.subtype === \"server_tool_use\") {\n\t\treturn formatServerToolUseBody(content.raw);\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn formatAnthropicWebSearchResultBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\treturn formatOpenAiWebSearchCallBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"image_generation_call\") {\n\t\treturn formatImageGenerationCallBody(content.raw);\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\treturn formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\treturn formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t}\n\treturn undefined;\n}\n\nexport function stringifyProviderNative(raw: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(raw, null, 2) ?? \"null\";\n\t} catch {\n\t\treturn String(raw);\n\t}\n}\n\nexport function formatProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string {\n\tconst specialized = formatSpecializedProviderNativeSummary(message, content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\treturn `${marker} ${provider}providerNative · ${content.subtype}`;\n}\n\nexport function formatProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string {\n\tconst specialized = formatSpecializedProviderNativeBody(content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst rawJson = stringifyProviderNative(content.raw);\n\tif (expanded || rawJson.length <= 2000) {\n\t\treturn rawJson;\n\t}\n\treturn `${rawJson.slice(0, 2000)}…`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAiC/E,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CAu4BtB"}
1
+ {"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AA2C/E,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAsDD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CAg+BtB"}
@@ -15,14 +15,64 @@
15
15
  * (and whether) to end the process.
16
16
  */
17
17
  import * as crypto from "node:crypto";
18
+ import { basename, dirname, extname } from "node:path";
18
19
  import { buildLoginProviderInfos } from "../../core/auth-providers.js";
19
20
  import { emitProviderAccountsChanged, subscribeProviderAccountEvents, } from "../../core/extensions/builtin/claude-sdk-oauth/account-events.js";
20
21
  import { CLAUDE_SDK_OAUTH_PROVIDER_ID, getProviderAccounts, pinProviderAccount, removeProviderAccount, } from "../../core/extensions/builtin/claude-sdk-oauth/account-management.js";
22
+ import { isMcpControlInventoryChanged, MCP_CONTROL_INVENTORY_CHANGED_EVENT, MCP_CONTROL_INVENTORY_REQUEST_EVENT, } from "../../core/extensions/builtin/mcp/control-inventory.js";
21
23
  import { getSupportedThinkingLevels } from "../../core/thinking-levels.js";
22
24
  import { theme } from "../interactive/theme/theme.js";
23
25
  import { buildCustomUnsupportedRequest, DEFAULT_CUSTOM_EXTENSION_LABEL } from "./custom-capability.js";
24
26
  import { createRpcEventOutputBuffer } from "./event-output-buffer.js";
25
27
  import { SessionExtensionUiRequests } from "./session-extension-ui-requests.js";
28
+ function loadedExtensionName(path) {
29
+ const synthetic = /^<(?:builtin|inline):([^>]+)>$/.exec(path);
30
+ if (synthetic)
31
+ return synthetic[1];
32
+ const withoutExtension = basename(path, extname(path));
33
+ if (withoutExtension !== "index")
34
+ return withoutExtension;
35
+ const parent = dirname(path);
36
+ const parentName = basename(parent);
37
+ return parentName === "src" || parentName === "dist" ? basename(dirname(parent)) : parentName;
38
+ }
39
+ function loadedExtensions(session) {
40
+ return session.resourceLoader.getExtensions().extensions.map((extension) => ({
41
+ name: loadedExtensionName(extension.path),
42
+ path: extension.path,
43
+ sourceInfo: extension.sourceInfo,
44
+ enabled: true,
45
+ }));
46
+ }
47
+ function loadedMcpStatus(server) {
48
+ if (server.status !== undefined)
49
+ return server.status;
50
+ if (server.serverInfo !== null)
51
+ return "connected";
52
+ if (server.authStatus === "notLoggedIn")
53
+ return "needs_auth";
54
+ return "enabled";
55
+ }
56
+ function loadedMcpServers(snapshot) {
57
+ return snapshot.servers.map((server) => ({
58
+ name: server.name,
59
+ toolCount: server.tools.length,
60
+ status: loadedMcpStatus(server),
61
+ authStatus: server.authStatus,
62
+ }));
63
+ }
64
+ function loadedSurfacesFingerprint(session, extensions, mcpServers) {
65
+ return JSON.stringify({
66
+ skills: session.resourceLoader.getSkills().skills.map((skill) => ({
67
+ name: skill.name,
68
+ path: skill.filePath,
69
+ sourceInfo: skill.sourceInfo,
70
+ enabled: !skill.disableModelInvocation,
71
+ })),
72
+ extensions,
73
+ mcpServers,
74
+ });
75
+ }
26
76
  /**
27
77
  * Create a per-connection RPC handler bound to one runtime host and one sink.
28
78
  *
@@ -36,6 +86,10 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
36
86
  let session = runtimeHost.session;
37
87
  let unsubscribe;
38
88
  let unsubscribeBackpressure;
89
+ let unsubscribeLoadedSurfaces;
90
+ let mcpWireStatus = { servers: [] };
91
+ let loadedSurfacesDigest;
92
+ let suppressLoadedSurfaceEvents = false;
39
93
  const eventOutput = createRpcEventOutputBuffer(sink.writeRaw);
40
94
  const tagSessionRecord = (value) => routingSessionId === undefined ? value : { ...value, sessionId: routingSessionId };
41
95
  const output = (obj) => {
@@ -44,6 +98,44 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
44
98
  const outputEvent = (event) => {
45
99
  eventOutput.enqueueEvent(tagSessionRecord(event));
46
100
  };
101
+ const currentLoadedSurfaces = () => {
102
+ const extensions = loadedExtensions(session);
103
+ const mcpServers = loadedMcpServers(mcpWireStatus);
104
+ return {
105
+ data: { extensions, mcpServers },
106
+ digest: loadedSurfacesFingerprint(session, extensions, mcpServers),
107
+ };
108
+ };
109
+ const recordLoadedSurfaces = (emitChange) => {
110
+ const current = currentLoadedSurfaces();
111
+ const changed = loadedSurfacesDigest !== undefined && loadedSurfacesDigest !== current.digest;
112
+ loadedSurfacesDigest = current.digest;
113
+ if (emitChange && changed && !suppressLoadedSurfaceEvents) {
114
+ outputEvent({ type: "loaded_surfaces_changed" });
115
+ }
116
+ return current;
117
+ };
118
+ const requestMcpWireStatus = async () => {
119
+ let response;
120
+ const request = {
121
+ sessionId: session.sessionId,
122
+ respond(snapshot) {
123
+ response ??= snapshot;
124
+ },
125
+ };
126
+ session.resourceLoader.emitExtensionEvent?.(MCP_CONTROL_INVENTORY_REQUEST_EVENT, request);
127
+ mcpWireStatus = response === undefined ? { servers: [] } : await response;
128
+ };
129
+ const subscribeLoadedSurfaceEvents = () => {
130
+ unsubscribeLoadedSurfaces?.();
131
+ unsubscribeLoadedSurfaces = session.resourceLoader.onExtensionEvent?.(MCP_CONTROL_INVENTORY_CHANGED_EVENT, (data) => {
132
+ if (!isMcpControlInventoryChanged(data) || data.sessionId !== session.sessionId)
133
+ return;
134
+ mcpWireStatus = data.snapshot;
135
+ if (!suppressLoadedSurfaceEvents)
136
+ recordLoadedSurfaces(true);
137
+ });
138
+ };
47
139
  const unsubscribeProviderAccountEvents = subscribeProviderAccountEvents((event) => {
48
140
  if (event.type === "accounts_changed") {
49
141
  outputEvent({ type: "auth_accounts_changed", provider: event.provider });
@@ -267,12 +359,32 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
267
359
  // Tool expansion not supported in RPC mode - no TUI
268
360
  },
269
361
  });
362
+ const refreshLoadedSurfacesAfter = async (operation, resetMcp) => {
363
+ const previousDigest = loadedSurfacesDigest;
364
+ const wasSuppressed = suppressLoadedSurfaceEvents;
365
+ suppressLoadedSurfaceEvents = true;
366
+ if (resetMcp)
367
+ mcpWireStatus = { servers: [] };
368
+ try {
369
+ await operation();
370
+ await requestMcpWireStatus();
371
+ loadedSurfacesDigest = currentLoadedSurfaces().digest;
372
+ }
373
+ finally {
374
+ suppressLoadedSurfaceEvents = wasSuppressed;
375
+ }
376
+ if (!wasSuppressed && previousDigest !== undefined && previousDigest !== loadedSurfacesDigest) {
377
+ outputEvent({ type: "loaded_surfaces_changed" });
378
+ }
379
+ };
270
380
  runtimeHost.setRebindSession(async () => {
271
381
  await rebindSession();
272
382
  });
273
383
  const rebindSession = async () => {
384
+ unsubscribeLoadedSurfaces?.();
274
385
  session = runtimeHost.session;
275
- await session.bindExtensions({
386
+ subscribeLoadedSurfaceEvents();
387
+ await refreshLoadedSurfacesAfter(() => session.bindExtensions({
276
388
  uiContext: createExtensionUIContext(),
277
389
  mode: "rpc",
278
390
  commandContextActions: {
@@ -295,7 +407,9 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
295
407
  return runtimeHost.switchSession(sessionPath, options);
296
408
  },
297
409
  reload: async () => {
298
- await session.reload();
410
+ await refreshLoadedSurfacesAfter(async () => {
411
+ await session.reload();
412
+ }, false);
299
413
  },
300
414
  },
301
415
  shutdownHandler: () => {
@@ -307,9 +421,14 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
307
421
  }
308
422
  },
309
423
  onError: (err) => {
310
- output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
424
+ output({
425
+ type: "extension_error",
426
+ extensionPath: err.extensionPath,
427
+ event: err.event,
428
+ error: err.error,
429
+ });
311
430
  },
312
- });
431
+ }), true);
313
432
  unsubscribe?.();
314
433
  unsubscribeBackpressure?.();
315
434
  unsubscribe = session.subscribe((event) => {
@@ -669,6 +788,11 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
669
788
  }
670
789
  return success(id, "get_commands", { commands });
671
790
  }
791
+ case "get_loaded_surfaces": {
792
+ await requestMcpWireStatus();
793
+ const inventory = recordLoadedSurfaces(true);
794
+ return success(id, "get_loaded_surfaces", inventory.data);
795
+ }
672
796
  // =================================================================
673
797
  // Auth (task 13)
674
798
  // =================================================================
@@ -766,8 +890,10 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
766
890
  unsubscribeProviderAccountEvents();
767
891
  unsubscribe?.();
768
892
  unsubscribeBackpressure?.();
893
+ unsubscribeLoadedSurfaces?.();
769
894
  unsubscribe = undefined;
770
895
  unsubscribeBackpressure = undefined;
896
+ unsubscribeLoadedSurfaces = undefined;
771
897
  if (options.disposeRuntime !== false) {
772
898
  await runtimeHost.dispose();
773
899
  }