@code-yeongyu/senpi 2026.10.21-1 → 2026.10.21-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/bundle/chunks/{anthropic-messages-S5BTP7U2.js → anthropic-messages-2IQD75YN.js} +1 -1
  3. package/dist/bundle/chunks/args-SV2KM4KA.js +2 -0
  4. package/dist/bundle/chunks/azure-openai-responses-HFI6SDH5.js +2 -0
  5. package/dist/bundle/chunks/{chunk-WQLMQGOW.js → chunk-2AJB5S4C.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-XSRM367N.js → chunk-3AK3WUN4.js} +2 -2
  7. package/dist/bundle/chunks/{chunk-6TL72TUD.js → chunk-4HJTPWZY.js} +1 -1
  8. package/dist/bundle/chunks/chunk-4NPBDGC4.js +26 -0
  9. package/dist/bundle/chunks/{chunk-E4WOCULF.js → chunk-4XR5HDWC.js} +72 -69
  10. package/dist/bundle/chunks/{chunk-6IWSMXBA.js → chunk-5GC4IQ3A.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-7I7ZMSBF.js → chunk-A4B4CMOR.js} +1 -1
  12. package/dist/bundle/chunks/chunk-B4N4N7BR.js +8 -0
  13. package/dist/bundle/chunks/{chunk-X23XXKMH.js → chunk-BVFJAXWO.js} +1 -1
  14. package/dist/bundle/chunks/{chunk-25B6JQC4.js → chunk-C3BJRXEV.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-DKBJM22C.js → chunk-CQDU6S6C.js} +2 -2
  16. package/dist/bundle/chunks/{chunk-MF57DS3V.js → chunk-EV4TWAJI.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-JJXDWX46.js → chunk-F3JGTOLH.js} +1 -1
  18. package/dist/bundle/chunks/{chunk-CRY5CP3B.js → chunk-G42JHX5Q.js} +3 -3
  19. package/dist/bundle/chunks/{chunk-5VRI3CME.js → chunk-G7VYQRE7.js} +2 -2
  20. package/dist/bundle/chunks/chunk-GVSBCJFI.js +2 -0
  21. package/dist/bundle/chunks/{chunk-KUZPBZUK.js → chunk-HKDGQE6D.js} +2 -2
  22. package/dist/bundle/chunks/{chunk-HD67U37N.js → chunk-HRV7NEOJ.js} +1 -1
  23. package/dist/bundle/chunks/chunk-JDETIKL7.js +7 -0
  24. package/dist/bundle/chunks/{chunk-MVNVDGYF.js → chunk-JGMG227A.js} +1 -1
  25. package/dist/bundle/chunks/chunk-MHD7SSHF.js +2 -0
  26. package/dist/bundle/chunks/{chunk-CEQMTVYS.js → chunk-MXLEWTWC.js} +2 -2
  27. package/dist/bundle/chunks/{chunk-C5W3D56I.js → chunk-N6UN2SDS.js} +3 -3
  28. package/dist/bundle/chunks/chunk-NTK2MHJ5.js +2 -0
  29. package/dist/bundle/chunks/chunk-OMN4QWFA.js +3 -0
  30. package/dist/bundle/chunks/chunk-PLQ5WRXN.js +2 -0
  31. package/dist/bundle/chunks/{chunk-2MOGCBPT.js → chunk-PUMCQ5HS.js} +1 -1
  32. package/dist/bundle/chunks/{chunk-55YTTFNY.js → chunk-PUQFKAB4.js} +1 -1
  33. package/dist/bundle/chunks/{chunk-IJT3GSB2.js → chunk-SN7PTZTC.js} +1 -1
  34. package/dist/bundle/chunks/{chunk-FWHSGCWR.js → chunk-T2IIUI3J.js} +3 -3
  35. package/dist/bundle/chunks/{chunk-5AOKDC6G.js → chunk-TSETMVJP.js} +1 -1
  36. package/dist/bundle/chunks/{chunk-SR7DBNWN.js → chunk-V6AYNGMX.js} +1 -1
  37. package/dist/bundle/chunks/chunk-VDPJ7W52.js +11 -0
  38. package/dist/bundle/chunks/{chunk-EPQK674G.js → chunk-VLKULV6F.js} +1 -1
  39. package/dist/bundle/chunks/{chunk-SL7TSFR5.js → chunk-VXACHCLB.js} +1 -1
  40. package/dist/bundle/chunks/{chunk-FM7NDZR5.js → chunk-VYSRUDEU.js} +1 -1
  41. package/dist/bundle/chunks/chunk-YMFGBSO3.js +2 -0
  42. package/dist/bundle/chunks/cli-main-RA6EBOOU.js +3 -0
  43. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-4QEQ7MGK.js → cloudflare-workers-ai-system-one-BVENEDT6.js} +1 -1
  44. package/dist/bundle/chunks/cursor-agent.js +3 -3
  45. package/dist/bundle/chunks/google-generative-ai-ONS2KSGN.js +2 -0
  46. package/dist/bundle/chunks/google-vertex-5VS7ZESH.js +2 -0
  47. package/dist/bundle/chunks/help-fast-path-FZY53UXB.js +2 -0
  48. package/dist/bundle/chunks/host-command-TNUIHEFP.js +2 -0
  49. package/dist/bundle/chunks/{host-lifecycle-EZQ5VCQV.js → host-lifecycle-LDOHAYLK.js} +1 -1
  50. package/dist/bundle/chunks/host-session-command-OKASUQPA.js +20 -0
  51. package/dist/bundle/chunks/interactive-mode-PSGTSURY.js +2 -0
  52. package/dist/bundle/chunks/{mistral-conversations-5EHLE7PZ.js → mistral-conversations-RLDMF2BI.js} +1 -1
  53. package/dist/bundle/chunks/{multi-session-host-OMJZ5VXM.js → multi-session-host-J5BVVUG3.js} +7 -6
  54. package/dist/bundle/chunks/openai-codex-responses-VRIJIZJG.js +10 -0
  55. package/dist/bundle/chunks/{openai-completions-NHDMDAS7.js → openai-completions-EZBOIXHP.js} +2 -2
  56. package/dist/bundle/chunks/{openai-images-PNXQDBSP.js → openai-images-KKM343F2.js} +1 -1
  57. package/dist/bundle/chunks/openai-responses-CMBH3DCY.js +3 -0
  58. package/dist/bundle/chunks/{package-manager-cli-7GQDB5DX.js → package-manager-cli-JHVRG35I.js} +1 -1
  59. package/dist/bundle/chunks/{role-WQWYL4ZD.js → role-LNF5MFGC.js} +1 -1
  60. package/dist/bundle/chunks/rotation-stream-JK3Q4IWI.js +2 -0
  61. package/dist/bundle/chunks/rpc-mode-HVSPPRTT.js +2 -0
  62. package/dist/bundle/chunks/{rpc-monitor-source-FI7H7LGY.js → rpc-monitor-source-2DQZLFFJ.js} +1 -1
  63. package/dist/bundle/chunks/{runtime-session-IQAKNRTV.js → runtime-session-CLNODAYE.js} +1 -1
  64. package/dist/bundle/chunks/{schedule-command-XXJC4QQN.js → schedule-command-OMI4VWUV.js} +1 -1
  65. package/dist/bundle/chunks/session-control-endpoint-UPYF4OFP.js +3 -0
  66. package/dist/bundle/chunks/session-picker-NR7CRVNQ.js +2 -0
  67. package/dist/bundle/chunks/session-worker.js +143 -139
  68. package/dist/bundle/chunks/{typesafe-system-one-W2ZTYF7X.js → typesafe-system-one-PJIWA5SP.js} +1 -1
  69. package/dist/bundle/cli.js +2 -2
  70. package/dist/bundle/index.js +1 -1
  71. package/dist/bundle/rpc-entry.js +1 -1
  72. package/dist/bundle/runtime-manifest.json +1 -1
  73. package/dist/cli/host-command.d.ts +2 -0
  74. package/dist/cli/host-command.js +14 -19
  75. package/dist/cli/host-handover-args.d.ts +4 -0
  76. package/dist/cli/host-handover-args.js +20 -0
  77. package/dist/core/agent-session.d.ts +29 -1
  78. package/dist/core/agent-session.js +74 -19
  79. package/dist/core/auth-storage.d.ts +44 -1
  80. package/dist/core/auth-storage.js +120 -3
  81. package/dist/core/client-message-identity.d.ts +3 -0
  82. package/dist/core/credential-accounts.d.ts +2 -0
  83. package/dist/core/credential-accounts.js +8 -1
  84. package/dist/core/credential-pool/rotation-slots.js +3 -2
  85. package/dist/core/extensions/builtin/account/index.js +6 -1
  86. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +2 -1
  87. package/dist/core/extensions/builtin/compaction/openai-remote.js +6 -5
  88. package/dist/core/extensions/builtin/goal/provider-retry.d.ts +2 -2
  89. package/dist/core/extensions/builtin/goal/provider-retry.js +18 -6
  90. package/dist/core/extensions/builtin/terminal/command-monitor-source.d.ts +17 -4
  91. package/dist/core/extensions/builtin/terminal/command-monitor-source.js +33 -6
  92. package/dist/core/extensions/builtin/terminal/durable-command.js +1 -0
  93. package/dist/core/extensions/builtin/terminal/extension.js +28 -0
  94. package/dist/core/extensions/builtin/terminal/monitor-notify-details.d.ts +6 -0
  95. package/dist/core/extensions/builtin/terminal/monitor-notify-details.js +19 -0
  96. package/dist/core/extensions/builtin/terminal/monitor-notify-format.d.ts +18 -0
  97. package/dist/core/extensions/builtin/terminal/monitor-notify-format.js +52 -0
  98. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +8 -1
  99. package/dist/core/extensions/builtin/terminal/monitor-notify.js +65 -119
  100. package/dist/core/extensions/builtin/terminal/monitor-overflow-file.d.ts +7 -0
  101. package/dist/core/extensions/builtin/terminal/monitor-overflow-file.js +67 -0
  102. package/dist/core/extensions/builtin/terminal/monitor-overflow.d.ts +37 -0
  103. package/dist/core/extensions/builtin/terminal/monitor-overflow.js +75 -0
  104. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +10 -0
  105. package/dist/core/extensions/builtin/terminal/monitor-registry.js +24 -1
  106. package/dist/core/extensions/builtin/terminal/monitor-types.d.ts +5 -0
  107. package/dist/core/extensions/builtin/terminal/monitor-wake-fit.d.ts +9 -0
  108. package/dist/core/extensions/builtin/terminal/monitor-wake-fit.js +34 -0
  109. package/dist/core/extensions/builtin/terminal/monitor-wake-pacing.d.ts +10 -0
  110. package/dist/core/extensions/builtin/terminal/monitor-wake-pacing.js +41 -0
  111. package/dist/core/extensions/builtin/terminal/restore-session.js +2 -0
  112. package/dist/core/extensions/builtin/terminal/rpc-monitor-observer.js +5 -1
  113. package/dist/core/extensions/builtin/terminal/settings.d.ts +10 -0
  114. package/dist/core/extensions/builtin/terminal/settings.js +13 -1
  115. package/dist/core/extensions/builtin/terminal/shared.d.ts +17 -10
  116. package/dist/core/extensions/builtin/terminal/shared.js +19 -10
  117. package/dist/core/extensions/builtin/terminal/terminal-manifest-model.d.ts +3 -0
  118. package/dist/core/extensions/builtin/terminal/terminal-manifest-parse.js +7 -0
  119. package/dist/core/extensions/builtin/terminal/terminal-manifest.js +1 -0
  120. package/dist/core/extensions/builtin/terminal/tools/monitor-schema.d.ts +1 -0
  121. package/dist/core/extensions/builtin/terminal/tools/monitor-schema.js +6 -1
  122. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +1 -0
  123. package/dist/core/extensions/builtin/terminal/tools/monitor.js +9 -1
  124. package/dist/core/extensions/builtin/tps.js +1 -8
  125. package/dist/core/extensions/loader.js +3 -1
  126. package/dist/core/extensions/runner.d.ts +1 -0
  127. package/dist/core/extensions/runner.js +12 -1
  128. package/dist/core/extensions/types.d.ts +3 -1
  129. package/dist/core/session-manager.d.ts +10 -1
  130. package/dist/core/session-manager.js +4 -3
  131. package/dist/core/terminal-settings.d.ts +3 -0
  132. package/dist/index.d.ts +1 -1
  133. package/dist/main.d.ts +14 -0
  134. package/dist/main.js +25 -8
  135. package/dist/modes/index.d.ts +1 -0
  136. package/dist/modes/index.js +1 -0
  137. package/dist/modes/interactive/components/footer.js +4 -2
  138. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  139. package/dist/modes/interactive/interactive-mode.js +13 -1
  140. package/dist/modes/rpc/client-admission-record.d.ts +5 -0
  141. package/dist/modes/rpc/client-admission-record.js +2 -0
  142. package/dist/modes/rpc/connection-handler.d.ts +3 -0
  143. package/dist/modes/rpc/connection-handler.js +33 -5
  144. package/dist/modes/rpc/connection-roles.d.ts +30 -0
  145. package/dist/modes/rpc/connection-roles.js +53 -0
  146. package/dist/modes/rpc/custom-capability.d.ts +6 -0
  147. package/dist/modes/rpc/custom-capability.js +6 -0
  148. package/dist/modes/rpc/host-capabilities.js +2 -1
  149. package/dist/modes/rpc/host-decision.d.ts +4 -1
  150. package/dist/modes/rpc/host-decision.js +6 -3
  151. package/dist/modes/rpc/host-ensure-liveness.d.ts +11 -0
  152. package/dist/modes/rpc/host-ensure-liveness.js +26 -0
  153. package/dist/modes/rpc/host-ensure.js +2 -3
  154. package/dist/modes/rpc/host-holder.d.ts +27 -0
  155. package/dist/modes/rpc/host-holder.js +18 -0
  156. package/dist/modes/rpc/host-runner.d.ts +2 -0
  157. package/dist/modes/rpc/host-runner.js +8 -1
  158. package/dist/modes/rpc/host-status-all.js +1 -0
  159. package/dist/modes/rpc/host-status.d.ts +1 -0
  160. package/dist/modes/rpc/host-status.js +5 -0
  161. package/dist/modes/rpc/host-stop-generation.d.ts +22 -0
  162. package/dist/modes/rpc/host-stop-generation.js +36 -0
  163. package/dist/modes/rpc/host-stop-start-time.d.ts +15 -0
  164. package/dist/modes/rpc/host-stop-start-time.js +30 -0
  165. package/dist/modes/rpc/host-stop.d.ts +13 -1
  166. package/dist/modes/rpc/host-stop.js +78 -9
  167. package/dist/modes/rpc/rpc-client.d.ts +9 -0
  168. package/dist/modes/rpc/rpc-client.js +15 -0
  169. package/dist/modes/rpc/rpc-types.d.ts +18 -0
  170. package/dist/modes/rpc/rpc-types.js +2 -0
  171. package/dist/modes/rpc/session-binding.d.ts +1 -1
  172. package/dist/modes/rpc/session-command-router.d.ts +1 -0
  173. package/dist/modes/rpc/session-command-router.js +13 -0
  174. package/dist/modes/rpc/session-worker-client.d.ts +1 -1
  175. package/dist/modes/rpc/session-worker-client.js +12 -1
  176. package/dist/modes/rpc/session-worker-protocol.d.ts +3 -0
  177. package/dist/modes/rpc/session-worker.js +9 -0
  178. package/docs/rpc.md +54 -2
  179. package/docs/session-format.md +5 -0
  180. package/package.json +6 -6
  181. package/dist/bundle/chunks/args-CRXNC7IS.js +0 -2
  182. package/dist/bundle/chunks/azure-openai-responses-2DCY6QKO.js +0 -2
  183. package/dist/bundle/chunks/chunk-5ZBDN3LB.js +0 -26
  184. package/dist/bundle/chunks/chunk-AEJUOQ7U.js +0 -2
  185. package/dist/bundle/chunks/chunk-LAWS3FYQ.js +0 -11
  186. package/dist/bundle/chunks/chunk-LM76EMEJ.js +0 -7
  187. package/dist/bundle/chunks/chunk-M237EDHB.js +0 -2
  188. package/dist/bundle/chunks/chunk-V6RY5A6T.js +0 -2
  189. package/dist/bundle/chunks/chunk-WIAXG52U.js +0 -2
  190. package/dist/bundle/chunks/chunk-WTFD4TII.js +0 -8
  191. package/dist/bundle/chunks/chunk-Z33PKFXM.js +0 -3
  192. package/dist/bundle/chunks/cli-main-RKC5Z25H.js +0 -3
  193. package/dist/bundle/chunks/google-generative-ai-3SKUSCIL.js +0 -2
  194. package/dist/bundle/chunks/google-vertex-YHSIIE4G.js +0 -2
  195. package/dist/bundle/chunks/help-fast-path-FWS5ARO5.js +0 -2
  196. package/dist/bundle/chunks/host-command-L66Y7ZL5.js +0 -2
  197. package/dist/bundle/chunks/host-session-command-2YNQNTEH.js +0 -20
  198. package/dist/bundle/chunks/interactive-mode-XOKTNBLA.js +0 -2
  199. package/dist/bundle/chunks/openai-codex-responses-4BIPACKV.js +0 -10
  200. package/dist/bundle/chunks/openai-responses-2UOPEJLP.js +0 -3
  201. package/dist/bundle/chunks/rotation-stream-J2NUPRMG.js +0 -2
  202. package/dist/bundle/chunks/rpc-mode-WM5WH7TH.js +0 -2
  203. package/dist/bundle/chunks/session-control-endpoint-MTOAYRRY.js +0 -3
  204. package/dist/bundle/chunks/session-picker-LU7BPLNI.js +0 -2
