@bastani/atomic 0.9.11-alpha.7 → 0.9.11-alpha.8

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 (325) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +3 -5
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/mcp/sampling-handler.ts +1 -5
  6. package/dist/builtin/subagents/package.json +1 -1
  7. package/dist/builtin/web-access/package.json +1 -1
  8. package/dist/builtin/workflows/CHANGELOG.md +1 -0
  9. package/dist/builtin/workflows/README.md +1 -1
  10. package/dist/builtin/workflows/package.json +1 -1
  11. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +1 -24
  12. package/dist/builtin/workflows/src/extension/index.bundle.mjs +31 -28
  13. package/dist/builtin/workflows/src/extension/workflow-model-catalog.ts +26 -0
  14. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +3 -2
  15. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +5 -5
  16. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +3 -3
  17. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +2 -2
  18. package/dist/cli/list-models.d.ts +2 -2
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js +5 -5
  21. package/dist/cli/list-models.js.map +1 -1
  22. package/dist/core/agent-session-accessors.js +1 -1
  23. package/dist/core/agent-session-accessors.js.map +1 -1
  24. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  25. package/dist/core/agent-session-auto-compaction.js +2 -5
  26. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  27. package/dist/core/agent-session-compaction.js +1 -1
  28. package/dist/core/agent-session-compaction.js.map +1 -1
  29. package/dist/core/agent-session-extension-bindings.js +5 -5
  30. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  31. package/dist/core/agent-session-methods.d.ts +4 -4
  32. package/dist/core/agent-session-methods.d.ts.map +1 -1
  33. package/dist/core/agent-session-methods.js.map +1 -1
  34. package/dist/core/agent-session-models.d.ts +1 -1
  35. package/dist/core/agent-session-models.d.ts.map +1 -1
  36. package/dist/core/agent-session-models.js +18 -14
  37. package/dist/core/agent-session-models.js.map +1 -1
  38. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  39. package/dist/core/agent-session-post-tool-compaction.js +2 -4
  40. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  41. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  42. package/dist/core/agent-session-prompt.js +3 -7
  43. package/dist/core/agent-session-prompt.js.map +1 -1
  44. package/dist/core/agent-session-retry.js +1 -1
  45. package/dist/core/agent-session-retry.js.map +1 -1
  46. package/dist/core/agent-session-runtime-auth.d.ts +3 -3
  47. package/dist/core/agent-session-runtime-auth.d.ts.map +1 -1
  48. package/dist/core/agent-session-runtime-auth.js +4 -14
  49. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  50. package/dist/core/agent-session-runtime.d.ts +1 -1
  51. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  52. package/dist/core/agent-session-runtime.js +3 -3
  53. package/dist/core/agent-session-runtime.js.map +1 -1
  54. package/dist/core/agent-session-services.d.ts +3 -8
  55. package/dist/core/agent-session-services.d.ts.map +1 -1
  56. package/dist/core/agent-session-services.js +16 -23
  57. package/dist/core/agent-session-services.js.map +1 -1
  58. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  59. package/dist/core/agent-session-tool-registry.js +2 -1
  60. package/dist/core/agent-session-tool-registry.js.map +1 -1
  61. package/dist/core/agent-session-types.d.ts +2 -2
  62. package/dist/core/agent-session-types.d.ts.map +1 -1
  63. package/dist/core/agent-session-types.js.map +1 -1
  64. package/dist/core/agent-session.d.ts +2 -2
  65. package/dist/core/agent-session.d.ts.map +1 -1
  66. package/dist/core/agent-session.js +1 -1
  67. package/dist/core/agent-session.js.map +1 -1
  68. package/dist/core/auth-storage-backends.d.ts +1 -0
  69. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  70. package/dist/core/auth-storage-backends.js +18 -4
  71. package/dist/core/auth-storage-backends.js.map +1 -1
  72. package/dist/core/auth-storage.d.ts +12 -139
  73. package/dist/core/auth-storage.d.ts.map +1 -1
  74. package/dist/core/auth-storage.js +68 -374
  75. package/dist/core/auth-storage.js.map +1 -1
  76. package/dist/core/copilot-env-routing.d.ts +36 -0
  77. package/dist/core/copilot-env-routing.d.ts.map +1 -0
  78. package/dist/core/copilot-env-routing.js +94 -0
  79. package/dist/core/copilot-env-routing.js.map +1 -0
  80. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  81. package/dist/core/extensions/loader-virtual-modules.js +10 -2
  82. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  83. package/dist/core/extensions/provider-types.d.ts +0 -40
  84. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  85. package/dist/core/extensions/provider-types.js.map +1 -1
  86. package/dist/core/fallback-models.d.ts +4 -4
  87. package/dist/core/fallback-models.d.ts.map +1 -1
  88. package/dist/core/fallback-models.js +3 -3
  89. package/dist/core/fallback-models.js.map +1 -1
  90. package/dist/core/model-config.d.ts +542 -0
  91. package/dist/core/model-config.d.ts.map +1 -0
  92. package/dist/core/{model-registry-schemas.js → model-config.js} +85 -34
  93. package/dist/core/model-config.js.map +1 -0
  94. package/dist/core/model-registry.d.ts +25 -85
  95. package/dist/core/model-registry.d.ts.map +1 -1
  96. package/dist/core/model-registry.js +65 -388
  97. package/dist/core/model-registry.js.map +1 -1
  98. package/dist/core/model-resolver-cli.d.ts +2 -2
  99. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  100. package/dist/core/model-resolver-cli.js +2 -2
  101. package/dist/core/model-resolver-cli.js.map +1 -1
  102. package/dist/core/model-resolver-initial.d.ts +4 -4
  103. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  104. package/dist/core/model-resolver-initial.js +17 -17
  105. package/dist/core/model-resolver-initial.js.map +1 -1
  106. package/dist/core/model-resolver-scope.d.ts +3 -3
  107. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  108. package/dist/core/model-resolver-scope.js +4 -4
  109. package/dist/core/model-resolver-scope.js.map +1 -1
  110. package/dist/core/model-runtime-auth.d.ts +7 -0
  111. package/dist/core/model-runtime-auth.d.ts.map +1 -0
  112. package/dist/core/model-runtime-auth.js +14 -0
  113. package/dist/core/model-runtime-auth.js.map +1 -0
  114. package/dist/core/model-runtime-providers.d.ts +6 -0
  115. package/dist/core/model-runtime-providers.d.ts.map +1 -0
  116. package/dist/core/model-runtime-providers.js +22 -0
  117. package/dist/core/model-runtime-providers.js.map +1 -0
  118. package/dist/core/model-runtime-restoration.d.ts +6 -0
  119. package/dist/core/model-runtime-restoration.d.ts.map +1 -0
  120. package/dist/core/model-runtime-restoration.js +21 -0
  121. package/dist/core/model-runtime-restoration.js.map +1 -0
  122. package/dist/core/model-runtime-snapshot.d.ts +16 -0
  123. package/dist/core/model-runtime-snapshot.d.ts.map +1 -0
  124. package/dist/core/model-runtime-snapshot.js +52 -0
  125. package/dist/core/model-runtime-snapshot.js.map +1 -0
  126. package/dist/core/model-runtime-streaming.d.ts +17 -0
  127. package/dist/core/model-runtime-streaming.d.ts.map +1 -0
  128. package/dist/core/model-runtime-streaming.js +66 -0
  129. package/dist/core/model-runtime-streaming.js.map +1 -0
  130. package/dist/core/model-runtime-types.d.ts +21 -0
  131. package/dist/core/model-runtime-types.d.ts.map +1 -0
  132. package/dist/core/model-runtime-types.js +2 -0
  133. package/dist/core/model-runtime-types.js.map +1 -0
  134. package/dist/core/model-runtime.d.ts +50 -29
  135. package/dist/core/model-runtime.d.ts.map +1 -1
  136. package/dist/core/model-runtime.js +330 -90
  137. package/dist/core/model-runtime.js.map +1 -1
  138. package/dist/core/models-store.d.ts +2 -10
  139. package/dist/core/models-store.d.ts.map +1 -1
  140. package/dist/core/models-store.js +2 -29
  141. package/dist/core/models-store.js.map +1 -1
  142. package/dist/core/oauth-login.d.ts +24 -0
  143. package/dist/core/oauth-login.d.ts.map +1 -0
  144. package/dist/core/oauth-login.js +87 -0
  145. package/dist/core/oauth-login.js.map +1 -0
  146. package/dist/core/oauth-provider-metadata.d.ts +5 -0
  147. package/dist/core/oauth-provider-metadata.d.ts.map +1 -0
  148. package/dist/core/oauth-provider-metadata.js +19 -0
  149. package/dist/core/oauth-provider-metadata.js.map +1 -0
  150. package/dist/core/provider-composer-internal.d.ts +53 -0
  151. package/dist/core/provider-composer-internal.d.ts.map +1 -0
  152. package/dist/core/provider-composer-internal.js +273 -0
  153. package/dist/core/provider-composer-internal.js.map +1 -0
  154. package/dist/core/provider-composer.d.ts +16 -0
  155. package/dist/core/provider-composer.d.ts.map +1 -0
  156. package/dist/core/provider-composer.js +108 -0
  157. package/dist/core/provider-composer.js.map +1 -0
  158. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  159. package/dist/core/remote-catalog-provider.js +74 -122
  160. package/dist/core/remote-catalog-provider.js.map +1 -1
  161. package/dist/core/resolve-config-value.d.ts +8 -7
  162. package/dist/core/resolve-config-value.d.ts.map +1 -1
  163. package/dist/core/resolve-config-value.js +26 -23
  164. package/dist/core/resolve-config-value.js.map +1 -1
  165. package/dist/core/runtime-credentials.d.ts +16 -0
  166. package/dist/core/runtime-credentials.d.ts.map +1 -0
  167. package/dist/core/runtime-credentials.js +42 -0
  168. package/dist/core/runtime-credentials.js.map +1 -0
  169. package/dist/core/sdk-types.d.ts +1 -7
  170. package/dist/core/sdk-types.d.ts.map +1 -1
  171. package/dist/core/sdk-types.js.map +1 -1
  172. package/dist/core/sdk.d.ts.map +1 -1
  173. package/dist/core/sdk.js +27 -28
  174. package/dist/core/sdk.js.map +1 -1
  175. package/dist/extensions/llama/index.js +1 -1
  176. package/dist/extensions/llama/index.js.map +1 -1
  177. package/dist/extensions/llama/provider.d.ts +2 -4
  178. package/dist/extensions/llama/provider.d.ts.map +1 -1
  179. package/dist/extensions/llama/provider.js +25 -17
  180. package/dist/extensions/llama/provider.js.map +1 -1
  181. package/dist/index.d.ts +2 -3
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +3 -4
  184. package/dist/index.js.map +1 -1
  185. package/dist/main-runtime-api-key.d.ts +6 -0
  186. package/dist/main-runtime-api-key.d.ts.map +1 -0
  187. package/dist/main-runtime-api-key.js +6 -0
  188. package/dist/main-runtime-api-key.js.map +1 -0
  189. package/dist/main-session-options.d.ts +2 -2
  190. package/dist/main-session-options.d.ts.map +1 -1
  191. package/dist/main-session-options.js +3 -3
  192. package/dist/main-session-options.js.map +1 -1
  193. package/dist/main.d.ts.map +1 -1
  194. package/dist/main.js +9 -11
  195. package/dist/main.js.map +1 -1
  196. package/dist/modes/interactive/components/footer.js +1 -1
  197. package/dist/modes/interactive/components/footer.js.map +1 -1
  198. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/login-dialog.js +1 -3
  200. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  201. package/dist/modes/interactive/components/model-selector.d.ts +4 -3
  202. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/model-selector.js +56 -73
  204. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  205. package/dist/modes/interactive/components/oauth-selector.d.ts +4 -3
  206. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/oauth-selector.js +15 -24
  208. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  209. package/dist/modes/interactive/interactive-agent-events.js +1 -1
  210. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  211. package/dist/modes/interactive/interactive-auth-login.js +20 -31
  212. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  213. package/dist/modes/interactive/interactive-auth-routing.d.ts +1 -1
  214. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
  215. package/dist/modes/interactive/interactive-auth-routing.js +21 -47
  216. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  217. package/dist/modes/interactive/interactive-autocomplete.js +3 -3
  218. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  219. package/dist/modes/interactive/interactive-deferred-startup.js +8 -8
  220. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  221. package/dist/modes/interactive/interactive-extension-runtime.js +2 -1
  222. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  223. package/dist/modes/interactive/interactive-model-catalog-startup.js +2 -2
  224. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  225. package/dist/modes/interactive/interactive-model-routing.js +11 -11
  226. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  227. package/dist/modes/interactive/interactive-render-chat.js +1 -1
  228. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  229. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  230. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  231. package/dist/modes/interactive/interactive-startup.js +1 -1
  232. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  233. package/dist/modes/interactive-engine/isolated-auth.d.ts +2 -2
  234. package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -1
  235. package/dist/modes/interactive-engine/isolated-auth.js +4 -3
  236. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
  237. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  238. package/dist/modes/interactive-engine/isolated-runtime.js +4 -3
  239. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  240. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +0 -1
  241. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  242. package/dist/modes/interactive-engine/remote-model-catalog.js +11 -50
  243. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  244. package/dist/modes/rpc/rpc-client-api.d.ts +2 -2
  245. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  246. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  247. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  248. package/dist/modes/rpc/rpc-command-handler.js +26 -19
  249. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  250. package/dist/modes/rpc/rpc-oauth-client.d.ts +1 -1
  251. package/dist/modes/rpc/rpc-oauth-client.d.ts.map +1 -1
  252. package/dist/modes/rpc/rpc-oauth-client.js +1 -1
  253. package/dist/modes/rpc/rpc-oauth-client.js.map +1 -1
  254. package/dist/modes/rpc/rpc-oauth-interaction.d.ts +1 -1
  255. package/dist/modes/rpc/rpc-oauth-interaction.d.ts.map +1 -1
  256. package/dist/modes/rpc/rpc-oauth-interaction.js +1 -1
  257. package/dist/modes/rpc/rpc-oauth-interaction.js.map +1 -1
  258. package/dist/modes/rpc/rpc-provider-auth.d.ts +4 -5
  259. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  260. package/dist/modes/rpc/rpc-provider-auth.js +19 -66
  261. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  262. package/dist/modes/rpc/rpc-session-binding.js +1 -1
  263. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  264. package/dist/modes/rpc/rpc-types.d.ts +7 -4
  265. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  266. package/dist/modes/rpc/rpc-types.js.map +1 -1
  267. package/dist/package-manager-cli.d.ts.map +1 -1
  268. package/dist/package-manager-cli.js +5 -7
  269. package/dist/package-manager-cli.js.map +1 -1
  270. package/docs/changelog.mdx +1 -1
  271. package/docs/custom-provider.md +1 -1
  272. package/docs/models.md +4 -6
  273. package/docs/providers.md +13 -0
  274. package/docs/quickstart.md +2 -1
  275. package/docs/sdk.md +32 -49
  276. package/docs/workflows.md +3 -3
  277. package/examples/sdk/02-custom-model.ts +8 -10
  278. package/examples/sdk/09-api-keys-and-oauth.ts +17 -23
  279. package/examples/sdk/12-full-control.ts +9 -11
  280. package/examples/sdk/README.md +17 -21
  281. package/npm-shrinkwrap.json +23 -23
  282. package/package.json +2 -2
  283. package/dist/core/model-registry-auth.d.ts +0 -10
  284. package/dist/core/model-registry-auth.d.ts.map +0 -1
  285. package/dist/core/model-registry-auth.js +0 -98
  286. package/dist/core/model-registry-auth.js.map +0 -1
  287. package/dist/core/model-registry-builtins.d.ts +0 -8
  288. package/dist/core/model-registry-builtins.d.ts.map +0 -1
  289. package/dist/core/model-registry-builtins.js +0 -104
  290. package/dist/core/model-registry-builtins.js.map +0 -1
  291. package/dist/core/model-registry-custom-loader.d.ts +0 -3
  292. package/dist/core/model-registry-custom-loader.d.ts.map +0 -1
  293. package/dist/core/model-registry-custom-loader.js +0 -255
  294. package/dist/core/model-registry-custom-loader.js.map +0 -1
  295. package/dist/core/model-registry-dynamic.d.ts +0 -7
  296. package/dist/core/model-registry-dynamic.d.ts.map +0 -1
  297. package/dist/core/model-registry-dynamic.js +0 -189
  298. package/dist/core/model-registry-dynamic.js.map +0 -1
  299. package/dist/core/model-registry-extension-refresh.d.ts +0 -23
  300. package/dist/core/model-registry-extension-refresh.d.ts.map +0 -1
  301. package/dist/core/model-registry-extension-refresh.js +0 -32
  302. package/dist/core/model-registry-extension-refresh.js.map +0 -1
  303. package/dist/core/model-registry-loader.d.ts +0 -5
  304. package/dist/core/model-registry-loader.d.ts.map +0 -1
  305. package/dist/core/model-registry-loader.js +0 -29
  306. package/dist/core/model-registry-loader.js.map +0 -1
  307. package/dist/core/model-registry-schemas.d.ts +0 -1399
  308. package/dist/core/model-registry-schemas.d.ts.map +0 -1
  309. package/dist/core/model-registry-schemas.js.map +0 -1
  310. package/dist/core/model-registry-types.d.ts +0 -91
  311. package/dist/core/model-registry-types.d.ts.map +0 -1
  312. package/dist/core/model-registry-types.js +0 -2
  313. package/dist/core/model-registry-types.js.map +0 -1
  314. package/dist/core/model-registry-validation.d.ts +0 -7
  315. package/dist/core/model-registry-validation.d.ts.map +0 -1
  316. package/dist/core/model-registry-validation.js +0 -12
  317. package/dist/core/model-registry-validation.js.map +0 -1
  318. package/dist/core/oauth-compat.d.ts +0 -17
  319. package/dist/core/oauth-compat.d.ts.map +0 -1
  320. package/dist/core/oauth-compat.js +0 -2
  321. package/dist/core/oauth-compat.js.map +0 -1
  322. package/dist/core/oauth-provider-bridge.d.ts +0 -63
  323. package/dist/core/oauth-provider-bridge.d.ts.map +0 -1
  324. package/dist/core/oauth-provider-bridge.js +0 -232
  325. package/dist/core/oauth-provider-bridge.js.map +0 -1
