zidane 6.4.0 → 6.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/{acp-DzUgjzNa.js → acp-CH5tOdRb.js} +6 -6
  2. package/dist/{acp-DzUgjzNa.js.map → acp-CH5tOdRb.js.map} +1 -1
  3. package/dist/acp-cli.js +6 -6
  4. package/dist/acp.d.ts +1 -1
  5. package/dist/acp.js +1 -1
  6. package/dist/{agent-COHX5SpM.js → agent-CjhcxKp7.js} +22 -12
  7. package/dist/{agent-COHX5SpM.js.map → agent-CjhcxKp7.js.map} +1 -1
  8. package/dist/agent.d.ts +1 -1
  9. package/dist/agent.js +1 -1
  10. package/dist/{anthropic-Bw39RApb.js → anthropic-BAuvWmqU.js} +5 -5
  11. package/dist/{anthropic-Bw39RApb.js.map → anthropic-BAuvWmqU.js.map} +1 -1
  12. package/dist/{auth-XS60l6Q5.js → auth-C1N0jfb5.js} +5 -5
  13. package/dist/{auth-XS60l6Q5.js.map → auth-C1N0jfb5.js.map} +1 -1
  14. package/dist/chat/pure.d.ts +3 -3
  15. package/dist/chat.d.ts +4 -4
  16. package/dist/chat.js +4 -4
  17. package/dist/{context-transport-Nb9CVjLJ.js → context-transport-C5Qq5MXb.js} +3 -3
  18. package/dist/{context-transport-Nb9CVjLJ.js.map → context-transport-C5Qq5MXb.js.map} +1 -1
  19. package/dist/contexts/daytona.d.ts +1 -1
  20. package/dist/contexts/e2b.d.ts +1 -1
  21. package/dist/{errors-DJUxZg9b.js → errors-BwBxu3zD.js} +27 -2
  22. package/dist/errors-BwBxu3zD.js.map +1 -0
  23. package/dist/errors.d.ts +1 -1
  24. package/dist/errors.js +1 -1
  25. package/dist/eval.d.ts +1 -1
  26. package/dist/eval.js +1 -1
  27. package/dist/extensions.d.ts +1 -1
  28. package/dist/extensions.js +1 -1
  29. package/dist/{fetch-url-_5WKWpbQ.js → fetch-url-B7aSg6Bp.js} +2 -2
  30. package/dist/{fetch-url-_5WKWpbQ.js.map → fetch-url-B7aSg6Bp.js.map} +1 -1
  31. package/dist/headless.d.ts +1 -1
  32. package/dist/headless.js +3 -3
  33. package/dist/{index-1Dr4Yqw1.d.ts → index-LxAV7xSk.d.ts} +24 -2
  34. package/dist/index-LxAV7xSk.d.ts.map +1 -0
  35. package/dist/index.d.ts +3 -3
  36. package/dist/index.js +13 -13
  37. package/dist/{login-CPU73khP.js → login-cfxezMQT.js} +3 -3
  38. package/dist/{login-CPU73khP.js.map → login-cfxezMQT.js.map} +1 -1
  39. package/dist/{mcp-BNg6hUeX.js → mcp-BFlrDmGB.js} +4 -4
  40. package/dist/{mcp-BNg6hUeX.js.map → mcp-BFlrDmGB.js.map} +1 -1
  41. package/dist/mcp.d.ts +1 -1
  42. package/dist/mcp.js +1 -1
  43. package/dist/{messages-DIxD2UCr.js → messages-XfLqem2d.js} +2 -2
  44. package/dist/{messages-DIxD2UCr.js.map → messages-XfLqem2d.js.map} +1 -1
  45. package/dist/{oauth-CuFPhsHY.js → oauth-bkEOybqm.js} +2 -2
  46. package/dist/{oauth-CuFPhsHY.js.map → oauth-bkEOybqm.js.map} +1 -1
  47. package/dist/{openai-compat-BTbSyQbm.js → openai-compat-70-QNsmd.js} +2 -2
  48. package/dist/{openai-compat-BTbSyQbm.js.map → openai-compat-70-QNsmd.js.map} +1 -1
  49. package/dist/output/stream-json.d.ts +1 -1
  50. package/dist/output/terminal.d.ts +1 -1
  51. package/dist/presets.d.ts +1 -1
  52. package/dist/presets.js +1 -1
  53. package/dist/providers/anthropic.d.ts +1 -1
  54. package/dist/providers/anthropic.js +1 -1
  55. package/dist/providers/arcee.d.ts +1 -1
  56. package/dist/providers/arcee.js +1 -1
  57. package/dist/providers/baseten.d.ts +1 -1
  58. package/dist/providers/baseten.js +1 -1
  59. package/dist/providers/cerebras.d.ts +1 -1
  60. package/dist/providers/cerebras.js +1 -1
  61. package/dist/providers/local.d.ts +1 -1
  62. package/dist/providers/local.js +1 -1
  63. package/dist/providers/openai-compat.d.ts +1 -1
  64. package/dist/providers/openai-compat.js +1 -1
  65. package/dist/providers/openai.d.ts +1 -1
  66. package/dist/providers/openai.js +4 -4
  67. package/dist/providers/openrouter.d.ts +1 -1
  68. package/dist/providers/openrouter.js +1 -1
  69. package/dist/providers/xai.d.ts +1 -1
  70. package/dist/providers/xai.js +1 -1
  71. package/dist/{providers-BsH1MnhC.js → providers-DQFY2gl-.js} +4 -4
  72. package/dist/{providers-BsH1MnhC.js.map → providers-DQFY2gl-.js.map} +1 -1
  73. package/dist/providers.d.ts +1 -1
  74. package/dist/providers.js +5 -5
  75. package/dist/{resolve-BPTA1RpX.js → resolve-CZJxds85.js} +2 -2
  76. package/dist/{resolve-BPTA1RpX.js.map → resolve-CZJxds85.js.map} +1 -1
  77. package/dist/restate.d.ts +1 -1
  78. package/dist/session/sqlite.d.ts +1 -1
  79. package/dist/session/sqlite.js +1 -1
  80. package/dist/{session-DY2LWai4.js → session-SOpMv7kl.js} +2 -2
  81. package/dist/{session-DY2LWai4.js.map → session-SOpMv7kl.js.map} +1 -1
  82. package/dist/session.d.ts +1 -1
  83. package/dist/session.js +2 -2
  84. package/dist/{skills-C7eIjWYm.js → skills-Dd6XCi4s.js} +3 -3
  85. package/dist/{skills-C7eIjWYm.js.map → skills-Dd6XCi4s.js.map} +1 -1
  86. package/dist/skills.d.ts +1 -1
  87. package/dist/skills.js +2 -2
  88. package/dist/{stdio-DfWu1rNB.js → stdio-CnDuGcCi.js} +2 -2
  89. package/dist/{stdio-DfWu1rNB.js.map → stdio-CnDuGcCi.js.map} +1 -1
  90. package/dist/{stdio-loader-mfN5JYns.js → stdio-loader-CknZi5f-.js} +2 -2
  91. package/dist/{stdio-loader-mfN5JYns.js.map → stdio-loader-CknZi5f-.js.map} +1 -1
  92. package/dist/{timeout-8vSIRjzl.d.ts → timeout-DEaqslLO.d.ts} +25 -2
  93. package/dist/timeout-DEaqslLO.d.ts.map +1 -0
  94. package/dist/{tool-formatters-BaHq343O.d.ts → tool-formatters-Bto7FF6V.d.ts} +2 -2
  95. package/dist/{tool-formatters-BaHq343O.d.ts.map → tool-formatters-Bto7FF6V.d.ts.map} +1 -1
  96. package/dist/tools/fetch-url.d.ts +1 -1
  97. package/dist/tools/fetch-url.js +1 -1
  98. package/dist/tools/web-search.d.ts +1 -1
  99. package/dist/tools/web-search.js +2 -2
  100. package/dist/tools.d.ts +1 -1
  101. package/dist/tools.js +1 -1
  102. package/dist/{transcript-anchors-BquAWoGN.d.ts → transcript-anchors-BTu5SjfP.d.ts} +2 -2
  103. package/dist/{transcript-anchors-BquAWoGN.d.ts.map → transcript-anchors-BTu5SjfP.d.ts.map} +1 -1
  104. package/dist/{transcript-anchors-CWzlwIOr.js → transcript-anchors-BtKt8Nwx.js} +7 -7
  105. package/dist/{transcript-anchors-CWzlwIOr.js.map → transcript-anchors-BtKt8Nwx.js.map} +1 -1
  106. package/dist/tui.d.ts +3 -3
  107. package/dist/tui.js +10 -10
  108. package/dist/{turn-operations-OQlIx13T.d.ts → turn-operations-BYYMryiI.d.ts} +3 -3
  109. package/dist/{turn-operations-OQlIx13T.d.ts.map → turn-operations-BYYMryiI.d.ts.map} +1 -1
  110. package/dist/types-BIarq1qE.js.map +1 -1
  111. package/dist/types.d.ts +2 -2
  112. package/dist/types.js +1 -1
  113. package/dist/{xai-DnZfHvTz.js → xai-BapwnBgs.js} +3 -3
  114. package/dist/{xai-DnZfHvTz.js.map → xai-BapwnBgs.js.map} +1 -1
  115. package/package.json +1 -1
  116. package/dist/errors-DJUxZg9b.js.map +0 -1
  117. package/dist/index-1Dr4Yqw1.d.ts.map +0 -1
  118. package/dist/timeout-8vSIRjzl.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { $n as HeadlessResult, Jn as FormattedHeadlessTurnEvent, Qn as HeadlessOutputFormat, Wi as Agent, Xn as HeadlessEvent, qn as FormattedHeadlessResult } from "../index-1Dr4Yqw1.js";
