@bastani/atomic 0.9.14 → 0.9.15

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 (525) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +1 -1
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/CHANGELOG.md +14 -0
  5. package/dist/builtin/mcp/package.json +4 -4
  6. package/dist/builtin/mcp/sampling-handler.ts +2 -2
  7. package/dist/builtin/mcp/types.ts +1 -1
  8. package/dist/builtin/subagents/CHANGELOG.md +40 -0
  9. package/dist/builtin/subagents/README.md +5 -22
  10. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  11. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  12. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  13. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  14. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  15. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  16. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  17. package/dist/builtin/subagents/agents/worker.md +2 -2
  18. package/dist/builtin/subagents/package.json +4 -4
  19. package/dist/builtin/subagents/skills/subagent/SKILL.md +6 -6
  20. package/dist/builtin/subagents/src/agents/agent-loaders.ts +0 -4
  21. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +1 -12
  22. package/dist/builtin/subagents/src/agents/agent-management.ts +0 -1
  23. package/dist/builtin/subagents/src/agents/agent-serializer.ts +7 -6
  24. package/dist/builtin/subagents/src/agents/agent-types.ts +0 -1
  25. package/dist/builtin/subagents/src/extension/schemas.ts +2 -2
  26. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +2 -2
  27. package/dist/builtin/subagents/src/intercom/result-intercom.ts +0 -127
  28. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +1 -3
  29. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +15 -106
  30. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +0 -3
  31. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +2 -13
  32. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +2 -12
  33. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +1 -20
  34. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +0 -6
  35. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +10 -21
  36. package/dist/builtin/subagents/src/runs/inprocess/attempt-handles.ts +104 -0
  37. package/dist/builtin/subagents/src/runs/inprocess/index.ts +10 -21
  38. package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +2 -3
  39. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +11 -32
  40. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/temp-cleanup.ts +69 -0
  41. package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
  42. package/dist/builtin/subagents/src/shared/types-config.ts +0 -4
  43. package/dist/builtin/subagents/src/shared/types-depth.ts +15 -103
  44. package/dist/builtin/subagents/src/shared/types-foreground-state.ts +56 -0
  45. package/dist/builtin/subagents/src/shared/types-results.ts +1 -59
  46. package/dist/builtin/subagents/src/shared/types-runtime.ts +0 -2
  47. package/dist/builtin/subagents/src/shared/types.ts +1 -1
  48. package/dist/builtin/subagents/src/shared/utils.ts +1 -1
  49. package/dist/builtin/subagents/src/slash/slash-live-state.ts +1 -1
  50. package/dist/builtin/web-access/package.json +2 -2
  51. package/dist/builtin/web-access/summary-review.ts +2 -2
  52. package/dist/builtin/web-access/web-search-summary.ts +2 -2
  53. package/dist/builtin/workflows/CHANGELOG.md +30 -0
  54. package/dist/builtin/workflows/README.md +2 -2
  55. package/dist/builtin/workflows/package.json +2 -2
  56. package/dist/builtin/workflows/src/extension/index.bundle.mjs +60473 -401
  57. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  58. package/dist/builtin/workflows/src/extension/wiring.ts +1 -1
  59. package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +48 -4
  60. package/dist/builtin/workflows/src/extension/workflow-tool.ts +1 -1
  61. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +5 -0
  62. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +35 -2
  63. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +1 -1
  64. package/dist/builtin/workflows/src/runs/foreground/stage-runner-pause.ts +6 -0
  65. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +15 -13
  66. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +25 -2
  67. package/dist/bun/cli.js +1 -1
  68. package/dist/bun/cli.js.map +1 -1
  69. package/dist/bun/register-bedrock.js +2 -2
  70. package/dist/bun/register-bedrock.js.map +1 -1
  71. package/dist/cli/auth-check.d.ts +1 -1
  72. package/dist/cli/auth-check.d.ts.map +1 -1
  73. package/dist/cli/auth-check.js +1 -1
  74. package/dist/cli/auth-check.js.map +1 -1
  75. package/dist/cli/credential-print.d.ts +1 -1
  76. package/dist/cli/credential-print.d.ts.map +1 -1
  77. package/dist/cli/credential-print.js +2 -2
  78. package/dist/cli/credential-print.js.map +1 -1
  79. package/dist/cli/file-processor.d.ts +1 -1
  80. package/dist/cli/file-processor.d.ts.map +1 -1
  81. package/dist/cli/file-processor.js.map +1 -1
  82. package/dist/cli/initial-message.d.ts +1 -1
  83. package/dist/cli/initial-message.d.ts.map +1 -1
  84. package/dist/cli/initial-message.js.map +1 -1
  85. package/dist/cli/list-models.js.map +1 -1
  86. package/dist/core/agent-session-auto-compaction.d.ts +1 -1
  87. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  88. package/dist/core/agent-session-auto-compaction.js +1 -1
  89. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  90. package/dist/core/agent-session-events.d.ts +1 -1
  91. package/dist/core/agent-session-events.d.ts.map +1 -1
  92. package/dist/core/agent-session-events.js +1 -1
  93. package/dist/core/agent-session-events.js.map +1 -1
  94. package/dist/core/agent-session-export.js.map +1 -1
  95. package/dist/core/agent-session-extension-bindings.js +1 -1
  96. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  97. package/dist/core/agent-session-message-queue.d.ts +1 -1
  98. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  99. package/dist/core/agent-session-message-queue.js.map +1 -1
  100. package/dist/core/agent-session-methods.d.ts +2 -2
  101. package/dist/core/agent-session-methods.d.ts.map +1 -1
  102. package/dist/core/agent-session-methods.js.map +1 -1
  103. package/dist/core/agent-session-models.d.ts +2 -2
  104. package/dist/core/agent-session-models.d.ts.map +1 -1
  105. package/dist/core/agent-session-models.js +2 -2
  106. package/dist/core/agent-session-models.js.map +1 -1
  107. package/dist/core/agent-session-prompt.d.ts +1 -1
  108. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  109. package/dist/core/agent-session-prompt.js.map +1 -1
  110. package/dist/core/agent-session-retry.d.ts +1 -1
  111. package/dist/core/agent-session-retry.d.ts.map +1 -1
  112. package/dist/core/agent-session-retry.js +1 -1
  113. package/dist/core/agent-session-retry.js.map +1 -1
  114. package/dist/core/agent-session-runtime-auth.js +1 -1
  115. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  116. package/dist/core/agent-session-runtime.d.ts +1 -1
  117. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  118. package/dist/core/agent-session-runtime.js +1 -1
  119. package/dist/core/agent-session-runtime.js.map +1 -1
  120. package/dist/core/agent-session-services.d.ts +1 -1
  121. package/dist/core/agent-session-services.d.ts.map +1 -1
  122. package/dist/core/agent-session-services.js.map +1 -1
  123. package/dist/core/agent-session-state.d.ts +1 -1
  124. package/dist/core/agent-session-state.d.ts.map +1 -1
  125. package/dist/core/agent-session-state.js.map +1 -1
  126. package/dist/core/agent-session-tree.js.map +1 -1
  127. package/dist/core/agent-session-types.d.ts +1 -1
  128. package/dist/core/agent-session-types.d.ts.map +1 -1
  129. package/dist/core/agent-session-types.js.map +1 -1
  130. package/dist/core/agent-session.d.ts +1 -1
  131. package/dist/core/agent-session.d.ts.map +1 -1
  132. package/dist/core/agent-session.js.map +1 -1
  133. package/dist/core/anthropic-thinking-guard.d.ts +1 -1
  134. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  135. package/dist/core/anthropic-thinking-guard.js +1 -1
  136. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  137. package/dist/core/auth-storage.d.ts +1 -1
  138. package/dist/core/auth-storage.d.ts.map +1 -1
  139. package/dist/core/auth-storage.js.map +1 -1
  140. package/dist/core/cache-stats.d.ts +1 -1
  141. package/dist/core/cache-stats.d.ts.map +1 -1
  142. package/dist/core/cache-stats.js.map +1 -1
  143. package/dist/core/cloudflare-gateway-binding.d.ts +1 -1
  144. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -1
  145. package/dist/core/cloudflare-gateway-binding.js +1 -1
  146. package/dist/core/cloudflare-gateway-binding.js.map +1 -1
  147. package/dist/core/codex-fast-mode.d.ts +2 -2
  148. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  149. package/dist/core/codex-fast-mode.js +3 -2
  150. package/dist/core/codex-fast-mode.js.map +1 -1
  151. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  152. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  153. package/dist/core/compaction/branch-summarization.js +2 -2
  154. package/dist/core/compaction/branch-summarization.js.map +1 -1
  155. package/dist/core/compaction/compaction-runner.d.ts +2 -2
  156. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  157. package/dist/core/compaction/compaction-runner.js.map +1 -1
  158. package/dist/core/compaction/compaction-types.d.ts +2 -2
  159. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  160. package/dist/core/compaction/compaction-types.js.map +1 -1
  161. package/dist/core/compaction/compaction.d.ts +1 -1
  162. package/dist/core/compaction/compaction.d.ts.map +1 -1
  163. package/dist/core/compaction/compaction.js.map +1 -1
  164. package/dist/core/compaction/fallback-planner.d.ts +1 -1
  165. package/dist/core/compaction/fallback-planner.d.ts.map +1 -1
  166. package/dist/core/compaction/fallback-planner.js.map +1 -1
  167. package/dist/core/compaction/planner-outcome.d.ts +1 -1
  168. package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
  169. package/dist/core/compaction/planner-outcome.js +1 -1
  170. package/dist/core/compaction/planner-outcome.js.map +1 -1
  171. package/dist/core/compaction/range-planner-diagnostics.d.ts +1 -1
  172. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
  173. package/dist/core/compaction/range-planner-diagnostics.js +1 -1
  174. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
  175. package/dist/core/compaction/range-planner.d.ts +2 -2
  176. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  177. package/dist/core/compaction/range-planner.js +2 -2
  178. package/dist/core/compaction/range-planner.js.map +1 -1
  179. package/dist/core/compaction/session-summarization.d.ts +2 -2
  180. package/dist/core/compaction/session-summarization.d.ts.map +1 -1
  181. package/dist/core/compaction/session-summarization.js +2 -2
  182. package/dist/core/compaction/session-summarization.js.map +1 -1
  183. package/dist/core/compaction/transcript-serialization.d.ts +1 -1
  184. package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
  185. package/dist/core/compaction/transcript-serialization.js.map +1 -1
  186. package/dist/core/compaction/utils.d.ts +1 -1
  187. package/dist/core/compaction/utils.d.ts.map +1 -1
  188. package/dist/core/compaction/utils.js.map +1 -1
  189. package/dist/core/experimental.d.ts +1 -1
  190. package/dist/core/experimental.d.ts.map +1 -1
  191. package/dist/core/experimental.js.map +1 -1
  192. package/dist/core/export-html/tool-renderer.js.map +1 -1
  193. package/dist/core/extensions/agent-events.d.ts +2 -2
  194. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  195. package/dist/core/extensions/agent-events.js.map +1 -1
  196. package/dist/core/extensions/api-types.d.ts +2 -2
  197. package/dist/core/extensions/api-types.d.ts.map +1 -1
  198. package/dist/core/extensions/api-types.js.map +1 -1
  199. package/dist/core/extensions/context-types.d.ts +1 -7
  200. package/dist/core/extensions/context-types.d.ts.map +1 -1
  201. package/dist/core/extensions/context-types.js.map +1 -1
  202. package/dist/core/extensions/event-results.d.ts +1 -1
  203. package/dist/core/extensions/event-results.d.ts.map +1 -1
  204. package/dist/core/extensions/event-results.js.map +1 -1
  205. package/dist/core/extensions/index.d.ts +1 -1
  206. package/dist/core/extensions/index.d.ts.map +1 -1
  207. package/dist/core/extensions/index.js.map +1 -1
  208. package/dist/core/extensions/loader-api.js.map +1 -1
  209. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  210. package/dist/core/extensions/loader-virtual-modules.js +21 -9
  211. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  212. package/dist/core/extensions/provider-types.d.ts +2 -2
  213. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  214. package/dist/core/extensions/provider-types.js.map +1 -1
  215. package/dist/core/extensions/reactive-widget.d.ts +6 -0
  216. package/dist/core/extensions/reactive-widget.d.ts.map +1 -1
  217. package/dist/core/extensions/reactive-widget.js +62 -6
  218. package/dist/core/extensions/reactive-widget.js.map +1 -1
  219. package/dist/core/extensions/runner-context.d.ts +1 -1
  220. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  221. package/dist/core/extensions/runner-context.js.map +1 -1
  222. package/dist/core/extensions/runner-events.d.ts +1 -1
  223. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  224. package/dist/core/extensions/runner-events.js.map +1 -1
  225. package/dist/core/extensions/runner.d.ts +2 -2
  226. package/dist/core/extensions/runner.d.ts.map +1 -1
  227. package/dist/core/extensions/runner.js.map +1 -1
  228. package/dist/core/extensions/runtime-types.d.ts +2 -2
  229. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  230. package/dist/core/extensions/runtime-types.js.map +1 -1
  231. package/dist/core/extensions/tool-events.d.ts +1 -1
  232. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  233. package/dist/core/extensions/tool-events.js.map +1 -1
  234. package/dist/core/extensions/tool-types.d.ts +2 -2
  235. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  236. package/dist/core/extensions/tool-types.js.map +1 -1
  237. package/dist/core/extensions/ui-types.d.ts +2 -0
  238. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  239. package/dist/core/extensions/ui-types.js.map +1 -1
  240. package/dist/core/fallback-models.d.ts +1 -1
  241. package/dist/core/fallback-models.d.ts.map +1 -1
  242. package/dist/core/fallback-models.js.map +1 -1
  243. package/dist/core/http-dispatcher.d.ts.map +1 -1
  244. package/dist/core/http-dispatcher.js +14 -0
  245. package/dist/core/http-dispatcher.js.map +1 -1
  246. package/dist/core/messages.d.ts +1 -1
  247. package/dist/core/messages.d.ts.map +1 -1
  248. package/dist/core/messages.js.map +1 -1
  249. package/dist/core/model-capabilities.d.ts +1 -1
  250. package/dist/core/model-capabilities.d.ts.map +1 -1
  251. package/dist/core/model-capabilities.js.map +1 -1
  252. package/dist/core/model-fallback-failures.d.ts.map +1 -1
  253. package/dist/core/model-fallback-failures.js +18 -1
  254. package/dist/core/model-fallback-failures.js.map +1 -1
  255. package/dist/core/model-registry.d.ts +1 -1
  256. package/dist/core/model-registry.d.ts.map +1 -1
  257. package/dist/core/model-registry.js.map +1 -1
  258. package/dist/core/model-resolver-cli.js.map +1 -1
  259. package/dist/core/model-resolver-defaults.d.ts +1 -1
  260. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  261. package/dist/core/model-resolver-defaults.js +1 -1
  262. package/dist/core/model-resolver-defaults.js.map +1 -1
  263. package/dist/core/model-resolver-initial.d.ts +1 -1
  264. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  265. package/dist/core/model-resolver-initial.js.map +1 -1
  266. package/dist/core/model-resolver-patterns.d.ts +1 -1
  267. package/dist/core/model-resolver-patterns.d.ts.map +1 -1
  268. package/dist/core/model-resolver-patterns.js.map +1 -1
  269. package/dist/core/model-resolver-scope.d.ts +1 -1
  270. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  271. package/dist/core/model-resolver-scope.js +1 -1
  272. package/dist/core/model-resolver-scope.js.map +1 -1
  273. package/dist/core/model-resolver-types.d.ts +1 -1
  274. package/dist/core/model-resolver-types.d.ts.map +1 -1
  275. package/dist/core/model-resolver-types.js.map +1 -1
  276. package/dist/core/model-runtime-auth.d.ts +1 -1
  277. package/dist/core/model-runtime-auth.d.ts.map +1 -1
  278. package/dist/core/model-runtime-auth.js.map +1 -1
  279. package/dist/core/model-runtime-providers.d.ts +2 -2
  280. package/dist/core/model-runtime-providers.d.ts.map +1 -1
  281. package/dist/core/model-runtime-providers.js +2 -2
  282. package/dist/core/model-runtime-providers.js.map +1 -1
  283. package/dist/core/model-runtime-restoration.d.ts +1 -1
  284. package/dist/core/model-runtime-restoration.d.ts.map +1 -1
  285. package/dist/core/model-runtime-restoration.js.map +1 -1
  286. package/dist/core/model-runtime-snapshot.d.ts +1 -1
  287. package/dist/core/model-runtime-snapshot.d.ts.map +1 -1
  288. package/dist/core/model-runtime-snapshot.js.map +1 -1
  289. package/dist/core/model-runtime-streaming.d.ts +1 -1
  290. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  291. package/dist/core/model-runtime-streaming.js +1 -1
  292. package/dist/core/model-runtime-streaming.js.map +1 -1
  293. package/dist/core/model-runtime-types.d.ts +1 -1
  294. package/dist/core/model-runtime-types.d.ts.map +1 -1
  295. package/dist/core/model-runtime-types.js.map +1 -1
  296. package/dist/core/model-runtime.d.ts +8 -1
  297. package/dist/core/model-runtime.d.ts.map +1 -1
  298. package/dist/core/model-runtime.js +15 -3
  299. package/dist/core/model-runtime.js.map +1 -1
  300. package/dist/core/models-store.d.ts +1 -1
  301. package/dist/core/models-store.d.ts.map +1 -1
  302. package/dist/core/models-store.js.map +1 -1
  303. package/dist/core/oauth-login.d.ts +1 -1
  304. package/dist/core/oauth-login.d.ts.map +1 -1
  305. package/dist/core/oauth-login.js.map +1 -1
  306. package/dist/core/oauth-provider-metadata.d.ts +1 -1
  307. package/dist/core/oauth-provider-metadata.d.ts.map +1 -1
  308. package/dist/core/oauth-provider-metadata.js.map +1 -1
  309. package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -1
  310. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
  311. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  312. package/dist/core/provider-attribution.d.ts +1 -1
  313. package/dist/core/provider-attribution.d.ts.map +1 -1
  314. package/dist/core/provider-attribution.js.map +1 -1
  315. package/dist/core/provider-composer-internal.d.ts +1 -1
  316. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  317. package/dist/core/provider-composer-internal.js.map +1 -1
  318. package/dist/core/provider-composer.d.ts +1 -1
  319. package/dist/core/provider-composer.d.ts.map +1 -1
  320. package/dist/core/provider-composer.js +2 -2
  321. package/dist/core/provider-composer.js.map +1 -1
  322. package/dist/core/provider-context-usage.d.ts.map +1 -1
  323. package/dist/core/provider-context-usage.js.map +1 -1
  324. package/dist/core/remote-catalog-provider.d.ts +1 -1
  325. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  326. package/dist/core/remote-catalog-provider.js.map +1 -1
  327. package/dist/core/runtime-credentials.d.ts +1 -1
  328. package/dist/core/runtime-credentials.d.ts.map +1 -1
  329. package/dist/core/runtime-credentials.js.map +1 -1
  330. package/dist/core/sdk-types.d.ts +1 -1
  331. package/dist/core/sdk-types.d.ts.map +1 -1
  332. package/dist/core/sdk-types.js.map +1 -1
  333. package/dist/core/sdk.d.ts +1 -1
  334. package/dist/core/sdk.d.ts.map +1 -1
  335. package/dist/core/sdk.js +30 -6
  336. package/dist/core/sdk.js.map +1 -1
  337. package/dist/core/session-manager-core.d.ts +2 -2
  338. package/dist/core/session-manager-core.d.ts.map +1 -1
  339. package/dist/core/session-manager-core.js.map +1 -1
  340. package/dist/core/session-manager-entries.d.ts +1 -1
  341. package/dist/core/session-manager-entries.d.ts.map +1 -1
  342. package/dist/core/session-manager-entries.js.map +1 -1
  343. package/dist/core/session-manager-list.js.map +1 -1
  344. package/dist/core/session-manager-types.d.ts +1 -1
  345. package/dist/core/session-manager-types.d.ts.map +1 -1
  346. package/dist/core/session-manager-types.js.map +1 -1
  347. package/dist/core/session-manager-validation.js +1 -1
  348. package/dist/core/session-manager-validation.js.map +1 -1
  349. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  350. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  351. package/dist/core/settings-manager-basic-accessors.js +11 -0
  352. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  353. package/dist/core/settings-types.d.ts +2 -1
  354. package/dist/core/settings-types.d.ts.map +1 -1
  355. package/dist/core/settings-types.js.map +1 -1
  356. package/dist/core/summarization-retry.d.ts +1 -1
  357. package/dist/core/summarization-retry.d.ts.map +1 -1
  358. package/dist/core/summarization-retry.js.map +1 -1
  359. package/dist/core/tools/bash-session-environment.d.ts +1 -1
  360. package/dist/core/tools/bash-session-environment.d.ts.map +1 -1
  361. package/dist/core/tools/bash-session-environment.js.map +1 -1
  362. package/dist/core/tools/oversized-tool-result.d.ts +1 -1
  363. package/dist/core/tools/oversized-tool-result.d.ts.map +1 -1
  364. package/dist/core/tools/oversized-tool-result.js.map +1 -1
  365. package/dist/core/tools/read-url.d.ts +1 -1
  366. package/dist/core/tools/read-url.d.ts.map +1 -1
  367. package/dist/core/tools/read-url.js.map +1 -1
  368. package/dist/core/tools/read.d.ts.map +1 -1
  369. package/dist/core/tools/read.js.map +1 -1
  370. package/dist/core/tools/render-utils.d.ts +1 -1
  371. package/dist/core/tools/render-utils.d.ts.map +1 -1
  372. package/dist/core/tools/render-utils.js.map +1 -1
  373. package/dist/core/tools/resource-selectors.d.ts +1 -1
  374. package/dist/core/tools/resource-selectors.d.ts.map +1 -1
  375. package/dist/core/tools/resource-selectors.js +2 -7
  376. package/dist/core/tools/resource-selectors.js.map +1 -1
  377. package/dist/core/typebox-compat.js +1 -1
  378. package/dist/core/typebox-compat.js.map +1 -1
  379. package/dist/core/usage-totals.d.ts +1 -1
  380. package/dist/core/usage-totals.d.ts.map +1 -1
  381. package/dist/core/usage-totals.js.map +1 -1
  382. package/dist/extensions/llama/provider.d.ts +1 -1
  383. package/dist/extensions/llama/provider.d.ts.map +1 -1
  384. package/dist/extensions/llama/provider.js +1 -1
  385. package/dist/extensions/llama/provider.js.map +1 -1
  386. package/dist/main-app-mode.d.ts +1 -1
  387. package/dist/main-app-mode.d.ts.map +1 -1
  388. package/dist/main-app-mode.js.map +1 -1
  389. package/dist/main-session-options.js +1 -1
  390. package/dist/main-session-options.js.map +1 -1
  391. package/dist/modes/interactive/components/assistant-message.d.ts +1 -1
  392. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  393. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  394. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -1
  395. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  396. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  397. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  398. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  399. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  401. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  402. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  403. package/dist/modes/interactive/components/model-selector.js +1 -1
  404. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  405. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -1
  406. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  407. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  408. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  409. package/dist/modes/interactive/components/settings-selector-types.d.ts +1 -1
  410. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  411. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  412. package/dist/modes/interactive/interactive-auth-routing.js +1 -1
  413. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  414. package/dist/modes/interactive/interactive-deferred-startup.js +1 -1
  415. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  416. package/dist/modes/interactive/interactive-extension-context.js +26 -0
  417. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  418. package/dist/modes/interactive/interactive-extension-runtime.js +7 -2
  419. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  420. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  421. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  422. package/dist/modes/interactive/interactive-mode-base.js +1 -0
  423. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  424. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  425. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  426. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  427. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  428. package/dist/modes/interactive/interactive-mode-helpers.js +1 -1
  429. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  430. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -0
  431. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  432. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  433. package/dist/modes/interactive/model-catalog-refresh.d.ts +1 -1
  434. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
  435. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  436. package/dist/modes/interactive/streaming-assistant-message.d.ts +1 -1
  437. package/dist/modes/interactive/streaming-assistant-message.d.ts.map +1 -1
  438. package/dist/modes/interactive/streaming-assistant-message.js.map +1 -1
  439. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +3 -0
  440. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  441. package/dist/modes/interactive-engine/engine-custom-ui.js +26 -3
  442. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  443. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  444. package/dist/modes/interactive-engine/remote-component.d.ts +2 -1
  445. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  446. package/dist/modes/interactive-engine/remote-component.js +14 -0
  447. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  448. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  449. package/dist/modes/json-event.d.ts +1 -1
  450. package/dist/modes/json-event.d.ts.map +1 -1
  451. package/dist/modes/json-event.js.map +1 -1
  452. package/dist/modes/print-mode.d.ts +1 -1
  453. package/dist/modes/print-mode.d.ts.map +1 -1
  454. package/dist/modes/print-mode.js.map +1 -1
  455. package/dist/modes/rpc/rpc-client-api.d.ts +2 -2
  456. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  457. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  458. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  459. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  460. package/dist/modes/rpc/rpc-client.js.map +1 -1
  461. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  462. package/dist/modes/rpc/rpc-extension-ui.js +4 -1
  463. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  464. package/dist/modes/rpc/rpc-provider-auth.d.ts +1 -1
  465. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  466. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  467. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  468. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  469. package/dist/modes/rpc/rpc-types.js.map +1 -1
  470. package/dist/utils/tool-result-images.d.ts +1 -1
  471. package/dist/utils/tool-result-images.d.ts.map +1 -1
  472. package/dist/utils/tool-result-images.js.map +1 -1
  473. package/docs/custom-provider.md +11 -8
  474. package/docs/development.md +0 -2
  475. package/docs/extensions.md +2 -2
  476. package/docs/json.md +1 -1
  477. package/docs/models/artificial-analysis-index.md +2 -2
  478. package/docs/models/model-selection.md +8 -8
  479. package/docs/models/pareto-efficiency.md +10 -10
  480. package/docs/models.md +9 -3
  481. package/docs/packages.md +1 -1
  482. package/docs/providers.md +5 -3
  483. package/docs/quickstart.md +1 -1
  484. package/docs/rpc.md +1 -1
  485. package/docs/sdk.md +2 -2
  486. package/docs/session-format.md +2 -2
  487. package/docs/settings.md +2 -1
  488. package/docs/subagents.md +5 -6
  489. package/docs/tui.md +3 -0
  490. package/docs/workflows.md +3 -1
  491. package/examples/extensions/README.md +1 -1
  492. package/examples/extensions/custom-footer.ts +1 -1
  493. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  494. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  495. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  496. package/examples/extensions/handoff.ts +2 -2
  497. package/examples/extensions/hello.ts +1 -1
  498. package/examples/extensions/plan-mode/index.ts +1 -1
  499. package/examples/extensions/preset.ts +1 -1
  500. package/examples/extensions/qna.ts +1 -1
  501. package/examples/extensions/subagent/display.ts +1 -1
  502. package/examples/extensions/subagent/runner.ts +1 -1
  503. package/examples/extensions/subagent/types.ts +1 -1
  504. package/examples/extensions/summarize.ts +2 -2
  505. package/examples/extensions/tool-override.ts +1 -1
  506. package/examples/sdk/02-custom-model.ts +1 -1
  507. package/examples/sdk/12-full-control.ts +1 -1
  508. package/examples/sdk/README.md +1 -1
  509. package/npm-shrinkwrap.json +54 -31
  510. package/package.json +3 -3
  511. package/dist/builtin/subagents/src/extension/fanout-child.ts +0 -259
  512. package/dist/builtin/subagents/src/runs/inprocess/nested-routing.ts +0 -218
  513. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +0 -55
  514. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +0 -178
  515. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +0 -187
  516. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-paths.ts +0 -57
  517. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +0 -42
  518. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +0 -352
  519. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +0 -136
  520. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +0 -252
  521. package/dist/builtin/subagents/src/shared/types-nested.ts +0 -127
  522. package/dist/core/copilot-env-routing.d.ts +0 -36
  523. package/dist/core/copilot-env-routing.d.ts.map +0 -1
  524. package/dist/core/copilot-env-routing.js +0 -94
  525. package/dist/core/copilot-env-routing.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-provider-metadata.d.ts","sourceRoot":"","sources":["../../src/core/oauth-provider-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAkBlE,wBAAgB,4BAA4B,CAC3C,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAClD,qBAAqB,EAAE,CAiBzB"}