@@ -1,120 +1,360 @@
1
- import { lazyStream } from "@earendil-works/pi-ai";
2
- import { getAgentConfigPaths } from "../config.js";
3
- import { AuthStorage } from "./auth-storage.js";
4
- import { ModelRegistry } from "./model-registry.js";
5
- function mergeHeaders(base, override) {
6
- if (!base && !override)
7
- return undefined;
8
- const merged = { ...base };
9
- for (const [name, value] of Object.entries(override ?? {})) {
10
- for (const existing of Object.keys(merged)) {
11
- if (existing.toLowerCase() === name.toLowerCase())
12
- delete merged[existing];
13
- }
14
- merged[name] = value;
15
- }
16
- return merged;
17
- }
18
- /** Canonical model/auth facade for SDK consumers. */
1
+ import { dirname, join } from "node:path";
2
+ import { createModels, } 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, validateExtensionProvider, } from "./provider-composer.js";
9
+ import { withRemoteCatalog } from "./remote-catalog-provider.js";
10
+ import { RuntimeCredentials } from "./runtime-credentials.js";
11
+ import { isOfflineModeEnabled } from "./package-manager-env.js";
12
+ import { collectOAuthProviderMetadata } from "./oauth-provider-metadata.js";
13
+ import { OAuthLoginTransactionError } from "./oauth-login.js";
14
+ import { addRuntimeApiKeyProvider, createEmptyModelRuntimeSnapshot, createModelRuntimeSnapshot, getSnapshotProviderAuthStatus, updateSnapshotModels, } from "./model-runtime-snapshot.js";
15
+ import { ModelRuntimeStreaming } from "./model-runtime-streaming.js";
16
+ import { canRestoreUnknownModel as canRestoreUnknownModelProvider } from "./model-runtime-restoration.js";
17
+ import { mergeConfiguredAuthHeaders } from "./model-runtime-auth.js";
18
+ import { configureBuiltinProviders } from "./model-runtime-providers.js";
19
+ /** Configured pi-ai Models collection used by coding-agent and SDK consumers. */
19
20
  export class ModelRuntime {
20
- constructor(modelRegistry, authStorage = modelRegistry.authStorage) {
21
- this.modelRegistry = modelRegistry;
22
- this.authStorage = authStorage;
21
+ constructor(credentials, config, modelsPath, modelsStore, providers, modelNetworkEnabled) {
22
+ this.builtins = new Map();
23
+ this.nativeExtensionProviders = new Map();
24
+ this.extensionProviders = new Map();
25
+ this.compositionErrors = new Map();
26
+ this.snapshot = createEmptyModelRuntimeSnapshot();
27
+ this.credentials = credentials;
28
+ this.config = config;
29
+ this.modelsPath = modelsPath;
30
+ this.modelNetworkEnabled = modelNetworkEnabled;
31
+ this.defaultBuiltins = new Map(providers.map((provider) => [provider.id, provider]));
32
+ for (const [providerId, provider] of this.defaultBuiltins)
33
+ this.builtins.set(providerId, provider);
34
+ this.models = createModels({ credentials, modelsStore });
35
+ this.streaming = new ModelRuntimeStreaming(this.models, (model, overrides) => this.getAuth(model, overrides));
36
+ this.rebuildProviders();
23
37
  }
24
38
  static async create(options = {}) {
25
- const authStorage = options.authStorage ?? AuthStorage.create(options.authPath);
26
- const paths = options.modelsPath === null ? [] : (options.modelsPath ?? getAgentConfigPaths("models.json"));
27
- const modelRegistry = options.modelRegistry ?? (Array.isArray(paths) && paths.length === 0
28
- ? ModelRegistry.inMemory(authStorage)
29
- : ModelRegistry.create(authStorage, paths));
30
- const runtime = new ModelRuntime(modelRegistry, authStorage);
31
- await modelRegistry.refresh({
32
- allowNetwork: options.allowModelNetwork ?? false,
33
- timeoutMs: options.modelRefreshTimeoutMs,
34
- });
39
+ const credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));
40
+ const modelsPath = options.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), "models.json"));
41
+ const config = await ModelConfig.load(modelsPath);
42
+ const modelsStore = options.modelsStore ??
43
+ (modelsPath
44
+ ? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), "models-store.json"))
45
+ : new InMemoryCodingAgentModelsStore());
46
+ const builtinModelDataGeneratedAt = builtinProviderCatalog.getBuiltinModelDataGeneratedAt();
47
+ const providers = builtinProviderCatalog
48
+ .builtinProviders()
49
+ .map((provider) => provider.id === "radius"
50
+ ? provider
51
+ : withRemoteCatalog(provider, options.catalogBaseUrl, builtinModelDataGeneratedAt));
52
+ const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, !isOfflineModeEnabled());
53
+ runtime.configureRadiusProviders();
54
+ runtime.rebuildProviders();
55
+ const refreshFromNetwork = runtime.modelNetworkEnabled && options.allowModelNetwork === true;
56
+ const controller = refreshFromNetwork ? new AbortController() : undefined;
57
+ const timeout = controller
58
+ ? setTimeout(() => controller.abort(), options.modelRefreshTimeoutMs ?? 15_000)
59
+ : undefined;
60
+ try {
61
+ await runtime.refresh({ allowNetwork: refreshFromNetwork, signal: controller?.signal });
62
+ }
63
+ finally {
64
+ if (timeout)
65
+ clearTimeout(timeout);
66
+ }
35
67
  return runtime;