1
+ import { $n as HeadlessResult, Jn as FormattedHeadlessTurnEvent, Qn as HeadlessOutputFormat, Wi as Agent, Xn as HeadlessEvent, qn as FormattedHeadlessResult } from "../index-LxAV7xSk.js";
2
2
 
3
3
  //#region src/output/stream-json.d.ts
4
4
  type StreamJsonOutputFormat = HeadlessOutputFormat;
@@ -1,4 +1,4 @@
1
- import { Ki as AgentHooks, Wi as Agent, t as Preset } from "../index-1Dr4Yqw1.js";
1
+ import { Ki as AgentHooks, Wi as Agent, t as Preset } from "../index-LxAV7xSk.js";
2
2
 
3
3
  //#region src/output/terminal.d.ts
4
4
  interface TerminalOutputOptions {
package/dist/presets.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { Gi as AgentHookMap, a as basicTools, i as _default, n as composePresets, r as definePreset, t as Preset } from "./index-1Dr4Yqw1.js";
1
+ import { Gi as AgentHookMap, a as basicTools, i as _default, n as composePresets, r as definePreset, t as Preset } from "./index-LxAV7xSk.js";
2
2
  export { type AgentHookMap, Preset, _default as basic, basicTools, composePresets, definePreset };
package/dist/presets.js CHANGED
@@ -1,2 +1,2 @@
1
- import { ft as composePresets, ht as basic_default, mt as basicTools, pt as definePreset } from "./agent-COHX5SpM.js";
1
+ import { ft as composePresets, ht as basic_default, mt as basicTools, pt as definePreset } from "./agent-CjhcxKp7.js";
2
2
  export { basic_default as basic, basicTools, composePresets, definePreset };
@@ -1,2 +1,2 @@
1
- import { _p as resolveAnthropicAuthShape, ap as AnthropicBedrockConfig, cp as AnthropicThinkingPlan, dp as applyAnthropicCacheBreakpoints, fp as buildAnthropicClientOptions, gp as planAnthropicThinking, hp as defaultAnthropicMaxTokens, lp as EXTENDED_CACHE_TTL_BETA, mp as credentialIdentity, op as AnthropicContextManagement, pp as classifyAnthropicError, sp as AnthropicParams, up as anthropic, vp as resolveAnthropicBetas, yp as resolveAnthropicMaxOutput } from "../index-1Dr4Yqw1.js";
1
+ import { _p as resolveAnthropicAuthShape, ap as AnthropicBedrockConfig, cp as AnthropicThinkingPlan, dp as applyAnthropicCacheBreakpoints, fp as buildAnthropicClientOptions, gp as planAnthropicThinking, hp as defaultAnthropicMaxTokens, lp as EXTENDED_CACHE_TTL_BETA, mp as credentialIdentity, op as AnthropicContextManagement, pp as classifyAnthropicError, sp as AnthropicParams, up as anthropic, vp as resolveAnthropicBetas, yp as resolveAnthropicMaxOutput } from "../index-LxAV7xSk.js";
2
2
  export { AnthropicBedrockConfig, AnthropicContextManagement, AnthropicParams, AnthropicThinkingPlan, EXTENDED_CACHE_TTL_BETA, anthropic, applyAnthropicCacheBreakpoints, buildAnthropicClientOptions, classifyAnthropicError, credentialIdentity, defaultAnthropicMaxTokens, planAnthropicThinking, resolveAnthropicAuthShape, resolveAnthropicBetas, resolveAnthropicMaxOutput };
@@ -1,2 +1,2 @@
1
- import { a as classifyAnthropicError, c as planAnthropicThinking, d as resolveAnthropicMaxOutput, i as buildAnthropicClientOptions, l as resolveAnthropicAuthShape, n as anthropic, o as credentialIdentity, r as applyAnthropicCacheBreakpoints, s as defaultAnthropicMaxTokens, t as EXTENDED_CACHE_TTL_BETA, u as resolveAnthropicBetas } from "../anthropic-Bw39RApb.js";
1
+ import { a as classifyAnthropicError, c as planAnthropicThinking, d as resolveAnthropicMaxOutput, i as buildAnthropicClientOptions, l as resolveAnthropicAuthShape, n as anthropic, o as credentialIdentity, r as applyAnthropicCacheBreakpoints, s as defaultAnthropicMaxTokens, t as EXTENDED_CACHE_TTL_BETA, u as resolveAnthropicBetas } from "../anthropic-BAuvWmqU.js";
2
2
  export { EXTENDED_CACHE_TTL_BETA, anthropic, applyAnthropicCacheBreakpoints, buildAnthropicClientOptions, classifyAnthropicError, credentialIdentity, defaultAnthropicMaxTokens, planAnthropicThinking, resolveAnthropicAuthShape, resolveAnthropicBetas, resolveAnthropicMaxOutput };
@@ -1,2 +1,2 @@
1
- import { ip as arcee, rp as ArceeParams } from "../index-1Dr4Yqw1.js";
1
+ import { ip as arcee, rp as ArceeParams } from "../index-LxAV7xSk.js";
2
2
  export { ArceeParams, arcee };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-BTbSyQbm.js";
1
+ import { m as openaiCompat } from "../openai-compat-70-QNsmd.js";
2
2
  //#region src/providers/arcee.ts
3
3
  const BASE_URL = "https://api.arcee.ai/api/v1";
4
4
  function getApiKey(params) {
@@ -1,2 +1,2 @@
1
- import { ep as BasetenParams, np as planBasetenReasoning, tp as baseten } from "../index-1Dr4Yqw1.js";
1
+ import { ep as BasetenParams, np as planBasetenReasoning, tp as baseten } from "../index-LxAV7xSk.js";
2
2
  export { BasetenParams, baseten, planBasetenReasoning };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-BTbSyQbm.js";
1
+ import { m as openaiCompat } from "../openai-compat-70-QNsmd.js";
2
2
  //#region src/providers/baseten.ts
3
3
  const BASE_URL = "https://inference.baseten.co/v1";
4
4
  /**
@@ -1,2 +1,2 @@
1
- import { $f as cerebras, Qf as CerebrasParams } from "../index-1Dr4Yqw1.js";
1
+ import { $f as cerebras, Qf as CerebrasParams } from "../index-LxAV7xSk.js";
2
2
  export { CerebrasParams, cerebras };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-BTbSyQbm.js";
1
+ import { m as openaiCompat } from "../openai-compat-70-QNsmd.js";
2
2
  //#region src/providers/cerebras.ts
3
3
  const BASE_URL = "https://api.cerebras.ai/v1";
4
4
  function getApiKey(params) {
@@ -1,2 +1,2 @@
1
- import { Jf as LocalParams, Yf as local } from "../index-1Dr4Yqw1.js";
1
+ import { Jf as LocalParams, Yf as local } from "../index-LxAV7xSk.js";
2
2
  export { LocalParams, local };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-BTbSyQbm.js";
1
+ import { m as openaiCompat } from "../openai-compat-70-QNsmd.js";
2
2
  //#region src/providers/local.ts
3
3
  function getBaseURL(params) {
4
4
  if (typeof params?.baseURL === "string" && params.baseURL.length > 0) return params.baseURL;
@@ -1,2 +1,2 @@
1
- import { Af as applyOAICacheBreakpoints, Bf as toOAIMessages, Cf as OAIMessage, Df as OpenAICompatParams, Ef as OpenAICompatHttpError, Ff as consumeSSE, Hf as userMessage, If as formatTools, Lf as mapOAIFinishReason, Mf as assistantMessage, Nf as buildAssistantContent, Of as OpenAICompatStreamError, Pf as classifyOpenAICompatError, Rf as openAICompatPromptMessage, Sf as ASSISTANT_TOOL_CALLS_TAG, Tf as OpenAICompatAuthHeader, Vf as toolResultsMessage, jf as applyOAIToolCacheBreakpoint, kf as TOOL_RESULTS_TAG, wf as OAITool, zf as openaiCompat } from "../index-1Dr4Yqw1.js";
1
+ import { Af as applyOAICacheBreakpoints, Bf as toOAIMessages, Cf as OAIMessage, Df as OpenAICompatParams, Ef as OpenAICompatHttpError, Ff as consumeSSE, Hf as userMessage, If as formatTools, Lf as mapOAIFinishReason, Mf as assistantMessage, Nf as buildAssistantContent, Of as OpenAICompatStreamError, Pf as classifyOpenAICompatError, Rf as openAICompatPromptMessage, Sf as ASSISTANT_TOOL_CALLS_TAG, Tf as OpenAICompatAuthHeader, Vf as toolResultsMessage, jf as applyOAIToolCacheBreakpoint, kf as TOOL_RESULTS_TAG, wf as OAITool, zf as openaiCompat } from "../index-LxAV7xSk.js";
2
2
  export { ASSISTANT_TOOL_CALLS_TAG, OAIMessage, OAITool, OpenAICompatAuthHeader, OpenAICompatHttpError, OpenAICompatParams, OpenAICompatStreamError, TOOL_RESULTS_TAG, applyOAICacheBreakpoints, applyOAIToolCacheBreakpoint, assistantMessage, buildAssistantContent, classifyOpenAICompatError, consumeSSE, formatTools, mapOAIFinishReason, openAICompatPromptMessage, openaiCompat, toOAIMessages, toolResultsMessage, userMessage };
@@ -1,2 +1,2 @@
1
- import { _ as userMessage, a as applyOAICacheBreakpoints, c as buildAssistantContent, d as formatTools, f as mapOAIFinishReason, g as toolResultsMessage, h as toOAIMessages, i as TOOL_RESULTS_TAG, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, o as applyOAIToolCacheBreakpoint, p as openAICompatPromptMessage, r as OpenAICompatStreamError, s as assistantMessage, t as ASSISTANT_TOOL_CALLS_TAG, u as consumeSSE } from "../openai-compat-BTbSyQbm.js";
1
+ import { _ as userMessage, a as applyOAICacheBreakpoints, c as buildAssistantContent, d as formatTools, f as mapOAIFinishReason, g as toolResultsMessage, h as toOAIMessages, i as TOOL_RESULTS_TAG, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, o as applyOAIToolCacheBreakpoint, p as openAICompatPromptMessage, r as OpenAICompatStreamError, s as assistantMessage, t as ASSISTANT_TOOL_CALLS_TAG, u as consumeSSE } from "../openai-compat-70-QNsmd.js";
2
2
  export { ASSISTANT_TOOL_CALLS_TAG, OpenAICompatHttpError, OpenAICompatStreamError, TOOL_RESULTS_TAG, applyOAICacheBreakpoints, applyOAIToolCacheBreakpoint, assistantMessage, buildAssistantContent, classifyOpenAICompatError, consumeSSE, formatTools, mapOAIFinishReason, openAICompatPromptMessage, openaiCompat, toOAIMessages, toolResultsMessage, userMessage };
@@ -1,2 +1,2 @@
1
- import { Gf as mapCodexStopReason, Kf as openai, Uf as OpenAIParams, Wf as classifyOpenAIError, qf as toPiMessages } from "../index-1Dr4Yqw1.js";
1
+ import { Gf as mapCodexStopReason, Kf as openai, Uf as OpenAIParams, Wf as classifyOpenAIError, qf as toPiMessages } from "../index-LxAV7xSk.js";
2
2
  export { OpenAIParams, classifyOpenAIError, mapCodexStopReason, openai, toPiMessages };
@@ -1,9 +1,9 @@
1
1
  import { i as documentBlockMarker, n as assertResolvedMediaBlock } from "../types-BIarq1qE.js";
2
- import { c as classifyErrorPrelude, d as isRetryableHttpStatus, f as matchesContextExceeded, p as matchesToolPairingError } from "../errors-DJUxZg9b.js";
3
- import { O as unsupportedMediaError, _ as userMessage, b as sanitizeToolSpecs, g as toolResultsMessage, s as assistantMessage, v as createToolNameBoundary, w as fillEstimatedCost } from "../openai-compat-BTbSyQbm.js";
2
+ import { f as isRetryableHttpStatus, l as classifyErrorPrelude, m as matchesToolPairingError, p as matchesContextExceeded } from "../errors-BwBxu3zD.js";
3
+ import { O as unsupportedMediaError, _ as userMessage, b as sanitizeToolSpecs, g as toolResultsMessage, s as assistantMessage, v as createToolNameBoundary, w as fillEstimatedCost } from "../openai-compat-70-QNsmd.js";
4
4
  import { renderSystemForWire } from "../prompt.js";
5
- import { f as reasoningWireAction, n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER } from "../messages-DIxD2UCr.js";
6
- import { r as extractRuntimeCredentials, s as resolveOAuthApiKey } from "../oauth-CuFPhsHY.js";
5
+ import { f as reasoningWireAction, n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER } from "../messages-XfLqem2d.js";
6
+ import { r as extractRuntimeCredentials, s as resolveOAuthApiKey } from "../oauth-bkEOybqm.js";
7
7
  import { stream } from "@earendil-works/pi-ai/api/openai-codex-responses";
8
8
  import { stream as stream$1 } from "@earendil-works/pi-ai/api/openai-responses";
9
9
  import { getBuiltinModel } from "@earendil-works/pi-ai/providers/all";
@@ -1,2 +1,2 @@
1
- import { bf as normalizeOpenRouterModelId, xf as openrouter, yf as OpenRouterParams } from "../index-1Dr4Yqw1.js";
1
+ import { bf as normalizeOpenRouterModelId, xf as openrouter, yf as OpenRouterParams } from "../index-LxAV7xSk.js";
2
2
  export { OpenRouterParams, normalizeOpenRouterModelId, openrouter };
@@ -1,4 +1,4 @@
1
- import { m as openaiCompat } from "../openai-compat-BTbSyQbm.js";
1
+ import { m as openaiCompat } from "../openai-compat-70-QNsmd.js";
2
2
  //#region src/providers/openrouter.ts
3
3
  const BASE_URL = "https://openrouter.ai/api/v1";
4
4
  const DEFAULT_MODEL = "anthropic/claude-sonnet-4.6";
@@ -1,2 +1,2 @@
1
- import { ff as XaiParams, pf as xai } from "../index-1Dr4Yqw1.js";
1
+ import { ff as XaiParams, pf as xai } from "../index-LxAV7xSk.js";
2
2
  export { XaiParams, xai };
@@ -1,2 +1,2 @@
1
- import { t as xai } from "../xai-DnZfHvTz.js";
1
+ import { t as xai } from "../xai-BapwnBgs.js";
2
2
  export { xai };
@@ -1,6 +1,6 @@
1
- import { m as openaiCompat } from "./openai-compat-BTbSyQbm.js";
2
- import { s as resolveOAuthApiKey } from "./oauth-CuFPhsHY.js";
3
- import { r as generatePkce } from "./xai-DnZfHvTz.js";
1
+ import { m as openaiCompat } from "./openai-compat-70-QNsmd.js";
2
+ import { s as resolveOAuthApiKey } from "./oauth-bkEOybqm.js";
3
+ import { r as generatePkce } from "./xai-BapwnBgs.js";
4
4
  //#region src/chat/oauth-page/cursor.ts
5
5
  /** pi-ai / zidane OAuth provider id. Also the credentials-file key. */
6
6
  const CURSOR_OAUTH_PROVIDER_ID = "cursor";
@@ -165,4 +165,4 @@ function cursor(params) {
165
165
  //#endregion
166
166
  export { createCursorOAuthProvider as n, cursor as t };
167
167
 
168
- //# sourceMappingURL=providers-BsH1MnhC.js.map
168
+ //# sourceMappingURL=providers-DQFY2gl-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers-BsH1MnhC.js","names":[],"sources":["../src/chat/oauth-page/cursor.ts","../src/providers/cursor.ts"],"sourcesContent":["/**\n * Cursor OAuth flow.\n *\n * Unlike Anthropic / OpenAI Codex (loopback-redirect PKCE), Cursor uses a\n * **poll-based** PKCE flow with no local callback server:\n *\n * 1. Generate a PKCE verifier + challenge and a random UUID.\n * 2. Open the browser to `cursor.com/loginDeepControl?challenge&uuid&mode&redirectTarget`.\n * 3. Poll `api2.cursor.sh/auth/poll?uuid&verifier` until tokens come back\n * (HTTP 404 = \"not ready yet\", keep polling with backoff).\n * 4. Refresh via `POST api2.cursor.sh/auth/exchange_user_api_key` with\n * `Authorization: Bearer <refresh>`.\n *\n * Token expiry is derived from the access token's JWT `exp` claim (minus a\n * 5-minute safety margin), falling back to +1h when the claim is missing.\n *\n * Flow adapted from https://github.com/ndraiman/pi-cursor-provider, itself\n * derived from https://github.com/ephraimduncan/opencode-cursor.\n *\n * Cursor's auth + inference protocol is unofficial and undocumented — re-verify\n * the endpoints/params below if login starts failing.\n */\n\nimport type {\n OAuthCredentials,\n OAuthLoginCallbacks,\n} from '@earendil-works/pi-ai/oauth'\nimport type { OAuthProviderInterface } from '../../providers/oauth-registry'\nimport { generatePkce } from './pkce'\n\n/** pi-ai / zidane OAuth provider id. Also the credentials-file key. */\nexport const CURSOR_OAUTH_PROVIDER_ID = 'cursor'\n\nconst CURSOR_LOGIN_URL = 'https://cursor.com/loginDeepControl'\nconst CURSOR_POLL_URL = 'https://api2.cursor.sh/auth/poll'\nconst CURSOR_REFRESH_URL = 'https://api2.cursor.sh/auth/exchange_user_api_key'\n\nconst POLL_MAX_ATTEMPTS = 150\nconst POLL_BASE_DELAY_MS = 1000\nconst POLL_MAX_DELAY_MS = 10_000\nconst POLL_BACKOFF_MULTIPLIER = 1.2\nconst POLL_MAX_CONSECUTIVE_ERRORS = 3\n\n/** Fallback lifetime when the JWT carries no `exp`. */\nconst DEFAULT_TOKEN_TTL_MS = 3600 * 1000\n/** Refresh slightly early so requests don't race expiry. */\nconst TOKEN_EXPIRY_SKEW_MS = 5 * 60 * 1000\n\ninterface CursorTokenResponse {\n accessToken: string\n refreshToken: string\n}\n\n/**\n * Derive expiry (epoch ms) from a JWT's `exp` claim, minus a safety skew.\n * Returns `now + 1h` for malformed tokens so a missing claim never wedges\n * refresh into an immediate-expire loop.\n */\nexport function cursorTokenExpiry(token: string): number {\n try {\n const parts = token.split('.')\n const payload = parts[1]\n if (parts.length !== 3 || !payload)\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n\n const json = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/'))) as { exp?: unknown }\n if (typeof json.exp === 'number')\n return json.exp * 1000 - TOKEN_EXPIRY_SKEW_MS\n }\n catch {\n // fall through to default\n }\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms))\n}\n\n/**\n * Poll Cursor's auth endpoint until login completes. `404` means the user\n * hasn't finished the browser flow yet; anything else non-2xx is a hard error.\n */\nasync function pollForTokens(\n uuid: string,\n verifier: string,\n callbacks: OAuthLoginCallbacks,\n): Promise<CursorTokenResponse> {\n let wait = POLL_BASE_DELAY_MS\n let consecutiveErrors = 0\n\n for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n\n await delay(wait)\n\n try {\n const url = `${CURSOR_POLL_URL}?uuid=${encodeURIComponent(uuid)}&verifier=${encodeURIComponent(verifier)}`\n const response = await fetch(url, { signal: callbacks.signal })\n\n if (response.status === 404) {\n consecutiveErrors = 0\n wait = Math.min(wait * POLL_BACKOFF_MULTIPLIER, POLL_MAX_DELAY_MS)\n continue\n }\n\n if (response.ok) {\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken || !data.refreshToken)\n throw new Error(`Cursor poll response missing tokens: ${JSON.stringify(data)}`)\n return { accessToken: data.accessToken, refreshToken: data.refreshToken }\n }\n\n throw new Error(`Cursor poll failed (${response.status})`)\n }\n catch (err) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n consecutiveErrors++\n if (consecutiveErrors >= POLL_MAX_CONSECUTIVE_ERRORS)\n throw err instanceof Error ? err : new Error(String(err))\n callbacks.onProgress?.('Waiting for Cursor login to complete…')\n }\n }\n\n throw new Error('Cursor authentication timed out')\n}\n\nexport async function loginCursor(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, challenge } = await generatePkce()\n const uuid = crypto.randomUUID()\n\n const authUrl = new URL(CURSOR_LOGIN_URL)\n authUrl.searchParams.set('challenge', challenge)\n authUrl.searchParams.set('uuid', uuid)\n authUrl.searchParams.set('mode', 'login')\n authUrl.searchParams.set('redirectTarget', 'cli')\n\n callbacks.onAuth({\n url: authUrl.toString(),\n instructions: 'A browser window should open. Complete login in Cursor to finish.',\n })\n\n const tokens = await pollForTokens(uuid, verifier, callbacks)\n\n return {\n access: tokens.accessToken,\n refresh: tokens.refreshToken,\n expires: cursorTokenExpiry(tokens.accessToken),\n }\n}\n\nexport async function refreshCursorToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n const response = await fetch(CURSOR_REFRESH_URL, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.refresh}`,\n 'Content-Type': 'application/json',\n },\n body: '{}',\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`Cursor token refresh failed (${response.status}): ${text || response.statusText}`)\n }\n\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken)\n throw new Error(`Cursor token refresh response missing access token: ${JSON.stringify(data)}`)\n\n return {\n access: data.accessToken,\n // Cursor may omit a rotated refresh token — keep the existing one.\n refresh: data.refreshToken || credentials.refresh,\n expires: cursorTokenExpiry(data.accessToken),\n }\n}\n\n/**\n * Build a Cursor `OAuthProviderInterface`. Shape matches Anthropic / Codex so\n * it drops into `BUILTIN_PROVIDERS` and `src/auth.ts` unchanged.\n *\n * No `renderPage` parameter: Cursor's poll flow has no local callback server,\n * so there is no post-redirect page to theme.\n */\nexport function createCursorOAuthProvider(): OAuthProviderInterface {\n return {\n id: CURSOR_OAUTH_PROVIDER_ID,\n name: 'Cursor',\n usesCallbackServer: false,\n login: loginCursor,\n refreshToken: refreshCursorToken,\n getApiKey: credentials => credentials.access,\n }\n}\n","import type { Provider, StreamCallbacks } from '.'\nimport { CURSOR_OAUTH_PROVIDER_ID } from '../chat/oauth-page/cursor'\nimport { resolveOAuthApiKey } from './oauth'\nimport { openaiCompat } from './openai-compat'\n\n/**\n * Cursor provider (OAuth).\n *\n * Auth is fully wired: `bun run auth --cursor` (or the TUI wizard) logs in via\n * Cursor's poll-based PKCE flow and persists credentials; this provider resolves\n * + refreshes the OAuth token on every turn via {@link resolveOAuthApiKey}.\n *\n * Inference is **not** wired yet. Cursor does not expose an OpenAI-compatible\n * HTTP endpoint — it speaks a protobuf/Connect agent protocol over HTTP/2 to\n * `api2.cursor.sh`. Implementing `stream()` requires porting that transport\n * (generated protobuf schemas + an HTTP/2 streaming client) in-process, which\n * is intentionally left as a follow-up. Until then `stream()` resolves the\n * token (proving auth works) and then throws a clear, actionable error.\n *\n * The `openaiCompat` base supplies the message-format helpers (`formatTools`,\n * `userMessage`, `toolResultsMessage`, …) so the provider satisfies the full\n * `Provider` contract and slots into the registry; only `stream` is overridden.\n */\nexport interface CursorParams {\n /** Bypass OAuth resolution with an explicit token (mainly for tests). */\n apiKey?: string\n defaultModel?: string\n /**\n * Extra HTTP headers for the eventual Cursor transport. Accepted for API\n * parity with the other providers and forwarded to the openai-compat base,\n * but inert until Cursor inference is implemented (the `stream` override\n * currently throws before any request is made).\n */\n extraHeaders?: Record<string, string>\n}\n\nconst DEFAULT_MODEL = 'claude-4.6-sonnet'\n\nconst NOT_IMPLEMENTED_MESSAGE\n = 'Cursor OAuth login works, but inference over Cursor is not implemented yet. '\n + 'Cursor uses a protobuf/HTTP-2 agent protocol (not an OpenAI-compatible API), '\n + 'so the streaming transport still needs to be ported. Use another provider for now.'\n\nexport function cursor(params?: CursorParams): Provider {\n const defaultModel = params?.defaultModel || DEFAULT_MODEL\n\n // Base only provides the format/serialization methods; `baseURL` is never\n // hit because we override `stream` below.\n const base = openaiCompat({\n name: 'cursor',\n apiKey: params?.apiKey ?? 'oauth',\n baseURL: 'https://api2.cursor.sh',\n defaultModel,\n capabilities: { vision: true, imageInToolResult: false },\n extraHeaders: params?.extraHeaders,\n })\n\n return {\n ...base,\n meta: { ...base.meta, defaultModel },\n async stream(options, callbacks: StreamCallbacks) {\n // Resolve (and lazily refresh) the OAuth token so auth failures surface\n // here with the right remediation, distinct from the not-implemented path.\n await resolveOAuthApiKey(\n {\n provider: 'cursor',\n providerId: CURSOR_OAUTH_PROVIDER_ID,\n params,\n missingError: 'No Cursor credentials found. Run `bun run auth --cursor` first.',\n refreshError: reason => `Cursor OAuth token refresh failed. Run \\`bun run auth --cursor\\` again. ${reason}`,\n },\n callbacks,\n )\n void options\n throw new Error(NOT_IMPLEMENTED_MESSAGE)\n },\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"providers-DQFY2gl-.js","names":[],"sources":["../src/chat/oauth-page/cursor.ts","../src/providers/cursor.ts"],"sourcesContent":["/**\n * Cursor OAuth flow.\n *\n * Unlike Anthropic / OpenAI Codex (loopback-redirect PKCE), Cursor uses a\n * **poll-based** PKCE flow with no local callback server:\n *\n * 1. Generate a PKCE verifier + challenge and a random UUID.\n * 2. Open the browser to `cursor.com/loginDeepControl?challenge&uuid&mode&redirectTarget`.\n * 3. Poll `api2.cursor.sh/auth/poll?uuid&verifier` until tokens come back\n * (HTTP 404 = \"not ready yet\", keep polling with backoff).\n * 4. Refresh via `POST api2.cursor.sh/auth/exchange_user_api_key` with\n * `Authorization: Bearer <refresh>`.\n *\n * Token expiry is derived from the access token's JWT `exp` claim (minus a\n * 5-minute safety margin), falling back to +1h when the claim is missing.\n *\n * Flow adapted from https://github.com/ndraiman/pi-cursor-provider, itself\n * derived from https://github.com/ephraimduncan/opencode-cursor.\n *\n * Cursor's auth + inference protocol is unofficial and undocumented — re-verify\n * the endpoints/params below if login starts failing.\n */\n\nimport type {\n OAuthCredentials,\n OAuthLoginCallbacks,\n} from '@earendil-works/pi-ai/oauth'\nimport type { OAuthProviderInterface } from '../../providers/oauth-registry'\nimport { generatePkce } from './pkce'\n\n/** pi-ai / zidane OAuth provider id. Also the credentials-file key. */\nexport const CURSOR_OAUTH_PROVIDER_ID = 'cursor'\n\nconst CURSOR_LOGIN_URL = 'https://cursor.com/loginDeepControl'\nconst CURSOR_POLL_URL = 'https://api2.cursor.sh/auth/poll'\nconst CURSOR_REFRESH_URL = 'https://api2.cursor.sh/auth/exchange_user_api_key'\n\nconst POLL_MAX_ATTEMPTS = 150\nconst POLL_BASE_DELAY_MS = 1000\nconst POLL_MAX_DELAY_MS = 10_000\nconst POLL_BACKOFF_MULTIPLIER = 1.2\nconst POLL_MAX_CONSECUTIVE_ERRORS = 3\n\n/** Fallback lifetime when the JWT carries no `exp`. */\nconst DEFAULT_TOKEN_TTL_MS = 3600 * 1000\n/** Refresh slightly early so requests don't race expiry. */\nconst TOKEN_EXPIRY_SKEW_MS = 5 * 60 * 1000\n\ninterface CursorTokenResponse {\n accessToken: string\n refreshToken: string\n}\n\n/**\n * Derive expiry (epoch ms) from a JWT's `exp` claim, minus a safety skew.\n * Returns `now + 1h` for malformed tokens so a missing claim never wedges\n * refresh into an immediate-expire loop.\n */\nexport function cursorTokenExpiry(token: string): number {\n try {\n const parts = token.split('.')\n const payload = parts[1]\n if (parts.length !== 3 || !payload)\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n\n const json = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/'))) as { exp?: unknown }\n if (typeof json.exp === 'number')\n return json.exp * 1000 - TOKEN_EXPIRY_SKEW_MS\n }\n catch {\n // fall through to default\n }\n return Date.now() + DEFAULT_TOKEN_TTL_MS\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms))\n}\n\n/**\n * Poll Cursor's auth endpoint until login completes. `404` means the user\n * hasn't finished the browser flow yet; anything else non-2xx is a hard error.\n */\nasync function pollForTokens(\n uuid: string,\n verifier: string,\n callbacks: OAuthLoginCallbacks,\n): Promise<CursorTokenResponse> {\n let wait = POLL_BASE_DELAY_MS\n let consecutiveErrors = 0\n\n for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n\n await delay(wait)\n\n try {\n const url = `${CURSOR_POLL_URL}?uuid=${encodeURIComponent(uuid)}&verifier=${encodeURIComponent(verifier)}`\n const response = await fetch(url, { signal: callbacks.signal })\n\n if (response.status === 404) {\n consecutiveErrors = 0\n wait = Math.min(wait * POLL_BACKOFF_MULTIPLIER, POLL_MAX_DELAY_MS)\n continue\n }\n\n if (response.ok) {\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken || !data.refreshToken)\n throw new Error(`Cursor poll response missing tokens: ${JSON.stringify(data)}`)\n return { accessToken: data.accessToken, refreshToken: data.refreshToken }\n }\n\n throw new Error(`Cursor poll failed (${response.status})`)\n }\n catch (err) {\n if (callbacks.signal?.aborted)\n throw new Error('Cursor login aborted')\n consecutiveErrors++\n if (consecutiveErrors >= POLL_MAX_CONSECUTIVE_ERRORS)\n throw err instanceof Error ? err : new Error(String(err))\n callbacks.onProgress?.('Waiting for Cursor login to complete…')\n }\n }\n\n throw new Error('Cursor authentication timed out')\n}\n\nexport async function loginCursor(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, challenge } = await generatePkce()\n const uuid = crypto.randomUUID()\n\n const authUrl = new URL(CURSOR_LOGIN_URL)\n authUrl.searchParams.set('challenge', challenge)\n authUrl.searchParams.set('uuid', uuid)\n authUrl.searchParams.set('mode', 'login')\n authUrl.searchParams.set('redirectTarget', 'cli')\n\n callbacks.onAuth({\n url: authUrl.toString(),\n instructions: 'A browser window should open. Complete login in Cursor to finish.',\n })\n\n const tokens = await pollForTokens(uuid, verifier, callbacks)\n\n return {\n access: tokens.accessToken,\n refresh: tokens.refreshToken,\n expires: cursorTokenExpiry(tokens.accessToken),\n }\n}\n\nexport async function refreshCursorToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n const response = await fetch(CURSOR_REFRESH_URL, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.refresh}`,\n 'Content-Type': 'application/json',\n },\n body: '{}',\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => '')\n throw new Error(`Cursor token refresh failed (${response.status}): ${text || response.statusText}`)\n }\n\n const data = await response.json() as Partial<CursorTokenResponse>\n if (!data.accessToken)\n throw new Error(`Cursor token refresh response missing access token: ${JSON.stringify(data)}`)\n\n return {\n access: data.accessToken,\n // Cursor may omit a rotated refresh token — keep the existing one.\n refresh: data.refreshToken || credentials.refresh,\n expires: cursorTokenExpiry(data.accessToken),\n }\n}\n\n/**\n * Build a Cursor `OAuthProviderInterface`. Shape matches Anthropic / Codex so\n * it drops into `BUILTIN_PROVIDERS` and `src/auth.ts` unchanged.\n *\n * No `renderPage` parameter: Cursor's poll flow has no local callback server,\n * so there is no post-redirect page to theme.\n */\nexport function createCursorOAuthProvider(): OAuthProviderInterface {\n return {\n id: CURSOR_OAUTH_PROVIDER_ID,\n name: 'Cursor',\n usesCallbackServer: false,\n login: loginCursor,\n refreshToken: refreshCursorToken,\n getApiKey: credentials => credentials.access,\n }\n}\n","import type { Provider, StreamCallbacks } from '.'\nimport { CURSOR_OAUTH_PROVIDER_ID } from '../chat/oauth-page/cursor'\nimport { resolveOAuthApiKey } from './oauth'\nimport { openaiCompat } from './openai-compat'\n\n/**\n * Cursor provider (OAuth).\n *\n * Auth is fully wired: `bun run auth --cursor` (or the TUI wizard) logs in via\n * Cursor's poll-based PKCE flow and persists credentials; this provider resolves\n * + refreshes the OAuth token on every turn via {@link resolveOAuthApiKey}.\n *\n * Inference is **not** wired yet. Cursor does not expose an OpenAI-compatible\n * HTTP endpoint — it speaks a protobuf/Connect agent protocol over HTTP/2 to\n * `api2.cursor.sh`. Implementing `stream()` requires porting that transport\n * (generated protobuf schemas + an HTTP/2 streaming client) in-process, which\n * is intentionally left as a follow-up. Until then `stream()` resolves the\n * token (proving auth works) and then throws a clear, actionable error.\n *\n * The `openaiCompat` base supplies the message-format helpers (`formatTools`,\n * `userMessage`, `toolResultsMessage`, …) so the provider satisfies the full\n * `Provider` contract and slots into the registry; only `stream` is overridden.\n */\nexport interface CursorParams {\n /** Bypass OAuth resolution with an explicit token (mainly for tests). */\n apiKey?: string\n defaultModel?: string\n /**\n * Extra HTTP headers for the eventual Cursor transport. Accepted for API\n * parity with the other providers and forwarded to the openai-compat base,\n * but inert until Cursor inference is implemented (the `stream` override\n * currently throws before any request is made).\n */\n extraHeaders?: Record<string, string>\n}\n\nconst DEFAULT_MODEL = 'claude-4.6-sonnet'\n\nconst NOT_IMPLEMENTED_MESSAGE\n = 'Cursor OAuth login works, but inference over Cursor is not implemented yet. '\n + 'Cursor uses a protobuf/HTTP-2 agent protocol (not an OpenAI-compatible API), '\n + 'so the streaming transport still needs to be ported. Use another provider for now.'\n\nexport function cursor(params?: CursorParams): Provider {\n const defaultModel = params?.defaultModel || DEFAULT_MODEL\n\n // Base only provides the format/serialization methods; `baseURL` is never\n // hit because we override `stream` below.\n const base = openaiCompat({\n name: 'cursor',\n apiKey: params?.apiKey ?? 'oauth',\n baseURL: 'https://api2.cursor.sh',\n defaultModel,\n capabilities: { vision: true, imageInToolResult: false },\n extraHeaders: params?.extraHeaders,\n })\n\n return {\n ...base,\n meta: { ...base.meta, defaultModel },\n async stream(options, callbacks: StreamCallbacks) {\n // Resolve (and lazily refresh) the OAuth token so auth failures surface\n // here with the right remediation, distinct from the not-implemented path.\n await resolveOAuthApiKey(\n {\n provider: 'cursor',\n providerId: CURSOR_OAUTH_PROVIDER_ID,\n params,\n missingError: 'No Cursor credentials found. Run `bun run auth --cursor` first.',\n refreshError: reason => `Cursor OAuth token refresh failed. Run \\`bun run auth --cursor\\` again. ${reason}`,\n },\n callbacks,\n )\n void options\n throw new Error(NOT_IMPLEMENTED_MESSAGE)\n },\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { $f as cerebras, Ap as readOAuthCredentials, Cp as resolvePromptCacheKey, Df as OpenAICompatParams, Dp as credentialsFromParams, Ef as OpenAICompatHttpError, Ep as credentialsFilePath, Jf as LocalParams, Kf as openai, Lf as mapOAIFinishReason, Mp as resolveOAuthApiKey, Np as writeOAuthCredentials, Op as extractRuntimeCredentials, Pf as classifyOpenAICompatError, Pp as OAuthProviderInterface, Qf as CerebrasParams, Sp as derivePromptCacheKey, Tf as OpenAICompatAuthHeader, Tp as ResolveOAuthApiKeyOptions, Uf as OpenAIParams, Xf as CursorParams, Yf as local, Zf as cursor, _f as sanitizeToolSchema, af as StreamCallbacks, bp as PromptCacheKeyContext, cf as ToolCall, df as TurnResult, dp as applyAnthropicCacheBreakpoints, ep as BasetenParams, ff as XaiParams, gf as SchemaSanitizeResult, hf as SchemaSanitizeProfile, if as ProviderCapabilities, ip as arcee, jp as registerCustomOAuthProvider, kp as isOAuthAccessToken, lf as ToolResult, mf as SchemaSanitizeOptions, nf as HistoryRepair, np as planBasetenReasoning, of as StreamOptions, pf as xai, rf as Provider, rp as ArceeParams, sf as TokenCountPayload, sp as AnthropicParams, tp as baseten, uf as ToolSpec, up as anthropic, vf as sanitizeToolSpecs, wp as OAuthParams, xf as openrouter, xp as PromptCacheKeyOption, yf as OpenRouterParams, zf as openaiCompat } from "./index-1Dr4Yqw1.js";
1
+ import { $f as cerebras, Ap as readOAuthCredentials, Cp as resolvePromptCacheKey, Df as OpenAICompatParams, Dp as credentialsFromParams, Ef as OpenAICompatHttpError, Ep as credentialsFilePath, Jf as LocalParams, Kf as openai, Lf as mapOAIFinishReason, Mp as resolveOAuthApiKey, Np as writeOAuthCredentials, Op as extractRuntimeCredentials, Pf as classifyOpenAICompatError, Pp as OAuthProviderInterface, Qf as CerebrasParams, Sp as derivePromptCacheKey, Tf as OpenAICompatAuthHeader, Tp as ResolveOAuthApiKeyOptions, Uf as OpenAIParams, Xf as CursorParams, Yf as local, Zf as cursor, _f as sanitizeToolSchema, af as StreamCallbacks, bp as PromptCacheKeyContext, cf as ToolCall, df as TurnResult, dp as applyAnthropicCacheBreakpoints, ep as BasetenParams, ff as XaiParams, gf as SchemaSanitizeResult, hf as SchemaSanitizeProfile, if as ProviderCapabilities, ip as arcee, jp as registerCustomOAuthProvider, kp as isOAuthAccessToken, lf as ToolResult, mf as SchemaSanitizeOptions, nf as HistoryRepair, np as planBasetenReasoning, of as StreamOptions, pf as xai, rf as Provider, rp as ArceeParams, sf as TokenCountPayload, sp as AnthropicParams, tp as baseten, uf as ToolSpec, up as anthropic, vf as sanitizeToolSpecs, wp as OAuthParams, xf as openrouter, xp as PromptCacheKeyOption, yf as OpenRouterParams, zf as openaiCompat } from "./index-LxAV7xSk.js";
2
2
  export { type AnthropicParams, type ArceeParams, type BasetenParams, type CerebrasParams, type CursorParams, HistoryRepair, type LocalParams, type OAuthParams, type OAuthProviderInterface, type OpenAICompatAuthHeader, OpenAICompatHttpError, type OpenAICompatParams, type OpenAIParams, type OpenRouterParams, type PromptCacheKeyContext, type PromptCacheKeyOption, Provider, ProviderCapabilities, type ResolveOAuthApiKeyOptions, type SchemaSanitizeOptions, type SchemaSanitizeProfile, type SchemaSanitizeResult, StreamCallbacks, StreamOptions, TokenCountPayload, ToolCall, ToolResult, ToolSpec, TurnResult, type XaiParams, anthropic, applyAnthropicCacheBreakpoints, arcee, baseten, cerebras, classifyOpenAICompatError, credentialsFilePath, credentialsFromParams, cursor, derivePromptCacheKey, extractRuntimeCredentials, isOAuthAccessToken, local, mapOAIFinishReason, openai, openaiCompat, openrouter, planBasetenReasoning, readOAuthCredentials, registerCustomOAuthProvider, resolveOAuthApiKey, resolvePromptCacheKey, sanitizeToolSchema, sanitizeToolSpecs, writeOAuthCredentials, xai };
package/dist/providers.js CHANGED
@@ -1,11 +1,11 @@
1
- import { S as resolvePromptCacheKey, b as sanitizeToolSpecs, f as mapOAIFinishReason, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, x as derivePromptCacheKey, y as sanitizeToolSchema } from "./openai-compat-BTbSyQbm.js";
2
- import { n as anthropic, r as applyAnthropicCacheBreakpoints } from "./anthropic-Bw39RApb.js";
3
- import { a as readOAuthCredentials, c as writeOAuthCredentials, i as isOAuthAccessToken, n as credentialsFromParams, o as registerCustomOAuthProvider, r as extractRuntimeCredentials, s as resolveOAuthApiKey, t as credentialsFilePath } from "./oauth-CuFPhsHY.js";
1
+ import { S as resolvePromptCacheKey, b as sanitizeToolSpecs, f as mapOAIFinishReason, l as classifyOpenAICompatError, m as openaiCompat, n as OpenAICompatHttpError, x as derivePromptCacheKey, y as sanitizeToolSchema } from "./openai-compat-70-QNsmd.js";
2
+ import { n as anthropic, r as applyAnthropicCacheBreakpoints } from "./anthropic-BAuvWmqU.js";
3
+ import { a as readOAuthCredentials, c as writeOAuthCredentials, i as isOAuthAccessToken, n as credentialsFromParams, o as registerCustomOAuthProvider, r as extractRuntimeCredentials, s as resolveOAuthApiKey, t as credentialsFilePath } from "./oauth-bkEOybqm.js";
4
4
  import { arcee } from "./providers/arcee.js";
5
5
  import { baseten, planBasetenReasoning } from "./providers/baseten.js";
6
6
  import { cerebras } from "./providers/cerebras.js";
7
- import { t as xai } from "./xai-DnZfHvTz.js";
8
- import { t as cursor } from "./providers-BsH1MnhC.js";
7
+ import { t as xai } from "./xai-BapwnBgs.js";
8
+ import { t as cursor } from "./providers-DQFY2gl-.js";
9
9
  import { local } from "./providers/local.js";
10
10
  import { openai } from "./providers/openai.js";
11
11
  import { openrouter } from "./providers/openrouter.js";
@@ -1,4 +1,4 @@
1
- import { a as AgentToolNotAllowedError, l as errorMessage } from "./errors-DJUxZg9b.js";
1
+ import { o as AgentToolNotAllowedError, u as errorMessage } from "./errors-BwBxu3zD.js";
2
2
  import { basename, delimiter, dirname, join, resolve, sep } from "node:path";
3
3
  import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
4
4
  import { realpath } from "node:fs/promises";
@@ -1588,4 +1588,4 @@ async function resolveSkills(config) {
1588
1588
  //#endregion
1589
1589
  export { validateSkillName as A, stripShellInterpolations as C, validateResourcePath as D, parseAllowedToolPattern as E, findGitRoot as M, validateResourcePathReal as O, interpolateShellCommands as S, matchesAllowedTool as T, lastLine as _, getDefaultScanPaths as a, resolveSubdirRoot as b, parseSkillFile as c, installAllowedToolsGate as d, createSkillActivationState as f, fetchInstallSource as g, defaultWhich as h, discoverSkills as i, projectUserPaths as j, validateSkillForWrite as k, buildCatalog as l, defaultExec as m, writeSkillToDisk as n, inferSource as o, InstallSourceError as p, writeSkillsToDisk as r, parseFrontmatter as s, resolveSkills as t, IMPLICITLY_ALLOWED_SKILL_TOOLS as u, parseInstallSource as v, isToolAllowedByUnion as w, escapeXml as x, resolveNpmVersion as y };
1590
1590
 
1591
- //# sourceMappingURL=resolve-BPTA1RpX.js.map
1591
+ //# sourceMappingURL=resolve-CZJxds85.js.map