@code-yeongyu/senpi 2026.7.14-3 → 2026.7.16-2

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 (361) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +6 -6
  3. package/dist/bun/cli.js +2 -0
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/cli/args.js +1 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/list-models.d.ts +2 -2
  8. package/dist/cli/list-models.d.ts.map +1 -1
  9. package/dist/cli/list-models.js +3 -3
  10. package/dist/cli/list-models.js.map +1 -1
  11. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  12. package/dist/core/agent-session-runtime.js +3 -0
  13. package/dist/core/agent-session-runtime.js.map +1 -1
  14. package/dist/core/agent-session-services.d.ts +4 -3
  15. package/dist/core/agent-session-services.d.ts.map +1 -1
  16. package/dist/core/agent-session-services.js +14 -5
  17. package/dist/core/agent-session-services.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +8 -4
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +80 -29
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/auth-providers.js +1 -1
  23. package/dist/core/auth-providers.js.map +1 -1
  24. package/dist/core/auth-storage.d.ts +32 -87
  25. package/dist/core/auth-storage.d.ts.map +1 -1
  26. package/dist/core/auth-storage.js +158 -221
  27. package/dist/core/auth-storage.js.map +1 -1
  28. package/dist/core/cache-stats.d.ts +2 -2
  29. package/dist/core/cache-stats.d.ts.map +1 -1
  30. package/dist/core/cache-stats.js +1 -1
  31. package/dist/core/cache-stats.js.map +1 -1
  32. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  33. package/dist/core/dynamic-prompt/build.js +6 -1
  34. package/dist/core/dynamic-prompt/build.js.map +1 -1
  35. package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
  36. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  37. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +8 -8
  38. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  39. package/dist/core/extensions/loader.d.ts.map +1 -1
  40. package/dist/core/extensions/loader.js +8 -2
  41. package/dist/core/extensions/loader.js.map +1 -1
  42. package/dist/core/extensions/runner.d.ts +1 -0
  43. package/dist/core/extensions/runner.d.ts.map +1 -1
  44. package/dist/core/extensions/runner.js +3 -0
  45. package/dist/core/extensions/runner.js.map +1 -1
  46. package/dist/core/extensions/types.d.ts +15 -2
  47. package/dist/core/extensions/types.d.ts.map +1 -1
  48. package/dist/core/extensions/types.js.map +1 -1
  49. package/dist/core/model-config.d.ts +589 -0
  50. package/dist/core/model-config.d.ts.map +1 -0
  51. package/dist/core/model-config.js +288 -0
  52. package/dist/core/model-config.js.map +1 -0
  53. package/dist/core/model-registry.d.ts +17 -146
  54. package/dist/core/model-registry.d.ts.map +1 -1
  55. package/dist/core/model-registry.js +69 -958
  56. package/dist/core/model-registry.js.map +1 -1
  57. package/dist/core/model-resolver.d.ts +8 -5
  58. package/dist/core/model-resolver.d.ts.map +1 -1
  59. package/dist/core/model-resolver.js +18 -18
  60. package/dist/core/model-resolver.js.map +1 -1
  61. package/dist/core/model-runtime.d.ts +81 -0
  62. package/dist/core/model-runtime.d.ts.map +1 -0
  63. package/dist/core/model-runtime.js +442 -0
  64. package/dist/core/model-runtime.js.map +1 -0
  65. package/dist/core/models-store.d.ts +17 -0
  66. package/dist/core/models-store.d.ts.map +1 -0
  67. package/dist/core/models-store.js +46 -0
  68. package/dist/core/models-store.js.map +1 -0
  69. package/dist/core/provider-composer.d.ts +64 -0
  70. package/dist/core/provider-composer.d.ts.map +1 -0
  71. package/dist/core/provider-composer.js +406 -0
  72. package/dist/core/provider-composer.js.map +1 -0
  73. package/dist/core/provider-display-names.js +1 -1
  74. package/dist/core/provider-display-names.js.map +1 -1
  75. package/dist/core/radius.d.ts +0 -19
  76. package/dist/core/radius.d.ts.map +1 -1
  77. package/dist/core/radius.js +0 -28
  78. package/dist/core/radius.js.map +1 -1
  79. package/dist/core/remote-catalog-provider.d.ts +5 -0
  80. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  81. package/dist/core/remote-catalog-provider.js +83 -0
  82. package/dist/core/remote-catalog-provider.js.map +1 -0
  83. package/dist/core/runtime-credentials.d.ts +15 -0
  84. package/dist/core/runtime-credentials.d.ts.map +1 -0
  85. package/dist/core/runtime-credentials.js +35 -0
  86. package/dist/core/runtime-credentials.js.map +1 -0
  87. package/dist/core/sdk.d.ts +11 -20
  88. package/dist/core/sdk.d.ts.map +1 -1
  89. package/dist/core/sdk.js +61 -89
  90. package/dist/core/sdk.js.map +1 -1
  91. package/dist/core/skills.js +1 -1
  92. package/dist/core/skills.js.map +1 -1
  93. package/dist/index.d.ts +2 -1
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +2 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/main.d.ts.map +1 -1
  98. package/dist/main.js +10 -13
  99. package/dist/main.js.map +1 -1
  100. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  101. package/dist/modes/interactive/components/assistant-message.js +22 -10
  102. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  103. package/dist/modes/interactive/components/footer.js +1 -1
  104. package/dist/modes/interactive/components/footer.js.map +1 -1
  105. package/dist/modes/interactive/components/login-dialog.d.ts +4 -8
  106. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  107. package/dist/modes/interactive/components/login-dialog.js +14 -12
  108. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  109. package/dist/modes/interactive/components/model-selector.d.ts +13 -4
  110. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  111. package/dist/modes/interactive/components/model-selector.js +84 -41
  112. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  113. package/dist/modes/interactive/components/oauth-selector.d.ts +4 -4
  114. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  115. package/dist/modes/interactive/components/oauth-selector.js +14 -25
  116. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  117. package/dist/modes/interactive/interactive-mode.d.ts +5 -1
  118. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  119. package/dist/modes/interactive/interactive-mode.js +154 -128
  120. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  121. package/dist/package-manager-cli.d.ts.map +1 -1
  122. package/dist/package-manager-cli.js +70 -8
  123. package/dist/package-manager-cli.js.map +1 -1
  124. package/docs/custom-provider.md +6 -11
  125. package/docs/extensions.md +78 -555
  126. package/docs/models.md +2 -0
  127. package/docs/packages.md +1 -0
  128. package/docs/providers.md +23 -11
  129. package/docs/sdk.md +79 -105
  130. package/docs/usage.md +1 -0
  131. package/examples/extensions/README.md +1 -0
  132. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  133. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  134. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  135. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  136. package/examples/extensions/gondolin/package-lock.json +2 -2
  137. package/examples/extensions/gondolin/package.json +1 -1
  138. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  139. package/examples/extensions/sandbox/package-lock.json +2 -2
  140. package/examples/extensions/sandbox/package.json +1 -1
  141. package/examples/extensions/with-deps/package-lock.json +2 -2
  142. package/examples/extensions/with-deps/package.json +1 -1
  143. package/examples/sdk/02-custom-model.ts +5 -8
  144. package/examples/sdk/09-api-keys-and-oauth.ts +13 -31
  145. package/examples/sdk/12-full-control.ts +8 -13
  146. package/examples/sdk/README.md +14 -18
  147. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +16 -0
  148. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  149. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/local-module-loader.ts +2 -2
  150. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/rewrite-imports.ts +4 -4
  151. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +32 -32
  152. package/node_modules/@earendil-works/pi-agent-core/package.json +4 -4
  153. package/node_modules/@earendil-works/pi-ai/README.md +77 -23
  154. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +9 -10
  156. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +3 -2
  159. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +2 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +42 -2
  163. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +2 -0
  165. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +3 -0
  169. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts +1 -0
  171. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts.map +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js +4 -3
  173. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js.map +1 -1
  174. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +9 -0
  175. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -0
  176. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/anthropic.js +51 -116
  177. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -0
  178. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/device-code.d.ts.map +1 -0
  179. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/device-code.js.map +1 -0
  180. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts +6 -0
  181. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  182. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/github-copilot.js +18 -77
  183. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js.map +1 -0
  184. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +23 -0
  185. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -0
  186. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +49 -0
  187. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -0
  188. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  189. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/oauth-page.js.map +1 -0
  190. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts +9 -0
  191. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  192. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  193. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -0
  194. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/pkce.d.ts.map +1 -0
  195. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/pkce.js.map +1 -0
  196. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +16 -0
  197. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -0
  198. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/radius.js +31 -128
  199. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -0
  200. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.d.ts +6 -0
  201. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.d.ts.map +1 -0
  202. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.js +189 -0
  203. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.js.map +1 -0
  204. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +2 -4
  205. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  206. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +9 -7
  207. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  208. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +49 -10
  209. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  211. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts +3 -0
  212. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -0
  213. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +17 -0
  214. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -0
  215. package/node_modules/@earendil-works/pi-ai/dist/cli.js +58 -76
  216. package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
  217. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts +42 -0
  218. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts.map +1 -0
  219. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.js +2 -0
  220. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.js.map +1 -0
  221. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  222. package/node_modules/@earendil-works/pi-ai/dist/compat.js +46 -22
  223. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  224. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -1
  225. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/images-models.d.ts +4 -2
  227. package/node_modules/@earendil-works/pi-ai/dist/images-models.d.ts.map +1 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/images-models.js +5 -4
  229. package/node_modules/@earendil-works/pi-ai/dist/images-models.js.map +1 -1
  230. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +2 -1
  231. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  232. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  233. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  234. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +25 -0
  235. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -0
  236. package/node_modules/@earendil-works/pi-ai/dist/models-store.js +16 -0
  237. package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -0
  238. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +69 -30
  239. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  240. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +270 -114
  241. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-ai/dist/models.js +217 -31
  243. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  244. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts +2 -1
  245. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts.map +1 -1
  246. package/node_modules/@earendil-works/pi-ai/dist/oauth.js +1 -1
  247. package/node_modules/@earendil-works/pi-ai/dist/oauth.js.map +1 -1
  248. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +2 -1
  249. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  250. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +3 -0
  251. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  252. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  253. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +51 -10
  254. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  255. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  256. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +1 -1
  257. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  258. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  259. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js +4 -3
  260. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  261. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +13 -20
  263. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -1
  264. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.d.ts +8 -0
  265. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.d.ts.map +1 -0
  266. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.js +21 -0
  267. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.js.map +1 -0
  268. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  269. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.js +2 -1
  270. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.js.map +1 -1
  271. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.d.ts.map +1 -1
  272. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.js +11 -1
  273. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.js.map +1 -1
  274. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  275. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +56 -5
  276. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  277. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +66 -0
  278. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  279. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +42 -0
  280. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  281. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts +36 -0
  282. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  283. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +19 -0
  284. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -1
  285. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts +36 -0
  286. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts.map +1 -1
  287. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +19 -0
  288. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -1
  289. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.d.ts.map +1 -1
  290. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js +1 -1
  291. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js.map +1 -1
  292. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +42 -0
  293. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +178 -142
  295. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  296. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.d.ts +26 -0
  297. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.d.ts.map +1 -0
  298. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.js +59 -0
  299. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.js.map +1 -0
  300. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.d.ts +9 -0
  301. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.d.ts.map +1 -0
  302. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js +54 -0
  303. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js.map +1 -0
  304. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +84 -0
  305. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  306. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +72 -0
  307. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  308. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.d.ts +1 -1
  309. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.d.ts.map +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.js +15 -3
  311. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +6 -114
  313. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -1
  314. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +3 -92
  315. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +2 -0
  317. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  319. package/node_modules/@earendil-works/pi-ai/package.json +6 -1
  320. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  321. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  322. package/node_modules/@earendil-works/pi-tui/dist/utils.js +22 -4
  323. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  324. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  325. package/package.json +6 -6
  326. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts +0 -27
  327. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  328. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +0 -1
  329. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +0 -1
  330. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +0 -1
  331. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts +0 -32
  332. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  333. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +0 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +0 -59
  335. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +0 -1
  336. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +0 -131
  337. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +0 -1
  338. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.d.ts +0 -5
  339. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.d.ts.map +0 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.js +0 -22
  341. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.js.map +0 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.js.map +0 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts +0 -45
  345. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  346. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +0 -1
  347. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.d.ts.map +0 -1
  348. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.js.map +0 -1
  349. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts +0 -39
  350. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts.map +0 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js.map +0 -1
  352. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts +0 -64
  353. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +0 -1
  354. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.js +0 -2
  355. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.js.map +0 -1
  356. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  357. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/device-code.js +0 -0
  358. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  359. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  360. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  361. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/pkce.js +0 -0