36
68
  }
37
- getProviders() { return this.modelRegistry.getProviders(); }
38
- getProvider(providerId) { return this.modelRegistry.getProvider(providerId); }
69
+ configureRadiusProviders() {
70
+ configureBuiltinProviders(this.builtins, this.defaultBuiltins, this.config);
71
+ }
72
+ providerIds() {
73
+ return new Set([
74
+ ...this.builtins.keys(),
75
+ ...this.nativeExtensionProviders.keys(),
76
+ ...this.config.getProviderIds(),
77
+ ...this.extensionProviders.keys(),
78
+ ]);
79
+ }
80
+ recomposeProvider(providerId) {
81
+ const base = this.nativeExtensionProviders.get(providerId) ?? this.builtins.get(providerId);
82
+ const extension = this.extensionProviders.get(providerId);
83
+ if (!base && !this.config.getProvider(providerId) && !extension) {
84
+ this.models.deleteProvider(providerId);
85
+ this.compositionErrors.delete(providerId);
86
+ return;
87
+ }
88
+ if (base && !this.config.getProvider(providerId) && !extension) {
89
+ // No overlays: use the builtin untouched so its auth/login/stream behavior is exact.
90
+ this.models.setProvider(base);
91
+ this.compositionErrors.delete(providerId);
92
+ return;
93
+ }
94
+ try {
95
+ this.models.setProvider(composeModelProvider(providerId, base, this.config, extension));
96
+ this.compositionErrors.delete(providerId);
97
+ }
98
+ catch (error) {
99
+ this.compositionErrors.set(providerId, error instanceof Error ? error.message : String(error));
100
+ if (base)
101
+ this.models.setProvider(base);
102
+ else
103
+ this.models.deleteProvider(providerId);
104
+ }
105
+ }
106
+ rebuildProviders() {
107
+ this.models.clearProviders();
108
+ this.compositionErrors.clear();
109
+ for (const providerId of this.providerIds())
110
+ this.recomposeProvider(providerId);
111
+ this.updateModelSnapshot();
112
+ }
113
+ updateModelSnapshot() {
114
+ this.snapshot = updateSnapshotModels(this.snapshot, [...this.models.getModels()]);
115
+ }
116
+ async runAvailabilityRefresh() {
117
+ const providers = this.models.getProviders();
118
+ const [available, checks, credentials] = await Promise.all([
119
+ this.models.getAvailable(),
120
+ Promise.all(providers.map(async (provider) => [
121
+ provider.id,
122
+ await this.models.checkAuth(provider.id),
123
+ ])),
124
+ this.credentials.list(),
125
+ ]);
126
+ this.snapshot = createModelRuntimeSnapshot([...this.models.getModels()], [...available], checks, credentials);
127
+ this.availabilityError = undefined;
128
+ }
129
+ queueAvailabilityRefresh(after) {
130
+ const refresh = (after ?? Promise.resolve()).catch(() => { }).then(() => this.runAvailabilityRefresh());
131
+ const recorded = refresh.catch((error) => {
132
+ this.availabilityError = error instanceof Error ? error.message : String(error);
133
+ throw error;
134
+ });
135
+ const tracked = recorded.finally(() => {
136
+ if (this.availabilityRefresh === tracked)
137
+ this.availabilityRefresh = undefined;
138
+ });
139
+ this.availabilityRefresh = tracked;
140
+ return tracked;
141
+ }
142
+ /** Coalesce concurrent readers onto the pending refresh. */
143
+ refreshAvailability() {
144
+ return this.availabilityRefresh ?? this.queueAvailabilityRefresh(undefined);
145
+ }
146
+ /** Mutations must not observe an in-flight refresh started before them. */
147
+ forceRefreshAvailability() {
148
+ return this.queueAvailabilityRefresh(this.availabilityRefresh);
149
+ }
150
+ getProviders() {
151
+ return this.models.getProviders();
152
+ }
153
+ getProvider(providerId) {
154
+ return this.models.getProvider(providerId);
155
+ }
156
+ /** Whether an authenticated provider may reconstruct an absent saved model ID. */
157
+ canRestoreUnknownModel(providerId) {
158
+ return canRestoreUnknownModelProvider(providerId, this.defaultBuiltins.get(providerId), this.config.getProvider(providerId), this.extensionProviders.get(providerId), this.nativeExtensionProviders.get(providerId));
159
+ }
39
160
  getModels(providerId) {
40
- return providerId ? this.modelRegistry.getAll().filter((model) => model.provider === providerId) : this.modelRegistry.getAll();
161
+ return this.models.getModels(providerId);
162
+ }
163
+ getModel(providerId, modelId) {
164
+ return this.models.getModel(providerId, modelId);
165
+ }
166
+ async checkAuth(providerId) {
167
+ return this.models.checkAuth(providerId);
41
168
  }
