@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 +1 @@
1
- {"version":3,"file":"auth-storage.js","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Credential storage for API keys and OAuth tokens.\n * Handles loading, saving, and refreshing credentials from auth.json.\n *\n * Uses file locking to prevent race conditions when multiple pi instances\n * try to refresh tokens simultaneously.\n */\n\nimport {\n\ttype Credential,\n\ttype CredentialInfo,\n\ttype CredentialStore,\n\ttype ModelAuth,\n\ttype OAuthCredential as PiOAuthCredential,\n\ttype OAuthCredentials,\n} from \"@earendil-works/pi-ai\";\nimport { findEnvKeys, getEnvApiKey } from \"@earendil-works/pi-ai/compat\";\nimport { join } from \"path\";\nimport { getAgentConfigPaths, getAgentDir } from \"../config.ts\";\nimport { FileAuthStorageBackend, InMemoryAuthStorageBackend, type AuthStorageBackend } from \"./auth-storage-backends.ts\";\nimport {\n\ttype AtomicOAuthLoginCallbacks,\n\tgetOAuthProviderDescriptors,\n\tloginOAuthProvider,\n\toauthCredentialToAuth,\n\trefreshOAuthProvider,\n} from \"./oauth-provider-bridge.ts\";\nimport { resolveConfigValue } from \"./resolve-config-value.ts\";\n\nexport type ApiKeyCredential = {\n\ttype: \"api_key\";\n\tkey?: string;\n\t/** Provider-scoped configuration persisted alongside the credential. */\n\tenv?: Record<string, string>;\n};\n\nexport type OAuthCredential = {\n\ttype: \"oauth\";\n} & OAuthCredentials;\n\nexport type AuthCredential = ApiKeyCredential | OAuthCredential;\n\nexport type AuthStorageData = Record<string, AuthCredential>;\n\nexport type AuthStatus = {\n\tconfigured: boolean;\n\tsource?: \"stored\" | \"runtime\" | \"environment\" | \"fallback\" | \"models_json_key\" | \"models_json_command\";\n\tlabel?: string;\n};\n\nexport { FileAuthStorageBackend, InMemoryAuthStorageBackend, type AuthStorageBackend } from \"./auth-storage-backends.ts\";\n\n/** Read one persisted provider credential using Atomic's layered config paths. */\nexport function readStoredCredential(providerId: string, authPath?: string | string[]): Credential | undefined {\n\treturn AuthStorage.create(authPath).get(providerId) as Credential | undefined;\n}\n\n/**\n * Credential storage backed by a JSON file.\n */\nexport class AuthStorage {\n\tprivate data: AuthStorageData = {};\n\tprivate runtimeOverrides: Map<string, string> = new Map();\n\tprivate fallbackResolver?: (provider: string) => string | undefined;\n\tprivate loadError: Error | null = null;\n\tprivate errors: Error[] = [];\n\tprivate credentialMutationTail: Promise<void> = Promise.resolve();\n\tprivate credentialVersions = new Map<string, number>();\n\n\tdeclare private storage: AuthStorageBackend;\n\n\tprivate constructor(storage: AuthStorageBackend) {\n\t\tthis.storage = storage;\n\t\tthis.reload();\n\t}\n\n\tstatic create(authPath?: string | string[]): AuthStorage {\n\t\tconst paths = authPath === undefined\n\t\t\t? getAgentConfigPaths(\"auth.json\")\n\t\t\t: Array.isArray(authPath) ? authPath : [authPath];\n\t\treturn new AuthStorage(new FileAuthStorageBackend(paths[0] ?? join(getAgentDir(), \"auth.json\"), paths));\n\t}\n\n\tstatic fromStorage(storage: AuthStorageBackend): AuthStorage {\n\t\treturn new AuthStorage(storage);\n\t}\n\n\tstatic inMemory(data: AuthStorageData = {}): AuthStorage {\n\t\tconst storage = new InMemoryAuthStorageBackend();\n\t\tstorage.withLock(() => ({ result: undefined, next: JSON.stringify(data, null, 2) }));\n\t\treturn AuthStorage.fromStorage(storage);\n\t}\n\n\t/**\n\t * Set a runtime API key override (not persisted to disk).\n\t * Used for CLI --api-key flag.\n\t */\n\tsetRuntimeApiKey(provider: string, apiKey: string): void {\n\t\tthis.runtimeOverrides.set(provider, apiKey);\n\t}\n\t/** Read a non-persisted request override without resolving stored credentials. */\n\tgetRuntimeApiKey(provider: string): string | undefined {\n\t\treturn this.runtimeOverrides.get(provider);\n\t}\n\n\n\t/**\n\t * Remove a runtime API key override.\n\t */\n\tremoveRuntimeApiKey(provider: string): void {\n\t\tthis.runtimeOverrides.delete(provider);\n\t}\n\n\t/**\n\t * Set a fallback resolver for API keys not found in auth.json or env vars.\n\t * Used for custom provider keys from models.json.\n\t */\n\tsetFallbackResolver(resolver: (provider: string) => string | undefined): void {\n\t\tthis.fallbackResolver = resolver;\n\t}\n\n\tprivate recordError(error: unknown): void {\n\t\tconst normalizedError = error instanceof Error ? error : new Error(String(error));\n\t\tthis.errors.push(normalizedError);\n\t}\n\n\tprivate parseStorageData(content: string | undefined): AuthStorageData {\n\t\tif (!content) {\n\t\t\treturn {};\n\t\t}\n\t\treturn JSON.parse(content) as AuthStorageData;\n\t}\n\n\t/**\n\t * Reload credentials from storage.\n\t */\n\treload(): void {\n\t\ttry {\n\t\t\t// Pure read: never take the exclusive write lock. Writers replace\n\t\t\t// auth.json atomically, so a lock-free read always sees a complete\n\t\t\t// snapshot. This keeps many concurrent sessions from starving each other\n\t\t\t// on the lock and misreporting configured providers as unreadable under\n\t\t\t// contention (issue #1431).\n\t\t\tconst content = this.readSnapshot();\n\t\t\tthis.data = this.parseStorageData(content);\n\t\t\tthis.loadError = null;\n\t\t} catch (error) {\n\t\t\tthis.loadError = error as Error;\n\t\t\tthis.recordError(error);\n\t\t}\n\t}\n\n\t/**\n\t * Read the credential snapshot, preferring the backend's lock-free `read()`.\n\t * Falls back to a `withLock`-based read for custom backends that predate\n\t * `read()` so the released `AuthStorageBackend` interface stays compatible.\n\t */\n\tprivate readSnapshot(): string | undefined {\n\t\tif (this.storage.read) {\n\t\t\treturn this.storage.read();\n\t\t}\n\t\tlet content: string | undefined;\n\t\tthis.storage.withLock((current) => {\n\t\t\tcontent = current;\n\t\t\treturn { result: undefined };\n\t\t});\n\t\treturn content;\n\t}\n\n\tprivate bumpCredentialVersion(provider: string): void {\n\t\tthis.credentialVersions.set(provider, (this.credentialVersions.get(provider) ?? 0) + 1);\n\t}\n\n\tprivate persistProviderChange(provider: string, credential: AuthCredential | undefined): void {\n\t\tif (this.loadError) {\n\t\t\tthis.reload();\n\t\t\tif (this.loadError) throw this.loadError;\n\t\t}\n\n\t\ttry {\n\t\t\tconst persistedData = this.storage.withLock((current) => {\n\t\t\t\tconst currentData = this.parseStorageData(current);\n\t\t\t\tconst merged: AuthStorageData = { ...currentData };\n\t\t\t\tif (credential) {\n\t\t\t\t\tmerged[provider] = credential;\n\t\t\t\t} else {\n\t\t\t\t\tdelete merged[provider];\n\t\t\t\t}\n\t\t\t\treturn { result: merged, next: JSON.stringify(merged, null, 2) };\n\t\t\t});\n\t\t\tthis.data = persistedData;\n\t\t\tthis.bumpCredentialVersion(provider);\n\t\t\tthis.loadError = null;\n\t\t} catch (error) {\n\t\t\tthis.recordError(error);\n\t\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t\t}\n\t}\n\n\t/**\n\t * Get credential for a provider.\n\t */\n\tget(provider: string): AuthCredential | undefined {\n\t\treturn this.data[provider] ?? undefined;\n\t}\n\n\t/**\n\t * Set credential for a provider.\n\t */\n\tset(provider: string, credential: AuthCredential): void {\n\t\tthis.persistProviderChange(provider, credential);\n\t}\n\n\t/**\n\t * Remove credential for a provider.\n\t */\n\tremove(provider: string): void {\n\t\tif (!this.storage.deleteProvider) {\n\t\t\tthis.persistProviderChange(provider, undefined);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.data = this.parseStorageData(this.storage.deleteProvider(provider));\n\t\t\tthis.bumpCredentialVersion(provider);\n\t\t\tthis.loadError = null;\n\t\t} catch (error) {\n\t\t\tthis.recordError(error);\n\t\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t\t}\n\t}\n\n\t/**\n\t * List all providers with credentials.\n\t */\n\tlist(): string[] {\n\t\treturn Object.keys(this.data);\n\t}\n\n\t/**\n\t * Check if credentials exist for a provider in auth.json.\n\t */\n\thas(provider: string): boolean {\n\t\treturn provider in this.data;\n\t}\n\n\t/**\n\t * Check if any form of auth is configured for a provider.\n\t * Unlike getApiKey(), this doesn't refresh OAuth tokens.\n\t */\n\thasAuth(provider: string): boolean {\n\t\tif (this.runtimeOverrides.has(provider)) return true;\n\t\tif (this.data[provider]) return true;\n\t\tif (findEnvKeys(provider)?.[0]) return true;\n\t\tif (this.fallbackResolver?.(provider)) return true;\n\t\treturn false;\n\t}\n\n\t/**\n\t * Return auth status without exposing credential values or refreshing tokens.\n\t */\n\tgetAuthStatus(provider: string): AuthStatus {\n\t\tif (this.data[provider]) {\n\t\t\treturn { configured: true, source: \"stored\" };\n\t\t}\n\n\t\tif (this.runtimeOverrides.has(provider)) {\n\t\t\treturn { configured: false, source: \"runtime\", label: \"--api-key\" };\n\t\t}\n\n\t\tconst envKeys = findEnvKeys(provider);\n\t\tif (envKeys?.[0]) {\n\t\t\treturn { configured: true, source: \"environment\", label: envKeys[0] };\n\t\t}\n\n\t\tif (this.fallbackResolver?.(provider)) {\n\t\t\treturn { configured: false, source: \"fallback\", label: \"custom provider config\" };\n\t\t}\n\n\t\treturn { configured: false };\n\t}\n\n\t/** Return a copy of all persisted credentials. */\n\tgetAll(): AuthStorageData {\n\t\treturn { ...this.data };\n\t}\n\n\tdrainErrors(): Error[] {\n\t\tconst drained = [...this.errors];\n\t\tthis.errors = [];\n\t\treturn drained;\n\t}\n\n\t/**\n\t * Returns the error from the most recent failed credential load, or null when\n\t * the last reload succeeded.\n\t *\n\t * A non-null value means stored credentials could NOT be read — e.g. the auth\n\t * file was temporarily locked by another process (ELOCKED) or contained\n\t * invalid JSON — so an empty/absent credential set is NOT authoritative.\n\t * Callers that would otherwise report \"No API key found\" should surface this\n\t * load failure instead of treating the provider as unauthenticated\n\t * (issue #1431).\n\t */\n\tgetLoadError(): Error | null {\n\t\treturn this.loadError;\n\t}\n\n\t/**\n\t * Login to an OAuth provider.\n\t */\n\tasync login(providerId: string, callbacks: AtomicOAuthLoginCallbacks): Promise<void> {\n\t\tconst credential = await loginOAuthProvider(providerId, callbacks);\n\t\tawait this.asCredentialStore().modify(providerId, async () => credential);\n\t}\n\n\t/** Logout through the preserved synchronous persistence path. */\n\tlogout(provider: string): void {\n\t\tthis.remove(provider);\n\t}\n\n\t/** Serialized logout for callers that need persistence completion. */\n\tasync logoutAsync(provider: string): Promise<void> {\n\t\tawait this.asCredentialStore().delete(provider);\n\t}\n\n\t/**\n\t * Refresh OAuth token with backend locking to prevent race conditions.\n\t * Multiple pi instances may try to refresh simultaneously when tokens expire.\n\t */\n\tprivate async refreshOAuthTokenWithLock(\n\t\tproviderId: string,\n\t): Promise<{ auth: ModelAuth; newCredentials: OAuthCredentials } | null> {\n\t\treturn this.runCredentialMutation(async () => {\n\t\t\tlet synchronizedData: AuthStorageData | undefined;\n\t\t\tconst credentialVersion = this.credentialVersions.get(providerId) ?? 0;\n\t\t\tconst result = await this.storage.withLockAsync(async (current) => {\n\t\t\t\tconst currentData = this.parseStorageData(current);\n\t\t\t\tsynchronizedData = currentData;\n\t\t\t\tconst cred = currentData[providerId];\n\t\t\t\tif (cred?.type !== \"oauth\") return { result: null };\n\n\t\t\t\tconst oauthCredential: PiOAuthCredential = { ...cred, type: \"oauth\" };\n\t\t\t\tif (Date.now() < cred.expires) {\n\t\t\t\t\tconst auth = await oauthCredentialToAuth(providerId, oauthCredential);\n\t\t\t\t\treturn { result: auth ? { auth, newCredentials: cred } : null };\n\t\t\t\t}\n\n\t\t\t\tconst refreshed = await refreshOAuthProvider(providerId, oauthCredential);\n\t\t\t\tif (!refreshed) return { result: null };\n\t\t\t\tif ((this.credentialVersions.get(providerId) ?? 0) !== credentialVersion) {\n\t\t\t\t\tsynchronizedData = undefined;\n\t\t\t\t\treturn { result: null };\n\t\t\t\t}\n\t\t\t\tconst merged: AuthStorageData = {\n\t\t\t\t\t...currentData,\n\t\t\t\t\t[providerId]: refreshed.credential,\n\t\t\t\t};\n\t\t\t\tsynchronizedData = merged;\n\t\t\t\treturn {\n\t\t\t\t\tresult: { auth: refreshed.auth, newCredentials: refreshed.credential },\n\t\t\t\t\tnext: JSON.stringify(merged, null, 2),\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tif (synchronizedData) this.data = synchronizedData;\n\t\t\tthis.loadError = null;\n\t\t\treturn result;\n\t\t});\n\t}\n\n\t/**\n\t * Get API key for a provider.\n\t * Priority:\n\t * 1. Runtime override (CLI --api-key)\n\t * 2. API key from auth.json\n\t * 3. OAuth token from auth.json (auto-refreshed with locking)\n\t * 4. Environment variable\n\t * 5. Fallback resolver (models.json custom providers)\n\t */\n\tasync getModelAuth(providerId: string, options?: { includeFallback?: boolean }): Promise<ModelAuth | undefined> {\n\t\tconst runtimeKey = this.runtimeOverrides.get(providerId);\n\t\tif (runtimeKey) return { apiKey: runtimeKey };\n\n\t\tconst cred = this.data[providerId];\n\t\tif (cred?.type === \"api_key\" && cred.key) return { apiKey: resolveConfigValue(cred.key) };\n\n\t\tif (cred?.type === \"oauth\") {\n\t\t\ttry {\n\t\t\t\tif (Date.now() >= cred.expires) {\n\t\t\t\t\treturn (await this.refreshOAuthTokenWithLock(providerId))?.auth;\n\t\t\t\t}\n\t\t\t\treturn await oauthCredentialToAuth(providerId, { ...cred, type: \"oauth\" });\n\t\t\t} catch (error) {\n\t\t\t\tthis.recordError(error);\n\t\t\t\tthis.reload();\n\t\t\t\tconst updated = this.data[providerId];\n\t\t\t\tif (updated?.type === \"oauth\" && Date.now() < updated.expires) {\n\t\t\t\t\treturn oauthCredentialToAuth(providerId, { ...updated, type: \"oauth\" });\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\tconst envKey = getEnvApiKey(providerId);\n\t\tif (envKey) return { apiKey: envKey };\n\t\tif (options?.includeFallback !== false) {\n\t\t\tconst fallback = this.fallbackResolver?.(providerId);\n\t\t\tif (fallback) return { apiKey: fallback };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tasync getApiKey(providerId: string, options?: { includeFallback?: boolean }): Promise<string | undefined> {\n\t\treturn (await this.getModelAuth(providerId, options))?.apiKey;\n\t}\n\n\t/**\n\t * Get all registered OAuth providers\n\t */\n\tgetOAuthProviders() {\n\t\treturn getOAuthProviderDescriptors();\n\t}\n\n\tprivate runCredentialMutation<T>(operation: () => Promise<T>): Promise<T> {\n\t\tconst result = this.credentialMutationTail.then(operation, operation);\n\t\tthis.credentialMutationTail = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t}\n\n\t/** Private async adapter for pi-ai's provider-owned Models runtime. */\n\tasCredentialStore(): CredentialStore {\n\t\tconst runtimeCredential = (providerId: string): Credential | undefined => {\n\t\t\tconst key = this.runtimeOverrides.get(providerId);\n\t\t\treturn key === undefined ? undefined : { type: \"api_key\", key };\n\t\t};\n\t\treturn {\n\t\t\tread: async (providerId) => runtimeCredential(providerId) ?? (this.get(providerId) as Credential | undefined),\n\t\t\tlist: async (): Promise<readonly CredentialInfo[]> => {\n\t\t\t\tconst providers = new Set([...this.list(), ...this.runtimeOverrides.keys()]);\n\t\t\t\treturn [...providers].map((providerId) => ({\n\t\t\t\t\tproviderId,\n\t\t\t\t\ttype: runtimeCredential(providerId)?.type ?? this.data[providerId].type,\n\t\t\t\t}));\n\t\t\t},\n\t\t\tmodify: (providerId, fn) =>\n\t\t\t\tthis.runCredentialMutation(async () => {\n\t\t\t\t\tlet synchronizedData: AuthStorageData | undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await this.storage.withLockAsync(async (current) => {\n\t\t\t\t\t\t\tconst data = this.parseStorageData(current);\n\t\t\t\t\t\t\tconst next = await fn(data[providerId] as Credential | undefined);\n\t\t\t\t\t\t\tif (next === undefined) {\n\t\t\t\t\t\t\t\tsynchronizedData = data;\n\t\t\t\t\t\t\t\treturn { result: data[providerId] as Credential | undefined };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst merged = { ...data, [providerId]: next as AuthCredential };\n\t\t\t\t\t\t\tsynchronizedData = merged;\n\t\t\t\t\t\t\treturn { result: next, next: JSON.stringify(merged, null, 2) };\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (synchronizedData) {\n\t\t\t\t\t\t\tthis.data = synchronizedData;\n\t\t\t\t\t\t\tthis.bumpCredentialVersion(providerId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.loadError = null;\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.recordError(error);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\tdelete: (providerId) =>\n\t\t\t\tthis.runCredentialMutation(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (this.storage.deleteProviderAsync) {\n\t\t\t\t\t\t\tthis.data = this.parseStorageData(await this.storage.deleteProviderAsync(providerId));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet synchronizedData: AuthStorageData | undefined;\n\t\t\t\t\t\t\tawait this.storage.withLockAsync(async (current) => {\n\t\t\t\t\t\t\t\tconst data = this.parseStorageData(current);\n\t\t\t\t\t\t\t\tdelete data[providerId];\n\t\t\t\t\t\t\t\tsynchronizedData = data;\n\t\t\t\t\t\t\t\treturn { result: undefined, next: JSON.stringify(data, null, 2) };\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (synchronizedData) this.data = synchronizedData;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.bumpCredentialVersion(providerId);\n\t\t\t\t\t\tthis.loadError = null;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.recordError(error);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"auth-storage.js","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CredentialStore implementation backed by auth.json.\n * Provider auth orchestration belongs to ModelRuntime and pi-ai Models.\n */\n\nimport type { Credential, CredentialInfo, CredentialStore } from \"@earendil-works/pi-ai\";\nimport { join } from \"path\";\nimport { getAgentConfigPaths, getAgentDir } from \"../config.ts\";\nimport { FileAuthStorageBackend, InMemoryAuthStorageBackend, type AuthStorageBackend } from \"./auth-storage-backends.ts\";\nimport { resolveConfigValue } from \"./resolve-config-value.ts\";\n\nexport { FileAuthStorageBackend, InMemoryAuthStorageBackend, type AuthStorageBackend } from \"./auth-storage-backends.ts\";\n\nexport type AuthStorageData = Record<string, Credential>;\n\n\nexport class AuthStorage implements CredentialStore {\n\tprivate data: AuthStorageData = {};\n\tprivate storage: AuthStorageBackend;\n\n\tprivate constructor(storage: AuthStorageBackend) {\n\t\tthis.storage = storage;\n\t\tthis.reload();\n\t}\n\n\tstatic create(authPath?: string | string[]): AuthStorage {\n\t\tconst paths = authPath === undefined\n\t\t\t? getAgentConfigPaths(\"auth.json\")\n\t\t\t: Array.isArray(authPath) ? authPath : [authPath];\n\t\treturn new AuthStorage(new FileAuthStorageBackend(paths[0] ?? join(getAgentDir(), \"auth.json\"), paths));\n\t}\n\n\tstatic fromStorage(storage: AuthStorageBackend): AuthStorage {\n\t\treturn new AuthStorage(storage);\n\t}\n\n\tstatic inMemory(data: AuthStorageData = {}): AuthStorage {\n\t\tconst storage = new InMemoryAuthStorageBackend();\n\t\tstorage.withLock(() => ({ result: undefined, next: JSON.stringify(data, null, 2) }));\n\t\treturn AuthStorage.fromStorage(storage);\n\t}\n\n\tprivate parseStorageData(content: string | undefined): AuthStorageData {\n\t\tif (!content) {\n\t\t\treturn {};\n\t\t}\n\t\treturn JSON.parse(content) as AuthStorageData;\n\t}\n\n\t/**\n\t * Reload credentials from storage.\n\t */\n\treload(): void {\n\t\ttry {\n\t\t\tlet content: string | undefined;\n\t\t\tif (this.storage.read) {\n\t\t\t\tcontent = this.storage.read();\n\t\t\t} else {\n\t\t\t\tthis.storage.withLock((current) => {\n\t\t\t\t\tcontent = current;\n\t\t\t\t\treturn { result: undefined };\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.data = this.parseStorageData(content);\n\t\t} catch {\n\t\t\t// Preserve the last valid in-memory snapshot.\n\t\t}\n\t}\n\n\tasync read(provider: string): Promise<Credential | undefined> {\n\t\tconst credential = this.data[provider];\n\t\tif (credential?.type !== \"api_key\") return credential;\n\t\tif (credential.key === undefined) return credential;\n\t\treturn { ...credential, key: resolveConfigValue(credential.key, credential.env) };\n\t}\n\n\tasync modify(\n\t\tprovider: string,\n\t\tfn: (current: Credential | undefined) => Promise<Credential | undefined>,\n\t): Promise<Credential | undefined> {\n\t\tlet persistedData: AuthStorageData | undefined;\n\t\tconst result = await this.storage.withLockAsync(async (content) => {\n\t\t\tconst currentData = this.parseStorageData(content);\n\t\t\tconst next = await fn(currentData[provider]);\n\t\t\tif (next === undefined) {\n\t\t\t\tpersistedData = currentData;\n\t\t\t\treturn { result: currentData[provider] };\n\t\t\t}\n\n\t\t\tconst merged: AuthStorageData = { ...currentData, [provider]: next };\n\t\t\tpersistedData = merged;\n\t\t\treturn { result: next, next: JSON.stringify(merged, null, 2) };\n\t\t});\n\t\tif (persistedData) this.data = persistedData;\n\t\treturn result;\n\t}\n\n\tasync delete(provider: string): Promise<void> {\n\t\tif (this.storage.deleteProviderAsync) {\n\t\t\tconst content = await this.storage.deleteProviderAsync(provider);\n\t\t\tthis.data = this.parseStorageData(content);\n\t\t\treturn;\n\t\t}\n\t\tlet persistedData: AuthStorageData | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst currentData = this.parseStorageData(content);\n\t\t\tdelete currentData[provider];\n\t\t\tpersistedData = currentData;\n\t\t\treturn { result: undefined, next: JSON.stringify(currentData, null, 2) };\n\t\t});\n\t\tif (persistedData) this.data = persistedData;\n\t}\n\n\t/** List credential metadata without resolving configured key values. */\n\tasync list(): Promise<readonly CredentialInfo[]> {\n\t\treturn Object.entries(this.data).map(([providerId, credential]) => ({ providerId, type: credential.type }));\n\t}\n\n}\n\n/** Read one persisted provider credential using Atomic's layered auth.json paths. */\nexport function readStoredCredential(providerId: string, authPath?: string | string[]): Credential | undefined {\n\tconst paths = authPath === undefined\n\t\t? getAgentConfigPaths(\"auth.json\")\n\t\t: Array.isArray(authPath) ? authPath : [authPath];\n\tconst storage = new FileAuthStorageBackend(paths[0] ?? join(getAgentDir(), \"auth.json\"), paths);\n\ttry {\n\t\tlet credential: Credential | undefined;\n\t\tstorage.withLock((content) => {\n\t\t\tcredential = content ? (JSON.parse(content) as AuthStorageData)[providerId] : undefined;\n\t\t\treturn { result: undefined };\n\t\t});\n\t\treturn credential;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import type { Provider } from "@earendil-works/pi-ai";
2
+ /**
3
+ * GitHub Copilot host routing for `COPILOT_GITHUB_TOKEN` (PAT) auth.
4
+ *
5
+ * Upstream pi pins `github-copilot` to `https://api.individual.githubcopilot.com`
6
+ * and only derives a per-tenant host inside the OAuth loader, which returns an
7
+ * `auth.baseUrl` from the token's `proxy-ep` segment. `envApiKeyAuth` resolves
8
+ * `COPILOT_GITHUB_TOKEN` without a base URL, so business/enterprise tokens are
9
+ * sent to the individual CAPI host and GitHub answers `421 Misdirected Request`.
10
+ *
11
+ * This module restores the routing precedence for the env-token path only; the
12
+ * OAuth path stays exactly upstream. A `models.json` provider `baseUrl` still
13
+ * wins, because it is applied as a later overlay in `applyModelsJson`.
14
+ */
15
+ export type CopilotRoutingEnv = Readonly<Record<string, string | undefined>>;
16
+ /**
17
+ * Resolve the Copilot API base URL for env-token auth, highest precedence first:
18
+ *
19
+ * 1. `COPILOT_API_TARGET` / `GITHUB_COPILOT_BASE_URL` explicit override
20
+ * 2. the `proxy-ep` segment embedded in `COPILOT_GITHUB_TOKEN`
21
+ * 3. an explicit `enterpriseDomain`
22
+ * 4. `GITHUB_SERVER_URL` (`*.ghe.com` tenant host, else the enterprise host)
23
+ * 5. the public Copilot routing hub when `COPILOT_GITHUB_TOKEN` is set
24
+ *
25
+ * Returns `undefined` when nothing applies, leaving pi's individual-host default.
26
+ */
27
+ export declare function resolveCopilotEnvBaseUrl(env: CopilotRoutingEnv, enterpriseDomain?: string): string | undefined;
28
+ /**
29
+ * Rewrite the builtin Copilot provider's host when `COPILOT_GITHUB_TOKEN` is set.
30
+ *
31
+ * Applied to the builtin layer so a `models.json` `baseUrl` override, which is
32
+ * composed afterwards, still takes precedence. Providers without the env token
33
+ * are returned untouched so OAuth logins keep pi's exact behavior.
34
+ */
35
+ export declare function withCopilotEnvBaseUrl(provider: Provider, env: CopilotRoutingEnv): Provider;
36
+ //# sourceMappingURL=copilot-env-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-env-routing.d.ts","sourceRoot":"","sources":["../../src/core/copilot-env-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAElE;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAyC7E;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,iBAAiB,EACtB,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,GAAG,SAAS,CAoBpB;AASD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,iBAAiB,GAAG,QAAQ,CAU1F"}
@@ -0,0 +1,94 @@
1
+ const COPILOT_PROVIDER_ID = "github-copilot";
2
+ /** Public routing hub: resolves the caller's plan-specific CAPI host server-side. */
3
+ const PUBLIC_COPILOT_HUB = "https://api.githubcopilot.com";
4
+ const ENTERPRISE_COPILOT_HOST = "https://api.enterprise.githubcopilot.com";
5
+ function normalizeBaseUrl(value) {
6
+ const trimmed = value.trim().replace(/\/+$/u, "");
7
+ if (!trimmed)
8
+ return "";
9
+ return /^https?:\/\//u.test(trimmed) ? trimmed : `https://${trimmed}`;
10
+ }
11
+ /** `tid=...;exp=...;proxy-ep=proxy.business.githubcopilot.com;...` -> API host. */
12
+ function baseUrlFromToken(token) {
13
+ const match = token.match(/proxy-ep=([^;]+)/u);
14
+ if (!match?.[1])
15
+ return undefined;
16
+ const host = match[1].trim().replace(/^proxy\./u, "api.");
17
+ return host ? normalizeBaseUrl(host) : undefined;
18
+ }
19
+ function hostFromServerUrl(serverUrl) {
20
+ try {
21
+ return new URL(normalizeBaseUrl(serverUrl)).hostname.toLowerCase() || undefined;
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
26
+ }
27
+ function baseUrlFromServerHost(host) {
28
+ if (host === "github.com" || host.endsWith(".github.com"))
29
+ return undefined;
30
+ // Tenant-scoped GHE.com: octocorp.ghe.com -> copilot-api.octocorp.ghe.com
31
+ if (host.endsWith(".ghe.com")) {
32
+ const tenant = host.slice(0, -".ghe.com".length).split(".").pop();
33
+ return tenant ? `https://copilot-api.${tenant}.ghe.com` : ENTERPRISE_COPILOT_HOST;
34
+ }
35
+ // GitHub Enterprise Server on a self-hosted domain routes through the
36
+ // enterprise CAPI host rather than a per-appliance Copilot endpoint.
37
+ return ENTERPRISE_COPILOT_HOST;
38
+ }
39
+ /**
40
+ * Resolve the Copilot API base URL for env-token auth, highest precedence first:
41
+ *
42
+ * 1. `COPILOT_API_TARGET` / `GITHUB_COPILOT_BASE_URL` explicit override
43
+ * 2. the `proxy-ep` segment embedded in `COPILOT_GITHUB_TOKEN`
44
+ * 3. an explicit `enterpriseDomain`
45
+ * 4. `GITHUB_SERVER_URL` (`*.ghe.com` tenant host, else the enterprise host)
46
+ * 5. the public Copilot routing hub when `COPILOT_GITHUB_TOKEN` is set
47
+ *
48
+ * Returns `undefined` when nothing applies, leaving pi's individual-host default.
49
+ */
50
+ export function resolveCopilotEnvBaseUrl(env, enterpriseDomain) {
51
+ const override = env.COPILOT_API_TARGET?.trim() || env.GITHUB_COPILOT_BASE_URL?.trim();
52
+ if (override)
53
+ return normalizeBaseUrl(override);
54
+ const token = env.COPILOT_GITHUB_TOKEN?.trim();
55
+ if (token) {
56
+ const fromToken = baseUrlFromToken(token);
57
+ if (fromToken)
58
+ return fromToken;
59
+ }
60
+ if (enterpriseDomain?.trim())
61
+ return `https://copilot-api.${enterpriseDomain.trim()}`;
62
+ const serverUrl = env.GITHUB_SERVER_URL?.trim();
63
+ if (serverUrl) {
64
+ const host = hostFromServerUrl(serverUrl);
65
+ const fromServer = host ? baseUrlFromServerHost(host) : undefined;
66
+ if (fromServer)
67
+ return fromServer;
68
+ }
69
+ return token ? PUBLIC_COPILOT_HUB : undefined;
70
+ }
71
+ function withModelBaseUrl(models, baseUrl) {
72
+ return models.map((model) => ({ ...model, baseUrl }));
73
+ }
74
+ /**
75
+ * Rewrite the builtin Copilot provider's host when `COPILOT_GITHUB_TOKEN` is set.
76
+ *
77
+ * Applied to the builtin layer so a `models.json` `baseUrl` override, which is
78
+ * composed afterwards, still takes precedence. Providers without the env token
79
+ * are returned untouched so OAuth logins keep pi's exact behavior.
80
+ */
81
+ export function withCopilotEnvBaseUrl(provider, env) {
82
+ if (provider.id !== COPILOT_PROVIDER_ID || !env.COPILOT_GITHUB_TOKEN?.trim())
83
+ return provider;
84
+ const baseUrl = resolveCopilotEnvBaseUrl(env);
85
+ if (!baseUrl || baseUrl === provider.baseUrl)
86
+ return provider;
87
+ return {
88
+ ...provider,
89
+ baseUrl,
90
+ // Wrap the getter so dynamically refreshed models are routed too.
91
+ getModels: () => withModelBaseUrl(provider.getModels(), baseUrl),
92
+ };
93
+ }
94
+ //# sourceMappingURL=copilot-env-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-env-routing.js","sourceRoot":"","sources":["../../src/core/copilot-env-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, Provider } from \"@earendil-works/pi-ai\";\n\n/**\n * GitHub Copilot host routing for `COPILOT_GITHUB_TOKEN` (PAT) auth.\n *\n * Upstream pi pins `github-copilot` to `https://api.individual.githubcopilot.com`\n * and only derives a per-tenant host inside the OAuth loader, which returns an\n * `auth.baseUrl` from the token's `proxy-ep` segment. `envApiKeyAuth` resolves\n * `COPILOT_GITHUB_TOKEN` without a base URL, so business/enterprise tokens are\n * sent to the individual CAPI host and GitHub answers `421 Misdirected Request`.\n *\n * This module restores the routing precedence for the env-token path only; the\n * OAuth path stays exactly upstream. A `models.json` provider `baseUrl` still\n * wins, because it is applied as a later overlay in `applyModelsJson`.\n */\n\nexport type CopilotRoutingEnv = Readonly<Record<string, string | undefined>>;\n\nconst COPILOT_PROVIDER_ID = \"github-copilot\";\n/** Public routing hub: resolves the caller's plan-specific CAPI host server-side. */\nconst PUBLIC_COPILOT_HUB = \"https://api.githubcopilot.com\";\nconst ENTERPRISE_COPILOT_HOST = \"https://api.enterprise.githubcopilot.com\";\n\nfunction normalizeBaseUrl(value: string): string {\n\tconst trimmed = value.trim().replace(/\\/+$/u, \"\");\n\tif (!trimmed) return \"\";\n\treturn /^https?:\\/\\//u.test(trimmed) ? trimmed : `https://${trimmed}`;\n}\n\n/** `tid=...;exp=...;proxy-ep=proxy.business.githubcopilot.com;...` -> API host. */\nfunction baseUrlFromToken(token: string): string | undefined {\n\tconst match = token.match(/proxy-ep=([^;]+)/u);\n\tif (!match?.[1]) return undefined;\n\tconst host = match[1].trim().replace(/^proxy\\./u, \"api.\");\n\treturn host ? normalizeBaseUrl(host) : undefined;\n}\n\nfunction hostFromServerUrl(serverUrl: string): string | undefined {\n\ttry {\n\t\treturn new URL(normalizeBaseUrl(serverUrl)).hostname.toLowerCase() || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction baseUrlFromServerHost(host: string): string | undefined {\n\tif (host === \"github.com\" || host.endsWith(\".github.com\")) return undefined;\n\t// Tenant-scoped GHE.com: octocorp.ghe.com -> copilot-api.octocorp.ghe.com\n\tif (host.endsWith(\".ghe.com\")) {\n\t\tconst tenant = host.slice(0, -\".ghe.com\".length).split(\".\").pop();\n\t\treturn tenant ? `https://copilot-api.${tenant}.ghe.com` : ENTERPRISE_COPILOT_HOST;\n\t}\n\t// GitHub Enterprise Server on a self-hosted domain routes through the\n\t// enterprise CAPI host rather than a per-appliance Copilot endpoint.\n\treturn ENTERPRISE_COPILOT_HOST;\n}\n\n/**\n * Resolve the Copilot API base URL for env-token auth, highest precedence first:\n *\n * 1. `COPILOT_API_TARGET` / `GITHUB_COPILOT_BASE_URL` explicit override\n * 2. the `proxy-ep` segment embedded in `COPILOT_GITHUB_TOKEN`\n * 3. an explicit `enterpriseDomain`\n * 4. `GITHUB_SERVER_URL` (`*.ghe.com` tenant host, else the enterprise host)\n * 5. the public Copilot routing hub when `COPILOT_GITHUB_TOKEN` is set\n *\n * Returns `undefined` when nothing applies, leaving pi's individual-host default.\n */\nexport function resolveCopilotEnvBaseUrl(\n\tenv: CopilotRoutingEnv,\n\tenterpriseDomain?: string,\n): string | undefined {\n\tconst override = env.COPILOT_API_TARGET?.trim() || env.GITHUB_COPILOT_BASE_URL?.trim();\n\tif (override) return normalizeBaseUrl(override);\n\n\tconst token = env.COPILOT_GITHUB_TOKEN?.trim();\n\tif (token) {\n\t\tconst fromToken = baseUrlFromToken(token);\n\t\tif (fromToken) return fromToken;\n\t}\n\n\tif (enterpriseDomain?.trim()) return `https://copilot-api.${enterpriseDomain.trim()}`;\n\n\tconst serverUrl = env.GITHUB_SERVER_URL?.trim();\n\tif (serverUrl) {\n\t\tconst host = hostFromServerUrl(serverUrl);\n\t\tconst fromServer = host ? baseUrlFromServerHost(host) : undefined;\n\t\tif (fromServer) return fromServer;\n\t}\n\n\treturn token ? PUBLIC_COPILOT_HUB : undefined;\n}\n\nfunction withModelBaseUrl<TApi extends Api>(\n\tmodels: readonly Model<TApi>[],\n\tbaseUrl: string,\n): Model<TApi>[] {\n\treturn models.map((model) => ({ ...model, baseUrl }));\n}\n\n/**\n * Rewrite the builtin Copilot provider's host when `COPILOT_GITHUB_TOKEN` is set.\n *\n * Applied to the builtin layer so a `models.json` `baseUrl` override, which is\n * composed afterwards, still takes precedence. Providers without the env token\n * are returned untouched so OAuth logins keep pi's exact behavior.\n */\nexport function withCopilotEnvBaseUrl(provider: Provider, env: CopilotRoutingEnv): Provider {\n\tif (provider.id !== COPILOT_PROVIDER_ID || !env.COPILOT_GITHUB_TOKEN?.trim()) return provider;\n\tconst baseUrl = resolveCopilotEnvBaseUrl(env);\n\tif (!baseUrl || baseUrl === provider.baseUrl) return provider;\n\treturn {\n\t\t...provider,\n\t\tbaseUrl,\n\t\t// Wrap the getter so dynamically refreshed models are routed too.\n\t\tgetModels: () => withModelBaseUrl(provider.getModels(), baseUrl),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader-virtual-modules.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader-virtual-modules.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,iBAAe,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqCnE;AAoBD;;;;;GAKG;AACH,iBAAS,oBAAoB,IAAI,MAAM,CAMtC;AAqBD,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAOrE;AAiBD;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ5E;AAMD;;;GAGG;AACH,iBAAS,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuD5C;AAED,eAAO,MAAM,wBAAwB;;;;;CAKpC,CAAC;AAUF,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAmCvC"}
1
+ {"version":3,"file":"loader-virtual-modules.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader-virtual-modules.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD,iBAAe,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqCnE;AAoBD;;;;;GAKG;AACH,iBAAS,oBAAoB,IAAI,MAAM,CAMtC;AAqBD,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAOrE;AAiBD;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ5E;AAMD;;;GAGG;AACH,iBAAS,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuD5C;AAED,eAAO,MAAM,wBAAwB;;;;;CAKpC,CAAC;AAUF,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,mBAAmB,GAC/B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA2CvC"}
@@ -22,7 +22,7 @@ async function loadVirtualModules() {
22
22
  // "@earendil-works/pi-ai"`, so we load the compat module here and key it
23
23
  // under the root specifier below to keep every extension working unchanged.
24
24
  import("@earendil-works/pi-ai/compat"),
25
- import("../oauth-compat.js"),
25
+ import("@earendil-works/pi-ai/oauth"),
26
26
  // NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,
27
27
  // avoiding a circular dependency while preserving the package-name extension import path.
28
28
  import("../../index.js"),
@@ -163,8 +163,8 @@ function getAliases() {
163
163
  // upstream layout change moves these files, this join needs updating to
164
164
  // match the package's real dist paths.
165
165
  const piAiEntry = resolveWorkspaceOrImport("ai/dist/compat.js", "@earendil-works/pi-ai");
166
+ const piAiOauthEntry = resolveWorkspaceOrImport("ai/dist/oauth.js", "@earendil-works/pi-ai");
166
167
  const piAiProvidersEntry = resolveWorkspaceOrImport("ai/dist/providers/all.js", "@earendil-works/pi-ai");
167
- const piAiOauthEntry = path.resolve(__dirname, "../oauth-compat.js");
168
168
  _aliases = {
169
169
  "@bastani/atomic": piCodingAgentEntry,
170
170
  "@earendil-works/pi-coding-agent": piCodingAgentEntry,
@@ -217,6 +217,14 @@ export async function loadExtensionModule(extensionPath, cacheToken) {
217
217
  // Windows first-load fast path: native import() (jiti's default tryNative)
218
218
  // skips per-launch transpilation of the extension module graph. Re-loads of
219
219
  // the same path fall back to transformed imports for fresh evaluation.
220
+ //
221
+ // That fallback is not free. Measured on Windows CI, a transformed re-import
222
+ // costs ~15 ms per module file in the extension's transitive graph, so a
223
+ // reload of all five builtin packages (621 files) takes ~10.7 s cold and
224
+ // ~2.5 s against a warm jiti fsCache, against ~40 ms on Linux and macOS. The
225
+ // cost is correctness-driven and is paid interactively on every Windows
226
+ // `/reload`; removing it needs a content-hash-keyed evaluation cache or a
227
+ // narrower trigger, not a larger timeout.
220
228
  const forceTransformedImports = isSingleFileBuild || (isWindows && nativelyImportedPaths.has(extensionPath));
221
229
  const jiti = createJiti(resolutionBaseUrl(import.meta.url), {
222
230
  moduleCache: false,
@@ -1 +1 @@
1
- {"version":3,"file":"loader-virtual-modules.js","sourceRoot":"","sources":["../../../src/core/extensions/loader-virtual-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createJiti } from \"jiti/static\";\nimport { getExtensionTranspileCacheDir, isBunBinary, isBundledBuild } from \"../../config.ts\";\nimport { moduleDirFromMetaUrl } from \"../../utils/split-launcher.ts\";\nimport { resolutionBaseUrl } from \"../../utils/module-require.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport type { ExtensionFactory } from \"./types.ts\";\n\nconst require = createRequire(import.meta.url);\nlet _virtualModules: Record<string, object> | null = null;\nlet _virtualModulesPromise: Promise<Record<string, object>> | null = null;\n\nasync function loadVirtualModules(): Promise<Record<string, object>> {\n const [typebox, typeboxCompile, typeboxValue, piAgentCore, piTui, piAi, piAiOauth, piCodingAgent] = await Promise.all([\n import(\"typebox\"),\n import(\"typebox/compile\"),\n import(\"typebox/value\"),\n import(\"@earendil-works/pi-agent-core\"),\n import(\"@earendil-works/pi-tui\"),\n // pi 0.80.2: the old global pi-ai API moved off the root entrypoint onto\n // `/compat` (a strict superset). Extensions still `import ... from\n // \"@earendil-works/pi-ai\"`, so we load the compat module here and key it\n // under the root specifier below to keep every extension working unchanged.\n import(\"@earendil-works/pi-ai/compat\"),\n import(\"../oauth-compat.ts\"),\n // NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n // avoiding a circular dependency while preserving the package-name extension import path.\n import(\"../../index.ts\"),\n ]);\n\n return {\n typebox,\n \"typebox/compile\": typeboxCompile,\n \"typebox/value\": typeboxValue,\n \"@sinclair/typebox\": typebox,\n \"@sinclair/typebox/compile\": typeboxCompile,\n \"@sinclair/typebox/value\": typeboxValue,\n \"@earendil-works/pi-agent-core\": piAgentCore,\n \"@earendil-works/pi-tui\": piTui,\n \"@earendil-works/pi-ai\": piAi,\n \"@earendil-works/pi-ai/compat\": piAi,\n \"@earendil-works/pi-ai/oauth\": piAiOauth,\n \"@bastani/atomic\": piCodingAgent,\n \"@mariozechner/pi-agent-core\": piAgentCore,\n \"@mariozechner/pi-tui\": piTui,\n \"@mariozechner/pi-ai\": piAi,\n \"@mariozechner/pi-ai/compat\": piAi,\n \"@mariozechner/pi-ai/oauth\": piAiOauth,\n };\n}\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary). */\nasync function getVirtualModules(): Promise<Record<string, object>> {\n if (_virtualModules) return _virtualModules;\n _virtualModulesPromise ??= loadVirtualModules().then(\n (virtualModules) => {\n _virtualModules = virtualModules;\n return virtualModules;\n },\n (error: Error) => {\n _virtualModulesPromise = null;\n throw error;\n },\n );\n return _virtualModulesPromise;\n}\nlet _aliases: Record<string, string> | null = null;\nlet _transpileCacheDir: string | null = null;\n\n/**\n * Persistent on-disk cache for jiti-transpiled extension modules.\n * jiti keys cache entries by source-content hash, so entries self-invalidate\n * when extension sources change; stale sibling version dirs are pruned\n * in the background.\n */\nfunction getTranspileCacheDir(): string {\n if (_transpileCacheDir) return _transpileCacheDir;\n _transpileCacheDir = getExtensionTranspileCacheDir();\n fs.mkdirSync(_transpileCacheDir, { recursive: true });\n pruneStaleTranspileCaches(_transpileCacheDir);\n return _transpileCacheDir;\n}\n\nfunction pruneStaleTranspileCaches(currentDir: string): void {\n const parent = path.dirname(currentDir);\n const keep = path.basename(currentDir);\n void fs.promises\n .readdir(parent)\n .then((entries) =>\n Promise.all(\n entries\n .filter((entry) => entry !== keep)\n .map((entry) => fs.promises.rm(path.join(parent, entry), { recursive: true, force: true })),\n ),\n )\n .catch(() => {});\n}\n\nlet extensionCacheCwd: string | undefined;\nlet extensionCacheGeneration = 0;\nconst extensionCache = new Map<string, ExtensionFactory>();\n\nexport interface ExtensionCacheToken {\n cwd: string;\n generation: number;\n}\n\nexport function clearExtensionCache(): void {\n extensionCache.clear();\n extensionCacheCwd = undefined;\n extensionCacheGeneration++;\n}\n\nexport function useExtensionCacheCwd(cwd: string): ExtensionCacheToken {\n const resolvedCwd = resolvePath(cwd);\n if (extensionCacheCwd !== undefined && extensionCacheCwd !== resolvedCwd) {\n clearExtensionCache();\n }\n extensionCacheCwd = resolvedCwd;\n return { cwd: resolvedCwd, generation: extensionCacheGeneration };\n}\n\nfunction isCurrentCacheToken(cacheToken: ExtensionCacheToken | undefined): cacheToken is ExtensionCacheToken {\n return (\n cacheToken !== undefined &&\n extensionCacheCwd === cacheToken.cwd &&\n extensionCacheGeneration === cacheToken.generation\n );\n}\n\nfunction extensionImportSpecifier(extensionPath: string, cacheToken: ExtensionCacheToken | undefined): string {\n const url = pathToFileURL(extensionPath);\n const cacheKey = cacheToken ? `${cacheToken.generation}:${cacheToken.cwd}` : `${Date.now()}:${Math.random()}`;\n url.searchParams.set(\"atomicExtensionCache\", cacheKey);\n return url.href;\n}\n\n/**\n * Locate an installed package's root directory without consulting its\n * \"exports\" map: require.resolve(\"<pkg>/package.json\") throws\n * ERR_PACKAGE_PATH_NOT_EXPORTED under Node for packages that do not export\n * \"./package.json\" (pi-ai does not), and import.meta.resolve() cannot be\n * used because its mere presence silently disables bytecode generation for\n * the compiled binary (CJS bundle). Scanning require.resolve.paths() walks\n * the same node_modules chain Node would, without exports-map encapsulation.\n */\nfunction findPackageRoot(packageName: string, searchPaths?: string[]): string {\n for (const base of searchPaths ?? require.resolve.paths(packageName) ?? []) {\n const candidate = path.join(base, packageName);\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n return candidate;\n }\n }\n throw new Error(`Cannot locate package directory for \"${packageName}\"`);\n}\nfunction currentModuleDir(): string {\n return moduleDirFromMetaUrl(import.meta.url, \"dist\", \"core\", \"extensions\");\n}\n\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nfunction getAliases(): Record<string, string> {\n if (_aliases) return _aliases;\n\n const __dirname = currentModuleDir();\n const packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n const typeboxEntry = require.resolve(\"typebox\");\n const typeboxCompileEntry = require.resolve(\"typebox/compile\");\n const typeboxValueEntry = require.resolve(\"typebox/value\");\n\n const packagesRoot = path.resolve(__dirname, \"../../../../\");\n const resolveWorkspaceOrImport = (workspaceRelativePath: string, packageName: string): string => {\n const workspacePath = path.join(packagesRoot, workspaceRelativePath);\n if (fs.existsSync(workspacePath)) {\n return workspacePath;\n }\n const packageRoot = findPackageRoot(packageName);\n const entryRelativePath = workspaceRelativePath.split(\"/\").slice(1).join(\"/\");\n return path.join(packageRoot, entryRelativePath);\n };\n\n const piCodingAgentEntry = packageIndex;\n const piAgentCoreEntry = resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@earendil-works/pi-agent-core\");\n const piTuiEntry = resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@earendil-works/pi-tui\");\n // The workspace path mirrors pi-ai 0.80.x's built dist layout. If an\n // upstream layout change moves these files, this join needs updating to\n // match the package's real dist paths.\n const piAiEntry = resolveWorkspaceOrImport(\"ai/dist/compat.js\", \"@earendil-works/pi-ai\");\n const piAiProvidersEntry = resolveWorkspaceOrImport(\"ai/dist/providers/all.js\", \"@earendil-works/pi-ai\");\n const piAiOauthEntry = path.resolve(__dirname, \"../oauth-compat.js\");\n\n _aliases = {\n \"@bastani/atomic\": piCodingAgentEntry,\n \"@earendil-works/pi-coding-agent\": piCodingAgentEntry,\n \"@earendil-works/pi-agent-core\": piAgentCoreEntry,\n \"@earendil-works/pi-tui\": piTuiEntry,\n \"@earendil-works/pi-ai/oauth\": piAiOauthEntry,\n \"@earendil-works/pi-ai/providers/all\": piAiProvidersEntry,\n \"@earendil-works/pi-ai/compat\": piAiEntry,\n \"@earendil-works/pi-ai\": piAiEntry,\n \"@mariozechner/pi-agent-core\": piAgentCoreEntry,\n \"@mariozechner/pi-tui\": piTuiEntry,\n \"@mariozechner/pi-ai/oauth\": piAiOauthEntry,\n \"@mariozechner/pi-ai/providers/all\": piAiProvidersEntry,\n \"@mariozechner/pi-ai/compat\": piAiEntry,\n \"@mariozechner/pi-ai\": piAiEntry,\n typebox: typeboxEntry,\n \"typebox/compile\": typeboxCompileEntry,\n \"typebox/value\": typeboxValueEntry,\n \"@sinclair/typebox\": typeboxEntry,\n \"@sinclair/typebox/compile\": typeboxCompileEntry,\n \"@sinclair/typebox/value\": typeboxValueEntry,\n };\n\n return _aliases;\n}\n\nexport const extensionLoaderTestHooks = {\n loadVirtualModules,\n getAliases,\n findPackageRoot,\n getTranspileCacheDir,\n};\n\n/**\n * Extension paths already evaluated via native import() in this process. Bun on\n * Windows ignores the cache-busting query on file URLs, so re-loads of these\n * paths (e.g. /reload) must go through jiti's transformed-import path to get a\n * fresh module evaluation.\n */\nconst nativelyImportedPaths = new Set<string>();\n\nexport async function loadExtensionModule(\n extensionPath: string,\n cacheToken?: ExtensionCacheToken,\n): Promise<ExtensionFactory | undefined> {\n if (isCurrentCacheToken(cacheToken)) {\n const cachedFactory = extensionCache.get(extensionPath);\n if (cachedFactory) return cachedFactory;\n }\n\n const isWindows = process.platform === \"win32\";\n // Single-file builds (compiled binary or dev bundle) cannot alias host\n // package specifiers to files on disk: extensions must share the live\n // module instances baked into the build, so virtualModules is used instead\n // (which requires jiti's transformed-import path).\n const isSingleFileBuild = isBunBinary || isBundledBuild;\n // Windows first-load fast path: native import() (jiti's default tryNative)\n // skips per-launch transpilation of the extension module graph. Re-loads of\n // the same path fall back to transformed imports for fresh evaluation.\n const forceTransformedImports = isSingleFileBuild || (isWindows && nativelyImportedPaths.has(extensionPath));\n const jiti = createJiti(resolutionBaseUrl(import.meta.url), {\n moduleCache: false,\n ...(forceTransformedImports\n ? { fsCache: getTranspileCacheDir(), tryNative: false }\n : isWindows\n ? { fsCache: getTranspileCacheDir() }\n : {}),\n ...(isSingleFileBuild ? { virtualModules: await getVirtualModules() } : { alias: getAliases() }),\n });\n const module = await jiti.import(extensionImportSpecifier(extensionPath, cacheToken), { default: true });\n if (isWindows && !forceTransformedImports) {\n nativelyImportedPaths.add(extensionPath);\n }\n const factory = module as ExtensionFactory;\n if (typeof factory !== \"function\") return undefined;\n if (isCurrentCacheToken(cacheToken)) {\n extensionCache.set(extensionPath, factory);\n }\n return factory;\n}\n"]}
1
+ {"version":3,"file":"loader-virtual-modules.js","sourceRoot":"","sources":["../../../src/core/extensions/loader-virtual-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createJiti } from \"jiti/static\";\nimport { getExtensionTranspileCacheDir, isBunBinary, isBundledBuild } from \"../../config.ts\";\nimport { moduleDirFromMetaUrl } from \"../../utils/split-launcher.ts\";\nimport { resolutionBaseUrl } from \"../../utils/module-require.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport type { ExtensionFactory } from \"./types.ts\";\n\nconst require = createRequire(import.meta.url);\nlet _virtualModules: Record<string, object> | null = null;\nlet _virtualModulesPromise: Promise<Record<string, object>> | null = null;\n\nasync function loadVirtualModules(): Promise<Record<string, object>> {\n const [typebox, typeboxCompile, typeboxValue, piAgentCore, piTui, piAi, piAiOauth, piCodingAgent] = await Promise.all([\n import(\"typebox\"),\n import(\"typebox/compile\"),\n import(\"typebox/value\"),\n import(\"@earendil-works/pi-agent-core\"),\n import(\"@earendil-works/pi-tui\"),\n // pi 0.80.2: the old global pi-ai API moved off the root entrypoint onto\n // `/compat` (a strict superset). Extensions still `import ... from\n // \"@earendil-works/pi-ai\"`, so we load the compat module here and key it\n // under the root specifier below to keep every extension working unchanged.\n import(\"@earendil-works/pi-ai/compat\"),\n import(\"@earendil-works/pi-ai/oauth\"),\n // NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n // avoiding a circular dependency while preserving the package-name extension import path.\n import(\"../../index.ts\"),\n ]);\n\n return {\n typebox,\n \"typebox/compile\": typeboxCompile,\n \"typebox/value\": typeboxValue,\n \"@sinclair/typebox\": typebox,\n \"@sinclair/typebox/compile\": typeboxCompile,\n \"@sinclair/typebox/value\": typeboxValue,\n \"@earendil-works/pi-agent-core\": piAgentCore,\n \"@earendil-works/pi-tui\": piTui,\n \"@earendil-works/pi-ai\": piAi,\n \"@earendil-works/pi-ai/compat\": piAi,\n \"@earendil-works/pi-ai/oauth\": piAiOauth,\n \"@bastani/atomic\": piCodingAgent,\n \"@mariozechner/pi-agent-core\": piAgentCore,\n \"@mariozechner/pi-tui\": piTui,\n \"@mariozechner/pi-ai\": piAi,\n \"@mariozechner/pi-ai/compat\": piAi,\n \"@mariozechner/pi-ai/oauth\": piAiOauth,\n };\n}\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary). */\nasync function getVirtualModules(): Promise<Record<string, object>> {\n if (_virtualModules) return _virtualModules;\n _virtualModulesPromise ??= loadVirtualModules().then(\n (virtualModules) => {\n _virtualModules = virtualModules;\n return virtualModules;\n },\n (error: Error) => {\n _virtualModulesPromise = null;\n throw error;\n },\n );\n return _virtualModulesPromise;\n}\nlet _aliases: Record<string, string> | null = null;\nlet _transpileCacheDir: string | null = null;\n\n/**\n * Persistent on-disk cache for jiti-transpiled extension modules.\n * jiti keys cache entries by source-content hash, so entries self-invalidate\n * when extension sources change; stale sibling version dirs are pruned\n * in the background.\n */\nfunction getTranspileCacheDir(): string {\n if (_transpileCacheDir) return _transpileCacheDir;\n _transpileCacheDir = getExtensionTranspileCacheDir();\n fs.mkdirSync(_transpileCacheDir, { recursive: true });\n pruneStaleTranspileCaches(_transpileCacheDir);\n return _transpileCacheDir;\n}\n\nfunction pruneStaleTranspileCaches(currentDir: string): void {\n const parent = path.dirname(currentDir);\n const keep = path.basename(currentDir);\n void fs.promises\n .readdir(parent)\n .then((entries) =>\n Promise.all(\n entries\n .filter((entry) => entry !== keep)\n .map((entry) => fs.promises.rm(path.join(parent, entry), { recursive: true, force: true })),\n ),\n )\n .catch(() => {});\n}\n\nlet extensionCacheCwd: string | undefined;\nlet extensionCacheGeneration = 0;\nconst extensionCache = new Map<string, ExtensionFactory>();\n\nexport interface ExtensionCacheToken {\n cwd: string;\n generation: number;\n}\n\nexport function clearExtensionCache(): void {\n extensionCache.clear();\n extensionCacheCwd = undefined;\n extensionCacheGeneration++;\n}\n\nexport function useExtensionCacheCwd(cwd: string): ExtensionCacheToken {\n const resolvedCwd = resolvePath(cwd);\n if (extensionCacheCwd !== undefined && extensionCacheCwd !== resolvedCwd) {\n clearExtensionCache();\n }\n extensionCacheCwd = resolvedCwd;\n return { cwd: resolvedCwd, generation: extensionCacheGeneration };\n}\n\nfunction isCurrentCacheToken(cacheToken: ExtensionCacheToken | undefined): cacheToken is ExtensionCacheToken {\n return (\n cacheToken !== undefined &&\n extensionCacheCwd === cacheToken.cwd &&\n extensionCacheGeneration === cacheToken.generation\n );\n}\n\nfunction extensionImportSpecifier(extensionPath: string, cacheToken: ExtensionCacheToken | undefined): string {\n const url = pathToFileURL(extensionPath);\n const cacheKey = cacheToken ? `${cacheToken.generation}:${cacheToken.cwd}` : `${Date.now()}:${Math.random()}`;\n url.searchParams.set(\"atomicExtensionCache\", cacheKey);\n return url.href;\n}\n\n/**\n * Locate an installed package's root directory without consulting its\n * \"exports\" map: require.resolve(\"<pkg>/package.json\") throws\n * ERR_PACKAGE_PATH_NOT_EXPORTED under Node for packages that do not export\n * \"./package.json\" (pi-ai does not), and import.meta.resolve() cannot be\n * used because its mere presence silently disables bytecode generation for\n * the compiled binary (CJS bundle). Scanning require.resolve.paths() walks\n * the same node_modules chain Node would, without exports-map encapsulation.\n */\nfunction findPackageRoot(packageName: string, searchPaths?: string[]): string {\n for (const base of searchPaths ?? require.resolve.paths(packageName) ?? []) {\n const candidate = path.join(base, packageName);\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n return candidate;\n }\n }\n throw new Error(`Cannot locate package directory for \"${packageName}\"`);\n}\nfunction currentModuleDir(): string {\n return moduleDirFromMetaUrl(import.meta.url, \"dist\", \"core\", \"extensions\");\n}\n\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nfunction getAliases(): Record<string, string> {\n if (_aliases) return _aliases;\n\n const __dirname = currentModuleDir();\n const packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n const typeboxEntry = require.resolve(\"typebox\");\n const typeboxCompileEntry = require.resolve(\"typebox/compile\");\n const typeboxValueEntry = require.resolve(\"typebox/value\");\n\n const packagesRoot = path.resolve(__dirname, \"../../../../\");\n const resolveWorkspaceOrImport = (workspaceRelativePath: string, packageName: string): string => {\n const workspacePath = path.join(packagesRoot, workspaceRelativePath);\n if (fs.existsSync(workspacePath)) {\n return workspacePath;\n }\n const packageRoot = findPackageRoot(packageName);\n const entryRelativePath = workspaceRelativePath.split(\"/\").slice(1).join(\"/\");\n return path.join(packageRoot, entryRelativePath);\n };\n\n const piCodingAgentEntry = packageIndex;\n const piAgentCoreEntry = resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@earendil-works/pi-agent-core\");\n const piTuiEntry = resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@earendil-works/pi-tui\");\n // The workspace path mirrors pi-ai 0.80.x's built dist layout. If an\n // upstream layout change moves these files, this join needs updating to\n // match the package's real dist paths.\n const piAiEntry = resolveWorkspaceOrImport(\"ai/dist/compat.js\", \"@earendil-works/pi-ai\");\n const piAiOauthEntry = resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@earendil-works/pi-ai\");\n const piAiProvidersEntry = resolveWorkspaceOrImport(\"ai/dist/providers/all.js\", \"@earendil-works/pi-ai\");\n\n _aliases = {\n \"@bastani/atomic\": piCodingAgentEntry,\n \"@earendil-works/pi-coding-agent\": piCodingAgentEntry,\n \"@earendil-works/pi-agent-core\": piAgentCoreEntry,\n \"@earendil-works/pi-tui\": piTuiEntry,\n \"@earendil-works/pi-ai/oauth\": piAiOauthEntry,\n \"@earendil-works/pi-ai/providers/all\": piAiProvidersEntry,\n \"@earendil-works/pi-ai/compat\": piAiEntry,\n \"@earendil-works/pi-ai\": piAiEntry,\n \"@mariozechner/pi-agent-core\": piAgentCoreEntry,\n \"@mariozechner/pi-tui\": piTuiEntry,\n \"@mariozechner/pi-ai/oauth\": piAiOauthEntry,\n \"@mariozechner/pi-ai/providers/all\": piAiProvidersEntry,\n \"@mariozechner/pi-ai/compat\": piAiEntry,\n \"@mariozechner/pi-ai\": piAiEntry,\n typebox: typeboxEntry,\n \"typebox/compile\": typeboxCompileEntry,\n \"typebox/value\": typeboxValueEntry,\n \"@sinclair/typebox\": typeboxEntry,\n \"@sinclair/typebox/compile\": typeboxCompileEntry,\n \"@sinclair/typebox/value\": typeboxValueEntry,\n };\n\n return _aliases;\n}\n\nexport const extensionLoaderTestHooks = {\n loadVirtualModules,\n getAliases,\n findPackageRoot,\n getTranspileCacheDir,\n};\n\n/**\n * Extension paths already evaluated via native import() in this process. Bun on\n * Windows ignores the cache-busting query on file URLs, so re-loads of these\n * paths (e.g. /reload) must go through jiti's transformed-import path to get a\n * fresh module evaluation.\n */\nconst nativelyImportedPaths = new Set<string>();\n\nexport async function loadExtensionModule(\n extensionPath: string,\n cacheToken?: ExtensionCacheToken,\n): Promise<ExtensionFactory | undefined> {\n if (isCurrentCacheToken(cacheToken)) {\n const cachedFactory = extensionCache.get(extensionPath);\n if (cachedFactory) return cachedFactory;\n }\n\n const isWindows = process.platform === \"win32\";\n // Single-file builds (compiled binary or dev bundle) cannot alias host\n // package specifiers to files on disk: extensions must share the live\n // module instances baked into the build, so virtualModules is used instead\n // (which requires jiti's transformed-import path).\n const isSingleFileBuild = isBunBinary || isBundledBuild;\n // Windows first-load fast path: native import() (jiti's default tryNative)\n // skips per-launch transpilation of the extension module graph. Re-loads of\n // the same path fall back to transformed imports for fresh evaluation.\n //\n // That fallback is not free. Measured on Windows CI, a transformed re-import\n // costs ~15 ms per module file in the extension's transitive graph, so a\n // reload of all five builtin packages (621 files) takes ~10.7 s cold and\n // ~2.5 s against a warm jiti fsCache, against ~40 ms on Linux and macOS. The\n // cost is correctness-driven and is paid interactively on every Windows\n // `/reload`; removing it needs a content-hash-keyed evaluation cache or a\n // narrower trigger, not a larger timeout.\n const forceTransformedImports = isSingleFileBuild || (isWindows && nativelyImportedPaths.has(extensionPath));\n const jiti = createJiti(resolutionBaseUrl(import.meta.url), {\n moduleCache: false,\n ...(forceTransformedImports\n ? { fsCache: getTranspileCacheDir(), tryNative: false }\n : isWindows\n ? { fsCache: getTranspileCacheDir() }\n : {}),\n ...(isSingleFileBuild ? { virtualModules: await getVirtualModules() } : { alias: getAliases() }),\n });\n const module = await jiti.import(extensionImportSpecifier(extensionPath, cacheToken), { default: true });\n if (isWindows && !forceTransformedImports) {\n nativelyImportedPaths.add(extensionPath);\n }\n const factory = module as ExtensionFactory;\n if (typeof factory !== \"function\") return undefined;\n if (isCurrentCacheToken(cacheToken)) {\n extensionCache.set(extensionPath, factory);\n }\n return factory;\n}\n"]}
@@ -3,42 +3,6 @@ import type { RefreshModelsContext } from "@earendil-works/pi-ai";
3
3
  import type { ExtensionAPI } from "./api-types.ts";
4
4
  import type { AtomicProviderCompat } from "../model-capabilities.ts";
5
5
  export type { AtomicProviderCompat } from "../model-capabilities.ts";
6
- export interface ApiKeyAuthPrompt {
7
- type: "text" | "secret";
8
- message: string;
9
- placeholder?: string;
10
- }
11
- export interface ApiKeyAuthInteraction {
12
- prompt(prompt: ApiKeyAuthPrompt): Promise<string>;
13
- signal: AbortSignal;
14
- }
15
- export interface ProviderApiKeyAuthContext {
16
- env(name: string): Promise<string | undefined>;
17
- }
18
- export interface ProviderApiKeyAuthResult {
19
- auth: {
20
- apiKey?: string;
21
- baseUrl?: string;
22
- headers?: Record<string, string>;
23
- };
24
- env?: Record<string, string>;
25
- source?: string;
26
- }
27
- export interface ProviderApiKeyAuth {
28
- name: string;
29
- login(interaction: ApiKeyAuthInteraction): Promise<import("../auth-storage.ts").ApiKeyCredential>;
30
- check?(input: {
31
- ctx: ProviderApiKeyAuthContext;
32
- credential?: import("../auth-storage.ts").ApiKeyCredential;
33
- }): Promise<{
34
- type: "api_key";
35
- source?: string;
36
- } | undefined>;
37
- resolve?(input: {
38
- ctx: ProviderApiKeyAuthContext;
39
- credential?: import("../auth-storage.ts").ApiKeyCredential;
40
- }): Promise<ProviderApiKeyAuthResult | undefined>;
41
- }
42
6
  /** Configuration for registering a provider via pi.registerProvider(). */
43
7
  export interface ProviderConfig {
44
8
  /** Display name for the provider in UI. */
@@ -59,10 +23,6 @@ export interface ProviderConfig {
59
23
  models?: ProviderModelConfig[];
60
24
  /** Refresh this provider's catalog. Successful results replace its extension-provided models. */
61
25
  refreshModels?(context: RefreshModelsContext): Promise<ProviderModelConfig[]>;
62
- /** Optional provider-directed API-key authentication flow. */
63
- auth?: {
64
- apiKey?: ProviderApiKeyAuth;
65
- };
66
26
  /** OAuth provider for /login support. The `id` is set automatically from the provider name. */
67
27
  oauth?: {
68
28
  /** Display name for the provider in login UI. */
@@ -1 +1 @@
1
- {"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,GAAG,EACH,2BAA2B,EAC3B,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,YAAY,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC9B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,qDAAqD;IACrD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,2BAA2B,CAAC;IACnH,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,iGAAiG;IACjG,aAAa,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9E,+FAA+F;IAC/F,KAAK,CAAC,EAAE;QACP,iDAAiD;QACjD,IAAI,EAAE,MAAM,CAAC;QACb,8CAA8C;QAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mEAAmE;QACnE,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,yDAAyD;QACzD,KAAK,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACjE,0EAA0E;QAC1E,YAAY,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvE,8DAA8D;QAC9D,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CAAC;QACjD,6FAA6F;QAC7F,YAAY,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;KACjF,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IACnC,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClD,6BAA6B;IAC7B,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACzB,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qFAAqF;IACrF,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC9B;AAED,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1E,0FAA0F;AAC1F,MAAM,MAAM,eAAe,GACxB,gBAAgB,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-types.js","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n\tApi,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tSimpleStreamOptions,\n} from \"@earendil-works/pi-ai/compat\";\nimport type { RefreshModelsContext } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"./api-types.ts\";\nimport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\nexport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\n\nexport interface ApiKeyAuthPrompt {\n\ttype: \"text\" | \"secret\";\n\tmessage: string;\n\tplaceholder?: string;\n}\n\nexport interface ApiKeyAuthInteraction {\n\tprompt(prompt: ApiKeyAuthPrompt): Promise<string>;\n\tsignal: AbortSignal;\n}\n\nexport interface ProviderApiKeyAuthContext {\n\tenv(name: string): Promise<string | undefined>;\n}\n\nexport interface ProviderApiKeyAuthResult {\n\tauth: { apiKey?: string; baseUrl?: string; headers?: Record<string, string> };\n\tenv?: Record<string, string>;\n\tsource?: string;\n}\n\nexport interface ProviderApiKeyAuth {\n\tname: string;\n\tlogin(interaction: ApiKeyAuthInteraction): Promise<import(\"../auth-storage.ts\").ApiKeyCredential>;\n\tcheck?(input: { ctx: ProviderApiKeyAuthContext; credential?: import(\"../auth-storage.ts\").ApiKeyCredential }): Promise<{ type: \"api_key\"; source?: string } | undefined>;\n\tresolve?(input: { ctx: ProviderApiKeyAuthContext; credential?: import(\"../auth-storage.ts\").ApiKeyCredential }): Promise<ProviderApiKeyAuthResult | undefined>;\n}\n/** Configuration for registering a provider via pi.registerProvider(). */\nexport interface ProviderConfig {\n\t/** Display name for the provider in UI. */\n\tname?: string;\n\t/** Base URL for the API endpoint. Required when defining models. */\n\tbaseUrl?: string;\n\t/** API key or environment variable name. Required when defining models (unless oauth provided). */\n\tapiKey?: string;\n\t/** API type. Required at provider or model level when defining models. */\n\tapi?: Api;\n\t/** Optional streamSimple handler for custom APIs. */\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\t/** Custom headers to include in requests. */\n\theaders?: Record<string, string>;\n\t/** If true, adds Authorization: Bearer header with the resolved API key. */\n\tauthHeader?: boolean;\n\t/** Models to register. If provided, replaces all existing models for this provider. */\n\tmodels?: ProviderModelConfig[];\n\t/** Refresh this provider's catalog. Successful results replace its extension-provided models. */\n\trefreshModels?(context: RefreshModelsContext): Promise<ProviderModelConfig[]>;\n\t/** Optional provider-directed API-key authentication flow. */\n\tauth?: { apiKey?: ProviderApiKeyAuth };\n\t/** OAuth provider for /login support. The `id` is set automatically from the provider name. */\n\toauth?: {\n\t\t/** Display name for the provider in login UI. */\n\t\tname: string;\n\t\t/** Optional provider-specific login label. */\n\t\tloginLabel?: string;\n\t\t/** Whether the flow accepts a browser callback/manual redirect. */\n\t\tusesCallbackServer?: boolean;\n\t\t/** Run the login flow, return credentials to persist. */\n\t\tlogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;\n\t\t/** Refresh expired credentials, return updated credentials to persist. */\n\t\trefreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;\n\t\t/** Convert credentials to API key string for the provider. */\n\t\tgetApiKey(credentials: OAuthCredentials): string;\n\t\t/** Optional: modify models for this provider (e.g., update baseUrl based on credentials). */\n\t\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n\t};\n}\n\n/** Configuration for a model within a provider. */\nexport interface ProviderModelConfig {\n\t/** Model ID (e.g., \"claude-sonnet-4-20250514\"). */\n\tid: string;\n\t/** Display name (e.g., \"Claude 4 Sonnet\"). */\n\tname: string;\n\t/** API type override for this model. */\n\tapi?: Api;\n\t/** API endpoint URL override for this model. */\n\tbaseUrl?: string;\n\t/** Whether the model supports extended thinking. */\n\treasoning: boolean;\n\t/** Maps pi thinking levels to provider/model-specific values; null marks a level unsupported. */\n\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t/** Supported input types. */\n\tinput: (\"text\" | \"image\")[];\n\t/** Request pricing, including optional request-wide long-context tiers. */\n\tcost: Model<Api>[\"cost\"];\n\t/** Default/effective context window size in tokens. */\n\tcontextWindow: number;\n\t/** Maximum output tokens. */\n\tmaxTokens: number;\n\t/** Custom headers for this model. */\n\theaders?: Record<string, string>;\n\t/** Provider capability settings, including Atomic's `supportsGrammarTools` alias. */\n\tcompat?: AtomicProviderCompat;\n}\n\n/** Extension factory function type. Supports both sync and async initialization. */\nexport type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;\n\n/** Inline extension factory, optionally carrying a stable name and display visibility. */\nexport type InlineExtension =\n\t| ExtensionFactory\n\t| { name: string; factory: ExtensionFactory; hidden?: boolean; bundled?: boolean };\n"]}
1
+ {"version":3,"file":"provider-types.js","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n\tApi,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tSimpleStreamOptions,\n} from \"@earendil-works/pi-ai/compat\";\nimport type { RefreshModelsContext } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"./api-types.ts\";\nimport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\nexport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\n\n/** Configuration for registering a provider via pi.registerProvider(). */\nexport interface ProviderConfig {\n\t/** Display name for the provider in UI. */\n\tname?: string;\n\t/** Base URL for the API endpoint. Required when defining models. */\n\tbaseUrl?: string;\n\t/** API key or environment variable name. Required when defining models (unless oauth provided). */\n\tapiKey?: string;\n\t/** API type. Required at provider or model level when defining models. */\n\tapi?: Api;\n\t/** Optional streamSimple handler for custom APIs. */\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\t/** Custom headers to include in requests. */\n\theaders?: Record<string, string>;\n\t/** If true, adds Authorization: Bearer header with the resolved API key. */\n\tauthHeader?: boolean;\n\t/** Models to register. If provided, replaces all existing models for this provider. */\n\tmodels?: ProviderModelConfig[];\n\t/** Refresh this provider's catalog. Successful results replace its extension-provided models. */\n\trefreshModels?(context: RefreshModelsContext): Promise<ProviderModelConfig[]>;\n\t/** OAuth provider for /login support. The `id` is set automatically from the provider name. */\n\toauth?: {\n\t\t/** Display name for the provider in login UI. */\n\t\tname: string;\n\t\t/** Optional provider-specific login label. */\n\t\tloginLabel?: string;\n\t\t/** Whether the flow accepts a browser callback/manual redirect. */\n\t\tusesCallbackServer?: boolean;\n\t\t/** Run the login flow, return credentials to persist. */\n\t\tlogin(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;\n\t\t/** Refresh expired credentials, return updated credentials to persist. */\n\t\trefreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;\n\t\t/** Convert credentials to API key string for the provider. */\n\t\tgetApiKey(credentials: OAuthCredentials): string;\n\t\t/** Optional: modify models for this provider (e.g., update baseUrl based on credentials). */\n\t\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n\t};\n}\n\n/** Configuration for a model within a provider. */\nexport interface ProviderModelConfig {\n\t/** Model ID (e.g., \"claude-sonnet-4-20250514\"). */\n\tid: string;\n\t/** Display name (e.g., \"Claude 4 Sonnet\"). */\n\tname: string;\n\t/** API type override for this model. */\n\tapi?: Api;\n\t/** API endpoint URL override for this model. */\n\tbaseUrl?: string;\n\t/** Whether the model supports extended thinking. */\n\treasoning: boolean;\n\t/** Maps pi thinking levels to provider/model-specific values; null marks a level unsupported. */\n\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t/** Supported input types. */\n\tinput: (\"text\" | \"image\")[];\n\t/** Request pricing, including optional request-wide long-context tiers. */\n\tcost: Model<Api>[\"cost\"];\n\t/** Default/effective context window size in tokens. */\n\tcontextWindow: number;\n\t/** Maximum output tokens. */\n\tmaxTokens: number;\n\t/** Custom headers for this model. */\n\theaders?: Record<string, string>;\n\t/** Provider capability settings, including Atomic's `supportsGrammarTools` alias. */\n\tcompat?: AtomicProviderCompat;\n}\n\n/** Extension factory function type. Supports both sync and async initialization. */\nexport type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;\n\n/** Inline extension factory, optionally carrying a stable name and display visibility. */\nexport type InlineExtension =\n\t| ExtensionFactory\n\t| { name: string; factory: ExtensionFactory; hidden?: boolean; bundled?: boolean };\n"]}
@@ -8,11 +8,11 @@
8
8
  */
9
9
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
10
10
  import type { Api, Model } from "@earendil-works/pi-ai/compat";
11
- /** Minimal registry surface needed to resolve a configured fallback entry. */
11
+ /** Minimal runtime surface needed to resolve a configured fallback entry. */
12
12
  export interface FallbackModelLookup {
13
- getAvailable(): Model<Api>[];
14
- find(provider: string, modelId: string): Model<Api> | undefined;
15
- hasConfiguredAuth(model: Model<Api>): boolean;
13
+ getAvailableSnapshot(): readonly Model<Api>[];
14
+ getModel(provider: string, modelId: string): Model<Api> | undefined;
15
+ hasConfiguredAuth(provider: string): boolean;
16
16
  }
17
17
  /** A configured fallback entry resolved to a concrete model. */
18
18
  export interface FallbackModelCandidate {
@@ -1 +1 @@
1
- {"version":3,"file":"fallback-models.d.ts","sourceRoot":"","sources":["../../src/core/fallback-models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAK/D,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IACnC,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAChE,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;CAC9C;AAED,gEAAgE;AAChE,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAOpG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,EAAE,MAAM,GAAG,SAAS,GACnC,sBAAsB,GAAG,SAAS,CAapC;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAE/F"}
1
+ {"version":3,"file":"fallback-models.d.ts","sourceRoot":"","sources":["../../src/core/fallback-models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAK/D,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IACnC,oBAAoB,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACpE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7C;AAED,gEAAgE;AAChE,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAA;CAAE,CAOpG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,EAAE,MAAM,GAAG,SAAS,GACnC,sBAAsB,GAAG,SAAS,CAapC;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAE/F"}
@@ -29,15 +29,15 @@ export function splitFallbackModel(value) {
29
29
  export function resolveFallbackModel(value, lookup, preferredProvider) {
30
30
  const parsed = splitFallbackModel(value);
31
31
  if (!parsed.modelId.includes("/")) {
32
- const available = lookup.getAvailable().filter((model) => model.id === parsed.modelId);
32
+ const available = lookup.getAvailableSnapshot().filter((model) => model.id === parsed.modelId);
33
33
  const model = available.find((candidate) => candidate.provider === preferredProvider) ?? (available.length === 1 ? available[0] : undefined);
34
34
  return model ? { model, thinkingLevel: parsed.thinkingLevel } : undefined;
35
35
  }
36
36
  const slash = parsed.modelId.indexOf("/");
37
37
  const provider = parsed.modelId.slice(0, slash);
38
38
  const modelId = parsed.modelId.slice(slash + 1);
39
- const model = lookup.find(provider, modelId);
40
- if (!model || !lookup.hasConfiguredAuth(model))
39
+ const model = lookup.getModel(provider, modelId);
40
+ if (!model || !lookup.hasConfiguredAuth(model.provider))
41
41
  return undefined;
42
42
  return { model, thinkingLevel: parsed.thinkingLevel };
43
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fallback-models.js","sourceRoot":"","sources":["../../src/core/fallback-models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAA6C,CAAC;AAClI,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAe5E,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAClE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,MAAuB,EAAE,CAAC;AACrF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAAa,EACb,MAA2B,EAC3B,iBAAqC;IAErC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7I,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;AACvD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,aAAwC;IACtF,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;AAC/D,CAAC","sourcesContent":["/**\n * Shared resolution of `settings.fallbackModels` entries.\n *\n * These helpers were module-private to `agent-session-retry.ts`. They are\n * extracted (not copied) so compaction planner borrowing resolves candidates\n * with exactly the same semantics as main-chat model fallback, without reusing\n * `_trySwitchToFallbackModel`, which is main-chat turn machinery.\n */\n\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\n\nconst THINKING_SUFFIXES = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const satisfies readonly ThinkingLevel[];\nconst THINKING_SUFFIX_SET: ReadonlySet<string> = new Set(THINKING_SUFFIXES);\n\n/** Minimal registry surface needed to resolve a configured fallback entry. */\nexport interface FallbackModelLookup {\n\tgetAvailable(): Model<Api>[];\n\tfind(provider: string, modelId: string): Model<Api> | undefined;\n\thasConfiguredAuth(model: Model<Api>): boolean;\n}\n\n/** A configured fallback entry resolved to a concrete model. */\nexport interface FallbackModelCandidate {\n\tmodel: Model<Api>;\n\tthinkingLevel?: ThinkingLevel;\n}\n\n/** Split a `provider/model[:thinkingLevel]` entry into its model id and optional level. */\nexport function splitFallbackModel(value: string): { modelId: string; thinkingLevel?: ThinkingLevel } {\n\tconst trimmed = value.trim();\n\tconst index = trimmed.lastIndexOf(\":\");\n\tif (index < 0) return { modelId: trimmed };\n\tconst suffix = trimmed.slice(index + 1);\n\tif (!THINKING_SUFFIX_SET.has(suffix)) return { modelId: trimmed };\n\treturn { modelId: trimmed.slice(0, index), thinkingLevel: suffix as ThinkingLevel };\n}\n\n/**\n * Resolve one configured fallback entry against the model registry.\n *\n * Unqualified ids search the available (authenticated) models and prefer the\n * current/default provider when ambiguous; qualified ids require configured\n * auth. Unusable candidates resolve to `undefined`.\n */\nexport function resolveFallbackModel(\n\tvalue: string,\n\tlookup: FallbackModelLookup,\n\tpreferredProvider: string | undefined,\n): FallbackModelCandidate | undefined {\n\tconst parsed = splitFallbackModel(value);\n\tif (!parsed.modelId.includes(\"/\")) {\n\t\tconst available = lookup.getAvailable().filter((model) => model.id === parsed.modelId);\n\t\tconst model = available.find((candidate) => candidate.provider === preferredProvider) ?? (available.length === 1 ? available[0] : undefined);\n\t\treturn model ? { model, thinkingLevel: parsed.thinkingLevel } : undefined;\n\t}\n\tconst slash = parsed.modelId.indexOf(\"/\");\n\tconst provider = parsed.modelId.slice(0, slash);\n\tconst modelId = parsed.modelId.slice(slash + 1);\n\tconst model = lookup.find(provider, modelId);\n\tif (!model || !lookup.hasConfiguredAuth(model)) return undefined;\n\treturn { model, thinkingLevel: parsed.thinkingLevel };\n}\n\n/** Stable `provider/model:level` identity for one attempted fallback candidate. */\nexport function fallbackKey(model: Model<Api>, thinkingLevel: ThinkingLevel | undefined): string {\n\treturn `${model.provider}/${model.id}:${thinkingLevel ?? \"\"}`;\n}\n"]}
1
+ {"version":3,"file":"fallback-models.js","sourceRoot":"","sources":["../../src/core/fallback-models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAA6C,CAAC;AAClI,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAe5E,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAClE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,MAAuB,EAAE,CAAC;AACrF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAAa,EACb,MAA2B,EAC3B,iBAAqC;IAErC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7I,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;AACvD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,aAAwC;IACtF,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;AAC/D,CAAC","sourcesContent":["/**\n * Shared resolution of `settings.fallbackModels` entries.\n *\n * These helpers were module-private to `agent-session-retry.ts`. They are\n * extracted (not copied) so compaction planner borrowing resolves candidates\n * with exactly the same semantics as main-chat model fallback, without reusing\n * `_trySwitchToFallbackModel`, which is main-chat turn machinery.\n */\n\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\n\nconst THINKING_SUFFIXES = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const satisfies readonly ThinkingLevel[];\nconst THINKING_SUFFIX_SET: ReadonlySet<string> = new Set(THINKING_SUFFIXES);\n\n/** Minimal runtime surface needed to resolve a configured fallback entry. */\nexport interface FallbackModelLookup {\n\tgetAvailableSnapshot(): readonly Model<Api>[];\n\tgetModel(provider: string, modelId: string): Model<Api> | undefined;\n\thasConfiguredAuth(provider: string): boolean;\n}\n\n/** A configured fallback entry resolved to a concrete model. */\nexport interface FallbackModelCandidate {\n\tmodel: Model<Api>;\n\tthinkingLevel?: ThinkingLevel;\n}\n\n/** Split a `provider/model[:thinkingLevel]` entry into its model id and optional level. */\nexport function splitFallbackModel(value: string): { modelId: string; thinkingLevel?: ThinkingLevel } {\n\tconst trimmed = value.trim();\n\tconst index = trimmed.lastIndexOf(\":\");\n\tif (index < 0) return { modelId: trimmed };\n\tconst suffix = trimmed.slice(index + 1);\n\tif (!THINKING_SUFFIX_SET.has(suffix)) return { modelId: trimmed };\n\treturn { modelId: trimmed.slice(0, index), thinkingLevel: suffix as ThinkingLevel };\n}\n\n/**\n * Resolve one configured fallback entry against the model registry.\n *\n * Unqualified ids search the available (authenticated) models and prefer the\n * current/default provider when ambiguous; qualified ids require configured\n * auth. Unusable candidates resolve to `undefined`.\n */\nexport function resolveFallbackModel(\n\tvalue: string,\n\tlookup: FallbackModelLookup,\n\tpreferredProvider: string | undefined,\n): FallbackModelCandidate | undefined {\n\tconst parsed = splitFallbackModel(value);\n\tif (!parsed.modelId.includes(\"/\")) {\n\t\tconst available = lookup.getAvailableSnapshot().filter((model) => model.id === parsed.modelId);\n\t\tconst model = available.find((candidate) => candidate.provider === preferredProvider) ?? (available.length === 1 ? available[0] : undefined);\n\t\treturn model ? { model, thinkingLevel: parsed.thinkingLevel } : undefined;\n\t}\n\tconst slash = parsed.modelId.indexOf(\"/\");\n\tconst provider = parsed.modelId.slice(0, slash);\n\tconst modelId = parsed.modelId.slice(slash + 1);\n\tconst model = lookup.getModel(provider, modelId);\n\tif (!model || !lookup.hasConfiguredAuth(model.provider)) return undefined;\n\treturn { model, thinkingLevel: parsed.thinkingLevel };\n}\n\n/** Stable `provider/model:level` identity for one attempted fallback candidate. */\nexport function fallbackKey(model: Model<Api>, thinkingLevel: ThinkingLevel | undefined): string {\n\treturn `${model.provider}/${model.id}:${thinkingLevel ?? \"\"}`;\n}\n"]}