@@ -1,11 +0,0 @@
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=`
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
-
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}":
6
-
7
- ${value}`);return parts.join(`
8
-
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
-
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)}function appendLoginSlot(current,flat,onAllocated){let 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 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 stored=await readCredential(credentials,provider.id,signal),slotName=overrides?.slotName;if(slotName!==void 0){let projected=stored===void 0?void 0:projectSlot(stored,slotName);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}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 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 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),credential=await raceWithAbortSignal(loginOperation,signal),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()){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,appendLoginSlot,repairManagedSentinelSlots,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};
@@ -1,7 +0,0 @@
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{BUILTIN_PATH_PREFIX}from"./chunk-QMRJYMNH.js";import{listHostEndpoints}from"./chunk-6IWSMXBA.js";import{parseArgs,resolveSessionRuntime}from"./chunk-EPQK674G.js";import{PROBE_REQUEST_ID,connectAndAsk,isRecord,readAnswer,requestOnSocket}from"./chunk-IBDADH5Z.js";import{HOST_GENERATION_ENV,HOST_INSTANCE_ID_ENV,OBSERVE_REQUEST_FIELD,acquireOwnershipSafeLock,claimOwnerIsLive,hostChildAlive,isGenerationId,logUnknownHostIdentity,provenOwner,readDrainWatch,readGenerationRegistration,readHostRegistration,readSessionPathClaims,releaseGeneration,resolveHostPolicy,writeDrainRequest,writeStopIntent}from"./chunk-DKBJM22C.js";import{HOST_DAEMON_LAYOUT,canonicalEndpointPath,createHostDaemonPaths,generationPaths,hostDaemonDirectoryPaths,parseJson,readFileOrUndefined,sameEndpoint}from"./chunk-KUZPBZUK.js";import{readSocketSecret,resolveSocketTransportAddress,socketSecretPath}from"./chunk-QEQG42HL.js";import{APP_NAME,VERSION,isBunBinary}from"./chunk-4J4ABCCL.js";import{ProcessIdentityUnreadableError,parseDaemonPidFile,processIsLive,processMatchesPidFile,processStartTimeMs,readProcessStartTime}from"./chunk-7ASLQ243.js";var CALVER=/^(\d+)\.(\d+)\.(\d+)(?:-(\d+))?/;function engineBuildIdentityFrom(build){let match=CALVER.exec(build.version),epoch=Number.isSafeInteger(build.epoch)&&build.epoch!==void 0&&build.epoch>0?build.epoch:0,sha7=build.sha7??"";return{text:epoch===0?build.version:`${build.version}+${epoch}${sha7===""?"":`.${sha7}`}`,ordinal:[match?Number(match[1]):0,match?Number(match[2]):0,match?Number(match[3]):0,match?.[4]?Number(match[4]):0,epoch],scheme:epoch===0?"nodef":"epoch"}}var BUILT=engineBuildIdentityFrom({version:VERSION,epoch:typeof SENPI_BUILD_EPOCH=="number"?SENPI_BUILD_EPOCH:0,sha7:typeof SENPI_BUILD_SHA7=="string"?SENPI_BUILD_SHA7:""});function engineBuildIdentity(){return BUILT}function compareEngineOrdinal(a,b){for(let index=0;index<4;index++)if(a.ordinal[index]!==b.ordinal[index])return a.ordinal[index]>b.ordinal[index]?1:-1;return a.scheme!=="epoch"||b.scheme!=="epoch"||a.ordinal[4]===b.ordinal[4]?0:a.ordinal[4]>b.ordinal[4]?1:-1}import*as crypto from"node:crypto";var CUSTOM_UNSUPPORTED_CAPABILITY="custom_unsupported",EXTENSION_EVENTS_CAPABILITY="extension_events",EVAL_CELLS_CAPABILITY="eval_cells",AUTO_TITLE_SESSIONS_CAPABILITY="auto_title_sessions",CONTINUE_FROM_LEAF_CAPABILITY="continue_from_leaf",SESSION_HELD_CAPABILITY="session_held",RESUME_SESSION_CAPABILITY="resume_session",ATTENDED_CAPABILITY="attended",MEDIA_PLACEHOLDERS_CAPABILITY="media_placeholders",QUESTION_CAPABILITY="question",RETAIN_ON_DISCONNECT_CAPABILITY="retain_on_disconnect",DETACH_CONNECTION_CAPABILITY="detach_connection",SESSION_CONTEXT_CAPABILITY="session_context",SESSION_KIND_CAPABILITY="session_kind",SESSION_STATUS_CAPABILITY="session_status",AUTO_TITLE_PER_SESSION_CAPABILITY="auto_title_per_session",WARM_CAPABILITY="warm",DURABLE_SESSION_ID_CAPABILITY="durable_session_id",MOVED_PATH_GUARD_CAPABILITY="moved_path_guard",PROMPT_SURFACE_CAPABILITY="prompt_surface",BROWSER_ENGINE_CAPABILITY="browser_engine",RETRY_FALLBACK_PROFILE_CAPABILITY="retry_fallback_profile",RETRY_FALLBACK_COMMAND_CAPABILITY="retry_fallback_command",PROMPT_SURFACE_CHAT_CAPABILITY="prompt_surface_chat",RPC_CLIENT_CAPABILITIES_ENV="SENPI_RPC_CLIENT_CAPABILITIES";function parseClientCapabilities(value){return value?value.split(",").map(part=>part.trim()).filter(part=>part.length>0):[]}var DEFAULT_CUSTOM_EXTENSION_LABEL="custom UI component";function buildCustomUnsupportedRequest(capabilities,extensionName){if(!capabilities?.includes(CUSTOM_UNSUPPORTED_CAPABILITY))return;let name=extensionName.trim()||DEFAULT_CUSTOM_EXTENSION_LABEL;return{type:"extension_ui_request",id:crypto.randomUUID(),method:"custom_unsupported",extensionName:name}}var AUTH_KEY_VERIFY_CAPABILITY="auth_key_verify",QUEUED_MESSAGE_REVISION_CAPABILITY="queued_message_revision";import{createHash}from"node:crypto";import{existsSync}from"node:fs";import{readdir,readFile,realpath,stat}from"node:fs/promises";import{basename,dirname,join,relative,sep}from"node:path";import{fileURLToPath}from"node:url";var RUNTIME_IDENTITY_HANDOVER_CAPABILITY="runtime_identity_handover",RUNTIME_BUILD_ID=/^sha256:[0-9a-f]{64}$/,EXCLUDED_FILE=/\.(?:d\.[cm]?ts|map)$/,EXCLUDED_NAMES=new Set(["node_modules","runtime-manifest.json","runtime-snapshot.json"]),READ_CONCURRENCY=32;function parseRuntimeBuildId(value){return typeof value=="string"&&RUNTIME_BUILD_ID.test(value)?value:void 0}async function computeRuntimeBuildId(input){let source=input.source??loadedRuntimeSource(),plugins=await Promise.all(input.profile.extensions.map(path=>extensionDigest(path))),manifest={schema:1,flavour:source.flavour,platform:input.platform??process.platform,arch:input.arch??process.arch,engine:input.engine??engineBuildIdentity().text,runtime:await treeDigest(source.root),plugins:plugins.sort(),profile:{multi_session:input.profile.multi_session,session_runtime:input.profile.session_runtime}};return`sha256:${sha256(JSON.stringify(manifest))}`}function loadedRuntimeSource(){if(isBunBinary)return{flavour:"compiled",root:process.execPath};let moduleDir=dirname(fileURLToPath(import.meta.url)),packageRoot=nearestPackageRoot(moduleDir),[top,next]=relative(packageRoot,moduleDir).split(sep);return top==="dist"?{flavour:"packaged",root:join(packageRoot,next==="bundle"?join("dist","bundle"):"dist")}:{flavour:"dev",root:join(packageRoot,top??"")}}function nearestPackageRoot(start){for(let dir=start;;dir=dirname(dir)){if(existsSync(join(dir,"package.json")))return dir;if(dirname(dir)===dir)return start}}function extensionDigest(path){let name=basename(path);return name.startsWith(BUILTIN_PATH_PREFIX)?Promise.resolve(sha256(name)):treeDigest(path)}async function treeDigest(root){let files=[];(await stat(root)).isFile()?files.push(["",root]):await collect(await realpath(root),"",files,new Set);let digests=await mapLimited(files,READ_CONCURRENCY,async([path,file])=>[path,sha256(await readFile(file))]);return digests.sort(([a],[b])=>a<b?-1:a>b?1:0),sha256(JSON.stringify(digests))}async function collect(dir,prefix,files,seen){if(seen.has(dir))return;seen.add(dir);let entries=(await readdir(dir,{withFileTypes:!0})).sort((a,b)=>a.name<b.name?-1:a.name>b.name?1:0);for(let entry of entries){if(entry.name.startsWith(".")||EXCLUDED_NAMES.has(entry.name))continue;let path=join(dir,entry.name),name=prefix===""?entry.name:`${prefix}/${entry.name}`,kind=entry.isSymbolicLink()?await stat(path).catch(()=>{}):entry;kind!==void 0&&(kind.isDirectory()?await collect(await realpath(path),name,files,seen):kind.isFile()&&!EXCLUDED_FILE.test(entry.name)&&files.push([name,path]))}}async function mapLimited(items,limit,map){let results=new Array(items.length),next=0,worker=async()=>{for(let index=next++;index<items.length;index=next++)results[index]=await map(items[index])};return await Promise.all(Array.from({length:Math.min(limit,items.length)},worker)),results}function sha256(data){return createHash("sha256").update(data).digest("hex")}function parseHostProtocolInfo(data){if(!isRecord2(data)||typeof data.serverVersion!="string"||!Array.isArray(data.capabilities)||!data.capabilities.every(entry=>typeof entry=="string"))return;let ordinal=parseOrdinal(data.engineOrdinal),launchProfile=parseLaunchProfile(data.launch_profile),runtimeBuildId=parseRuntimeBuildId(data.runtimeBuildId);return{protocolVersion:typeof data.protocolVersion=="number"?data.protocolVersion:0,serverVersion:data.serverVersion,capabilities:data.capabilities,...(data.lifecycle==="ready"||data.lifecycle==="stopping")&&{lifecycle:data.lifecycle},...typeof data.instanceId=="string"&&{instanceId:data.instanceId},...typeof data.generation=="number"&&Number.isSafeInteger(data.generation)&&{generation:data.generation},...typeof data.engineVersion=="string"&&{engineVersion:data.engineVersion},...ordinal&&{engineOrdinal:ordinal},...launchProfile&&{launch_profile:launchProfile},...typeof data.memory_pressure=="boolean"&&{memory_pressure:data.memory_pressure},...runtimeBuildId!==void 0&&{runtimeBuildId},...isRecord2(data.handover)&&{handover:data.handover}}}function parseOrdinal(value){if(!(!Array.isArray(value)||value.length!==5||!value.every(part=>typeof part=="number")))return[value[0],value[1],value[2],value[3],value[4]]}function parseLaunchProfile(value){if(!isRecord2(value)||typeof value.profile_id!="string"||!isRecord2(value.core))return;let{extensions,multi_session,session_runtime}=value.core;if(!(!Array.isArray(extensions)||!extensions.every(entry=>typeof entry=="string"))&&typeof multi_session=="boolean"&&!(session_runtime!=="in-process"&&session_runtime!=="worker"))return{profile_id:value.profile_id,core:{extensions,multi_session,session_runtime}}}function isRecord2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var HOST_PROTOCOL_VERSION=1,GENERATION_HANDOFF_CAPABILITY="generation_handoff",REQUIRED_HOST_CAPABILITIES=["multi_session",EXTENSION_EVENTS_CAPABILITY,SESSION_CONTEXT_CAPABILITY,SESSION_KIND_CAPABILITY],HostEnsureRefusedError=class extends Error{constructor(socket,reason,host,detail){super(`RPC socket ${socket} refused: ${reason} - ${refusalDetail(reason,host)}${detail?`: ${detail}`:""}`),this.name="HostEnsureRefusedError",this.socket=socket,this.reason=reason,this.detail=detail}};function refusalDetail(reason,host){switch(reason){case"protocol":return`the running host speaks protocol version ${host?.protocolVersion??"unknown"}, this build speaks ${HOST_PROTOCOL_VERSION}`;case"capability":{let missing=REQUIRED_HOST_CAPABILITIES.filter(capability=>!host?.capabilities.includes(capability));return`the running host is missing ${JSON.stringify(missing)}; it owns the socket, so no second host is started`}case"foreign_writer":return"its pidfile was written by another process, so this one may not signal it; stop that host explicitly instead";case"legacy_host":return"a host from before the per-socket daemon directory is still running; it is drained and replaced only while it holds no session, and no second host is started beside it";case"host_busy":return"its socket accepts connections but did not answer inside the probe budget: a live host under load, which is never ended to make room for a replacement";case"host_stopping":return"this generation is stopping; wait for its exit before launching a successor";case"endpoint_occupied":return"another process accepts connections on this socket but does not answer as a host, and no host registration names it; it is never removed while it listens, so quit the process holding it and ensure again";case"host_stalled":return"nothing reaches its socket, but its process is alive and its own loop-lag watchdog measured a recent stall: a stalled host is still serving its sessions, so it is neither stopped nor replaced";default:return assertNever(reason)}}function decideHostAction(client,host,policy){if(host===void 0)return{action:"start",reason:client.startedByUs?"restart_own_host":"no_host",upgradeable:!1};if(host.lifecycle==="stopping")return{action:"refuse",reason:"host_stopping",upgradeable:!1};if(host.protocolVersion!==client.protocolVersion)return{action:"refuse",reason:"protocol",upgradeable:!1};if(!client.requiredCapabilities.every(capability=>host.capabilities.includes(capability)))return policy==="fallback"?{action:"fallback",reason:"capability",upgradeable:!1}:{action:"refuse",reason:"capability",upgradeable:!1};let upgradeable=client.platform!=="win32"&&host.capabilities.includes(GENERATION_HANDOFF_CAPABILITY);if(policy==="fallback"&&host.engineVersion!==client.identity.text)return{action:"fallback",reason:"engine_mismatch",upgradeable};let warning=profileWarning(client,host);return client.platform==="win32"?{action:"reuse",reason:"win32_attach_only",upgradeable:!1,...warning&&{warning}}:upgradeable?policy==="upgrade"&&client.launchProfile&&host.launch_profile&&supersedes(client,host)?{action:"handoff",reason:sameRelease(client.identity.ordinal,host.engineOrdinal)?"profile":"newer_engine",upgradeable:!0}:{action:"reuse",reason:"compatible",upgradeable,...warning&&{warning}}:{action:"reuse",reason:"handoff_unsupported",upgradeable:!1,...warning&&{warning}}}function supersedes(client,host){if(host.engineOrdinal===void 0)return!1;let hostIdentity={text:host.engineVersion??"",ordinal:host.engineOrdinal,scheme:host.engineOrdinal[4]>0?"epoch":"nodef"};return compareEngineOrdinal(client.identity,hostIdentity)<=0?!1:covers(client.launchProfile,host.launch_profile)}function profileWarning(client,host){if(client.launchProfile===void 0||host.launch_profile===void 0)return"profile_mismatch_attached";if(client.launchProfile.profile_id===host.launch_profile.profile_id)return;let clientCoversHost=covers(client.launchProfile,host.launch_profile);if(!(clientCoversHost&&covers(host.launch_profile,client.launchProfile)))return clientCoversHost?"profile_mismatch_attached":"profile_narrower_attached"}function extensionRole(extension){let segments=extension.split(/[\\/]+/),pluginAt=segments.lastIndexOf("plugin");return pluginAt<0?extension:segments.slice(pluginAt).join("/")}function covers(candidate,running){if(candidate===void 0||running===void 0)return!1;let candidateRoles=new Set(candidate.core.extensions.map(extensionRole));return running.core.extensions.every(extension=>candidateRoles.has(extensionRole(extension)))}function sameRelease(candidate,running){return running!==void 0&&candidate.slice(0,4).every((part,index)=>part===running[index])}function assertNever(value){throw new Error(`unreachable host decision: ${JSON.stringify(value)}`)}import{createHash as createHash2,randomUUID as randomUUID2}from"node:crypto";import{resolve}from"node:path";var INSTANCE_ID=resolveInstanceId(process.env[HOST_INSTANCE_ID_ENV]);function resolveInstanceId(value){return value!==void 0&&value.trim()!==""?value:randomUUID2()}function hostInstanceId(){return INSTANCE_ID}var cachedProfile;function hostGeneration(env){let value=env[HOST_GENERATION_ENV];return value!==void 0&&/^\d+$/.test(value)?Number(value):0}function hostLaunchProfile(argv,cwd){let parsed=parseArgs([...argv],{grokNeoEnabled:!1}),core={extensions:[...new Set((parsed.extensions??[]).map(path=>resolve(cwd,path)))].sort(),multi_session:parsed.multiSession===!0,session_runtime:resolveSessionRuntime(parsed)},canonical=JSON.stringify({extensions:core.extensions,multi_session:core.multi_session,session_runtime:core.session_runtime});return{profile_id:createHash2("sha256").update(canonical).digest("hex"),core}}function socketHostLaunchProfile(hostArgs,cwd){return hostLaunchProfile(["--mode","rpc","--multi-session","--listen","unix://",...hostArgs],cwd)}function protocolIdentity(){cachedProfile??=hostLaunchProfile(process.argv.slice(2),process.cwd());let build=engineBuildIdentity();return{instanceId:INSTANCE_ID,generation:hostGeneration(process.env),engineVersion:build.text,engineOrdinal:build.ordinal,launch_profile:cachedProfile}}function holdAttachment(socket){return socket.removeAllListeners("data"),socket.resume(),socket.on("error",()=>socket.destroy()),socket.unref(),{release:()=>socket.destroy()}}var DEFAULT_PROBE_TIMEOUT_MS=1e4;function probeHost(options){return probeProtocolInfo(options.socket,options.timeoutMs??DEFAULT_PROBE_TIMEOUT_MS)}async function probeProtocolInfo(socketPath,timeoutMs){let reply=await requestOnSocket(socketPath,{type:"get_protocol_info"},timeoutMs);return reply===void 0?void 0:parseHostProtocolInfo(reply)}async function observeProtocolInfo(socketPath,timeoutMs){let reply=await requestOnSocket(socketPath,{type:"get_protocol_info",[OBSERVE_REQUEST_FIELD]:!0},timeoutMs);return reply===void 0?void 0:parseHostProtocolInfo(reply)}async function holdProtocolInfo(socketPath,timeoutMs){let outcome=await connectAndAsk(socketPath,{id:PROBE_REQUEST_ID,type:"get_protocol_info"},timeoutMs,!0),info=outcome.answer===void 0?void 0:parseHostProtocolInfo(outcome.answer);if(outcome.kept===void 0)return;let hold=holdAttachment(outcome.kept);if(info!==void 0)return{info,hold};hold.release()}async function probeSocketReachable(socketPath,timeoutMs){return(await connectAndAsk(socketPath,{id:PROBE_REQUEST_ID,type:"get_protocol_info"},timeoutMs)).connected}async function probeSessionCount(socketPath,timeoutMs){return sessionCountOf(await requestOnSocket(socketPath,{type:"list_sessions",include_workers:!0},timeoutMs))}async function holdSessionCount(socketPath,timeoutMs){let outcome=await connectAndAsk(socketPath,{id:PROBE_REQUEST_ID,type:"list_sessions",include_workers:!0},timeoutMs,!0),kept=outcome.kept;if(kept===void 0)return;let sessions=sessionCountOf(outcome.answer);if(sessions===void 0){kept.destroy();return}let asked=0;return{sessions,recount:recountTimeoutMs=>askAgain(kept,`${PROBE_REQUEST_ID}-recount-${++asked}`,recountTimeoutMs),close:()=>kept.destroy()}}function askAgain(socket,id,timeoutMs){return new Promise(resolveCount=>{let buffer="",finish=count=>{clearTimeout(timeout),socket.off("data",onData),socket.off("close",onClose),resolveCount(count)},onClose=()=>finish(void 0),onData=chunk=>{buffer+=chunk.toString("utf8");for(let newline=buffer.indexOf(`
3
- `);newline!==-1;newline=buffer.indexOf(`
4
- `)){let answer=readAnswer(buffer.slice(0,newline),id);if(buffer=buffer.slice(newline+1),answer!==void 0){finish(sessionCountOf(answer));return}}},timeout=setTimeout(()=>finish(void 0),timeoutMs);if(socket.destroyed){finish(void 0);return}socket.on("data",onData),socket.once("close",onClose),socket.write(`${JSON.stringify({id,type:"list_sessions",include_workers:!0})}
5
- `)})}function sessionCountOf(reply){return isRecord(reply)&&Array.isArray(reply.sessions)?reply.sessions.length:void 0}import{dirname as dirname2,join as join2}from"node:path";var LEGACY_PROBE_TIMEOUT_MS=1e4,DRAIN_POLL_MS=50;async function retireIdleLegacyHost(paths,probe,drainTimeoutMs=LEGACY_PROBE_TIMEOUT_MS){let judged=await judgeLegacyHost(paths,probe);if(judged.verdict==="absent")return;if(judged.verdict==="held")return judged.detail;let{record,socket}=judged.host;if(!await drainAndWait(record,probe,drainTimeoutMs))return`pid ${record.pid} (${socket}) was asked to drain and is still running after ${drainTimeoutMs}ms; retry once it exits`}async function readLegacyHost(paths){let text=await readFileOrUndefined(paths.legacyPidFile),record=text===void 0?void 0:parseDaemonPidFile(text);if(record===void 0)return;let stamped=parseJson(text)?.socket;return{record,socket:typeof stamped=="string"?stamped:join2(dirname2(paths.flatDir),"rpc","rpc.sock")}}async function provenLegacyOwner(paths,socket){let legacy=await readLegacyHost(paths),startTime=legacy?.record.processStartTime;if(!legacy||startTime===null||startTime===void 0||!sameEndpoint(legacy.socket,socket))return;let identity={pid:legacy.record.pid,processStartTime:startTime};return await processMatchesPidFile(identity,readProcessStartTime).catch(error=>(error instanceof ProcessIdentityUnreadableError&&logUnknownHostIdentity("legacy_host.pid",identity.pid),!1))?identity:void 0}async function judgeLegacyHost(paths,probe,platform=process.platform){let host=await readLegacyHost(paths);if(host===void 0)return{verdict:"absent"};let{pid}=host.record,identity=await processMatchesPidFile(host.record,probe).then(owns=>owns?"proven":"gone",error=>{if(error instanceof ProcessIdentityUnreadableError)return"unreadable";throw error});if(identity==="gone")return{verdict:"absent"};let where=`pid ${pid} (${host.socket})`;if(identity==="unreadable")return logUnknownHostIdentity("legacy_host.pid",pid),{verdict:"held",detail:`${where} cannot be proven to be the process its record names; stop it by hand`};if(platform==="win32")return{verdict:"held",detail:`${where} cannot be drained on win32; it exits once idle, then retry`};let protocol=await probeProtocolInfo(host.socket,LEGACY_PROBE_TIMEOUT_MS);if(!protocol?.capabilities.includes(GENERATION_HANDOFF_CAPABILITY))return{verdict:"held",detail:`${where} ${protocol?"cannot drain":"does not answer"}; it is never signalled - stop it by hand, then retry`};let sessions=await probeSessionCount(host.socket,LEGACY_PROBE_TIMEOUT_MS);return sessions===0?{verdict:"idle",host}:{verdict:"held",detail:busyLegacyHostDetail(pid,host.socket,sessions)}}function busyLegacyHostDetail(pid,socket,sessions){return`pid ${pid} (${socket}) holds ${describeSessions(sessions)}; run \`${APP_NAME} host stop --drain --socket ${socket}\` to let it finish that work and exit, then retry`}function describeSessions(sessions){return sessions===void 0?"an unknown number of sessions":`${sessions} open session${sessions===1?"":"s"}`}async function drainAndWait(record,probe,timeoutMs){try{process.kill(record.pid,"SIGUSR1")}catch(error){if(!(error instanceof Error&&"code"in error&&error.code==="ESRCH"))throw error}let stillRunning=()=>processMatchesPidFile(record,probe,processIsLive,{attempts:1}).catch(error=>{if(error instanceof ProcessIdentityUnreadableError)return!0;throw error}),deadline=Date.now()+timeoutMs;for(;await stillRunning();){if(Date.now()>deadline)return!1;await new Promise(resolve2=>setTimeout(resolve2,DRAIN_POLL_MS))}return!0}var EXIT_POLL_MS=100;async function drainHost(paths,options){let named=options.instanceId;if(named!==void 0&&!isGenerationId(named))return{action:"refuse",reason:"unknown_owner"};let registered=named===void 0?await readHostRegistration(paths):await readGenerationRegistration(paths,named),owner=await provenOwner(registered,options.socket);if(owner!==void 0){let generation=generationPaths(paths,owner.instanceId);if((await readDrainWatch(generation.drainWatchFile))?.pid===owner.pid)return await writeDrainRequest(generation.drainRequestFile,{sender:{pid:process.pid,kind:"stop"},reason:"operator_drain"}).catch(cause=>{if(cause.code!=="ENOENT")throw cause}),drained({...owner},options.waitMs)}if(named!==void 0&&owner===void 0)return{action:"refuse",reason:"unknown_owner"};let pid=owner?.pid??(await provenLegacyOwner(paths,options.socket))?.pid;if(pid===void 0)return{action:"refuse",reason:"unknown_owner"};let host=await probeProtocolInfo(options.socket,options.timeoutMs??1e4),answersAsTarget=named===void 0||host?.instanceId===named;return!host?.capabilities.includes(GENERATION_HANDOFF_CAPABILITY)||!answersAsTarget||process.platform==="win32"?{action:"refuse",reason:"drain_unsupported"}:(signalDrain(pid),drained(owner??{pid,processStartTime:void 0},options.waitMs))}async function drained(owner,waitMs){let base={action:"drained",pid:owner.pid,...owner.instanceId&&{instanceId:owner.instanceId}};return waitMs===void 0?base:{...base,exited:await waitForExit(owner,waitMs)}}async function waitForExit(owner,waitMs){let deadline=Date.now()+waitMs;for(;;){if(await exitedNow(owner))return!0;if(Date.now()>=deadline)return!1;await new Promise(resolve2=>setTimeout(resolve2,EXIT_POLL_MS))}}async function exitedNow(owner){if(!processIsLive(owner.pid))return!0;if(owner.processStartTime===void 0)return!1;let identity={pid:owner.pid,processStartTime:owner.processStartTime};return processMatchesPidFile(identity,readProcessStartTime).then(same=>!same,error=>{if(error instanceof ProcessIdentityUnreadableError)return!1;throw error})}function signalDrain(pid){try{process.kill(pid,"SIGUSR1")}catch(error){if(error instanceof Error&&"code"in error&&error.code==="ESRCH")return;throw error}}async function stopHost(options){let paths=createHostDaemonPaths({socket:options.socket,...options.agentDir?{agentDir:options.agentDir}:{}});if(options.drain===!0)return drainHost(paths,{socket:options.socket,...options.instanceId!==void 0&&{instanceId:options.instanceId},...options.waitMs!==void 0&&{waitMs:options.waitMs},...options.timeoutMs!==void 0&&{timeoutMs:options.timeoutMs}});let registered=await readHostRegistration(paths),owner=await provenOwner(registered,options.socket);if(!owner)return{action:"refuse",reason:"unknown_owner"};let host=await probeProtocolInfo(options.socket,options.timeoutMs??1e4),sessions=await probeSessionCount(options.socket,options.timeoutMs??1e4);return options.force!==!0&&host!==void 0&&sessions!==void 0&&sessions>0?{action:"refuse",reason:"sessions_live"}:options.requireAnswer===!0&&(host===void 0||sessions===void 0)?{action:"refuse",reason:"sessions_live"}:(await writeStopIntent(generationPaths(paths,owner.instanceId),{sender:{pid:process.pid,kind:"stop"},targetPid:owner.pid,reason:"operator_stop",signal:"SIGTERM",at:new Date().toISOString()}),signalGeneration(owner.pid,"SIGTERM")||await releaseGeneration(paths,{instanceId:owner.instanceId,pid:owner.pid}),{action:"stopped",pid:owner.pid})}function signalGeneration(pid,signal){try{return process.kill(pid,signal),!0}catch(error){if(error instanceof Error&&"code"in error&&error.code==="ESRCH")return!1;throw error}}import{lstat as lstat2,rm}from"node:fs/promises";import{dirname as dirname5,join as join6}from"node:path";import{createHash as createHash3}from"node:crypto";import{mkdir,writeFile}from"node:fs/promises";import{tmpdir}from"node:os";import{dirname as dirname3,join as join3}from"node:path";var LOCK_BUSY_WAIT_MS=100;function hostEnsureLockTarget(socket){return join3(tmpdir(),"senpi-rpc-host-locks",createSocketLockName(socket))}async function acquireHostEnsureLock(socket,waitMs){let lockTarget=hostEnsureLockTarget(socket);return await mkdir(dirname3(lockTarget),{recursive:!0}),await writeFile(lockTarget,"",{flag:"a",mode:384}),acquireOwnershipSafeLock(`${lockTarget}.lock`,hostEnsureLockOptions(waitMs))}function hostEnsureLockOptions(waitMs){return{retries:{retries:Math.ceil(waitMs/LOCK_BUSY_WAIT_MS),minTimeout:20,maxTimeout:LOCK_BUSY_WAIT_MS}}}function createSocketLockName(socket){return createHash3("sha256").update(socketLockAddress(socket),"utf8").digest("hex").slice(0,32)}function socketLockAddress(socket){return process.platform==="win32"||socket.startsWith("\0")?resolveSocketTransportAddress(socket,process.platform):canonicalEndpointPath(socket)}import{lstat,readdir as readdir2}from"node:fs/promises";import{createConnection}from"node:net";import{basename as basename2,dirname as dirname4,join as join4}from"node:path";var SOCKET_PROBE_TIMEOUT_MS=2e3;async function endpointInUse(paths,socket){if(await anyGenerationLive(paths))return{inUse:"live_generation"};for(let claim of await readSessionPathClaims(paths.reservationsDir))if(await claimOwnerIsLive(claim.owner))return{inUse:"live_claim"};let silence=await socketSilence(socket);if(silence===void 0)return{inUse:"reachable"};let successors=(await socketSiblings(socket)).filter(name=>name.startsWith(`${basename2(socket)}.next-`));for(let successor of successors)if(await socketSilence(join4(dirname4(socket),successor))===void 0)return{inUse:"reachable"};return{inUse:void 0,silence}}async function socketSiblings(socket){let name=basename2(socket);return(await readdir2(dirname4(socket)).catch(()=>[])).filter(entry=>entry.startsWith(`${name}.next-`)||entry.startsWith(`${name}.shield-`))}async function anyGenerationLive(paths){for(let instanceId of await readdir2(paths.generationsDir).catch(()=>[])){if(await hostChildAlive(generationPaths(paths,instanceId)))return!0;let record=generationRecord(await readFileOrUndefined(generationPaths(paths,instanceId).pidFile));if(record!==void 0&&await recordIsLive(record))return!0}return!1}function generationRecord(text){if(text===void 0)return;let record=parseDaemonPidFile(text);if(record!==void 0)return record;let pid=parseJson(text)?.pid;return typeof pid=="number"&&Number.isInteger(pid)&&pid>0?{pid,processStartTime:null}:void 0}async function recordIsLive(record){try{return await processMatchesPidFile(record)}catch(error){if(error instanceof ProcessIdentityUnreadableError)return!0;throw error}}async function socketSilence(socket){let secret;return process.platform==="win32"&&(secret=await readSocketSecret(socketSecretPath(socket)).catch(()=>{}),secret===void 0)?"socket_absent":new Promise(resolveProbe=>{let connection=createConnection(resolveSocketTransportAddress(socket,process.platform,secret)),finish=value=>{clearTimeout(timeout),connection.destroy(),resolveProbe(value)},timeout=setTimeout(()=>finish(void 0),SOCKET_PROBE_TIMEOUT_MS);connection.once("connect",()=>finish(void 0)),connection.once("error",error=>{error.code==="ECONNREFUSED"?refusedBySocket(socket).then(finish):error.code==="ENOENT"?finish("socket_absent"):finish(void 0)})})}async function refusedBySocket(socket){if(process.platform==="win32"||socket.startsWith("\0"))return"socket_refused";try{return(await lstat(socket)).isSocket()?"socket_refused":void 0}catch(error){return error instanceof Error&&"code"in error&&error.code==="ENOENT"?"socket_absent":void 0}}import{execFile}from"node:child_process";import{readdir as readdir3,readFile as readFile2,readlink,realpath as realpath2}from"node:fs/promises";import{join as join5}from"node:path";var LSOF_TIMEOUT_MS=2e3,LINUX_ACCEPTCON_FLAG=65536;async function countPublicClients(supervisorPid,socket){let names=new Set([socket,await realpath2(socket).catch(()=>socket)]),descriptors=process.platform==="darwin"?await darwinDescriptors(supervisorPid,names):process.platform==="linux"?await linuxDescriptors(supervisorPid,names):void 0;if(!(descriptors===void 0||descriptors.listeners===0))return descriptors.total-descriptors.listeners}function darwinDescriptors(pid,names){return new Promise(resolve2=>{execFile("lsof",["-a","-p",String(pid),"-U","-w","-F","n"],{timeout:LSOF_TIMEOUT_MS},(error,stdout)=>{if(error)return resolve2(void 0);let total=stdout.split(`
6
- `).filter(line=>line.startsWith("n")&&names.has(line.slice(1))).length;resolve2({total,listeners:total>0?1:0})})})}async function linuxDescriptors(pid,names){try{let inodes=new Set;for(let fd of await readdir3(join5("/proc",String(pid),"fd"))){let target=await readlink(join5("/proc",String(pid),"fd",fd)).catch(()=>""),inode=/^socket:\[(\d+)\]$/.exec(target)?.[1];inode!==void 0&&inodes.add(inode)}let total=0,listeners=0;for(let line of(await readFile2("/proc/net/unix","utf8")).split(`
7
- `).slice(1)){let fields=line.trim().split(/\s+/),[flags,inode,path]=[fields[3],fields[6],fields[7]];inode===void 0||path===void 0||!inodes.has(inode)||!names.has(path)||(total+=1,(Number.parseInt(flags??"0",16)&LINUX_ACCEPTCON_FLAG)!==0&&(listeners+=1))}return{total,listeners}}catch{return}}var STALE_ENGINE_GRACE_MS=10*6e4,PROBE_TIMEOUT_MS=2e3;async function judgeStaleEngine(socket,agentDir,client,options={}){let paths=createHostDaemonPaths({socket,agentDir}),owner=await provenOwner(await readHostRegistration(paths),socket);if(owner===void 0)return keep("stale_unproven_owner");let clients=await countPublicClients(owner.pid,socket),info=await observeProtocolInfo(socket,PROBE_TIMEOUT_MS);if(info===void 0)return keep("stale_unreachable");let hostOrdinal=info.engineOrdinal,hostIdentity=hostOrdinal===void 0?void 0:{text:info.engineVersion??"",ordinal:hostOrdinal,scheme:hostOrdinal[4]>0?"epoch":"nodef"};if(hostIdentity===void 0||compareEngineOrdinal(hostIdentity,client)!==-1)return keep("stale_not_older");let policy=resolveHostPolicy(parseJson(await readFileOrUndefined(paths.settingsFile)),{});if(policy.coldStart==="persistent")return keep("stale_persistent");if(await observedSessionCount(socket)!==0)return keep("stale_sessions");if((await readSessionPathClaims(paths.reservationsDir)).length>0)return keep("stale_claims");let startedAt=processStartTimeMs(owner.processStartTime),now=(options.now??Date.now)();return startedAt===void 0||now-startedAt<policy.idleExitMs+(options.graceMs??STALE_ENGINE_GRACE_MS)?keep("stale_young"):clients!==0?keep("stale_clients"):{stale:!0,pid:owner.pid}}function keep(reason){return{stale:!1,reason}}async function observedSessionCount(socket){let reply=await requestOnSocket(socket,{type:"list_sessions",include_workers:!0,[OBSERVE_REQUEST_FIELD]:!0},PROBE_TIMEOUT_MS);if(typeof reply!="object"||reply===null)return;let sessions=Reflect.get(reply,"sessions");return Array.isArray(sessions)?sessions.length:void 0}var GC_LOCK_WAIT_MS=2e3;async function gcHostEndpoints(agentDir,options={}){let removed=[],stopped=[],kept=[],wanted=kind=>options.kinds===void 0||options.kinds.includes(kind),legacy=wanted("rpc_host")?await legacyFlatDirectory(agentDir):void 0;legacy!==void 0&&kept.push({socket:null,dir:legacy,reason:"legacy_layout"});for(let endpoint of await listHostEndpoints(agentDir)){if(!wanted(endpoint.endpoint_kind))continue;if(endpoint.socket===null){kept.push({socket:null,dir:endpoint.dir,reason:"unknown_identity"});continue}let entry={socket:endpoint.socket,dir:endpoint.dir};try{let outcome=await gcEndpoint(endpoint.socket,endpoint.dir,options);"stopped"in outcome?stopped.push({...entry,reason:"stale_old_engine",pid:outcome.pid}):outcome.removed?outcome.skipped.length===0?removed.push({...entry,reason:outcome.reason}):removed.push({...entry,reason:outcome.reason,skipped:outcome.skipped}):kept.push({...entry,reason:outcome.reason})}catch(error){kept.push({...entry,reason:"failed",error:error instanceof Error?error.message:String(error)})}}return stopped.length===0?{removed,kept}:{removed,stopped,kept}}async function gcEndpoint(socket,dir,options){let release=await acquireEnsureLock(socket);if(release===void 0)return{removed:!1,reason:"locked"};try{await options._test?.afterLockAcquired?.(socket);let evidence=await endpointInUse(hostDaemonDirectoryPaths(dir),socket);if(evidence.inUse==="live_claim"||evidence.inUse!==void 0&&options.staleEngine===void 0)return{removed:!1,reason:evidence.inUse};if(evidence.inUse!==void 0)return await stopIfStale(socket,dir,evidence.inUse,options.staleEngine??{});let skipped=await removeEndpoint(socket,dir);return{removed:!0,reason:evidence.silence,skipped}}finally{await release()}}var NOT_A_CANDIDATE=new Set(["stale_unproven_owner","stale_unreachable","stale_not_older"]),STALE_STOP_TIMEOUT_MS=2e3;async function stopIfStale(socket,dir,inUse,options){let agentDir=dirname5(dirname5(dir)),verdict=await judgeStaleEngine(socket,agentDir,options.client??engineBuildIdentity(),options);if(!verdict.stale)return{removed:!1,reason:NOT_A_CANDIDATE.has(verdict.reason)?inUse:verdict.reason};let result=await stopHost({socket,agentDir,timeoutMs:STALE_STOP_TIMEOUT_MS,requireAnswer:!0});return result.action==="refuse"?{removed:!1,reason:result.reason==="unknown_owner"?"stale_unproven_owner":"stale_sessions"}:{removed:!1,stopped:!0,pid:result.pid}}async function removeEndpoint(socket,dir){let skipped=[];for(let sibling of await socketSiblings(socket)){let path=join6(dirname5(socket),sibling),entry=await lstat2(path).catch(error=>{if(!(error instanceof Error&&"code"in error&&error.code==="ENOENT"))throw error});entry?.isDirectory()?skipped.push({path,type:"directory"}):entry!==void 0&&await rm(path,{force:!0})}return await rm(socket,{force:!0}),await rm(dir,{recursive:!0,force:!0}),skipped}async function acquireEnsureLock(socket){return acquireHostEnsureLock(socket,GC_LOCK_WAIT_MS).catch(()=>{})}async function legacyFlatDirectory(agentDir){let flatDir=join6(agentDir,"rpc-host-daemon");return parseJson(await readFileOrUndefined(join6(flatDir,"layout.json")).catch(()=>{}))?.layout===HOST_DAEMON_LAYOUT?void 0:await readFileOrUndefined(join6(flatDir,"host.pid")).catch(()=>{})!==void 0?flatDir:void 0}export{engineBuildIdentityFrom,engineBuildIdentity,compareEngineOrdinal,CUSTOM_UNSUPPORTED_CAPABILITY,EXTENSION_EVENTS_CAPABILITY,EVAL_CELLS_CAPABILITY,AUTO_TITLE_SESSIONS_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,SESSION_HELD_CAPABILITY,RESUME_SESSION_CAPABILITY,ATTENDED_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,RETAIN_ON_DISCONNECT_CAPABILITY,DETACH_CONNECTION_CAPABILITY,SESSION_CONTEXT_CAPABILITY,SESSION_KIND_CAPABILITY,SESSION_STATUS_CAPABILITY,AUTO_TITLE_PER_SESSION_CAPABILITY,WARM_CAPABILITY,DURABLE_SESSION_ID_CAPABILITY,MOVED_PATH_GUARD_CAPABILITY,PROMPT_SURFACE_CAPABILITY,BROWSER_ENGINE_CAPABILITY,RETRY_FALLBACK_PROFILE_CAPABILITY,RETRY_FALLBACK_COMMAND_CAPABILITY,PROMPT_SURFACE_CHAT_CAPABILITY,RPC_CLIENT_CAPABILITIES_ENV,parseClientCapabilities,DEFAULT_CUSTOM_EXTENSION_LABEL,buildCustomUnsupportedRequest,AUTH_KEY_VERIFY_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,RUNTIME_IDENTITY_HANDOVER_CAPABILITY,computeRuntimeBuildId,parseHostProtocolInfo,HOST_PROTOCOL_VERSION,GENERATION_HANDOFF_CAPABILITY,REQUIRED_HOST_CAPABILITIES,HostEnsureRefusedError,decideHostAction,hostInstanceId,hostGeneration,hostLaunchProfile,socketHostLaunchProfile,protocolIdentity,DEFAULT_PROBE_TIMEOUT_MS,probeHost,probeProtocolInfo,observeProtocolInfo,holdProtocolInfo,probeSocketReachable,holdSessionCount,hostEnsureLockTarget,acquireHostEnsureLock,hostEnsureLockOptions,anyGenerationLive,judgeStaleEngine,retireIdleLegacyHost,provenLegacyOwner,busyLegacyHostDetail,describeSessions,stopHost,signalGeneration,gcHostEndpoints,gcEndpoint};
@@ -1,2 +0,0 @@
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{rateLimitModelFamily,usageLimitResetMs}from"./chunk-QZBH7PDO.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{normalizeProviderError}from"./chunk-TAV6QZFM.js";import{extract429RetryAfterMs}from"./chunk-PELNNWGO.js";import{getShellConfig}from"./chunk-C5W3D56I.js";import{getOverflowPatterns}from"./chunk-FWHSGCWR.js";import{PROVIDER_NOT_CONFIGURED_PREFIX,USAGE_LIMIT_EXHAUSTION,isOAuthRefreshUnavailableError}from"./chunk-LAWS3FYQ.js";function rendezvousOrder(key,slots,hasher){return[...slots].map(slot=>({slot,score:hasher(`${key}\0${slot.name}`)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({slot})=>slot)}function applyAccountOrder(order,ranked){if(order===void 0||order.length===0)return[...ranked];let byName=new Map(ranked.map(slot=>[slot.name,slot])),front=[];for(let name of order){let slot=byName.get(name);slot!==void 0&&!front.includes(slot)&&front.push(slot)}return[...front,...ranked.filter(slot=>!front.includes(slot))]}function withoutOrderedAccount(credential,name){if(credential.order===void 0||!credential.order.includes(name))return credential;let order=credential.order.filter(entry=>entry!==name),next={...credential};return order.length===0?delete next.order:next.order=order,next}var PRE_COMMIT_EVENT_TYPES=new Set(["start","text_start","thinking_start","toolcall_start"]);function isCommittedRotationOutput(event){return!PRE_COMMIT_EVENT_TYPES.has(event.type)}function isRotationStreamStart(event){return event.type==="start"}function rotationErrorFromEvent(event){if(event.type!=="error")return;let failure=new Error(event.error.errorMessage??"provider stream error"),status=event.error.providerDiagnostic?.httpStatus;return status===void 0?failure:Object.assign(failure,{status})}var DEFAULT_SLOT_BLOCK_MS=6e4,MAX_SLOT_BLOCK_MS=2880*60*1e3;function escapeRegExp(text){return text.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ACCOUNT_USAGE_LIMIT_TEXT=new RegExp([...USAGE_LIMIT_EXHAUSTION.markers.map(escapeRegExp),String.raw`\b(?:hit|reached)\s+your\b[^.]*?\blimit\b`,String.raw`\busage\s+limit\s+reached\b`,String.raw`\b(?:Go|Free)UsageLimitError\b`,String.raw`\bblocking_limit\b`,String.raw`\brapid_refill_breaker\b`,String.raw`\bquota\s+exceeded\b`].join("|"),"i");function isAccountUsageLimitText(text){return ACCOUNT_USAGE_LIMIT_TEXT.test(text)}var COOLDOWN_BASE_MS=DEFAULT_SLOT_BLOCK_MS,COOLDOWN_CAP_MS=MAX_SLOT_BLOCK_MS,RETRY_SAME_MAX_ATTEMPTS=2;function rateLimitCooldown(failureCount,serverHintMs,policy={}){let cap=policy.capMs??COOLDOWN_CAP_MS,base=policy.baseMs??COOLDOWN_BASE_MS,backoff=Math.min(cap,base*2**Math.max(0,failureCount)),floored=serverHintMs===void 0?backoff:Math.max(backoff,serverHintMs);return{cooldownMs:Math.min(cap,floored),retryAfterWasCapped:floored>cap}}function usageLimitCooldown(resetMs,policy={}){let cap=policy.capMs??COOLDOWN_CAP_MS;return{cooldownMs:Math.min(cap,resetMs),retryAfterWasCapped:resetMs>cap}}var INVALID_KEY_TEXT=/invalid[ _-]?(?:api[ _-]?)?key|authentication[_ ]?error|invalid x-api-key|unauthorized/i,ACCOUNT_SCOPED_403_TEXT=/account|credential|token|api[ _-]?key|organization|subscription/i,RATE_LIMIT_TEXT=/rate[ _-]?limit|too many requests|resource_exhausted/i,BILLING_TEXT=/billing|credits?[ _-]?(?:required|exhausted|balance)|insufficient[ _-]?(?:funds|quota|credit)|payment[ _-]?required|quota[ _-]?exhausted/i,OVERLOAD_TEXT=/overloaded/i,NETWORK_TEXT=/econnreset|econnrefused|etimedout|enotfound|socket hang up|fetch failed|network error|request timed out/i,WEBSOCKET_REQUEST_FAULT_TEXT=/websocket closed 100[89]\b/i,WEBSOCKET_TRANSPORT_FAULT_TEXT=/websocket (?:closed|error|connect timeout|liveness timeout)/i,FAIL_FAST_TEXT=/context[ _-]?(?:length|window)|maximum context|invalid[ _-]?model|model[ _-]?not[ _-]?found|malformed[ _-]?stream|premature[ _-]?(?:close|stream)/i,ABORT_TEXT=/\baborted?\b/i;function isAbort(error,message){return error instanceof Error&&error.name==="AbortError"?!0:ABORT_TEXT.test(message)}function isOverflowText(text){return getOverflowPatterns().some(pattern=>pattern.test(text))}function classifyCredentialFailure(error,context={}){if(isOAuthRefreshUnavailableError(error))return{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS};let normalized=normalizeProviderError(error),text=normalized.messageCarriesBody?normalized.message:`${normalized.message} ${normalized.body??""}`,status=normalized.status,failureCount=context.failureCount??0;if(isAbort(error,text))return{kind:"fail_request"};if(text.includes(PROVIDER_NOT_CONFIGURED_PREFIX))return{kind:"failover",block:{reason:"auth_error"}};if(status===401||INVALID_KEY_TEXT.test(text))return{kind:"failover",block:{reason:"auth_error"}};if(status===403)return ACCOUNT_SCOPED_403_TEXT.test(text)?{kind:"failover",block:{reason:"auth_error"}}:{kind:"fail_request"};if(status===402||BILLING_TEXT.test(text))return{kind:"failover",block:{reason:"account_disabled"}};let usageLimit=isAccountUsageLimitText(text)&&!isOverflowText(text);if(status===429||RATE_LIMIT_TEXT.test(text)||usageLimit){let nowMs=context.nowMs??Date.now(),hint=extract429RetryAfterMs({status:status??429,bodyText:text},nowMs)??(usageLimit?normalized.retryAfterMs??usageLimitResetMs(text,nowMs):void 0),modelFamily=rateLimitModelFamily(text),policy={baseMs:context.cooldownBaseMs,capMs:context.cooldownCapMs};return{kind:"failover",block:{reason:"rate_limit",...usageLimit&&hint!==void 0&&hint>0?usageLimitCooldown(hint,policy):rateLimitCooldown(failureCount,hint,policy),...modelFamily===void 0?{}:{modelFamily}}}}return isOverflowText(text)||status===400||status===404||FAIL_FAST_TEXT.test(text)?{kind:"fail_request"}:WEBSOCKET_REQUEST_FAULT_TEXT.test(text)?{kind:"fail_request"}:WEBSOCKET_TRANSPORT_FAULT_TEXT.test(text)?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:status===529||OVERLOAD_TEXT.test(text)||status!==void 0&&status>=500&&status<600?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:status===408||NETWORK_TEXT.test(text)?{kind:"retry_same",maxAttempts:RETRY_SAME_MAX_ATTEMPTS}:{kind:"fail_request"}}var CredentialFailoverError=class extends Error{constructor(action,original,options={}){let detail=original instanceof Error?original.message:String(original);super(detail,{cause:original}),this.name="CredentialFailoverError",this.action=action,this.original=original,this.retryAt=options.retryAt}};function isAvailable(slot,now){return!(slot.blockReason==="account_disabled"||slot.blockedUntil!==void 0&&slot.blockedUntil>now)}function coolingProbe(slots,attempted){if(attempted.size>0)return[];let soonest=slots.filter(slot=>slot.blockReason==="rate_limit"&&slot.blockedUntil!==void 0).reduce((best,slot)=>best===void 0||(slot.blockedUntil??0)<(best.blockedUntil??0)?slot:best,void 0);return soonest===void 0?[]:[soonest]}function soonestRetryAt(slots,now){let deadlines=slots.map(slot=>slot.blockedUntil).filter(value=>value!==void 0&&value>now);return deadlines.length===0?void 0:Math.min(...deadlines)}async function settle(stream){let iterator=stream[Symbol.asyncIterator]();try{await iterator.return?.(void 0)}catch{}}async function*runCredentialFailover(options){let now=options.now??Date.now,classify=options.classify??classifyCredentialFailure,attempted=new Set,retriesBySlot=new Map,lastError,lastOriginal,lastTerminalEvent,startAnnounced=!1;for(;;){let slots=await options.listSlots(),available=slots.filter(slot2=>!attempted.has(slot2.name)&&isAvailable(slot2,now())),candidates=available.length>0?available:coolingProbe(slots,attempted);if(candidates.length===0){if(lastTerminalEvent!==void 0){yield lastTerminalEvent;return}let retryAt=soonestRetryAt(slots,now());throw lastError!==void 0&&lastOriginal!==void 0?new CredentialFailoverError(lastError.action,lastOriginal,retryAt===void 0?{}:{retryAt}):new CredentialFailoverError({kind:"fail_request"},new Error("No credential slots available"),retryAt===void 0?{}:{retryAt})}let slot=options.select(candidates),committedOutput=!1,terminalEvent,attemptStream;try{attemptStream=await options.runAttempt(slot);for await(let event of attemptStream){let failure=options.errorFromEvent?.(event);if(failure!==void 0)throw terminalEvent=event,failure;if(options.isStreamStart?.(event)){if(startAnnounced)continue;startAnnounced=!0}committedOutput||=options.isCommittedOutput(event),yield event}await options.onSuccess?.(slot);return}catch(error){attemptStream&&await settle(attemptStream);let failureCount=(slot.failureCount??0)+(retriesBySlot.get(slot.name)??0),action=classify(error,{failureCount});if(lastOriginal=error,lastTerminalEvent=terminalEvent,action.kind==="retry_same"&&!committedOutput){let used=(retriesBySlot.get(slot.name)??0)+1;if(retriesBySlot.set(slot.name,used),used<action.maxAttempts)continue;if(terminalEvent!==void 0){yield terminalEvent;return}throw new CredentialFailoverError(action,error)}if(action.kind!=="failover"){if(terminalEvent!==void 0){yield terminalEvent;return}throw new CredentialFailoverError(action,error)}await options.persistBlock(slot,action.block),attempted.add(slot.name);let failure=new CredentialFailoverError(action,error);if(lastError=failure,await options.onRotate?.({slot,block:action.block,attempt:attempted.size,committedOutput}),committedOutput){if(terminalEvent!==void 0){yield terminalEvent;return}throw failure}}}}function sleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(new Error("Aborted"));return}let timeout=setTimeout(resolve,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject(new Error("Aborted"))})})}import{spawn}from"child_process";var COMMAND_EXECUTION_MAX_ATTEMPTS=3,COMMAND_EXECUTION_BACKOFF_MS=[250,1e3],COMMAND_TIMEOUT_MS=1e4,COMMAND_MAX_OUTPUT_BYTES=1024*1024;function runCommandProcess(file,args,options){return new Promise(resolveOutcome=>{let spawnOptions={shell:options.shell,windowsHide:!0,...options.env===void 0?{}:{env:{...process.env,...options.env}}},child=options.stdin===void 0?spawn(file,[...args],{...spawnOptions,stdio:["ignore","pipe","ignore"]}):spawn(file,[...args],{...spawnOptions,stdio:["pipe","pipe","ignore"]}),stdout="",settled=!1,finish=outcome=>{settled||(settled=!0,clearTimeout(timer),resolveOutcome(outcome))},timer=setTimeout(()=>{signalSpawnedChild(child,"SIGTERM"),child.unref(),finish({executed:!0,value:void 0})},COMMAND_TIMEOUT_MS);child.stdout.setEncoding("utf-8"),child.stdout.on("data",chunk=>{stdout+=chunk,!(stdout.length<=COMMAND_MAX_OUTPUT_BYTES)&&(signalSpawnedChild(child,"SIGTERM"),finish({executed:!0,value:void 0}))}),child.on("error",error=>finish({executed:error.code!=="ENOENT",value:void 0})),child.on("close",code=>{let value=stdout.trim();finish({executed:!0,value:code===0&&value?value:void 0})}),child.stdin?.end(options.stdin)})}async function executeWithConfiguredShell(command,env){try{let{shell,args,commandTransport}=getShellConfig(),commandFromStdin=commandTransport==="stdin";return await runCommandProcess(shell,commandFromStdin?args:[...args,command],{shell:!1,...commandFromStdin?{stdin:command}:{},...env===void 0?{}:{env}})}catch{return{executed:!1,value:void 0}}}async function executeCommandOnce(command,env){if(process.platform==="win32"){let configured=await executeWithConfiguredShell(command,env);if(configured.executed)return configured.value}return(await runCommandProcess(command,[],{shell:!0,...env===void 0?{}:{env}})).value}async function runConfigCommand(commandConfig,env){let command=commandConfig.slice(1);for(let attempt=0;attempt<COMMAND_EXECUTION_MAX_ATTEMPTS;attempt++){let value=await executeCommandOnce(command,env);if(value!==void 0)return value;let backoffMs=COMMAND_EXECUTION_BACKOFF_MS[attempt];backoffMs!==void 0&&await sleep(backoffMs)}}var commandResultCache=new Map,ENV_VAR_NAME_RE=/^[A-Za-z_][A-Za-z0-9_]*$/,ENV_VAR_NAME_PREFIX_RE=/^[A-Za-z_][A-Za-z0-9_]*/;function appendLiteral(parts,value){if(!value)return;let previousPart=parts[parts.length-1];if(previousPart?.type==="literal"){previousPart.value+=value;return}parts.push({type:"literal",value})}function parseConfigValueTemplate(config){let parts=[],index=0;for(;index<config.length;){let dollarIndex=config.indexOf("$",index);if(dollarIndex<0){appendLiteral(parts,config.slice(index));break}appendLiteral(parts,config.slice(index,dollarIndex));let nextChar=config[dollarIndex+1];if(nextChar==="$"||nextChar==="!"){appendLiteral(parts,nextChar),index=dollarIndex+2;continue}if(nextChar==="{"){let endIndex=config.indexOf("}",dollarIndex+2);if(endIndex<0){appendLiteral(parts,"$"),index=dollarIndex+1;continue}let name=config.slice(dollarIndex+2,endIndex);ENV_VAR_NAME_RE.test(name)?parts.push({type:"env",name}):appendLiteral(parts,config.slice(dollarIndex,endIndex+1)),index=endIndex+1;continue}let match=config.slice(dollarIndex+1).match(ENV_VAR_NAME_PREFIX_RE);if(match){parts.push({type:"env",name:match[0]}),index=dollarIndex+1+match[0].length;continue}appendLiteral(parts,"$"),index=dollarIndex+1}return parts}function parseConfigValueReference(config){return config.startsWith("!")?{type:"command",config}:{type:"template",parts:parseConfigValueTemplate(config)}}function resolveEnvConfigValue(name,env){return env?.[name]||process.env[name]||void 0}function getTemplateEnvVarNames(parts){let names=[];for(let part of parts)part.type!=="env"||names.includes(part.name)||names.push(part.name);return names}function resolveTemplate(parts,env){let resolved="";for(let part of parts){if(part.type==="literal"){resolved+=part.value;continue}let envValue=resolveEnvConfigValue(part.name,env);if(envValue===void 0)return;resolved+=envValue}return resolved}function getConfigValueEnvVarNames(config){let reference=parseConfigValueReference(config);return reference.type==="template"?getTemplateEnvVarNames(reference.parts):[]}function getMissingConfigValueEnvVarNames(config,env){return getConfigValueEnvVarNames(config).filter(name=>resolveEnvConfigValue(name,env)===void 0)}function isCommandConfigValue(config){return parseConfigValueReference(config).type==="command"}function isConfigValueConfigured(config,env){return getMissingConfigValueEnvVarNames(config,env).length===0}function resolveConfigValue(config,env){let reference=parseConfigValueReference(config);return reference.type==="command"?env===void 0?executeCommand(reference.config):runConfigCommand(reference.config,env):Promise.resolve(resolveTemplate(reference.parts,env))}function executeCommand(commandConfig){let cached=commandResultCache.get(commandConfig);if(cached)return cached;let result=runConfigCommand(commandConfig);return commandResultCache.set(commandConfig,result),result}function resolveConfigValueUncached(config,env){let reference=parseConfigValueReference(config);return reference.type==="command"?runConfigCommand(reference.config,env):Promise.resolve(resolveTemplate(reference.parts,env))}async function resolveConfigValueOrThrow(config,description,env){let resolvedValue=await resolveConfigValueUncached(config,env);if(resolvedValue!==void 0)return resolvedValue;let reference=parseConfigValueReference(config);if(reference.type==="command")throw new Error(`Failed to resolve ${description} from shell command: ${reference.config.slice(1)}`);if(reference.type==="template"){let missingEnvVars=getMissingConfigValueEnvVarNames(config,env);if(missingEnvVars.length===1)throw new Error(`Failed to resolve ${description} from environment variable: ${missingEnvVars[0]}`);if(missingEnvVars.length>1)throw new Error(`Failed to resolve ${description} from environment variables: ${missingEnvVars.join(", ")}`)}throw new Error(`Failed to resolve ${description}`)}async function resolveHeadersOrThrow(headers,description,env){if(!headers)return;let resolved={};for(let[key,value]of Object.entries(headers))resolved[key]=await resolveConfigValueOrThrow(value,`${description} header "${key}"`,env);return Object.keys(resolved).length>0?resolved:void 0}export{rendezvousOrder,applyAccountOrder,withoutOrderedAccount,sleep,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,isCommittedRotationOutput,isRotationStreamStart,rotationErrorFromEvent,MAX_SLOT_BLOCK_MS,classifyCredentialFailure,CredentialFailoverError,runCredentialFailover};
@@ -1,2 +0,0 @@
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{buildProviderDiagnostic,categoryForTransportCode,classifyProviderFailure}from"./chunk-AA2L2RHH.js";import{attachProviderDiagnostic}from"./chunk-45SZOLCU.js";var SSE_ERROR_ENVELOPE_MAX_BYTES=8192;function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function optionalString(value){if(value!=null)return typeof value=="string"?value:null}function anthropicProviderDiagnosticFromError(error){try{if(!(error instanceof Error))return;let status=Reflect.get(error,"status"),direct=optionalString(Reflect.get(error,"type")),body=Reflect.get(error,"error"),nested=isRecord(body)&&isRecord(body.error)?optionalString(body.error.type):void 0;if(direct===null||nested===null||direct!==void 0&&nested!==void 0&&direct!==nested)return;let code=direct??nested;return code===void 0&&status==null?void 0:classifyProviderFailure({status,code})}catch{return}}function anthropicProviderDiagnosticFromSseData(data){try{if(new TextEncoder().encode(data).length>SSE_ERROR_ENVELOPE_MAX_BYTES)return;let parsed=JSON.parse(data);if(!isRecord(parsed)||parsed.type!=="error"||!isRecord(parsed.error))return;let code=parsed.error.type;return typeof code!="string"?void 0:classifyProviderFailure({status:void 0,code})}catch{return}}function openAICompatibleProviderDiagnosticFromError(error){try{if(!(error instanceof Error))return;let status=Reflect.get(error,"status"),code=optionalString(Reflect.get(error,"code"));return code===null||code===void 0&&status==null?void 0:classifyProviderFailure({status,code})}catch{return}}var TRANSPORT_CAUSE_DEPTH=4;function transportProviderDiagnosticFromError(error){try{if(!(error instanceof Error))return;let current=error,sdkConnectionError;for(let depth=0;depth<TRANSPORT_CAUSE_DEPTH&&(isRecord(current)||current instanceof Error);depth++){let code=Reflect.get(current,"code");if(typeof code=="string"&&categoryForTransportCode(code)!==void 0)return buildProviderDiagnostic({category:"network",code,evidence:"structured_transport"});for(let name of current instanceof Error?[current.name,current.constructor.name]:[])sdkConnectionError===void 0&&categoryForTransportCode(name)!==void 0&&(sdkConnectionError=name);current=Reflect.get(current,"cause")}return sdkConnectionError===void 0?void 0:buildProviderDiagnostic({category:"network",code:sdkConnectionError,evidence:"structured_transport"})}catch{return}}function classifyWithTransport(classify,error){return classify(error)??transportProviderDiagnosticFromError(error)}async function awaitProviderTransport(request,classify){try{return await request()}catch(error){throw typeof error=="object"&&error!==null&&attachProviderDiagnostic(error,classifyWithTransport(classify,error)),error}}async function*iterateProviderTransport(source,classify){try{yield*source}catch(error){throw typeof error=="object"&&error!==null&&attachProviderDiagnostic(error,classifyWithTransport(classify,error)),error}}export{anthropicProviderDiagnosticFromError,anthropicProviderDiagnosticFromSseData,openAICompatibleProviderDiagnosticFromError,transportProviderDiagnosticFromError,awaitProviderTransport,iterateProviderTransport};
@@ -1,2 +0,0 @@
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
- var loaded;async function loadPty(){return loaded??=await import("@earendil-works/pi-pty"),loaded}var TERMINAL_BASH_TOOL="bash",TERMINAL_OUTPUT_TOOL="bash_output",TERMINAL_KILL_TOOL="kill_bash",TERMINAL_INPUT_TOOL="bash_input",TERMINAL_RESIZE_TOOL="bash_resize",TERMINAL_MONITOR_TOOL="monitor",TERMINAL_COMPANION_TOOLS=[TERMINAL_OUTPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_INPUT_TOOL,TERMINAL_RESIZE_TOOL,TERMINAL_MONITOR_TOOL],DEFAULT_COLS=120,DEFAULT_ROWS=40,DEFAULT_SCROLLBACK=1e4,DEFAULT_MAX_SESSIONS=32,MAX_SESSION_OUTPUT_CHARS=1e6,BACKGROUND_START_GRACE_MS=250,MONITOR_ENV_ID="SENPI_MONITOR_ID",MONITOR_ENV_STATE_DIR="SENPI_MONITOR_STATE_DIR",MONITOR_ENV_RESTORED="SENPI_MONITOR_RESTORED",MONITOR_ENV_DOWNTIME_MS="SENPI_MONITOR_DOWNTIME_MS",RESTORE_GRACE_MS=2e3,KILLED_SESSION_EXIT_GRACE_MS=5e3,DURABLE_MONITOR_EXPIRY_MS=10080*60*1e3,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET=200,FIRE_BUDGET_WINDOW_MS=1440*60*1e3,FIRE_BUDGET_AUTO_MUTE_SUMMARY=`auto-muted: fire budget (${DEFAULT_DURABLE_MONITOR_FIRE_BUDGET}/24h) reached; rearm to resume`,FOREGROUND_ENV_OVERRIDES={NO_COLOR:"1",TERM:"dumb",COLORTERM:"",PAGER:"cat",GIT_PAGER:"cat",GH_PAGER:"cat",GIT_EDITOR:"true",GIT_TERMINAL_PROMPT:"0"},KEY_SEQUENCES={enter:"\r",return:"\r",tab:" ",escape:"\x1B",esc:"\x1B",space:" ",backspace:"\x7F",delete:"\x1B[3~",up:"\x1B[A",down:"\x1B[B",right:"\x1B[C",left:"\x1B[D",home:"\x1B[H",end:"\x1B[F",pageup:"\x1B[5~",pagedown:"\x1B[6~","ctrl+c":"","ctrl+d":"","ctrl+z":"","ctrl+l":"\f","ctrl+u":"","ctrl+a":"","ctrl+e":"","ctrl+\\":""};function resolveKeySequence(key){let normalized=key.trim().toLowerCase();if(normalized.length===0)return null;let mapped=KEY_SEQUENCES[normalized];return mapped!==void 0?mapped:[...normalized].length===1?key:null}function encodeKeys(keys){let data="",unknown=[];for(let key of keys){let sequence=resolveKeySequence(key);sequence===null?unknown.push(key):data+=sequence}return{data,unknown}}function safeRegExp(pattern){try{return new RegExp(pattern)}catch{return null}}export{loadPty,TERMINAL_BASH_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_INPUT_TOOL,TERMINAL_RESIZE_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_COMPANION_TOOLS,DEFAULT_COLS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DEFAULT_MAX_SESSIONS,MAX_SESSION_OUTPUT_CHARS,BACKGROUND_START_GRACE_MS,MONITOR_ENV_ID,MONITOR_ENV_STATE_DIR,MONITOR_ENV_RESTORED,MONITOR_ENV_DOWNTIME_MS,RESTORE_GRACE_MS,KILLED_SESSION_EXIT_GRACE_MS,DURABLE_MONITOR_EXPIRY_MS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,FIRE_BUDGET_WINDOW_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FOREGROUND_ENV_OVERRIDES,encodeKeys,safeRegExp};
@@ -1,8 +0,0 @@
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{RPC_ERROR_UNKNOWN_COMMAND,SUMMARIZATION_MAX_DURATION_CAP_MS,SUMMARIZATION_TOTAL_BUDGET_MS,clientMessageIdentity,isAbortGraceInRange}from"./chunk-MF57DS3V.js";import{DETACH_CONNECTION_CAPABILITY}from"./chunk-LM76EMEJ.js";import{socketNeedsHandshake}from"./chunk-3474DPZK.js";import{ORIGIN_HOST_INSTANCE_FIELD,originHostInstance}from"./chunk-DKBJM22C.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-KUZPBZUK.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{fuzzyFilter}from"./chunk-JKNUKBS3.js";import{readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,socketSecretPath}from"./chunk-QEQG42HL.js";var COMMAND_TOKEN=/^\/[A-Za-z][A-Za-z0-9:_-]*$/,MAX_SUGGESTIONS=3,UnknownCommandError=class extends Error{constructor(command,suggestions,reason){super(formatUnknownCommandMessage(command,suggestions,reason)),this.name="UnknownCommandError",this.command=command,this.suggestions=suggestions,this.reason=reason}};function formatUnknownCommandMessage(command,suggestions,reason){if(reason==="interactive_only")return`/${command} is an interactive command and cannot be sent as a prompt.`;let hint=suggestions.length===0?"":` Did you mean ${suggestions.map(name=>`/${name}`).join(", ")}?`;return`Unknown command /${command}.${hint}`}var UNKNOWN_COMMAND_CONFIRM_HINT='Resend with "unknownCommandAsText": true to send it as text.';function unknownCommandErrorFromWire(data){if(typeof data!="object"||data===null)return;let command=Reflect.get(data,"command"),suggestions=Reflect.get(data,"suggestions"),reason=Reflect.get(data,"reason");if(typeof command!="string"||!Array.isArray(suggestions)||reason!=="unknown"&&reason!=="interactive_only")return;let names=suggestions.filter(name=>typeof name=="string");return new UnknownCommandError(command,names,reason)}function commandShapedName(text){let token=text.trim().split(/\s/,1)[0]??"";return COMMAND_TOKEN.test(token)?token.slice(1):void 0}function findUnknownCommand(text,catalog){let command=commandShapedName(text);if(command===void 0||catalog.promptCommands.has(command))return;if(catalog.interactiveCommands.has(command))return new UnknownCommandError(command,[],"interactive_only");let known=[...new Set([...catalog.promptCommands,...catalog.interactiveCommands])],suggestions=fuzzyFilter(known,command,name=>name).slice(0,MAX_SUGGESTIONS);return new UnknownCommandError(command,suggestions,"unknown")}import{existsSync}from"node:fs";function getMissingSessionCwdIssue(sessionManager,fallbackCwd){let sessionFile=sessionManager.getSessionFile();if(!sessionFile)return;let sessionCwd=sessionManager.getCwd();if(!(!sessionCwd||existsSync(sessionCwd)))return{sessionFile,sessionCwd,fallbackCwd}}function formatMissingSessionCwdError(issue){let sessionFile=issue.sessionFile?`
3
- Session file: ${issue.sessionFile}`:"";return`Stored session working directory does not exist: ${issue.sessionCwd}${sessionFile}
4
- Current working directory: ${issue.fallbackCwd}`}function formatMissingSessionCwdPrompt(issue){return`cwd from session file does not exist
5
- ${issue.sessionCwd}
6
-
7
- continue in current cwd
8
- ${issue.fallbackCwd}`}var MissingSessionCwdError=class extends Error{constructor(issue){super(formatMissingSessionCwdError(issue)),this.name="MissingSessionCwdError",this.issue=issue}};function assertSessionCwdExists(sessionManager,fallbackCwd){let issue=getMissingSessionCwdIssue(sessionManager,fallbackCwd);if(issue)throw new MissingSessionCwdError(issue)}import{spawn}from"node:child_process";import{createConnection}from"node:net";var REQUEST_DEADLINE_MS=3e4;function requestDeadlineMs(command){return command.type!=="abort"||command.awaitIdle!==!0?REQUEST_DEADLINE_MS:command.graceMs===void 0?1e4+REQUEST_DEADLINE_MS:isAbortGraceInRange(command.graceMs)?command.graceMs+REQUEST_DEADLINE_MS:REQUEST_DEADLINE_MS}var PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4,PROMPT_AFTER_QUEUED_DEADLINE_MS=5*6e4;function promptStalledMessage(){return`prompt was received by the host but not accepted within ${PROMPT_AFTER_QUEUED_DEADLINE_MS/6e4} minutes`}function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}var RpcRequestTimeoutError=class extends Error{constructor(message){super(message),this.code="rpc_request_timeout",this.name="RpcRequestTimeoutError"}};function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new RpcRequestTimeoutError(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new RpcRequestTimeoutError(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error){return error instanceof RpcTransportGoneError||error instanceof Error&&(error.message==="Client not started"||error.message.startsWith("RPC transport is not writable.")||error.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.originHost=originHostInstance(),this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error=this.createProcessExitError(code,signal);this.exitError=error,this.rejectPendingRequests(error)}),childProcess.once("error",error=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve=>setTimeout(resolve,100)),this.process.exitCode!==null){let error=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error,error}}isCompacting(){let now=Date.now();for(let[key,startedAt]of this.compactions)now-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,signalSpawnedChild(this.process,"SIGTERM"),await new Promise(resolve=>{let timeout=setTimeout(()=>{this.process&&signalSpawnedChild(this.process,"SIGKILL"),resolve()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path){let secret=socketNeedsHandshake(path)?await readSocketSecret(socketSecretPath(path)):void 0,socket=createConnection(resolveSocketTransportAddress(path,process.platform,secret));this.socket=socket,await new Promise((resolve,reject)=>{let onConnect=()=>{cleanup(),resolve()},onError=error=>{cleanup(),this.socket=null,reject(error)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async resumeSession(){await this.send({type:"resume_session"})}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async unloadSession(options){let sessionId=options.sessionId??this.sessionId;if(!sessionId)throw new Error("unload_session needs a session");return this.getData(await this.send({...options,type:"unload_session",sessionId},!1))}async closeSession(sessionId=this.sessionId){if(sessionId){try{this.getData(await this.send({type:"close_session",sessionId},!1))}catch(error){if(!isTransportGoneError(error))throw error}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async detachConnection(){let info=this.getData(await this.send({type:"get_protocol_info"},!1));if(!Array.isArray(info.capabilities)||!info.capabilities.includes(DETACH_CONNECTION_CAPABILITY))return"unsupported";let data=this.getData(await this.send({type:"detach_connection"},!1));return{deferred:Array.isArray(data?.deferred)?data.deferred.filter(id=>typeof id=="string"):[]}}async listSessions(options){let response=await this.send({type:"list_sessions",...options},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure=response;throw(failure.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure.errorData):void 0)??new RpcCommandError(failure.error,failure.errorCode,failure.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(options){if(options===void 0){try{await this.send({type:"abort"})}catch(error){if(!isTransportGoneError(error))throw error}return}return this.getData(await this.send({...options,type:"abort"}))}async getEffectStatus(effectId,options={}){let command={type:"get_effect_status",effectId,...options.sessionPath===void 0?{}:{sessionPath:options.sessionPath}};return this.getData(await this.send(command,options.sessionPath===void 0))}async getPendingInputs(knownClientMessageIds){let command={type:"get_pending_inputs",...knownClientMessageIds===void 0?{}:{knownClientMessageIds:[...knownClientMessageIds]}};return this.getData(await this.send(command))}async abortStrict(){this.getData(await this.send({type:"abort"}))}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result,excludeFromContext){await this.send({type:"record_bash_result",command,result,excludeFromContext})}async setLabel(entryId,label){await this.send({type:"set_label",entryId,label})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async setRetryFallback(retryFallback){await this.send({type:"set_retry_fallback",retryFallback})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path){await this.send({type:"cleanup_bash_output",path})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async resolvePath(path){let response=await this.send({type:"resolve_path",path});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since,page){let response=await this.send({type:"get_entries",since,...page});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text,options={}){let response=await this.send({type:"edit_user_message",entryId,text,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async listEvalCells(){return this.getData(await this.send({type:"eval_cells.list"}))}async peekEvalCell(cellId,tailBytes){return this.getData(await this.send({type:"eval_cells.peek",cellId,...tailBytes===void 0?{}:{tailBytes}}))}async stopEvalCell(cellId){return this.getData(await this.send({type:"eval_cells.stop",cellId}))}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async orderProviderAccounts(provider,names){await this.send({type:"account_order",provider,names})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve())})})}collectEvents(timeout=6e4){return new Promise((resolve,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error){this.rejectPendingRequests(error),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error))}rejectPendingRequests(error){for(let pending of this.pendingRequests.values())pending.onReject?.(error),pending.reject(error);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream=this.socket??childProcess?.stdin;if(!stream)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error,error}if(stream.destroyed||!stream.writable){let error=new RpcTransportGoneError;throw this.notifyDisconnect(error),error}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{},...this.socket&&this.originHost?{[ORIGIN_HOST_INSTANCE_FIELD]:this.originHost}:{}};if(!expectResponse)return stream.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,promptReceived=!1,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:requestDeadlineMs(command),timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new RpcRequestTimeoutError(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve(response)},reject:error=>{deadline.clear(),clearTimeout(promptCap),reject(error)},...command.type==="prompt"?{onCompaction:compacting=>compacting?deadline.extend(PROMPT_COMPACTION_DEADLINE_MS,timeoutMessage):promptReceived?deadline.extend(PROMPT_AFTER_QUEUED_DEADLINE_MS,promptStalledMessage):deadline.extend(REQUEST_DEADLINE_MS,timeoutMessage),onQueued:()=>{promptReceived=!0,this.isCompacting()||deadline.extend(PROMPT_AFTER_QUEUED_DEADLINE_MS,promptStalledMessage)}}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream.write(serializeJsonLine(fullCommand))}catch(error){let writeError=error instanceof Error?error:new Error(String(error)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};export{UnknownCommandError,UNKNOWN_COMMAND_CONFIRM_HINT,commandShapedName,findUnknownCommand,getMissingSessionCwdIssue,formatMissingSessionCwdPrompt,MissingSessionCwdError,assertSessionCwdExists,RpcRequestTimeoutError,RpcCommandError,RpcTransportGoneError,isTransportGoneError,RpcClientOpenInFlightError,RpcClient};
@@ -1,3 +0,0 @@
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{normalizeProviderError}from"./chunk-TAV6QZFM.js";import{formatProviderRequestId}from"./chunk-LAWS3FYQ.js";import{appendAssistantMessageDiagnostic}from"./chunk-DMI55M2N.js";var GITHUB_COPILOT_TOOL_LIMIT=128,GITHUB_COPILOT_TOOL_LIMIT_DIAGNOSTIC="github_copilot_tool_limit";function isRecord(value){return typeof value=="object"&&value!==null}function selectedToolName(toolChoice){if(isRecord(toolChoice)){if(toolChoice.type==="function")return isRecord(toolChoice.function)&&typeof toolChoice.function.name=="string"?toolChoice.function.name:typeof toolChoice.name=="string"?toolChoice.name:void 0;if(!(toolChoice.type!=="custom"&&toolChoice.type!=="tool"))return typeof toolChoice.name=="string"?toolChoice.name:void 0}}function toolName(tool){if(isRecord(tool))return tool.type==="function"&&isRecord(tool.function)&&typeof tool.function.name=="string"?tool.function.name:typeof tool.name=="string"?tool.name:void 0}function limitGitHubCopilotTools(provider,tools,toolChoice){if(provider!=="github-copilot"||tools===void 0||tools.length<=GITHUB_COPILOT_TOOL_LIMIT)return{tools,omittedCount:0};let forcedName=selectedToolName(toolChoice),forcedIndex=forcedName===void 0?-1:tools.findIndex(tool=>toolName(tool)===forcedName);if(forcedIndex>=GITHUB_COPILOT_TOOL_LIMIT){let forcedTool=tools[forcedIndex];if(forcedTool!==void 0)return{tools:[...tools.slice(0,GITHUB_COPILOT_TOOL_LIMIT-1),forcedTool],omittedCount:tools.length-GITHUB_COPILOT_TOOL_LIMIT}}return{tools:tools.slice(0,GITHUB_COPILOT_TOOL_LIMIT),omittedCount:tools.length-GITHUB_COPILOT_TOOL_LIMIT}}function recordGitHubCopilotToolLimit(message,omittedCount){omittedCount===0||message.diagnostics?.some(diagnostic=>diagnostic.type===GITHUB_COPILOT_TOOL_LIMIT_DIAGNOSTIC)||appendAssistantMessageDiagnostic(message,{type:GITHUB_COPILOT_TOOL_LIMIT_DIAGNOSTIC,timestamp:Date.now(),details:{limit:GITHUB_COPILOT_TOOL_LIMIT,omittedCount,message:`GitHub Copilot accepts at most ${GITHUB_COPILOT_TOOL_LIMIT} tools on endpoints without tool search; senpi omitted ${omittedCount} excess tool definition${omittedCount===1?"":"s"}.`}})}function formatGitHubCopilotToolLimitError(message,errorMessage){let toolLimitApplied=message.diagnostics?.some(diagnostic=>diagnostic.type===GITHUB_COPILOT_TOOL_LIMIT_DIAGNOSTIC);return message.provider!=="github-copilot"||!toolLimitApplied||message.providerDiagnostic?.httpStatus!==400||!/400 Bad Request$/i.test(errorMessage)?errorMessage:`GitHub Copilot rejected the request after senpi limited its tool list to ${GITHUB_COPILOT_TOOL_LIMIT}. The endpoint may enforce a lower limit or count additional hosted tools. (${errorMessage})`}var QUOTA_CODES=new Set(["quota_exceeded","free_quota_exceeded","overage_limit_reached","billing_not_configured","additional_spend_limit_reached"]);function headerValue(headers,name){if(headers instanceof Headers)return headers.get(name)??void 0;if(!(typeof headers!="object"||headers===null)){for(let[key,value]of Object.entries(headers))if(key.toLowerCase()===name&&typeof value=="string")return value}}function errorCode(body){if(body!==void 0)try{let parsed=JSON.parse(body);if(typeof parsed!="object"||parsed===null)return;let nested=Reflect.get(parsed,"error"),code=Reflect.get(typeof nested=="object"&&nested!==null?nested:parsed,"code");return typeof code=="string"?code:void 0}catch{return}}function isQuotaFailure(status,body,limitKey){let code=errorCode(body);return code!==void 0&&QUOTA_CODES.has(code)||status===402?!0:status===429&&(limitKey?.includes("quota")===!0||/quota exceeded/i.test(body??""))}function describeGitHubCopilotFailure(error){if(!(error instanceof Error))return;let{status,body}=normalizeProviderError(error);if(status===void 0)return;let headers=Reflect.get(error,"headers"),requestId=headerValue(headers,"x-github-request-id"),reference=requestId===void 0?"":` ${formatProviderRequestId("GitHub",requestId)}.`;if(isQuotaFailure(status,body,headerValue(headers,"x-ratelimit-exceeded")))return`GitHub Copilot quota exceeded (HTTP ${status}): the plan's included usage or its additional-usage limit is used up, so premium models are refused until it resets or the limit is raised. Usage is shown at https://github.com/settings/copilot.${reference}`;if(status===421)return`GitHub Copilot sent this account to a different API host (HTTP 421 Misdirected Request): Business and Enterprise accounts are served from their own host, which senpi reads from the Copilot token. Run /login github-copilot so senpi stores the account's endpoint, and report it with the GitHub request id if it persists.${reference}`;if(status===403)return`GitHub Copilot refused the request (HTTP 403${body===void 0?" with an empty body":""}). Copilot checks access per model and per client; if a fresh /login github-copilot does not help, report it with the GitHub request id.${reference}`}function withGitHubCopilotFailureNote(message,provider,error){if(provider!=="github-copilot")return message;let note=describeGitHubCopilotFailure(error);return note===void 0?message:`${message}
3
- ${note}`}export{limitGitHubCopilotTools,recordGitHubCopilotToolLimit,formatGitHubCopilotToolLimitError,withGitHubCopilotFailureNote};
@@ -1,3 +0,0 @@
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{enableStartupCompileCache}from"./chunk-X23XXKMH.js";import"./chunk-JJXDWX46.js";import{installStaleExtensionContainment,main}from"./chunk-E4WOCULF.js";import"./chunk-WTFD4TII.js";import"./chunk-FC2YWHEC.js";import{configureHttpDispatcher}from"./chunk-SL7TSFR5.js";import"./chunk-25FRFTSP.js";import"./chunk-EFJKVUID.js";import"./chunk-CRY5CP3B.js";import"./chunk-MF57DS3V.js";import"./chunk-IJT3GSB2.js";import"./chunk-CEQMTVYS.js";import"./chunk-ZMS6YEAO.js";import"./chunk-RPAHOJ6F.js";import"./chunk-SR7DBNWN.js";import"./chunk-2MOGCBPT.js";import"./chunk-HMK6F3RG.js";import"./chunk-M237EDHB.js";import"./chunk-QZBH7PDO.js";import"./chunk-SOMFLLPD.js";import"./chunk-MTQQ2VQH.js";import"./chunk-5ZBDN3LB.js";import"./chunk-LM76EMEJ.js";import"./chunk-QMRJYMNH.js";import"./chunk-6IWSMXBA.js";import"./chunk-FM7NDZR5.js";import"./chunk-EPQK674G.js";import"./chunk-26UBFF6N.js";import"./chunk-IBDADH5Z.js";import"./chunk-3474DPZK.js";import"./chunk-HD67U37N.js";import"./chunk-DKBJM22C.js";import"./chunk-KUZPBZUK.js";import"./chunk-IQWPR35S.js";import"./chunk-H4QOEVS5.js";import"./chunk-KLAX467B.js";import"./chunk-HB35RBP4.js";import"./chunk-QXJVKVA2.js";import"./chunk-7X72IACK.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.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-5VRI3CME.js";import"./chunk-JKNUKBS3.js";import"./chunk-C5W3D56I.js";import"./chunk-YU4AYH4C.js";import"./chunk-FWHSGCWR.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-2VZJTDUX.js";import"./chunk-XSRM367N.js";import"./chunk-WASCMT6Y.js";import"./chunk-T36LJ6MW.js";import"./chunk-QGJLZ6BI.js";import"./chunk-WHPDEDCC.js";import"./chunk-AA2L2RHH.js";import"./chunk-HK46JMSC.js";import"./chunk-WQLMQGOW.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-LAWS3FYQ.js";import"./chunk-45SZOLCU.js";import"./chunk-DMI55M2N.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-YU2P3CAR.js";import{installEarlyInspectorVmImportRecovery}from"./chunk-55YTTFNY.js";import"./chunk-ZOFZRJSL.js";import"./chunk-2SOVDETB.js";import"./chunk-RAIZG6HA.js";import"./chunk-HRPMLI7O.js";import"./chunk-QEQG42HL.js";import{APP_NAME,scrubBrandFromEnvironment}from"./chunk-4J4ABCCL.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-QN2BHP3M.js";import"./chunk-WIAXG52U.js";import"./chunk-7ASLQ243.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));
@@ -1,2 +0,0 @@
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{GoogleGenAI,convertMessages,convertTools,getDisabledGoogleThinkingConfig,isThinkingPart,mapStopReason,resolveGoogleFunctionCallingMode,resolveGoogleThinkingLevel,retainThoughtSignature,retryGoogleRequest,supportsGoogleStrictToolSampling,toGoogleSdkThinkingLevel,toGoogleThinkingLevel,toProviderNativeContent,usesGoogleThinkingLevel}from"./chunk-6TL72TUD.js";import"./chunk-K2EVQGGT.js";import"./chunk-5AOKDC6G.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{GOOGLE_RESERVED_BODY_KEYS,applyExtraBody,buildBaseOptions}from"./chunk-MVNVDGYF.js";import"./chunk-EDOW5W5H.js";import{formatProviderError,normalizeProviderError}from"./chunk-TAV6QZFM.js";import"./chunk-PELNNWGO.js";import"./chunk-WQLMQGOW.js";import{sanitizeSurrogates}from"./chunk-WDTJ6JKE.js";import{calculateCost,clampThinkingLevel,collapseSystemMessages,getCurrentTools,getInitialSystemMessage,getSystemMessageText}from"./chunk-LAWS3FYQ.js";import"./chunk-45SZOLCU.js";import{AssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{providerHeadersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var toolCallCounter=0,stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream,normalizedContext=collapseSystemMessages(context);return(async()=>{let output={role:"assistant",content:[],api:"google-generative-ai",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:"pending",timestamp:Date.now()};try{if(options?.fetch&&options.fetch!==globalThis.fetch)throw new Error("Custom fetch is not supported by the Google Generative AI adapter");let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let client=createClient(model,apiKey,providerHeadersToRecord(options?.headers)),params=buildParams(model,normalizedContext,options),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams);let googleStream=await retryGoogleRequest(()=>client.models.generateContentStream(params),options);stream2.push({type:"start",partial:output});let currentBlock=null,groundingMetadataEmitted=!1,urlContextMetadataEmitted=!1,blocks=output.content,blockIndex=()=>blocks.length-1;for await(let chunk of googleStream){await options?.onProviderStreamEvent?.(chunk,model),output.responseId||=chunk.responseId;let candidate=chunk.candidates?.[0];if(candidate?.content?.parts)for(let part of candidate.content.parts){let handledAsKnownPart=!1;if(part.text!==void 0){handledAsKnownPart=!0;let isThinking=isThinkingPart(part);(!currentBlock||isThinking&&currentBlock.type!=="thinking"||!isThinking&&currentBlock.type!=="text")&&(currentBlock&&(currentBlock.type==="text"?stream2.push({type:"text_end",contentIndex:blocks.length-1,content:currentBlock.text,partial:output}):stream2.push({type:"thinking_end",contentIndex:blockIndex(),content:currentBlock.thinking,partial:output})),isThinking?(currentBlock={type:"thinking",thinking:"",thinkingSignature:void 0},output.content.push(currentBlock),stream2.push({type:"thinking_start",contentIndex:blockIndex(),partial:output})):(currentBlock={type:"text",text:""},output.content.push(currentBlock),stream2.push({type:"text_start",contentIndex:blockIndex(),partial:output}))),currentBlock.type==="thinking"?(currentBlock.thinking+=part.text,currentBlock.thinkingSignature=retainThoughtSignature(currentBlock.thinkingSignature,part.thoughtSignature),stream2.push({type:"thinking_delta",contentIndex:blockIndex(),delta:part.text,partial:output})):(currentBlock.text+=part.text,currentBlock.textSignature=retainThoughtSignature(currentBlock.textSignature,part.thoughtSignature),stream2.push({type:"text_delta",contentIndex:blockIndex(),delta:part.text,partial:output}))}if(part.functionCall){handledAsKnownPart=!0,currentBlock&&(currentBlock.type==="text"?stream2.push({type:"text_end",contentIndex:blockIndex(),content:currentBlock.text,partial:output}):stream2.push({type:"thinking_end",contentIndex:blockIndex(),content:currentBlock.thinking,partial:output}),currentBlock=null);let providedId=part.functionCall.id,toolCall={type:"toolCall",id:!providedId||output.content.some(b=>b.type==="toolCall"&&b.id===providedId)?`${part.functionCall.name}_${Date.now()}_${++toolCallCounter}`:providedId,name:part.functionCall.name||"",arguments:part.functionCall.args??{},...part.thoughtSignature&&{thoughtSignature:part.thoughtSignature}};output.content.push(toolCall),stream2.push({type:"toolcall_start",contentIndex:blockIndex(),partial:output}),stream2.push({type:"toolcall_delta",contentIndex:blockIndex(),delta:JSON.stringify(toolCall.arguments),partial:output}),stream2.push({type:"toolcall_end",contentIndex:blockIndex(),toolCall,partial:output})}handledAsKnownPart||output.content.push(toProviderNativeContent(part))}candidate?.groundingMetadata&&!groundingMetadataEmitted&&(output.content.push({type:"providerNative",subtype:"groundingMetadata",raw:candidate.groundingMetadata}),groundingMetadataEmitted=!0),candidate?.urlContextMetadata&&!urlContextMetadataEmitted&&(output.content.push({type:"providerNative",subtype:"urlContextMetadata",raw:candidate.urlContextMetadata}),urlContextMetadataEmitted=!0),candidate?.finishReason&&(output.rawStopReason=candidate.finishReason,output.stopReason=mapStopReason(candidate.finishReason),output.content.some(b=>b.type==="toolCall")&&output.stopReason==="stop"&&(output.stopReason="toolUse")),chunk.usageMetadata&&(output.usage={input:(chunk.usageMetadata.promptTokenCount||0)-(chunk.usageMetadata.cachedContentTokenCount||0),output:(chunk.usageMetadata.candidatesTokenCount||0)+(chunk.usageMetadata.thoughtsTokenCount||0),cacheRead:chunk.usageMetadata.cachedContentTokenCount||0,cacheWrite:0,reasoning:chunk.usageMetadata.thoughtsTokenCount||0,totalTokens:chunk.usageMetadata.totalTokenCount||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},calculateCost(model,output.usage))}if(currentBlock&&(currentBlock.type==="text"?stream2.push({type:"text_end",contentIndex:blockIndex(),content:currentBlock.text,partial:output}):stream2.push({type:"thinking_end",contentIndex:blockIndex(),content:currentBlock.thinking,partial:output})),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("Google stream ended without a finish reason");if(output.stopReason==="aborted"||output.stopReason==="error"){let errorMessage=output.rawStopReason?`Provider stopped with: ${output.rawStopReason}`:"An unknown error occurred";throw new Error(errorMessage)}stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)"index"in block&&delete block.index;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error)),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let base={...buildBaseOptions(model,context,options,apiKey),toolChoice:options?.toolChoice};if(!options?.reasoning||options.reasoning==="off")return stream(model,context,{...base,thinking:{enabled:!1}});let clampedReasoning=clampThinkingLevel(model,options.reasoning);if(clampedReasoning==="off")return stream(model,context,{...base,thinking:{enabled:!1}});let resolvedLevel=resolveGoogleThinkingLevel(model,clampedReasoning);return usesGoogleThinkingLevel(model)?stream(model,context,{...base,thinking:{enabled:!0,level:toGoogleThinkingLevel(resolvedLevel)}}):stream(model,context,{...base,thinking:{enabled:!0,budgetTokens:getGoogleBudget(model,resolvedLevel,options.thinkingBudgets)}})};function createClient(model,apiKey,optionsHeaders){let httpOptions={};model.baseUrl&&(httpOptions.baseUrl=model.baseUrl,httpOptions.apiVersion="");let headers=providerHeadersToRecord({"User-Agent":getPiUserAgent(),...model.headers,...optionsHeaders});return headers&&(httpOptions.headers=headers),new GoogleGenAI({apiKey,httpOptions:Object.keys(httpOptions).length>0?httpOptions:void 0})}function buildParams(model,context,options={}){let contents=convertMessages(model,context,{preserveThinking:options.thinking?.enabled===!0}),initialSystemMessage=getInitialSystemMessage(context.messages),currentTools=getCurrentTools(context.messages),generationConfig={};options.temperature!==void 0&&(generationConfig.temperature=options.temperature),options.maxTokens!==void 0&&(generationConfig.maxOutputTokens=options.maxTokens);let supportsStrictMode=supportsGoogleStrictToolSampling(model.id),functionCallingMode=currentTools.length>0?resolveGoogleFunctionCallingMode(currentTools,options.toolChoice,supportsStrictMode):void 0,systemInstruction=initialSystemMessage?getSystemMessageText(initialSystemMessage):"",config={...Object.keys(generationConfig).length>0&&generationConfig,...systemInstruction&&{systemInstruction:sanitizeSurrogates(systemInstruction)},...currentTools.length>0&&{tools:convertTools(currentTools,!1,supportsStrictMode)},...functionCallingMode!==void 0&&{toolConfig:{functionCallingConfig:{mode:functionCallingMode}}}};if(options.thinking?.enabled&&model.reasoning){let thinkingConfig={includeThoughts:!0};options.thinking.level!==void 0?thinkingConfig.thinkingLevel=toGoogleSdkThinkingLevel(options.thinking.level):options.thinking.budgetTokens!==void 0&&(thinkingConfig.thinkingBudget=options.thinking.budgetTokens),config.thinkingConfig=thinkingConfig}else model.reasoning&&options.thinking&&!options.thinking.enabled&&(config.thinkingConfig=getDisabledGoogleThinkingConfig(model));if(options.signal){if(options.signal.aborted)throw new Error("Request aborted");config.abortSignal=options.signal}return applyExtraBody(config,options?.extraBody,GOOGLE_RESERVED_BODY_KEYS),{model:model.id,contents,config}}function getGoogleBudget(model,level,customBudgets){return customBudgets?.[level]!==void 0?customBudgets[level]:model.id.includes("2.5-pro")?{minimal:128,low:2048,medium:8192,high:32768}[level]:model.id.includes("2.5-flash-lite")?{minimal:512,low:2048,medium:8192,high:24576}[level]:model.id.includes("2.5-flash")?{minimal:128,low:2048,medium:8192,high:24576}[level]:-1}export{stream,streamSimple};
@@ -1,2 +0,0 @@
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{buildGoogleAuthOptions,resolveVertexProjectFromEnv}from"./chunk-74YFRVGQ.js";import{GoogleGenAI,ResourceScope,convertMessages,convertTools,getDisabledGoogleThinkingConfig,isThinkingPart,mapStopReason,resolveGoogleFunctionCallingMode,resolveGoogleThinkingLevel,retainThoughtSignature,retryGoogleRequest,supportsGoogleStrictToolSampling,toGoogleSdkThinkingLevel,toGoogleThinkingLevel,toProviderNativeContent,usesGoogleThinkingLevel}from"./chunk-6TL72TUD.js";import"./chunk-K2EVQGGT.js";import"./chunk-5AOKDC6G.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{GOOGLE_RESERVED_BODY_KEYS,applyExtraBody,buildBaseOptions}from"./chunk-MVNVDGYF.js";import"./chunk-EDOW5W5H.js";import{formatProviderError,normalizeProviderError}from"./chunk-TAV6QZFM.js";import"./chunk-PELNNWGO.js";import"./chunk-WQLMQGOW.js";import{sanitizeSurrogates}from"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import{calculateCost,clampThinkingLevel,collapseSystemMessages,getCurrentTools,getInitialSystemMessage,getSystemMessageText}from"./chunk-LAWS3FYQ.js";import"./chunk-45SZOLCU.js";import{AssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{providerHeadersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var API_VERSION="v1",GCP_VERTEX_CREDENTIALS_MARKER="gcp-vertex-credentials",toolCallCounter=0,stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream,normalizedContext=collapseSystemMessages(context);return(async()=>{let output={role:"assistant",content:[],api:"google-vertex",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:"pending",timestamp:Date.now()};try{if(options?.fetch&&options.fetch!==globalThis.fetch)throw new Error("Custom fetch is not supported by the Google Vertex adapter");let apiKey=resolveApiKey(options),headers=providerHeadersToRecord(options?.headers),client=apiKey?createClientWithApiKey(model,apiKey,headers):createClient(model,resolveProject(options),resolveLocation(options),headers,options?.env),params=buildParams(model,normalizedContext,options),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams);let googleStream=await retryGoogleRequest(()=>client.models.generateContentStream(params),options);stream2.push({type:"start",partial:output});let currentBlock=null,groundingMetadataEmitted=!1,urlContextMetadataEmitted=!1,blocks=output.content,blockIndex=()=>blocks.length-1;for await(let chunk of googleStream){await options?.onProviderStreamEvent?.(chunk,model),output.responseId||=chunk.responseId;let candidate=chunk.candidates?.[0];if(candidate?.content?.parts)for(let part of candidate.content.parts){let handledAsKnownPart=!1;if(part.text!==void 0){handledAsKnownPart=!0;let isThinking=isThinkingPart(part);(!currentBlock||isThinking&&currentBlock.type!=="thinking"||!isThinking&&currentBlock.type!=="text")&&(currentBlock&&(currentBlock.type==="text"?stream2.push({type:"text_end",contentIndex:blocks.length-1,content:currentBlock.text,partial:output}):stream2.push({type:"thinking_end",contentIndex:blockIndex(),content:currentBlock.thinking,partial:output})),isThinking?(currentBlock={type:"thinking",thinking:"",thinkingSignature:void 0},output.content.push(currentBlock),stream2.push({type:"thinking_start",contentIndex:blockIndex(),partial:output})):(currentBlock={type:"text",text:""},output.content.push(currentBlock),stream2.push({type:"text_start",contentIndex:blockIndex(),partial:output}))),currentBlock.type==="thinking"?(currentBlock.thinking+=part.text,currentBlock.thinkingSignature=retainThoughtSignature(currentBlock.thinkingSignature,part.thoughtSignature),stream2.push({type:"thinking_delta",contentIndex:blockIndex(),delta:part.text,partial:output})):(currentBlock.text+=part.text,currentBlock.textSignature=retainThoughtSignature(currentBlock.textSignature,part.thoughtSignature),stream2.push({type:"text_delta",contentIndex:blockIndex(),delta:part.text,partial:output}))}if(part.functionCall){handledAsKnownPart=!0,currentBlock&&(currentBlock.type==="text"?stream2.push({type:"text_end",contentIndex:blockIndex(),content:currentBlock.text,partial:output}):stream2.push({type:"thinking_end",contentIndex:blockIndex(),content:currentBlock.thinking,partial:output}),currentBlock=null);let providedId=part.functionCall.id,toolCall={type:"toolCall",id:!providedId||output.content.some(b=>b.type==="toolCall"&&b.id===providedId)?`${part.functionCall.name}_${Date.now()}_${++toolCallCounter}`:providedId,name:part.functionCall.name||"",arguments:part.functionCall.args??{},...part.thoughtSignature&&{thoughtSignature:part.thoughtSignature}};output.content.push(toolCall),stream2.push({type:"toolcall_start",contentIndex:blockIndex(),partial:output}),stream2.push({type:"toolcall_delta",contentIndex:blockIndex(),delta:JSON.stringify(toolCall.arguments),partial:output}),stream2.push({type:"toolcall_end",contentIndex:blockIndex(),toolCall,partial:output})}handledAsKnownPart||output.content.push(toProviderNativeContent(part))}candidate?.groundingMetadata&&!groundingMetadataEmitted&&(output.content.push({type:"providerNative",subtype:"groundingMetadata",raw:candidate.groundingMetadata}),groundingMetadataEmitted=!0),candidate?.urlContextMetadata&&!urlContextMetadataEmitted&&(output.content.push({type:"providerNative",subtype:"urlContextMetadata",raw:candidate.urlContextMetadata}),urlContextMetadataEmitted=!0),candidate?.finishReason&&(output.rawStopReason=candidate.finishReason,output.stopReason=mapStopReason(candidate.finishReason),output.content.some(b=>b.type==="toolCall")&&output.stopReason==="stop"&&(output.stopReason="toolUse")),chunk.usageMetadata&&(output.usage={input:(chunk.usageMetadata.promptTokenCount||0)-(chunk.usageMetadata.cachedContentTokenCount||0),output:(chunk.usageMetadata.candidatesTokenCount||0)+(chunk.usageMetadata.thoughtsTokenCount||0),cacheRead:chunk.usageMetadata.cachedContentTokenCount||0,cacheWrite:0,reasoning:chunk.usageMetadata.thoughtsTokenCount||0,totalTokens:chunk.usageMetadata.totalTokenCount||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},calculateCost(model,output.usage))}if(currentBlock&&(currentBlock.type==="text"?stream2.push({type:"text_end",contentIndex:blockIndex(),content:currentBlock.text,partial:output}):stream2.push({type:"thinking_end",contentIndex:blockIndex(),content:currentBlock.thinking,partial:output})),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("Google Vertex stream ended without a finish reason");if(output.stopReason==="aborted"||output.stopReason==="error"){let errorMessage=output.rawStopReason?`Provider stopped with: ${output.rawStopReason}`:"An unknown error occurred";throw new Error(errorMessage)}stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)"index"in block&&delete block.index;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error)),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{let base={...buildBaseOptions(model,context,options,void 0),toolChoice:options?.toolChoice};if(!options?.reasoning||options.reasoning==="off")return stream(model,context,{...base,thinking:{enabled:!1}});let clampedReasoning=clampThinkingLevel(model,options.reasoning);if(clampedReasoning==="off")return stream(model,context,{...base,thinking:{enabled:!1}});let resolvedLevel=resolveGoogleThinkingLevel(model,clampedReasoning);return usesGoogleThinkingLevel(model)?stream(model,context,{...base,thinking:{enabled:!0,level:toGoogleThinkingLevel(resolvedLevel)}}):stream(model,context,{...base,thinking:{enabled:!0,budgetTokens:getGoogleBudget(model,resolvedLevel,options.thinkingBudgets)}})};function createClient(model,project,location,optionsHeaders,env){let googleAuthOptions=buildGoogleAuthOptions(env);return new GoogleGenAI({vertexai:!0,project,location,apiVersion:API_VERSION,...googleAuthOptions?{googleAuthOptions}:{},httpOptions:buildHttpOptions(model,optionsHeaders)})}function createClientWithApiKey(model,apiKey,optionsHeaders){return new GoogleGenAI({vertexai:!0,apiKey,apiVersion:API_VERSION,httpOptions:buildHttpOptions(model,optionsHeaders)})}function buildHttpOptions(model,optionsHeaders){let httpOptions={},baseUrl=resolveCustomBaseUrl(model.baseUrl);baseUrl&&(httpOptions.baseUrl=baseUrl,httpOptions.baseUrlResourceScope=ResourceScope.COLLECTION,baseUrlIncludesApiVersion(baseUrl)&&(httpOptions.apiVersion=""));let headers=providerHeadersToRecord({"User-Agent":getPiUserAgent(),...model.headers,...optionsHeaders});return headers&&(httpOptions.headers=headers),Object.keys(httpOptions).length>0?httpOptions:void 0}function resolveCustomBaseUrl(baseUrl){let trimmed=baseUrl.trim();if(!(!trimmed||trimmed.includes("{location}")))return trimmed}function baseUrlIncludesApiVersion(baseUrl){try{return new URL(baseUrl).pathname.split("/").some(part=>/^v\d+(?:beta\d*)?$/.test(part))}catch{return/(?:^|\/)v\d+(?:beta\d*)?(?:\/|$)/.test(baseUrl)}}function resolveApiKey(options){let apiKey=options?.apiKey?.trim();if(!(!apiKey||apiKey===GCP_VERTEX_CREDENTIALS_MARKER||isPlaceholderApiKey(apiKey)))return apiKey}function isPlaceholderApiKey(apiKey){return/^<[^>]+>$/.test(apiKey)}function resolveProject(options){let project=resolveVertexProjectFromEnv(options);if(!project)throw new Error("Vertex AI requires a project ID. Set GOOGLE_CLOUD_PROJECT/GCLOUD_PROJECT or pass project in options.");return project}function resolveLocation(options){let location=options?.location||getProviderEnvValue("GOOGLE_CLOUD_LOCATION",options?.env);if(!location)throw new Error("Vertex AI requires a location. Set GOOGLE_CLOUD_LOCATION or pass location in options.");return location}function buildParams(model,context,options={}){let contents=convertMessages(model,context,{preserveThinking:options.thinking?.enabled===!0}),initialSystemMessage=getInitialSystemMessage(context.messages),currentTools=getCurrentTools(context.messages),generationConfig={};options.temperature!==void 0&&(generationConfig.temperature=options.temperature),options.maxTokens!==void 0&&(generationConfig.maxOutputTokens=options.maxTokens);let supportsStrictMode=supportsGoogleStrictToolSampling(model.id),functionCallingMode=currentTools.length>0?resolveGoogleFunctionCallingMode(currentTools,options.toolChoice,supportsStrictMode):void 0,systemInstruction=initialSystemMessage?getSystemMessageText(initialSystemMessage):"",config={...Object.keys(generationConfig).length>0&&generationConfig,...systemInstruction&&{systemInstruction:sanitizeSurrogates(systemInstruction)},...currentTools.length>0&&{tools:convertTools(currentTools,!1,supportsStrictMode)},...functionCallingMode!==void 0&&{toolConfig:{functionCallingConfig:{mode:functionCallingMode}}}};if(options.thinking?.enabled&&model.reasoning){let thinkingConfig={includeThoughts:!0};options.thinking.level!==void 0?thinkingConfig.thinkingLevel=toGoogleSdkThinkingLevel(options.thinking.level):options.thinking.budgetTokens!==void 0&&(thinkingConfig.thinkingBudget=options.thinking.budgetTokens),config.thinkingConfig=thinkingConfig}else model.reasoning&&options.thinking&&!options.thinking.enabled&&(config.thinkingConfig=getDisabledGoogleThinkingConfig(model));if(options.signal){if(options.signal.aborted)throw new Error("Request aborted");config.abortSignal=options.signal}return applyExtraBody(config,options?.extraBody,GOOGLE_RESERVED_BODY_KEYS),{model:model.id,contents,config}}function getGoogleBudget(model,level,customBudgets){return customBudgets?.[level]!==void 0?customBudgets[level]:model.id.includes("2.5-pro")?{minimal:128,low:2048,medium:8192,high:32768}[level]:model.id.includes("2.5-flash")?{minimal:128,low:2048,medium:8192,high:24576}[level]:-1}export{stream,streamSimple};
@@ -1,2 +0,0 @@
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{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,tryPrintHelpWithoutEngine}from"./chunk-2MOGCBPT.js";import"./chunk-HMK6F3RG.js";import"./chunk-EPQK674G.js";import"./chunk-26UBFF6N.js";import"./chunk-GZVCRV7I.js";import"./chunk-U3VOXCGP.js";import"./chunk-FWHSGCWR.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-2VZJTDUX.js";import"./chunk-XSRM367N.js";import"./chunk-T36LJ6MW.js";import"./chunk-QGJLZ6BI.js";import"./chunk-WHPDEDCC.js";import"./chunk-AA2L2RHH.js";import"./chunk-HK46JMSC.js";import"./chunk-WQLMQGOW.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-LAWS3FYQ.js";import"./chunk-45SZOLCU.js";import"./chunk-DMI55M2N.js";import"./chunk-PJ34QVL5.js";import"./chunk-4J4ABCCL.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-IKOFCODM.js";export{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,tryPrintHelpWithoutEngine};
@@ -1,2 +0,0 @@
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{parseHostArgs,resolveHostSocket,runHostCommand}from"./chunk-5ZBDN3LB.js";import"./chunk-LM76EMEJ.js";import"./chunk-QMRJYMNH.js";import"./chunk-6IWSMXBA.js";import"./chunk-FM7NDZR5.js";import"./chunk-EPQK674G.js";import"./chunk-26UBFF6N.js";import"./chunk-IBDADH5Z.js";import"./chunk-3474DPZK.js";import"./chunk-HD67U37N.js";import"./chunk-DKBJM22C.js";import"./chunk-KUZPBZUK.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-FWHSGCWR.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-2VZJTDUX.js";import"./chunk-XSRM367N.js";import"./chunk-T36LJ6MW.js";import"./chunk-QGJLZ6BI.js";import"./chunk-WHPDEDCC.js";import"./chunk-AA2L2RHH.js";import"./chunk-HK46JMSC.js";import"./chunk-WQLMQGOW.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-LAWS3FYQ.js";import"./chunk-45SZOLCU.js";import"./chunk-DMI55M2N.js";import"./chunk-PJ34QVL5.js";import"./chunk-HRPMLI7O.js";import"./chunk-QEQG42HL.js";import"./chunk-4J4ABCCL.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-7ASLQ243.js";import"./chunk-IKOFCODM.js";export{parseHostArgs,resolveHostSocket,runHostCommand};