42
- getModel(providerId, modelId) { return this.modelRegistry.find(providerId, modelId); }
43
- checkAuth(providerId) { return this.modelRegistry.checkAuth(providerId); }
44
169
  async getAvailable(providerId) {
45
- const models = this.modelRegistry.getAvailable();
46
- return providerId ? models.filter((model) => model.provider === providerId) : models;
170
+ if (providerId) {
171
+ if (this.availabilityRefresh) {
172
+ await this.availabilityRefresh;
173
+ return this.snapshot.available.filter((model) => model.provider === providerId);
174
+ }
175
+ try {
176
+ return await this.models.getAvailable(providerId);
177
+ }
178
+ catch (error) {
179
+ this.availabilityError = error instanceof Error ? error.message : String(error);
180
+ throw error;
181
+ }
182
+ }
183
+ await this.refreshAvailability();
184
+ return this.snapshot.available;
185
+ }
186
+ getAvailableSnapshot() {
187
+ return this.snapshot.available;
47
188
  }
48
- getAvailableSnapshot() { return this.modelRegistry.getAvailable(); }
49
189
  getError() {
50
- const errors = [this.modelRegistry.getError(), this.authStorage.getLoadError()?.message].filter((value) => Boolean(value));
51
- return errors.length ? errors.join("\n\n") : undefined;
190
+ const errors = [];
191
+ const configError = this.config.getError();
192
+ if (configError)
193
+ errors.push(configError);
194
+ for (const [providerId, error] of this.compositionErrors) {
195
+ errors.push(`Provider "${providerId}": ${error}`);
196
+ }
197
+ if (this.availabilityError)
198
+ errors.push(`Availability refresh: ${this.availabilityError}`);
199
+ return errors.length > 0 ? errors.join("\n\n") : undefined;
200
+ }
201
+ getRegisteredProviderConfig(providerId) {
202
+ return this.extensionProviders.get(providerId);
203
+ }
204
+ getRegisteredProviderIds() {
205
+ return [...new Set([...this.extensionProviders.keys(), ...this.nativeExtensionProviders.keys()])];
206
+ }
207
+ getRegisteredNativeProvider(providerId) {
208
+ return this.nativeExtensionProviders.get(providerId);
209
+ }
210
+ getOAuthProviderMetadata() { return collectOAuthProviderMetadata(this.getProviders(), this.extensionProviders); }
211
+ /** @internal Compatibility fallback for ModelRegistry when provider auth is unconfigured. */
212
+ getCompatibilityRequestConfig(model) {
213
+ return resolveCompatibilityRequestConfig(model, this.config.getProvider(model.provider), this.extensionProviders.get(model.provider));
214
+ }
215
+ isUsingOAuth(providerId) {
216
+ return this.snapshot.auth.get(providerId)?.type === "oauth";
217
+ }
218
+ hasConfiguredAuth(providerId) {
219
+ return this.snapshot.configuredProviders.has(providerId);
52
220
  }