@@ -0,0 +1,442 @@
1
+ import { dirname, join } from "node:path";
2
+ import { createModels, lazyStream, ModelsError, } from "@earendil-works/pi-ai";
3
+ import * as builtinProviderCatalog from "@earendil-works/pi-ai/providers/all";
4
+ import { getAgentDir } from "../config.js";
5
+ import { AuthStorage as DefaultAuthStorage } from "./auth-storage.js";
6
+ import { ModelConfig } from "./model-config.js";
7
+ import { FileModelsStore, InMemoryCodingAgentModelsStore } from "./models-store.js";
8
+ import { composeModelProvider, configuredRequestAuthStatus, resolveCompatibilityRequestConfig, resolveConfiguredModelHeaders, validateExtensionProvider, } from "./provider-composer.js";
9
+ import { withRemoteCatalog } from "./remote-catalog-provider.js";
10
+ import { RuntimeCredentials } from "./runtime-credentials.js";
11
+ function mergeHeaders(base, override) {
12
+ if (!base && !override)
13
+ return undefined;
14
+ const merged = { ...base };
15
+ for (const [name, value] of Object.entries(override ?? {})) {
16
+ const lowerName = name.toLowerCase();
17
+ for (const existingName of Object.keys(merged)) {
18
+ if (existingName.toLowerCase() === lowerName)
19
+ delete merged[existingName];
20
+ }
21
+ merged[name] = value;
22
+ }
23
+ return merged;
24
+ }
25
+ /** Configured pi-ai Models collection used by coding-agent and SDK consumers. */
26
+ export class ModelRuntime {
27
+ constructor(credentials, config, modelsPath, modelsStore, providers, allowModelNetwork) {
28
+ this.builtins = new Map();
29
+ this.extensionProviders = new Map();
30
+ this.compositionErrors = new Map();
31
+ this.snapshot = {
32
+ all: [],
33
+ available: [],
34
+ configuredProviders: new Set(),
35
+ storedProviders: new Set(),
36
+ auth: new Map(),
37
+ };
38
+ this.availabilityInitialized = false;
39
+ this.credentials = credentials;
40
+ this.config = config;
41
+ this.modelsPath = modelsPath;
42
+ this.allowModelNetwork = allowModelNetwork;
43
+ this.defaultBuiltins = new Map(providers.map((provider) => [provider.id, provider]));
44
+ for (const [providerId, provider] of this.defaultBuiltins)
45
+ this.builtins.set(providerId, provider);
46
+ this.models = createModels({ credentials, modelsStore });
47
+ this.rebuildProviders();
48
+ }
49
+ static async create(options = {}) {
50
+ const credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));
51
+ const modelsPath = options.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), "models.json"));
52
+ const config = await ModelConfig.load(modelsPath);
53
+ const modelsStore = options.modelsStore ??
54
+ (modelsPath
55
+ ? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), "models-store.json"))
56
+ : new InMemoryCodingAgentModelsStore());
57
+ const providers = builtinProviderCatalog
58
+ .builtinProviders()
59
+ .map((provider) => provider.id === "radius" ? provider : withRemoteCatalog(provider, options.catalogBaseUrl));
60
+ const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, options.allowModelNetwork ?? process.env.PI_OFFLINE === undefined);
61
+ runtime.configureRadiusProviders();
62
+ runtime.rebuildProviders();
63
+ const controller = new AbortController();
64
+ const timeout = runtime.allowModelNetwork
65
+ ? setTimeout(() => controller.abort(), options.modelRefreshTimeoutMs ?? 15_000)
66
+ : undefined;
67
+ try {
68
+ await runtime.refresh({ allowNetwork: runtime.allowModelNetwork, signal: controller.signal });
69
+ }
70
+ finally {
71
+ if (timeout)
72
+ clearTimeout(timeout);
73
+ }
74
+ return runtime;
75
+ }
76
+ /** Synchronous compatibility constructor for legacy ModelRegistry callers. */
77
+ static createSync(options = {}) {
78
+ const credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));
79
+ const modelsPath = options.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), "models.json"));
80
+ const config = ModelConfig.loadSync(modelsPath);
81
+ const modelsStore = options.modelsStore ??
82
+ (modelsPath
83
+ ? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), "models-store.json"))
84
+ : new InMemoryCodingAgentModelsStore());
85
+ const providers = builtinProviderCatalog
86
+ .builtinProviders()
87
+ .map((provider) => provider.id === "radius" ? provider : withRemoteCatalog(provider, options.catalogBaseUrl));
88
+ const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, options.allowModelNetwork ?? false);
89
+ runtime.configureRadiusProviders();
90
+ runtime.rebuildProviders();
91
+ return runtime;
92
+ }
93
+ configureRadiusProviders() {
94
+ this.builtins.clear();
95
+ for (const [providerId, provider] of this.defaultBuiltins)
96
+ this.builtins.set(providerId, provider);
97
+ for (const providerId of this.config.getProviderIds()) {
98
+ const config = this.config.getProvider(providerId);
99
+ if (config?.oauth !== "radius" || !config.baseUrl)
100
+ continue;
101
+ this.builtins.set(providerId, builtinProviderCatalog.radiusProvider({
102
+ id: providerId,
103
+ name: config.name ?? providerId,
104
+ gateway: config.baseUrl.replace(/\/v1\/?$/u, ""),
105
+ }));
106
+ }
107
+ }
108
+ providerIds() {
109
+ return new Set([...this.builtins.keys(), ...this.config.getProviderIds(), ...this.extensionProviders.keys()]);
110
+ }
111
+ recomposeProvider(providerId) {
112
+ if (this.config.isProviderDisabled(providerId)) {
113
+ this.models.deleteProvider(providerId);
114
+ this.compositionErrors.delete(providerId);
115
+ return;
116
+ }
117
+ const base = this.builtins.get(providerId);
118
+ const extension = this.extensionProviders.get(providerId);
119
+ if (!base && !this.config.getProvider(providerId) && !extension) {
120
+ this.models.deleteProvider(providerId);
121
+ this.compositionErrors.delete(providerId);
122
+ return;
123
+ }
124
+ if (base && !this.config.getProvider(providerId) && !extension) {
125
+ // No overlays: use the builtin untouched so its auth/login/stream behavior is exact.
126
+ this.models.setProvider(base);
127
+ this.compositionErrors.delete(providerId);
128
+ return;
129
+ }
130
+ try {
131
+ this.models.setProvider(composeModelProvider(providerId, base, this.config, extension));
132
+ this.compositionErrors.delete(providerId);
133
+ }
134
+ catch (error) {
135
+ this.compositionErrors.set(providerId, error instanceof Error ? error.message : String(error));
136
+ if (base)
137
+ this.models.setProvider(base);
138
+ else
139
+ this.models.deleteProvider(providerId);
140
+ }
141
+ }
142
+ rebuildProviders() {
143
+ this.models.clearProviders();
144
+ this.compositionErrors.clear();
145
+ for (const providerId of this.providerIds())
146
+ this.recomposeProvider(providerId);
147
+ this.updateModelSnapshot();
148
+ }
149
+ updateModelSnapshot() {
150
+ const all = [...this.models.getModels()];
151
+ this.snapshot = {
152
+ ...this.snapshot,
153
+ all,
154
+ available: all.filter((model) => this.snapshot.configuredProviders.has(model.provider)),
155
+ };
156
+ }
157
+ async runAvailabilityRefresh() {
158
+ const providers = this.models.getProviders();
159
+ const [available, checks, credentials] = await Promise.all([
160
+ this.models.getAvailable(),
161
+ Promise.all(providers.map(async (provider) => [
162
+ provider.id,
163
+ await this.models.checkAuth(provider.id),
164
+ ])),
165
+ this.credentials.list(),
166
+ ]);
167
+ const auth = new Map(checks);
168
+ const configuredProviders = new Set(checks
169
+ .filter((entry) => entry[1] !== undefined)
170
+ .map(([providerId]) => providerId));
171
+ this.snapshot = {
172
+ all: [...this.models.getModels()],
173
+ available: [...available],
174
+ configuredProviders,
175
+ storedProviders: new Set(credentials.map((entry) => entry.providerId)),
176
+ auth,
177
+ };
178
+ this.availabilityInitialized = true;
179
+ this.availabilityError = undefined;
180
+ }
181
+ queueAvailabilityRefresh(after) {
182
+ const refresh = (after ?? Promise.resolve()).catch(() => { }).then(() => this.runAvailabilityRefresh());
183
+ const recorded = refresh.catch((error) => {
184
+ this.availabilityError = error instanceof Error ? error.message : String(error);
185
+ throw error;
186
+ });
187
+ const tracked = recorded.finally(() => {
188
+ if (this.availabilityRefresh === tracked)
189
+ this.availabilityRefresh = undefined;
190
+ });
191
+ this.availabilityRefresh = tracked;
192
+ return tracked;
193
+ }
194
+ /** Coalesce concurrent readers onto the pending refresh. */
195
+ refreshAvailability() {
196
+ return this.availabilityRefresh ?? this.queueAvailabilityRefresh(undefined);
197
+ }
198
+ /** Mutations must not observe an in-flight refresh started before them. */
199
+ forceRefreshAvailability() {
200
+ return this.queueAvailabilityRefresh(this.availabilityRefresh);
201
+ }
202
+ getProviders() {
203
+ return this.models.getProviders();
204
+ }
205
+ getProvider(providerId) {
206
+ return this.models.getProvider(providerId);
207
+ }
208
+ getModels(providerId) {
209
+ return this.models.getModels(providerId);
210
+ }
211
+ getModel(providerId, modelId) {
212
+ return this.models.getModel(providerId, modelId);
213
+ }
214
+ async checkAuth(providerId) {
215
+ return this.models.checkAuth(providerId);
216
+ }
217
+ async getAvailable(providerId) {
218
+ if (providerId) {
219
+ if (this.availabilityRefresh) {
220
+ await this.availabilityRefresh;
221
+ return this.snapshot.available.filter((model) => model.provider === providerId);
222
+ }
223
+ try {
224
+ return await this.models.getAvailable(providerId);
225
+ }
226
+ catch (error) {
227
+ this.availabilityError = error instanceof Error ? error.message : String(error);
228
+ throw error;
229
+ }
230
+ }
231
+ await this.refreshAvailability();
232
+ return this.snapshot.available;
233
+ }
234
+ getAvailableSnapshot() {
235
+ return this.snapshot.available;
236
+ }
237
+ hasAvailabilitySnapshot() {
238
+ return this.availabilityInitialized;
239
+ }
240
+ getError() {
241
+ const errors = [];
242
+ const configError = this.config.getError();
243
+ if (configError)
244
+ errors.push(configError);
245
+ for (const [providerId, error] of this.compositionErrors) {
246
+ errors.push(`Provider "${providerId}": ${error}`);
247
+ }
248
+ if (this.availabilityError)
249
+ errors.push(`Availability refresh: ${this.availabilityError}`);
250
+ return errors.length > 0 ? errors.join("\n\n") : undefined;
251
+ }
252
+ getRegisteredProviderConfig(providerId) {
253
+ return this.extensionProviders.get(providerId);
254
+ }
255
+ getRegisteredProviderIds() {
256
+ return [...this.extensionProviders.keys()];
257
+ }
258
+ /** @internal Compatibility fallback for ModelRegistry when provider auth is unconfigured. */
259
+ getCompatibilityRequestConfig(model, env) {
260
+ return resolveCompatibilityRequestConfig(model, this.config.getProvider(model.provider), this.extensionProviders.get(model.provider), env);
261
+ }
262
+ isUsingOAuth(providerId) {
263
+ return this.snapshot.auth.get(providerId)?.type === "oauth";
264
+ }
265
+ hasConfiguredAuth(providerId) {
266
+ return this.snapshot.configuredProviders.has(providerId);
267
+ }
268
+ async getAuth(providerOrModel, overrides = {}) {
269
+ if (typeof providerOrModel === "string")
270
+ return this.models.getAuth(providerOrModel, overrides);
271
+ const resolution = await this.models.getAuth(providerOrModel, overrides);
272
+ if (!resolution)
273
+ return undefined;
274
+ const configuredHeaders = resolveConfiguredModelHeaders(providerOrModel, this.config.getProvider(providerOrModel.provider), this.extensionProviders.get(providerOrModel.provider), { ...(resolution.env ?? {}), ...(overrides.env ?? {}) });
275
+ return {
276
+ ...resolution,
277
+ auth: {
278
+ ...resolution.auth,
279
+ headers: mergeHeaders(resolution.auth.headers, configuredHeaders),
280
+ },
281
+ };
282
+ }
283
+ async setRuntimeApiKey(providerId, apiKey) {
284
+ this.credentials.setRuntimeApiKey(providerId, apiKey);
285
+ const auth = new Map(this.snapshot.auth).set(providerId, { type: "api_key", source: "runtime API key" });
286
+ const configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);
287
+ const storedProviders = new Set(this.snapshot.storedProviders).add(providerId);
288
+ this.snapshot = {
289
+ ...this.snapshot,
290
+ auth,
291
+ configuredProviders,
292
+ storedProviders,
293
+ available: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),
294
+ };
295
+ await this.refresh({ allowNetwork: this.allowModelNetwork });
296
+ }
297
+ async removeRuntimeApiKey(providerId) {
298
+ this.credentials.removeRuntimeApiKey(providerId);
299
+ await this.refresh({ allowNetwork: this.allowModelNetwork });
300
+ }
301
+ listCredentials() {
302
+ return this.credentials.list();
303
+ }
304
+ getProviderAuthStatus(providerId) {
305
+ if (this.credentials.hasRuntimeApiKey(providerId))
306
+ return { configured: true, source: "runtime" };
307
+ if (this.snapshot.storedProviders.has(providerId))
308
+ return { configured: true, source: "stored" };
309
+ const configured = configuredRequestAuthStatus(this.config.getProvider(providerId), this.extensionProviders.get(providerId));
310
+ if (configured)
311
+ return configured;
312
+ const check = this.snapshot.auth.get(providerId);
313
+ return check ? { configured: true, source: "environment", label: check.source } : { configured: false };
314
+ }
315
+ async prepareRequest(model, options) {
316
+ const provider = this.models.getProvider(model.provider);
317
+ if (!provider)
318
+ throw new ModelsError("provider", `Unknown provider: ${model.provider}`);
319
+ const resolution = await this.getAuth(model, { apiKey: options?.apiKey, env: options?.env });
320
+ if (!resolution)
321
+ throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
322
+ const { transformHeaders, ...providerOptions } = options ?? {};
323
+ let headers = mergeHeaders(resolution.auth.headers, providerOptions.headers);
324
+ if (transformHeaders)
325
+ headers = await transformHeaders(headers ?? {});
326
+ const compatibility = this.getCompatibilityRequestConfig(model, resolution.env);
327
+ const extraBody = compatibility.extraBody || providerOptions.extraBody
328
+ ? { ...compatibility.extraBody, ...providerOptions.extraBody }
329
+ : undefined;
330
+ const env = resolution.env || providerOptions.env
331
+ ? { ...(resolution.env ?? {}), ...(providerOptions.env ?? {}) }
332
+ : undefined;
333
+ return {
334
+ provider,
335
+ model: resolution.auth.baseUrl ? { ...model, baseUrl: resolution.auth.baseUrl } : model,
336
+ options: {
337
+ ...providerOptions,
338
+ apiKey: providerOptions.apiKey ?? resolution.auth.apiKey,
339
+ headers,
340
+ extraBody,
341
+ env,
342
+ },
343
+ };
344
+ }
345
+ stream(model, context, options) {
346
+ return lazyStream(model, async () => {
347
+ const prepared = await this.prepareRequest(model, options);
348
+ return prepared.provider.stream(prepared.model, context, prepared.options);
349
+ });
350
+ }
351
+ complete(model, context, options) {
352
+ return this.stream(model, context, options).result();
353
+ }
354
+ streamSimple(model, context, options) {
355
+ return lazyStream(model, async () => {
356
+ const prepared = await this.prepareRequest(model, options);
357
+ return prepared.provider.streamSimple(prepared.model, context, prepared.options);
358
+ });
359
+ }
360
+ completeSimple(model, context, options) {
361
+ return this.streamSimple(model, context, options).result();
362
+ }
363
+ async login(providerId, type, interaction) {
364
+ const credential = await this.models.login(providerId, type, interaction);
365
+ await this.refresh({ allowNetwork: this.allowModelNetwork });
366
+ return credential;
367
+ }
368
+ async logout(providerId) {
369
+ await this.models.logout(providerId);
370
+ // Reset credential-dependent compatibility projections before the unconfigured provider is skipped by refresh.
371
+ this.recomposeProvider(providerId);
372
+ await this.refresh({ allowNetwork: this.allowModelNetwork });
373
+ }
374
+ async reloadConfig() {
375
+ this.config = await ModelConfig.load(this.modelsPath);
376
+ this.configureRadiusProviders();
377
+ this.rebuildProviders();
378
+ await this.refresh({ allowNetwork: this.allowModelNetwork });
379
+ }
380
+ async refresh(options = {}) {
381
+ const refreshOptions = {
382
+ ...options,
383
+ allowNetwork: options.allowNetwork ?? this.allowModelNetwork,
384
+ };
385
+ // Published pi-ai builds before ModelsStore returned void and accepted a provider ID.
386
+ // The fallback keeps source-mode CLI tests working without rebuilding workspace dependencies.
387
+ const result = (await this.models.refresh(refreshOptions)) ?? {
388
+ aborted: refreshOptions.signal?.aborted ?? false,
389
+ errors: new Map(),
390
+ };
391
+ this.updateModelSnapshot();
392
+ try {
393
+ await this.forceRefreshAvailability();
394
+ }
395
+ catch {
396
+ // Availability errors are recorded by forceRefreshAvailability; refreshed models remain usable.
397
+ }
398
+ return result;
399
+ }
400
+ registerProvider(providerId, config) {
401
+ // Validate the incoming registration on its own, like the legacy registry:
402
+ // a broken re-registration must throw without touching the stored config.
403
+ validateExtensionProvider(providerId, this.builtins.get(providerId), this.config.getProvider(providerId), config);
404
+ // Re-registration merges defined values over the previous registration and
405
+ // preserves undefined ones, matching the legacy ModelRegistry contract.
406
+ const previous = this.extensionProviders.get(providerId);
407
+ const effective = { ...previous };
408
+ for (const [key, value] of Object.entries(config)) {
409
+ if (value !== undefined)
410
+ effective[key] = value;
411
+ }
412
+ this.extensionProviders.set(providerId, effective);
413
+ this.recomposeProvider(providerId);
414
+ this.updateModelSnapshot();
415
+ if (this.snapshot.storedProviders.has(providerId) ||
416
+ configuredRequestAuthStatus(this.config.getProvider(providerId), effective)?.configured) {
417
+ const configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);
418
+ const auth = new Map(this.snapshot.auth);
419
+ // Provisional entry until the async refresh lands; never clobber a real check result.
420
+ if (!auth.get(providerId)) {
421
+ auth.set(providerId, {
422
+ type: effective.oauth && !effective.apiKey ? "oauth" : "api_key",
423
+ source: "configured provider",
424
+ });
425
+ }
426
+ this.snapshot = {
427
+ ...this.snapshot,
428
+ auth,
429
+ configuredProviders,
430
+ available: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),
431
+ };
432
+ }
433
+ void this.refresh({ allowNetwork: false });
434
+ }
435
+ unregisterProvider(providerId) {
436
+ this.extensionProviders.delete(providerId);
437
+ this.recomposeProvider(providerId);
438
+ this.updateModelSnapshot();
439
+ void this.refresh({ allowNetwork: false });
440
+ }
441
+ }
442
+ //# sourceMappingURL=model-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-runtime.js","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, join } from \"node:path\";\nimport {\n\ttype Api,\n\ttype ApiStreamOptions,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype AuthCheck,\n\ttype AuthInteraction,\n\ttype AuthResult,\n\ttype AuthType,\n\ttype Context,\n\ttype Credential,\n\ttype CredentialInfo,\n\ttype CredentialStore,\n\tcreateModels,\n\tlazyStream,\n\ttype Model,\n\ttype Models,\n\ttype ModelsApiStreamOptions,\n\tModelsError,\n\ttype ModelsRefreshOptions,\n\ttype ModelsRefreshResult,\n\ttype ModelsSimpleStreamOptions,\n\ttype ModelsStore,\n\ttype ModelsStreamTransforms,\n\ttype MutableModels,\n\ttype Provider,\n\ttype ProviderHeaders,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport * as builtinProviderCatalog from \"@earendil-works/pi-ai/providers/all\";\nimport { getAgentDir } from \"../config.ts\";\nimport { AuthStorage as DefaultAuthStorage } from \"./auth-storage.ts\";\nimport { ModelConfig } from \"./model-config.ts\";\nimport { FileModelsStore, InMemoryCodingAgentModelsStore } from \"./models-store.ts\";\nimport {\n\ttype AuthStatus,\n\ttype CompatibilityRequestConfig,\n\tcomposeModelProvider,\n\tconfiguredRequestAuthStatus,\n\ttype ProviderConfigInput,\n\tresolveCompatibilityRequestConfig,\n\tresolveConfiguredModelHeaders,\n\tvalidateExtensionProvider,\n} from \"./provider-composer.ts\";\nimport { withRemoteCatalog } from \"./remote-catalog-provider.ts\";\nimport { RuntimeCredentials } from \"./runtime-credentials.ts\";\n\ninterface ModelRuntimeSnapshot {\n\tall: readonly Model<Api>[];\n\tavailable: readonly Model<Api>[];\n\tconfiguredProviders: ReadonlySet<string>;\n\tstoredProviders: ReadonlySet<string>;\n\tauth: ReadonlyMap<string, AuthCheck | undefined>;\n}\n\nexport interface CreateModelRuntimeOptions {\n\t/** Credential storage. Defaults to the file at authPath. */\n\tcredentials?: CredentialStore;\n\tauthPath?: string;\n\tmodelsPath?: string | null;\n\tmodelsStore?: ModelsStore;\n\tmodelsStorePath?: string;\n\tallowModelNetwork?: boolean;\n\tmodelRefreshTimeoutMs?: number;\n\tcatalogBaseUrl?: string;\n}\n\nexport interface ModelRuntimeAuthOverrides {\n\tapiKey?: string;\n\tenv?: Record<string, string>;\n}\n\nfunction mergeHeaders(\n\tbase: ProviderHeaders | undefined,\n\toverride: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n\tif (!base && !override) return undefined;\n\tconst merged = { ...base };\n\tfor (const [name, value] of Object.entries(override ?? {})) {\n\t\tconst lowerName = name.toLowerCase();\n\t\tfor (const existingName of Object.keys(merged)) {\n\t\t\tif (existingName.toLowerCase() === lowerName) delete merged[existingName];\n\t\t}\n\t\tmerged[name] = value;\n\t}\n\treturn merged;\n}\n\n/** Configured pi-ai Models collection used by coding-agent and SDK consumers. */\nexport class ModelRuntime implements Models {\n\tprivate readonly models: MutableModels;\n\tprivate readonly credentials: RuntimeCredentials;\n\tprivate readonly defaultBuiltins: ReadonlyMap<string, Provider>;\n\tprivate readonly builtins = new Map<string, Provider>();\n\tprivate readonly extensionProviders = new Map<string, ProviderConfigInput>();\n\tprivate readonly compositionErrors = new Map<string, string>();\n\tprivate readonly modelsPath: string | undefined;\n\tprivate readonly allowModelNetwork: boolean;\n\tprivate config: ModelConfig;\n\tprivate snapshot: ModelRuntimeSnapshot = {\n\t\tall: [],\n\t\tavailable: [],\n\t\tconfiguredProviders: new Set(),\n\t\tstoredProviders: new Set(),\n\t\tauth: new Map(),\n\t};\n\tprivate availabilityRefresh: Promise<void> | undefined;\n\tprivate availabilityInitialized = false;\n\tprivate availabilityError: string | undefined;\n\n\tprivate constructor(\n\t\tcredentials: RuntimeCredentials,\n\t\tconfig: ModelConfig,\n\t\tmodelsPath: string | undefined,\n\t\tmodelsStore: ModelsStore,\n\t\tproviders: readonly Provider[],\n\t\tallowModelNetwork: boolean,\n\t) {\n\t\tthis.credentials = credentials;\n\t\tthis.config = config;\n\t\tthis.modelsPath = modelsPath;\n\t\tthis.allowModelNetwork = allowModelNetwork;\n\t\tthis.defaultBuiltins = new Map(providers.map((provider) => [provider.id, provider]));\n\t\tfor (const [providerId, provider] of this.defaultBuiltins) this.builtins.set(providerId, provider);\n\t\tthis.models = createModels({ credentials, modelsStore });\n\t\tthis.rebuildProviders();\n\t}\n\n\tstatic async create(options: CreateModelRuntimeOptions = {}): Promise<ModelRuntime> {\n\t\tconst credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));\n\t\tconst modelsPath =\n\t\t\toptions.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), \"models.json\"));\n\t\tconst config = await ModelConfig.load(modelsPath);\n\t\tconst modelsStore =\n\t\t\toptions.modelsStore ??\n\t\t\t(modelsPath\n\t\t\t\t? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), \"models-store.json\"))\n\t\t\t\t: new InMemoryCodingAgentModelsStore());\n\t\tconst providers = builtinProviderCatalog\n\t\t\t.builtinProviders()\n\t\t\t.map((provider) =>\n\t\t\t\tprovider.id === \"radius\" ? provider : withRemoteCatalog(provider, options.catalogBaseUrl),\n\t\t\t);\n\t\tconst runtime = new ModelRuntime(\n\t\t\tcredentials,\n\t\t\tconfig,\n\t\t\tmodelsPath,\n\t\t\tmodelsStore,\n\t\t\tproviders,\n\t\t\toptions.allowModelNetwork ?? process.env.PI_OFFLINE === undefined,\n\t\t);\n\t\truntime.configureRadiusProviders();\n\t\truntime.rebuildProviders();\n\t\tconst controller = new AbortController();\n\t\tconst timeout = runtime.allowModelNetwork\n\t\t\t? setTimeout(() => controller.abort(), options.modelRefreshTimeoutMs ?? 15_000)\n\t\t\t: undefined;\n\t\ttry {\n\t\t\tawait runtime.refresh({ allowNetwork: runtime.allowModelNetwork, signal: controller.signal });\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t}\n\t\treturn runtime;\n\t}\n\n\t/** Synchronous compatibility constructor for legacy ModelRegistry callers. */\n\tstatic createSync(options: CreateModelRuntimeOptions = {}): ModelRuntime {\n\t\tconst credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));\n\t\tconst modelsPath =\n\t\t\toptions.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), \"models.json\"));\n\t\tconst config = ModelConfig.loadSync(modelsPath);\n\t\tconst modelsStore =\n\t\t\toptions.modelsStore ??\n\t\t\t(modelsPath\n\t\t\t\t? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), \"models-store.json\"))\n\t\t\t\t: new InMemoryCodingAgentModelsStore());\n\t\tconst providers = builtinProviderCatalog\n\t\t\t.builtinProviders()\n\t\t\t.map((provider) =>\n\t\t\t\tprovider.id === \"radius\" ? provider : withRemoteCatalog(provider, options.catalogBaseUrl),\n\t\t\t);\n\t\tconst runtime = new ModelRuntime(\n\t\t\tcredentials,\n\t\t\tconfig,\n\t\t\tmodelsPath,\n\t\t\tmodelsStore,\n\t\t\tproviders,\n\t\t\toptions.allowModelNetwork ?? false,\n\t\t);\n\t\truntime.configureRadiusProviders();\n\t\truntime.rebuildProviders();\n\t\treturn runtime;\n\t}\n\n\tprivate configureRadiusProviders(): void {\n\t\tthis.builtins.clear();\n\t\tfor (const [providerId, provider] of this.defaultBuiltins) this.builtins.set(providerId, provider);\n\t\tfor (const providerId of this.config.getProviderIds()) {\n\t\t\tconst config = this.config.getProvider(providerId);\n\t\t\tif (config?.oauth !== \"radius\" || !config.baseUrl) continue;\n\t\t\tthis.builtins.set(\n\t\t\t\tproviderId,\n\t\t\t\tbuiltinProviderCatalog.radiusProvider({\n\t\t\t\t\tid: providerId,\n\t\t\t\t\tname: config.name ?? providerId,\n\t\t\t\t\tgateway: config.baseUrl.replace(/\\/v1\\/?$/u, \"\"),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate providerIds(): Set<string> {\n\t\treturn new Set([...this.builtins.keys(), ...this.config.getProviderIds(), ...this.extensionProviders.keys()]);\n\t}\n\n\tprivate recomposeProvider(providerId: string): void {\n\t\tif (this.config.isProviderDisabled(providerId)) {\n\t\t\tthis.models.deleteProvider(providerId);\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t\treturn;\n\t\t}\n\t\tconst base = this.builtins.get(providerId);\n\t\tconst extension = this.extensionProviders.get(providerId);\n\t\tif (!base && !this.config.getProvider(providerId) && !extension) {\n\t\t\tthis.models.deleteProvider(providerId);\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t\treturn;\n\t\t}\n\t\tif (base && !this.config.getProvider(providerId) && !extension) {\n\t\t\t// No overlays: use the builtin untouched so its auth/login/stream behavior is exact.\n\t\t\tthis.models.setProvider(base);\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.models.setProvider(composeModelProvider(providerId, base, this.config, extension));\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t} catch (error) {\n\t\t\tthis.compositionErrors.set(providerId, error instanceof Error ? error.message : String(error));\n\t\t\tif (base) this.models.setProvider(base);\n\t\t\telse this.models.deleteProvider(providerId);\n\t\t}\n\t}\n\n\tprivate rebuildProviders(): void {\n\t\tthis.models.clearProviders();\n\t\tthis.compositionErrors.clear();\n\t\tfor (const providerId of this.providerIds()) this.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t}\n\n\tprivate updateModelSnapshot(): void {\n\t\tconst all = [...this.models.getModels()];\n\t\tthis.snapshot = {\n\t\t\t...this.snapshot,\n\t\t\tall,\n\t\t\tavailable: all.filter((model) => this.snapshot.configuredProviders.has(model.provider)),\n\t\t};\n\t}\n\n\tprivate async runAvailabilityRefresh(): Promise<void> {\n\t\tconst providers = this.models.getProviders();\n\t\tconst [available, checks, credentials] = await Promise.all([\n\t\t\tthis.models.getAvailable(),\n\t\t\tPromise.all(\n\t\t\t\tproviders.map(\n\t\t\t\t\tasync (provider): Promise<[string, AuthCheck | undefined]> => [\n\t\t\t\t\t\tprovider.id,\n\t\t\t\t\t\tawait this.models.checkAuth(provider.id),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.credentials.list(),\n\t\t]);\n\t\tconst auth = new Map(checks);\n\t\tconst configuredProviders = new Set(\n\t\t\tchecks\n\t\t\t\t.filter((entry): entry is [string, AuthCheck] => entry[1] !== undefined)\n\t\t\t\t.map(([providerId]) => providerId),\n\t\t);\n\t\tthis.snapshot = {\n\t\t\tall: [...this.models.getModels()],\n\t\t\tavailable: [...available],\n\t\t\tconfiguredProviders,\n\t\t\tstoredProviders: new Set(credentials.map((entry) => entry.providerId)),\n\t\t\tauth,\n\t\t};\n\t\tthis.availabilityInitialized = true;\n\t\tthis.availabilityError = undefined;\n\t}\n\n\tprivate queueAvailabilityRefresh(after: Promise<void> | undefined): Promise<void> {\n\t\tconst refresh = (after ?? Promise.resolve()).catch(() => {}).then(() => this.runAvailabilityRefresh());\n\t\tconst recorded = refresh.catch((error) => {\n\t\t\tthis.availabilityError = error instanceof Error ? error.message : String(error);\n\t\t\tthrow error;\n\t\t});\n\t\tconst tracked = recorded.finally(() => {\n\t\t\tif (this.availabilityRefresh === tracked) this.availabilityRefresh = undefined;\n\t\t});\n\t\tthis.availabilityRefresh = tracked;\n\t\treturn tracked;\n\t}\n\n\t/** Coalesce concurrent readers onto the pending refresh. */\n\tprivate refreshAvailability(): Promise<void> {\n\t\treturn this.availabilityRefresh ?? this.queueAvailabilityRefresh(undefined);\n\t}\n\n\t/** Mutations must not observe an in-flight refresh started before them. */\n\tprivate forceRefreshAvailability(): Promise<void> {\n\t\treturn this.queueAvailabilityRefresh(this.availabilityRefresh);\n\t}\n\n\tgetProviders(): readonly Provider[] {\n\t\treturn this.models.getProviders();\n\t}\n\n\tgetProvider(providerId: string): Provider | undefined {\n\t\treturn this.models.getProvider(providerId);\n\t}\n\n\tgetModels(providerId?: string): readonly Model<Api>[] {\n\t\treturn this.models.getModels(providerId);\n\t}\n\n\tgetModel(providerId: string, modelId: string): Model<Api> | undefined {\n\t\treturn this.models.getModel(providerId, modelId);\n\t}\n\n\tasync checkAuth(providerId: string): Promise<AuthCheck | undefined> {\n\t\treturn this.models.checkAuth(providerId);\n\t}\n\n\tasync getAvailable(providerId?: string): Promise<readonly Model<Api>[]> {\n\t\tif (providerId) {\n\t\t\tif (this.availabilityRefresh) {\n\t\t\t\tawait this.availabilityRefresh;\n\t\t\t\treturn this.snapshot.available.filter((model) => model.provider === providerId);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn await this.models.getAvailable(providerId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.availabilityError = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tawait this.refreshAvailability();\n\t\treturn this.snapshot.available;\n\t}\n\n\tgetAvailableSnapshot(): readonly Model<Api>[] {\n\t\treturn this.snapshot.available;\n\t}\n\n\thasAvailabilitySnapshot(): boolean {\n\t\treturn this.availabilityInitialized;\n\t}\n\n\tgetError(): string | undefined {\n\t\tconst errors: string[] = [];\n\t\tconst configError = this.config.getError();\n\t\tif (configError) errors.push(configError);\n\t\tfor (const [providerId, error] of this.compositionErrors) {\n\t\t\terrors.push(`Provider \"${providerId}\": ${error}`);\n\t\t}\n\t\tif (this.availabilityError) errors.push(`Availability refresh: ${this.availabilityError}`);\n\t\treturn errors.length > 0 ? errors.join(\"\\n\\n\") : undefined;\n\t}\n\n\tgetRegisteredProviderConfig(providerId: string): ProviderConfigInput | undefined {\n\t\treturn this.extensionProviders.get(providerId);\n\t}\n\n\tgetRegisteredProviderIds(): readonly string[] {\n\t\treturn [...this.extensionProviders.keys()];\n\t}\n\n\t/** @internal Compatibility fallback for ModelRegistry when provider auth is unconfigured. */\n\tgetCompatibilityRequestConfig(model: Model<Api>, env?: Record<string, string>): CompatibilityRequestConfig {\n\t\treturn resolveCompatibilityRequestConfig(\n\t\t\tmodel,\n\t\t\tthis.config.getProvider(model.provider),\n\t\t\tthis.extensionProviders.get(model.provider),\n\t\t\tenv,\n\t\t);\n\t}\n\n\tisUsingOAuth(providerId: string): boolean {\n\t\treturn this.snapshot.auth.get(providerId)?.type === \"oauth\";\n\t}\n\n\thasConfiguredAuth(providerId: string): boolean {\n\t\treturn this.snapshot.configuredProviders.has(providerId);\n\t}\n\n\tgetAuth(providerId: string, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n\tgetAuth(model: Model<Api>, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n\tasync getAuth(\n\t\tproviderOrModel: string | Model<Api>,\n\t\toverrides: ModelRuntimeAuthOverrides = {},\n\t): Promise<AuthResult | undefined> {\n\t\tif (typeof providerOrModel === \"string\") return this.models.getAuth(providerOrModel, overrides);\n\t\tconst resolution = await this.models.getAuth(providerOrModel, overrides);\n\t\tif (!resolution) return undefined;\n\t\tconst configuredHeaders = resolveConfiguredModelHeaders(\n\t\t\tproviderOrModel,\n\t\t\tthis.config.getProvider(providerOrModel.provider),\n\t\t\tthis.extensionProviders.get(providerOrModel.provider),\n\t\t\t{ ...(resolution.env ?? {}), ...(overrides.env ?? {}) },\n\t\t);\n\t\treturn {\n\t\t\t...resolution,\n\t\t\tauth: {\n\t\t\t\t...resolution.auth,\n\t\t\t\theaders: mergeHeaders(resolution.auth.headers, configuredHeaders),\n\t\t\t},\n\t\t};\n\t}\n\n\tasync setRuntimeApiKey(providerId: string, apiKey: string): Promise<void> {\n\t\tthis.credentials.setRuntimeApiKey(providerId, apiKey);\n\t\tconst auth = new Map(this.snapshot.auth).set(providerId, { type: \"api_key\", source: \"runtime API key\" });\n\t\tconst configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);\n\t\tconst storedProviders = new Set(this.snapshot.storedProviders).add(providerId);\n\t\tthis.snapshot = {\n\t\t\t...this.snapshot,\n\t\t\tauth,\n\t\t\tconfiguredProviders,\n\t\t\tstoredProviders,\n\t\t\tavailable: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),\n\t\t};\n\t\tawait this.refresh({ allowNetwork: this.allowModelNetwork });\n\t}\n\n\tasync removeRuntimeApiKey(providerId: string): Promise<void> {\n\t\tthis.credentials.removeRuntimeApiKey(providerId);\n\t\tawait this.refresh({ allowNetwork: this.allowModelNetwork });\n\t}\n\n\tlistCredentials(): Promise<readonly CredentialInfo[]> {\n\t\treturn this.credentials.list();\n\t}\n\n\tgetProviderAuthStatus(providerId: string): AuthStatus {\n\t\tif (this.credentials.hasRuntimeApiKey(providerId)) return { configured: true, source: \"runtime\" };\n\t\tif (this.snapshot.storedProviders.has(providerId)) return { configured: true, source: \"stored\" };\n\t\tconst configured = configuredRequestAuthStatus(\n\t\t\tthis.config.getProvider(providerId),\n\t\t\tthis.extensionProviders.get(providerId),\n\t\t);\n\t\tif (configured) return configured;\n\t\tconst check = this.snapshot.auth.get(providerId);\n\t\treturn check ? { configured: true, source: \"environment\", label: check.source } : { configured: false };\n\t}\n\n\tprivate async prepareRequest(\n\t\tmodel: Model<Api>,\n\t\toptions: (StreamOptions & ModelsStreamTransforms) | undefined,\n\t): Promise<{ provider: Provider; model: Model<Api>; options: StreamOptions }> {\n\t\tconst provider = this.models.getProvider(model.provider);\n\t\tif (!provider) throw new ModelsError(\"provider\", `Unknown provider: ${model.provider}`);\n\t\tconst resolution = await this.getAuth(model, { apiKey: options?.apiKey, env: options?.env });\n\t\tif (!resolution) throw new ModelsError(\"auth\", `Provider is not configured: ${model.provider}`);\n\n\t\tconst { transformHeaders, ...providerOptions } = options ?? {};\n\t\tlet headers = mergeHeaders(resolution.auth.headers, providerOptions.headers);\n\t\tif (transformHeaders) headers = await transformHeaders(headers ?? {});\n\t\tconst compatibility = this.getCompatibilityRequestConfig(model, resolution.env);\n\t\tconst extraBody =\n\t\t\tcompatibility.extraBody || providerOptions.extraBody\n\t\t\t\t? { ...compatibility.extraBody, ...providerOptions.extraBody }\n\t\t\t\t: undefined;\n\t\tconst env =\n\t\t\tresolution.env || providerOptions.env\n\t\t\t\t? { ...(resolution.env ?? {}), ...(providerOptions.env ?? {}) }\n\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tprovider,\n\t\t\tmodel: resolution.auth.baseUrl ? { ...model, baseUrl: resolution.auth.baseUrl } : model,\n\t\t\toptions: {\n\t\t\t\t...providerOptions,\n\t\t\t\tapiKey: providerOptions.apiKey ?? resolution.auth.apiKey,\n\t\t\t\theaders,\n\t\t\t\textraBody,\n\t\t\t\tenv,\n\t\t\t},\n\t\t};\n\t}\n\n\tstream<TApi extends Api>(\n\t\tmodel: Model<TApi>,\n\t\tcontext: Context,\n\t\toptions?: ModelsApiStreamOptions<TApi>,\n\t): AssistantMessageEventStream {\n\t\treturn lazyStream(model, async () => {\n\t\t\tconst prepared = await this.prepareRequest(\n\t\t\t\tmodel,\n\t\t\t\toptions as (StreamOptions & ModelsStreamTransforms) | undefined,\n\t\t\t);\n\t\t\treturn prepared.provider.stream(\n\t\t\t\tprepared.model as Model<TApi>,\n\t\t\t\tcontext,\n\t\t\t\tprepared.options as ApiStreamOptions<TApi>,\n\t\t\t);\n\t\t});\n\t}\n\n\tcomplete<TApi extends Api>(\n\t\tmodel: Model<TApi>,\n\t\tcontext: Context,\n\t\toptions?: ModelsApiStreamOptions<TApi>,\n\t): Promise<AssistantMessage> {\n\t\treturn this.stream(model, context, options).result();\n\t}\n\n\tstreamSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream {\n\t\treturn lazyStream(model, async () => {\n\t\t\tconst prepared = await this.prepareRequest(model, options);\n\t\t\treturn prepared.provider.streamSimple(prepared.model, context, prepared.options as SimpleStreamOptions);\n\t\t});\n\t}\n\n\tcompleteSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): Promise<AssistantMessage> {\n\t\treturn this.streamSimple(model, context, options).result();\n\t}\n\n\tasync login(providerId: string, type: AuthType, interaction: AuthInteraction): Promise<Credential> {\n\t\tconst credential = await this.models.login(providerId, type, interaction);\n\t\tawait this.refresh({ allowNetwork: this.allowModelNetwork });\n\t\treturn credential;\n\t}\n\n\tasync logout(providerId: string): Promise<void> {\n\t\tawait this.models.logout(providerId);\n\t\t// Reset credential-dependent compatibility projections before the unconfigured provider is skipped by refresh.\n\t\tthis.recomposeProvider(providerId);\n\t\tawait this.refresh({ allowNetwork: this.allowModelNetwork });\n\t}\n\n\tasync reloadConfig(): Promise<void> {\n\t\tthis.config = await ModelConfig.load(this.modelsPath);\n\t\tthis.configureRadiusProviders();\n\t\tthis.rebuildProviders();\n\t\tawait this.refresh({ allowNetwork: this.allowModelNetwork });\n\t}\n\n\tasync refresh(options: ModelsRefreshOptions = {}): Promise<ModelsRefreshResult> {\n\t\tconst refreshOptions = {\n\t\t\t...options,\n\t\t\tallowNetwork: options.allowNetwork ?? this.allowModelNetwork,\n\t\t};\n\t\t// Published pi-ai builds before ModelsStore returned void and accepted a provider ID.\n\t\t// The fallback keeps source-mode CLI tests working without rebuilding workspace dependencies.\n\t\tconst result = ((await this.models.refresh(refreshOptions)) as ModelsRefreshResult | undefined) ?? {\n\t\t\taborted: refreshOptions.signal?.aborted ?? false,\n\t\t\terrors: new Map(),\n\t\t};\n\t\tthis.updateModelSnapshot();\n\t\ttry {\n\t\t\tawait this.forceRefreshAvailability();\n\t\t} catch {\n\t\t\t// Availability errors are recorded by forceRefreshAvailability; refreshed models remain usable.\n\t\t}\n\t\treturn result;\n\t}\n\n\tregisterProvider(providerId: string, config: ProviderConfigInput): void {\n\t\t// Validate the incoming registration on its own, like the legacy registry:\n\t\t// a broken re-registration must throw without touching the stored config.\n\t\tvalidateExtensionProvider(providerId, this.builtins.get(providerId), this.config.getProvider(providerId), config);\n\t\t// Re-registration merges defined values over the previous registration and\n\t\t// preserves undefined ones, matching the legacy ModelRegistry contract.\n\t\tconst previous = this.extensionProviders.get(providerId);\n\t\tconst effective: ProviderConfigInput = { ...previous };\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (value !== undefined) (effective as Record<string, unknown>)[key] = value;\n\t\t}\n\t\tthis.extensionProviders.set(providerId, effective);\n\t\tthis.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t\tif (\n\t\t\tthis.snapshot.storedProviders.has(providerId) ||\n\t\t\tconfiguredRequestAuthStatus(this.config.getProvider(providerId), effective)?.configured\n\t\t) {\n\t\t\tconst configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);\n\t\t\tconst auth = new Map(this.snapshot.auth);\n\t\t\t// Provisional entry until the async refresh lands; never clobber a real check result.\n\t\t\tif (!auth.get(providerId)) {\n\t\t\t\tauth.set(providerId, {\n\t\t\t\t\ttype: effective.oauth && !effective.apiKey ? \"oauth\" : \"api_key\",\n\t\t\t\t\tsource: \"configured provider\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.snapshot = {\n\t\t\t\t...this.snapshot,\n\t\t\t\tauth,\n\t\t\t\tconfiguredProviders,\n\t\t\t\tavailable: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),\n\t\t\t};\n\t\t}\n\t\tvoid this.refresh({ allowNetwork: false });\n\t}\n\n\tunregisterProvider(providerId: string): void {\n\t\tthis.extensionProviders.delete(providerId);\n\t\tthis.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t\tvoid this.refresh({ allowNetwork: false });\n\t}\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { ModelsStore, ModelsStoreEntry } from "@earendil-works/pi-ai";
2
+ export declare class InMemoryCodingAgentModelsStore implements ModelsStore {
3
+ private readonly entries;
4
+ read(providerId: string): Promise<ModelsStoreEntry | undefined>;
5
+ write(providerId: string, entry: ModelsStoreEntry): Promise<void>;
6
+ delete(providerId: string): Promise<void>;
7
+ }
8
+ /** Locked JSON-backed storage for dynamically refreshed provider catalogs. */
9
+ export declare class FileModelsStore implements ModelsStore {
10
+ private readonly storage;
11
+ constructor(path?: string);
12
+ private parse;
13
+ read(providerId: string): Promise<ModelsStoreEntry | undefined>;
14
+ write(providerId: string, entry: ModelsStoreEntry): Promise<void>;
15
+ delete(providerId: string): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=models-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-store.d.ts","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM3E,qBAAa,8BAA+B,YAAW,WAAW;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAEzD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAEpE;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9C;CACD;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,YAAY,IAAI,GAAE,MAAiD,EAElE;IAED,OAAO,CAAC,KAAK;IAIP,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAIpE;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9C;CACD"}
@@ -0,0 +1,46 @@
1
+ import { join } from "node:path";
2
+ import { getAgentDir } from "../config.js";
3
+ import { FileAuthStorageBackend } from "./auth-storage.js";
4
+ export class InMemoryCodingAgentModelsStore {
5
+ constructor() {
6
+ this.entries = new Map();
7
+ }
8
+ async read(providerId) {
9
+ return this.entries.get(providerId);
10
+ }
11
+ async write(providerId, entry) {
12
+ this.entries.set(providerId, entry);
13
+ }
14
+ async delete(providerId) {
15
+ this.entries.delete(providerId);
16
+ }
17
+ }
18
+ /** Locked JSON-backed storage for dynamically refreshed provider catalogs. */
19
+ export class FileModelsStore {
20
+ constructor(path = join(getAgentDir(), "models-store.json")) {
21
+ this.storage = new FileAuthStorageBackend(path);
22
+ }
23
+ parse(content) {
24
+ return content ? JSON.parse(content) : {};
25
+ }
26
+ async read(providerId) {
27
+ return this.storage.withLock((content) => ({
28
+ result: structuredClone(this.parse(content)[providerId]),
29
+ }));
30
+ }
31
+ async write(providerId, entry) {
32
+ await this.storage.withLockAsync(async (content) => {
33
+ const current = this.parse(content);
34
+ current[providerId] = structuredClone(entry);
35
+ return { result: undefined, next: JSON.stringify(current, null, 2) };
36
+ });
37
+ }
38
+ async delete(providerId) {
39
+ await this.storage.withLockAsync(async (content) => {
40
+ const current = this.parse(content);
41
+ delete current[providerId];
42
+ return { result: undefined, next: JSON.stringify(current, null, 2) };
43
+ });
44
+ }
45
+ }
46
+ //# sourceMappingURL=models-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-store.js","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAA2B,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAIpF,MAAM,OAAO,8BAA8B;IAA3C;QACkB,YAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAahE,CAAC;IAXA,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,KAAuB;QACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;CACD;AAED,8EAA8E;AAC9E,MAAM,OAAO,eAAe;IAG3B,YAAY,IAAI,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,mBAAmB,CAAC;QAClE,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,OAA2B;QACxC,OAAO,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;SACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,KAAuB;QACtD,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtE,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtE,CAAC,CAAC,CAAC;IACJ,CAAC;CACD","sourcesContent":["import { join } from \"node:path\";\nimport type { ModelsStore, ModelsStoreEntry } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"./auth-storage.ts\";\n\ntype StoredModels = Record<string, ModelsStoreEntry>;\n\nexport class InMemoryCodingAgentModelsStore implements ModelsStore {\n\tprivate readonly entries = new Map<string, ModelsStoreEntry>();\n\n\tasync read(providerId: string): Promise<ModelsStoreEntry | undefined> {\n\t\treturn this.entries.get(providerId);\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry): Promise<void> {\n\t\tthis.entries.set(providerId, entry);\n\t}\n\n\tasync delete(providerId: string): Promise<void> {\n\t\tthis.entries.delete(providerId);\n\t}\n}\n\n/** Locked JSON-backed storage for dynamically refreshed provider catalogs. */\nexport class FileModelsStore implements ModelsStore {\n\tprivate readonly storage: AuthStorageBackend;\n\n\tconstructor(path: string = join(getAgentDir(), \"models-store.json\")) {\n\t\tthis.storage = new FileAuthStorageBackend(path);\n\t}\n\n\tprivate parse(content: string | undefined): StoredModels {\n\t\treturn content ? (JSON.parse(content) as StoredModels) : {};\n\t}\n\n\tasync read(providerId: string): Promise<ModelsStoreEntry | undefined> {\n\t\treturn this.storage.withLock((content) => ({\n\t\t\tresult: structuredClone(this.parse(content)[providerId]),\n\t\t}));\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry): Promise<void> {\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tcurrent[providerId] = structuredClone(entry);\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t});\n\t}\n\n\tasync delete(providerId: string): Promise<void> {\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tdelete current[providerId];\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t});\n\t}\n}\n"]}