1
+ {"version":3,"file":"oauth-provider-metadata.d.ts","sourceRoot":"","sources":["../../src/core/oauth-provider-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAkBlE,wBAAgB,4BAA4B,CAC3C,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAClD,qBAAqB,EAAE,CAiBzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-provider-metadata.js","sourceRoot":"","sources":["../../src/core/oauth-provider-metadata.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;AAEvF,MAAM,UAAU,4BAA4B,CAC3C,SAA8B,EAC9B,UAAoD;IAEpD,OAAO,SAAS;SACd,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;SACzC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjB,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QAC1D,MAAM,UAAU,GAAG,cAAc,EAAE,UAAU,IAAI,aAAa,EAAE,UAAU,CAAC;QAC3E,MAAM,yBAAyB,GAC9B,cAAc,EAAE,kBAAkB,KAAK,SAAS,IAAI,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChG,MAAM,kBAAkB,GAAG,cAAc,EAAE,kBAAkB,IAAI,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5G,OAAO;YACN,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE;YAClC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Provider } from \"@earendil-works/pi-ai\";\nimport type { OAuthProviderMetadata } from \"./oauth-login.ts\";\nimport type { ProviderConfigInput } from \"./provider-composer.ts\";\n\n/**\n * Providers whose login races a loopback callback server against a pasted code.\n *\n * `usesCallbackServer` is what makes the terminal offer that paste input. The\n * flow needs it: the interactive host answers pi-ai's `manual_code` prompt with\n * a promise that only `showManualInput` ever resolves, so a provider missing\n * from this set issues the prompt into a input that is never shown and waits\n * for the callback until it times out.\n *\n * OpenRouter belongs here as of pi 0.83.0, which added the manual redirect-URL\n * fallback to its OAuth flow (upstream `61da9e2`, pi#7114) — its\n * `loginOpenRouter` now races `waitForCredential()` against a `manual_code`\n * prompt exactly as Anthropic and Codex do.\n */\nconst CALLBACK_SERVER_PROVIDERS = new Set([\"anthropic\", \"openai-codex\", \"openrouter\"]);\n\nexport function collectOAuthProviderMetadata(\n\tproviders: readonly Provider[],\n\textensions: ReadonlyMap<string, ProviderConfigInput>,\n): OAuthProviderMetadata[] {\n\treturn providers\n\t\t.filter((provider) => provider.auth.oauth)\n\t\t.map((provider) => {\n\t\t\tconst providerOAuth = provider.auth.oauth;\n\t\t\tconst extensionOAuth = extensions.get(provider.id)?.oauth;\n\t\t\tconst loginLabel = extensionOAuth?.loginLabel ?? providerOAuth?.loginLabel;\n\t\t\tconst hasCallbackServerMetadata =\n\t\t\t\textensionOAuth?.usesCallbackServer !== undefined || CALLBACK_SERVER_PROVIDERS.has(provider.id);\n\t\t\tconst usesCallbackServer = extensionOAuth?.usesCallbackServer ?? CALLBACK_SERVER_PROVIDERS.has(provider.id);\n\t\t\treturn {\n\t\t\t\tid: provider.id,\n\t\t\t\tname: provider.name ?? provider.id,\n\t\t\t\t...(loginLabel ? { loginLabel } : {}),\n\t\t\t\t...(hasCallbackServerMetadata ? { usesCallbackServer } : {}),\n\t\t\t};\n\t\t});\n}\n"]}
1
+ {"version":3,"file":"oauth-provider-metadata.js","sourceRoot":"","sources":["../../src/core/oauth-provider-metadata.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;AAEvF,MAAM,UAAU,4BAA4B,CAC3C,SAA8B,EAC9B,UAAoD;IAEpD,OAAO,SAAS;SACd,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;SACzC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjB,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QAC1D,MAAM,UAAU,GAAG,cAAc,EAAE,UAAU,IAAI,aAAa,EAAE,UAAU,CAAC;QAC3E,MAAM,yBAAyB,GAC9B,cAAc,EAAE,kBAAkB,KAAK,SAAS,IAAI,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChG,MAAM,kBAAkB,GAAG,cAAc,EAAE,kBAAkB,IAAI,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5G,OAAO;YACN,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE;YAClC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Provider } from \"@bastani/pi-ai\";\nimport type { OAuthProviderMetadata } from \"./oauth-login.ts\";\nimport type { ProviderConfigInput } from \"./provider-composer.ts\";\n\n/**\n * Providers whose login races a loopback callback server against a pasted code.\n *\n * `usesCallbackServer` is what makes the terminal offer that paste input. The\n * flow needs it: the interactive host answers pi-ai's `manual_code` prompt with\n * a promise that only `showManualInput` ever resolves, so a provider missing\n * from this set issues the prompt into a input that is never shown and waits\n * for the callback until it times out.\n *\n * OpenRouter belongs here as of pi 0.83.0, which added the manual redirect-URL\n * fallback to its OAuth flow (upstream `61da9e2`, pi#7114) — its\n * `loginOpenRouter` now races `waitForCredential()` against a `manual_code`\n * prompt exactly as Anthropic and Codex do.\n */\nconst CALLBACK_SERVER_PROVIDERS = new Set([\"anthropic\", \"openai-codex\", \"openrouter\"]);\n\nexport function collectOAuthProviderMetadata(\n\tproviders: readonly Provider[],\n\textensions: ReadonlyMap<string, ProviderConfigInput>,\n): OAuthProviderMetadata[] {\n\treturn providers\n\t\t.filter((provider) => provider.auth.oauth)\n\t\t.map((provider) => {\n\t\t\tconst providerOAuth = provider.auth.oauth;\n\t\t\tconst extensionOAuth = extensions.get(provider.id)?.oauth;\n\t\t\tconst loginLabel = extensionOAuth?.loginLabel ?? providerOAuth?.loginLabel;\n\t\t\tconst hasCallbackServerMetadata =\n\t\t\t\textensionOAuth?.usesCallbackServer !== undefined || CALLBACK_SERVER_PROVIDERS.has(provider.id);\n\t\t\tconst usesCallbackServer = extensionOAuth?.usesCallbackServer ?? CALLBACK_SERVER_PROVIDERS.has(provider.id);\n\t\t\treturn {\n\t\t\t\tid: provider.id,\n\t\t\t\tname: provider.name ?? provider.id,\n\t\t\t\t...(loginLabel ? { loginLabel } : {}),\n\t\t\t\t...(hasCallbackServerMetadata ? { usesCallbackServer } : {}),\n\t\t\t};\n\t\t});\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Api, Model } from "@earendil-works/pi-ai/compat";
1
+ import type { Api, Model } from "@bastani/pi-ai/compat";
2
2
  export declare const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;
3
3
  export declare function isOpenAIResponsesModel(model: Pick<Model<Api>, "api">): boolean;
4
4
  export declare function isValidResponsesFunctionCallId(id: unknown): id is string;
@@ -1 +1 @@
1
- {"version":3,"file":"openai-responses-payload-sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/openai-responses-payload-sanitizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAqB/D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAMlD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAE9E;AAED,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAExE;AAUD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUpF;AAqBD,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CA+BxG"}
1
+ {"version":3,"file":"openai-responses-payload-sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/openai-responses-payload-sanitizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAqBxD,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAMlD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAE9E;AAED,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAExE;AAUD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUpF;AAqBD,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CA+BxG"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai-responses-payload-sanitizer.js","sourceRoot":"","sources":["../../src/core/openai-responses-payload-sanitizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\n\ntype JsonObject = { [key: string]: JsonValue };\ntype JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;\n\nconst RESPONSES_FUNCTION_CALL_ID_PREFIX = \"fc_\";\n// Upper bound for a synthesized Responses `function_call.id`, shared by the validator below\n// and by the generator budget in `responsesFunctionCallIdForCallId`.\n//\n// The server's real bound is UNCONFIRMED: the live API was never probed. The only hard datum\n// is that a 64-character `fc_*` value was deterministically rejected with 400\n// invalid_request_body (issue #2204), while its characters were all within the class the\n// error text named. 63 is therefore a deliberately conservative margin that sits below the\n// one length known to fail rather than on it. Revise only against a confirmed live bound.\nconst MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH = 63;\n// Derived from the maximum above so the validator and the generator can never disagree.\nconst RESPONSES_FUNCTION_CALL_ID = new RegExp(\n\t`^${RESPONSES_FUNCTION_CALL_ID_PREFIX}[A-Za-z0-9_-]{1,${\n\t\tMAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length\n\t}}$`,\n);\nexport const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isOpenAIResponsesModel(model: Pick<Model<Api>, \"api\">): boolean {\n\treturn model.api === \"openai-responses\";\n}\n\nexport function isValidResponsesFunctionCallId(id: unknown): id is string {\n\treturn typeof id === \"string\" && RESPONSES_FUNCTION_CALL_ID.test(id);\n}\n\nfunction sha256Base64Url(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"base64url\");\n}\n\nfunction sanitizedCallIdFragment(callId: string): string {\n\treturn callId.replace(/[^A-Za-z0-9_-]/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nexport function responsesFunctionCallIdForCallId(callId: unknown): string | undefined {\n\tif (typeof callId !== \"string\" || callId.length === 0) return undefined;\n\tconst direct = `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${callId}`;\n\tif (isValidResponsesFunctionCallId(direct)) return direct;\n\n\tconst sanitized = sanitizedCallIdFragment(callId);\n\tconst hash = sha256Base64Url(callId).slice(0, 16);\n\tconst suffixBudget = MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length;\n\tconst suffix = sanitized.length > 0 ? `${sanitized.slice(0, suffixBudget - hash.length - 1)}_${hash}` : hash;\n\treturn `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${suffix}`;\n}\n\nfunction sanitizeResponsesFunctionCall(item: JsonObject): boolean {\n\tif (item.type !== \"function_call\") return false;\n\t// An absent id stays absent. The conversion layer below either omits it deliberately, to\n\t// avoid the Responses fc_/rs_ pairing validation, or omits it because the composite\n\t// tool-call id was already flattened — and in that case `call_id` has been mangled too and\n\t// cannot yield the real item id. Synthesizing a replacement here is what manufactured the\n\t// identifier the server rejected in issue #2204. Only a *present* id may be repaired.\n\tif (!(\"id\" in item) || item.id === undefined) return false;\n\tif (isValidResponsesFunctionCallId(item.id)) return false;\n\n\tconst synthesized = responsesFunctionCallIdForCallId(item.call_id);\n\tif (synthesized) {\n\t\titem.id = synthesized;\n\t} else {\n\t\tdelete item.id;\n\t}\n\treturn true;\n}\n\nexport function sanitizeOpenAIResponsesPayload(payload: unknown, model: Pick<Model<Api>, \"api\">): unknown {\n\tif (!isOpenAIResponsesModel(model) || !isPlainObject(payload)) return payload;\n\n\tlet changed = false;\n\tlet sanitizedPayload: JsonObject = payload;\n\n\tif (\n\t\ttypeof payload.max_output_tokens === \"number\" &&\n\t\tNumber.isFinite(payload.max_output_tokens) &&\n\t\tpayload.max_output_tokens < MIN_RESPONSES_MAX_OUTPUT_TOKENS\n\t) {\n\t\tchanged = true;\n\t\tsanitizedPayload = { ...sanitizedPayload, max_output_tokens: MIN_RESPONSES_MAX_OUTPUT_TOKENS };\n\t}\n\n\tif (Array.isArray(payload.input)) {\n\t\tlet inputChanged = false;\n\t\tconst input = payload.input.map((item) => {\n\t\t\tif (!isPlainObject(item)) return item;\n\t\t\tconst cloned = { ...item };\n\t\t\tinputChanged = sanitizeResponsesFunctionCall(cloned) || inputChanged;\n\t\t\treturn cloned;\n\t\t});\n\n\t\tif (inputChanged) {\n\t\t\tchanged = true;\n\t\t\tsanitizedPayload = { ...sanitizedPayload, input };\n\t\t}\n\t}\n\n\treturn changed ? sanitizedPayload : payload;\n}\n"]}
1
+ {"version":3,"file":"openai-responses-payload-sanitizer.js","sourceRoot":"","sources":["../../src/core/openai-responses-payload-sanitizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Api, Model } from \"@bastani/pi-ai/compat\";\n\ntype JsonObject = { [key: string]: JsonValue };\ntype JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;\n\nconst RESPONSES_FUNCTION_CALL_ID_PREFIX = \"fc_\";\n// Upper bound for a synthesized Responses `function_call.id`, shared by the validator below\n// and by the generator budget in `responsesFunctionCallIdForCallId`.\n//\n// The server's real bound is UNCONFIRMED: the live API was never probed. The only hard datum\n// is that a 64-character `fc_*` value was deterministically rejected with 400\n// invalid_request_body (issue #2204), while its characters were all within the class the\n// error text named. 63 is therefore a deliberately conservative margin that sits below the\n// one length known to fail rather than on it. Revise only against a confirmed live bound.\nconst MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH = 63;\n// Derived from the maximum above so the validator and the generator can never disagree.\nconst RESPONSES_FUNCTION_CALL_ID = new RegExp(\n\t`^${RESPONSES_FUNCTION_CALL_ID_PREFIX}[A-Za-z0-9_-]{1,${\n\t\tMAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length\n\t}}$`,\n);\nexport const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isOpenAIResponsesModel(model: Pick<Model<Api>, \"api\">): boolean {\n\treturn model.api === \"openai-responses\";\n}\n\nexport function isValidResponsesFunctionCallId(id: unknown): id is string {\n\treturn typeof id === \"string\" && RESPONSES_FUNCTION_CALL_ID.test(id);\n}\n\nfunction sha256Base64Url(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"base64url\");\n}\n\nfunction sanitizedCallIdFragment(callId: string): string {\n\treturn callId.replace(/[^A-Za-z0-9_-]/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nexport function responsesFunctionCallIdForCallId(callId: unknown): string | undefined {\n\tif (typeof callId !== \"string\" || callId.length === 0) return undefined;\n\tconst direct = `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${callId}`;\n\tif (isValidResponsesFunctionCallId(direct)) return direct;\n\n\tconst sanitized = sanitizedCallIdFragment(callId);\n\tconst hash = sha256Base64Url(callId).slice(0, 16);\n\tconst suffixBudget = MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length;\n\tconst suffix = sanitized.length > 0 ? `${sanitized.slice(0, suffixBudget - hash.length - 1)}_${hash}` : hash;\n\treturn `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${suffix}`;\n}\n\nfunction sanitizeResponsesFunctionCall(item: JsonObject): boolean {\n\tif (item.type !== \"function_call\") return false;\n\t// An absent id stays absent. The conversion layer below either omits it deliberately, to\n\t// avoid the Responses fc_/rs_ pairing validation, or omits it because the composite\n\t// tool-call id was already flattened — and in that case `call_id` has been mangled too and\n\t// cannot yield the real item id. Synthesizing a replacement here is what manufactured the\n\t// identifier the server rejected in issue #2204. Only a *present* id may be repaired.\n\tif (!(\"id\" in item) || item.id === undefined) return false;\n\tif (isValidResponsesFunctionCallId(item.id)) return false;\n\n\tconst synthesized = responsesFunctionCallIdForCallId(item.call_id);\n\tif (synthesized) {\n\t\titem.id = synthesized;\n\t} else {\n\t\tdelete item.id;\n\t}\n\treturn true;\n}\n\nexport function sanitizeOpenAIResponsesPayload(payload: unknown, model: Pick<Model<Api>, \"api\">): unknown {\n\tif (!isOpenAIResponsesModel(model) || !isPlainObject(payload)) return payload;\n\n\tlet changed = false;\n\tlet sanitizedPayload: JsonObject = payload;\n\n\tif (\n\t\ttypeof payload.max_output_tokens === \"number\" &&\n\t\tNumber.isFinite(payload.max_output_tokens) &&\n\t\tpayload.max_output_tokens < MIN_RESPONSES_MAX_OUTPUT_TOKENS\n\t) {\n\t\tchanged = true;\n\t\tsanitizedPayload = { ...sanitizedPayload, max_output_tokens: MIN_RESPONSES_MAX_OUTPUT_TOKENS };\n\t}\n\n\tif (Array.isArray(payload.input)) {\n\t\tlet inputChanged = false;\n\t\tconst input = payload.input.map((item) => {\n\t\t\tif (!isPlainObject(item)) return item;\n\t\t\tconst cloned = { ...item };\n\t\t\tinputChanged = sanitizeResponsesFunctionCall(cloned) || inputChanged;\n\t\t\treturn cloned;\n\t\t});\n\n\t\tif (inputChanged) {\n\t\t\tchanged = true;\n\t\t\tsanitizedPayload = { ...sanitizedPayload, input };\n\t\t}\n\t}\n\n\treturn changed ? sanitizedPayload : payload;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Api, Model, ProviderHeaders } from "@earendil-works/pi-ai/compat";
1
+ import type { Api, Model, ProviderHeaders } from "@bastani/pi-ai/compat";
2
2
  import type { SettingsManager } from "./settings-manager.ts";
3
3
  export declare function mergeProviderAttributionHeaders(model: Model<Api>, settingsManager: SettingsManager, sessionId: string | undefined, ...headerSources: Array<ProviderHeaders | undefined>): ProviderHeaders | undefined;
4
4
  //# sourceMappingURL=provider-attribution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-attribution.d.ts","sourceRoot":"","sources":["../../src/core/provider-attribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA8F7D,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,aAAa,EAAE,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC,GAClD,eAAe,GAAG,SAAS,CAU7B"}
1
+ {"version":3,"file":"provider-attribution.d.ts","sourceRoot":"","sources":["../../src/core/provider-attribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA8F7D,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,aAAa,EAAE,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC,GAClD,eAAe,GAAG,SAAS,CAU7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-attribution.js","sourceRoot":"","sources":["../../src/core/provider-attribution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, ProviderHeaders } from \"@earendil-works/pi-ai/compat\";\nimport { APP_NAME } from \"../config.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\n\nconst OPENROUTER_HOST = \"openrouter.ai\";\nconst NVIDIA_NIM_HOST = \"integrate.api.nvidia.com\";\nconst CLOUDFLARE_API_HOST = \"api.cloudflare.com\";\nconst CLOUDFLARE_AI_GATEWAY_HOST = \"gateway.ai.cloudflare.com\";\nconst OPENCODE_HOST = \"opencode.ai\";\n\nfunction matchesHost(baseUrl: string, expectedHost: string): boolean {\n\ttry {\n\t\treturn new URL(baseUrl).hostname === expectedHost;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isOpenRouterModel(model: Model<Api>): boolean {\n\treturn model.provider === \"openrouter\" || matchesHost(model.baseUrl, OPENROUTER_HOST);\n}\n\nfunction isNvidiaNimModel(model: Model<Api>): boolean {\n\treturn model.provider === \"nvidia\" || matchesHost(model.baseUrl, NVIDIA_NIM_HOST);\n}\n\nfunction isCloudflareModel(model: Model<Api>): boolean {\n\treturn (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmatchesHost(model.baseUrl, CLOUDFLARE_API_HOST) ||\n\t\tmatchesHost(model.baseUrl, CLOUDFLARE_AI_GATEWAY_HOST)\n\t);\n}\n\nfunction getDefaultAttributionHeaders(\n\tmodel: Model<Api>,\n\tsettingsManager: SettingsManager,\n): Record<string, string> | undefined {\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (isOpenRouterModel(model)) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://atomic.sh\",\n\t\t\t\"X-OpenRouter-Title\": APP_NAME,\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (isNvidiaNimModel(model)) {\n\t\treturn {\n\t\t\t\"X-BILLING-INVOKE-ORIGIN\": \"Atomic\",\n\t\t};\n\t}\n\n\tif (isCloudflareModel(model)) {\n\t\treturn {\n\t\t\t\"User-Agent\": APP_NAME,\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction getSessionHeaders(model: Model<Api>, sessionId: string | undefined): Record<string, string> | undefined {\n\tif (!sessionId) return undefined;\n\tif (\n\t\tmodel.provider !== \"opencode\" &&\n\t\tmodel.provider !== \"opencode-go\" &&\n\t\t!matchesHost(model.baseUrl, OPENCODE_HOST)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { \"x-opencode-session\": sessionId, \"x-opencode-client\": APP_NAME };\n}\n\nfunction mergeHeaderSource(merged: ProviderHeaders, headers: ProviderHeaders | undefined): void {\n\tif (!headers) return;\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tconst normalizedKey = key.toLowerCase();\n\t\tfor (const existingKey of Object.keys(merged)) {\n\t\t\tif (existingKey.toLowerCase() === normalizedKey) {\n\t\t\t\tdelete merged[existingKey];\n\t\t\t}\n\t\t}\n\t\t// Preserve `null` verbatim: under pi-ai 0.80.2 a `null` header value is the\n\t\t// documented suppression signal for a provider/API default header. Collapsing\n\t\t// it to `undefined` or dropping it would let pi-ai re-add its own default and\n\t\t// silently defeat the caller's suppression request.\n\t\tmerged[key] = value;\n\t}\n}\n\nexport function mergeProviderAttributionHeaders(\n\tmodel: Model<Api>,\n\tsettingsManager: SettingsManager,\n\tsessionId: string | undefined,\n\t...headerSources: Array<ProviderHeaders | undefined>\n): ProviderHeaders | undefined {\n\tconst merged: ProviderHeaders = {};\n\tmergeHeaderSource(merged, getSessionHeaders(model, sessionId));\n\tmergeHeaderSource(merged, getDefaultAttributionHeaders(model, settingsManager));\n\n\tfor (const headers of headerSources) {\n\t\tmergeHeaderSource(merged, headers);\n\t}\n\n\treturn Object.keys(merged).length > 0 ? merged : undefined;\n}\n"]}
1
+ {"version":3,"file":"provider-attribution.js","sourceRoot":"","sources":["../../src/core/provider-attribution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, ProviderHeaders } from \"@bastani/pi-ai/compat\";\nimport { APP_NAME } from \"../config.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\n\nconst OPENROUTER_HOST = \"openrouter.ai\";\nconst NVIDIA_NIM_HOST = \"integrate.api.nvidia.com\";\nconst CLOUDFLARE_API_HOST = \"api.cloudflare.com\";\nconst CLOUDFLARE_AI_GATEWAY_HOST = \"gateway.ai.cloudflare.com\";\nconst OPENCODE_HOST = \"opencode.ai\";\n\nfunction matchesHost(baseUrl: string, expectedHost: string): boolean {\n\ttry {\n\t\treturn new URL(baseUrl).hostname === expectedHost;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isOpenRouterModel(model: Model<Api>): boolean {\n\treturn model.provider === \"openrouter\" || matchesHost(model.baseUrl, OPENROUTER_HOST);\n}\n\nfunction isNvidiaNimModel(model: Model<Api>): boolean {\n\treturn model.provider === \"nvidia\" || matchesHost(model.baseUrl, NVIDIA_NIM_HOST);\n}\n\nfunction isCloudflareModel(model: Model<Api>): boolean {\n\treturn (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmatchesHost(model.baseUrl, CLOUDFLARE_API_HOST) ||\n\t\tmatchesHost(model.baseUrl, CLOUDFLARE_AI_GATEWAY_HOST)\n\t);\n}\n\nfunction getDefaultAttributionHeaders(\n\tmodel: Model<Api>,\n\tsettingsManager: SettingsManager,\n): Record<string, string> | undefined {\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (isOpenRouterModel(model)) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://atomic.sh\",\n\t\t\t\"X-OpenRouter-Title\": APP_NAME,\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (isNvidiaNimModel(model)) {\n\t\treturn {\n\t\t\t\"X-BILLING-INVOKE-ORIGIN\": \"Atomic\",\n\t\t};\n\t}\n\n\tif (isCloudflareModel(model)) {\n\t\treturn {\n\t\t\t\"User-Agent\": APP_NAME,\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction getSessionHeaders(model: Model<Api>, sessionId: string | undefined): Record<string, string> | undefined {\n\tif (!sessionId) return undefined;\n\tif (\n\t\tmodel.provider !== \"opencode\" &&\n\t\tmodel.provider !== \"opencode-go\" &&\n\t\t!matchesHost(model.baseUrl, OPENCODE_HOST)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { \"x-opencode-session\": sessionId, \"x-opencode-client\": APP_NAME };\n}\n\nfunction mergeHeaderSource(merged: ProviderHeaders, headers: ProviderHeaders | undefined): void {\n\tif (!headers) return;\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tconst normalizedKey = key.toLowerCase();\n\t\tfor (const existingKey of Object.keys(merged)) {\n\t\t\tif (existingKey.toLowerCase() === normalizedKey) {\n\t\t\t\tdelete merged[existingKey];\n\t\t\t}\n\t\t}\n\t\t// Preserve `null` verbatim: under pi-ai 0.80.2 a `null` header value is the\n\t\t// documented suppression signal for a provider/API default header. Collapsing\n\t\t// it to `undefined` or dropping it would let pi-ai re-add its own default and\n\t\t// silently defeat the caller's suppression request.\n\t\tmerged[key] = value;\n\t}\n}\n\nexport function mergeProviderAttributionHeaders(\n\tmodel: Model<Api>,\n\tsettingsManager: SettingsManager,\n\tsessionId: string | undefined,\n\t...headerSources: Array<ProviderHeaders | undefined>\n): ProviderHeaders | undefined {\n\tconst merged: ProviderHeaders = {};\n\tmergeHeaderSource(merged, getSessionHeaders(model, sessionId));\n\tmergeHeaderSource(merged, getDefaultAttributionHeaders(model, settingsManager));\n\n\tfor (const headers of headerSources) {\n\t\tmergeHeaderSource(merged, headers);\n\t}\n\n\treturn Object.keys(merged).length > 0 ? merged : undefined;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Api, ApiKeyAuth, AssistantMessageEventStream, Context, Model, OAuthAuth, OAuthCredentials, OAuthLoginCallbacks, Provider, RefreshModelsContext, SimpleStreamOptions } from "@earendil-works/pi-ai";
1
+ import type { Api, ApiKeyAuth, AssistantMessageEventStream, Context, Model, OAuthAuth, OAuthCredentials, OAuthLoginCallbacks, Provider, RefreshModelsContext, SimpleStreamOptions } from "@bastani/pi-ai";
2
2
  import type { ModelsJsonModelOverride, ModelsJsonProvider } from "./model-config.ts";
3
3
  import { clearConfigValueCache } from "./resolve-config-value.ts";
4
4
  export interface ExtensionOAuthConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"provider-composer-internal.d.ts","sourceRoot":"","sources":["../../src/core/provider-composer-internal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-composer-internal.d.ts","sourceRoot":"","sources":["../../src/core/provider-composer-internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,GAAG,EACH,UAAU,EACV,2BAA2B,EAG3B,OAAO,EACP,KAAK,EAEL,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EAGR,oBAAoB,EACpB,mBAAmB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAmB,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtG,OAAO,EACN,qBAAqB,EAKrB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtF;;;;;;OAMG;IACH,YAAY,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5F,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACjD,YAAY,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CACjF;AAED,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,2BAA2B,CAAC;IACnH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,GAAG,CAAC;QACV,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,gBAAgB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAClD,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;KAC9B,CAAC,CAAC;IACH,aAAa,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;CACnG;AAED,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gBAAgB,8BAAwB,CAAC;AAwBtD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,uBAAuB,GAAG,KAAK,CAAC,GAAG,CAAC,CAyBnG;AAwCD,wBAAgB,eAAe,CAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EACjC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GACpC,KAAK,CAAC,GAAG,CAAC,EAAE,CAkCd;AAED,wBAAgB,cAAc,CAC7B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAC7B,MAAM,EAAE,mBAAmB,GAAG,SAAS,GACrC,KAAK,CAAC,GAAG,CAAC,EAAE,CAuBd;AAwCD,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAGpC;AAgBD,wBAAgB,iBAAiB,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,UAAU,GAAG,SAAS,CA2DxB;AAED,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,SAAS,GAAG,SAAS,CAkBvB;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CASpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-composer-internal.js","sourceRoot":"","sources":["../../src/core/provider-composer-internal.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tApi,\n\tApiKeyAuth,\n\tAssistantMessageEventStream,\n\tAuthContext,\n\tAuthResult,\n\tContext,\n\tModel,\n\tModelAuth,\n\tOAuthAuth,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tProvider,\n\tProviderAuthInteraction,\n\tProviderHeaders,\n\tRefreshModelsContext,\n\tSimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport type { ModelsJsonModel, ModelsJsonModelOverride, ModelsJsonProvider } from \"./model-config.ts\";\nimport {\n\tclearConfigValueCache,\n\tgetConfigValueEnvVarNames,\n\tisCommandConfigValue,\n\tresolveConfigValueOrThrow,\n\tresolveHeadersOrThrow,\n} from \"./resolve-config-value.ts\";\n\nexport interface ExtensionOAuthConfig {\n\tname: string;\n\tloginLabel?: string;\n\tusesCallbackServer?: boolean;\n\tlogin(callbacks: OAuthLoginCallbacks, signal: AbortSignal): Promise<OAuthCredentials>;\n\t/**\n\t * Refresh expired credentials. `signal` is the caller's cancellation signal,\n\t * forwarded by pi through `oauth.refresh(credential, signal)`; honor it by\n\t * passing it into whatever performs the network call. It is a required\n\t * parameter rather than an optional one so the contract cannot be satisfied\n\t * by ignoring cancellation.\n\t */\n\trefreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials>;\n\tgetApiKey(credentials: OAuthCredentials): string;\n\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n}\n\n/** Input type for the extension registerProvider API. */\nexport interface ProviderConfigInput {\n\tname?: string;\n\tbaseUrl?: string;\n\tapiKey?: string;\n\tapi?: Api;\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\theaders?: Record<string, string>;\n\tauthHeader?: boolean;\n\toauth?: ExtensionOAuthConfig;\n\tmodels?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\tapi?: Api;\n\t\tbaseUrl?: string;\n\t\treasoning: boolean;\n\t\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t\tinput: (\"text\" | \"image\")[];\n\t\tcost: Model<Api>[\"cost\"];\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\tsamplingParams?: Record<string, unknown>;\n\t\theaders?: Record<string, string>;\n\t\tcompat?: Model<Api>[\"compat\"];\n\t}>;\n\trefreshModels?(context: RefreshModelsContext): Promise<NonNullable<ProviderConfigInput[\"models\"]>>;\n}\n\nexport type AuthStatus = {\n\tconfigured: boolean;\n\tsource?: \"stored\" | \"runtime\" | \"environment\" | \"fallback\" | \"models_json_key\" | \"models_json_command\";\n\tlabel?: string;\n};\n\nexport const clearApiKeyCache = clearConfigValueCache;\n\nfunction mergeCompat(\n\tbase: Model<Api>[\"compat\"],\n\toverride: Model<Api>[\"compat\"] | ModelsJsonModelOverride[\"compat\"],\n): Model<Api>[\"compat\"] {\n\tif (!override) return base;\n\tconst merged = { ...base, ...override } as NonNullable<Model<Api>[\"compat\"]>;\n\tconst baseNested = base as Record<string, unknown> | undefined;\n\tconst overrideNested = override as Record<string, unknown>;\n\tconst mergedNested = merged as Record<string, unknown>;\n\tfor (const key of [\"openRouterRouting\", \"vercelGatewayRouting\", \"chatTemplateKwargs\", \"chatTemplateArgs\"] as const) {\n\t\tconst baseValue = baseNested?.[key];\n\t\tconst overrideValue = overrideNested[key];\n\t\tif (\n\t\t\t(typeof baseValue === \"object\" && baseValue !== null) ||\n\t\t\t(typeof overrideValue === \"object\" && overrideValue !== null)\n\t\t) {\n\t\t\tmergedNested[key] = { ...(baseValue as object | undefined), ...(overrideValue as object | undefined) };\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport function applyModelOverride(model: Model<Api>, override: ModelsJsonModelOverride): Model<Api> {\n\treturn {\n\t\t...model,\n\t\tname: override.name ?? model.name,\n\t\treasoning: override.reasoning ?? model.reasoning,\n\t\tthinkingLevelMap: override.thinkingLevelMap\n\t\t\t? { ...model.thinkingLevelMap, ...override.thinkingLevelMap }\n\t\t\t: model.thinkingLevelMap,\n\t\tinput: (override.input as (\"text\" | \"image\")[] | undefined) ?? model.input,\n\t\tcost: override.cost\n\t\t\t? {\n\t\t\t\t\tinput: override.cost.input ?? model.cost.input,\n\t\t\t\t\toutput: override.cost.output ?? model.cost.output,\n\t\t\t\t\tcacheRead: override.cost.cacheRead ?? model.cost.cacheRead,\n\t\t\t\t\tcacheWrite: override.cost.cacheWrite ?? model.cost.cacheWrite,\n\t\t\t\t\ttiers: override.cost.tiers ?? model.cost.tiers,\n\t\t\t\t}\n\t\t\t: model.cost,\n\t\tcontextWindow: override.contextWindow ?? model.contextWindow,\n\t\tmaxTokens: override.maxTokens ?? model.maxTokens,\n\t\tsamplingParams: override.samplingParams\n\t\t\t? { ...model.samplingParams, ...override.samplingParams }\n\t\t\t: model.samplingParams,\n\t\tcompat: mergeCompat(model.compat, override.compat),\n\t};\n}\n\nfunction modelFromJson(\n\tproviderId: string,\n\tdefinition: ModelsJsonModel,\n\tproviderConfig: ModelsJsonProvider,\n\tdefaults: Model<Api> | undefined,\n): Model<Api> {\n\tconst api = definition.api ?? providerConfig.api ?? defaults?.api;\n\tif (!api) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t);\n\t}\n\tconst baseUrl = definition.baseUrl ?? providerConfig.baseUrl ?? defaults?.baseUrl;\n\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\tif (definition.contextWindow !== undefined && definition.contextWindow <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);\n\t}\n\tif (definition.maxTokens !== undefined && definition.maxTokens <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);\n\t}\n\treturn {\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tapi: api as Api,\n\t\tprovider: providerId,\n\t\tbaseUrl,\n\t\treasoning: definition.reasoning ?? false,\n\t\tthinkingLevelMap: definition.thinkingLevelMap,\n\t\tinput: (definition.input ?? [\"text\"]) as (\"text\" | \"image\")[],\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t\tsamplingParams: definition.samplingParams,\n\t\theaders: undefined,\n\t\tcompat: mergeCompat(providerConfig.compat, definition.compat),\n\t};\n}\n\nexport function applyModelsJson(\n\tproviderId: string,\n\tbaseModels: readonly Model<Api>[],\n\tconfig: ModelsJsonProvider | undefined,\n): Model<Api>[] {\n\tif (!config) return [...baseModels];\n\tif (config.oauth && !config.baseUrl) {\n\t\tthrow new Error(`Provider ${providerId}: \"baseUrl\" is required when \"oauth\" is set.`);\n\t}\n\tconst hasOverrides = config.modelOverrides && Object.keys(config.modelOverrides).length > 0;\n\tif (\n\t\t!config.models?.length &&\n\t\t!config.baseUrl &&\n\t\t!config.headers &&\n\t\t!config.compat &&\n\t\t!hasOverrides &&\n\t\t!config.apiKey &&\n\t\t!config.oauth &&\n\t\tconfig.authHeader === undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}: must specify \"baseUrl\", \"headers\", \"compat\", \"modelOverrides\", or \"models\".`,\n\t\t);\n\t}\n\n\tconst models: Model<Api>[] = baseModels.map((model) => ({\n\t\t...model,\n\t\tbaseUrl: config.oauth === \"radius\" ? model.baseUrl : (config.baseUrl ?? model.baseUrl),\n\t\tcompat: mergeCompat(model.compat, config.compat),\n\t}));\n\tfor (const definition of config.models ?? []) {\n\t\tconst existingIndex = models.findIndex((model) => model.id === definition.id);\n\t\tconst defaults = existingIndex >= 0 ? models[existingIndex] : models[0];\n\t\tconst model = modelFromJson(providerId, definition, config, defaults);\n\t\tif (existingIndex >= 0) models[existingIndex] = model;\n\t\telse models.push(model);\n\t}\n\treturn models;\n}\n\nexport function applyExtension(\n\tproviderId: string,\n\tmodels: readonly Model<Api>[],\n\tconfig: ProviderConfigInput | undefined,\n): Model<Api>[] {\n\tif (!config) return [...models];\n\tif (!config.models) {\n\t\treturn config.baseUrl ? models.map((model) => ({ ...model, baseUrl: config.baseUrl! })) : [...models];\n\t}\n\treturn config.models.map((definition) => {\n\t\tconst defaults = models.find((model) => model.id === definition.id) ?? models[0];\n\t\tconst api = definition.api ?? config.api ?? defaults?.api;\n\t\tif (!api) {\n\t\t\tthrow new Error(\n\t\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t\t);\n\t\t}\n\t\tconst baseUrl = definition.baseUrl ?? config.baseUrl ?? defaults?.baseUrl;\n\t\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\t\treturn {\n\t\t\t...definition,\n\t\t\tapi,\n\t\t\tprovider: providerId,\n\t\t\tbaseUrl,\n\t\t\theaders: undefined,\n\t\t};\n\t});\n}\n\nfunction adaptOAuth(config: ExtensionOAuthConfig): OAuthAuth {\n\treturn {\n\t\tname: config.name,\n\t\tlogin: async (callbacks) => {\n\t\t\tconst legacyCallbacks: OAuthLoginCallbacks & {\n\t\t\t\tonInfo(message: string, links: readonly { label?: string; url: string }[]): void;\n\t\t\t} = {\n\t\t\t\tonAuth: (info) => callbacks.notify({ type: \"auth_url\", ...info }),\n\t\t\t\tonDeviceCode: (info) => callbacks.notify({ type: \"device_code\", ...info }),\n\t\t\t\tonPrompt: (prompt) => callbacks.prompt({ type: \"text\", ...prompt }),\n\t\t\t\tonProgress: (message) => callbacks.notify({ type: \"progress\", message }),\n\t\t\t\tonInfo: (message, links) => callbacks.notify({ type: \"info\", message, links }),\n\t\t\t\tonManualCodeInput: () => callbacks.prompt({ type: \"manual_code\", message: \"Paste the authorization code\" }),\n\t\t\t\tonSelect: (prompt) => callbacks.prompt({ type: \"select\", ...prompt }),\n\t\t\t\tsignal: callbacks.signal,\n\t\t\t};\n\t\t\tconst credential = await config.login(legacyCallbacks, callbacks.signal);\n\t\t\treturn { ...credential, type: \"oauth\" };\n\t\t},\n\t\trefresh: async (credential, signal) => ({ ...(await config.refreshToken(credential, signal)), type: \"oauth\" }),\n\t\ttoAuth: async (credential) => ({ apiKey: config.getApiKey(credential) }),\n\t};\n}\n\nfunction withConfiguredAuth(\n\tauth: ModelAuth,\n\theaders: Record<string, string> | undefined,\n\tauthHeader: boolean,\n): ModelAuth {\n\tlet mergedHeaders: ProviderHeaders | undefined =\n\t\tauth.headers || headers ? { ...auth.headers, ...headers } : undefined;\n\tif (authHeader) {\n\t\tif (!auth.apiKey) throw new Error(\"authHeader requires a resolved API key\");\n\t\tmergedHeaders = { ...mergedHeaders, Authorization: `Bearer ${auth.apiKey}` };\n\t}\n\treturn { ...auth, headers: mergedHeaders };\n}\n\nexport function configuredApiKey(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): string | undefined {\n\treturn extension?.apiKey ?? config?.apiKey;\n}\n\nexport function configuredHeaders(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, string> | undefined {\n\tif (!config?.headers && !extension?.headers) return undefined;\n\treturn { ...config?.headers, ...extension?.headers };\n}\n\nasync function configContextEnv(\n\tvalues: readonly string[],\n\tctx: AuthContext,\n\texplicit?: Record<string, string>,\n): Promise<Record<string, string> | undefined> {\n\tconst env = { ...explicit };\n\tfor (const name of new Set(values.flatMap(getConfigValueEnvVarNames))) {\n\t\tif (env[name] !== undefined) continue;\n\t\tconst value = await ctx.env(name);\n\t\tif (value !== undefined) env[name] = value;\n\t}\n\treturn Object.keys(env).length > 0 ? env : undefined;\n}\n\nexport function composeApiKeyAuth(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): ApiKeyAuth | undefined {\n\tconst inherited = base?.auth.apiKey;\n\tconst rawKey = configuredApiKey(config, extension);\n\tconst oauth = extension?.oauth ?? base?.auth.oauth;\n\t// OAuth-only providers get no fabricated API-key login method.\n\tif (!inherited && rawKey === undefined && oauth) return undefined;\n\tconst rawHeaders = configuredHeaders(config, extension);\n\tconst authHeader = extension?.authHeader ?? config?.authHeader ?? false;\n\treturn {\n\t\tname: inherited?.name ?? \"API key\",\n\t\tlogin:\n\t\t\tinherited?.login ??\n\t\t\t(async (interaction: ProviderAuthInteraction) => ({\n\t\t\t\ttype: \"api_key\",\n\t\t\t\tkey: await interaction.prompt({ type: \"secret\", message: \"Enter API key\" }),\n\t\t\t})),\n\t\tcheck: async (input) => {\n\t\t\tif (input.credential) {\n\t\t\t\tif (inherited?.check) return inherited.check(input);\n\t\t\t\tif (input.credential.key) return { type: \"api_key\", source: \"stored credential\" };\n\t\t\t\tconst resolved = await inherited?.resolve(input);\n\t\t\t\treturn resolved ? { type: \"api_key\", source: resolved.source } : undefined;\n\t\t\t}\n\t\t\tif (rawKey !== undefined) {\n\t\t\t\tif (isCommandConfigValue(rawKey)) return { type: \"api_key\", source: \"configured API key\" };\n\t\t\t\tconst envNames = getConfigValueEnvVarNames(rawKey);\n\t\t\t\tfor (const name of envNames) {\n\t\t\t\t\tif ((await input.ctx.env(name)) === undefined) return undefined;\n\t\t\t\t}\n\t\t\t\treturn { type: \"api_key\", source: \"configured API key\" };\n\t\t\t}\n\t\t\tif (inherited?.check) return inherited.check(input);\n\t\t\tconst resolved = await inherited?.resolve(input);\n\t\t\treturn resolved ? { type: \"api_key\", source: resolved.source } : undefined;\n\t\t},\n\t\tresolve: async (input) => {\n\t\t\tlet result: AuthResult | undefined;\n\t\t\tif (input.credential) {\n\t\t\t\tresult = inherited\n\t\t\t\t\t? await inherited.resolve(input)\n\t\t\t\t\t: input.credential.key\n\t\t\t\t\t\t? { auth: { apiKey: input.credential.key }, env: input.credential.env, source: \"stored credential\" }\n\t\t\t\t\t\t: undefined;\n\t\t\t} else if (rawKey !== undefined) {\n\t\t\t\tconst env = await configContextEnv([rawKey], input.ctx);\n\t\t\t\tconst key = resolveConfigValueOrThrow(rawKey, `API key for provider \"${providerId}\"`, env);\n\t\t\t\tresult = inherited\n\t\t\t\t\t? await inherited.resolve({ ...input, credential: { type: \"api_key\", key } })\n\t\t\t\t\t: { auth: { apiKey: key }, source: \"configured API key\" };\n\t\t\t} else {\n\t\t\t\tresult = await inherited?.resolve(input);\n\t\t\t}\n\t\t\tif (!result) return undefined;\n\t\t\tconst explicitEnv = { ...(input.credential?.env ?? {}), ...(result.env ?? {}) };\n\t\t\tconst headerEnv = await configContextEnv(Object.values(rawHeaders ?? {}), input.ctx, explicitEnv);\n\t\t\tconst headers = resolveHeadersOrThrow(rawHeaders, `provider \"${providerId}\"`, headerEnv);\n\t\t\treturn { ...result, auth: withConfiguredAuth(result.auth, headers, authHeader) };\n\t\t},\n\t};\n}\n\nexport function composeOAuthAuth(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): OAuthAuth | undefined {\n\tconst oauth = extension?.oauth ? adaptOAuth(extension.oauth) : base?.auth.oauth;\n\tif (!oauth) return undefined;\n\tconst rawHeaders = configuredHeaders(config, extension);\n\tconst authHeader = extension?.authHeader ?? config?.authHeader ?? false;\n\treturn {\n\t\t...oauth,\n\t\ttoAuth: async (credential) => {\n\t\t\tconst auth = await oauth.toAuth(credential);\n\t\t\tconst env = credential.env;\n\t\t\tconst headers = resolveHeadersOrThrow(\n\t\t\t\trawHeaders,\n\t\t\t\t`provider \"${providerId}\"`,\n\t\t\t\ttypeof env === \"object\" && env !== null ? (env as Record<string, string>) : undefined,\n\t\t\t);\n\t\t\treturn withConfiguredAuth(auth, headers, authHeader);\n\t\t},\n\t};\n}\n\nexport function rawModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, string> | undefined {\n\tconst definition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst headers = {\n\t\t...config?.modelOverrides?.[model.id]?.headers,\n\t\t...definition?.headers,\n\t\t...extensionModel?.headers,\n\t};\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n"]}
1
+ {"version":3,"file":"provider-composer-internal.js","sourceRoot":"","sources":["../../src/core/provider-composer-internal.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tApi,\n\tApiKeyAuth,\n\tAssistantMessageEventStream,\n\tAuthContext,\n\tAuthResult,\n\tContext,\n\tModel,\n\tModelAuth,\n\tOAuthAuth,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tProvider,\n\tProviderAuthInteraction,\n\tProviderHeaders,\n\tRefreshModelsContext,\n\tSimpleStreamOptions,\n} from \"@bastani/pi-ai\";\nimport type { ModelsJsonModel, ModelsJsonModelOverride, ModelsJsonProvider } from \"./model-config.ts\";\nimport {\n\tclearConfigValueCache,\n\tgetConfigValueEnvVarNames,\n\tisCommandConfigValue,\n\tresolveConfigValueOrThrow,\n\tresolveHeadersOrThrow,\n} from \"./resolve-config-value.ts\";\n\nexport interface ExtensionOAuthConfig {\n\tname: string;\n\tloginLabel?: string;\n\tusesCallbackServer?: boolean;\n\tlogin(callbacks: OAuthLoginCallbacks, signal: AbortSignal): Promise<OAuthCredentials>;\n\t/**\n\t * Refresh expired credentials. `signal` is the caller's cancellation signal,\n\t * forwarded by pi through `oauth.refresh(credential, signal)`; honor it by\n\t * passing it into whatever performs the network call. It is a required\n\t * parameter rather than an optional one so the contract cannot be satisfied\n\t * by ignoring cancellation.\n\t */\n\trefreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials>;\n\tgetApiKey(credentials: OAuthCredentials): string;\n\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n}\n\n/** Input type for the extension registerProvider API. */\nexport interface ProviderConfigInput {\n\tname?: string;\n\tbaseUrl?: string;\n\tapiKey?: string;\n\tapi?: Api;\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\theaders?: Record<string, string>;\n\tauthHeader?: boolean;\n\toauth?: ExtensionOAuthConfig;\n\tmodels?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\tapi?: Api;\n\t\tbaseUrl?: string;\n\t\treasoning: boolean;\n\t\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t\tinput: (\"text\" | \"image\")[];\n\t\tcost: Model<Api>[\"cost\"];\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\tsamplingParams?: Record<string, unknown>;\n\t\theaders?: Record<string, string>;\n\t\tcompat?: Model<Api>[\"compat\"];\n\t}>;\n\trefreshModels?(context: RefreshModelsContext): Promise<NonNullable<ProviderConfigInput[\"models\"]>>;\n}\n\nexport type AuthStatus = {\n\tconfigured: boolean;\n\tsource?: \"stored\" | \"runtime\" | \"environment\" | \"fallback\" | \"models_json_key\" | \"models_json_command\";\n\tlabel?: string;\n};\n\nexport const clearApiKeyCache = clearConfigValueCache;\n\nfunction mergeCompat(\n\tbase: Model<Api>[\"compat\"],\n\toverride: Model<Api>[\"compat\"] | ModelsJsonModelOverride[\"compat\"],\n): Model<Api>[\"compat\"] {\n\tif (!override) return base;\n\tconst merged = { ...base, ...override } as NonNullable<Model<Api>[\"compat\"]>;\n\tconst baseNested = base as Record<string, unknown> | undefined;\n\tconst overrideNested = override as Record<string, unknown>;\n\tconst mergedNested = merged as Record<string, unknown>;\n\tfor (const key of [\"openRouterRouting\", \"vercelGatewayRouting\", \"chatTemplateKwargs\", \"chatTemplateArgs\"] as const) {\n\t\tconst baseValue = baseNested?.[key];\n\t\tconst overrideValue = overrideNested[key];\n\t\tif (\n\t\t\t(typeof baseValue === \"object\" && baseValue !== null) ||\n\t\t\t(typeof overrideValue === \"object\" && overrideValue !== null)\n\t\t) {\n\t\t\tmergedNested[key] = { ...(baseValue as object | undefined), ...(overrideValue as object | undefined) };\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport function applyModelOverride(model: Model<Api>, override: ModelsJsonModelOverride): Model<Api> {\n\treturn {\n\t\t...model,\n\t\tname: override.name ?? model.name,\n\t\treasoning: override.reasoning ?? model.reasoning,\n\t\tthinkingLevelMap: override.thinkingLevelMap\n\t\t\t? { ...model.thinkingLevelMap, ...override.thinkingLevelMap }\n\t\t\t: model.thinkingLevelMap,\n\t\tinput: (override.input as (\"text\" | \"image\")[] | undefined) ?? model.input,\n\t\tcost: override.cost\n\t\t\t? {\n\t\t\t\t\tinput: override.cost.input ?? model.cost.input,\n\t\t\t\t\toutput: override.cost.output ?? model.cost.output,\n\t\t\t\t\tcacheRead: override.cost.cacheRead ?? model.cost.cacheRead,\n\t\t\t\t\tcacheWrite: override.cost.cacheWrite ?? model.cost.cacheWrite,\n\t\t\t\t\ttiers: override.cost.tiers ?? model.cost.tiers,\n\t\t\t\t}\n\t\t\t: model.cost,\n\t\tcontextWindow: override.contextWindow ?? model.contextWindow,\n\t\tmaxTokens: override.maxTokens ?? model.maxTokens,\n\t\tsamplingParams: override.samplingParams\n\t\t\t? { ...model.samplingParams, ...override.samplingParams }\n\t\t\t: model.samplingParams,\n\t\tcompat: mergeCompat(model.compat, override.compat),\n\t};\n}\n\nfunction modelFromJson(\n\tproviderId: string,\n\tdefinition: ModelsJsonModel,\n\tproviderConfig: ModelsJsonProvider,\n\tdefaults: Model<Api> | undefined,\n): Model<Api> {\n\tconst api = definition.api ?? providerConfig.api ?? defaults?.api;\n\tif (!api) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t);\n\t}\n\tconst baseUrl = definition.baseUrl ?? providerConfig.baseUrl ?? defaults?.baseUrl;\n\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\tif (definition.contextWindow !== undefined && definition.contextWindow <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);\n\t}\n\tif (definition.maxTokens !== undefined && definition.maxTokens <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);\n\t}\n\treturn {\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tapi: api as Api,\n\t\tprovider: providerId,\n\t\tbaseUrl,\n\t\treasoning: definition.reasoning ?? false,\n\t\tthinkingLevelMap: definition.thinkingLevelMap,\n\t\tinput: (definition.input ?? [\"text\"]) as (\"text\" | \"image\")[],\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t\tsamplingParams: definition.samplingParams,\n\t\theaders: undefined,\n\t\tcompat: mergeCompat(providerConfig.compat, definition.compat),\n\t};\n}\n\nexport function applyModelsJson(\n\tproviderId: string,\n\tbaseModels: readonly Model<Api>[],\n\tconfig: ModelsJsonProvider | undefined,\n): Model<Api>[] {\n\tif (!config) return [...baseModels];\n\tif (config.oauth && !config.baseUrl) {\n\t\tthrow new Error(`Provider ${providerId}: \"baseUrl\" is required when \"oauth\" is set.`);\n\t}\n\tconst hasOverrides = config.modelOverrides && Object.keys(config.modelOverrides).length > 0;\n\tif (\n\t\t!config.models?.length &&\n\t\t!config.baseUrl &&\n\t\t!config.headers &&\n\t\t!config.compat &&\n\t\t!hasOverrides &&\n\t\t!config.apiKey &&\n\t\t!config.oauth &&\n\t\tconfig.authHeader === undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}: must specify \"baseUrl\", \"headers\", \"compat\", \"modelOverrides\", or \"models\".`,\n\t\t);\n\t}\n\n\tconst models: Model<Api>[] = baseModels.map((model) => ({\n\t\t...model,\n\t\tbaseUrl: config.oauth === \"radius\" ? model.baseUrl : (config.baseUrl ?? model.baseUrl),\n\t\tcompat: mergeCompat(model.compat, config.compat),\n\t}));\n\tfor (const definition of config.models ?? []) {\n\t\tconst existingIndex = models.findIndex((model) => model.id === definition.id);\n\t\tconst defaults = existingIndex >= 0 ? models[existingIndex] : models[0];\n\t\tconst model = modelFromJson(providerId, definition, config, defaults);\n\t\tif (existingIndex >= 0) models[existingIndex] = model;\n\t\telse models.push(model);\n\t}\n\treturn models;\n}\n\nexport function applyExtension(\n\tproviderId: string,\n\tmodels: readonly Model<Api>[],\n\tconfig: ProviderConfigInput | undefined,\n): Model<Api>[] {\n\tif (!config) return [...models];\n\tif (!config.models) {\n\t\treturn config.baseUrl ? models.map((model) => ({ ...model, baseUrl: config.baseUrl! })) : [...models];\n\t}\n\treturn config.models.map((definition) => {\n\t\tconst defaults = models.find((model) => model.id === definition.id) ?? models[0];\n\t\tconst api = definition.api ?? config.api ?? defaults?.api;\n\t\tif (!api) {\n\t\t\tthrow new Error(\n\t\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t\t);\n\t\t}\n\t\tconst baseUrl = definition.baseUrl ?? config.baseUrl ?? defaults?.baseUrl;\n\t\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\t\treturn {\n\t\t\t...definition,\n\t\t\tapi,\n\t\t\tprovider: providerId,\n\t\t\tbaseUrl,\n\t\t\theaders: undefined,\n\t\t};\n\t});\n}\n\nfunction adaptOAuth(config: ExtensionOAuthConfig): OAuthAuth {\n\treturn {\n\t\tname: config.name,\n\t\tlogin: async (callbacks) => {\n\t\t\tconst legacyCallbacks: OAuthLoginCallbacks & {\n\t\t\t\tonInfo(message: string, links: readonly { label?: string; url: string }[]): void;\n\t\t\t} = {\n\t\t\t\tonAuth: (info) => callbacks.notify({ type: \"auth_url\", ...info }),\n\t\t\t\tonDeviceCode: (info) => callbacks.notify({ type: \"device_code\", ...info }),\n\t\t\t\tonPrompt: (prompt) => callbacks.prompt({ type: \"text\", ...prompt }),\n\t\t\t\tonProgress: (message) => callbacks.notify({ type: \"progress\", message }),\n\t\t\t\tonInfo: (message, links) => callbacks.notify({ type: \"info\", message, links }),\n\t\t\t\tonManualCodeInput: () => callbacks.prompt({ type: \"manual_code\", message: \"Paste the authorization code\" }),\n\t\t\t\tonSelect: (prompt) => callbacks.prompt({ type: \"select\", ...prompt }),\n\t\t\t\tsignal: callbacks.signal,\n\t\t\t};\n\t\t\tconst credential = await config.login(legacyCallbacks, callbacks.signal);\n\t\t\treturn { ...credential, type: \"oauth\" };\n\t\t},\n\t\trefresh: async (credential, signal) => ({ ...(await config.refreshToken(credential, signal)), type: \"oauth\" }),\n\t\ttoAuth: async (credential) => ({ apiKey: config.getApiKey(credential) }),\n\t};\n}\n\nfunction withConfiguredAuth(\n\tauth: ModelAuth,\n\theaders: Record<string, string> | undefined,\n\tauthHeader: boolean,\n): ModelAuth {\n\tlet mergedHeaders: ProviderHeaders | undefined =\n\t\tauth.headers || headers ? { ...auth.headers, ...headers } : undefined;\n\tif (authHeader) {\n\t\tif (!auth.apiKey) throw new Error(\"authHeader requires a resolved API key\");\n\t\tmergedHeaders = { ...mergedHeaders, Authorization: `Bearer ${auth.apiKey}` };\n\t}\n\treturn { ...auth, headers: mergedHeaders };\n}\n\nexport function configuredApiKey(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): string | undefined {\n\treturn extension?.apiKey ?? config?.apiKey;\n}\n\nexport function configuredHeaders(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, string> | undefined {\n\tif (!config?.headers && !extension?.headers) return undefined;\n\treturn { ...config?.headers, ...extension?.headers };\n}\n\nasync function configContextEnv(\n\tvalues: readonly string[],\n\tctx: AuthContext,\n\texplicit?: Record<string, string>,\n): Promise<Record<string, string> | undefined> {\n\tconst env = { ...explicit };\n\tfor (const name of new Set(values.flatMap(getConfigValueEnvVarNames))) {\n\t\tif (env[name] !== undefined) continue;\n\t\tconst value = await ctx.env(name);\n\t\tif (value !== undefined) env[name] = value;\n\t}\n\treturn Object.keys(env).length > 0 ? env : undefined;\n}\n\nexport function composeApiKeyAuth(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): ApiKeyAuth | undefined {\n\tconst inherited = base?.auth.apiKey;\n\tconst rawKey = configuredApiKey(config, extension);\n\tconst oauth = extension?.oauth ?? base?.auth.oauth;\n\t// OAuth-only providers get no fabricated API-key login method.\n\tif (!inherited && rawKey === undefined && oauth) return undefined;\n\tconst rawHeaders = configuredHeaders(config, extension);\n\tconst authHeader = extension?.authHeader ?? config?.authHeader ?? false;\n\treturn {\n\t\tname: inherited?.name ?? \"API key\",\n\t\tlogin:\n\t\t\tinherited?.login ??\n\t\t\t(async (interaction: ProviderAuthInteraction) => ({\n\t\t\t\ttype: \"api_key\",\n\t\t\t\tkey: await interaction.prompt({ type: \"secret\", message: \"Enter API key\" }),\n\t\t\t})),\n\t\tcheck: async (input) => {\n\t\t\tif (input.credential) {\n\t\t\t\tif (inherited?.check) return inherited.check(input);\n\t\t\t\tif (input.credential.key) return { type: \"api_key\", source: \"stored credential\" };\n\t\t\t\tconst resolved = await inherited?.resolve(input);\n\t\t\t\treturn resolved ? { type: \"api_key\", source: resolved.source } : undefined;\n\t\t\t}\n\t\t\tif (rawKey !== undefined) {\n\t\t\t\tif (isCommandConfigValue(rawKey)) return { type: \"api_key\", source: \"configured API key\" };\n\t\t\t\tconst envNames = getConfigValueEnvVarNames(rawKey);\n\t\t\t\tfor (const name of envNames) {\n\t\t\t\t\tif ((await input.ctx.env(name)) === undefined) return undefined;\n\t\t\t\t}\n\t\t\t\treturn { type: \"api_key\", source: \"configured API key\" };\n\t\t\t}\n\t\t\tif (inherited?.check) return inherited.check(input);\n\t\t\tconst resolved = await inherited?.resolve(input);\n\t\t\treturn resolved ? { type: \"api_key\", source: resolved.source } : undefined;\n\t\t},\n\t\tresolve: async (input) => {\n\t\t\tlet result: AuthResult | undefined;\n\t\t\tif (input.credential) {\n\t\t\t\tresult = inherited\n\t\t\t\t\t? await inherited.resolve(input)\n\t\t\t\t\t: input.credential.key\n\t\t\t\t\t\t? { auth: { apiKey: input.credential.key }, env: input.credential.env, source: \"stored credential\" }\n\t\t\t\t\t\t: undefined;\n\t\t\t} else if (rawKey !== undefined) {\n\t\t\t\tconst env = await configContextEnv([rawKey], input.ctx);\n\t\t\t\tconst key = resolveConfigValueOrThrow(rawKey, `API key for provider \"${providerId}\"`, env);\n\t\t\t\tresult = inherited\n\t\t\t\t\t? await inherited.resolve({ ...input, credential: { type: \"api_key\", key } })\n\t\t\t\t\t: { auth: { apiKey: key }, source: \"configured API key\" };\n\t\t\t} else {\n\t\t\t\tresult = await inherited?.resolve(input);\n\t\t\t}\n\t\t\tif (!result) return undefined;\n\t\t\tconst explicitEnv = { ...(input.credential?.env ?? {}), ...(result.env ?? {}) };\n\t\t\tconst headerEnv = await configContextEnv(Object.values(rawHeaders ?? {}), input.ctx, explicitEnv);\n\t\t\tconst headers = resolveHeadersOrThrow(rawHeaders, `provider \"${providerId}\"`, headerEnv);\n\t\t\treturn { ...result, auth: withConfiguredAuth(result.auth, headers, authHeader) };\n\t\t},\n\t};\n}\n\nexport function composeOAuthAuth(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): OAuthAuth | undefined {\n\tconst oauth = extension?.oauth ? adaptOAuth(extension.oauth) : base?.auth.oauth;\n\tif (!oauth) return undefined;\n\tconst rawHeaders = configuredHeaders(config, extension);\n\tconst authHeader = extension?.authHeader ?? config?.authHeader ?? false;\n\treturn {\n\t\t...oauth,\n\t\ttoAuth: async (credential) => {\n\t\t\tconst auth = await oauth.toAuth(credential);\n\t\t\tconst env = credential.env;\n\t\t\tconst headers = resolveHeadersOrThrow(\n\t\t\t\trawHeaders,\n\t\t\t\t`provider \"${providerId}\"`,\n\t\t\t\ttypeof env === \"object\" && env !== null ? (env as Record<string, string>) : undefined,\n\t\t\t);\n\t\t\treturn withConfiguredAuth(auth, headers, authHeader);\n\t\t},\n\t};\n}\n\nexport function rawModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): Record<string, string> | undefined {\n\tconst definition = config?.models?.find((entry) => entry.id === model.id);\n\tconst extensionModel = extension?.models?.find((entry) => entry.id === model.id);\n\tconst headers = {\n\t\t...config?.modelOverrides?.[model.id]?.headers,\n\t\t...definition?.headers,\n\t\t...extensionModel?.headers,\n\t};\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type Api, type Model, type Provider, type ProviderHeaders } from "@earendil-works/pi-ai";
1
+ import { type Api, type Model, type Provider, type ProviderHeaders } from "@bastani/pi-ai";
2
2
  import type { ModelConfig, ModelsJsonProvider } from "./model-config.ts";
3
3
  import type { AuthStatus, ProviderConfigInput } from "./provider-composer-internal.ts";
4
4
  export type { AuthStatus, ExtensionOAuthConfig, ProviderConfigInput } from "./provider-composer-internal.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"provider-composer.d.ts","sourceRoot":"","sources":["../../src/core/provider-composer.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,GAAG,EAKR,KAAK,KAAK,EAEV,KAAK,QAAQ,EACb,KAAK,eAAe,EAGpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAkBvF,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,SAAS,EAAE,mBAAmB,GAC5B,IAAI,CAKN;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,QAAQ,CAuFV;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,EAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAMpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,0BAA0B,CAS5B;AAED,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,UAAU,GAAG,SAAS,CAWxB"}
1
+ {"version":3,"file":"provider-composer.d.ts","sourceRoot":"","sources":["../../src/core/provider-composer.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,GAAG,EAKR,KAAK,KAAK,EAEV,KAAK,QAAQ,EACb,KAAK,eAAe,EAGpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAkBvF,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,SAAS,EAAE,mBAAmB,GAC5B,IAAI,CAKN;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,QAAQ,CAuFV;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,EAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAMpC;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,0BAA0B,CAS5B;AAED,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,mBAAmB,GAAG,SAAS,GACxC,UAAU,GAAG,SAAS,CAWxB"}
@@ -1,5 +1,5 @@
1
- import { lazyStream, } from "@earendil-works/pi-ai";
2
- import { getApiProvider } from "@earendil-works/pi-ai/compat";
1
+ import { lazyStream, } from "@bastani/pi-ai";
2
+ import { getApiProvider } from "@bastani/pi-ai/compat";
3
3
  import { applyExtension, applyModelOverride, applyModelsJson, composeApiKeyAuth, composeOAuthAuth, configuredApiKey, configuredHeaders, rawModelHeaders, } from "./provider-composer-internal.js";
4
4
  import { getConfigValueEnvVarNames, isCommandConfigValue, isConfigValueConfigured, resolveHeadersOrThrow, } from "./resolve-config-value.js";
5
5
  export { clearApiKeyCache } from "./provider-composer-internal.js";
@@ -1 +1 @@
1
- {"version":3,"file":"provider-composer.js","sourceRoot":"","sources":["../../src/core/provider-composer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype Credential,\n\tlazyStream,\n\ttype Model,\n\ttype OAuthCredentials,\n\ttype Provider,\n\ttype ProviderHeaders,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { getApiProvider } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelConfig, ModelsJsonProvider } from \"./model-config.ts\";\nimport type { AuthStatus, ProviderConfigInput } from \"./provider-composer-internal.ts\";\nimport {\n\tapplyExtension,\n\tapplyModelOverride,\n\tapplyModelsJson,\n\tcomposeApiKeyAuth,\n\tcomposeOAuthAuth,\n\tconfiguredApiKey,\n\tconfiguredHeaders,\n\trawModelHeaders,\n} from \"./provider-composer-internal.ts\";\nimport {\n\tgetConfigValueEnvVarNames,\n\tisCommandConfigValue,\n\tisConfigValueConfigured,\n\tresolveHeadersOrThrow,\n} from \"./resolve-config-value.ts\";\n\nexport type { AuthStatus, ExtensionOAuthConfig, ProviderConfigInput } from \"./provider-composer-internal.ts\";\nexport { clearApiKeyCache } from \"./provider-composer-internal.ts\";\n\nexport function validateExtensionProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelsConfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput,\n): void {\n\tif (extension.streamSimple && !extension.api) {\n\t\tthrow new Error(`Provider ${providerId}: \"api\" is required when registering streamSimple.`);\n\t}\n\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], modelsConfig), extension);\n}\n\n/** Compose built-in, models.json, and extension layers without reading credentials. */\nexport function composeModelProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelConfig: ModelConfig,\n\textension: ProviderConfigInput | undefined,\n): Provider {\n\tconst config = modelConfig.getProvider(providerId);\n\tlet extensionOAuthCredential: OAuthCredentials | undefined;\n\tlet refreshedExtensionModels: ProviderConfigInput[\"models\"];\n\tconst currentExtension = (): ProviderConfigInput | undefined =>\n\t\textension && refreshedExtensionModels ? { ...extension, models: refreshedExtensionModels } : extension;\n\t// models.json modelOverrides are the topmost user-config layer: they apply once,\n\t// after custom-model upserts, extension model replacement, and legacy OAuth projection.\n\tconst getModels = () => {\n\t\tlet models = applyExtension(\n\t\t\tproviderId,\n\t\t\tapplyModelsJson(providerId, base?.getModels() ?? [], config),\n\t\t\tcurrentExtension(),\n\t\t);\n\t\tif (extensionOAuthCredential && extension?.oauth?.modifyModels) {\n\t\t\tmodels = extension.oauth.modifyModels(models, extensionOAuthCredential);\n\t\t}\n\t\treturn models.map((model) => {\n\t\t\tconst override = config?.modelOverrides?.[model.id];\n\t\t\treturn override ? applyModelOverride(model, override) : model;\n\t\t});\n\t};\n\t// Validate eagerly so registration/reload reports structural errors immediately.\n\tgetModels();\n\tconst apiKey = composeApiKeyAuth(providerId, base, config, extension);\n\tconst oauth = composeOAuthAuth(providerId, base, config, extension);\n\tif (!apiKey && !oauth) throw new Error(`Provider ${providerId}: no authentication method configured.`);\n\n\tconst supportsBaseApi = (model: Model<Api>) => base?.getModels().some((entry) => entry.api === model.api) ?? false;\n\tconst streamWith = (\n\t\tmodel: Model<Api>,\n\t\tcontext: Context,\n\t\toptions: StreamOptions | undefined,\n\t\tsimple: boolean,\n\t): AssistantMessageEventStream =>\n\t\tlazyStream(model, async () => {\n\t\t\tif (extension?.streamSimple && model.api === extension.api) {\n\t\t\t\treturn extension.streamSimple(model, context, options as SimpleStreamOptions);\n\t\t\t}\n\t\t\tif (base && supportsBaseApi(model)) {\n\t\t\t\treturn simple\n\t\t\t\t\t? base.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t\t: base.stream(model, context, options);\n\t\t\t}\n\t\t\tconst api = getApiProvider(model.api);\n\t\t\tif (!api) throw new Error(`No API provider registered for api: ${model.api}`);\n\t\t\treturn simple\n\t\t\t\t? api.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t: api.stream(model, context, options);\n\t\t});\n\n\treturn {\n\t\tid: providerId,\n\t\tname: extension?.name ?? config?.name ?? base?.name ?? extension?.oauth?.name ?? providerId,\n\t\tbaseUrl: extension?.baseUrl ?? config?.baseUrl ?? base?.baseUrl,\n\t\theaders: base?.headers,\n\t\tauth: { ...(apiKey ? { apiKey } : {}), ...(oauth ? { oauth } : {}) },\n\t\tgetModels,\n\t\trefreshModels:\n\t\t\tbase?.refreshModels || extension?.refreshModels || extension?.oauth?.modifyModels\n\t\t\t\t? async (context) => {\n\t\t\t\t\t\tawait base?.refreshModels?.(context);\n\t\t\t\t\t\tlet refreshed: NonNullable<ProviderConfigInput[\"models\"]> | undefined;\n\t\t\t\t\t\tif (extension?.refreshModels) refreshed = await extension.refreshModels(context);\n\t\t\t\t\t\tif (context.signal.aborted) return;\n\t\t\t\t\t\tconst oauthCredential = context.credential?.type === \"oauth\" ? context.credential : undefined;\n\t\t\t\t\t\tawait context.publish({\n\t\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\t\tif (refreshed) {\n\t\t\t\t\t\t\t\t\t// Validate before publishing the new synchronous list.\n\t\t\t\t\t\t\t\t\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], config), {\n\t\t\t\t\t\t\t\t\t\t...extension,\n\t\t\t\t\t\t\t\t\t\tmodels: refreshed,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\trefreshedExtensionModels = refreshed;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\textensionOAuthCredential = oauthCredential;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\tfilterModels: base?.filterModels\n\t\t\t? (models, credential: Credential | undefined) => base.filterModels!(models, credential)\n\t\t\t: undefined,\n\t\tstream: (model, context, options) => streamWith(model, context, options, false),\n\t\tstreamSimple: (model, context, options) => streamWith(model, context, options, true),\n\t};\n}\n\nexport function resolveConfiguredModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n\tenv?: Record<string, string>,\n): Record<string, string> | undefined {\n\treturn resolveHeadersOrThrow(\n\t\trawModelHeaders(model, config, extension),\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t\tenv,\n\t);\n}\n\nexport interface CompatibilityRequestConfig {\n\theaders?: ProviderHeaders;\n\tauthHeader: boolean;\n}\n\nexport function resolveCompatibilityRequestConfig(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): CompatibilityRequestConfig {\n\tconst configured = resolveHeadersOrThrow(\n\t\t{ ...configuredHeaders(config, extension), ...rawModelHeaders(model, config, extension) },\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t);\n\treturn {\n\t\theaders: model.headers || configured ? { ...model.headers, ...configured } : undefined,\n\t\tauthHeader: extension?.authHeader ?? config?.authHeader ?? false,\n\t};\n}\n\nexport function configuredRequestAuthStatus(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): AuthStatus | undefined {\n\tconst value = configuredApiKey(config, extension);\n\tif (value === undefined) return undefined;\n\tif (isCommandConfigValue(value)) return { configured: true, source: \"models_json_command\" };\n\tconst names = getConfigValueEnvVarNames(value);\n\tif (names.length > 0) {\n\t\treturn isConfigValueConfigured(value)\n\t\t\t? { configured: true, source: \"environment\", label: names.join(\", \") }\n\t\t\t: { configured: false };\n\t}\n\treturn { configured: true, source: extension?.apiKey !== undefined ? \"fallback\" : \"models_json_key\" };\n}\n"]}
1
+ {"version":3,"file":"provider-composer.js","sourceRoot":"","sources":["../../src/core/provider-composer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype Credential,\n\tlazyStream,\n\ttype Model,\n\ttype OAuthCredentials,\n\ttype Provider,\n\ttype ProviderHeaders,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n} from \"@bastani/pi-ai\";\nimport { getApiProvider } from \"@bastani/pi-ai/compat\";\nimport type { ModelConfig, ModelsJsonProvider } from \"./model-config.ts\";\nimport type { AuthStatus, ProviderConfigInput } from \"./provider-composer-internal.ts\";\nimport {\n\tapplyExtension,\n\tapplyModelOverride,\n\tapplyModelsJson,\n\tcomposeApiKeyAuth,\n\tcomposeOAuthAuth,\n\tconfiguredApiKey,\n\tconfiguredHeaders,\n\trawModelHeaders,\n} from \"./provider-composer-internal.ts\";\nimport {\n\tgetConfigValueEnvVarNames,\n\tisCommandConfigValue,\n\tisConfigValueConfigured,\n\tresolveHeadersOrThrow,\n} from \"./resolve-config-value.ts\";\n\nexport type { AuthStatus, ExtensionOAuthConfig, ProviderConfigInput } from \"./provider-composer-internal.ts\";\nexport { clearApiKeyCache } from \"./provider-composer-internal.ts\";\n\nexport function validateExtensionProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelsConfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput,\n): void {\n\tif (extension.streamSimple && !extension.api) {\n\t\tthrow new Error(`Provider ${providerId}: \"api\" is required when registering streamSimple.`);\n\t}\n\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], modelsConfig), extension);\n}\n\n/** Compose built-in, models.json, and extension layers without reading credentials. */\nexport function composeModelProvider(\n\tproviderId: string,\n\tbase: Provider | undefined,\n\tmodelConfig: ModelConfig,\n\textension: ProviderConfigInput | undefined,\n): Provider {\n\tconst config = modelConfig.getProvider(providerId);\n\tlet extensionOAuthCredential: OAuthCredentials | undefined;\n\tlet refreshedExtensionModels: ProviderConfigInput[\"models\"];\n\tconst currentExtension = (): ProviderConfigInput | undefined =>\n\t\textension && refreshedExtensionModels ? { ...extension, models: refreshedExtensionModels } : extension;\n\t// models.json modelOverrides are the topmost user-config layer: they apply once,\n\t// after custom-model upserts, extension model replacement, and legacy OAuth projection.\n\tconst getModels = () => {\n\t\tlet models = applyExtension(\n\t\t\tproviderId,\n\t\t\tapplyModelsJson(providerId, base?.getModels() ?? [], config),\n\t\t\tcurrentExtension(),\n\t\t);\n\t\tif (extensionOAuthCredential && extension?.oauth?.modifyModels) {\n\t\t\tmodels = extension.oauth.modifyModels(models, extensionOAuthCredential);\n\t\t}\n\t\treturn models.map((model) => {\n\t\t\tconst override = config?.modelOverrides?.[model.id];\n\t\t\treturn override ? applyModelOverride(model, override) : model;\n\t\t});\n\t};\n\t// Validate eagerly so registration/reload reports structural errors immediately.\n\tgetModels();\n\tconst apiKey = composeApiKeyAuth(providerId, base, config, extension);\n\tconst oauth = composeOAuthAuth(providerId, base, config, extension);\n\tif (!apiKey && !oauth) throw new Error(`Provider ${providerId}: no authentication method configured.`);\n\n\tconst supportsBaseApi = (model: Model<Api>) => base?.getModels().some((entry) => entry.api === model.api) ?? false;\n\tconst streamWith = (\n\t\tmodel: Model<Api>,\n\t\tcontext: Context,\n\t\toptions: StreamOptions | undefined,\n\t\tsimple: boolean,\n\t): AssistantMessageEventStream =>\n\t\tlazyStream(model, async () => {\n\t\t\tif (extension?.streamSimple && model.api === extension.api) {\n\t\t\t\treturn extension.streamSimple(model, context, options as SimpleStreamOptions);\n\t\t\t}\n\t\t\tif (base && supportsBaseApi(model)) {\n\t\t\t\treturn simple\n\t\t\t\t\t? base.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t\t: base.stream(model, context, options);\n\t\t\t}\n\t\t\tconst api = getApiProvider(model.api);\n\t\t\tif (!api) throw new Error(`No API provider registered for api: ${model.api}`);\n\t\t\treturn simple\n\t\t\t\t? api.streamSimple(model, context, options as SimpleStreamOptions)\n\t\t\t\t: api.stream(model, context, options);\n\t\t});\n\n\treturn {\n\t\tid: providerId,\n\t\tname: extension?.name ?? config?.name ?? base?.name ?? extension?.oauth?.name ?? providerId,\n\t\tbaseUrl: extension?.baseUrl ?? config?.baseUrl ?? base?.baseUrl,\n\t\theaders: base?.headers,\n\t\tauth: { ...(apiKey ? { apiKey } : {}), ...(oauth ? { oauth } : {}) },\n\t\tgetModels,\n\t\trefreshModels:\n\t\t\tbase?.refreshModels || extension?.refreshModels || extension?.oauth?.modifyModels\n\t\t\t\t? async (context) => {\n\t\t\t\t\t\tawait base?.refreshModels?.(context);\n\t\t\t\t\t\tlet refreshed: NonNullable<ProviderConfigInput[\"models\"]> | undefined;\n\t\t\t\t\t\tif (extension?.refreshModels) refreshed = await extension.refreshModels(context);\n\t\t\t\t\t\tif (context.signal.aborted) return;\n\t\t\t\t\t\tconst oauthCredential = context.credential?.type === \"oauth\" ? context.credential : undefined;\n\t\t\t\t\t\tawait context.publish({\n\t\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\t\tif (refreshed) {\n\t\t\t\t\t\t\t\t\t// Validate before publishing the new synchronous list.\n\t\t\t\t\t\t\t\t\tapplyExtension(providerId, applyModelsJson(providerId, base?.getModels() ?? [], config), {\n\t\t\t\t\t\t\t\t\t\t...extension,\n\t\t\t\t\t\t\t\t\t\tmodels: refreshed,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\trefreshedExtensionModels = refreshed;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\textensionOAuthCredential = oauthCredential;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\tfilterModels: base?.filterModels\n\t\t\t? (models, credential: Credential | undefined) => base.filterModels!(models, credential)\n\t\t\t: undefined,\n\t\tstream: (model, context, options) => streamWith(model, context, options, false),\n\t\tstreamSimple: (model, context, options) => streamWith(model, context, options, true),\n\t};\n}\n\nexport function resolveConfiguredModelHeaders(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n\tenv?: Record<string, string>,\n): Record<string, string> | undefined {\n\treturn resolveHeadersOrThrow(\n\t\trawModelHeaders(model, config, extension),\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t\tenv,\n\t);\n}\n\nexport interface CompatibilityRequestConfig {\n\theaders?: ProviderHeaders;\n\tauthHeader: boolean;\n}\n\nexport function resolveCompatibilityRequestConfig(\n\tmodel: Model<Api>,\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): CompatibilityRequestConfig {\n\tconst configured = resolveHeadersOrThrow(\n\t\t{ ...configuredHeaders(config, extension), ...rawModelHeaders(model, config, extension) },\n\t\t`model \"${model.provider}/${model.id}\"`,\n\t);\n\treturn {\n\t\theaders: model.headers || configured ? { ...model.headers, ...configured } : undefined,\n\t\tauthHeader: extension?.authHeader ?? config?.authHeader ?? false,\n\t};\n}\n\nexport function configuredRequestAuthStatus(\n\tconfig: ModelsJsonProvider | undefined,\n\textension: ProviderConfigInput | undefined,\n): AuthStatus | undefined {\n\tconst value = configuredApiKey(config, extension);\n\tif (value === undefined) return undefined;\n\tif (isCommandConfigValue(value)) return { configured: true, source: \"models_json_command\" };\n\tconst names = getConfigValueEnvVarNames(value);\n\tif (names.length > 0) {\n\t\treturn isConfigValueConfigured(value)\n\t\t\t? { configured: true, source: \"environment\", label: names.join(\", \") }\n\t\t\t: { configured: false };\n\t}\n\treturn { configured: true, source: extension?.apiKey !== undefined ? \"fallback\" : \"models_json_key\" };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-context-usage.d.ts","sourceRoot":"","sources":["../../src/core/provider-context-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAuC1E;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC/C,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,EAAE,CAqBhB"}
1
+ {"version":3,"file":"provider-context-usage.d.ts","sourceRoot":"","sources":["../../src/core/provider-context-usage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAuC1E;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC/C,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,EAAE,CAqBhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-context-usage.js","sourceRoot":"","sources":["../../src/core/provider-context-usage.ts"],"names":[],"mappings":"AAIA,SAAS,4BAA4B,CAAC,OAAgC;IACrE,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IACC,KAAK,CAAC,IAAI,KAAK,YAAY;YAC1B,KAAK,CAAC,OAA6C,EAAE,QAAQ,KAAK,gBAAgB;YAEnF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,KAAY;IAClC,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,eAAe,CAAC,KAAY;IACpC,MAAM,MAAM,GAAU;QACrB,GAAG,KAAK;QACR,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;IAEF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC/C,QAAwB,EACxB,OAAgC;IAEhC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEpD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC;QAEjD,MAAM,SAAS,GAAG,OAA2B,CAAC;QAC9C,IAAI,SAAS,CAAC,SAAS,GAAG,YAAY,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtC,CAAC","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, Usage } from \"@earendil-works/pi-ai/compat\";\nimport type { CompactionEntry, SessionEntry } from \"./session-manager.ts\";\n\nfunction findLatestCompactionBoundary(entries: readonly SessionEntry[]): CompactionEntry | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (\n\t\t\tentry.type === \"compaction\" &&\n\t\t\t(entry.details as { strategy?: string } | undefined)?.strategy === \"verbatim-lines\"\n\t\t)\n\t\t\treturn entry;\n\t}\n\treturn undefined;\n}\n\nfunction hasTokenUsage(usage: Usage): boolean {\n\treturn usage.input > 0 || usage.output > 0 || usage.cacheRead > 0 || usage.cacheWrite > 0 || usage.totalTokens > 0;\n}\n\nfunction createZeroUsage(usage: Usage): Usage {\n\tconst zeroed: Usage = {\n\t\t...usage,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n\n\tif (usage.cacheWrite1h !== undefined) {\n\t\tzeroed.cacheWrite1h = 0;\n\t}\n\tif (usage.reasoning !== undefined) {\n\t\tzeroed.reasoning = 0;\n\t}\n\n\treturn zeroed;\n}\n\n/**\n * Provider-side token-budget estimators use the last assistant usage in the\n * request context as an anchor. After logical context compaction, retained\n * pre-compaction assistant messages still carry usage from the old, larger\n * context. Scrub only the provider-bound clone so the durable transcript keeps\n * historical billing data while the next request estimates the compacted prompt.\n */\nexport function scrubPreCompactionAssistantUsage(\n\tmessages: AgentMessage[],\n\tentries: readonly SessionEntry[],\n): AgentMessage[] {\n\tconst compactionBoundary = findLatestCompactionBoundary(entries);\n\tif (!compactionBoundary) return messages;\n\n\tconst boundaryTime = Date.parse(compactionBoundary.timestamp);\n\tif (!Number.isFinite(boundaryTime)) return messages;\n\n\tlet changed = false;\n\tconst scrubbed = messages.map((message) => {\n\t\tif (message.role !== \"assistant\") return message;\n\n\t\tconst assistant = message as AssistantMessage;\n\t\tif (assistant.timestamp > boundaryTime || !hasTokenUsage(assistant.usage)) {\n\t\t\treturn message;\n\t\t}\n\n\t\tchanged = true;\n\t\treturn { ...assistant, usage: createZeroUsage(assistant.usage) };\n\t});\n\n\treturn changed ? scrubbed : messages;\n}\n"]}
1
+ {"version":3,"file":"provider-context-usage.js","sourceRoot":"","sources":["../../src/core/provider-context-usage.ts"],"names":[],"mappings":"AAIA,SAAS,4BAA4B,CAAC,OAAgC;IACrE,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IACC,KAAK,CAAC,IAAI,KAAK,YAAY;YAC1B,KAAK,CAAC,OAA6C,EAAE,QAAQ,KAAK,gBAAgB;YAEnF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,KAAY;IAClC,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,eAAe,CAAC,KAAY;IACpC,MAAM,MAAM,GAAU;QACrB,GAAG,KAAK;QACR,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;IAEF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC/C,QAAwB,EACxB,OAAgC;IAEhC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEpD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC;QAEjD,MAAM,SAAS,GAAG,OAA2B,CAAC;QAC9C,IAAI,SAAS,CAAC,SAAS,GAAG,YAAY,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtC,CAAC","sourcesContent":["import type { AssistantMessage, Usage } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionEntry, SessionEntry } from \"./session-manager.ts\";\n\nfunction findLatestCompactionBoundary(entries: readonly SessionEntry[]): CompactionEntry | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (\n\t\t\tentry.type === \"compaction\" &&\n\t\t\t(entry.details as { strategy?: string } | undefined)?.strategy === \"verbatim-lines\"\n\t\t)\n\t\t\treturn entry;\n\t}\n\treturn undefined;\n}\n\nfunction hasTokenUsage(usage: Usage): boolean {\n\treturn usage.input > 0 || usage.output > 0 || usage.cacheRead > 0 || usage.cacheWrite > 0 || usage.totalTokens > 0;\n}\n\nfunction createZeroUsage(usage: Usage): Usage {\n\tconst zeroed: Usage = {\n\t\t...usage,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n\n\tif (usage.cacheWrite1h !== undefined) {\n\t\tzeroed.cacheWrite1h = 0;\n\t}\n\tif (usage.reasoning !== undefined) {\n\t\tzeroed.reasoning = 0;\n\t}\n\n\treturn zeroed;\n}\n\n/**\n * Provider-side token-budget estimators use the last assistant usage in the\n * request context as an anchor. After logical context compaction, retained\n * pre-compaction assistant messages still carry usage from the old, larger\n * context. Scrub only the provider-bound clone so the durable transcript keeps\n * historical billing data while the next request estimates the compacted prompt.\n */\nexport function scrubPreCompactionAssistantUsage(\n\tmessages: AgentMessage[],\n\tentries: readonly SessionEntry[],\n): AgentMessage[] {\n\tconst compactionBoundary = findLatestCompactionBoundary(entries);\n\tif (!compactionBoundary) return messages;\n\n\tconst boundaryTime = Date.parse(compactionBoundary.timestamp);\n\tif (!Number.isFinite(boundaryTime)) return messages;\n\n\tlet changed = false;\n\tconst scrubbed = messages.map((message) => {\n\t\tif (message.role !== \"assistant\") return message;\n\n\t\tconst assistant = message as AssistantMessage;\n\t\tif (assistant.timestamp > boundaryTime || !hasTokenUsage(assistant.usage)) {\n\t\t\treturn message;\n\t\t}\n\n\t\tchanged = true;\n\t\treturn { ...assistant, usage: createZeroUsage(assistant.usage) };\n\t});\n\n\treturn changed ? scrubbed : messages;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Provider } from "@earendil-works/pi-ai";
1
+ import type { Provider } from "@bastani/pi-ai";
2
2
  export declare const REMOTE_CATALOG_REFRESH_INTERVAL_MS: number;
3
3
  /** Add a persisted pi.dev catalog overlay to a static built-in provider. */
4
4
  export declare function withRemoteCatalog(provider: Provider, catalogBaseUrl?: string, localGeneratedAt?: number): Provider;
@@ -1 +1 @@
1
- {"version":3,"file":"remote-catalog-provider.d.ts","sourceRoot":"","sources":["../../src/core/remote-catalog-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMpF,eAAO,MAAM,kCAAkC,QAAqB,CAAC;AAqCrE,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,QAAQ,EAClB,cAAc,GAAE,MAAiC,EACjD,gBAAgB,CAAC,EAAE,MAAM,GACvB,QAAQ,CAuFV"}
1
+ {"version":3,"file":"remote-catalog-provider.d.ts","sourceRoot":"","sources":["../../src/core/remote-catalog-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM7E,eAAO,MAAM,kCAAkC,QAAqB,CAAC;AAqCrE,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,QAAQ,EAClB,cAAc,GAAE,MAAiC,EACjD,gBAAgB,CAAC,EAAE,MAAM,GACvB,QAAQ,CAuFV"}
@@ -1 +1 @@
1
- {"version":3,"file":"remote-catalog-provider.js","sourceRoot":"","sources":["../../src/core/remote-catalog-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, ModelsStoreEntry, Provider } from \"@earendil-works/pi-ai\";\nimport { VERSION } from \"../config.ts\";\nimport { fetchWithRetry } from \"../utils/management-http.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\n\nconst DEFAULT_CATALOG_BASE_URL = \"https://pi.dev\";\nexport const REMOTE_CATALOG_REFRESH_INTERVAL_MS = 4 * 60 * 60 * 1000;\n\nfunction mergeModels(baseline: readonly Model<Api>[], dynamic: readonly Model<Api>[]): Model<Api>[] {\n\tconst merged = [...baseline];\n\tfor (const model of dynamic) {\n\t\tconst index = merged.findIndex((entry) => entry.id === model.id);\n\t\tif (index >= 0) merged[index] = model;\n\t\telse merged.push(model);\n\t}\n\treturn merged;\n}\n\nfunction parseCatalog(providerId: string, value: unknown): Model<Api>[] {\n\tconst entries = Array.isArray(value)\n\t\t? value\n\t\t: typeof value === \"object\" && value !== null && \"models\" in value && Array.isArray(value.models)\n\t\t\t? value.models\n\t\t\t: typeof value === \"object\" && value !== null\n\t\t\t\t? Object.values(value)\n\t\t\t\t: undefined;\n\tif (!entries) throw new Error(`Invalid model catalog for provider \"${providerId}\"`);\n\treturn entries\n\t\t.filter((entry): entry is Model<Api> => typeof entry === \"object\" && entry !== null && \"id\" in entry)\n\t\t.map((model) => ({ ...model, provider: providerId }));\n}\n\nfunction remoteModels(\n\tentry: ModelsStoreEntry | undefined,\n\tlocalGeneratedAt: number | undefined,\n): readonly Model<Api>[] {\n\tif (!entry) return [];\n\tif (localGeneratedAt !== undefined && (entry.lastModified === undefined || entry.lastModified <= localGeneratedAt)) {\n\t\treturn [];\n\t}\n\treturn entry.models;\n}\n\n/** Add a persisted pi.dev catalog overlay to a static built-in provider. */\nexport function withRemoteCatalog(\n\tprovider: Provider,\n\tcatalogBaseUrl: string = DEFAULT_CATALOG_BASE_URL,\n\tlocalGeneratedAt?: number,\n): Provider {\n\tlet dynamicModels: readonly Model<Api>[] = [];\n\n\treturn {\n\t\t...provider,\n\t\tgetModels: () => mergeModels(provider.getModels(), dynamicModels),\n\t\trefreshModels: async (context) => {\n\t\t\t// 0.84.1 hands the snapshot in directly and coalesces concurrent refreshes\n\t\t\t// itself, so the old inflight-promise dedup is gone. Every mutation of\n\t\t\t// dynamicModels now runs inside a generation-checked publish; a false return\n\t\t\t// means a newer refresh already superseded this pass, so it must not continue.\n\t\t\tconst stored = context.stored;\n\t\t\tconst restored = remoteModels(stored, localGeneratedAt).filter((model) => model.provider === provider.id);\n\t\t\tif (\n\t\t\t\t!(await context.publish({\n\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\tdynamicModels = restored;\n\t\t\t\t\t},\n\t\t\t\t}))\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.signal.aborted) return;\n\t\t\tif (\n\t\t\t\t!context.force &&\n\t\t\t\tstored?.checkedAt !== undefined &&\n\t\t\t\tstored.lastModified !== undefined &&\n\t\t\t\tDate.now() - stored.checkedAt < REMOTE_CATALOG_REFRESH_INTERVAL_MS\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only revalidate when a cached body backs the validator, so a 304 can never\n\t\t\t// leave the overlay empty.\n\t\t\tconst validator = stored?.models.length ? stored.etag : undefined;\n\t\t\tconst url = new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`, catalogBaseUrl);\n\t\t\tconst response = await fetchWithRetry(url, {\n\t\t\t\theaders: {\n\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\"User-Agent\": getPiUserAgent(VERSION),\n\t\t\t\t\t...(validator ? { \"if-none-match\": validator } : {}),\n\t\t\t\t},\n\t\t\t\tsignal: context.signal,\n\t\t\t});\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst checkedAt = Date.now();\n\t\t\t// Unchanged: dynamicModels already holds the stored overlay, so only the\n\t\t\t// freshness window moves.\n\t\t\tif (response.status === 304 && stored) {\n\t\t\t\tawait context.publish({ persist: { ...stored, checkedAt } });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (response.status === 404 || response.status === 501) {\n\t\t\t\tawait context.publish({\n\t\t\t\t\tpersist: {\n\t\t\t\t\t\t...(stored ?? { models: [] }),\n\t\t\t\t\t\tcheckedAt,\n\t\t\t\t\t\tlastModified: 0,\n\t\t\t\t\t\tetag: undefined,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!response.ok) {\n\t\t\t\t// Transient failure: the cached body and its validator stay valid, so keep the\n\t\t\t\t// etag and let the next refresh revalidate instead of downloading the catalog.\n\t\t\t\tawait context.publish({ persist: { ...(stored ?? { models: [] }), checkedAt } });\n\t\t\t\tthrow new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);\n\t\t\t}\n\t\t\tconst refreshed = parseCatalog(provider.id, await response.json());\n\t\t\tconst lastModified = Date.parse(response.headers.get(\"last-modified\") ?? \"\");\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst entry = {\n\t\t\t\tmodels: refreshed,\n\t\t\t\tcheckedAt,\n\t\t\t\tlastModified: Number.isNaN(lastModified) ? 0 : lastModified,\n\t\t\t\tetag: response.headers.get(\"etag\") ?? undefined,\n\t\t\t};\n\t\t\tconst published = remoteModels(entry, localGeneratedAt);\n\t\t\tawait context.publish({\n\t\t\t\tpersist: entry,\n\t\t\t\tupdate: () => {\n\t\t\t\t\tdynamicModels = published;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"remote-catalog-provider.js","sourceRoot":"","sources":["../../src/core/remote-catalog-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model, ModelsStoreEntry, Provider } from \"@bastani/pi-ai\";\nimport { VERSION } from \"../config.ts\";\nimport { fetchWithRetry } from \"../utils/management-http.ts\";\nimport { getPiUserAgent } from \"../utils/pi-user-agent.ts\";\n\nconst DEFAULT_CATALOG_BASE_URL = \"https://pi.dev\";\nexport const REMOTE_CATALOG_REFRESH_INTERVAL_MS = 4 * 60 * 60 * 1000;\n\nfunction mergeModels(baseline: readonly Model<Api>[], dynamic: readonly Model<Api>[]): Model<Api>[] {\n\tconst merged = [...baseline];\n\tfor (const model of dynamic) {\n\t\tconst index = merged.findIndex((entry) => entry.id === model.id);\n\t\tif (index >= 0) merged[index] = model;\n\t\telse merged.push(model);\n\t}\n\treturn merged;\n}\n\nfunction parseCatalog(providerId: string, value: unknown): Model<Api>[] {\n\tconst entries = Array.isArray(value)\n\t\t? value\n\t\t: typeof value === \"object\" && value !== null && \"models\" in value && Array.isArray(value.models)\n\t\t\t? value.models\n\t\t\t: typeof value === \"object\" && value !== null\n\t\t\t\t? Object.values(value)\n\t\t\t\t: undefined;\n\tif (!entries) throw new Error(`Invalid model catalog for provider \"${providerId}\"`);\n\treturn entries\n\t\t.filter((entry): entry is Model<Api> => typeof entry === \"object\" && entry !== null && \"id\" in entry)\n\t\t.map((model) => ({ ...model, provider: providerId }));\n}\n\nfunction remoteModels(\n\tentry: ModelsStoreEntry | undefined,\n\tlocalGeneratedAt: number | undefined,\n): readonly Model<Api>[] {\n\tif (!entry) return [];\n\tif (localGeneratedAt !== undefined && (entry.lastModified === undefined || entry.lastModified <= localGeneratedAt)) {\n\t\treturn [];\n\t}\n\treturn entry.models;\n}\n\n/** Add a persisted pi.dev catalog overlay to a static built-in provider. */\nexport function withRemoteCatalog(\n\tprovider: Provider,\n\tcatalogBaseUrl: string = DEFAULT_CATALOG_BASE_URL,\n\tlocalGeneratedAt?: number,\n): Provider {\n\tlet dynamicModels: readonly Model<Api>[] = [];\n\n\treturn {\n\t\t...provider,\n\t\tgetModels: () => mergeModels(provider.getModels(), dynamicModels),\n\t\trefreshModels: async (context) => {\n\t\t\t// 0.84.1 hands the snapshot in directly and coalesces concurrent refreshes\n\t\t\t// itself, so the old inflight-promise dedup is gone. Every mutation of\n\t\t\t// dynamicModels now runs inside a generation-checked publish; a false return\n\t\t\t// means a newer refresh already superseded this pass, so it must not continue.\n\t\t\tconst stored = context.stored;\n\t\t\tconst restored = remoteModels(stored, localGeneratedAt).filter((model) => model.provider === provider.id);\n\t\t\tif (\n\t\t\t\t!(await context.publish({\n\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\tdynamicModels = restored;\n\t\t\t\t\t},\n\t\t\t\t}))\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.signal.aborted) return;\n\t\t\tif (\n\t\t\t\t!context.force &&\n\t\t\t\tstored?.checkedAt !== undefined &&\n\t\t\t\tstored.lastModified !== undefined &&\n\t\t\t\tDate.now() - stored.checkedAt < REMOTE_CATALOG_REFRESH_INTERVAL_MS\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only revalidate when a cached body backs the validator, so a 304 can never\n\t\t\t// leave the overlay empty.\n\t\t\tconst validator = stored?.models.length ? stored.etag : undefined;\n\t\t\tconst url = new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`, catalogBaseUrl);\n\t\t\tconst response = await fetchWithRetry(url, {\n\t\t\t\theaders: {\n\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\"User-Agent\": getPiUserAgent(VERSION),\n\t\t\t\t\t...(validator ? { \"if-none-match\": validator } : {}),\n\t\t\t\t},\n\t\t\t\tsignal: context.signal,\n\t\t\t});\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst checkedAt = Date.now();\n\t\t\t// Unchanged: dynamicModels already holds the stored overlay, so only the\n\t\t\t// freshness window moves.\n\t\t\tif (response.status === 304 && stored) {\n\t\t\t\tawait context.publish({ persist: { ...stored, checkedAt } });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (response.status === 404 || response.status === 501) {\n\t\t\t\tawait context.publish({\n\t\t\t\t\tpersist: {\n\t\t\t\t\t\t...(stored ?? { models: [] }),\n\t\t\t\t\t\tcheckedAt,\n\t\t\t\t\t\tlastModified: 0,\n\t\t\t\t\t\tetag: undefined,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!response.ok) {\n\t\t\t\t// Transient failure: the cached body and its validator stay valid, so keep the\n\t\t\t\t// etag and let the next refresh revalidate instead of downloading the catalog.\n\t\t\t\tawait context.publish({ persist: { ...(stored ?? { models: [] }), checkedAt } });\n\t\t\t\tthrow new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);\n\t\t\t}\n\t\t\tconst refreshed = parseCatalog(provider.id, await response.json());\n\t\t\tconst lastModified = Date.parse(response.headers.get(\"last-modified\") ?? \"\");\n\t\t\tif (context.signal.aborted) return;\n\t\t\tconst entry = {\n\t\t\t\tmodels: refreshed,\n\t\t\t\tcheckedAt,\n\t\t\t\tlastModified: Number.isNaN(lastModified) ? 0 : lastModified,\n\t\t\t\tetag: response.headers.get(\"etag\") ?? undefined,\n\t\t\t};\n\t\t\tconst published = remoteModels(entry, localGeneratedAt);\n\t\t\tawait context.publish({\n\t\t\t\tpersist: entry,\n\t\t\t\tupdate: () => {\n\t\t\t\t\tdynamicModels = published;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { AuthOperationOptions, Credential, CredentialInfo, CredentialStore } from "@earendil-works/pi-ai";
1
+ import type { AuthOperationOptions, Credential, CredentialInfo, CredentialStore } from "@bastani/pi-ai";
2
2
  /** Async credential store overlay for non-persistent runtime API keys. */
3
3
  export declare class RuntimeCredentials implements CredentialStore {
4
4
  private readonly store;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-credentials.d.ts","sourceRoot":"","sources":["../../src/core/runtime-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAW/G,0EAA0E;AAC1E,qBAAa,kBAAmB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,YAAY,KAAK,EAAE,eAAe,EAEjC;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzD;IAED,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE5C;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5C;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEK,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG9F;IAEK,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAM7E;IAED,MAAM,CACL,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EACxE,OAAO,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjC;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;CACD"}
1
+ {"version":3,"file":"runtime-credentials.d.ts","sourceRoot":"","sources":["../../src/core/runtime-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAWxG,0EAA0E;AAC1E,qBAAa,kBAAmB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,YAAY,KAAK,EAAE,eAAe,EAEjC;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzD;IAED,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE5C;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5C;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEK,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG9F;IAEK,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAM7E;IAED,MAAM,CACL,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EACxE,OAAO,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjC;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-credentials.js","sourceRoot":"","sources":["../../src/core/runtime-credentials.ts"],"names":[],"mappings":"AAMA,SAAS,kBAAkB,CAAC,KAAsB;IACjD,MAAM,UAAU,GAAG,KAA6D,CAAC;IACjF,OAAO,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,UAAwC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxG,CAAC;AAED,0EAA0E;AAC1E,MAAM,OAAO,kBAAkB;IAI9B,YAAY,KAAsB;QAFjB,cAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAGtD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,gBAAgB,CAAC,UAAkB,EAAE,MAAc;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,mBAAmB,CAAC,UAAkB;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,OAA8B;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA8B;QACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACpG,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CACL,UAAkB,EAClB,EAAwE,EACxE,OAA8B;QAE9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,OAA8B;QAC9D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACD","sourcesContent":["import type { AuthOperationOptions, Credential, CredentialInfo, CredentialStore } from \"@earendil-works/pi-ai\";\n\ninterface ReloadableCredentialStore {\n\treload(): void | Promise<void>;\n}\n\nfunction getReloadableStore(store: CredentialStore): ReloadableCredentialStore | undefined {\n\tconst reloadable = store as CredentialStore & Partial<ReloadableCredentialStore>;\n\treturn typeof reloadable.reload === \"function\" ? (reloadable as ReloadableCredentialStore) : undefined;\n}\n\n/** Async credential store overlay for non-persistent runtime API keys. */\nexport class RuntimeCredentials implements CredentialStore {\n\tprivate readonly store: CredentialStore;\n\tprivate readonly overrides = new Map<string, string>();\n\n\tconstructor(store: CredentialStore) {\n\t\tthis.store = store;\n\t}\n\n\tsetRuntimeApiKey(providerId: string, apiKey: string): void {\n\t\tthis.overrides.set(providerId, apiKey);\n\t}\n\n\tremoveRuntimeApiKey(providerId: string): void {\n\t\tthis.overrides.delete(providerId);\n\t}\n\n\thasRuntimeApiKey(providerId: string): boolean {\n\t\treturn this.overrides.has(providerId);\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait getReloadableStore(this.store)?.reload();\n\t}\n\n\tasync read(providerId: string, options?: AuthOperationOptions): Promise<Credential | undefined> {\n\t\tconst override = this.overrides.get(providerId);\n\t\treturn override ? { type: \"api_key\", key: override } : this.store.read(providerId, options);\n\t}\n\n\tasync list(options?: AuthOperationOptions): Promise<readonly CredentialInfo[]> {\n\t\tconst entries = new Map((await this.store.list(options)).map((entry) => [entry.providerId, entry]));\n\t\tfor (const providerId of this.overrides.keys()) {\n\t\t\tentries.set(providerId, { providerId, type: \"api_key\" });\n\t\t}\n\t\treturn [...entries.values()];\n\t}\n\n\tmodify(\n\t\tproviderId: string,\n\t\tfn: (current: Credential | undefined) => Promise<Credential | undefined>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<Credential | undefined> {\n\t\treturn this.store.modify(providerId, fn, options);\n\t}\n\n\tasync delete(providerId: string, options?: AuthOperationOptions): Promise<void> {\n\t\tthis.overrides.delete(providerId);\n\t\tawait this.store.delete(providerId, options);\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime-credentials.js","sourceRoot":"","sources":["../../src/core/runtime-credentials.ts"],"names":[],"mappings":"AAMA,SAAS,kBAAkB,CAAC,KAAsB;IACjD,MAAM,UAAU,GAAG,KAA6D,CAAC;IACjF,OAAO,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,UAAwC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxG,CAAC;AAED,0EAA0E;AAC1E,MAAM,OAAO,kBAAkB;IAI9B,YAAY,KAAsB;QAFjB,cAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAGtD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,gBAAgB,CAAC,UAAkB,EAAE,MAAc;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,mBAAmB,CAAC,UAAkB;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,OAA8B;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA8B;QACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACpG,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CACL,UAAkB,EAClB,EAAwE,EACxE,OAA8B;QAE9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,OAA8B;QAC9D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACD","sourcesContent":["import type { AuthOperationOptions, Credential, CredentialInfo, CredentialStore } from \"@bastani/pi-ai\";\n\ninterface ReloadableCredentialStore {\n\treload(): void | Promise<void>;\n}\n\nfunction getReloadableStore(store: CredentialStore): ReloadableCredentialStore | undefined {\n\tconst reloadable = store as CredentialStore & Partial<ReloadableCredentialStore>;\n\treturn typeof reloadable.reload === \"function\" ? (reloadable as ReloadableCredentialStore) : undefined;\n}\n\n/** Async credential store overlay for non-persistent runtime API keys. */\nexport class RuntimeCredentials implements CredentialStore {\n\tprivate readonly store: CredentialStore;\n\tprivate readonly overrides = new Map<string, string>();\n\n\tconstructor(store: CredentialStore) {\n\t\tthis.store = store;\n\t}\n\n\tsetRuntimeApiKey(providerId: string, apiKey: string): void {\n\t\tthis.overrides.set(providerId, apiKey);\n\t}\n\n\tremoveRuntimeApiKey(providerId: string): void {\n\t\tthis.overrides.delete(providerId);\n\t}\n\n\thasRuntimeApiKey(providerId: string): boolean {\n\t\treturn this.overrides.has(providerId);\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait getReloadableStore(this.store)?.reload();\n\t}\n\n\tasync read(providerId: string, options?: AuthOperationOptions): Promise<Credential | undefined> {\n\t\tconst override = this.overrides.get(providerId);\n\t\treturn override ? { type: \"api_key\", key: override } : this.store.read(providerId, options);\n\t}\n\n\tasync list(options?: AuthOperationOptions): Promise<readonly CredentialInfo[]> {\n\t\tconst entries = new Map((await this.store.list(options)).map((entry) => [entry.providerId, entry]));\n\t\tfor (const providerId of this.overrides.keys()) {\n\t\t\tentries.set(providerId, { providerId, type: \"api_key\" });\n\t\t}\n\t\treturn [...entries.values()];\n\t}\n\n\tmodify(\n\t\tproviderId: string,\n\t\tfn: (current: Credential | undefined) => Promise<Credential | undefined>,\n\t\toptions?: AuthOperationOptions,\n\t): Promise<Credential | undefined> {\n\t\treturn this.store.modify(providerId, fn, options);\n\t}\n\n\tasync delete(providerId: string, options?: AuthOperationOptions): Promise<void> {\n\t\tthis.overrides.delete(providerId);\n\t\tawait this.store.delete(providerId, options);\n\t}\n}\n"]}
@@ -1,5 +1,5 @@
1
+ import type { Api, Model } from "@bastani/pi-ai/compat";
1
2
  import type { AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
2
- import type { Api, Model } from "@earendil-works/pi-ai/compat";
3
3
  import type { AgentSession } from "./agent-session.ts";
4
4
  import type { LoadExtensionsResult, OrchestrationContext, SessionStartEvent, SubagentChildPolicy, ToolDefinition } from "./extensions/index.ts";
5
5
  import type { ModelFallbackReason } from "./model-resolver-types.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-types.d.ts","sourceRoot":"","sources":["../../src/core/sdk-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EACX,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,yBAAyB;IACzC,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oFAAoF;IACpF,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,iEAAiE;IACjE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gEAAgE;IAChE,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAE3E;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gEAAgE;IAChE,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,oEAAoE;IACpE,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,gEAAgE;IAChE,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,kFAAkF;IAClF,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,gFAAgF;IAChF,uBAAuB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAC;CACvE;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACxC,0BAA0B;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,mEAAmE;IACnE,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC1C"}
1
+ {"version":3,"file":"sdk-types.d.ts","sourceRoot":"","sources":["../../src/core/sdk-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EACX,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,yBAAyB;IACzC,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oFAAoF;IACpF,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,iEAAiE;IACjE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gEAAgE;IAChE,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAE3E;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gEAAgE;IAChE,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,oEAAoE;IACpE,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,gEAAgE;IAChE,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,kFAAkF;IAClF,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,gFAAgF;IAChF,uBAAuB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAC;CACvE;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACxC,0BAA0B;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,mEAAmE;IACnE,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC1C"}