53
- getAuth(providerOrModel, overrides) {
54
- return typeof providerOrModel === "string"
55
- ? this.modelRegistry.getAuth(providerOrModel, overrides)
56
- : this.modelRegistry.getAuth(providerOrModel, overrides);
221
+ async getAuth(providerOrModel, overrides = {}) {
222
+ if (typeof providerOrModel === "string")
223
+ return this.models.getAuth(providerOrModel, overrides);
224
+ const resolution = await this.models.getAuth(providerOrModel, overrides);
225
+ if (!resolution)
226
+ return undefined;
227
+ return mergeConfiguredAuthHeaders(resolution, providerOrModel, this.config, this.extensionProviders.get(providerOrModel.provider), overrides);
57
228
  }
58
- getProviderAuthStatus(providerId) { return this.modelRegistry.getProviderAuthStatus(providerId); }
59
- isUsingOAuth(providerId) { return this.authStorage.get(providerId)?.type === "oauth"; }
60
- hasConfiguredAuth(providerId) { return this.modelRegistry.getProviderAuthStatus(providerId).configured; }
61
- async setRuntimeApiKey(providerId, apiKey, options = {}) {
62
- this.authStorage.setRuntimeApiKey(providerId, apiKey);
63
- await this.refresh(options);
229
+ /** Reload credentials changed by the authoritative isolated engine and update auth status snapshots. */
230
+ async reloadCredentials() {
231
+ await this.credentials.reload();
232
+ await this.forceRefreshAvailability();
233
+ }
234
+ async saveCredential(providerId, credential) {
235
+ await this.credentials.modify(providerId, async () => credential);
236
+ await this.refresh();
237
+ }
238
+ async setRuntimeApiKey(providerId, apiKey, refreshOptions = {}) {
239
+ this.credentials.setRuntimeApiKey(providerId, apiKey);
240
+ this.snapshot = addRuntimeApiKeyProvider(this.snapshot, providerId);
241
+ await this.refresh(refreshOptions);
64
242
  }
65
243
  async removeRuntimeApiKey(providerId) {
66
- this.authStorage.removeRuntimeApiKey(providerId);
67
- await this.refresh({ allowNetwork: false });
68
- }
69
- async listCredentials() { return this.authStorage.asCredentialStore().list(); }
70
- async prepare(model, options) {
71
- const provider = this.getProvider(model.provider);
72
- if (!provider)
73
- throw new Error(`Unknown provider: ${model.provider}`);
74
- const auth = await this.modelRegistry.getApiKeyAndHeaders(model);
75
- if (!auth.ok)
76
- throw new Error(auth.error);
77
- const { transformHeaders, ...providerOptions } = options ?? {};
78
- let headers = mergeHeaders(auth.headers, providerOptions.headers);
79
- if (transformHeaders)
80
- headers = await transformHeaders(headers ?? {});
81
- return {
82
- provider,
83
- model: auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model,
84
- options: { ...providerOptions, apiKey: providerOptions.apiKey ?? auth.apiKey, headers },
85
- };
244
+ this.credentials.removeRuntimeApiKey(providerId);
245
+ await this.refresh({ allowNetwork: this.modelNetworkEnabled });
246
+ }
247
+ listCredentials() {
248
+ return this.credentials.list();
249
+ }
250
+ getStoredCredentialType(providerId) {
251
+ return this.snapshot.storedCredentialTypes.get(providerId);
252
+ }
253
+ getProviderAuthStatus(providerId) {
254
+ return getSnapshotProviderAuthStatus(this.snapshot, providerId, this.credentials.hasRuntimeApiKey(providerId), configuredRequestAuthStatus(this.config.getProvider(providerId), this.extensionProviders.get(providerId)));
86
255
  }
87
256
  stream(model, context, options) {
88
- return lazyStream(model, async () => {
89
- const prepared = await this.prepare(model, options);
90
- return prepared.provider.stream(prepared.model, context, prepared.options);
91
- });
257
+ return this.streaming.stream(model, context, options);
92
258
  }
93
259
  complete(model, context, options) {
94
- return this.stream(model, context, options).result();
260
+ return this.streaming.complete(model, context, options);
95
261
  }
96
262
  streamSimple(model, context, options) {
97
- return lazyStream(model, async () => {
98
- const prepared = await this.prepare(model, options);
99
- return prepared.provider.streamSimple(prepared.model, context, prepared.options);
100
- });
263
+ return this.streaming.streamSimple(model, context, options);
101
264
  }
102
265
  completeSimple(model, context, options) {
103
- return this.streamSimple(model, context, options).result();
266
+ return this.streaming.completeSimple(model, context, options);
104
267
  }
105
268
  async login(providerId, type, interaction) {
106
- const credential = await this.modelRegistry.login(providerId, type, interaction);
107
- this.authStorage.reload();
108
- await this.refresh({ allowNetwork: false });
269
+ const credential = await this.models.login(providerId, type, interaction);
270
+ try {
271
+ await this.refresh({ allowNetwork: this.modelNetworkEnabled });
272
+ }
273
+ catch (error) {
274
+ throw new OAuthLoginTransactionError(error);
275
+ }
109
276
  return credential;
110
277
  }
111
278
  async logout(providerId) {
112
- await this.modelRegistry.logoutProvider(providerId);
113
- await this.refresh({ allowNetwork: false });
279
+ await this.models.logout(providerId);
280
+ // Reset credential-dependent compatibility projections before the unconfigured provider is skipped by refresh.
281
+ this.recomposeProvider(providerId);
282
+ await this.refresh({ allowNetwork: this.modelNetworkEnabled });
283
+ }
284
+ async refresh(options = {}) {
285
+ this.config = await ModelConfig.load(this.modelsPath);
286
+ this.configureRadiusProviders();
287
+ this.rebuildProviders();
288
+ const refreshOptions = {
289
+ ...options,
290
+ allowNetwork: options.allowNetwork ?? this.modelNetworkEnabled,
291
+ };
292
+ // Published pi-ai builds before ModelsStore returned void and accepted a provider ID.
293
+ // The fallback keeps source-mode CLI tests working without rebuilding workspace dependencies.
294
+ const result = (await this.models.refresh(refreshOptions)) ?? {
295
+ aborted: refreshOptions.signal?.aborted ?? false,
296
+ errors: new Map(),
297
+ };
298
+ this.updateModelSnapshot();
299
+ try {
300
+ await this.forceRefreshAvailability();
301
+ }
302
+ catch {
303
+ // Availability errors are recorded by forceRefreshAvailability; refreshed models remain usable.
304
+ }
305
+ return result;
306
+ }
307
+ registerNativeProvider(provider) {
308
+ if (!provider.id.trim())
309
+ throw new Error("Provider id must not be empty.");
310
+ this.extensionProviders.delete(provider.id);
311
+ this.nativeExtensionProviders.set(provider.id, provider);
312
+ this.recomposeProvider(provider.id);
313
+ this.updateModelSnapshot();
314
+ void this.refresh({ allowNetwork: false });
315
+ }
316
+ registerProvider(providerId, config) {
317
+ // Validate the incoming registration on its own, like the legacy registry:
318
+ // a broken re-registration must throw without touching the stored config.
319
+ validateExtensionProvider(providerId, this.builtins.get(providerId), this.config.getProvider(providerId), config);
320
+ this.nativeExtensionProviders.delete(providerId);
321
+ // Re-registration merges defined values over the previous registration and
322
+ // preserves undefined ones, matching the legacy ModelRegistry contract.
323
+ const previous = this.extensionProviders.get(providerId);
324
+ const effective = { ...previous };
325
+ for (const [key, value] of Object.entries(config)) {
326
+ if (value !== undefined)
327
+ effective[key] = value;
328
+ }
329
+ this.extensionProviders.set(providerId, effective);
330
+ this.recomposeProvider(providerId);
331
+ this.updateModelSnapshot();
332
+ if (this.snapshot.storedProviders.has(providerId) ||
333
+ configuredRequestAuthStatus(this.config.getProvider(providerId), effective)?.configured) {
334
+ const configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);
335
+ const auth = new Map(this.snapshot.auth);
336
+ // Provisional entry until the async refresh lands; never clobber a real check result.
337
+ if (!auth.get(providerId)) {
338
+ auth.set(providerId, {
339
+ type: effective.oauth && !effective.apiKey ? "oauth" : "api_key",
340
+ source: "configured provider",
341
+ });
342
+ }
343
+ this.snapshot = {
344
+ ...this.snapshot,
345
+ auth,
346
+ configuredProviders,
347
+ available: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),
348
+ };
349
+ }
350
+ void this.refresh({ allowNetwork: false });
351
+ }
352
+ unregisterProvider(providerId) {
353
+ this.extensionProviders.delete(providerId);
354
+ this.nativeExtensionProviders.delete(providerId);
355
+ this.recomposeProvider(providerId);
356
+ this.updateModelSnapshot();
357
+ void this.refresh({ allowNetwork: false });
114
358
  }
