@code-yeongyu/senpi 2026.10.25-4 → 2026.10.26-1

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 (198) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/bundle/chunks/{anthropic-messages-WBASBTIW.js → anthropic-messages-M235FJQV.js} +3 -3
  3. package/dist/bundle/chunks/{args-B444OQBK.js → args-FBNJOJSR.js} +1 -1
  4. package/dist/bundle/chunks/azure-openai-responses-YQRTQ7H6.js +2 -0
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +3 -3
  6. package/dist/bundle/chunks/{chunk-4MOZXOJX.js → chunk-3A3XCLNH.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-E6D4RIT7.js → chunk-3LPWILUZ.js} +2 -2
  8. package/dist/bundle/chunks/{chunk-3BTN337S.js → chunk-3WP5RFQR.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-2RB5EL4X.js → chunk-5FQMNHXV.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-STMXIBXF.js → chunk-5KZH6EYQ.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-4P7WARQZ.js → chunk-5LWUUXMH.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-5JJDR6XI.js → chunk-6U3TBFBA.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-BWA4FVFW.js → chunk-7KOUQSBX.js} +2 -2
  14. package/dist/bundle/chunks/{chunk-7CNOCJCN.js → chunk-ADQAPDPV.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-ITGYN22E.js → chunk-CDQPA4FP.js} +1 -1
  16. package/dist/bundle/chunks/{chunk-WDPQ6CZJ.js → chunk-DMFAVE5N.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-XF3LJC3O.js → chunk-DYWIFF2Q.js} +1 -1
  18. package/dist/bundle/chunks/{chunk-C2MQ4QXN.js → chunk-EZP6AYW2.js} +35 -29
  19. package/dist/bundle/chunks/chunk-GQJYNFMO.js +2 -0
  20. package/dist/bundle/chunks/{chunk-SBGIXMX3.js → chunk-GWGNVYPB.js} +1 -1
  21. package/dist/bundle/chunks/{chunk-KKD4CYCI.js → chunk-H4WJ4LY3.js} +1 -1
  22. package/dist/bundle/chunks/{chunk-V2UYXTRR.js → chunk-HWTD4QF3.js} +1 -1
  23. package/dist/bundle/chunks/{chunk-WD6WBYC5.js → chunk-I7QWTWVZ.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-BZ7726QO.js → chunk-J2YAYTB2.js} +1 -1
  25. package/dist/bundle/chunks/{chunk-TTU2RNVX.js → chunk-J5FCH7TI.js} +1 -1
  26. package/dist/bundle/chunks/chunk-JFQUWEN7.js +13 -0
  27. package/dist/bundle/chunks/{chunk-KNVNKDER.js → chunk-L2O6K3SJ.js} +1 -1
  28. package/dist/bundle/chunks/{chunk-4AOMNOGY.js → chunk-LO5MYLGF.js} +1 -1
  29. package/dist/bundle/chunks/{chunk-N7IN46Q5.js → chunk-MSHRIZGT.js} +8 -6
  30. package/dist/bundle/chunks/{chunk-T36LJ6MW.js → chunk-MY4ZD3EW.js} +1 -1
  31. package/dist/bundle/chunks/{chunk-UFJ2K7Q7.js → chunk-OQ3WDMB3.js} +1 -1
  32. package/dist/bundle/chunks/{chunk-7GZUFOM3.js → chunk-PH3JDRB2.js} +1 -1
  33. package/dist/bundle/chunks/{chunk-E6WYH3ZL.js → chunk-QREKAXKX.js} +7 -5
  34. package/dist/bundle/chunks/{chunk-3QCYBOKN.js → chunk-QYFOHFPS.js} +1 -1
  35. package/dist/bundle/chunks/{chunk-JMOUU75H.js → chunk-SOXQ42VS.js} +1 -1
  36. package/dist/bundle/chunks/{chunk-FHXR4ZAC.js → chunk-UDM7VO6O.js} +1 -1
  37. package/dist/bundle/chunks/{chunk-OLCDIITS.js → chunk-UW6M3EXY.js} +1 -1
  38. package/dist/bundle/chunks/chunk-VICDRG3J.js +410 -0
  39. package/dist/bundle/chunks/chunk-VL7O5PO4.js +5 -0
  40. package/dist/bundle/chunks/{chunk-PT6JJUN2.js → chunk-XMNPK472.js} +1 -1
  41. package/dist/bundle/chunks/{chunk-GSSD3R5X.js → chunk-XQ45JMGN.js} +1 -1
  42. package/dist/bundle/chunks/{client-WTYEICLH.js → chunk-Y3TMJV3J.js} +3 -3
  43. package/dist/bundle/chunks/{chunk-KXB5WIS5.js → chunk-Z6SAQ5O3.js} +1 -1
  44. package/dist/bundle/chunks/{chunk-LOIF6PHI.js → chunk-ZAUVY6ZC.js} +3 -3
  45. package/dist/bundle/chunks/{chunk-E4LBKOZG.js → chunk-ZLIVZQDY.js} +4 -4
  46. package/dist/bundle/chunks/{chunk-6AOVUTUR.js → chunk-ZXHLH4MW.js} +2 -2
  47. package/dist/bundle/chunks/cli-main-55EQA5PS.js +3 -0
  48. package/dist/bundle/chunks/client-LOS6GSEW.js +2 -0
  49. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-K5H6BJP3.js → cloudflare-workers-ai-system-one-ZJQGIIRC.js} +1 -1
  50. package/dist/bundle/chunks/cursor-agent.js +3 -3
  51. package/dist/bundle/chunks/devin-agent.js +3 -3
  52. package/dist/bundle/chunks/dispatch-C2IBP5VV.js +9 -0
  53. package/dist/bundle/chunks/google-generative-ai-5G4RIQA6.js +2 -0
  54. package/dist/bundle/chunks/google-vertex-ALD4P27O.js +2 -0
  55. package/dist/bundle/chunks/{help-fast-path-3Z26DQSV.js → help-fast-path-PEIKGCKZ.js} +1 -1
  56. package/dist/bundle/chunks/host-command-657VCQ34.js +2 -0
  57. package/dist/bundle/chunks/{host-lifecycle-3VHHIGDL.js → host-lifecycle-HX3EGRRW.js} +1 -1
  58. package/dist/bundle/chunks/host-lifecycle.js +2 -2
  59. package/dist/bundle/chunks/{host-session-command-56XF6ACS.js → host-session-command-OV5XDOJK.js} +1 -1
  60. package/dist/bundle/chunks/{host-socket-request-QL2WEZTN.js → host-socket-request-K4LCUOUD.js} +1 -1
  61. package/dist/bundle/chunks/interactive-mode-MLXSYK2H.js +2 -0
  62. package/dist/bundle/chunks/{mcp-presenter-bootstrap-XUSCQVRC.js → mcp-presenter-bootstrap-FOMKF4TU.js} +1 -1
  63. package/dist/bundle/chunks/{mistral-conversations-DH44NOYV.js → mistral-conversations-RAE4K2XY.js} +1 -1
  64. package/dist/bundle/chunks/{multi-session-host-Z2CW4SDM.js → multi-session-host-774MACJU.js} +5 -6
  65. package/dist/bundle/chunks/{openai-codex-responses-SERAFKAS.js → openai-codex-responses-3CW4R7TG.js} +1 -1
  66. package/dist/bundle/chunks/{openai-completions-BZB5O45A.js → openai-completions-5UIJXQUF.js} +1 -1
  67. package/dist/bundle/chunks/openai-responses-2BO44MRW.js +3 -0
  68. package/dist/bundle/chunks/{package-manager-cli-N55U6PEO.js → package-manager-cli-MZHVCX2S.js} +1 -1
  69. package/dist/bundle/chunks/{pi-messages-VXATX45B.js → pi-messages-RF6GER4R.js} +2 -2
  70. package/dist/bundle/chunks/{role-JVSBNKGE.js → role-ETSFSDTS.js} +1 -1
  71. package/dist/bundle/chunks/{rotation-stream-CBGCBYHV.js → rotation-stream-ZMQB4GPO.js} +1 -1
  72. package/dist/bundle/chunks/rpc-mode-UJXOIZCW.js +2 -0
  73. package/dist/bundle/chunks/{rpc-monitor-source-AE3C6EQV.js → rpc-monitor-source-DRZXJHTL.js} +1 -1
  74. package/dist/bundle/chunks/{schedule-command-VS7CZC2J.js → schedule-command-KA7LFFNK.js} +1 -1
  75. package/dist/bundle/chunks/session-control-endpoint-MFWXUR7Z.js +3 -0
  76. package/dist/bundle/chunks/{session-picker-E4KUJDLO.js → session-picker-BP33NRSL.js} +1 -1
  77. package/dist/bundle/chunks/session-worker.js +199 -190
  78. package/dist/bundle/chunks/{typesafe-system-one-P75WJ767.js → typesafe-system-one-GNNZ5O5U.js} +1 -1
  79. package/dist/bundle/cli.js +2 -2
  80. package/dist/bundle/host-supervisor.js +2 -2
  81. package/dist/bundle/index.js +1 -1
  82. package/dist/bundle/rpc-entry.js +1 -1
  83. package/dist/bundle/runtime-manifest.json +1 -1
  84. package/dist/cli/host-command-args.d.ts +1 -0
  85. package/dist/cli/host-command-args.js +5 -0
  86. package/dist/cli/host-command.js +7 -1
  87. package/dist/cli.js +21 -3
  88. package/dist/core/extensions/builtin/mcp/catalog-cache.d.ts +2 -1
  89. package/dist/core/extensions/builtin/mcp/catalog-cache.js +19 -6
  90. package/dist/core/extensions/builtin/mcp/catalog.d.ts +3 -2
  91. package/dist/core/extensions/builtin/mcp/catalog.js +20 -3
  92. package/dist/core/extensions/builtin/mcp/expose/call.d.ts +2 -1
  93. package/dist/core/extensions/builtin/mcp/expose/call.js +2 -1
  94. package/dist/core/extensions/builtin/mcp/expose/register.js +1 -1
  95. package/dist/core/extensions/builtin/mcp/expose/schema-compat.d.ts +2 -2
  96. package/dist/core/extensions/builtin/mcp/expose/schema-compat.js +11 -1
  97. package/dist/core/extensions/builtin/mcp/invocation.js +16 -2
  98. package/dist/core/extensions/builtin/mcp/modern/request.d.ts +1 -1
  99. package/dist/core/extensions/builtin/mcp/modern/request.js +1 -1
  100. package/dist/core/extensions/builtin/mcp/modern/sdk-bridge.js +18 -3
  101. package/dist/core/extensions/builtin/mcp/modern/stdio-probe.js +23 -0
  102. package/dist/core/extensions/builtin/mcp/modern/subscriptions.d.ts +14 -0
  103. package/dist/core/extensions/builtin/mcp/modern/subscriptions.js +226 -0
  104. package/dist/core/extensions/builtin/mcp/modern/tool-schema.d.ts +13 -0
  105. package/dist/core/extensions/builtin/mcp/modern/tool-schema.js +75 -0
  106. package/dist/core/extensions/builtin/mcp/modern/tools.d.ts +107 -0
  107. package/dist/core/extensions/builtin/mcp/modern/tools.js +53 -0
  108. package/dist/core/extensions/builtin/mcp/resources.js +4 -0
  109. package/dist/core/extensions/builtin/mcp/tool-client.d.ts +13 -0
  110. package/dist/core/extensions/builtin/mcp/tool-client.js +17 -0
  111. package/dist/core/extensions/builtin/mcp/tool-contracts.d.ts +19 -0
  112. package/dist/core/extensions/builtin/mcp/tool-contracts.js +2 -0
  113. package/dist/core/extensions/builtin/mcp/wrap.js +2 -2
  114. package/dist/core/extensions/builtin/permission-system/bash-command-segments.d.ts +37 -0
  115. package/dist/core/extensions/builtin/permission-system/bash-command-segments.js +899 -0
  116. package/dist/core/extensions/builtin/permission-system/parsers.d.ts +2 -0
  117. package/dist/core/extensions/builtin/permission-system/parsers.js +44 -10
  118. package/dist/modes/interactive/session-control-commands.js +21 -4
  119. package/dist/modes/interactive/session-control-rpc-commands.d.ts +1 -1
  120. package/dist/modes/interactive/session-control-rpc-commands.js +19 -0
  121. package/dist/modes/rpc/compact-content-store.d.ts +96 -0
  122. package/dist/modes/rpc/compact-content-store.js +269 -0
  123. package/dist/modes/rpc/compact-session-state.d.ts +111 -0
  124. package/dist/modes/rpc/compact-session-state.js +206 -0
  125. package/dist/modes/rpc/compact-spool-dir.d.ts +5 -0
  126. package/dist/modes/rpc/compact-spool-dir.js +61 -0
  127. package/dist/modes/rpc/compact-storage-io.d.ts +27 -0
  128. package/dist/modes/rpc/compact-storage-io.js +19 -0
  129. package/dist/modes/rpc/connection-handler.d.ts +2 -0
  130. package/dist/modes/rpc/connection-handler.js +39 -7
  131. package/dist/modes/rpc/connection-question-bridge.d.ts +2 -1
  132. package/dist/modes/rpc/connection-question-bridge.js +6 -2
  133. package/dist/modes/rpc/extension-ui-response.d.ts +7 -2
  134. package/dist/modes/rpc/extension-ui-response.js +27 -7
  135. package/dist/modes/rpc/get-snapshot.d.ts +18 -0
  136. package/dist/modes/rpc/get-snapshot.js +43 -0
  137. package/dist/modes/rpc/host-capabilities.js +3 -0
  138. package/dist/modes/rpc/host-ensure-start.js +1 -0
  139. package/dist/modes/rpc/host-ensure-types.d.ts +2 -0
  140. package/dist/modes/rpc/host-ensure.js +1 -0
  141. package/dist/modes/rpc/host-handoff.d.ts +2 -0
  142. package/dist/modes/rpc/host-handover-request.d.ts +1 -1
  143. package/dist/modes/rpc/host-handover-request.js +4 -3
  144. package/dist/modes/rpc/host-handover-wire.js +6 -0
  145. package/dist/modes/rpc/host-idle-handover.d.ts +2 -0
  146. package/dist/modes/rpc/host-idle-handover.js +3 -1
  147. package/dist/modes/rpc/host-observe-request.js +1 -0
  148. package/dist/modes/rpc/host-runner.d.ts +1 -0
  149. package/dist/modes/rpc/host-runner.js +9 -7
  150. package/dist/modes/rpc/host-successor.js +4 -0
  151. package/dist/modes/rpc/json-normal-value.d.ts +6 -0
  152. package/dist/modes/rpc/json-normal-value.js +100 -0
  153. package/dist/modes/rpc/mcp-presenter-bootstrap.js +5 -0
  154. package/dist/modes/rpc/media-placeholders.d.ts +9 -3
  155. package/dist/modes/rpc/media-placeholders.js +12 -4
  156. package/dist/modes/rpc/rpc-host-command-types.d.ts +2 -0
  157. package/dist/modes/rpc/rpc-question-types.d.ts +1 -0
  158. package/dist/modes/rpc/rpc-read-response-types.d.ts +7 -0
  159. package/dist/modes/rpc/rpc-session-command-types.d.ts +6 -0
  160. package/dist/modes/rpc/rpc-session-state-types.d.ts +3 -0
  161. package/dist/modes/rpc/rpc-session-state.js +2 -0
  162. package/dist/modes/rpc/rpc-types.d.ts +1 -0
  163. package/dist/modes/rpc/session-attachment-gate.js +1 -0
  164. package/dist/modes/rpc/session-binding.js +21 -18
  165. package/dist/modes/rpc/session-command-activity.js +1 -0
  166. package/dist/modes/rpc/session-event-fanout.d.ts +1 -1
  167. package/dist/modes/rpc/session-event-fanout.js +17 -9
  168. package/dist/modes/rpc/session-event-writer.js +22 -5
  169. package/dist/modes/rpc/session-extension-ui-requests.d.ts +2 -1
  170. package/dist/modes/rpc/session-extension-ui-requests.js +15 -10
  171. package/dist/modes/rpc/session-held.js +1 -0
  172. package/dist/modes/rpc/session-status-stream.d.ts +2 -1
  173. package/dist/modes/rpc/session-status-stream.js +8 -2
  174. package/dist/modes/rpc/session-status-subscriptions.d.ts +2 -1
  175. package/dist/modes/rpc/session-status-subscriptions.js +4 -0
  176. package/dist/modes/rpc/session-worker.js +5 -2
  177. package/dist/modes/rpc/snapshot-types.d.ts +29 -0
  178. package/dist/modes/rpc/snapshot-types.js +2 -0
  179. package/dist/modes/rpc/ui-answer-ledger.d.ts +13 -0
  180. package/dist/modes/rpc/ui-answer-ledger.js +34 -0
  181. package/dist/senpi +21 -3
  182. package/docs/mcp.md +20 -0
  183. package/docs/rpc.md +44 -0
  184. package/package.json +7 -6
  185. package/dist/bundle/chunks/azure-openai-responses-7I45DI72.js +0 -2
  186. package/dist/bundle/chunks/chunk-DMI55M2N.js +0 -2
  187. package/dist/bundle/chunks/chunk-DODH3N6U.js +0 -410
  188. package/dist/bundle/chunks/chunk-J37GRED2.js +0 -5
  189. package/dist/bundle/chunks/chunk-TBU6VYHN.js +0 -13
  190. package/dist/bundle/chunks/cli-main-YYH3IBC6.js +0 -3
  191. package/dist/bundle/chunks/dispatch-MXG5YWLV.js +0 -9
  192. package/dist/bundle/chunks/google-generative-ai-UM5Y7T6B.js +0 -2
  193. package/dist/bundle/chunks/google-vertex-OKU2VQHL.js +0 -2
  194. package/dist/bundle/chunks/host-command-TDLLHXVI.js +0 -2
  195. package/dist/bundle/chunks/interactive-mode-OEPULLZK.js +0 -2
  196. package/dist/bundle/chunks/openai-responses-TNHQ6SJS.js +0 -3
  197. package/dist/bundle/chunks/rpc-mode-ETXQWEB2.js +0 -2
  198. package/dist/bundle/chunks/session-control-endpoint-4LEIDIVI.js +0 -3
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{AssistantMessageEventStream,formatThrownValue}from"./chunk-DMI55M2N.js";var LEGACY_PROVIDER_IDS=Object.freeze({"openai-codex":"chatgpt-subscription","claude-sdk-oauth":"anthropic-subscription"});function normalizeProviderId(id){return Object.hasOwn(LEGACY_PROVIDER_IDS,id)?LEGACY_PROVIDER_IDS[id]:id}function normalizeModelRef(ref){let slash=ref.indexOf("/");if(slash===-1)return normalizeProviderId(ref);let provider=ref.slice(0,slash),normalized=normalizeProviderId(provider);return normalized===provider?ref:`${normalized}/${ref.slice(slash+1)}`}function isLegacyProviderId(id){return Object.hasOwn(LEGACY_PROVIDER_IDS,id)}function legacyProviderIdsFor(canonicalId){return Object.entries(LEGACY_PROVIDER_IDS).filter(([,canonical])=>canonical===canonicalId).map(([legacy])=>legacy)}function readByProviderId(record,providerId){if(record===void 0)return;let canonical=normalizeProviderId(providerId);if(record[canonical]!==void 0)return record[canonical];for(let legacy of legacyProviderIdsFor(canonical))if(record[legacy]!==void 0)return record[legacy]}var LEGACY_PROVIDER_DISPLAY_NAMES=Object.freeze({"openai codex":"openai-codex","claude sdk oauth":"claude-sdk-oauth"});function legacyProviderIdRejection(typed){let lowered=typed.trim().toLowerCase(),legacyId=Object.hasOwn(LEGACY_PROVIDER_DISPLAY_NAMES,lowered)?LEGACY_PROVIDER_DISPLAY_NAMES[lowered]:Object.hasOwn(LEGACY_PROVIDER_IDS,lowered)?lowered:void 0;if(legacyId===void 0)return;let canonical=LEGACY_PROVIDER_IDS[legacyId];return`${legacyId} was renamed to ${canonical}. Use ${canonical}.`}function contentText(content,separator=`
2
+ import{AssistantMessageEventStream,assistantEvents,formatThrownValue,pushAssistantProgress,setAssistantReader}from"./chunk-GQJYNFMO.js";var LEGACY_PROVIDER_IDS=Object.freeze({"openai-codex":"chatgpt-subscription","claude-sdk-oauth":"anthropic-subscription"});function normalizeProviderId(id){return Object.hasOwn(LEGACY_PROVIDER_IDS,id)?LEGACY_PROVIDER_IDS[id]:id}function normalizeModelRef(ref){let slash=ref.indexOf("/");if(slash===-1)return normalizeProviderId(ref);let provider=ref.slice(0,slash),normalized=normalizeProviderId(provider);return normalized===provider?ref:`${normalized}/${ref.slice(slash+1)}`}function isLegacyProviderId(id){return Object.hasOwn(LEGACY_PROVIDER_IDS,id)}function legacyProviderIdsFor(canonicalId){return Object.entries(LEGACY_PROVIDER_IDS).filter(([,canonical])=>canonical===canonicalId).map(([legacy])=>legacy)}function readByProviderId(record,providerId){if(record===void 0)return;let canonical=normalizeProviderId(providerId);if(record[canonical]!==void 0)return record[canonical];for(let legacy of legacyProviderIdsFor(canonical))if(record[legacy]!==void 0)return record[legacy]}var LEGACY_PROVIDER_DISPLAY_NAMES=Object.freeze({"openai codex":"openai-codex","claude sdk oauth":"claude-sdk-oauth"});function legacyProviderIdRejection(typed){let lowered=typed.trim().toLowerCase(),legacyId=Object.hasOwn(LEGACY_PROVIDER_DISPLAY_NAMES,lowered)?LEGACY_PROVIDER_DISPLAY_NAMES[lowered]:Object.hasOwn(LEGACY_PROVIDER_IDS,lowered)?lowered:void 0;if(legacyId===void 0)return;let canonical=LEGACY_PROVIDER_IDS[legacyId];return`${legacyId} was renamed to ${canonical}. Use ${canonical}.`}function contentText(content,separator=`
3
3
  `){return typeof content=="string"?content:content.filter(block=>block.type==="text").map(block=>block.text).join(separator)}function getSystemMessageText(message){let parts=[contentText(message.content)];for(let text of Object.values(message.sections??{}))text!==null&&parts.push(text);return parts.filter(part=>part.length>0).join(`
4
4
 
5
5
  `)}function renderSystemMessageUpdate(message){let parts=[],text=contentText(message.content);text.length>0&&parts.push(text);for(let[name,value]of Object.entries(message.sections??{}))parts.push(value===null?`Removed system prompt section "${name}".`:`Updated system prompt section "${name}":
@@ -8,4 +8,4 @@ ${value}`);return parts.join(`
8
8
 
9
9
  `)}function createInitialSystemMessage(systemPrompt,tools){let hasSystemPrompt=systemPrompt!==void 0&&systemPrompt.length>0,hasTools=tools!==void 0&&tools.length>0;if(!(!hasSystemPrompt&&!hasTools))return{role:"system",content:systemPrompt??"",...hasTools?{toolsAdded:tools}:{},timestamp:0}}function normalizeContext(context){let initialMessage=createInitialSystemMessage(context.systemPrompt,context.tools),messages=initialMessage?[initialMessage,...context.messages]:context.messages;return context.activeToolNames?{messages,activeToolNames:context.activeToolNames}:{messages}}function isSystemMessage(message){return message.role==="system"}function getInitialSystemMessage(messages){let first=messages[0];return first&&isSystemMessage(first)?first:void 0}function withoutInitialSystemMessage(messages){return getInitialSystemMessage(messages)?messages.slice(1):messages}function getCurrentTools(messages){let tools=new Map;for(let message of messages)if(isSystemMessage(message)){for(let tool of message.toolsRemoved??[])tools.delete(tool.name);for(let tool of message.toolsAdded??[])tools.set(tool.name,tool)}return[...tools.values()]}function getCurrentSystemMessage(messages){let content=[],sections=new Map,timestamp;for(let message of messages){if(!isSystemMessage(message))continue;timestamp??=message.timestamp;let text=contentText(message.content);text.length>0&&content.push(text);for(let[name,value]of Object.entries(message.sections??{}))value===null?sections.delete(name):sections.set(name,value)}let tools=getCurrentTools(messages);if(!(timestamp===void 0&&tools.length===0))return{role:"system",content:content.join(`
10
10
 
11
- `),...sections.size>0?{sections:Object.fromEntries(sections)}:{},...tools.length>0?{toolsAdded:tools}:{},timestamp:timestamp??0}}function getCurrentSystemPrompt(messages){let message=getCurrentSystemMessage(messages);return message?getSystemMessageText(message):""}function collapseSystemMessages(context){let head=getCurrentSystemMessage(context.messages),messages=context.messages.filter(message=>message.role!=="system");return{...context,messages:head?[head,...messages]:messages}}function resolveTranscript(context,supportsMidConvoSystemMessages){return supportsMidConvoSystemMessages?context:collapseSystemMessages(context)}function toToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:JSON.parse(JSON.stringify(tool.parameters)),...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function declarationsEqual(left,right){return JSON.stringify(toToolDeclaration(left))===JSON.stringify(toToolDeclaration(right))}function getToolStateChanges(previous,current){let previousTools=new Map(previous.map(tool=>[tool.name,tool])),currentTools=new Map(current.map(tool=>[tool.name,tool]));return{toolsAdded:current.filter(tool=>{let previousTool=previousTools.get(tool.name);return previousTool===void 0||!declarationsEqual(previousTool,tool)}).map(toToolDeclaration),toolsRemoved:previous.filter(tool=>{let currentTool=currentTools.get(tool.name);return currentTool===void 0||!declarationsEqual(tool,currentTool)}).map(tool=>({name:tool.name}))}}function getDeclaredTools(messages){let definitions=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[])definitions.set(tool.name,tool);return[...definitions.values()]}function hasToolRedefinitions(messages){let declared=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[]){let previous=declared.get(tool.name);if(previous!==void 0&&!declarationsEqual(previous,tool))return!0;declared.set(tool.name,tool)}return!1}function hasNonAdditiveToolChanges(messages){let declared=new Set;for(let message of messages)if(isSystemMessage(message)){if((message.toolsRemoved?.length??0)>0)return!0;for(let tool of message.toolsAdded??[]){if(declared.has(tool.name))return!0;declared.add(tool.name)}}return!1}function resolveTranscriptTools(messages,supportsToolAdditions){let anchorsAdditions=supportsToolAdditions&&!hasNonAdditiveToolChanges(messages);return{requestTools:anchorsAdditions?getInitialSystemMessage(messages)?.toolsAdded??[]:getCurrentTools(messages),anchorsAdditions}}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status){super(message),this.status=status}},TRANSPORT_CODES=new Set(["ConnectionRefused","FailedToOpenSocket","ConnectionClosed","ECONNREFUSED","ECONNRESET","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EPIPE","UND_ERR_CONNECT_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_SOCKET"]),MAX_CAUSE_LINKS=16;function oauthRefreshFailureCause(error){let seen=new Set;for(;typeof error=="object"&&error!==null&&!seen.has(error)&&seen.size<MAX_CAUSE_LINKS;){if(seen.add(error),Reflect.get(error,"name")==="TimeoutError")return"timeout";let code=Reflect.get(error,"code");if(typeof code=="string"&&TRANSPORT_CODES.has(code))return code==="ConnectionRefused"||code==="ECONNREFUSED"?"connection_refused":code.toLowerCase();let status=Reflect.get(error,"status");if(typeof status=="number"&&(status===408||status===429||status>=500&&status<600))return`http_${status}`;error=Reflect.get(error,"cause")}}function classifyOAuthRefreshFailure(error){return oauthRefreshFailureCause(error)===void 0?"permanent":"transient"}var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};function isOAuthRefreshUnavailableError(error){let seen=new Set;for(;typeof error=="object"&&error!==null&&!seen.has(error)&&seen.size<MAX_CAUSE_LINKS;){if(seen.add(error),Reflect.get(error,UNAVAILABLE)===!0)return!0;error=Reflect.get(error,"cause")}return!1}var EMPTY_RESPONSE_ERROR="Model returned an empty response twice",EMPTY_TOOL_USE_ERROR="Model returned tool_use without a tool call twice",FORWARDED_EMPTY_RESPONSE_ERROR="Model returned an empty response after streaming thinking",FORWARDED_EMPTY_TOOL_USE_ERROR="Model returned tool_use without a tool call after streaming thinking";var OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC="oauth_refresh_unavailable",PROVIDER_REQUEST_ID_MARKER="request id:",REQUEST_ID_SEGMENT=/request id: [^\s,;)]+/gi;function formatProviderRequestId(label,id){return`${label} ${PROVIDER_REQUEST_ID_MARKER} ${id}`}function stripProviderRequestIds(text){return text.replace(REQUEST_ID_SEGMENT,PROVIDER_REQUEST_ID_MARKER)}function buildProviderErrorPattern(patterns){return new RegExp(patterns.join("|"),"i")}function escapeRegExp(text){return text.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var USAGE_LIMIT_EXHAUSTION={codes:["usage_limit_reached","usage_not_included"],markers:["usage_limit_reached","usage_not_included","usage limit has been reached"]},ANTHROPIC_THIRD_PARTY_BILLING_MARKER="Third-party apps now draw from your extra usage";function isAnthropicThirdPartyBillingMessage(errorMessage){return errorMessage?.toLowerCase().includes(ANTHROPIC_THIRD_PARTY_BILLING_MARKER.toLowerCase())===!0}var QUOTA_EXHAUSTION_PATTERNS=["GoUsageLimitError","FreeUsageLimitError","Monthly usage limit reached","available balance","insufficient_quota","out of budget","quota exceeded","billing","credits_required","credits are required",...USAGE_LIMIT_EXHAUSTION.markers,escapeRegExp(ANTHROPIC_THIRD_PARTY_BILLING_MARKER)],QUOTA_EXHAUSTION_PATTERN=buildProviderErrorPattern(QUOTA_EXHAUSTION_PATTERNS);function isQuotaExhaustionMessage(errorMessage){return errorMessage!==void 0&&QUOTA_EXHAUSTION_PATTERN.test(stripProviderRequestIds(errorMessage))}var NON_RETRYABLE_PROVIDER_ERROR_PATTERN=buildProviderErrorPattern([...QUOTA_EXHAUSTION_PATTERNS,"invalid request: tools\\.","invalid request: functions\\.","tools\\.[^ ]*function\\.parameters","tools\\.\\d+\\.function\\.parameters","invalid tool schema","subscription_sharing_usage_limit_exceeded"]),RETRYABLE_PROVIDER_ERROR_PATTERN=buildProviderErrorPattern(["Credential store is busy: lock","overloaded","currently experiencing high demand","rate.?limit","too many requests","429","500","502","503","504","520","522","524","service.?unavailable","server.?error","internal.?error","provider.?returned.?error","exceeded request buffer limit while retrying upstream","network.?error","connection.?error","connection.?refused","connection.?lost","other side closed","fetch failed","getaddrinfo","ENOTFOUND","EAI_AGAIN","upstream.?connect","upstream.?unavailable","reset before headers","socket hang up","socket connection was closed","timed? out","timeout","terminated","websocket.?closed","websocket.?error","ended without","stream ended before message_stop","stream ended before a terminal response event","http2 request did not get a response","retry delay","you can retry your request","try your request again","please retry your request","the model request was rejected\\.\\s*check the request and try again\\.?","was found without a corresponding `","must not contain streaming index",escapeRegExp(FORWARDED_EMPTY_RESPONSE_ERROR),escapeRegExp(FORWARDED_EMPTY_TOOL_USE_ERROR),"ResourceExhausted",'"type"\\s*:\\s*"forbidden"\\s*,\\s*"message"\\s*:\\s*"Request not allowed\\.?"','"message"\\s*:\\s*"Request not allowed\\.?"\\s*,\\s*"type"\\s*:\\s*"forbidden"',"Lock file is already being held","subscription_sharing_usage_unavailable","subscription_sharing_user_unavailable"]),DEFAULT_MAX_AGENT_RETRY_DELAY_MS=6e4;function retryDelayMs(policy,attempt){let scheduledDelayMs=policy.baseDelayMs*2**Math.max(0,attempt-1),sample=Math.min(1,Math.max(0,(policy.random??Math.random)())),jitteredDelayMs=Math.round(scheduledDelayMs*(.9+sample*.2)),safeDelay=Number.isSafeInteger(jitteredDelayMs)?jitteredDelayMs:Number.MAX_SAFE_INTEGER;return Math.min(safeDelay,policy.maxAgentDelayMs??DEFAULT_MAX_AGENT_RETRY_DELAY_MS)}var RetrySleepAbortError=class extends Error{constructor(){super("Aborted")}};function sleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(new RetrySleepAbortError);return}let timeout=setTimeout(resolve,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject(new RetrySleepAbortError)},{once:!0})})}async function retryTransientCall(produce,isRetryable,policy,signal,callbacks){let maxAttempts=policy?.enabled?policy.maxRetries:0,attempt=0,lastRetry;for(;;)try{let value=await produce();return lastRetry&&await callbacks?.onRetryFinished?.(!0,lastRetry.attempt),value}catch(error){if(error instanceof RetrySleepAbortError)throw error;if(attempt>=maxAttempts||!isRetryable(error))throw lastRetry&&await callbacks?.onRetryFinished?.(!1,lastRetry.attempt,errorMessageOf(error)),error;attempt++,lastRetry={attempt,errorMessage:errorMessageOf(error)};let delayMs=retryDelayMs(policy,attempt);await callbacks?.onRetryScheduled?.(attempt,maxAttempts,delayMs,lastRetry.errorMessage);try{await sleep(delayMs,signal)}catch(sleepError){throw await callbacks?.onRetryFinished?.(!1,attempt,lastRetry.errorMessage),sleepError instanceof RetrySleepAbortError?error:sleepError}await callbacks?.onRetryAttemptStart?.()}}function errorMessageOf(error){return error instanceof Error?error.message||"Unknown error":String(error)||"Unknown error"}async function retryAssistantCall(produce,policy,signal,callbacks){let maxAttempts=policy?.enabled?policy.maxRetries:0,attempt=0,lastRetry;for(;;){let response=await produce();if(response.stopReason==="aborted")return lastRetry&&await callbacks?.onRetryFinished?.(!1,lastRetry.attempt),response;if(response.stopReason!=="error")return lastRetry&&await callbacks?.onRetryFinished?.(!0,lastRetry.attempt),response;if(attempt>=maxAttempts||!isRetryableAssistantError(response))return lastRetry&&await callbacks?.onRetryFinished?.(!1,lastRetry.attempt,response.errorMessage),response;attempt++,lastRetry={attempt,errorMessage:response.errorMessage||"Unknown error"};let delayMs=retryDelayMs(policy,attempt);await callbacks?.onRetryScheduled?.(attempt,maxAttempts,delayMs,lastRetry.errorMessage);try{await sleep(delayMs,signal)}catch(error){if(await callbacks?.onRetryFinished?.(!1,attempt,lastRetry.errorMessage),error instanceof RetrySleepAbortError){let{errorMessage:_errorMessage,...rest}=response;return{...rest,stopReason:"aborted"}}throw error}await callbacks?.onRetryAttemptStart?.()}}function isRetryableAssistantError(message){return message.stopReason==="error"&&message.diagnostics?.some(diagnostic=>diagnostic.type===OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC)?!0:message.stopReason!=="error"||message.stopDetails?.type==="refusal"||message.stopDetails?.type==="sensitive"||!message.errorMessage?!1:isRetryableErrorMessage(message.errorMessage)}var PROVIDER_STREAM_STALL_ERROR_PATTERN=/^(?:Idle timeout waiting for provider stream after \d+ms|Provider stream start timed out after \d+ms(?: \([^)]*\))?|WebSocket liveness timeout after \d+ms \(\d+ pings unanswered\)|Provider stream stalled after the last output item: response\.completed timed out after \d+ms)$/i,PROVIDER_TRANSPORT_TIMEOUT_ERROR_PATTERN=/^Request timed out\.?$/i;function isProviderStreamStallError(message){return message.stopReason==="error"&&PROVIDER_STREAM_STALL_ERROR_PATTERN.test(message.errorMessage??"")}var PROVIDER_STALL_PHASES=[{pattern:/^Provider stream start timed out after (\d+)ms/i,symptom:"accepted the request but never started sending a response",setting:"retry.provider.streamStartTimeoutMs"},{pattern:/^Idle timeout waiting for provider stream after (\d+)ms/i,symptom:"started the response and then went silent",setting:"retry.provider.timeoutMs"},{pattern:/^WebSocket liveness timeout after (\d+)ms/i,symptom:"stopped answering connection health checks"},{pattern:/^Provider stream stalled after the last output item: response\.completed timed out after (\d+)ms/i,symptom:"finished its output but never sent the end-of-response event"}];function formatStallDuration(timeoutMs){return timeoutMs<1e3?`${timeoutMs}ms`:timeoutMs<12e4?`${Math.round(timeoutMs/100)/10}s`:`${Math.round(timeoutMs/6e3)/10}m`}function describeProviderStallForUser(errorMessage,options={}){if(errorMessage)for(let{pattern,symptom,setting}of PROVIDER_STALL_PHASES){let match=pattern.exec(errorMessage);if(!match)continue;let subject=options.model?`The provider for ${options.model}`:"The provider",duration=formatStallDuration(Number(match[1])),sentences=[`${subject} ${symptom} within ${duration}, so the request was cancelled.`],attempts=options.attempts??0;if(attempts>0&&sentences.push(`Retried ${attempts} time${attempts===1?"":"s"} on the same model with the same result.`),options.recovery){let raise=setting?`, or raise ${setting} in settings (0 disables the bound)`:"",lead=options.recovery==="no-fallback-configured"?"No fallback model is configured for it, so nothing could take the turn over: run /fallback to add one":"Every model in its fallback chain was tried as well: run /fallback to review the chain";sentences.push(`${lead}, send the message again${raise}.`)}return sentences.join(" ")}}function isProviderTimeoutError(message){return message.abortSource==="provider"||isProviderStreamStallError(message)?!0:message.stopReason!=="error"&&message.stopReason!=="aborted"?!1:PROVIDER_TRANSPORT_TIMEOUT_ERROR_PATTERN.test(message.errorMessage??"")}function isRetryableErrorMessage(errorMessage){return classifyErrorMessage(errorMessage)==="retryable"}function classifyErrorMessage(errorMessage){if(!errorMessage)return"unknown";let text=stripProviderRequestIds(errorMessage);return NON_RETRYABLE_PROVIDER_ERROR_PATTERN.test(text)?"non-retryable":RETRYABLE_PROVIDER_ERROR_PATTERN.test(text)?"retryable":"unknown"}var CLAUDE_EXTRA_USAGE_URL="https://claude.ai/settings/usage",ACCOUNT_LIMIT_NEXT_STEP_LEAD="To keep going now, ",RETRY_AFTER_MARKER=/\s*\(retry-after-ms: \d+\)$/;function describeAnthropicThirdPartyBilling(provider){return provider==="anthropic-subscription"?`Anthropic billed this Claude Code request to your extra usage instead of your plan limits, and your extra usage is used up. Add extra usage at ${CLAUDE_EXTRA_USAGE_URL}, or switch to another model with /model.`:`Anthropic billed this request to your extra usage instead of your Claude plan limits, because a Claude subscription used directly through the Anthropic API counts as a third-party app. Run /login and choose "Anthropic Subscription (Claude Pro/Max)" so requests run through Claude Code and use your plan limits, add extra usage at ${CLAUDE_EXTRA_USAGE_URL}, or switch to another model with /model.`}var TURN_RETRY_SUPPRESSION_PREFIX="senpi:no-turn-retry:";function stripTurnRetrySuppressionPrefix(message){return message.replaceAll(TURN_RETRY_SUPPRESSION_PREFIX,"")}var WEBSOCKET_CLOSED_PATTERN=/^WebSocket closed\b/i,WEBSOCKET_ERROR_PATTERN=/^WebSocket error$/i,WEBSOCKET_CONNECT_TIMEOUT_PATTERN=/^WebSocket connect timeout after (\d+)ms/i,RECOVERY_SENTENCE={"no-fallback-configured":"No fallback model is configured for it, so nothing could take the turn over: run /fallback to add one, or send the message again to continue from the partial reply.","chain-exhausted":"Every model in its fallback chain was tried as well: run /fallback to review the chain, or send the message again to continue from the partial reply."};function transportSymptom(errorMessage,subject){if(WEBSOCKET_CLOSED_PATTERN.test(errorMessage))return`The connection to ${subject} dropped before the reply finished (${errorMessage}).`;if(WEBSOCKET_ERROR_PATTERN.test(errorMessage))return`The connection to ${subject} reported an error before the reply finished (${errorMessage}).`;let connectTimeout=WEBSOCKET_CONNECT_TIMEOUT_PATTERN.exec(errorMessage);if(connectTimeout)return`${subject.replace(/^the provider/,"The provider")} did not accept the connection within ${formatStallDuration(Number(connectTimeout[1]))}.`}function describeProviderFailureForUser(errorMessage,options={}){if(!errorMessage)return;let message=stripTurnRetrySuppressionPrefix(errorMessage).trim();if(!message)return;if(isAnthropicThirdPartyBillingMessage(message))return describeAnthropicThirdPartyBilling(options.model?.split("/")[0]);if(options.usageLimit==="account"){if(message.includes(ACCOUNT_LIMIT_NEXT_STEP_LEAD))return message.replace(RETRY_AFTER_MARKER,"");let provider=options.model?.split("/")[0],reset=/\bresets?\s+([^"}\n]+)/i.exec(message)?.[1]?.trim().replace(/[.;]+$/,"");return`The ${provider?`${provider} `:""}account usage limit has been reached${reset?` (resets ${reset})`:""}. Switch to another provider with /model, or configure another provider in retry.fallbackChains.`}let stall=describeProviderStallForUser(message,options);if(stall!==void 0)return stall;let subject=options.model?`the provider for ${options.model}`:"the provider",symptom=transportSymptom(message,subject);if(symptom===void 0)return;let sentences=[symptom],attempts=options.attempts??0;return attempts>0&&sentences.push(`Retried ${attempts} time${attempts===1?"":"s"} on the same model with the same result.`),options.recovery&&sentences.push(RECOVERY_SENTENCE[options.recovery]),sentences.join(" ")}var MISSING_MODULE_PATTERNS=[/^Cannot find module ['"]([^'"]+)['"]/,/^ENOENT reading ['"]([^'"]+)['"]/],SHIPPED_MODULE=/^(?:\.{1,2}[\\/]|[\\/]|[A-Za-z]:[\\/]|file:).*\.m?js$/;function describeReplacedInstall(error){if(error instanceof Error)for(let pattern of MISSING_MODULE_PATTERNS){let missing=pattern.exec(error.message)?.[1];if(missing!==void 0&&SHIPPED_MODULE.test(missing))return`${TURN_RETRY_SUPPRESSION_PREFIX}The installed package changed while this session was running, so ${missing.split(/[\\/]/).at(-1)} can no longer be loaded. Restart and resume this session to continue.`}}function createSetupErrorMessage(model,error){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:describeReplacedInstall(error)??(error instanceof Error?error.message:String(error)),...isOAuthRefreshUnavailableError(error)?{diagnostics:[{type:OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,timestamp:Date.now(),details:{provider:model.provider}}]}:{},timestamp:Date.now()}}function hasResult(source){return typeof source.result=="function"}var LazyAssistantMessageEventStream=class extends AssistantMessageEventStream{setCancellationHandler(handler){this.cancellationHandler=handler}[Symbol.asyncIterator](){let iterator=super[Symbol.asyncIterator]();return{next:()=>iterator.next(),return:async()=>(await this.cancellationHandler?.(),{value:void 0,done:!0})}}};async function forwardStream(target,source,iterator){for(;;){let event=await iterator.next();if(event.done)break;target.push(event.value)}target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let outer=new LazyAssistantMessageEventStream,inner=setup(),iterator=inner.then(source=>source[Symbol.asyncIterator]()),cancellation;return outer.setCancellationHandler(()=>(cancellation??=iterator.then(async sourceIterator=>{await sourceIterator.return?.()}),cancellation)),Promise.all([inner,iterator]).then(([source,sourceIterator])=>forwardStream(outer,source,sourceIterator)).catch(error=>{let message=createSetupErrorMessage(model,error);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{constructor(){this.credentials=new Map,this.chains=new Map}enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var DEFAULT_SLOT_NAME="default",SLOT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidSlotName(name){if(!SLOT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}var UNSAFE_DISPLAY_CHARACTERS=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u,DISPLAY_NAME_MAX_COLUMNS=32,BLANK_DISPLAY_CHARACTER=/^[\s\p{M}\u115f\u1160\u17b4\u17b5\u2800\u3164\uffa0]$/u,INVISIBLE_DISPLAY_CHARACTER=/^[\p{M}\u115f\u1160\u17b4\u17b5\u2800\u3164\uffa0]$/u,WIDE_DISPLAY_CHARACTER=/^(?:[\u1100-\u115f\u2329\u232a\u2e80-\u303e\u3041-\u33ff\u3400-\u4dbf\u4e00-\u9fff\ua000-\ua4cf\ua960-\ua97f\uac00-\ud7a3\uf900-\ufaff\ufe10-\ufe19\ufe30-\ufe6f\uff00-\uff60\uffe0-\uffe6]|[\u{1f300}-\u{1faff}]|[\u{20000}-\u{3fffd}])$/u,CYRILLIC_LOOKALIKES={\u0430:"a",\u0432:"b",\u0435:"e",\u043A:"k",\u043C:"m",\u043D:"h",\u043E:"o",\u0440:"p",\u0441:"c",\u0442:"t",\u0443:"y",\u0445:"x",\u0455:"s",\u0456:"i",\u0458:"j"},displayNameGraphemes=new Intl.Segmenter(void 0,{granularity:"grapheme"});function displayNameColumns(value){let columns=0;for(let{segment}of displayNameGraphemes.segment(value)){let codePoint=segment.codePointAt(0);if(codePoint===void 0)continue;let base=String.fromCodePoint(codePoint);INVISIBLE_DISPLAY_CHARACTER.test(base)||(columns+=WIDE_DISPLAY_CHARACTER.test(base)||segment.includes("\uFE0F")?2:1)}return columns}function normalizeDisplayName(value){return value.normalize("NFC").trim().replace(/\s+/gu," ")}function displayNameKey(value){return[...normalizeDisplayName(value).normalize("NFKC").toLowerCase()].filter(character=>!INVISIBLE_DISPLAY_CHARACTER.test(character)).map(character=>CYRILLIC_LOOKALIKES[character]??character).join("")}function accountDisplayName(value){if(typeof value!="string"||UNSAFE_DISPLAY_CHARACTERS.test(value))return;let normalized=normalizeDisplayName(value),characters=[...normalized];if(!(characters.length===0||new RegExp("^\\p{M}$","u").test(characters[0]))&&!characters.every(character=>BLANK_DISPLAY_CHARACTER.test(character)))return displayNameColumns(normalized)<=DISPLAY_NAME_MAX_COLUMNS?normalized:void 0}function accountLabel(account){let displayName=accountDisplayName(account.displayName);return displayName===void 0?account.name:`${displayName} (${account.name})`}function renameSlotDisplayName(credential,name,value){assertValidSlotName(name);let accounts=Array.isArray(credential.accounts)?credential.accounts:listSlots(credential),target=accounts.find(slot=>slot.name===name);if(!target)throw new Error(`Stored provider account not found: ${name}`);if(target.source==="env")throw new Error(`Environment provider account cannot be renamed: ${name}`);let displayName=value===null?void 0:accountDisplayName(value);if(value!==null&&displayName===void 0)throw new Error(`Display name must be 1-${DISPLAY_NAME_MAX_COLUMNS} terminal columns of visible text without control or formatting characters.`);if(displayName!==void 0&&accounts.some(slot=>slot.name!==name&&displayNameKey(accountDisplayName(slot.displayName)??"")===displayNameKey(displayName)))throw new Error("Display name is already used by another account for this provider.");return{...credential,accounts:accounts.map(slot=>{if(slot.name!==name)return slot;let{displayName:_displayName,...unchanged}=slot;return displayName===void 0?unchanged:{...unchanged,displayName}})}}function storedSlots(credential){return Array.isArray(credential.accounts)?credential.accounts:[]}function credentialSlotEnv(credential){let value=credential.env;if(typeof value!="object"||value===null||Array.isArray(value))return{};let env={};for(let[name,entry]of Object.entries(value)){if(typeof entry!="string")return{};env[name]=entry}return{env}}function slotFromFlatCredential(credential){return slotFromFlatCredentialNamed(credential,DEFAULT_SLOT_NAME)}function listSlots(credential){if(!credential)return[];let slots=storedSlots(credential);return slots.length>0?[...slots]:[slotFromFlatCredential(credential)]}function findSlot(credential,name){return listSlots(credential).find(slot=>slot.name===name)}function upsertSlot(credential,slot){assertValidSlotName(slot.name);let base=credential??(slot.access!==void 0||slot.refresh!==void 0?{type:"oauth",access:slot.access??"",refresh:slot.refresh??"",expires:slot.expires??0}:{type:"api_key",key:slot.key}),existing=listSlots(base),accounts=existing.findIndex(candidate=>candidate.name===slot.name)>=0?existing.map(candidate=>candidate.name===slot.name?{...candidate,...slot}:candidate):[...existing,slot];return{...base,accounts}}function slotMirrorsFlat(credential,slot){return credential.type==="oauth"?slot.access===credential.access||slot.refresh===credential.refresh:slot.key===credential.key}function projectFlatFields(credential,slot){let env=slot.env===void 0?{}:{env:slot.env};return credential.type==="oauth"?slot.access===void 0||slot.refresh===void 0||slot.expires===void 0?credential:{...credential,access:slot.access,refresh:slot.refresh,expires:slot.expires,...env}:{...credential,key:slot.key,...env}}function removeSlot(credential,name){if(!credential)return;let existing=listSlots(credential),removed=existing.find(slot=>slot.name===name),accounts=existing.filter(slot=>slot.name!==name);if(accounts.length===0)return;let next={...removed&&slotMirrorsFlat(credential,removed)?projectFlatFields(credential,accounts[0]):credential,accounts};return next.pinned===name&&delete next.pinned,next}function pinSlot(credential,name){return assertValidSlotName(name),{...credential,pinned:name}}function projectSlot(credential,name){if(!credential)return;let slot=findSlot(credential,name);if(!slot)return;let{accounts:_accounts,pinned:_pinned,order:_order,...flat}=credential,env=slot.env===void 0?{}:{env:slot.env};return flat.type==="oauth"?slot.access===void 0||slot.refresh===void 0||slot.expires===void 0?void 0:{...flat,access:slot.access,refresh:slot.refresh,expires:slot.expires,...env}:{...flat,key:slot.key,...env}}function slotFromFlatCredentialNamed(credential,name){return credential.type==="oauth"?{name,source:"login",access:credential.access,refresh:credential.refresh,expires:credential.expires,...credentialSlotEnv(credential)}:{name,source:"login",key:credential.key,...credentialSlotEnv(credential)}}function nextLoginSlotName(credential){let taken=new Set(listSlots(credential).map(slot=>slot.name));for(let index=2;index<1e3;index++){let candidate=`login-${index}`;if(!taken.has(candidate))return candidate}throw new Error("Credential pool is full")}function providedSlots(credential){let accounts=credential.accounts;return Array.isArray(accounts)&&accounts.length>0?accounts:void 0}function mergeProvidedPool(current,existing,provided){let providedByName=new Map(provided.map(slot=>[slot.name,slot])),refreshed=!1,merged=existing.map(slot=>{let candidate=providedByName.get(slot.name);return!candidate||!hasNewerMaterial(candidate,slot)?slot:(refreshed=!0,candidate)}),known=new Set(existing.map(slot=>slot.name)),added=provided.filter(slot=>!known.has(slot.name));return added.length===0&&!refreshed?current:{...current,accounts:[...merged,...added]}}function hasNewerMaterial(candidate,stored){return candidate.expires!==void 0&&(stored.expires===void 0||candidate.expires>stored.expires)}var EmptyApiKeyError=class extends Error{constructor(){super("Refusing to save an empty API key"),this.name="EmptyApiKeyError"}};function hasBlankKey(credential){return credential.type!=="api_key"||!Object.hasOwn(credential,"key")?!1:typeof credential.key!="string"||credential.key.trim()===""}function withoutBlankKey(credential){if(credential.type!=="api_key"||!hasBlankKey(credential))return credential;let{key:_blank,...rest}=credential;return rest}function assertLoginKeyPresent(credential){if(hasBlankKey(credential))throw new EmptyApiKeyError}function appendLoginSlot(stored,flat,onAllocated){assertLoginKeyPresent(flat);let current=stored?.type===flat.type?stored:void 0,provided=providedSlots(flat);if(provided){let previous=new Set((current&&Array.isArray(current.accounts)?current.accounts:listSlots(current)).map(slot=>slot.name)),added=provided.filter(slot=>!previous.has(slot.name));added.length===1&&SLOT_NAME_PATTERN.test(added[0].name)&&added[0].source!=="env"&&onAllocated?.(added[0].name,"provider")}if(!current)return provided||onAllocated?.(DEFAULT_SLOT_NAME,"generated"),flat;let storedAccounts=Array.isArray(current.accounts)?current.accounts:void 0;if(provided)return storedAccounts?mergeProvidedPool(current,storedAccounts,provided):flat;let name=nextLoginSlotName(current),next=upsertSlot(current,slotFromFlatCredentialNamed(flat,name));return onAllocated?.(name,"generated"),next}function managedSentinelMaterial(providerId){return`${providerId}-managed`}var LEGACY_SENTINEL_MATERIALS=new Map(Object.entries(LEGACY_PROVIDER_IDS).map(([legacyId,canonicalId])=>[canonicalId,managedSentinelMaterial(legacyId)]));function managedSentinelMaterials(providerId){let materials=[managedSentinelMaterial(providerId)],legacy=LEGACY_SENTINEL_MATERIALS.get(providerId);return legacy!==void 0&&!materials.includes(legacy)&&materials.push(legacy),materials}function isManagedSentinelSlot(providerId,slot){return managedSentinelMaterials(providerId).includes(slot.access??"")&&slot.refresh===slot.access}function repairManagedSentinelSlots(providerId,credential){let pooled=credential;if(!Array.isArray(pooled.accounts))return;let kept=pooled.accounts.filter(slot=>!isManagedSentinelSlot(providerId,slot));if(kept.length===pooled.accounts.length)return;let repaired={...pooled,accounts:kept};return repaired.pinned!==void 0&&!kept.some(slot=>slot.name===repaired.pinned)&&delete repaired.pinned,repaired}function mergeRefreshedSlot(current,name,refreshed){if(refreshed.type!=="oauth"||current.type!=="oauth")return current;if(!Array.isArray(current.accounts)||current.accounts.length===0)return mergeRefreshed(current,refreshed);let target=current.accounts.find(slot=>slot.name===name);if(!target)return current;let rotated={access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires},accounts=current.accounts.map(slot=>slot===target?{...slot,...rotated}:slot);return target.access===current.access||target.refresh===current.refresh?{...current,...rotated,accounts}:{...current,accounts}}function mergeRefreshed(current,refreshed){if(!Array.isArray(current.accounts)||current.accounts.length===0||refreshed.type!=="oauth"||current.type!=="oauth")return refreshed;let target=current.accounts.find(slot=>slot.access===current.access||slot.refresh===current.refresh),rotated={access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires},accounts=target?current.accounts.map(slot=>slot===target?{...slot,...rotated}:slot):current.accounts;return{...current,...rotated,accounts}}var DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3,OAuthRefreshExchangeError=class extends Error{constructor(cause){super("OAuth token exchange failed",{cause}),this.name="OAuthRefreshExchangeError"}},OAuthRefreshStoreError=class extends Error{constructor(cause){super("Credential store operation failed",{cause}),this.name="OAuthRefreshStoreError"}},inflightByStore=new WeakMap;function projectOAuthSlot(credential,name){let projected=projectSlot(credential,name);return projected?.type==="oauth"?projected:void 0}function refreshOAuthCredential(request){let registry=inflightByStore.get(request.credentials);registry||(registry=new Map,inflightByStore.set(request.credentials,registry));let key=`${request.providerId}\0${request.slotName??""}\0${request.stale.refresh}`,inflight=registry.get(key);if(!inflight){let controller=new AbortController,created={controller,waiters:0,owned:!1,promise:Promise.resolve(void 0)};created.promise=exchangeAndStore(request,controller.signal).finally(()=>{registry.get(key)===created&&registry.delete(key)}),registry.set(key,created),inflight=created}return join(inflight,request.signal,request.owning),raceWithAbortSignal(inflight.promise,request.signal)}function join(inflight,signal,owning){inflight.waiters++,owning&&(inflight.owned=!0);let leave=()=>{inflight.waiters--,inflight.waiters===0&&inflight.owned&&inflight.controller.abort(signal.reason)};signal.aborted?leave():signal.addEventListener("abort",leave,{once:!0})}async function exchangeAndStore(request,signal){let{credentials,providerId,oauth,slotName}=request,view=credential=>{if(credential?.type==="oauth")return slotName===void 0?credential:projectOAuthSlot(credential,slotName)},latest;try{latest=await credentials.read(providerId,{signal})}catch(error){throw new OAuthRefreshStoreError(error)}let current=view(latest);if(!current)return;if(!request.isStale(current))return latest;let refreshed;try{let exchangeSignal=AbortSignal.any([signal,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS)]);refreshed=await oauth.refresh(current,exchangeSignal),signal.throwIfAborted()}catch(error){signal.throwIfAborted();let causeClass=oauthRefreshFailureCause(error);throw causeClass!==void 0&&console.warn("OAuth refresh unavailable",JSON.stringify({provider:providerId,...slotName?{slot:slotName}:{},cause:causeClass})),new OAuthRefreshExchangeError(error)}try{return await credentials.modify(providerId,async stored=>{if(stored?.type!=="oauth")return;let slot=view(stored);if(!(!slot||slot.refresh!==current.refresh))return slotName===void 0?mergeRefreshed(stored,refreshed):mergeRefreshedSlot(stored,slotName,refreshed)})}catch(error){throw new OAuthRefreshStoreError(error)}}var ConfigReferenceError=class extends Error{constructor(field,reference,reason){super(`${field}: configuration reference ${reason}`),this.name="ConfigReferenceError",this.field=field,this.reference=reference,this.reason=reason}};async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async function readSlotCredential(credentials,providerId,slotName,signal){let projected;try{projected=credentials.readSlot?await credentials.readSlot(providerId,slotName,{signal}):projectSlot(await credentials.read(providerId,{signal}),slotName)}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}let key=projected?.type==="api_key"?projected.key:void 0;if(typeof key=="object"&&key!==null){let cause=new ConfigReferenceError(`${providerId}.accounts.${slotName}.key`,key,"forbidden");throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause})}return projected}var PROVIDER_NOT_CONFIGURED_PREFIX="Provider is not configured: ";function providerNotConfiguredMessage(providerId){return`${PROVIDER_NOT_CONFIGURED_PREFIX}${providerId}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext,apiKey=provider.auth.apiKey;if(overrides?.apiKey!==void 0&&apiKey&&!apiKey.ambientOnly)return resolveApiKey(requestAuthContext,apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let slotName=overrides?.slotName;if(slotName!==void 0){let projected=await readSlotCredential(credentials,provider.id,slotName,signal);if(!projected)return;if(projected.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,projected,requestAuthContext,overrides?.env,signal,overrides?.minOAuthValidityMs,slotName,overrides?.rejectedAccess);if(projected.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...projected,env:{...projected.env,...overrides.env}}:projected;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,requestAuthContext,overrides?.env,signal,overrides?.minOAuthValidityMs,void 0,overrides?.rejectedAccess);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}if(overrides?.apiKey!==void 0&&apiKey)return resolveApiKey(requestAuthContext,apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let ambientCredential=apiKey?.ambientOnly&&overrides?.env?{type:"api_key",key:"",env:overrides.env}:void 0;return apiKey?resolveApiKey(requestAuthContext,apiKey,provider.id,ambientCredential,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]!==void 0?env[name]:await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3;function oauthRefreshModelsError(error,providerId){if(error instanceof ModelsError)return error;if(error instanceof OAuthRefreshExchangeError)return classifyOAuthRefreshFailure(error.cause)==="transient"?new OAuthRefreshUnavailableError(providerId,error.cause):new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error.cause});let cause=error instanceof OAuthRefreshStoreError?error.cause:error;return new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause})}async function resolveStoredOAuth(credentials,providerId,oauth,stored,authContext,requestEnv,signal,minOAuthValidityMs,slotName,rejectedAccess){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,isStale=credential2=>expiresSoon(credential2)||rejectedAccess!==void 0&&credential2.access===rejectedAccess,credential=stored;if(isStale(credential)){let post;try{post=await refreshOAuthCredential({credentials,providerId,oauth,stale:credential,slotName,isStale,signal,owning:!0})}catch(error){throw signal.throwIfAborted(),oauthRefreshModelsError(error,providerId)}if(post?.type!=="oauth")return;let postView=slotName===void 0?post:projectOAuthSlot(post,slotName);if(!postView)return;if(credential=postView,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}let storedEnv=credentialEnvironment(credential),effectiveEnv=requestEnv?{...storedEnv,...requestEnv}:storedEnv,effectiveCredential=effectiveEnv?{...credential,env:effectiveEnv}:credential;if(oauth.check)try{if(!await oauth.check({ctx:authContext,credential:effectiveCredential,signal}))return}catch(error){throw new ModelsError("auth",`OAuth auth check failed for provider ${providerId}`,{cause:error})}try{return{auth:await oauth.toAuth(effectiveCredential),...effectiveEnv?{env:effectiveEnv}:{},source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}function credentialEnvironment(credential){let value=credential.env;if(typeof value!="object"||value===null||Array.isArray(value))return;let environment={};for(let[name,entry]of Object.entries(value)){if(typeof entry!="string")return;environment[name]=entry}return environment}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function resolveRefreshCredential(provider,credentials,authContext,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;if(!oauth)return;if(Date.now()<stored.expires)return stored;if(signal.aborted)return;let post;try{post=await refreshOAuthCredential({credentials,providerId:provider.id,oauth,stale:stored,isStale:credential2=>Date.now()>=credential2.expires,signal,owning:!1})}catch(error){throw oauthRefreshModelsError(error,provider.id)}return post?.type==="oauth"?post:void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}var GOOGLE_THINKING_APIS=["google-generative-ai","google-vertex"],GENERATION_4_THINKING_LEVEL_MAP={off:null,minimal:null,low:"low",medium:"medium",high:"high",xhigh:null,max:null},GENERATION_4_ID=/(?:^|\/)gemini-(?:[4-9]|[1-9]\d)(?:\.\d+)?(?:-|$)/;function isGoogleGeneration4OrLaterModelId(modelId){return GENERATION_4_ID.test(modelId.toLowerCase())}function inferGoogleThinkingLevelMap(model){if(model.thinkingLevelMap!==void 0)return model.thinkingLevelMap;if(GOOGLE_THINKING_APIS.includes(model.api)&&isGoogleGeneration4OrLaterModelId(model.id))return GENERATION_4_THINKING_LEVEL_MAP}var MAX_EFFORT_MODEL_IDS=new Set;function builtinCatalogAdvertisesMax(modelId){return MAX_EFFORT_MODEL_IDS.has(modelId)}function flattenModelCatalog(groups,type){return Object.fromEntries(Object.values(groups).flatMap(models=>Object.values(models)).filter(model=>model.type===type).map(model=>[model.id,model]))}function flattenChatModelCatalog(_provider,groups){let catalog=flattenModelCatalog(groups,"chat");for(let model of Object.values(catalog))typeof model.thinkingLevelMap?.max=="string"&&MAX_EFFORT_MODEL_IDS.add(model.id);return catalog}function flattenImageModelCatalog(_provider,groups){return flattenModelCatalog(groups,"image")}function flattenClassifierModelCatalog(_provider,groups){return flattenModelCatalog(groups,"classifier")}function costCardAt(cost,atMs){let card=cost,startedAt=Number.NEGATIVE_INFINITY;for(let rate of cost.effectiveRates??[]){let from=Date.parse(rate.effectiveFrom);from<=atMs&&from>startedAt&&(card=rate,startedAt=from)}return card}var InMemoryModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function getModelType(model){return model.type??"chat"}function isModelType(model,type){return getModelType(model)===type}function assertChatModel(model){if(!isModelType(model,"chat"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a chat model`)}function assertImageModel(model){if(!isModelType(model,"image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not an image model`)}function assertClassifierModel(model){if(!isModelType(model,"classifier"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a classifier model`)}function imageErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,output:[],stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function classifierErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}var KNOWN_MODEL_TYPES={chat:!0,image:!0,classifier:!0};function hasKnownModelType(model){return Object.hasOwn(KNOWN_MODEL_TYPES,getModelType(model))}function withKnownModelTypes(entry){return{...entry,models:entry.models.filter(hasKnownModelType)}}function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{constructor(options){this.providers=new Map,this.refreshGenerations=new Map,this.refreshControllers=new Map,this.publicationChains=new Map,this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getAllModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getAllModels?.()??entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getAllModels?.()??entry.getModels())}catch{}return models}getModelsOfType(type,provider){return this.getAllModels(provider).filter(model=>isModelType(model,type))}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}getModelOfType(type,provider,id){return this.getModelsOfType(type,provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?withKnownModelTypes(structuredClone(stored)):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await resolveRefreshCredential(provider,this.credentials,this.authContext,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){let oauth=provider.auth.oauth;if(credential?.type==="oauth"){if(!oauth)return;if(!oauth.check)return{source:"OAuth",type:"oauth"};try{return await oauth.check({ctx:this.authContext,credential,signal})}catch(error){throw new ModelsError("auth",`OAuth auth check failed for provider ${provider.id}`,{cause:error})}}let apiKey=provider.auth.apiKey;if(apiKey)if(apiKey.check)try{let result=await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal});if(result)return result}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}else{let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});if(resolution)return{source:resolution.source,type:"api_key",...resolution.ambient?{ambient:!0}:{}}}if(oauth?.check)try{return await oauth.check({ctx:this.authContext,signal})}catch(error){throw new ModelsError("auth",`OAuth auth check failed for provider ${provider.id}`,{cause:error})}}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}async getAuthenticatedProviders(providerId,signal){signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).filter(entry=>entry.auth!==void 0)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getModels();return provider.filterModels?.(models,credential)??models}))();return raceWithAbortSignal(available,signal)}async getAvailableOfType(type,providerId,options){return(await this.getAllAvailable(providerId,options)).filter(model=>isModelType(model,type))}getAllAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getAllModels?.()??provider.getModels();if(provider.filterAllModels)return provider.filterAllModels(models,credential);if(!provider.filterModels)return models;let availableChatIds=new Set(provider.filterModels(provider.getModels(),credential).map(model=>model.id));return models.filter(model=>!isModelType(model,"chat")||availableChatIds.has(model.id))}))();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction,options){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let{onAccountCommitted,...providerInteraction}=interaction,loginOperation=method.login({...providerInteraction,signal},options),loggedIn=await raceWithAbortSignal(loginOperation,signal),credential=type==="api_key"&&provider.auth.apiKey?.keyOptional?withoutBlankKey(loggedIn):loggedIn;assertLoginKeyPresent(credential);let committedName,committedOrigin,mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async current=>(mutationStarted=!0,markMutationStarted?.(),appendLoginSlot(current,credential,(name,origin)=>{committedName=name,committedOrigin=origin})),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return committedName!==void 0&&committedOrigin!==void 0&&onAccountCommitted?.({providerId,name:committedName,origin:committedOrigin}),credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{if(options?.slotId!==void 0){let current=await this.credentials.read(providerId,{signal}),next=removeSlot(current,options.slotId);if(next===void 0){await this.credentials.delete(providerId,{signal});return}await this.credentials.modify(providerId,async()=>next,{signal});return}await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}requireChatProvider(model){return assertChatModel(model),this.requireProvider(model)}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,transcript,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,transcript,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireChatProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let provider=this.requireChatProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}async generateImages(model,context,options){try{assertImageModel(model);let provider=this.requireProvider(model);if(!provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.generateImages(requestModel,context,requestOptions)}catch(error){return imageErrorResult(model,error,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let provider=this.requireProvider(model);if(!provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.classify(requestModel,context,requestOptions)}catch(error){return classifierErrorResult(model,error,options?.signal?.aborted)}}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let single=input.api&&typeof input.api.stream=="function"?input.api:void 0,byApi=single||!input.api?void 0:input.api,images=input.images,classifiers=input.classifiers,streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0),imageImplementations=Object.values(images??{}).filter(entry=>entry!==void 0),classifierImplementations=Object.values(classifiers??{}).filter(entry=>entry!==void 0);if(streams.length===0&&imageImplementations.length===0&&classifierImplementations.length===0)throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>getModelType(entry)===getModelType(model)&&entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,retryPolicy:input.retryPolicy,auth:input.auth,getModels:()=>currentModels().filter(model=>isModelType(model,"chat")),getAllModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(input.restoreModels)try{let chatModels=restored.filter(model=>isModelType(model,"chat")),otherModels=restored.filter(model=>!isModelType(model,"chat"));restored=[...input.restoreModels(chatModels),...otherModels]}catch{}if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let fetched=await fetchModels(context);if(context.signal.aborted)return;let refreshed=fetched.filter(hasKnownModelType);refreshed.length!==0&&await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,filterAllModels:input.filterAllModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))};return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),images&&imageImplementations.length>0&&(provider.generateImages=async(model,context,options)=>{let implementation=images[model.api];return implementation?implementation.generateImages(model,context,options):imageErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no image generation implementation for "${model.api}"`))}),classifiers&&classifierImplementations.length>0&&(provider.classify=async(model,context,options)=>{let implementation=classifiers[model.api];return implementation?implementation.classify(model,context,options):classifierErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no classifier implementation for "${model.api}"`))}),provider}function hasApi(model,api){return isModelType(model,"chat")&&model.api===api}function calculateCost(model,usage,atMs=Date.now()){if(model.cost.unknown)return usage.cost.input=0,usage.cost.output=0,usage.cost.cacheRead=0,usage.cost.cacheWrite=0,usage.cost.total=0,usage.costUnknown=!0,usage.cost;let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,card=costCardAt(model.cost,atMs),rates=card,matchedThreshold=-1;for(let tier of card.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"],OPENAI_THINKING_APIS=["openai-completions","openai-responses","azure-openai-responses","openai-codex-responses"],GPT_6_ASTRA_THINKING_LEVEL_MAP={off:null,minimal:null,low:"low",medium:"medium",high:"high",xhigh:"xhigh",max:"max"},GPT_6_NO_NONE_EFFORT_MODEL_IDS=["gpt-6-astra","gpt-6.1-sol"];function inferOpenAIThinkingLevelMap(model){if(model.thinkingLevelMap!==void 0)return model.thinkingLevelMap;if(OPENAI_THINKING_APIS.includes(model.api)&&GPT_6_NO_NONE_EFFORT_MODEL_IDS.some(id=>matchesModelFamily(model.id,id)))return GPT_6_ASTRA_THINKING_LEVEL_MAP}function inferThinkingLevelMap(model){return inferOpenAIThinkingLevelMap(model)??inferGoogleThinkingLevelMap(model)}function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>inferThinkingLevelMap(model)?.[level]===null?!1:level==="xhigh"?supportsXhigh(model):level==="max"?supportsMax(model):!0):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function supportsXhigh(model){let mapped=inferOpenAIThinkingLevelMap(model)?.xhigh;return mapped===null?!1:mapped!==void 0?!0:model.thinkingLevelMap!==void 0?!1:model.reasoning&&supportsXhighModelId(model.id)}var XHIGH_MODEL_IDS=["gpt-5.2","gpt-5.3","gpt-5.4","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-6.1-sol","gpt-6-sol","gpt-6-luna","deepseek-v4-pro","deepseek-v4-flash","opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8","opus-5","sonnet-5","fable-5"];function escapeRegex(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function matchesModelFamily(modelId,family){let normalizedId=modelId.toLowerCase(),escapedFamily=escapeRegex(family.toLowerCase()),leadingBoundary=family.startsWith("gpt-")?"(?:^|[/.:_])":"(?:^|[/.:_-])";return new RegExp(`${leadingBoundary}${escapedFamily}(?=$|[^a-z0-9])`).test(normalizedId)}function supportsXhighModelId(modelId){return XHIGH_MODEL_IDS.some(id=>matchesModelFamily(modelId,id))}function supportsMax(model){let mapped=inferOpenAIThinkingLevelMap(model)?.max;return mapped===null?!1:mapped!==void 0?!0:model.thinkingLevelMap!==void 0?!1:supportsMaxModel(model)}var CONFIGURATION_UPDATE_APIS=["openai-responses","openai-codex-responses","azure-openai-responses"];function supportsConfigurationUpdate(model){return CONFIGURATION_UPDATE_APIS.includes(model.api)?model.compat?.supportsConfigurationUpdate===!0:!1}var OPENAI_MAX_APIS=["openai-responses","azure-openai-responses","openai-codex-responses","openai-completions"],OPENAI_MAX_MODEL_IDS=["gpt-5.6-sol","gpt-6-astra","gpt-6.1-sol","gpt-6-sol","gpt-6-luna"],MAX_MODEL_IDS=["opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8","opus-5","sonnet-5","fable-5"];function supportsMaxModel(model){return model.reasoning?builtinCatalogAdvertisesMax(model.id)||OPENAI_MAX_APIS.includes(model.api)&&OPENAI_MAX_MODEL_IDS.some(id=>matchesModelFamily(model.id,id))?!0:MAX_MODEL_IDS.some(id=>matchesModelFamily(model.id,id)):!1}function modelsAreEqual(a,b){return!a||!b?!1:getModelType(a)===getModelType(b)&&a.id===b.id&&a.provider===b.provider}export{ModelsError,OAuthTokenEndpointError,isOAuthRefreshUnavailableError,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,PROVIDER_REQUEST_ID_MARKER,formatProviderRequestId,stripProviderRequestIds,USAGE_LIMIT_EXHAUSTION,ANTHROPIC_THIRD_PARTY_BILLING_MARKER,isAnthropicThirdPartyBillingMessage,isQuotaExhaustionMessage,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,retryDelayMs,retryTransientCall,retryAssistantCall,isRetryableAssistantError,isProviderStreamStallError,formatStallDuration,describeProviderStallForUser,isProviderTimeoutError,isRetryableErrorMessage,classifyErrorMessage,ACCOUNT_LIMIT_NEXT_STEP_LEAD,TURN_RETRY_SUPPRESSION_PREFIX,stripTurnRetrySuppressionPrefix,describeProviderFailureForUser,describeReplacedInstall,lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,LEGACY_PROVIDER_IDS,normalizeProviderId,normalizeModelRef,isLegacyProviderId,legacyProviderIdsFor,readByProviderId,legacyProviderIdRejection,accountDisplayName,accountLabel,renameSlotDisplayName,listSlots,upsertSlot,removeSlot,pinSlot,projectSlot,appendLoginSlot,repairManagedSentinelSlots,ConfigReferenceError,PROVIDER_NOT_CONFIGURED_PREFIX,providerNotConfiguredMessage,isGoogleGeneration4OrLaterModelId,flattenChatModelCatalog,flattenImageModelCatalog,flattenClassifierModelCatalog,costCardAt,InMemoryModelsStore,getModelType,isModelType,assertChatModel,assertImageModel,assertClassifierModel,imageErrorResult,classifierErrorResult,contentText,getSystemMessageText,renderSystemMessageUpdate,createInitialSystemMessage,normalizeContext,getInitialSystemMessage,withoutInitialSystemMessage,getCurrentTools,getCurrentSystemMessage,getCurrentSystemPrompt,collapseSystemMessages,resolveTranscript,toToolDeclaration,declarationsEqual,getToolStateChanges,getDeclaredTools,hasToolRedefinitions,hasNonAdditiveToolChanges,resolveTranscriptTools,createModels,createProvider,hasApi,calculateCost,inferOpenAIThinkingLevelMap,inferThinkingLevelMap,getSupportedThinkingLevels,clampThinkingLevel,supportsXhigh,supportsMax,supportsConfigurationUpdate,modelsAreEqual};
11
+ `),...sections.size>0?{sections:Object.fromEntries(sections)}:{},...tools.length>0?{toolsAdded:tools}:{},timestamp:timestamp??0}}function getCurrentSystemPrompt(messages){let message=getCurrentSystemMessage(messages);return message?getSystemMessageText(message):""}function collapseSystemMessages(context){let head=getCurrentSystemMessage(context.messages),messages=context.messages.filter(message=>message.role!=="system");return{...context,messages:head?[head,...messages]:messages}}function resolveTranscript(context,supportsMidConvoSystemMessages){return supportsMidConvoSystemMessages?context:collapseSystemMessages(context)}function toToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:JSON.parse(JSON.stringify(tool.parameters)),...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function declarationsEqual(left,right){return JSON.stringify(toToolDeclaration(left))===JSON.stringify(toToolDeclaration(right))}function getToolStateChanges(previous,current){let previousTools=new Map(previous.map(tool=>[tool.name,tool])),currentTools=new Map(current.map(tool=>[tool.name,tool]));return{toolsAdded:current.filter(tool=>{let previousTool=previousTools.get(tool.name);return previousTool===void 0||!declarationsEqual(previousTool,tool)}).map(toToolDeclaration),toolsRemoved:previous.filter(tool=>{let currentTool=currentTools.get(tool.name);return currentTool===void 0||!declarationsEqual(tool,currentTool)}).map(tool=>({name:tool.name}))}}function getDeclaredTools(messages){let definitions=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[])definitions.set(tool.name,tool);return[...definitions.values()]}function hasToolRedefinitions(messages){let declared=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[]){let previous=declared.get(tool.name);if(previous!==void 0&&!declarationsEqual(previous,tool))return!0;declared.set(tool.name,tool)}return!1}function hasNonAdditiveToolChanges(messages){let declared=new Set;for(let message of messages)if(isSystemMessage(message)){if((message.toolsRemoved?.length??0)>0)return!0;for(let tool of message.toolsAdded??[]){if(declared.has(tool.name))return!0;declared.add(tool.name)}}return!1}function resolveTranscriptTools(messages,supportsToolAdditions){let anchorsAdditions=supportsToolAdditions&&!hasNonAdditiveToolChanges(messages);return{requestTools:anchorsAdditions?getInitialSystemMessage(messages)?.toolsAdded??[]:getCurrentTools(messages),anchorsAdditions}}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status){super(message),this.status=status}},TRANSPORT_CODES=new Set(["ConnectionRefused","FailedToOpenSocket","ConnectionClosed","ECONNREFUSED","ECONNRESET","ENOTFOUND","EAI_AGAIN","ETIMEDOUT","EPIPE","UND_ERR_CONNECT_TIMEOUT","UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_SOCKET"]),MAX_CAUSE_LINKS=16;function oauthRefreshFailureCause(error){let seen=new Set;for(;typeof error=="object"&&error!==null&&!seen.has(error)&&seen.size<MAX_CAUSE_LINKS;){if(seen.add(error),Reflect.get(error,"name")==="TimeoutError")return"timeout";let code=Reflect.get(error,"code");if(typeof code=="string"&&TRANSPORT_CODES.has(code))return code==="ConnectionRefused"||code==="ECONNREFUSED"?"connection_refused":code.toLowerCase();let status=Reflect.get(error,"status");if(typeof status=="number"&&(status===408||status===429||status>=500&&status<600))return`http_${status}`;error=Reflect.get(error,"cause")}}function classifyOAuthRefreshFailure(error){return oauthRefreshFailureCause(error)===void 0?"permanent":"transient"}var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};function isOAuthRefreshUnavailableError(error){let seen=new Set;for(;typeof error=="object"&&error!==null&&!seen.has(error)&&seen.size<MAX_CAUSE_LINKS;){if(seen.add(error),Reflect.get(error,UNAVAILABLE)===!0)return!0;error=Reflect.get(error,"cause")}return!1}var EMPTY_RESPONSE_ERROR="Model returned an empty response twice",EMPTY_TOOL_USE_ERROR="Model returned tool_use without a tool call twice",FORWARDED_EMPTY_RESPONSE_ERROR="Model returned an empty response after streaming thinking",FORWARDED_EMPTY_TOOL_USE_ERROR="Model returned tool_use without a tool call after streaming thinking";var OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC="oauth_refresh_unavailable",PROVIDER_REQUEST_ID_MARKER="request id:",REQUEST_ID_SEGMENT=/request id: [^\s,;)]+/gi;function formatProviderRequestId(label,id){return`${label} ${PROVIDER_REQUEST_ID_MARKER} ${id}`}function stripProviderRequestIds(text){return text.replace(REQUEST_ID_SEGMENT,PROVIDER_REQUEST_ID_MARKER)}function buildProviderErrorPattern(patterns){return new RegExp(patterns.join("|"),"i")}function escapeRegExp(text){return text.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var USAGE_LIMIT_EXHAUSTION={codes:["usage_limit_reached","usage_not_included"],markers:["usage_limit_reached","usage_not_included","usage limit has been reached"]},ANTHROPIC_THIRD_PARTY_BILLING_MARKER="Third-party apps now draw from your extra usage";function isAnthropicThirdPartyBillingMessage(errorMessage){return errorMessage?.toLowerCase().includes(ANTHROPIC_THIRD_PARTY_BILLING_MARKER.toLowerCase())===!0}var QUOTA_EXHAUSTION_PATTERNS=["GoUsageLimitError","FreeUsageLimitError","Monthly usage limit reached","available balance","insufficient_quota","out of budget","quota exceeded","billing","credits_required","credits are required",...USAGE_LIMIT_EXHAUSTION.markers,escapeRegExp(ANTHROPIC_THIRD_PARTY_BILLING_MARKER)],QUOTA_EXHAUSTION_PATTERN=buildProviderErrorPattern(QUOTA_EXHAUSTION_PATTERNS);function isQuotaExhaustionMessage(errorMessage){return errorMessage!==void 0&&QUOTA_EXHAUSTION_PATTERN.test(stripProviderRequestIds(errorMessage))}var NON_RETRYABLE_PROVIDER_ERROR_PATTERN=buildProviderErrorPattern([...QUOTA_EXHAUSTION_PATTERNS,"invalid request: tools\\.","invalid request: functions\\.","tools\\.[^ ]*function\\.parameters","tools\\.\\d+\\.function\\.parameters","invalid tool schema","subscription_sharing_usage_limit_exceeded"]),RETRYABLE_PROVIDER_ERROR_PATTERN=buildProviderErrorPattern(["Credential store is busy: lock","overloaded","currently experiencing high demand","rate.?limit","too many requests","429","500","502","503","504","520","522","524","service.?unavailable","server.?error","internal.?error","provider.?returned.?error","exceeded request buffer limit while retrying upstream","network.?error","connection.?error","connection.?refused","connection.?lost","other side closed","fetch failed","getaddrinfo","ENOTFOUND","EAI_AGAIN","upstream.?connect","upstream.?unavailable","reset before headers","socket hang up","socket connection was closed","timed? out","timeout","terminated","websocket.?closed","websocket.?error","ended without","stream ended before message_stop","stream ended before a terminal response event","http2 request did not get a response","retry delay","you can retry your request","try your request again","please retry your request","the model request was rejected\\.\\s*check the request and try again\\.?","was found without a corresponding `","must not contain streaming index",escapeRegExp(FORWARDED_EMPTY_RESPONSE_ERROR),escapeRegExp(FORWARDED_EMPTY_TOOL_USE_ERROR),"ResourceExhausted",'"type"\\s*:\\s*"forbidden"\\s*,\\s*"message"\\s*:\\s*"Request not allowed\\.?"','"message"\\s*:\\s*"Request not allowed\\.?"\\s*,\\s*"type"\\s*:\\s*"forbidden"',"Lock file is already being held","subscription_sharing_usage_unavailable","subscription_sharing_user_unavailable"]),DEFAULT_MAX_AGENT_RETRY_DELAY_MS=6e4;function retryDelayMs(policy,attempt){let scheduledDelayMs=policy.baseDelayMs*2**Math.max(0,attempt-1),sample=Math.min(1,Math.max(0,(policy.random??Math.random)())),jitteredDelayMs=Math.round(scheduledDelayMs*(.9+sample*.2)),safeDelay=Number.isSafeInteger(jitteredDelayMs)?jitteredDelayMs:Number.MAX_SAFE_INTEGER;return Math.min(safeDelay,policy.maxAgentDelayMs??DEFAULT_MAX_AGENT_RETRY_DELAY_MS)}var RetrySleepAbortError=class extends Error{constructor(){super("Aborted")}};function sleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(new RetrySleepAbortError);return}let timeout=setTimeout(resolve,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject(new RetrySleepAbortError)},{once:!0})})}async function retryTransientCall(produce,isRetryable,policy,signal,callbacks){let maxAttempts=policy?.enabled?policy.maxRetries:0,attempt=0,lastRetry;for(;;)try{let value=await produce();return lastRetry&&await callbacks?.onRetryFinished?.(!0,lastRetry.attempt),value}catch(error){if(error instanceof RetrySleepAbortError)throw error;if(attempt>=maxAttempts||!isRetryable(error))throw lastRetry&&await callbacks?.onRetryFinished?.(!1,lastRetry.attempt,errorMessageOf(error)),error;attempt++,lastRetry={attempt,errorMessage:errorMessageOf(error)};let delayMs=retryDelayMs(policy,attempt);await callbacks?.onRetryScheduled?.(attempt,maxAttempts,delayMs,lastRetry.errorMessage);try{await sleep(delayMs,signal)}catch(sleepError){throw await callbacks?.onRetryFinished?.(!1,attempt,lastRetry.errorMessage),sleepError instanceof RetrySleepAbortError?error:sleepError}await callbacks?.onRetryAttemptStart?.()}}function errorMessageOf(error){return error instanceof Error?error.message||"Unknown error":String(error)||"Unknown error"}async function retryAssistantCall(produce,policy,signal,callbacks){let maxAttempts=policy?.enabled?policy.maxRetries:0,attempt=0,lastRetry;for(;;){let response=await produce();if(response.stopReason==="aborted")return lastRetry&&await callbacks?.onRetryFinished?.(!1,lastRetry.attempt),response;if(response.stopReason!=="error")return lastRetry&&await callbacks?.onRetryFinished?.(!0,lastRetry.attempt),response;if(attempt>=maxAttempts||!isRetryableAssistantError(response))return lastRetry&&await callbacks?.onRetryFinished?.(!1,lastRetry.attempt,response.errorMessage),response;attempt++,lastRetry={attempt,errorMessage:response.errorMessage||"Unknown error"};let delayMs=retryDelayMs(policy,attempt);await callbacks?.onRetryScheduled?.(attempt,maxAttempts,delayMs,lastRetry.errorMessage);try{await sleep(delayMs,signal)}catch(error){if(await callbacks?.onRetryFinished?.(!1,attempt,lastRetry.errorMessage),error instanceof RetrySleepAbortError){let{errorMessage:_errorMessage,...rest}=response;return{...rest,stopReason:"aborted"}}throw error}await callbacks?.onRetryAttemptStart?.()}}function isRetryableAssistantError(message){return message.stopReason==="error"&&message.diagnostics?.some(diagnostic=>diagnostic.type===OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC)?!0:message.stopReason!=="error"||message.stopDetails?.type==="refusal"||message.stopDetails?.type==="sensitive"||!message.errorMessage?!1:isRetryableErrorMessage(message.errorMessage)}var PROVIDER_STREAM_STALL_ERROR_PATTERN=/^(?:Idle timeout waiting for provider stream after \d+ms|Provider stream start timed out after \d+ms(?: \([^)]*\))?|WebSocket liveness timeout after \d+ms \(\d+ pings unanswered\)|Provider stream stalled after the last output item: response\.completed timed out after \d+ms)$/i,PROVIDER_TRANSPORT_TIMEOUT_ERROR_PATTERN=/^Request timed out\.?$/i;function isProviderStreamStallError(message){return message.stopReason==="error"&&PROVIDER_STREAM_STALL_ERROR_PATTERN.test(message.errorMessage??"")}var PROVIDER_STALL_PHASES=[{pattern:/^Provider stream start timed out after (\d+)ms/i,symptom:"accepted the request but never started sending a response",setting:"retry.provider.streamStartTimeoutMs"},{pattern:/^Idle timeout waiting for provider stream after (\d+)ms/i,symptom:"started the response and then went silent",setting:"retry.provider.timeoutMs"},{pattern:/^WebSocket liveness timeout after (\d+)ms/i,symptom:"stopped answering connection health checks"},{pattern:/^Provider stream stalled after the last output item: response\.completed timed out after (\d+)ms/i,symptom:"finished its output but never sent the end-of-response event"}];function formatStallDuration(timeoutMs){return timeoutMs<1e3?`${timeoutMs}ms`:timeoutMs<12e4?`${Math.round(timeoutMs/100)/10}s`:`${Math.round(timeoutMs/6e3)/10}m`}function describeProviderStallForUser(errorMessage,options={}){if(errorMessage)for(let{pattern,symptom,setting}of PROVIDER_STALL_PHASES){let match=pattern.exec(errorMessage);if(!match)continue;let subject=options.model?`The provider for ${options.model}`:"The provider",duration=formatStallDuration(Number(match[1])),sentences=[`${subject} ${symptom} within ${duration}, so the request was cancelled.`],attempts=options.attempts??0;if(attempts>0&&sentences.push(`Retried ${attempts} time${attempts===1?"":"s"} on the same model with the same result.`),options.recovery){let raise=setting?`, or raise ${setting} in settings (0 disables the bound)`:"",lead=options.recovery==="no-fallback-configured"?"No fallback model is configured for it, so nothing could take the turn over: run /fallback to add one":"Every model in its fallback chain was tried as well: run /fallback to review the chain";sentences.push(`${lead}, send the message again${raise}.`)}return sentences.join(" ")}}function isProviderTimeoutError(message){return message.abortSource==="provider"||isProviderStreamStallError(message)?!0:message.stopReason!=="error"&&message.stopReason!=="aborted"?!1:PROVIDER_TRANSPORT_TIMEOUT_ERROR_PATTERN.test(message.errorMessage??"")}function isRetryableErrorMessage(errorMessage){return classifyErrorMessage(errorMessage)==="retryable"}function classifyErrorMessage(errorMessage){if(!errorMessage)return"unknown";let text=stripProviderRequestIds(errorMessage);return NON_RETRYABLE_PROVIDER_ERROR_PATTERN.test(text)?"non-retryable":RETRYABLE_PROVIDER_ERROR_PATTERN.test(text)?"retryable":"unknown"}var CLAUDE_EXTRA_USAGE_URL="https://claude.ai/settings/usage",ACCOUNT_LIMIT_NEXT_STEP_LEAD="To keep going now, ",RETRY_AFTER_MARKER=/\s*\(retry-after-ms: \d+\)$/;function describeAnthropicThirdPartyBilling(provider){return provider==="anthropic-subscription"?`Anthropic billed this Claude Code request to your extra usage instead of your plan limits, and your extra usage is used up. Add extra usage at ${CLAUDE_EXTRA_USAGE_URL}, or switch to another model with /model.`:`Anthropic billed this request to your extra usage instead of your Claude plan limits, because a Claude subscription used directly through the Anthropic API counts as a third-party app. Run /login and choose "Anthropic Subscription (Claude Pro/Max)" so requests run through Claude Code and use your plan limits, add extra usage at ${CLAUDE_EXTRA_USAGE_URL}, or switch to another model with /model.`}var TURN_RETRY_SUPPRESSION_PREFIX="senpi:no-turn-retry:";function stripTurnRetrySuppressionPrefix(message){return message.replaceAll(TURN_RETRY_SUPPRESSION_PREFIX,"")}var WEBSOCKET_CLOSED_PATTERN=/^WebSocket closed\b/i,WEBSOCKET_ERROR_PATTERN=/^WebSocket error$/i,WEBSOCKET_CONNECT_TIMEOUT_PATTERN=/^WebSocket connect timeout after (\d+)ms/i,RECOVERY_SENTENCE={"no-fallback-configured":"No fallback model is configured for it, so nothing could take the turn over: run /fallback to add one, or send the message again to continue from the partial reply.","chain-exhausted":"Every model in its fallback chain was tried as well: run /fallback to review the chain, or send the message again to continue from the partial reply."};function transportSymptom(errorMessage,subject){if(WEBSOCKET_CLOSED_PATTERN.test(errorMessage))return`The connection to ${subject} dropped before the reply finished (${errorMessage}).`;if(WEBSOCKET_ERROR_PATTERN.test(errorMessage))return`The connection to ${subject} reported an error before the reply finished (${errorMessage}).`;let connectTimeout=WEBSOCKET_CONNECT_TIMEOUT_PATTERN.exec(errorMessage);if(connectTimeout)return`${subject.replace(/^the provider/,"The provider")} did not accept the connection within ${formatStallDuration(Number(connectTimeout[1]))}.`}function describeProviderFailureForUser(errorMessage,options={}){if(!errorMessage)return;let message=stripTurnRetrySuppressionPrefix(errorMessage).trim();if(!message)return;if(isAnthropicThirdPartyBillingMessage(message))return describeAnthropicThirdPartyBilling(options.model?.split("/")[0]);if(options.usageLimit==="account"){if(message.includes(ACCOUNT_LIMIT_NEXT_STEP_LEAD))return message.replace(RETRY_AFTER_MARKER,"");let provider=options.model?.split("/")[0],reset=/\bresets?\s+([^"}\n]+)/i.exec(message)?.[1]?.trim().replace(/[.;]+$/,"");return`The ${provider?`${provider} `:""}account usage limit has been reached${reset?` (resets ${reset})`:""}. Switch to another provider with /model, or configure another provider in retry.fallbackChains.`}let stall=describeProviderStallForUser(message,options);if(stall!==void 0)return stall;let subject=options.model?`the provider for ${options.model}`:"the provider",symptom=transportSymptom(message,subject);if(symptom===void 0)return;let sentences=[symptom],attempts=options.attempts??0;return attempts>0&&sentences.push(`Retried ${attempts} time${attempts===1?"":"s"} on the same model with the same result.`),options.recovery&&sentences.push(RECOVERY_SENTENCE[options.recovery]),sentences.join(" ")}var MISSING_MODULE_PATTERNS=[/^Cannot find module ['"]([^'"]+)['"]/,/^ENOENT reading ['"]([^'"]+)['"]/],SHIPPED_MODULE=/^(?:\.{1,2}[\\/]|[\\/]|[A-Za-z]:[\\/]|file:).*\.m?js$/;function describeReplacedInstall(error){if(error instanceof Error)for(let pattern of MISSING_MODULE_PATTERNS){let missing=pattern.exec(error.message)?.[1];if(missing!==void 0&&SHIPPED_MODULE.test(missing))return`${TURN_RETRY_SUPPRESSION_PREFIX}The installed package changed while this session was running, so ${missing.split(/[\\/]/).at(-1)} can no longer be loaded. Restart and resume this session to continue.`}}function createSetupErrorMessage(model,error){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:describeReplacedInstall(error)??(error instanceof Error?error.message:String(error)),...isOAuthRefreshUnavailableError(error)?{diagnostics:[{type:OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,timestamp:Date.now(),details:{provider:model.provider}}]}:{},timestamp:Date.now()}}function hasResult(source){return typeof source.result=="function"}var LazyAssistantMessageEventStream=class extends AssistantMessageEventStream{setCancellationHandler(handler){this.cancellationHandler=handler,setAssistantReader(this,project=>this.withCancellation(this.mapIterator(project)))}[Symbol.asyncIterator](){return this.withCancellation(super[Symbol.asyncIterator]())}withCancellation(iterator){return{next:()=>iterator.next(),return:async()=>(await this.cancellationHandler?.(),{value:void 0,done:!0})}}};async function forwardStream(target,source,iterator){for(;;){let event=await iterator.next();if(event.done)break;target.push(event.value)}target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let outer=new LazyAssistantMessageEventStream,inner=setup(),iterator=inner.then(source=>assistantEvents(source,progress=>pushAssistantProgress(outer,progress))[Symbol.asyncIterator]()),cancellation;return outer.setCancellationHandler(()=>(cancellation??=iterator.then(async sourceIterator=>{await sourceIterator.return?.()}),cancellation)),Promise.all([inner,iterator]).then(([source,sourceIterator])=>forwardStream(outer,source,sourceIterator)).catch(error=>{let message=createSetupErrorMessage(model,error);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{constructor(){this.credentials=new Map,this.chains=new Map}enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var DEFAULT_SLOT_NAME="default",SLOT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidSlotName(name){if(!SLOT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}var UNSAFE_DISPLAY_CHARACTERS=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u,DISPLAY_NAME_MAX_COLUMNS=32,BLANK_DISPLAY_CHARACTER=/^[\s\p{M}\u115f\u1160\u17b4\u17b5\u2800\u3164\uffa0]$/u,INVISIBLE_DISPLAY_CHARACTER=/^[\p{M}\u115f\u1160\u17b4\u17b5\u2800\u3164\uffa0]$/u,WIDE_DISPLAY_CHARACTER=/^(?:[\u1100-\u115f\u2329\u232a\u2e80-\u303e\u3041-\u33ff\u3400-\u4dbf\u4e00-\u9fff\ua000-\ua4cf\ua960-\ua97f\uac00-\ud7a3\uf900-\ufaff\ufe10-\ufe19\ufe30-\ufe6f\uff00-\uff60\uffe0-\uffe6]|[\u{1f300}-\u{1faff}]|[\u{20000}-\u{3fffd}])$/u,CYRILLIC_LOOKALIKES={\u0430:"a",\u0432:"b",\u0435:"e",\u043A:"k",\u043C:"m",\u043D:"h",\u043E:"o",\u0440:"p",\u0441:"c",\u0442:"t",\u0443:"y",\u0445:"x",\u0455:"s",\u0456:"i",\u0458:"j"},displayNameGraphemes=new Intl.Segmenter(void 0,{granularity:"grapheme"});function displayNameColumns(value){let columns=0;for(let{segment}of displayNameGraphemes.segment(value)){let codePoint=segment.codePointAt(0);if(codePoint===void 0)continue;let base=String.fromCodePoint(codePoint);INVISIBLE_DISPLAY_CHARACTER.test(base)||(columns+=WIDE_DISPLAY_CHARACTER.test(base)||segment.includes("\uFE0F")?2:1)}return columns}function normalizeDisplayName(value){return value.normalize("NFC").trim().replace(/\s+/gu," ")}function displayNameKey(value){return[...normalizeDisplayName(value).normalize("NFKC").toLowerCase()].filter(character=>!INVISIBLE_DISPLAY_CHARACTER.test(character)).map(character=>CYRILLIC_LOOKALIKES[character]??character).join("")}function accountDisplayName(value){if(typeof value!="string"||UNSAFE_DISPLAY_CHARACTERS.test(value))return;let normalized=normalizeDisplayName(value),characters=[...normalized];if(!(characters.length===0||new RegExp("^\\p{M}$","u").test(characters[0]))&&!characters.every(character=>BLANK_DISPLAY_CHARACTER.test(character)))return displayNameColumns(normalized)<=DISPLAY_NAME_MAX_COLUMNS?normalized:void 0}function accountLabel(account){let displayName=accountDisplayName(account.displayName);return displayName===void 0?account.name:`${displayName} (${account.name})`}function renameSlotDisplayName(credential,name,value){assertValidSlotName(name);let accounts=Array.isArray(credential.accounts)?credential.accounts:listSlots(credential),target=accounts.find(slot=>slot.name===name);if(!target)throw new Error(`Stored provider account not found: ${name}`);if(target.source==="env")throw new Error(`Environment provider account cannot be renamed: ${name}`);let displayName=value===null?void 0:accountDisplayName(value);if(value!==null&&displayName===void 0)throw new Error(`Display name must be 1-${DISPLAY_NAME_MAX_COLUMNS} terminal columns of visible text without control or formatting characters.`);if(displayName!==void 0&&accounts.some(slot=>slot.name!==name&&displayNameKey(accountDisplayName(slot.displayName)??"")===displayNameKey(displayName)))throw new Error("Display name is already used by another account for this provider.");return{...credential,accounts:accounts.map(slot=>{if(slot.name!==name)return slot;let{displayName:_displayName,...unchanged}=slot;return displayName===void 0?unchanged:{...unchanged,displayName}})}}function storedSlots(credential){return Array.isArray(credential.accounts)?credential.accounts:[]}function credentialSlotEnv(credential){let value=credential.env;if(typeof value!="object"||value===null||Array.isArray(value))return{};let env={};for(let[name,entry]of Object.entries(value)){if(typeof entry!="string")return{};env[name]=entry}return{env}}function slotFromFlatCredential(credential){return slotFromFlatCredentialNamed(credential,DEFAULT_SLOT_NAME)}function listSlots(credential){if(!credential)return[];let slots=storedSlots(credential);return slots.length>0?[...slots]:[slotFromFlatCredential(credential)]}function findSlot(credential,name){return listSlots(credential).find(slot=>slot.name===name)}function upsertSlot(credential,slot){assertValidSlotName(slot.name);let base=credential??(slot.access!==void 0||slot.refresh!==void 0?{type:"oauth",access:slot.access??"",refresh:slot.refresh??"",expires:slot.expires??0}:{type:"api_key",key:slot.key}),existing=listSlots(base),accounts=existing.findIndex(candidate=>candidate.name===slot.name)>=0?existing.map(candidate=>candidate.name===slot.name?{...candidate,...slot}:candidate):[...existing,slot];return{...base,accounts}}function slotMirrorsFlat(credential,slot){return credential.type==="oauth"?slot.access===credential.access||slot.refresh===credential.refresh:slot.key===credential.key}function projectFlatFields(credential,slot){let env=slot.env===void 0?{}:{env:slot.env};return credential.type==="oauth"?slot.access===void 0||slot.refresh===void 0||slot.expires===void 0?credential:{...credential,access:slot.access,refresh:slot.refresh,expires:slot.expires,...env}:{...credential,key:slot.key,...env}}function removeSlot(credential,name){if(!credential)return;let existing=listSlots(credential),removed=existing.find(slot=>slot.name===name),accounts=existing.filter(slot=>slot.name!==name);if(accounts.length===0)return;let next={...removed&&slotMirrorsFlat(credential,removed)?projectFlatFields(credential,accounts[0]):credential,accounts};return next.pinned===name&&delete next.pinned,next}function pinSlot(credential,name){return assertValidSlotName(name),{...credential,pinned:name}}function projectSlot(credential,name){if(!credential)return;let slot=findSlot(credential,name);if(!slot)return;let{accounts:_accounts,pinned:_pinned,order:_order,...flat}=credential,env=slot.env===void 0?{}:{env:slot.env};return flat.type==="oauth"?slot.access===void 0||slot.refresh===void 0||slot.expires===void 0?void 0:{...flat,access:slot.access,refresh:slot.refresh,expires:slot.expires,...env}:{...flat,key:slot.key,...env}}function slotFromFlatCredentialNamed(credential,name){return credential.type==="oauth"?{name,source:"login",access:credential.access,refresh:credential.refresh,expires:credential.expires,...credentialSlotEnv(credential)}:{name,source:"login",key:credential.key,...credentialSlotEnv(credential)}}function nextLoginSlotName(credential){let taken=new Set(listSlots(credential).map(slot=>slot.name));for(let index=2;index<1e3;index++){let candidate=`login-${index}`;if(!taken.has(candidate))return candidate}throw new Error("Credential pool is full")}function providedSlots(credential){let accounts=credential.accounts;return Array.isArray(accounts)&&accounts.length>0?accounts:void 0}function mergeProvidedPool(current,existing,provided){let providedByName=new Map(provided.map(slot=>[slot.name,slot])),refreshed=!1,merged=existing.map(slot=>{let candidate=providedByName.get(slot.name);return!candidate||!hasNewerMaterial(candidate,slot)?slot:(refreshed=!0,candidate)}),known=new Set(existing.map(slot=>slot.name)),added=provided.filter(slot=>!known.has(slot.name));return added.length===0&&!refreshed?current:{...current,accounts:[...merged,...added]}}function hasNewerMaterial(candidate,stored){return candidate.expires!==void 0&&(stored.expires===void 0||candidate.expires>stored.expires)}var EmptyApiKeyError=class extends Error{constructor(){super("Refusing to save an empty API key"),this.name="EmptyApiKeyError"}};function hasBlankKey(credential){return credential.type!=="api_key"||!Object.hasOwn(credential,"key")?!1:typeof credential.key!="string"||credential.key.trim()===""}function withoutBlankKey(credential){if(credential.type!=="api_key"||!hasBlankKey(credential))return credential;let{key:_blank,...rest}=credential;return rest}function assertLoginKeyPresent(credential){if(hasBlankKey(credential))throw new EmptyApiKeyError}function appendLoginSlot(stored,flat,onAllocated){assertLoginKeyPresent(flat);let current=stored?.type===flat.type?stored:void 0,provided=providedSlots(flat);if(provided){let previous=new Set((current&&Array.isArray(current.accounts)?current.accounts:listSlots(current)).map(slot=>slot.name)),added=provided.filter(slot=>!previous.has(slot.name));added.length===1&&SLOT_NAME_PATTERN.test(added[0].name)&&added[0].source!=="env"&&onAllocated?.(added[0].name,"provider")}if(!current)return provided||onAllocated?.(DEFAULT_SLOT_NAME,"generated"),flat;let storedAccounts=Array.isArray(current.accounts)?current.accounts:void 0;if(provided)return storedAccounts?mergeProvidedPool(current,storedAccounts,provided):flat;let name=nextLoginSlotName(current),next=upsertSlot(current,slotFromFlatCredentialNamed(flat,name));return onAllocated?.(name,"generated"),next}function managedSentinelMaterial(providerId){return`${providerId}-managed`}var LEGACY_SENTINEL_MATERIALS=new Map(Object.entries(LEGACY_PROVIDER_IDS).map(([legacyId,canonicalId])=>[canonicalId,managedSentinelMaterial(legacyId)]));function managedSentinelMaterials(providerId){let materials=[managedSentinelMaterial(providerId)],legacy=LEGACY_SENTINEL_MATERIALS.get(providerId);return legacy!==void 0&&!materials.includes(legacy)&&materials.push(legacy),materials}function isManagedSentinelSlot(providerId,slot){return managedSentinelMaterials(providerId).includes(slot.access??"")&&slot.refresh===slot.access}function repairManagedSentinelSlots(providerId,credential){let pooled=credential;if(!Array.isArray(pooled.accounts))return;let kept=pooled.accounts.filter(slot=>!isManagedSentinelSlot(providerId,slot));if(kept.length===pooled.accounts.length)return;let repaired={...pooled,accounts:kept};return repaired.pinned!==void 0&&!kept.some(slot=>slot.name===repaired.pinned)&&delete repaired.pinned,repaired}function mergeRefreshedSlot(current,name,refreshed){if(refreshed.type!=="oauth"||current.type!=="oauth")return current;if(!Array.isArray(current.accounts)||current.accounts.length===0)return mergeRefreshed(current,refreshed);let target=current.accounts.find(slot=>slot.name===name);if(!target)return current;let rotated={access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires},accounts=current.accounts.map(slot=>slot===target?{...slot,...rotated}:slot);return target.access===current.access||target.refresh===current.refresh?{...current,...rotated,accounts}:{...current,accounts}}function mergeRefreshed(current,refreshed){if(!Array.isArray(current.accounts)||current.accounts.length===0||refreshed.type!=="oauth"||current.type!=="oauth")return refreshed;let target=current.accounts.find(slot=>slot.access===current.access||slot.refresh===current.refresh),rotated={access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires},accounts=target?current.accounts.map(slot=>slot===target?{...slot,...rotated}:slot):current.accounts;return{...current,...rotated,accounts}}var DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3,OAuthRefreshExchangeError=class extends Error{constructor(cause){super("OAuth token exchange failed",{cause}),this.name="OAuthRefreshExchangeError"}},OAuthRefreshStoreError=class extends Error{constructor(cause){super("Credential store operation failed",{cause}),this.name="OAuthRefreshStoreError"}},inflightByStore=new WeakMap;function projectOAuthSlot(credential,name){let projected=projectSlot(credential,name);return projected?.type==="oauth"?projected:void 0}function refreshOAuthCredential(request){let registry=inflightByStore.get(request.credentials);registry||(registry=new Map,inflightByStore.set(request.credentials,registry));let key=`${request.providerId}\0${request.slotName??""}\0${request.stale.refresh}`,inflight=registry.get(key);if(!inflight){let controller=new AbortController,created={controller,waiters:0,owned:!1,promise:Promise.resolve(void 0)};created.promise=exchangeAndStore(request,controller.signal).finally(()=>{registry.get(key)===created&&registry.delete(key)}),registry.set(key,created),inflight=created}return join(inflight,request.signal,request.owning),raceWithAbortSignal(inflight.promise,request.signal)}function join(inflight,signal,owning){inflight.waiters++,owning&&(inflight.owned=!0);let leave=()=>{inflight.waiters--,inflight.waiters===0&&inflight.owned&&inflight.controller.abort(signal.reason)};signal.aborted?leave():signal.addEventListener("abort",leave,{once:!0})}async function exchangeAndStore(request,signal){let{credentials,providerId,oauth,slotName}=request,view=credential=>{if(credential?.type==="oauth")return slotName===void 0?credential:projectOAuthSlot(credential,slotName)},latest;try{latest=await credentials.read(providerId,{signal})}catch(error){throw new OAuthRefreshStoreError(error)}let current=view(latest);if(!current)return;if(!request.isStale(current))return latest;let refreshed;try{let exchangeSignal=AbortSignal.any([signal,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS)]);refreshed=await oauth.refresh(current,exchangeSignal),signal.throwIfAborted()}catch(error){signal.throwIfAborted();let causeClass=oauthRefreshFailureCause(error);throw causeClass!==void 0&&console.warn("OAuth refresh unavailable",JSON.stringify({provider:providerId,...slotName?{slot:slotName}:{},cause:causeClass})),new OAuthRefreshExchangeError(error)}try{return await credentials.modify(providerId,async stored=>{if(stored?.type!=="oauth")return;let slot=view(stored);if(!(!slot||slot.refresh!==current.refresh))return slotName===void 0?mergeRefreshed(stored,refreshed):mergeRefreshedSlot(stored,slotName,refreshed)})}catch(error){throw new OAuthRefreshStoreError(error)}}var ConfigReferenceError=class extends Error{constructor(field,reference,reason){super(`${field}: configuration reference ${reason}`),this.name="ConfigReferenceError",this.field=field,this.reference=reference,this.reason=reason}};async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async function readSlotCredential(credentials,providerId,slotName,signal){let projected;try{projected=credentials.readSlot?await credentials.readSlot(providerId,slotName,{signal}):projectSlot(await credentials.read(providerId,{signal}),slotName)}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}let key=projected?.type==="api_key"?projected.key:void 0;if(typeof key=="object"&&key!==null){let cause=new ConfigReferenceError(`${providerId}.accounts.${slotName}.key`,key,"forbidden");throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause})}return projected}var PROVIDER_NOT_CONFIGURED_PREFIX="Provider is not configured: ";function providerNotConfiguredMessage(providerId){return`${PROVIDER_NOT_CONFIGURED_PREFIX}${providerId}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext,apiKey=provider.auth.apiKey;if(overrides?.apiKey!==void 0&&apiKey&&!apiKey.ambientOnly)return resolveApiKey(requestAuthContext,apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let slotName=overrides?.slotName;if(slotName!==void 0){let projected=await readSlotCredential(credentials,provider.id,slotName,signal);if(!projected)return;if(projected.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,projected,requestAuthContext,overrides?.env,signal,overrides?.minOAuthValidityMs,slotName,overrides?.rejectedAccess);if(projected.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...projected,env:{...projected.env,...overrides.env}}:projected;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,requestAuthContext,overrides?.env,signal,overrides?.minOAuthValidityMs,void 0,overrides?.rejectedAccess);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}if(overrides?.apiKey!==void 0&&apiKey)return resolveApiKey(requestAuthContext,apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let ambientCredential=apiKey?.ambientOnly&&overrides?.env?{type:"api_key",key:"",env:overrides.env}:void 0;return apiKey?resolveApiKey(requestAuthContext,apiKey,provider.id,ambientCredential,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]!==void 0?env[name]:await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3;function oauthRefreshModelsError(error,providerId){if(error instanceof ModelsError)return error;if(error instanceof OAuthRefreshExchangeError)return classifyOAuthRefreshFailure(error.cause)==="transient"?new OAuthRefreshUnavailableError(providerId,error.cause):new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error.cause});let cause=error instanceof OAuthRefreshStoreError?error.cause:error;return new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause})}async function resolveStoredOAuth(credentials,providerId,oauth,stored,authContext,requestEnv,signal,minOAuthValidityMs,slotName,rejectedAccess){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,isStale=credential2=>expiresSoon(credential2)||rejectedAccess!==void 0&&credential2.access===rejectedAccess,credential=stored;if(isStale(credential)){let post;try{post=await refreshOAuthCredential({credentials,providerId,oauth,stale:credential,slotName,isStale,signal,owning:!0})}catch(error){throw signal.throwIfAborted(),oauthRefreshModelsError(error,providerId)}if(post?.type!=="oauth")return;let postView=slotName===void 0?post:projectOAuthSlot(post,slotName);if(!postView)return;if(credential=postView,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}let storedEnv=credentialEnvironment(credential),effectiveEnv=requestEnv?{...storedEnv,...requestEnv}:storedEnv,effectiveCredential=effectiveEnv?{...credential,env:effectiveEnv}:credential;if(oauth.check)try{if(!await oauth.check({ctx:authContext,credential:effectiveCredential,signal}))return}catch(error){throw new ModelsError("auth",`OAuth auth check failed for provider ${providerId}`,{cause:error})}try{return{auth:await oauth.toAuth(effectiveCredential),...effectiveEnv?{env:effectiveEnv}:{},source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}function credentialEnvironment(credential){let value=credential.env;if(typeof value!="object"||value===null||Array.isArray(value))return;let environment={};for(let[name,entry]of Object.entries(value)){if(typeof entry!="string")return;environment[name]=entry}return environment}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function resolveRefreshCredential(provider,credentials,authContext,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;if(!oauth)return;if(Date.now()<stored.expires)return stored;if(signal.aborted)return;let post;try{post=await refreshOAuthCredential({credentials,providerId:provider.id,oauth,stale:stored,isStale:credential2=>Date.now()>=credential2.expires,signal,owning:!1})}catch(error){throw oauthRefreshModelsError(error,provider.id)}return post?.type==="oauth"?post:void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}var GOOGLE_THINKING_APIS=["google-generative-ai","google-vertex"],GENERATION_4_THINKING_LEVEL_MAP={off:null,minimal:null,low:"low",medium:"medium",high:"high",xhigh:null,max:null},GENERATION_4_ID=/(?:^|\/)gemini-(?:[4-9]|[1-9]\d)(?:\.\d+)?(?:-|$)/;function isGoogleGeneration4OrLaterModelId(modelId){return GENERATION_4_ID.test(modelId.toLowerCase())}function inferGoogleThinkingLevelMap(model){if(model.thinkingLevelMap!==void 0)return model.thinkingLevelMap;if(GOOGLE_THINKING_APIS.includes(model.api)&&isGoogleGeneration4OrLaterModelId(model.id))return GENERATION_4_THINKING_LEVEL_MAP}var MAX_EFFORT_MODEL_IDS=new Set;function builtinCatalogAdvertisesMax(modelId){return MAX_EFFORT_MODEL_IDS.has(modelId)}function flattenModelCatalog(groups,type){return Object.fromEntries(Object.values(groups).flatMap(models=>Object.values(models)).filter(model=>model.type===type).map(model=>[model.id,model]))}function flattenChatModelCatalog(_provider,groups){let catalog=flattenModelCatalog(groups,"chat");for(let model of Object.values(catalog))typeof model.thinkingLevelMap?.max=="string"&&MAX_EFFORT_MODEL_IDS.add(model.id);return catalog}function flattenImageModelCatalog(_provider,groups){return flattenModelCatalog(groups,"image")}function flattenClassifierModelCatalog(_provider,groups){return flattenModelCatalog(groups,"classifier")}function costCardAt(cost,atMs){let card=cost,startedAt=Number.NEGATIVE_INFINITY;for(let rate of cost.effectiveRates??[]){let from=Date.parse(rate.effectiveFrom);from<=atMs&&from>startedAt&&(card=rate,startedAt=from)}return card}var InMemoryModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function getModelType(model){return model.type??"chat"}function isModelType(model,type){return getModelType(model)===type}function assertChatModel(model){if(!isModelType(model,"chat"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a chat model`)}function assertImageModel(model){if(!isModelType(model,"image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not an image model`)}function assertClassifierModel(model){if(!isModelType(model,"classifier"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a classifier model`)}function imageErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,output:[],stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function classifierErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}var KNOWN_MODEL_TYPES={chat:!0,image:!0,classifier:!0};function hasKnownModelType(model){return Object.hasOwn(KNOWN_MODEL_TYPES,getModelType(model))}function withKnownModelTypes(entry){return{...entry,models:entry.models.filter(hasKnownModelType)}}function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{constructor(options){this.providers=new Map,this.refreshGenerations=new Map,this.refreshControllers=new Map,this.publicationChains=new Map,this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getAllModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getAllModels?.()??entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getAllModels?.()??entry.getModels())}catch{}return models}getModelsOfType(type,provider){return this.getAllModels(provider).filter(model=>isModelType(model,type))}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}getModelOfType(type,provider,id){return this.getModelsOfType(type,provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?withKnownModelTypes(structuredClone(stored)):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await resolveRefreshCredential(provider,this.credentials,this.authContext,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){let oauth=provider.auth.oauth;if(credential?.type==="oauth"){if(!oauth)return;if(!oauth.check)return{source:"OAuth",type:"oauth"};try{return await oauth.check({ctx:this.authContext,credential,signal})}catch(error){throw new ModelsError("auth",`OAuth auth check failed for provider ${provider.id}`,{cause:error})}}let apiKey=provider.auth.apiKey;if(apiKey)if(apiKey.check)try{let result=await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal});if(result)return result}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}else{let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});if(resolution)return{source:resolution.source,type:"api_key",...resolution.ambient?{ambient:!0}:{}}}if(oauth?.check)try{return await oauth.check({ctx:this.authContext,signal})}catch(error){throw new ModelsError("auth",`OAuth auth check failed for provider ${provider.id}`,{cause:error})}}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}async getAuthenticatedProviders(providerId,signal){signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).filter(entry=>entry.auth!==void 0)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getModels();return provider.filterModels?.(models,credential)??models}))();return raceWithAbortSignal(available,signal)}async getAvailableOfType(type,providerId,options){return(await this.getAllAvailable(providerId,options)).filter(model=>isModelType(model,type))}getAllAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getAllModels?.()??provider.getModels();if(provider.filterAllModels)return provider.filterAllModels(models,credential);if(!provider.filterModels)return models;let availableChatIds=new Set(provider.filterModels(provider.getModels(),credential).map(model=>model.id));return models.filter(model=>!isModelType(model,"chat")||availableChatIds.has(model.id))}))();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction,options){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let{onAccountCommitted,...providerInteraction}=interaction,loginOperation=method.login({...providerInteraction,signal},options),loggedIn=await raceWithAbortSignal(loginOperation,signal),credential=type==="api_key"&&provider.auth.apiKey?.keyOptional?withoutBlankKey(loggedIn):loggedIn;assertLoginKeyPresent(credential);let committedName,committedOrigin,mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async current=>(mutationStarted=!0,markMutationStarted?.(),appendLoginSlot(current,credential,(name,origin)=>{committedName=name,committedOrigin=origin})),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return committedName!==void 0&&committedOrigin!==void 0&&onAccountCommitted?.({providerId,name:committedName,origin:committedOrigin}),credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{if(options?.slotId!==void 0){let current=await this.credentials.read(providerId,{signal}),next=removeSlot(current,options.slotId);if(next===void 0){await this.credentials.delete(providerId,{signal});return}await this.credentials.modify(providerId,async()=>next,{signal});return}await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}requireChatProvider(model){return assertChatModel(model),this.requireProvider(model)}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,transcript,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,transcript,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireChatProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let provider=this.requireChatProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}async generateImages(model,context,options){try{assertImageModel(model);let provider=this.requireProvider(model);if(!provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.generateImages(requestModel,context,requestOptions)}catch(error){return imageErrorResult(model,error,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let provider=this.requireProvider(model);if(!provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.classify(requestModel,context,requestOptions)}catch(error){return classifierErrorResult(model,error,options?.signal?.aborted)}}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let single=input.api&&typeof input.api.stream=="function"?input.api:void 0,byApi=single||!input.api?void 0:input.api,images=input.images,classifiers=input.classifiers,streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0),imageImplementations=Object.values(images??{}).filter(entry=>entry!==void 0),classifierImplementations=Object.values(classifiers??{}).filter(entry=>entry!==void 0);if(streams.length===0&&imageImplementations.length===0&&classifierImplementations.length===0)throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>getModelType(entry)===getModelType(model)&&entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,retryPolicy:input.retryPolicy,auth:input.auth,getModels:()=>currentModels().filter(model=>isModelType(model,"chat")),getAllModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(input.restoreModels)try{let chatModels=restored.filter(model=>isModelType(model,"chat")),otherModels=restored.filter(model=>!isModelType(model,"chat"));restored=[...input.restoreModels(chatModels),...otherModels]}catch{}if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let fetched=await fetchModels(context);if(context.signal.aborted)return;let refreshed=fetched.filter(hasKnownModelType);refreshed.length!==0&&await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,filterAllModels:input.filterAllModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))};return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),images&&imageImplementations.length>0&&(provider.generateImages=async(model,context,options)=>{let implementation=images[model.api];return implementation?implementation.generateImages(model,context,options):imageErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no image generation implementation for "${model.api}"`))}),classifiers&&classifierImplementations.length>0&&(provider.classify=async(model,context,options)=>{let implementation=classifiers[model.api];return implementation?implementation.classify(model,context,options):classifierErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no classifier implementation for "${model.api}"`))}),provider}function hasApi(model,api){return isModelType(model,"chat")&&model.api===api}function calculateCost(model,usage,atMs=Date.now()){if(model.cost.unknown)return usage.cost.input=0,usage.cost.output=0,usage.cost.cacheRead=0,usage.cost.cacheWrite=0,usage.cost.total=0,usage.costUnknown=!0,usage.cost;let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,card=costCardAt(model.cost,atMs),rates=card,matchedThreshold=-1;for(let tier of card.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"],OPENAI_THINKING_APIS=["openai-completions","openai-responses","azure-openai-responses","openai-codex-responses"],GPT_6_ASTRA_THINKING_LEVEL_MAP={off:null,minimal:null,low:"low",medium:"medium",high:"high",xhigh:"xhigh",max:"max"},GPT_6_NO_NONE_EFFORT_MODEL_IDS=["gpt-6-astra","gpt-6.1-sol"];function inferOpenAIThinkingLevelMap(model){if(model.thinkingLevelMap!==void 0)return model.thinkingLevelMap;if(OPENAI_THINKING_APIS.includes(model.api)&&GPT_6_NO_NONE_EFFORT_MODEL_IDS.some(id=>matchesModelFamily(model.id,id)))return GPT_6_ASTRA_THINKING_LEVEL_MAP}function inferThinkingLevelMap(model){return inferOpenAIThinkingLevelMap(model)??inferGoogleThinkingLevelMap(model)}function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>inferThinkingLevelMap(model)?.[level]===null?!1:level==="xhigh"?supportsXhigh(model):level==="max"?supportsMax(model):!0):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function supportsXhigh(model){let mapped=inferOpenAIThinkingLevelMap(model)?.xhigh;return mapped===null?!1:mapped!==void 0?!0:model.thinkingLevelMap!==void 0?!1:model.reasoning&&supportsXhighModelId(model.id)}var XHIGH_MODEL_IDS=["gpt-5.2","gpt-5.3","gpt-5.4","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-6.1-sol","gpt-6-sol","gpt-6-luna","deepseek-v4-pro","deepseek-v4-flash","opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8","opus-5","sonnet-5","fable-5"];function escapeRegex(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function matchesModelFamily(modelId,family){let normalizedId=modelId.toLowerCase(),escapedFamily=escapeRegex(family.toLowerCase()),leadingBoundary=family.startsWith("gpt-")?"(?:^|[/.:_])":"(?:^|[/.:_-])";return new RegExp(`${leadingBoundary}${escapedFamily}(?=$|[^a-z0-9])`).test(normalizedId)}function supportsXhighModelId(modelId){return XHIGH_MODEL_IDS.some(id=>matchesModelFamily(modelId,id))}function supportsMax(model){let mapped=inferOpenAIThinkingLevelMap(model)?.max;return mapped===null?!1:mapped!==void 0?!0:model.thinkingLevelMap!==void 0?!1:supportsMaxModel(model)}var CONFIGURATION_UPDATE_APIS=["openai-responses","openai-codex-responses","azure-openai-responses"];function supportsConfigurationUpdate(model){return CONFIGURATION_UPDATE_APIS.includes(model.api)?model.compat?.supportsConfigurationUpdate===!0:!1}var OPENAI_MAX_APIS=["openai-responses","azure-openai-responses","openai-codex-responses","openai-completions"],OPENAI_MAX_MODEL_IDS=["gpt-5.6-sol","gpt-6-astra","gpt-6.1-sol","gpt-6-sol","gpt-6-luna"],MAX_MODEL_IDS=["opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8","opus-5","sonnet-5","fable-5"];function supportsMaxModel(model){return model.reasoning?builtinCatalogAdvertisesMax(model.id)||OPENAI_MAX_APIS.includes(model.api)&&OPENAI_MAX_MODEL_IDS.some(id=>matchesModelFamily(model.id,id))?!0:MAX_MODEL_IDS.some(id=>matchesModelFamily(model.id,id)):!1}function modelsAreEqual(a,b){return!a||!b?!1:getModelType(a)===getModelType(b)&&a.id===b.id&&a.provider===b.provider}export{ModelsError,OAuthTokenEndpointError,isOAuthRefreshUnavailableError,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,PROVIDER_REQUEST_ID_MARKER,formatProviderRequestId,stripProviderRequestIds,USAGE_LIMIT_EXHAUSTION,ANTHROPIC_THIRD_PARTY_BILLING_MARKER,isAnthropicThirdPartyBillingMessage,isQuotaExhaustionMessage,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,retryDelayMs,retryTransientCall,retryAssistantCall,isRetryableAssistantError,isProviderStreamStallError,formatStallDuration,describeProviderStallForUser,isProviderTimeoutError,isRetryableErrorMessage,classifyErrorMessage,ACCOUNT_LIMIT_NEXT_STEP_LEAD,TURN_RETRY_SUPPRESSION_PREFIX,stripTurnRetrySuppressionPrefix,describeProviderFailureForUser,describeReplacedInstall,lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,LEGACY_PROVIDER_IDS,normalizeProviderId,normalizeModelRef,isLegacyProviderId,legacyProviderIdsFor,readByProviderId,legacyProviderIdRejection,accountDisplayName,accountLabel,renameSlotDisplayName,listSlots,upsertSlot,removeSlot,pinSlot,projectSlot,appendLoginSlot,repairManagedSentinelSlots,ConfigReferenceError,PROVIDER_NOT_CONFIGURED_PREFIX,providerNotConfiguredMessage,isGoogleGeneration4OrLaterModelId,flattenChatModelCatalog,flattenImageModelCatalog,flattenClassifierModelCatalog,costCardAt,InMemoryModelsStore,getModelType,isModelType,assertChatModel,assertImageModel,assertClassifierModel,imageErrorResult,classifierErrorResult,contentText,getSystemMessageText,renderSystemMessageUpdate,createInitialSystemMessage,normalizeContext,getInitialSystemMessage,withoutInitialSystemMessage,getCurrentTools,getCurrentSystemMessage,getCurrentSystemPrompt,collapseSystemMessages,resolveTranscript,toToolDeclaration,declarationsEqual,getToolStateChanges,getDeclaredTools,hasToolRedefinitions,hasNonAdditiveToolChanges,resolveTranscriptTools,createModels,createProvider,hasApi,calculateCost,inferOpenAIThinkingLevelMap,inferThinkingLevelMap,getSupportedThinkingLevels,clampThinkingLevel,supportsXhigh,supportsMax,supportsConfigurationUpdate,modelsAreEqual};
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
3
+ import"./chunk-MYAENL22.js";import{enableStartupCompileCache}from"./chunk-QYFOHFPS.js";import"./chunk-OQ3WDMB3.js";import{installStaleExtensionContainment,main}from"./chunk-EZP6AYW2.js";import"./chunk-6U3TBFBA.js";import"./chunk-UDM7VO6O.js";import"./chunk-ADQAPDPV.js";import{configureHttpDispatcher}from"./chunk-3A3XCLNH.js";import"./chunk-DXJJP6RP.js";import"./chunk-GXY5JEI5.js";import"./chunk-VICDRG3J.js";import"./chunk-GY5MR5KR.js";import"./chunk-3LPWILUZ.js";import"./chunk-DYWIFF2Q.js";import"./chunk-CNPDUC4D.js";import"./chunk-MLVIYDHK.js";import"./chunk-Y3TMJV3J.js";import"./chunk-JFQUWEN7.js";import"./chunk-JPGT64RV.js";import"./chunk-HWTD4QF3.js";import"./chunk-MSHRIZGT.js";import"./chunk-5KZH6EYQ.js";import"./chunk-QMRJYMNH.js";import"./chunk-XMNPK472.js";import"./chunk-TIVW4P37.js";import"./chunk-H4QOEVS5.js";import"./chunk-SOXQ42VS.js";import"./chunk-XMJKZK5H.js";import"./chunk-6VWIMHMH.js";import"./chunk-LO5MYLGF.js";import"./chunk-KLAX467B.js";import"./chunk-JFFS72FL.js";import"./chunk-ORXZXUMC.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-SOMFLLPD.js";import"./chunk-I7QWTWVZ.js";import"./chunk-26UBFF6N.js";import"./chunk-MTQQ2VQH.js";import"./chunk-L2O6K3SJ.js";import"./chunk-H4WJ4LY3.js";import"./chunk-Z6SAQ5O3.js";import"./chunk-ZAUVY6ZC.js";import"./chunk-J2YAYTB2.js";import"./chunk-4WZRVZNX.js";import"./chunk-U3VOXCGP.js";import"./chunk-GWGNVYPB.js";import"./chunk-YI7SPFDN.js";import"./chunk-HB35RBP4.js";import"./chunk-Z6WGAK7W.js";import"./chunk-DLAY7CIU.js";import"./chunk-3WP5RFQR.js";import"./chunk-QXREUA5F.js";import"./chunk-RUGYFYH7.js";import"./chunk-OEFCY46F.js";import"./chunk-KRNXUTZJ.js";import"./chunk-TAV6QZFM.js";import"./chunk-PELNNWGO.js";import"./chunk-J5FCH7TI.js";import"./chunk-FDL4CF6F.js";import"./chunk-7KOUQSBX.js";import"./chunk-YU4AYH4C.js";import"./chunk-QREKAXKX.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-2VZJTDUX.js";import"./chunk-ZLIVZQDY.js";import"./chunk-GVSBCJFI.js";import"./chunk-WASCMT6Y.js";import"./chunk-MY4ZD3EW.js";import"./chunk-QGJLZ6BI.js";import"./chunk-WHPDEDCC.js";import"./chunk-AA2L2RHH.js";import"./chunk-HK46JMSC.js";import"./chunk-5LWUUXMH.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-ZXHLH4MW.js";import"./chunk-45SZOLCU.js";import"./chunk-GQJYNFMO.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-YU2P3CAR.js";import{installEarlyInspectorVmImportRecovery}from"./chunk-5FQMNHXV.js";import"./chunk-ZOFZRJSL.js";import"./chunk-2SOVDETB.js";import"./chunk-V3CK2AVC.js";import"./chunk-VRDU425E.js";import"./chunk-ZGAB7WQA.js";import{APP_NAME,scrubBrandFromEnvironment}from"./chunk-7YO7VQZW.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-QN2BHP3M.js";import"./chunk-NTK2MHJ5.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";await enableStartupCompileCache();installEarlyInspectorVmImportRecovery();installStaleExtensionContainment();process.title=APP_NAME;scrubBrandFromEnvironment();process.env.PI_CODING_AGENT="true";process.emitWarning=(()=>{});configureHttpDispatcher();await main(process.argv.slice(2));
@@ -0,0 +1,2 @@
1
+ import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
+ import{getLiteralValue,getObjectShape,safeParse}from"./chunk-L73UYAH5.js";import{CallToolResultSchema,CancelTaskRequestSchema,CancelTaskResultSchema,CancelledNotificationSchema,CompleteResultSchema,CreateMessageRequestSchema,CreateMessageResultSchema,CreateMessageResultWithToolsSchema,CreateTaskResultSchema,ElicitRequestSchema,ElicitResultSchema,EmptyResultSchema,ErrorCode,GetPromptResultSchema,GetTaskPayloadRequestSchema,GetTaskRequestSchema,GetTaskResultSchema,InitializeResultSchema,LATEST_PROTOCOL_VERSION,ListChangedOptionsBaseSchema,ListPromptsResultSchema,ListResourceTemplatesResultSchema,ListResourcesResultSchema,ListTasksRequestSchema,ListTasksResultSchema,ListToolsResultSchema,McpError,PingRequestSchema,ProgressNotificationSchema,PromptListChangedNotificationSchema,RELATED_TASK_META_KEY,ReadResourceResultSchema,ResourceListChangedNotificationSchema,SUPPORTED_PROTOCOL_VERSIONS,TaskStatusNotificationSchema,ToolListChangedNotificationSchema,isJSONRPCErrorResponse,isJSONRPCNotification,isJSONRPCRequest,isJSONRPCResultResponse,isTaskAugmentedRequestParams}from"./chunk-WJOT3DFL.js";import"./chunk-AX72VNRS.js";import{require_applicator,require_codegen,require_core,require_core2,require_discriminator,require_format,require_metadata,require_ref_error,require_validate,require_validation,require_validation_error}from"./chunk-Y3TMJV3J.js";import{__commonJS,__toESM}from"./chunk-IKOFCODM.js";var require_draft7=__commonJS({"node_modules/ajv/dist/vocabularies/draft7.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var core_1=require_core2(),validation_1=require_validation(),applicator_1=require_applicator(),format_1=require_format(),metadata_1=require_metadata(),draft7Vocabularies=[core_1.default,validation_1.default,(0,applicator_1.default)(),format_1.default,metadata_1.metadataVocabulary,metadata_1.contentVocabulary];exports.default=draft7Vocabularies}});var require_json_schema_draft_07=__commonJS({"node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports,module){module.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}}});var require_ajv=__commonJS({"node_modules/ajv/dist/ajv.js"(exports,module){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.MissingRefError=exports.ValidationError=exports.CodeGen=exports.Name=exports.nil=exports.stringify=exports.str=exports._=exports.KeywordCxt=exports.Ajv=void 0;var core_1=require_core(),draft7_1=require_draft7(),discriminator_1=require_discriminator(),draft7MetaSchema=require_json_schema_draft_07(),META_SUPPORT_DATA=["/properties"],META_SCHEMA_ID="http://json-schema.org/draft-07/schema",Ajv2=class extends core_1.default{_addVocabularies(){super._addVocabularies(),draft7_1.default.forEach(v=>this.addVocabulary(v)),this.opts.discriminator&&this.addKeyword(discriminator_1.default)}_addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.meta)return;let metaSchema=this.opts.$data?this.$dataMetaSchema(draft7MetaSchema,META_SUPPORT_DATA):draft7MetaSchema;this.addMetaSchema(metaSchema,META_SCHEMA_ID,!1),this.refs["http://json-schema.org/schema"]=META_SCHEMA_ID}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(META_SCHEMA_ID)?META_SCHEMA_ID:void 0)}};exports.Ajv=Ajv2;module.exports=exports=Ajv2;module.exports.Ajv=Ajv2;Object.defineProperty(exports,"__esModule",{value:!0});exports.default=Ajv2;var validate_1=require_validate();Object.defineProperty(exports,"KeywordCxt",{enumerable:!0,get:function(){return validate_1.KeywordCxt}});var codegen_1=require_codegen();Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return codegen_1._}});Object.defineProperty(exports,"str",{enumerable:!0,get:function(){return codegen_1.str}});Object.defineProperty(exports,"stringify",{enumerable:!0,get:function(){return codegen_1.stringify}});Object.defineProperty(exports,"nil",{enumerable:!0,get:function(){return codegen_1.nil}});Object.defineProperty(exports,"Name",{enumerable:!0,get:function(){return codegen_1.Name}});Object.defineProperty(exports,"CodeGen",{enumerable:!0,get:function(){return codegen_1.CodeGen}});var validation_error_1=require_validation_error();Object.defineProperty(exports,"ValidationError",{enumerable:!0,get:function(){return validation_error_1.default}});var ref_error_1=require_ref_error();Object.defineProperty(exports,"MissingRefError",{enumerable:!0,get:function(){return ref_error_1.default}})}});var require_formats=__commonJS({"node_modules/ajv-formats/dist/formats.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.formatNames=exports.fastFormats=exports.fullFormats=void 0;function fmtDef(validate,compare){return{validate,compare}}exports.fullFormats={date:fmtDef(date,compareDate),time:fmtDef(getTime(!0),compareTime),"date-time":fmtDef(getDateTime(!0),compareDateTime),"iso-time":fmtDef(getTime(),compareIsoTime),"iso-date-time":fmtDef(getDateTime(),compareIsoDateTime),duration:/^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/,uri,"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,url:/^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/,ipv6:/^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,regex,uuid:/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,"json-pointer":/^(?:\/(?:[^~/]|~0|~1)*)*$/,"json-pointer-uri-fragment":/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,"relative-json-pointer":/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,byte,int32:{type:"number",validate:validateInt32},int64:{type:"number",validate:validateInt64},float:{type:"number",validate:validateNumber},double:{type:"number",validate:validateNumber},password:!0,binary:!0};exports.fastFormats={...exports.fullFormats,date:fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/,compareDate),time:fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,compareTime),"date-time":fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,compareDateTime),"iso-time":fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,compareIsoTime),"iso-date-time":fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,compareIsoDateTime),uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i};exports.formatNames=Object.keys(exports.fullFormats);function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}var DATE=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,DAYS=[0,31,28,31,30,31,30,31,31,30,31,30,31];function date(str){let matches=DATE.exec(str);if(!matches)return!1;let year=+matches[1],month=+matches[2],day=+matches[3];return month>=1&&month<=12&&day>=1&&day<=(month===2&&isLeapYear(year)?29:DAYS[month])}function compareDate(d1,d2){if(d1&&d2)return d1>d2?1:d1<d2?-1:0}var TIME=/^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;function getTime(strictTimeZone){return function(str){let matches=TIME.exec(str);if(!matches)return!1;let hr=+matches[1],min=+matches[2],sec=+matches[3],tz=matches[4],tzSign=matches[5]==="-"?-1:1,tzH=+(matches[6]||0),tzM=+(matches[7]||0);if(tzH>23||tzM>59||strictTimeZone&&!tz)return!1;if(hr<=23&&min<=59&&sec<60)return!0;let utcMin=min-tzM*tzSign,utcHr=hr-tzH*tzSign-(utcMin<0?1:0);return(utcHr===23||utcHr===-1)&&(utcMin===59||utcMin===-1)&&sec<61}}function compareTime(s1,s2){if(!(s1&&s2))return;let t1=new Date("2020-01-01T"+s1).valueOf(),t2=new Date("2020-01-01T"+s2).valueOf();if(t1&&t2)return t1-t2}function compareIsoTime(t1,t2){if(!(t1&&t2))return;let a1=TIME.exec(t1),a2=TIME.exec(t2);if(a1&&a2)return t1=a1[1]+a1[2]+a1[3],t2=a2[1]+a2[2]+a2[3],t1>t2?1:t1<t2?-1:0}var DATE_TIME_SEPARATOR=/t|\s/i;function getDateTime(strictTimeZone){let time=getTime(strictTimeZone);return function(str){let dateTime=str.split(DATE_TIME_SEPARATOR);return dateTime.length===2&&date(dateTime[0])&&time(dateTime[1])}}function compareDateTime(dt1,dt2){if(!(dt1&&dt2))return;let d1=new Date(dt1).valueOf(),d2=new Date(dt2).valueOf();if(d1&&d2)return d1-d2}function compareIsoDateTime(dt1,dt2){if(!(dt1&&dt2))return;let[d1,t1]=dt1.split(DATE_TIME_SEPARATOR),[d2,t2]=dt2.split(DATE_TIME_SEPARATOR),res=compareDate(d1,d2);if(res!==void 0)return res||compareTime(t1,t2)}var NOT_URI_FRAGMENT=/\/|:/,URI=/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;function uri(str){return NOT_URI_FRAGMENT.test(str)&&URI.test(str)}var BYTE=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm;function byte(str){return BYTE.lastIndex=0,BYTE.test(str)}var MIN_INT32=-(2**31),MAX_INT32=2**31-1;function validateInt32(value){return Number.isInteger(value)&&value<=MAX_INT32&&value>=MIN_INT32}function validateInt64(value){return Number.isInteger(value)}function validateNumber(){return!0}var Z_ANCHOR=/[^\\]\\Z/;function regex(str){if(Z_ANCHOR.test(str))return!1;try{return new RegExp(str),!0}catch{return!1}}}});var require_limit=__commonJS({"node_modules/ajv-formats/dist/limit.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.formatLimitDefinition=void 0;var ajv_1=require_ajv(),codegen_1=require_codegen(),ops=codegen_1.operators,KWDs={formatMaximum:{okStr:"<=",ok:ops.LTE,fail:ops.GT},formatMinimum:{okStr:">=",ok:ops.GTE,fail:ops.LT},formatExclusiveMaximum:{okStr:"<",ok:ops.LT,fail:ops.GTE},formatExclusiveMinimum:{okStr:">",ok:ops.GT,fail:ops.LTE}},error={message:({keyword,schemaCode})=>(0,codegen_1.str)`should be ${KWDs[keyword].okStr} ${schemaCode}`,params:({keyword,schemaCode})=>(0,codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`};exports.formatLimitDefinition={keyword:Object.keys(KWDs),type:"string",schemaType:"string",$data:!0,error,code(cxt){let{gen,data,schemaCode,keyword,it}=cxt,{opts,self}=it;if(!opts.validateFormats)return;let fCxt=new ajv_1.KeywordCxt(it,self.RULES.all.format.definition,"format");fCxt.$data?validate$DataFormat():validateFormat();function validate$DataFormat(){let fmts=gen.scopeValue("formats",{ref:self.formats,code:opts.code.formats}),fmt=gen.const("fmt",(0,codegen_1._)`${fmts}[${fCxt.schemaCode}]`);cxt.fail$data((0,codegen_1.or)((0,codegen_1._)`typeof ${fmt} != "object"`,(0,codegen_1._)`${fmt} instanceof RegExp`,(0,codegen_1._)`typeof ${fmt}.compare != "function"`,compareCode(fmt)))}function validateFormat(){let format=fCxt.schema,fmtDef=self.formats[format];if(!fmtDef||fmtDef===!0)return;if(typeof fmtDef!="object"||fmtDef instanceof RegExp||typeof fmtDef.compare!="function")throw new Error(`"${keyword}": format "${format}" does not define "compare" function`);let fmt=gen.scopeValue("formats",{key:format,ref:fmtDef,code:opts.code.formats?(0,codegen_1._)`${opts.code.formats}${(0,codegen_1.getProperty)(format)}`:void 0});cxt.fail$data(compareCode(fmt))}function compareCode(fmt){return(0,codegen_1._)`${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`}},dependencies:["format"]};var formatLimitPlugin=ajv=>(ajv.addKeyword(exports.formatLimitDefinition),ajv);exports.default=formatLimitPlugin}});var require_dist=__commonJS({"node_modules/ajv-formats/dist/index.js"(exports,module){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var formats_1=require_formats(),limit_1=require_limit(),codegen_1=require_codegen(),fullName=new codegen_1.Name("fullFormats"),fastName=new codegen_1.Name("fastFormats"),formatsPlugin=(ajv,opts={keywords:!0})=>{if(Array.isArray(opts))return addFormats(ajv,opts,formats_1.fullFormats,fullName),ajv;let[formats,exportName]=opts.mode==="fast"?[formats_1.fastFormats,fastName]:[formats_1.fullFormats,fullName],list=opts.formats||formats_1.formatNames;return addFormats(ajv,list,formats,exportName),opts.keywords&&(0,limit_1.default)(ajv),ajv};formatsPlugin.get=(name,mode="full")=>{let f=(mode==="fast"?formats_1.fastFormats:formats_1.fullFormats)[name];if(!f)throw new Error(`Unknown format "${name}"`);return f};function addFormats(ajv,list,fs,exportName){var _a,_b;(_a=(_b=ajv.opts.code).formats)!==null&&_a!==void 0||(_b.formats=(0,codegen_1._)`require("ajv-formats/dist/formats").${exportName}`);for(let f of list)ajv.addFormat(f,fs[f])}module.exports=exports=formatsPlugin;Object.defineProperty(exports,"__esModule",{value:!0});exports.default=formatsPlugin}});function isTerminal(status){return status==="completed"||status==="failed"||status==="cancelled"}var ALPHA_NUMERIC=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function getMethodLiteral(schema){let methodSchema=getObjectShape(schema)?.method;if(!methodSchema)throw new Error("Schema is missing a method literal");let value=getLiteralValue(methodSchema);if(typeof value!="string")throw new Error("Schema method literal must be a string");return value}function parseWithCompat(schema,data){let result=safeParse(schema,data);if(!result.success)throw result.error;return result.data}var DEFAULT_REQUEST_TIMEOUT_MSEC=6e4,Protocol=class{constructor(_options){this._options=_options,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(CancelledNotificationSchema,notification=>{this._oncancel(notification)}),this.setNotificationHandler(ProgressNotificationSchema,notification=>{this._onprogress(notification)}),this.setRequestHandler(PingRequestSchema,_request=>({})),this._taskStore=_options?.taskStore,this._taskMessageQueue=_options?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(GetTaskRequestSchema,async(request,extra)=>{let task=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,"Failed to retrieve task: Task not found");return{...task}}),this.setRequestHandler(GetTaskPayloadRequestSchema,async(request,extra)=>{let handleTaskResult=async()=>{let taskId=request.params.taskId;if(!await this._taskStore.getTask(taskId,extra.sessionId))throw new McpError(ErrorCode.InvalidParams,`Task not found: ${taskId}`);if(this._taskMessageQueue){let queuedMessage;for(;queuedMessage=await this._taskMessageQueue.dequeue(taskId,extra.sessionId);){if(queuedMessage.type==="response"||queuedMessage.type==="error"){let message=queuedMessage.message,requestId=message.id,resolver=this._requestResolvers.get(requestId);if(resolver)if(this._requestResolvers.delete(requestId),queuedMessage.type==="response")resolver(message);else{let errorMessage=message,error=new McpError(errorMessage.error.code,errorMessage.error.message,errorMessage.error.data);resolver(error)}else{let messageType=queuedMessage.type==="response"?"Response":"Error";this._onerror(new Error(`${messageType} handler missing for request ${requestId}`))}continue}await this._transport?.send(queuedMessage.message,{relatedRequestId:extra.requestId})}}let task=await this._taskStore.getTask(taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task not found: ${taskId}`);if(!isTerminal(task.status))return await this._waitForTaskUpdate(taskId,extra.signal,extra.sessionId),await handleTaskResult();if(isTerminal(task.status)){let result=await this._taskStore.getTaskResult(taskId,extra.sessionId);return this._clearTaskQueue(taskId,extra.sessionId),{...result,_meta:{...result._meta,[RELATED_TASK_META_KEY]:{taskId}}}}return await handleTaskResult()};return await handleTaskResult()}),this.setRequestHandler(ListTasksRequestSchema,async(request,extra)=>{try{let{tasks,nextCursor}=await this._taskStore.listTasks(request.params?.cursor,extra.sessionId);return{tasks,nextCursor,_meta:{}}}catch(error){throw new McpError(ErrorCode.InvalidParams,`Failed to list tasks: ${error instanceof Error?error.message:String(error)}`)}}),this.setRequestHandler(CancelTaskRequestSchema,async(request,extra)=>{try{let task=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task not found: ${request.params.taskId}`);if(isTerminal(task.status))throw new McpError(ErrorCode.InvalidParams,`Cannot cancel task in terminal status: ${task.status}`);await this._taskStore.updateTaskStatus(request.params.taskId,"cancelled","Client cancelled task execution.",extra.sessionId),this._clearTaskQueue(request.params.taskId,extra.sessionId);let cancelledTask=await this._taskStore.getTask(request.params.taskId,extra.sessionId);if(!cancelledTask)throw new McpError(ErrorCode.InvalidParams,`Task not found after cancellation: ${request.params.taskId}`);return{_meta:{},...cancelledTask}}catch(error){throw error instanceof McpError?error:new McpError(ErrorCode.InvalidRequest,`Failed to cancel task: ${error instanceof Error?error.message:String(error)}`)}}))}async _oncancel(notification){if(!notification.params.requestId)return;this._requestHandlerAbortControllers.get(notification.params.requestId)?.abort(notification.params.reason)}_setupTimeout(messageId,timeout,maxTotalTimeout,onTimeout,resetTimeoutOnProgress=!1){this._timeoutInfo.set(messageId,{timeoutId:setTimeout(onTimeout,timeout),startTime:Date.now(),timeout,maxTotalTimeout,resetTimeoutOnProgress,onTimeout})}_resetTimeout(messageId){let info=this._timeoutInfo.get(messageId);if(!info)return!1;let totalElapsed=Date.now()-info.startTime;if(info.maxTotalTimeout&&totalElapsed>=info.maxTotalTimeout)throw this._timeoutInfo.delete(messageId),McpError.fromError(ErrorCode.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:info.maxTotalTimeout,totalElapsed});return clearTimeout(info.timeoutId),info.timeoutId=setTimeout(info.onTimeout,info.timeout),!0}_cleanupTimeout(messageId){let info=this._timeoutInfo.get(messageId);info&&(clearTimeout(info.timeoutId),this._timeoutInfo.delete(messageId))}async connect(transport){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=transport;let _onclose=this.transport?.onclose;this._transport.onclose=()=>{_onclose?.(),this._onclose()};let _onerror=this.transport?.onerror;this._transport.onerror=error=>{_onerror?.(error),this._onerror(error)};let _onmessage=this._transport?.onmessage;this._transport.onmessage=(message,extra)=>{_onmessage?.(message,extra),isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message)?this._onresponse(message):isJSONRPCRequest(message)?this._onrequest(message,extra):isJSONRPCNotification(message)?this._onnotification(message):this._onerror(new Error(`Unknown message type: ${JSON.stringify(message)}`))},await this._transport.start()}_onclose(){let responseHandlers=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let info of this._timeoutInfo.values())clearTimeout(info.timeoutId);this._timeoutInfo.clear();for(let controller of this._requestHandlerAbortControllers.values())controller.abort();this._requestHandlerAbortControllers.clear();let error=McpError.fromError(ErrorCode.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let handler of responseHandlers.values())handler(error)}_onerror(error){this.onerror?.(error)}_onnotification(notification){let handler=this._notificationHandlers.get(notification.method)??this.fallbackNotificationHandler;handler!==void 0&&Promise.resolve().then(()=>handler(notification)).catch(error=>this._onerror(new Error(`Uncaught error in notification handler: ${error}`)))}_onrequest(request,extra){let handler=this._requestHandlers.get(request.method)??this.fallbackRequestHandler,capturedTransport=this._transport,relatedTaskId=request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId,sessionId=capturedTransport?.sessionId,store=this._taskStore,relatedTaskFound=!0,relatedTaskLookup;if(relatedTaskId&&store&&this._taskMessageQueue&&sessionId!==void 0&&(relatedTaskFound=!1,relatedTaskLookup=(async()=>{if(!await store.getTask(relatedTaskId,sessionId))throw new McpError(ErrorCode.InvalidParams,`Task not found: ${relatedTaskId}`);relatedTaskFound=!0})()),handler===void 0){let errorResponse={jsonrpc:"2.0",id:request.id,error:{code:ErrorCode.MethodNotFound,message:"Method not found"}};if(relatedTaskId&&relatedTaskLookup){let queuedError={type:"error",message:errorResponse,timestamp:Date.now()};relatedTaskLookup.then(()=>this._enqueueTaskMessage(relatedTaskId,queuedError,sessionId),()=>capturedTransport?.send(errorResponse)).catch(error=>this._onerror(new Error(`Failed to send an error response: ${error}`)))}else relatedTaskId&&this._taskMessageQueue?this._enqueueTaskMessage(relatedTaskId,{type:"error",message:errorResponse,timestamp:Date.now()},capturedTransport?.sessionId).catch(error=>this._onerror(new Error(`Failed to enqueue error response: ${error}`))):capturedTransport?.send(errorResponse).catch(error=>this._onerror(new Error(`Failed to send an error response: ${error}`)));return}let abortController=new AbortController;this._requestHandlerAbortControllers.set(request.id,abortController);let taskCreationParams=isTaskAugmentedRequestParams(request.params)?request.params.task:void 0,taskStore=this._taskStore?this.requestTaskStore(request,capturedTransport?.sessionId):void 0,fullExtra={signal:abortController.signal,sessionId:capturedTransport?.sessionId,_meta:request.params?._meta,sendNotification:async notification=>{if(abortController.signal.aborted)return;let notificationOptions={relatedRequestId:request.id};relatedTaskId&&(notificationOptions.relatedTask={taskId:relatedTaskId}),await this.notification(notification,notificationOptions)},sendRequest:async(r,resultSchema,options)=>{if(abortController.signal.aborted)throw new McpError(ErrorCode.ConnectionClosed,"Request was cancelled");let requestOptions={...options,relatedRequestId:request.id};relatedTaskId&&!requestOptions.relatedTask&&(requestOptions.relatedTask={taskId:relatedTaskId});let effectiveTaskId=requestOptions.relatedTask?.taskId??relatedTaskId;return effectiveTaskId&&taskStore&&await taskStore.updateTaskStatus(effectiveTaskId,"input_required"),await this.request(r,resultSchema,requestOptions)},authInfo:extra?.authInfo,requestId:request.id,requestInfo:extra?.requestInfo,taskId:relatedTaskId,taskStore,taskRequestedTtl:taskCreationParams?.ttl,closeSSEStream:extra?.closeSSEStream,closeStandaloneSSEStream:extra?.closeStandaloneSSEStream};(relatedTaskLookup??Promise.resolve()).then(()=>{if(relatedTaskLookup&&abortController.signal.aborted)throw new McpError(ErrorCode.ConnectionClosed,"Request was cancelled");taskCreationParams&&this.assertTaskHandlerCapability(request.method)}).then(()=>handler(request,fullExtra)).then(async result=>{if(abortController.signal.aborted)return;let response={result,jsonrpc:"2.0",id:request.id};relatedTaskId&&this._taskMessageQueue?await this._enqueueTaskMessage(relatedTaskId,{type:"response",message:response,timestamp:Date.now()},capturedTransport?.sessionId):await capturedTransport?.send(response)},async error=>{if(abortController.signal.aborted)return;let errorResponse={jsonrpc:"2.0",id:request.id,error:{code:Number.isSafeInteger(error.code)?error.code:ErrorCode.InternalError,message:error.message??"Internal error",...error.data!==void 0&&{data:error.data}}};relatedTaskId&&this._taskMessageQueue&&relatedTaskFound?await this._enqueueTaskMessage(relatedTaskId,{type:"error",message:errorResponse,timestamp:Date.now()},capturedTransport?.sessionId):await capturedTransport?.send(errorResponse)}).catch(error=>this._onerror(new Error(`Failed to send response: ${error}`))).finally(()=>{this._requestHandlerAbortControllers.get(request.id)===abortController&&this._requestHandlerAbortControllers.delete(request.id)})}_onprogress(notification){let{progressToken,...params}=notification.params,messageId=Number(progressToken),handler=this._progressHandlers.get(messageId);if(!handler){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`));return}let responseHandler=this._responseHandlers.get(messageId),timeoutInfo=this._timeoutInfo.get(messageId);if(timeoutInfo&&responseHandler&&timeoutInfo.resetTimeoutOnProgress)try{this._resetTimeout(messageId)}catch(error){this._responseHandlers.delete(messageId),this._progressHandlers.delete(messageId),this._cleanupTimeout(messageId),responseHandler(error);return}handler(params)}_onresponse(response){let messageId=Number(response.id),resolver=this._requestResolvers.get(messageId);if(resolver){if(this._requestResolvers.delete(messageId),isJSONRPCResultResponse(response))resolver(response);else{let error=new McpError(response.error.code,response.error.message,response.error.data);resolver(error)}return}let handler=this._responseHandlers.get(messageId);if(handler===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`));return}this._responseHandlers.delete(messageId),this._cleanupTimeout(messageId);let isTaskResponse=!1;if(isJSONRPCResultResponse(response)&&response.result&&typeof response.result=="object"){let result=response.result;if(result.task&&typeof result.task=="object"){let task=result.task;typeof task.taskId=="string"&&(isTaskResponse=!0,this._taskProgressTokens.set(task.taskId,messageId))}}if(isTaskResponse||this._progressHandlers.delete(messageId),isJSONRPCResultResponse(response))handler(response);else{let error=McpError.fromError(response.error.code,response.error.message,response.error.data);handler(error)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(request,resultSchema,options){let{task}=options??{};if(!task){try{yield{type:"result",result:await this.request(request,resultSchema,options)}}catch(error){yield{type:"error",error:error instanceof McpError?error:new McpError(ErrorCode.InternalError,String(error))}}return}let taskId;try{let createResult=await this.request(request,CreateTaskResultSchema,options);if(createResult.task)taskId=createResult.task.taskId,yield{type:"taskCreated",task:createResult.task};else throw new McpError(ErrorCode.InternalError,"Task creation did not return a task");for(;;){let task2=await this.getTask({taskId},options);if(yield{type:"taskStatus",task:task2},isTerminal(task2.status)){task2.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId},resultSchema,options)}:task2.status==="failed"?yield{type:"error",error:new McpError(ErrorCode.InternalError,`Task ${taskId} failed`)}:task2.status==="cancelled"&&(yield{type:"error",error:new McpError(ErrorCode.InternalError,`Task ${taskId} was cancelled`)});return}if(task2.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId},resultSchema,options)};return}let pollInterval=task2.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(resolve=>setTimeout(resolve,pollInterval)),options?.signal?.throwIfAborted()}}catch(error){yield{type:"error",error:error instanceof McpError?error:new McpError(ErrorCode.InternalError,String(error))}}}request(request,resultSchema,options){let{relatedRequestId,resumptionToken,onresumptiontoken,task,relatedTask}=options??{};return new Promise((resolve,reject)=>{let earlyReject=error=>{reject(error)};if(!this._transport){earlyReject(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(request.method),task&&this.assertTaskCapability(request.method)}catch(e){earlyReject(e);return}options?.signal?.throwIfAborted();let messageId=this._requestMessageId++,jsonrpcRequest={...request,jsonrpc:"2.0",id:messageId};options?.onprogress&&(this._progressHandlers.set(messageId,options.onprogress),jsonrpcRequest.params={...request.params,_meta:{...request.params?._meta||{},progressToken:messageId}}),task&&(jsonrpcRequest.params={...jsonrpcRequest.params,task}),relatedTask&&(jsonrpcRequest.params={...jsonrpcRequest.params,_meta:{...jsonrpcRequest.params?._meta||{},[RELATED_TASK_META_KEY]:relatedTask}});let cancel=reason=>{this._responseHandlers.delete(messageId),this._progressHandlers.delete(messageId),this._cleanupTimeout(messageId),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:messageId,reason:String(reason)}},{relatedRequestId,resumptionToken,onresumptiontoken}).catch(error2=>this._onerror(new Error(`Failed to send cancellation: ${error2}`)));let error=reason instanceof McpError?reason:new McpError(ErrorCode.RequestTimeout,String(reason));reject(error)};this._responseHandlers.set(messageId,response=>{if(!options?.signal?.aborted){if(response instanceof Error)return reject(response);try{let parseResult=safeParse(resultSchema,response.result);parseResult.success?resolve(parseResult.data):reject(parseResult.error)}catch(error){reject(error)}}}),options?.signal?.addEventListener("abort",()=>{cancel(options?.signal?.reason)});let timeout=options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC,timeoutHandler=()=>cancel(McpError.fromError(ErrorCode.RequestTimeout,"Request timed out",{timeout}));this._setupTimeout(messageId,timeout,options?.maxTotalTimeout,timeoutHandler,options?.resetTimeoutOnProgress??!1);let relatedTaskId=relatedTask?.taskId;if(relatedTaskId){let responseResolver=response=>{let handler=this._responseHandlers.get(messageId);handler?handler(response):this._onerror(new Error(`Response handler missing for side-channeled request ${messageId}`))};this._requestResolvers.set(messageId,responseResolver),this._enqueueTaskMessage(relatedTaskId,{type:"request",message:jsonrpcRequest,timestamp:Date.now()}).catch(error=>{this._cleanupTimeout(messageId),reject(error)})}else this._transport.send(jsonrpcRequest,{relatedRequestId,resumptionToken,onresumptiontoken}).catch(error=>{this._cleanupTimeout(messageId),reject(error)})})}async getTask(params,options){return this.request({method:"tasks/get",params},GetTaskResultSchema,options)}async getTaskResult(params,resultSchema,options){return this.request({method:"tasks/result",params},resultSchema,options)}async listTasks(params,options){return this.request({method:"tasks/list",params},ListTasksResultSchema,options)}async cancelTask(params,options){return this.request({method:"tasks/cancel",params},CancelTaskResultSchema,options)}async notification(notification,options){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(notification.method);let relatedTaskId=options?.relatedTask?.taskId;if(relatedTaskId){let jsonrpcNotification2={...notification,jsonrpc:"2.0",params:{...notification.params,_meta:{...notification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}};await this._enqueueTaskMessage(relatedTaskId,{type:"notification",message:jsonrpcNotification2,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(notification.method)&&!notification.params&&!options?.relatedRequestId&&!options?.relatedTask){if(this._pendingDebouncedNotifications.has(notification.method))return;this._pendingDebouncedNotifications.add(notification.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(notification.method),!this._transport)return;let jsonrpcNotification2={...notification,jsonrpc:"2.0"};options?.relatedTask&&(jsonrpcNotification2={...jsonrpcNotification2,params:{...jsonrpcNotification2.params,_meta:{...jsonrpcNotification2.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}}),this._transport?.send(jsonrpcNotification2,options).catch(error=>this._onerror(error))});return}let jsonrpcNotification={...notification,jsonrpc:"2.0"};options?.relatedTask&&(jsonrpcNotification={...jsonrpcNotification,params:{...jsonrpcNotification.params,_meta:{...jsonrpcNotification.params?._meta||{},[RELATED_TASK_META_KEY]:options.relatedTask}}}),await this._transport.send(jsonrpcNotification,options)}setRequestHandler(requestSchema,handler){let method=getMethodLiteral(requestSchema);this.assertRequestHandlerCapability(method),this._requestHandlers.set(method,(request,extra)=>{let parsed=parseWithCompat(requestSchema,request);return Promise.resolve(handler(parsed,extra))})}removeRequestHandler(method){this._requestHandlers.delete(method)}assertCanSetRequestHandler(method){if(this._requestHandlers.has(method))throw new Error(`A request handler for ${method} already exists, which would be overridden`)}setNotificationHandler(notificationSchema,handler){let method=getMethodLiteral(notificationSchema);this._notificationHandlers.set(method,notification=>{let parsed=parseWithCompat(notificationSchema,notification);return Promise.resolve(handler(parsed))})}removeNotificationHandler(method){this._notificationHandlers.delete(method)}_cleanupTaskProgressHandler(taskId){let progressToken=this._taskProgressTokens.get(taskId);progressToken!==void 0&&(this._progressHandlers.delete(progressToken),this._taskProgressTokens.delete(taskId))}async _enqueueTaskMessage(taskId,message,sessionId){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let maxQueueSize=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(taskId,message,sessionId??this._transport?.sessionId,maxQueueSize)}async _clearTaskQueue(taskId,sessionId){if(this._taskMessageQueue){let messages=await this._taskMessageQueue.dequeueAll(taskId,sessionId);for(let message of messages)if(message.type==="request"&&isJSONRPCRequest(message.message)){let requestId=message.message.id,resolver=this._requestResolvers.get(requestId);resolver?(resolver(new McpError(ErrorCode.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(requestId)):this._onerror(new Error(`Resolver missing for request ${requestId} during task ${taskId} cleanup`))}}}async _waitForTaskUpdate(taskId,signal,sessionId){let interval=this._options?.defaultTaskPollInterval??1e3;try{let task=await this._taskStore?.getTask(taskId,sessionId);task?.pollInterval&&(interval=task.pollInterval)}catch{}return new Promise((resolve,reject)=>{if(signal.aborted){reject(new McpError(ErrorCode.InvalidRequest,"Request cancelled"));return}let timeoutId=setTimeout(resolve,interval);signal.addEventListener("abort",()=>{clearTimeout(timeoutId),reject(new McpError(ErrorCode.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(request,sessionId){let taskStore=this._taskStore;if(!taskStore)throw new Error("No task store configured");return{createTask:async taskParams=>{if(!request)throw new Error("No request provided");return await taskStore.createTask(taskParams,request.id,{method:request.method,params:request.params},sessionId)},getTask:async taskId=>{let task=await taskStore.getTask(taskId,sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,"Failed to retrieve task: Task not found");return task},storeTaskResult:async(taskId,status,result)=>{await taskStore.storeTaskResult(taskId,status,result,sessionId);let task=await taskStore.getTask(taskId,sessionId);if(task){let notification=TaskStatusNotificationSchema.parse({method:"notifications/tasks/status",params:task});await this.notification(notification),isTerminal(task.status)&&this._cleanupTaskProgressHandler(taskId)}},getTaskResult:taskId=>taskStore.getTaskResult(taskId,sessionId),updateTaskStatus:async(taskId,status,statusMessage)=>{let task=await taskStore.getTask(taskId,sessionId);if(!task)throw new McpError(ErrorCode.InvalidParams,`Task "${taskId}" not found - it may have been cleaned up`);if(isTerminal(task.status))throw new McpError(ErrorCode.InvalidParams,`Cannot update task "${taskId}" from terminal status "${task.status}" to "${status}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await taskStore.updateTaskStatus(taskId,status,statusMessage,sessionId);let updatedTask=await taskStore.getTask(taskId,sessionId);if(updatedTask){let notification=TaskStatusNotificationSchema.parse({method:"notifications/tasks/status",params:updatedTask});await this.notification(notification),isTerminal(updatedTask.status)&&this._cleanupTaskProgressHandler(taskId)}},listTasks:cursor=>taskStore.listTasks(cursor,sessionId)}}};function isPlainObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function mergeCapabilities(base,additional){let result={...base};for(let key in additional){let k=key,addValue=additional[k];if(addValue===void 0)continue;let baseValue=result[k];isPlainObject(baseValue)&&isPlainObject(addValue)?result[k]={...baseValue,...addValue}:result[k]=addValue}return result}var import_ajv=__toESM(require_ajv(),1),import_ajv_formats=__toESM(require_dist(),1);function createDefaultAjvInstance(){let ajv=new import_ajv.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,import_ajv_formats.default)(ajv),ajv}var AjvJsonSchemaValidator=class{constructor(ajv){this._ajv=ajv??createDefaultAjvInstance()}getValidator(schema){let ajvValidator="$id"in schema&&typeof schema.$id=="string"?this._ajv.getSchema(schema.$id)??this._ajv.compile(schema):this._ajv.compile(schema);return input=>ajvValidator(input)?{valid:!0,data:input,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(ajvValidator.errors)}}};var ExperimentalClientTasks=class{constructor(_client){this._client=_client}async*callToolStream(params,resultSchema=CallToolResultSchema,options){let clientInternal=this._client,optionsWithTask={...options,task:options?.task??(clientInternal.isToolTask(params.name)?{}:void 0)},stream=clientInternal.requestStream({method:"tools/call",params},resultSchema,optionsWithTask),validator=clientInternal.getToolOutputValidator(params.name);for await(let message of stream){if(message.type==="result"&&validator){let result=message.result;if(!result.structuredContent&&!result.isError){yield{type:"error",error:new McpError(ErrorCode.InvalidRequest,`Tool ${params.name} has an output schema but did not return structured content`)};return}if(result.structuredContent)try{let validationResult=validator(result.structuredContent);if(!validationResult.valid){yield{type:"error",error:new McpError(ErrorCode.InvalidParams,`Structured content does not match the tool's output schema: ${validationResult.errorMessage}`)};return}}catch(error){if(error instanceof McpError){yield{type:"error",error};return}yield{type:"error",error:new McpError(ErrorCode.InvalidParams,`Failed to validate structured content: ${error instanceof Error?error.message:String(error)}`)};return}}yield message}}async getTask(taskId,options){return this._client.getTask({taskId},options)}async getTaskResult(taskId,resultSchema,options){return this._client.getTaskResult({taskId},resultSchema,options)}async listTasks(cursor,options){return this._client.listTasks(cursor?{cursor}:void 0,options)}async cancelTask(taskId,options){return this._client.cancelTask({taskId},options)}requestStream(request,resultSchema,options){return this._client.requestStream(request,resultSchema,options)}};function assertToolsCallTaskCapability(requests,method,entityName){if(!requests)throw new Error(`${entityName} does not support task creation (required for ${method})`);switch(method){case"tools/call":if(!requests.tools?.call)throw new Error(`${entityName} does not support task creation for tools/call (required for ${method})`);break;default:break}}function assertClientRequestTaskCapability(requests,method,entityName){if(!requests)throw new Error(`${entityName} does not support task creation (required for ${method})`);switch(method){case"sampling/createMessage":if(!requests.sampling?.createMessage)throw new Error(`${entityName} does not support task creation for sampling/createMessage (required for ${method})`);break;case"elicitation/create":if(!requests.elicitation?.create)throw new Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`);break;default:break}}function applyElicitationDefaults(schema,data){if(!(!schema||data===null||typeof data!="object")){if(schema.type==="object"&&schema.properties&&typeof schema.properties=="object"){let obj=data,props=schema.properties;for(let key of Object.keys(props)){let propSchema=props[key];obj[key]===void 0&&Object.prototype.hasOwnProperty.call(propSchema,"default")&&(obj[key]=propSchema.default),obj[key]!==void 0&&applyElicitationDefaults(propSchema,obj[key])}}if(Array.isArray(schema.anyOf))for(let sub of schema.anyOf)typeof sub!="boolean"&&applyElicitationDefaults(sub,data);if(Array.isArray(schema.oneOf))for(let sub of schema.oneOf)typeof sub!="boolean"&&applyElicitationDefaults(sub,data)}}function getSupportedElicitationModes(capabilities){if(!capabilities)return{supportsFormMode:!1,supportsUrlMode:!1};let hasFormCapability=capabilities.form!==void 0,hasUrlCapability=capabilities.url!==void 0;return{supportsFormMode:hasFormCapability||!hasFormCapability&&!hasUrlCapability,supportsUrlMode:hasUrlCapability}}var Client=class extends Protocol{constructor(_clientInfo,options){super(options),this._clientInfo=_clientInfo,this._cachedToolOutputValidators=new Map,this._cachedKnownTaskTools=new Set,this._cachedRequiredTaskTools=new Set,this._listChangedDebounceTimers=new Map,this._capabilities=options?.capabilities??{},this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator,options?.listChanged&&(this._pendingListChangedConfig=options.listChanged)}_setupListChangedHandlers(config){config.tools&&this._serverCapabilities?.tools?.listChanged&&this._setupListChangedHandler("tools",ToolListChangedNotificationSchema,config.tools,async()=>(await this.listTools()).tools),config.prompts&&this._serverCapabilities?.prompts?.listChanged&&this._setupListChangedHandler("prompts",PromptListChangedNotificationSchema,config.prompts,async()=>(await this.listPrompts()).prompts),config.resources&&this._serverCapabilities?.resources?.listChanged&&this._setupListChangedHandler("resources",ResourceListChangedNotificationSchema,config.resources,async()=>(await this.listResources()).resources)}get experimental(){return this._experimental||(this._experimental={tasks:new ExperimentalClientTasks(this)}),this._experimental}registerCapabilities(capabilities){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setRequestHandler(requestSchema,handler){let methodSchema=getObjectShape(requestSchema)?.method;if(!methodSchema)throw new Error("Schema is missing a method literal");let methodValue=getLiteralValue(methodSchema);if(typeof methodValue!="string")throw new Error("Schema method literal must be a string");let method=methodValue;if(method==="elicitation/create"){let wrappedHandler=async(request,extra)=>{let validatedRequest=safeParse(ElicitRequestSchema,request);if(!validatedRequest.success){let errorMessage=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid elicitation request: ${errorMessage}`)}let{params}=validatedRequest.data;params.mode=params.mode??"form";let{supportsFormMode,supportsUrlMode}=getSupportedElicitationModes(this._capabilities.elicitation);if(params.mode==="form"&&!supportsFormMode)throw new McpError(ErrorCode.InvalidParams,"Client does not support form-mode elicitation requests");if(params.mode==="url"&&!supportsUrlMode)throw new McpError(ErrorCode.InvalidParams,"Client does not support URL-mode elicitation requests");let result=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse(CreateTaskResultSchema,result);if(!taskValidationResult.success){let errorMessage=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage}`)}return taskValidationResult.data}let validationResult=safeParse(ElicitResultSchema,result);if(!validationResult.success){let errorMessage=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid elicitation result: ${errorMessage}`)}let validatedResult=validationResult.data,requestedSchema=params.mode==="form"?params.requestedSchema:void 0;if(params.mode==="form"&&validatedResult.action==="accept"&&validatedResult.content&&requestedSchema&&this._capabilities.elicitation?.form?.applyDefaults)try{applyElicitationDefaults(requestedSchema,validatedResult.content)}catch{}return validatedResult};return super.setRequestHandler(requestSchema,wrappedHandler)}if(method==="sampling/createMessage"){let wrappedHandler=async(request,extra)=>{let validatedRequest=safeParse(CreateMessageRequestSchema,request);if(!validatedRequest.success){let errorMessage=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid sampling request: ${errorMessage}`)}let{params}=validatedRequest.data,result=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse(CreateTaskResultSchema,result);if(!taskValidationResult.success){let errorMessage=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage}`)}return taskValidationResult.data}let resultSchema=params.tools||params.toolChoice?CreateMessageResultWithToolsSchema:CreateMessageResultSchema,validationResult=safeParse(resultSchema,result);if(!validationResult.success){let errorMessage=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid sampling result: ${errorMessage}`)}return validationResult.data};return super.setRequestHandler(requestSchema,wrappedHandler)}return super.setRequestHandler(requestSchema,handler)}assertCapability(capability,method){if(!this._serverCapabilities?.[capability])throw new Error(`Server does not support ${capability} (required for ${method})`)}async connect(transport,options){if(await super.connect(transport),transport.sessionId===void 0)try{let result=await this.request({method:"initialize",params:{protocolVersion:LATEST_PROTOCOL_VERSION,capabilities:this._capabilities,clientInfo:this._clientInfo}},InitializeResultSchema,options);if(result===void 0)throw new Error(`Server sent invalid initialize result: ${result}`);if(!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion))throw new Error(`Server's protocol version is not supported: ${result.protocolVersion}`);this._serverCapabilities=result.capabilities,this._serverVersion=result.serverInfo,transport.setProtocolVersion&&transport.setProtocolVersion(result.protocolVersion),this._instructions=result.instructions,await this.notification({method:"notifications/initialized"}),this._pendingListChangedConfig&&(this._setupListChangedHandlers(this._pendingListChangedConfig),this._pendingListChangedConfig=void 0)}catch(error){throw this.close(),error}}getServerCapabilities(){return this._serverCapabilities}getServerVersion(){return this._serverVersion}getInstructions(){return this._instructions}assertCapabilityForMethod(method){switch(method){case"logging/setLevel":if(!this._serverCapabilities?.logging)throw new Error(`Server does not support logging (required for ${method})`);break;case"prompts/get":case"prompts/list":if(!this._serverCapabilities?.prompts)throw new Error(`Server does not support prompts (required for ${method})`);break;case"resources/list":case"resources/templates/list":case"resources/read":case"resources/subscribe":case"resources/unsubscribe":if(!this._serverCapabilities?.resources)throw new Error(`Server does not support resources (required for ${method})`);if(method==="resources/subscribe"&&!this._serverCapabilities.resources.subscribe)throw new Error(`Server does not support resource subscriptions (required for ${method})`);break;case"tools/call":case"tools/list":if(!this._serverCapabilities?.tools)throw new Error(`Server does not support tools (required for ${method})`);break;case"completion/complete":if(!this._serverCapabilities?.completions)throw new Error(`Server does not support completions (required for ${method})`);break;case"initialize":break;case"ping":break}}assertNotificationCapability(method){switch(method){case"notifications/roots/list_changed":if(!this._capabilities.roots?.listChanged)throw new Error(`Client does not support roots list changed notifications (required for ${method})`);break;case"notifications/initialized":break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method){if(this._capabilities)switch(method){case"sampling/createMessage":if(!this._capabilities.sampling)throw new Error(`Client does not support sampling capability (required for ${method})`);break;case"elicitation/create":if(!this._capabilities.elicitation)throw new Error(`Client does not support elicitation capability (required for ${method})`);break;case"roots/list":if(!this._capabilities.roots)throw new Error(`Client does not support roots capability (required for ${method})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Client does not support tasks capability (required for ${method})`);break;case"ping":break}}assertTaskCapability(method){assertToolsCallTaskCapability(this._serverCapabilities?.tasks?.requests,method,"Server")}assertTaskHandlerCapability(method){this._capabilities&&assertClientRequestTaskCapability(this._capabilities.tasks?.requests,method,"Client")}async ping(options){return this.request({method:"ping"},EmptyResultSchema,options)}async complete(params,options){return this.request({method:"completion/complete",params},CompleteResultSchema,options)}async setLoggingLevel(level,options){return this.request({method:"logging/setLevel",params:{level}},EmptyResultSchema,options)}async getPrompt(params,options){return this.request({method:"prompts/get",params},GetPromptResultSchema,options)}async listPrompts(params,options){return this.request({method:"prompts/list",params},ListPromptsResultSchema,options)}async listResources(params,options){return this.request({method:"resources/list",params},ListResourcesResultSchema,options)}async listResourceTemplates(params,options){return this.request({method:"resources/templates/list",params},ListResourceTemplatesResultSchema,options)}async readResource(params,options){return this.request({method:"resources/read",params},ReadResourceResultSchema,options)}async subscribeResource(params,options){return this.request({method:"resources/subscribe",params},EmptyResultSchema,options)}async unsubscribeResource(params,options){return this.request({method:"resources/unsubscribe",params},EmptyResultSchema,options)}async callTool(params,resultSchema=CallToolResultSchema,options){if(this.isToolTaskRequired(params.name))throw new McpError(ErrorCode.InvalidRequest,`Tool "${params.name}" requires task-based execution. Use client.experimental.tasks.callToolStream() instead.`);let result=await this.request({method:"tools/call",params},resultSchema,options),validator=this.getToolOutputValidator(params.name);if(validator){if(!result.structuredContent&&!result.isError)throw new McpError(ErrorCode.InvalidRequest,`Tool ${params.name} has an output schema but did not return structured content`);if(result.structuredContent)try{let validationResult=validator(result.structuredContent);if(!validationResult.valid)throw new McpError(ErrorCode.InvalidParams,`Structured content does not match the tool's output schema: ${validationResult.errorMessage}`)}catch(error){throw error instanceof McpError?error:new McpError(ErrorCode.InvalidParams,`Failed to validate structured content: ${error instanceof Error?error.message:String(error)}`)}}return result}isToolTask(toolName){return this._serverCapabilities?.tasks?.requests?.tools?.call?this._cachedKnownTaskTools.has(toolName):!1}isToolTaskRequired(toolName){return this._cachedRequiredTaskTools.has(toolName)}cacheToolMetadata(tools){this._cachedToolOutputValidators.clear(),this._cachedKnownTaskTools.clear(),this._cachedRequiredTaskTools.clear();for(let tool of tools){if(tool.outputSchema){let toolValidator=this._jsonSchemaValidator.getValidator(tool.outputSchema);this._cachedToolOutputValidators.set(tool.name,toolValidator)}let taskSupport=tool.execution?.taskSupport;(taskSupport==="required"||taskSupport==="optional")&&this._cachedKnownTaskTools.add(tool.name),taskSupport==="required"&&this._cachedRequiredTaskTools.add(tool.name)}}getToolOutputValidator(toolName){return this._cachedToolOutputValidators.get(toolName)}async listTools(params,options){let result=await this.request({method:"tools/list",params},ListToolsResultSchema,options);return this.cacheToolMetadata(result.tools),result}_setupListChangedHandler(listType,notificationSchema,options,fetcher){let parseResult=ListChangedOptionsBaseSchema.safeParse(options);if(!parseResult.success)throw new Error(`Invalid ${listType} listChanged options: ${parseResult.error.message}`);if(typeof options.onChanged!="function")throw new Error(`Invalid ${listType} listChanged options: onChanged must be a function`);let{autoRefresh,debounceMs}=parseResult.data,{onChanged}=options,refresh=async()=>{if(!autoRefresh){onChanged(null,null);return}try{let items=await fetcher();onChanged(null,items)}catch(e){let error=e instanceof Error?e:new Error(String(e));onChanged(error,null)}},handler=()=>{if(debounceMs){let existingTimer=this._listChangedDebounceTimers.get(listType);existingTimer&&clearTimeout(existingTimer);let timer=setTimeout(refresh,debounceMs);this._listChangedDebounceTimers.set(listType,timer)}else refresh()};this.setNotificationHandler(notificationSchema,handler)}async sendRootsListChanged(){return this.notification({method:"notifications/roots/list_changed"})}};export{Client,getSupportedElicitationModes};
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{classifySystemOne,isRecord}from"./chunk-OLCDIITS.js";import"./chunk-EDOW5W5H.js";import"./chunk-TAV6QZFM.js";import"./chunk-PELNNWGO.js";import"./chunk-6AOVUTUR.js";import"./chunk-45SZOLCU.js";import"./chunk-DMI55M2N.js";import"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var LABEL="Cloudflare Workers AI";function cloudflareErrorMessage(errors){if(Array.isArray(errors)){let messages=errors.map(error=>isRecord(error)&&typeof error.message=="string"?error.message:void 0).filter(message=>message!==void 0);if(messages.length>0)return`${LABEL} error: ${messages.join("; ")}`}return`${LABEL} request failed`}var transport={api:"cloudflare-workers-ai-system-one",label:LABEL,url:model=>new URL("run",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,input:request}),output:body=>{if(!isRecord(body))throw new Error(`${LABEL} returned an unexpected response`);if(body.success===!1)throw new Error(cloudflareErrorMessage(body.errors));let run=body.result;if(!isRecord(run))throw new Error(`${LABEL} returned an unexpected response`);if(run.state!=="Completed")throw new Error(`${LABEL} run did not complete (state: ${String(run.state)})`);if(!isRecord(run.result))throw new Error(`${LABEL} returned an unexpected response`);return run.result}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options);export{classify};
2
+ import{classifySystemOne,isRecord}from"./chunk-UW6M3EXY.js";import"./chunk-EDOW5W5H.js";import"./chunk-TAV6QZFM.js";import"./chunk-PELNNWGO.js";import"./chunk-ZXHLH4MW.js";import"./chunk-45SZOLCU.js";import"./chunk-GQJYNFMO.js";import"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var LABEL="Cloudflare Workers AI";function cloudflareErrorMessage(errors){if(Array.isArray(errors)){let messages=errors.map(error=>isRecord(error)&&typeof error.message=="string"?error.message:void 0).filter(message=>message!==void 0);if(messages.length>0)return`${LABEL} error: ${messages.join("; ")}`}return`${LABEL} request failed`}var transport={api:"cloudflare-workers-ai-system-one",label:LABEL,url:model=>new URL("run",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,input:request}),output:body=>{if(!isRecord(body))throw new Error(`${LABEL} returned an unexpected response`);if(body.success===!1)throw new Error(cloudflareErrorMessage(body.errors));let run=body.result;if(!isRecord(run))throw new Error(`${LABEL} returned an unexpected response`);if(run.state!=="Completed")throw new Error(`${LABEL} run did not complete (state: ${String(run.state)})`);if(!isRecord(run.result))throw new Error(`${LABEL} returned an unexpected response`);return run.result}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options);export{classify};