115
- async reloadConfig() { await this.refresh({ allowNetwork: false }); }
116
- refresh(options = {}) { return this.modelRegistry.refresh(options); }
117
- registerProvider(provider) { this.modelRegistry.registerProvider(provider); }
118
- unregisterProvider(providerId) { this.modelRegistry.unregisterProvider(providerId); }
119
359
  }
120
360
  //# sourceMappingURL=model-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-runtime.js","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiStreamOptions,\n AssistantMessage,\n AssistantMessageEventStream,\n AuthInteraction,\n AuthResult,\n AuthType,\n Context,\n Credential,\n CredentialInfo,\n Models,\n ModelsApiStreamOptions,\n ModelsRefreshOptions,\n ModelsRefreshResult,\n ModelsSimpleStreamOptions,\n Provider,\n ProviderHeaders,\n StreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { lazyStream } from \"@earendil-works/pi-ai\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentConfigPaths } from \"../config.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { AuthStatus } from \"./auth-storage.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\n\nexport interface CreateModelRuntimeOptions {\n authStorage?: AuthStorage;\n authPath?: string | string[];\n modelRegistry?: ModelRegistry;\n modelsPath?: string | string[] | null;\n allowModelNetwork?: boolean;\n modelRefreshTimeoutMs?: number;\n}\n\nexport interface ModelRuntimeAuthOverrides {\n apiKey?: string;\n env?: Record<string, string>;\n}\n\nfunction mergeHeaders(base?: ProviderHeaders, override?: ProviderHeaders): ProviderHeaders | undefined {\n if (!base && !override) return undefined;\n const merged = { ...base };\n for (const [name, value] of Object.entries(override ?? {})) {\n for (const existing of Object.keys(merged)) {\n if (existing.toLowerCase() === name.toLowerCase()) delete merged[existing];\n }\n merged[name] = value;\n }\n return merged;\n}\n\n/** Canonical model/auth facade for SDK consumers. */\nexport class ModelRuntime implements Models {\n readonly modelRegistry: ModelRegistry;\n readonly authStorage: AuthStorage;\n\n constructor(modelRegistry: ModelRegistry, authStorage: AuthStorage = modelRegistry.authStorage) {\n this.modelRegistry = modelRegistry;\n this.authStorage = authStorage;\n }\n\n static async create(options: CreateModelRuntimeOptions = {}): Promise<ModelRuntime> {\n const authStorage = options.authStorage ?? AuthStorage.create(options.authPath);\n const paths = options.modelsPath === null ? [] : (options.modelsPath ?? getAgentConfigPaths(\"models.json\"));\n const modelRegistry = options.modelRegistry ?? (\n Array.isArray(paths) && paths.length === 0\n ? ModelRegistry.inMemory(authStorage)\n : ModelRegistry.create(authStorage, paths)\n );\n const runtime = new ModelRuntime(modelRegistry, authStorage);\n await modelRegistry.refresh({\n allowNetwork: options.allowModelNetwork ?? false,\n timeoutMs: options.modelRefreshTimeoutMs,\n });\n return runtime;\n }\n\n getProviders(): readonly Provider[] { return this.modelRegistry.getProviders(); }\n getProvider(providerId: string): Provider | undefined { return this.modelRegistry.getProvider(providerId); }\n getModels(providerId?: string): readonly Model<Api>[] {\n return providerId ? this.modelRegistry.getAll().filter((model) => model.provider === providerId) : this.modelRegistry.getAll();\n }\n getModel(providerId: string, modelId: string): Model<Api> | undefined { return this.modelRegistry.find(providerId, modelId); }\n checkAuth(providerId: string) { return this.modelRegistry.checkAuth(providerId); }\n async getAvailable(providerId?: string): Promise<readonly Model<Api>[]> {\n const models = this.modelRegistry.getAvailable();\n return providerId ? models.filter((model) => model.provider === providerId) : models;\n }\n getAvailableSnapshot(): readonly Model<Api>[] { return this.modelRegistry.getAvailable(); }\n getError(): string | undefined {\n const errors = [this.modelRegistry.getError(), this.authStorage.getLoadError()?.message].filter((value): value is string => Boolean(value));\n return errors.length ? errors.join(\"\\n\\n\") : undefined;\n }\n getAuth(providerId: string, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n getAuth(model: Model<Api>, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n getAuth(providerOrModel: string | Model<Api>, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined> {\n return typeof providerOrModel === \"string\"\n ? this.modelRegistry.getAuth(providerOrModel, overrides)\n : this.modelRegistry.getAuth(providerOrModel, overrides);\n }\n getProviderAuthStatus(providerId: string): AuthStatus { return this.modelRegistry.getProviderAuthStatus(providerId); }\n isUsingOAuth(providerId: string): boolean { return this.authStorage.get(providerId)?.type === \"oauth\"; }\n hasConfiguredAuth(providerId: string): boolean { return this.modelRegistry.getProviderAuthStatus(providerId).configured; }\n async setRuntimeApiKey(providerId: string, apiKey: string, options: ModelsRefreshOptions = {}): Promise<void> {\n this.authStorage.setRuntimeApiKey(providerId, apiKey);\n await this.refresh(options);\n }\n async removeRuntimeApiKey(providerId: string): Promise<void> {\n this.authStorage.removeRuntimeApiKey(providerId);\n await this.refresh({ allowNetwork: false });\n }\n async listCredentials(): Promise<readonly CredentialInfo[]> { return this.authStorage.asCredentialStore().list(); }\n\n private async prepare(\n model: Model<Api>,\n options: (StreamOptions & { transformHeaders?: (headers: ProviderHeaders) => ProviderHeaders | Promise<ProviderHeaders> }) | undefined,\n ) {\n const provider = this.getProvider(model.provider);\n if (!provider) throw new Error(`Unknown provider: ${model.provider}`);\n const auth = await this.modelRegistry.getApiKeyAndHeaders(model);\n if (!auth.ok) throw new Error(auth.error);\n const { transformHeaders, ...providerOptions } = options ?? {};\n let headers = mergeHeaders(auth.headers, providerOptions.headers);\n if (transformHeaders) headers = await transformHeaders(headers ?? {});\n return {\n provider,\n model: auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model,\n options: { ...providerOptions, apiKey: providerOptions.apiKey ?? auth.apiKey, headers },\n };\n }\n stream<TApi extends Api>(model: Model<TApi>, context: Context, options?: ModelsApiStreamOptions<TApi>): AssistantMessageEventStream {\n return lazyStream(model, async () => {\n const prepared = await this.prepare(model, options as StreamOptions | undefined);\n return prepared.provider.stream(prepared.model as Model<TApi>, context, prepared.options as ApiStreamOptions<TApi>);\n });\n }\n complete<TApi extends Api>(model: Model<TApi>, context: Context, options?: ModelsApiStreamOptions<TApi>): Promise<AssistantMessage> {\n return this.stream(model, context, options).result();\n }\n streamSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream {\n return lazyStream(model, async () => {\n const prepared = await this.prepare(model, options);\n return prepared.provider.streamSimple(prepared.model, context, prepared.options);\n });\n }\n completeSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): Promise<AssistantMessage> {\n return this.streamSimple(model, context, options).result();\n }\n async login(providerId: string, type: AuthType, interaction: AuthInteraction): Promise<Credential> {\n const credential = await this.modelRegistry.login(providerId, type, interaction);\n this.authStorage.reload();\n await this.refresh({ allowNetwork: false });\n return credential;\n }\n async logout(providerId: string): Promise<void> {\n await this.modelRegistry.logoutProvider(providerId);\n await this.refresh({ allowNetwork: false });\n }\n async reloadConfig(): Promise<void> { await this.refresh({ allowNetwork: false }); }\n refresh(options: ModelsRefreshOptions = {}): Promise<ModelsRefreshResult> { return this.modelRegistry.refresh(options); }\n registerProvider(provider: Provider): void { this.modelRegistry.registerProvider(provider); }\n unregisterProvider(providerId: string): void { this.modelRegistry.unregisterProvider(providerId); }\n}\n"]}
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 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\tcreateModels,\n\ttype Model,\n\ttype Models,\n\ttype ModelsApiStreamOptions,\n\ttype ModelsRefreshOptions,\n\ttype ModelsRefreshResult,\n\ttype ModelsSimpleStreamOptions,\n\ttype ModelsStore,\n\ttype MutableModels,\n\ttype Provider,\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\tcomposeModelProvider,\n\tconfiguredRequestAuthStatus,\n\ttype CompatibilityRequestConfig,\n\ttype ProviderConfigInput,\n\tresolveCompatibilityRequestConfig,\n\tvalidateExtensionProvider,\n} from \"./provider-composer.ts\";\nimport { withRemoteCatalog } from \"./remote-catalog-provider.ts\";\nimport { RuntimeCredentials } from \"./runtime-credentials.ts\";\nimport { isOfflineModeEnabled } from \"./package-manager-env.ts\";\nimport { collectOAuthProviderMetadata } from \"./oauth-provider-metadata.ts\";\nimport { OAuthLoginTransactionError } from \"./oauth-login.ts\";\nimport {\n\taddRuntimeApiKeyProvider,\n\tcreateEmptyModelRuntimeSnapshot,\n\tcreateModelRuntimeSnapshot,\n\tgetSnapshotProviderAuthStatus,\n\ttype ModelRuntimeSnapshot,\n\tupdateSnapshotModels,\n} from \"./model-runtime-snapshot.ts\";\nexport type { CreateModelRuntimeOptions, ModelRuntimeAuthOverrides } from \"./model-runtime-types.ts\";\nimport type { CreateModelRuntimeOptions, ModelRuntimeAuthOverrides } from \"./model-runtime-types.ts\";\nimport { ModelRuntimeStreaming } from \"./model-runtime-streaming.ts\";\nimport { canRestoreUnknownModel as canRestoreUnknownModelProvider } from \"./model-runtime-restoration.ts\";\nimport { mergeConfiguredAuthHeaders } from \"./model-runtime-auth.ts\";\nimport { configureBuiltinProviders } from \"./model-runtime-providers.ts\";\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 streaming: ModelRuntimeStreaming;\n\tprivate readonly defaultBuiltins: ReadonlyMap<string, Provider>;\n\tprivate readonly builtins = new Map<string, Provider>();\n\tprivate readonly nativeExtensionProviders = 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 modelNetworkEnabled: boolean;\n\tprivate config: ModelConfig;\n\tprivate snapshot: ModelRuntimeSnapshot = createEmptyModelRuntimeSnapshot();\n\tprivate availabilityRefresh: Promise<void> | undefined;\n\tprivate availabilityError: string | undefined;\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\tmodelNetworkEnabled: boolean,\n\t) {\n\t\tthis.credentials = credentials;\n\t\tthis.config = config;\n\t\tthis.modelsPath = modelsPath;\n\t\tthis.modelNetworkEnabled = modelNetworkEnabled;\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.streaming = new ModelRuntimeStreaming(this.models, (model, overrides) => this.getAuth(model, overrides));\n\t\tthis.rebuildProviders();\n\t}\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 builtinModelDataGeneratedAt = builtinProviderCatalog.getBuiltinModelDataGeneratedAt();\n\t\tconst providers = builtinProviderCatalog\n\t\t\t.builtinProviders()\n\t\t\t.map((provider) =>\n\t\t\t\tprovider.id === \"radius\"\n\t\t\t\t\t? provider\n\t\t\t\t\t: withRemoteCatalog(provider, options.catalogBaseUrl, builtinModelDataGeneratedAt),\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\t!isOfflineModeEnabled(),\n\t\t);\n\t\truntime.configureRadiusProviders();\n\t\truntime.rebuildProviders();\n\t\tconst refreshFromNetwork = runtime.modelNetworkEnabled && options.allowModelNetwork === true;\n\t\tconst controller = refreshFromNetwork ? new AbortController() : undefined;\n\t\tconst timeout = controller\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: refreshFromNetwork, signal: controller?.signal });\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t}\n\t\treturn runtime;\n\t}\n\tprivate configureRadiusProviders(): void {\n\t\tconfigureBuiltinProviders(this.builtins, this.defaultBuiltins, this.config);\n\t}\n\tprivate providerIds(): Set<string> {\n\t\treturn new Set([\n\t\t\t...this.builtins.keys(),\n\t\t\t...this.nativeExtensionProviders.keys(),\n\t\t\t...this.config.getProviderIds(),\n\t\t\t...this.extensionProviders.keys(),\n\t\t]);\n\t}\n\tprivate recomposeProvider(providerId: string): void {\n\t\tconst base = this.nativeExtensionProviders.get(providerId) ?? 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\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\tprivate updateModelSnapshot(): void {\n\t\tthis.snapshot = updateSnapshotModels(this.snapshot, [...this.models.getModels()]);\n\t}\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\tthis.snapshot = createModelRuntimeSnapshot(\n\t\t\t[...this.models.getModels()],\n\t\t\t[...available],\n\t\t\tchecks,\n\t\t\tcredentials,\n\t\t);\n\t\tthis.availabilityError = undefined;\n\t}\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\t/** Coalesce concurrent readers onto the pending refresh. */\n\tprivate refreshAvailability(): Promise<void> {\n\t\treturn this.availabilityRefresh ?? this.queueAvailabilityRefresh(undefined);\n\t}\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\tgetProviders(): readonly Provider[] {\n\t\treturn this.models.getProviders();\n\t}\n\tgetProvider(providerId: string): Provider | undefined {\n\t\treturn this.models.getProvider(providerId);\n\t}\n\t/** Whether an authenticated provider may reconstruct an absent saved model ID. */\n\tcanRestoreUnknownModel(providerId: string): boolean {\n\t\treturn canRestoreUnknownModelProvider(\n\t\t\tproviderId,\n\t\t\tthis.defaultBuiltins.get(providerId),\n\t\t\tthis.config.getProvider(providerId),\n\t\t\tthis.extensionProviders.get(providerId),\n\t\t\tthis.nativeExtensionProviders.get(providerId),\n\t\t);\n\t}\n\tgetModels(providerId?: string): readonly Model<Api>[] {\n\t\treturn this.models.getModels(providerId);\n\t}\n\tgetModel(providerId: string, modelId: string): Model<Api> | undefined {\n\t\treturn this.models.getModel(providerId, modelId);\n\t}\n\tasync checkAuth(providerId: string): Promise<AuthCheck | undefined> {\n\t\treturn this.models.checkAuth(providerId);\n\t}\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\tgetAvailableSnapshot(): readonly Model<Api>[] {\n\t\treturn this.snapshot.available;\n\t}\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 [...new Set([...this.extensionProviders.keys(), ...this.nativeExtensionProviders.keys()])];\n\t}\n\n\tgetRegisteredNativeProvider(providerId: string): Provider | undefined {\n\t\treturn this.nativeExtensionProviders.get(providerId);\n\t}\n\tgetOAuthProviderMetadata() { return collectOAuthProviderMetadata(this.getProviders(), this.extensionProviders); }\n\t/** @internal Compatibility fallback for ModelRegistry when provider auth is unconfigured. */\n\tgetCompatibilityRequestConfig(model: Model<Api>): 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);\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\treturn mergeConfiguredAuthHeaders(\n\t\t\tresolution,\n\t\t\tproviderOrModel,\n\t\t\tthis.config,\n\t\t\tthis.extensionProviders.get(providerOrModel.provider),\n\t\t\toverrides,\n\t\t);\n\t}\n\t/** Reload credentials changed by the authoritative isolated engine and update auth status snapshots. */\n\tasync reloadCredentials(): Promise<void> {\n\t\tawait this.credentials.reload();\n\t\tawait this.forceRefreshAvailability();\n\t}\n\n\tasync saveCredential(providerId: string, credential: Credential): Promise<void> {\n\t\tawait this.credentials.modify(providerId, async () => credential);\n\t\tawait this.refresh();\n\t}\n\tasync setRuntimeApiKey(\n\t\tproviderId: string,\n\t\tapiKey: string,\n\t\trefreshOptions: ModelsRefreshOptions = {},\n\t): Promise<void> {\n\t\tthis.credentials.setRuntimeApiKey(providerId, apiKey);\n\t\tthis.snapshot = addRuntimeApiKeyProvider(this.snapshot, providerId);\n\t\tawait this.refresh(refreshOptions);\n\t}\n\n\tasync removeRuntimeApiKey(providerId: string): Promise<void> {\n\t\tthis.credentials.removeRuntimeApiKey(providerId);\n\t\tawait this.refresh({ allowNetwork: this.modelNetworkEnabled });\n\t}\n\n\tlistCredentials(): Promise<readonly CredentialInfo[]> {\n\t\treturn this.credentials.list();\n\t}\n\n\tgetStoredCredentialType(providerId: string): CredentialInfo[\"type\"] | undefined {\n\t\treturn this.snapshot.storedCredentialTypes.get(providerId);\n\t}\n\n\tgetProviderAuthStatus(providerId: string): AuthStatus {\n\t\treturn getSnapshotProviderAuthStatus(\n\t\t\tthis.snapshot,\n\t\t\tproviderId,\n\t\t\tthis.credentials.hasRuntimeApiKey(providerId),\n\t\t\tconfiguredRequestAuthStatus(\n\t\t\t\tthis.config.getProvider(providerId),\n\t\t\t\tthis.extensionProviders.get(providerId),\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 this.streaming.stream(model, context, options);\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.streaming.complete(model, context, options);\n\t}\n\n\tstreamSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream {\n\t\treturn this.streaming.streamSimple(model, context, options);\n\t}\n\n\tcompleteSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): Promise<AssistantMessage> {\n\t\treturn this.streaming.completeSimple(model, context, options);\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\ttry {\n\t\t\tawait this.refresh({ allowNetwork: this.modelNetworkEnabled });\n\t\t} catch (error) {\n\t\t\tthrow new OAuthLoginTransactionError(error);\n\t\t}\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.modelNetworkEnabled });\n\t}\n\n\tasync refresh(options: ModelsRefreshOptions = {}): Promise<ModelsRefreshResult> {\n\t\tthis.config = await ModelConfig.load(this.modelsPath);\n\t\tthis.configureRadiusProviders();\n\t\tthis.rebuildProviders();\n\t\tconst refreshOptions = {\n\t\t\t...options,\n\t\t\tallowNetwork: options.allowNetwork ?? this.modelNetworkEnabled,\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\tregisterNativeProvider(provider: Provider): void {\n\t\tif (!provider.id.trim()) throw new Error(\"Provider id must not be empty.\");\n\t\tthis.extensionProviders.delete(provider.id);\n\t\tthis.nativeExtensionProviders.set(provider.id, provider);\n\t\tthis.recomposeProvider(provider.id);\n\t\tthis.updateModelSnapshot();\n\t\tvoid this.refresh({ allowNetwork: false });\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\tthis.nativeExtensionProviders.delete(providerId);\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.nativeExtensionProviders.delete(providerId);\n\t\tthis.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t\tvoid this.refresh({ allowNetwork: false });\n\t}\n}\n"]}
@@ -1,25 +1,17 @@
1
1
  import type { ModelsStore, ModelsStoreEntry } from "@earendil-works/pi-ai";
2
- export interface CodingAgentModelsStore extends ModelsStore {
3
- writeIf(providerId: string, entry: ModelsStoreEntry, predicate: () => boolean): Promise<void>;
4
- deleteIf(providerId: string, predicate: () => boolean): Promise<void>;
5
- }
6
- export declare class InMemoryCodingAgentModelsStore implements CodingAgentModelsStore {
2
+ export declare class InMemoryCodingAgentModelsStore implements ModelsStore {
7
3
  private readonly entries;
8
4
  read(providerId: string): Promise<ModelsStoreEntry | undefined>;
9
5
  write(providerId: string, entry: ModelsStoreEntry): Promise<void>;
10
6
  delete(providerId: string): Promise<void>;
11
- writeIf(providerId: string, entry: ModelsStoreEntry, predicate: () => boolean): Promise<void>;
12
- deleteIf(providerId: string, predicate: () => boolean): Promise<void>;
13
7
  }
14
8
  /** Locked JSON-backed storage for dynamically refreshed provider catalogs. */
15
- export declare class FileModelsStore implements CodingAgentModelsStore {
9
+ export declare class FileModelsStore implements ModelsStore {
16
10
  private readonly storage;
17
11
  constructor(path?: string);
18
12
  private parse;
19
13
  read(providerId: string): Promise<ModelsStoreEntry | undefined>;
20
14
  write(providerId: string, entry: ModelsStoreEntry): Promise<void>;
21
15
  delete(providerId: string): Promise<void>;
22
- writeIf(providerId: string, entry: ModelsStoreEntry, predicate: () => boolean): Promise<void>;
23
- deleteIf(providerId: string, predicate: () => boolean): Promise<void>;
24
16
  }
25
17
  //# sourceMappingURL=models-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"models-store.d.ts","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO3E,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IAC1D,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,qBAAa,8BAA+B,YAAW,sBAAsB;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAEzD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAGpE;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;IAEK,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAElG;IAEK,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;CACD;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,YAAW,sBAAsB;IAC7D,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;IAEK,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlG;IAEK,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1E;CACD"}
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"}