@theokit/sdk 5.11.0 → 5.11.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 (52) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/{agent-GWKRARAL.js → agent-DFV52V6E.js} +7 -7
  3. package/dist/{agent-GWKRARAL.js.map → agent-DFV52V6E.js.map} +1 -1
  4. package/dist/{agent-5DOR5T3E.cjs → agent-OKP4LHG2.cjs} +8 -8
  5. package/dist/{agent-5DOR5T3E.cjs.map → agent-OKP4LHG2.cjs.map} +1 -1
  6. package/dist/{chunk-5OHB5HJF.cjs → chunk-35KBC4BX.cjs} +133 -93
  7. package/dist/chunk-35KBC4BX.cjs.map +1 -0
  8. package/dist/{chunk-N7ZIPW2N.cjs → chunk-3JANYJYS.cjs} +3 -3
  9. package/dist/{chunk-N7ZIPW2N.cjs.map → chunk-3JANYJYS.cjs.map} +1 -1
  10. package/dist/{chunk-Z5BAFHPU.js → chunk-6G4IRQUD.js} +3 -3
  11. package/dist/{chunk-Z5BAFHPU.js.map → chunk-6G4IRQUD.js.map} +1 -1
  12. package/dist/{chunk-74OA5DIM.js → chunk-BBJ77S62.js} +3 -3
  13. package/dist/{chunk-74OA5DIM.js.map → chunk-BBJ77S62.js.map} +1 -1
  14. package/dist/{chunk-5H2GJXGC.cjs → chunk-EQ5NCH2Y.cjs} +4 -4
  15. package/dist/{chunk-5H2GJXGC.cjs.map → chunk-EQ5NCH2Y.cjs.map} +1 -1
  16. package/dist/{chunk-TE6XVTOA.js → chunk-JLIRFWUG.js} +47 -17
  17. package/dist/chunk-JLIRFWUG.js.map +1 -0
  18. package/dist/{chunk-YEHQ3SIC.cjs → chunk-JV7JA7BM.cjs} +5 -5
  19. package/dist/{chunk-YEHQ3SIC.cjs.map → chunk-JV7JA7BM.cjs.map} +1 -1
  20. package/dist/{chunk-4PHSVR2R.js → chunk-MHIBYKWA.js} +83 -43
  21. package/dist/chunk-MHIBYKWA.js.map +1 -0
  22. package/dist/{chunk-WPO3VCY4.cjs → chunk-N7KS3TIR.cjs} +47 -17
  23. package/dist/chunk-N7KS3TIR.cjs.map +1 -0
  24. package/dist/{chunk-BZKF7TXX.cjs → chunk-P5N3Q2NH.cjs} +22 -22
  25. package/dist/{chunk-BZKF7TXX.cjs.map → chunk-P5N3Q2NH.cjs.map} +1 -1
  26. package/dist/{chunk-7Y23B7XX.js → chunk-Q34EBNYG.js} +3 -3
  27. package/dist/{chunk-7Y23B7XX.js.map → chunk-Q34EBNYG.js.map} +1 -1
  28. package/dist/{chunk-HI3W37FY.js → chunk-U27XHOEF.js} +3 -3
  29. package/dist/{chunk-HI3W37FY.js.map → chunk-U27XHOEF.js.map} +1 -1
  30. package/dist/{compact-session-F2UDGZCN.js → compact-session-4HAUP3HK.js} +4 -4
  31. package/dist/{compact-session-F2UDGZCN.js.map → compact-session-4HAUP3HK.js.map} +1 -1
  32. package/dist/{compact-session-2AETONOS.cjs → compact-session-Y56D3S57.cjs} +13 -13
  33. package/dist/{compact-session-2AETONOS.cjs.map → compact-session-Y56D3S57.cjs.map} +1 -1
  34. package/dist/cron.cjs +7 -7
  35. package/dist/cron.js +6 -6
  36. package/dist/eval.cjs +6 -6
  37. package/dist/eval.js +5 -5
  38. package/dist/index.cjs +33 -33
  39. package/dist/index.js +9 -9
  40. package/dist/{inject-session-E5UDFVLI.js → inject-session-LJX5JGV5.js} +3 -3
  41. package/dist/{inject-session-E5UDFVLI.js.map → inject-session-LJX5JGV5.js.map} +1 -1
  42. package/dist/{inject-session-W4UKACYJ.cjs → inject-session-R73PRM7B.cjs} +4 -4
  43. package/dist/{inject-session-W4UKACYJ.cjs.map → inject-session-R73PRM7B.cjs.map} +1 -1
  44. package/dist/internal/error-mappers/openai-compatible.d.ts +3 -1
  45. package/dist/internal/memory/adapters/index.cjs +3 -3
  46. package/dist/internal/memory/adapters/index.js +2 -2
  47. package/docs/error-codes.md +6 -3
  48. package/package.json +1 -1
  49. package/dist/chunk-4PHSVR2R.js.map +0 -1
  50. package/dist/chunk-5OHB5HJF.cjs.map +0 -1
  51. package/dist/chunk-TE6XVTOA.js.map +0 -1
  52. package/dist/chunk-WPO3VCY4.cjs.map +0 -1
@@ -73,6 +73,13 @@ function mapOpenAICompatibleError(args) {
73
73
  if (status === 429) {
74
74
  return new chunkUNFBHV46_cjs.RateLimitError(message, { code: `${providerId}_rate_limit`, metadata });
75
75
  }
76
+ if (status === 404 && code === "model_unavailable") {
77
+ const detailed = formatMessage(providerId, status, code, extractOpenAiErrorMessage(body));
78
+ return new chunkUNFBHV46_cjs.ConfigurationError(detailed, {
79
+ code: `${providerId}_model_unavailable`,
80
+ metadata
81
+ });
82
+ }
76
83
  if (status === 400) {
77
84
  return new chunkUNFBHV46_cjs.ConfigurationError(message, { code: `${providerId}_${code}`, metadata });
78
85
  }
@@ -92,24 +99,47 @@ function extractOpenAiErrorCode(body) {
92
99
  if (typeof err.type === "string") return err.type;
93
100
  return void 0;
94
101
  }
102
+ function extractOpenAiErrorMessage(body) {
103
+ if (body === null || typeof body !== "object") return void 0;
104
+ const err = body.error;
105
+ if (err === void 0 || err === null) return void 0;
106
+ return typeof err.message === "string" ? err.message : void 0;
107
+ }
108
+ var MISSING_MODEL_MESSAGE = /no endpoints found/i;
95
109
  function mapOpenAiStatusToCode(status, body) {
96
- const rawCode = extractOpenAiErrorCode(body)?.toLowerCase() ?? "";
97
- if (rawCode.includes("context_length") || rawCode.includes("context_window") || rawCode.includes("too_many_tokens") || rawCode.includes("max_tokens")) {
98
- return "context_too_long";
99
- }
100
- if (rawCode.includes("content_filter") || rawCode.includes("content_policy") || rawCode.includes("safety")) {
101
- return "content_filtered";
102
- }
103
- if (rawCode.includes("model_not_found") || rawCode.includes("model_unavailable") || rawCode.includes("invalid_model")) {
104
- return "model_unavailable";
105
- }
106
- if (rawCode.includes("insufficient_quota") || rawCode.includes("quota_exceeded")) {
107
- return "quota_exceeded";
108
- }
110
+ const fromBodyCode = classifyOpenAiBodyCode(extractOpenAiErrorCode(body)?.toLowerCase() ?? "");
111
+ if (fromBodyCode !== void 0) return fromBodyCode;
112
+ if (isMissingModel404(status, body)) return "model_unavailable";
109
113
  return httpStatusToErrorCode(status);
110
114
  }
111
- function formatMessage(providerId, status, code) {
112
- return `${providerId} API error: ${code} (HTTP ${status})`;
115
+ function isMissingModel404(status, body) {
116
+ return status === 404 && MISSING_MODEL_MESSAGE.test(extractOpenAiErrorMessage(body) ?? "");
117
+ }
118
+ var BODY_CODE_RULES = [
119
+ {
120
+ fragments: ["context_length", "context_window", "too_many_tokens", "max_tokens"],
121
+ code: "context_too_long"
122
+ },
123
+ { fragments: ["content_filter", "content_policy", "safety"], code: "content_filtered" },
124
+ {
125
+ fragments: ["model_not_found", "model_unavailable", "invalid_model"],
126
+ code: "model_unavailable"
127
+ },
128
+ // T3.7 — OpenRouter "Insufficient credits" / `insufficient_quota` in the BODY.
129
+ // The status-402 half of this rule moved to the shared ladder, where it now
130
+ // reaches all four mappers instead of this one; what stays here is the part
131
+ // that is genuinely a body dialect.
132
+ { fragments: ["insufficient_quota", "quota_exceeded"], code: "quota_exceeded" }
133
+ ];
134
+ function classifyOpenAiBodyCode(rawCode) {
135
+ const rule = BODY_CODE_RULES.find(
136
+ ({ fragments }) => fragments.some((fragment) => rawCode.includes(fragment))
137
+ );
138
+ return rule?.code;
139
+ }
140
+ function formatMessage(providerId, status, code, detail) {
141
+ const base = `${providerId} API error: ${code} (HTTP ${status})`;
142
+ return detail === void 0 || detail === "" ? base : `${base}: ${detail}`;
113
143
  }
114
144
 
115
145
  exports.buildErrorMetadata = buildErrorMetadata;
@@ -117,5 +147,5 @@ exports.httpStatusToErrorCode = httpStatusToErrorCode;
117
147
  exports.mapOpenAICompatibleError = mapOpenAICompatibleError;
118
148
  exports.parseErrorBody = parseErrorBody;
119
149
  exports.parseRetryAfter = parseRetryAfter;
120
- //# sourceMappingURL=chunk-WPO3VCY4.cjs.map
121
- //# sourceMappingURL=chunk-WPO3VCY4.cjs.map
150
+ //# sourceMappingURL=chunk-N7KS3TIR.cjs.map
151
+ //# sourceMappingURL=chunk-N7KS3TIR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/error-mappers/shared.ts","../src/internal/error-mappers/openai-compatible.ts"],"names":["redactSecrets","AuthenticationError","RateLimitError","ConfigurationError","NetworkError","UnknownAgentError"],"mappings":"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","file":"chunk-N7KS3TIR.cjs","sourcesContent":["/**\nimport type { ErrorCode } from \"../../errors.js\";\n * Helpers shared between provider HTTP error mappers (ADR D67).\n *\n * Extracted to dedupe identical logic in `anthropic.ts` and\n * `openai-compatible.ts` — retry-after parsing, raw-body truncation,\n * and metadata assembly are dialect-agnostic.\n *\n * @internal\n */\n\nimport type { ErrorCode, ErrorMetadata } from \"../../errors.js\";\nimport { redactSecrets } from \"../security/index.js\";\n\nconst RAW_MAX_BYTES = 2048;\n\n/**\n * Parse the `Retry-After` header (RFC 7231) into seconds. Both forms are\n * supported: numeric-seconds (`Retry-After: 30`) and HTTP-date\n * (`Retry-After: Wed, 21 Oct 2025 07:28:00 GMT` → seconds until that instant,\n * clamped at 0 for a past date). Garbage / missing header → `undefined`.\n *\n * @internal\n */\nexport function parseRetryAfter(headers: Headers | undefined): number | undefined {\n if (headers === undefined) return undefined;\n const raw = headers.get(\"retry-after\");\n if (raw === null) return undefined;\n const n = Number(raw);\n if (Number.isFinite(n) && n >= 0) return Math.ceil(n);\n // HTTP-date form — seconds until the given instant (0 if already elapsed).\n const dateMs = Date.parse(raw);\n if (Number.isFinite(dateMs)) return Math.max(0, Math.ceil((dateMs - Date.now()) / 1000));\n return undefined;\n}\n\n/**\n * Truncate raw response body to ~2KB and redact known credential\n * patterns so it can ride inside `ErrorMetadata.raw` without\n * ballooning logs OR leaking tokens. Returns `undefined` for\n * null/undefined input.\n *\n * Post T1.1 (secret-redaction-discipline, ADR D68): every error metadata\n * goes through `redactSecrets` before exposure. Note the shape change —\n * pre-T1.1 the function preserved the original `body` shape when ≤2KB;\n * now it always returns a (possibly redacted) string, because redaction\n * coerces non-strings to JSON. Consumers who used to do `err.metadata.raw.foo`\n * must now `JSON.parse(err.metadata.raw)` first — but a workspace-wide\n * grep at T1.1 land time confirmed zero such callers.\n *\n * @internal\n */\nexport function truncateRaw(body: unknown): unknown {\n if (body === null || body === undefined) return undefined;\n const s = typeof body === \"string\" ? body : JSON.stringify(body);\n const truncated = s.length <= RAW_MAX_BYTES ? s : `${s.slice(0, RAW_MAX_BYTES)}…`;\n return redactSecrets(truncated);\n}\n\n/**\n * Build an `ErrorMetadata` object with all optional fields included\n * conditionally (no `undefined` keys in the output). Caller passes\n * dialect-specific fields (`provider`, `endpoint`, `code`); shared\n * fields (`statusCode`, `retryAfter`, `raw`) are derived here.\n *\n * @internal\n */\nexport function buildErrorMetadata(args: {\n provider: string;\n endpoint: string;\n code: ErrorCode;\n status: number;\n headers: Headers | undefined;\n body: unknown;\n}): ErrorMetadata {\n const retryAfter = parseRetryAfter(args.headers);\n const raw = truncateRaw(args.body);\n return {\n provider: args.provider,\n endpoint: args.endpoint,\n code: args.code,\n statusCode: args.status,\n ...(retryAfter !== undefined ? { retryAfter } : {}),\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n/**\n * D314: extract the provider's request id (`x-request-id` is OpenAI/most;\n * `request-id` is Anthropic). Returns `undefined` when neither is present.\n *\n * @internal\n */\nexport function parseRequestId(headers: Headers | undefined): string | undefined {\n if (headers === undefined) return undefined;\n return headers.get(\"x-request-id\") ?? headers.get(\"request-id\") ?? undefined;\n}\n\n/**\n * The HTTP status ladder — ONE definition, shared by every provider mapper.\n *\n * This is RFC 9110 semantics, not a vendor contract: a 429 means the same thing\n * whether Anthropic, OpenAI, Bedrock or Vertex sent it. It lived in four copies\n * until 2026-09-01 and the copies had already drifted in two measurable ways,\n * which is what moved it here beside the other dialect-agnostic helpers ADR D67\n * extracted:\n *\n * 1. **402 reached one mapper of four.** T3.7 added `quota_exceeded` and wired\n * it into `openai-compatible.ts` only. A Bedrock, Vertex or Anthropic\n * endpoint answering 402 fell through every arm and came back `unknown` —\n * the canonical bucket existed and three of four mappers could not reach it.\n * 2. **The 5xx arm had two different upper bounds.** `anthropic` and\n * `openai-compatible` guarded `>= 500 && < 600`; `bedrock` and `vertex`\n * guarded `>= 500` with no ceiling, so a malformed or proxy-injected 6xx was\n * `server_error` in two mappers and `unknown` in the other two.\n *\n * Neither was a vendor difference. Both were copy-drift, and that is the DRY\n * test in its textbook form: one piece of knowledge, four places to change it.\n *\n * The ladder is deliberately the FALLBACK, never the whole classifier. Each\n * mapper keeps its own body-dialect rules — Anthropic's `context_too_long`,\n * Bedrock's AWS `__type` strings, Vertex's `google.rpc` status enum — because\n * those ARE per-vendor contracts. The shape is\n * `classifyVendorBody(body) ?? httpStatusToErrorCode(status)`.\n *\n * 404 is deliberately NOT mapped here. Three mappers treat it as `unknown` and\n * Bedrock treats it as `invalid_request` via its own `__type` rules; folding it\n * in would silently change three mappers to close a divergence nobody measured.\n *\n * @internal\n */\nexport type HttpStatusErrorCode = Extract<\n ErrorCode,\n | \"auth_failed\"\n | \"quota_exceeded\"\n | \"timeout\"\n | \"rate_limit\"\n | \"invalid_request\"\n | \"server_error\"\n | \"unknown\"\n>;\n\nexport function httpStatusToErrorCode(status: number): HttpStatusErrorCode {\n if (status === 401 || status === 403) return \"auth_failed\";\n if (status === 402) return \"quota_exceeded\";\n if (status === 408) return \"timeout\";\n if (status === 429) return \"rate_limit\";\n if (status === 400) return \"invalid_request\";\n if (status >= 500 && status < 600) return \"server_error\";\n return \"unknown\";\n}\n\n/**\n * Reads an error body that may arrive already parsed, as a JSON string, or as neither.\n *\n * This is TRANSPORT knowledge, not vendor knowledge: it describes how `fetch` surfaces a body, which\n * is the same whichever provider sent it. It lived twice, character-for-character, in bedrock.ts and\n * vertex.ts — identical once the return type name was substituted. They had not drifted, so the cost\n * was only latent: a fix to one would have missed the other silently.\n *\n * Unparseable input yields `{}` rather than throwing, because a mapper's job is to classify a\n * failure that already happened; failing to read the body is not a second failure to report.\n */\nexport function parseErrorBody<T>(body: unknown): T {\n if (body !== null && typeof body === \"object\") return body as T;\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body) as T;\n } catch {\n return {} as T;\n }\n }\n return {} as T;\n}\n","/**\n * OpenAI-compatible HTTP error mapper (ADR D67).\n *\n * Translates OpenAI-shaped API error responses (covers OpenAI, OpenRouter,\n * DeepSeek, Together, Mistral, Voyage, DeepInfra, etc.) into typed\n * `TheokitAgentError` subclasses with full `ErrorMetadata`.\n *\n * Body inspection: looks at `body.error.code` / `body.error.type` to detect\n * `context_too_long`, `content_filtered`, `model_unavailable` semantics, and at\n * `body.error.message` for a 404 that says no endpoint serves the model\n * (OpenRouter's numeric-code body for a retired model id).\n * Falls back to status-based mapping when body doesn't expose `.error`\n * (e.g., HTML server error page, DeepInfra's `{message: \"...\"}` shape).\n *\n * Never throws — caller is already in an error path.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n type ErrorCode,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata, httpStatusToErrorCode } from \"./shared.js\";\n\ninterface MapOpenAiErrorArgs {\n providerId: string;\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\nexport function mapOpenAICompatibleError(args: MapOpenAiErrorArgs): TheokitAgentError {\n const { providerId, status, body, headers, endpoint } = args;\n const code = mapOpenAiStatusToCode(status, body);\n const message = formatMessage(providerId, status, code);\n const metadata = buildErrorMetadata({\n provider: providerId,\n endpoint,\n code,\n status,\n headers,\n body,\n });\n\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, { code: `${providerId}_auth_failed`, metadata });\n }\n if (status === 429) {\n return new RateLimitError(message, { code: `${providerId}_rate_limit`, metadata });\n }\n if (status === 404 && code === \"model_unavailable\") {\n // The model id lives only in the provider's text, so this case carries it.\n const detailed = formatMessage(providerId, status, code, extractOpenAiErrorMessage(body));\n return new ConfigurationError(detailed, {\n code: `${providerId}_model_unavailable`,\n metadata,\n });\n }\n if (status === 400) {\n return new ConfigurationError(message, { code: `${providerId}_${code}`, metadata });\n }\n if (status === 408) {\n return new NetworkError(message, { code: `${providerId}_timeout`, metadata });\n }\n if (status >= 500 && status < 600) {\n return new NetworkError(message, { code: `${providerId}_server_error`, metadata });\n }\n return new UnknownAgentError(message, { code: `${providerId}_unknown`, metadata });\n}\n\nfunction extractOpenAiErrorCode(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") return undefined;\n const err = (body as { error?: { code?: unknown; type?: unknown } }).error;\n if (err === undefined || err === null) return undefined;\n if (typeof err.code === \"string\") return err.code;\n if (typeof err.type === \"string\") return err.type;\n return undefined;\n}\n\nfunction extractOpenAiErrorMessage(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") return undefined;\n const err = (body as { error?: { message?: unknown } }).error;\n if (err === undefined || err === null) return undefined;\n return typeof err.message === \"string\" ? err.message : undefined;\n}\n\n// OpenRouter answers a model it does not serve with HTTP 404 and a numeric `error.code`,\n// so only the message tells it apart from a 404 for a wrong path (measured 2026-10-20).\nconst MISSING_MODEL_MESSAGE = /no endpoints found/i;\n\nfunction mapOpenAiStatusToCode(status: number, body: unknown): ErrorCode {\n const fromBodyCode = classifyOpenAiBodyCode(extractOpenAiErrorCode(body)?.toLowerCase() ?? \"\");\n if (fromBodyCode !== undefined) return fromBodyCode;\n if (isMissingModel404(status, body)) return \"model_unavailable\";\n\n // Everything below the body dialect is RFC 9110 and lives once, in shared.ts.\n return httpStatusToErrorCode(status);\n}\n\nfunction isMissingModel404(status: number, body: unknown): boolean {\n return status === 404 && MISSING_MODEL_MESSAGE.test(extractOpenAiErrorMessage(body) ?? \"\");\n}\n\n// The body dialect, in precedence order: the first rule whose fragment appears in the\n// lowercased body code wins.\nconst BODY_CODE_RULES: ReadonlyArray<{ fragments: readonly string[]; code: ErrorCode }> = [\n {\n fragments: [\"context_length\", \"context_window\", \"too_many_tokens\", \"max_tokens\"],\n code: \"context_too_long\",\n },\n { fragments: [\"content_filter\", \"content_policy\", \"safety\"], code: \"content_filtered\" },\n {\n fragments: [\"model_not_found\", \"model_unavailable\", \"invalid_model\"],\n code: \"model_unavailable\",\n },\n // T3.7 — OpenRouter \"Insufficient credits\" / `insufficient_quota` in the BODY.\n // The status-402 half of this rule moved to the shared ladder, where it now\n // reaches all four mappers instead of this one; what stays here is the part\n // that is genuinely a body dialect.\n { fragments: [\"insufficient_quota\", \"quota_exceeded\"], code: \"quota_exceeded\" },\n];\n\nfunction classifyOpenAiBodyCode(rawCode: string): ErrorCode | undefined {\n const rule = BODY_CODE_RULES.find(({ fragments }) =>\n fragments.some((fragment) => rawCode.includes(fragment)),\n );\n return rule?.code;\n}\n\nfunction formatMessage(\n providerId: string,\n status: number,\n code: ErrorCode,\n detail?: string,\n): string {\n const base = `${providerId} API error: ${code} (HTTP ${status})`;\n return detail === undefined || detail === \"\" ? base : `${base}: ${detail}`;\n}\n"]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var chunkCQYBJOB2_cjs = require('./chunk-CQYBJOB2.cjs');
4
4
  var chunkYJNYDJ2T_cjs = require('./chunk-YJNYDJ2T.cjs');
5
- var chunkWPO3VCY4_cjs = require('./chunk-WPO3VCY4.cjs');
5
+ var chunkN7KS3TIR_cjs = require('./chunk-N7KS3TIR.cjs');
6
6
  var chunkQOGNZMHD_cjs = require('./chunk-QOGNZMHD.cjs');
7
7
  var chunkYSTXFWQE_cjs = require('./chunk-YSTXFWQE.cjs');
8
8
  var chunkFRITRLZQ_cjs = require('./chunk-FRITRLZQ.cjs');
@@ -120,7 +120,7 @@ function mapAnthropicError(args) {
120
120
  const { status, body, headers, endpoint } = args;
121
121
  const code = mapAnthropicStatusToCode(status, body);
122
122
  const message = formatMessage(status, code);
123
- const metadata = chunkWPO3VCY4_cjs.buildErrorMetadata({
123
+ const metadata = chunkN7KS3TIR_cjs.buildErrorMetadata({
124
124
  provider: "anthropic",
125
125
  endpoint,
126
126
  code,
@@ -159,7 +159,7 @@ function mapAnthropicStatusToCode(status, body) {
159
159
  }
160
160
  return "invalid_request";
161
161
  }
162
- return chunkWPO3VCY4_cjs.httpStatusToErrorCode(status);
162
+ return chunkN7KS3TIR_cjs.httpStatusToErrorCode(status);
163
163
  }
164
164
  function formatMessage(status, code) {
165
165
  return `Anthropic API error: ${code} (HTTP ${status})`;
@@ -741,10 +741,10 @@ function classifyBedrockError(args, awsType, message) {
741
741
  return "invalid_request";
742
742
  }
743
743
  if (awsType.includes("Timeout")) return "timeout";
744
- return chunkWPO3VCY4_cjs.httpStatusToErrorCode(args.status);
744
+ return chunkN7KS3TIR_cjs.httpStatusToErrorCode(args.status);
745
745
  }
746
746
  function buildBedrockMetadata(args, code) {
747
- return chunkWPO3VCY4_cjs.buildErrorMetadata({
747
+ return chunkN7KS3TIR_cjs.buildErrorMetadata({
748
748
  provider: "bedrock",
749
749
  endpoint: args.endpoint,
750
750
  code,
@@ -754,7 +754,7 @@ function buildBedrockMetadata(args, code) {
754
754
  });
755
755
  }
756
756
  function mapBedrockError(args) {
757
- const parsed = chunkWPO3VCY4_cjs.parseErrorBody(args.body);
757
+ const parsed = chunkN7KS3TIR_cjs.parseErrorBody(args.body);
758
758
  const awsType = parsed.__type ?? "";
759
759
  const message = parsed.message ?? parsed.Message ?? "Bedrock request failed";
760
760
  const code = classifyBedrockError(args, awsType, message);
@@ -788,7 +788,7 @@ async function resolveBedrockToken(region) {
788
788
  return cachedToken.value;
789
789
  }
790
790
  try {
791
- const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-BZKF7TXX.cjs', document.baseURI).href)));
791
+ const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-P5N3Q2NH.cjs', document.baseURI).href)));
792
792
  const gen = r("@aws/bedrock-token-generator");
793
793
  if (typeof gen.getToken !== "function") return void 0;
794
794
  const providers = r("@aws-sdk/credential-providers");
@@ -880,7 +880,7 @@ var FaultInjectingLlmClient = class {
880
880
  return yield* this.inner.stream(request, signal);
881
881
  }
882
882
  if (parsed.status >= 400) {
883
- throw chunkWPO3VCY4_cjs.mapOpenAICompatibleError({
883
+ throw chunkN7KS3TIR_cjs.mapOpenAICompatibleError({
884
884
  providerId: this.name,
885
885
  status: parsed.status,
886
886
  body: parsed.body,
@@ -955,7 +955,7 @@ function mapOllamaTransportError(args) {
955
955
  if (args.providerId !== "ollama") return void 0;
956
956
  const causeCode = extractCauseCode(args.cause);
957
957
  if (causeCode !== "ECONNREFUSED" && causeCode !== "ENOTFOUND") return void 0;
958
- const metadata = chunkWPO3VCY4_cjs.buildErrorMetadata({
958
+ const metadata = chunkN7KS3TIR_cjs.buildErrorMetadata({
959
959
  provider: "ollama",
960
960
  endpoint: args.endpoint,
961
961
  code: "network",
@@ -973,7 +973,7 @@ function mapOllamaHttpError(args) {
973
973
  const errString = extractErrorString(args.body).toLowerCase();
974
974
  if (args.status === 404 && errString.includes("not found") && errString.includes("pull")) {
975
975
  const modelHint = extractModelName(errString);
976
- const metadata = chunkWPO3VCY4_cjs.buildErrorMetadata({
976
+ const metadata = chunkN7KS3TIR_cjs.buildErrorMetadata({
977
977
  provider: "ollama",
978
978
  endpoint: args.endpoint,
979
979
  code: "model_unavailable",
@@ -988,7 +988,7 @@ function mapOllamaHttpError(args) {
988
988
  );
989
989
  }
990
990
  if (args.status === 503 && errString.includes("model is loading")) {
991
- const metadata = chunkWPO3VCY4_cjs.buildErrorMetadata({
991
+ const metadata = chunkN7KS3TIR_cjs.buildErrorMetadata({
992
992
  provider: "ollama",
993
993
  endpoint: args.endpoint,
994
994
  code: "server_error",
@@ -1075,7 +1075,7 @@ var OllamaNativeClient = class {
1075
1075
  endpoint: "/api/chat"
1076
1076
  });
1077
1077
  if (mapped !== void 0) throw mapped;
1078
- throw chunkWPO3VCY4_cjs.mapOpenAICompatibleError({
1078
+ throw chunkN7KS3TIR_cjs.mapOpenAICompatibleError({
1079
1079
  providerId: "ollama",
1080
1080
  status: response.status,
1081
1081
  body: bodyJson,
@@ -1734,7 +1734,7 @@ var OpenAIClient = class {
1734
1734
  endpoint: "/v1/chat/completions"
1735
1735
  });
1736
1736
  if (ollamaMapped !== void 0) throw ollamaMapped;
1737
- throw chunkWPO3VCY4_cjs.mapOpenAICompatibleError({
1737
+ throw chunkN7KS3TIR_cjs.mapOpenAICompatibleError({
1738
1738
  providerId,
1739
1739
  status: response.status,
1740
1740
  body,
@@ -1770,7 +1770,7 @@ var OpenAIClient = class {
1770
1770
  }
1771
1771
  if (chunk.error !== void 0 && chunk.error !== null) {
1772
1772
  const status = typeof chunk.error.code === "number" ? chunk.error.code : 502;
1773
- throw chunkWPO3VCY4_cjs.mapOpenAICompatibleError({
1773
+ throw chunkN7KS3TIR_cjs.mapOpenAICompatibleError({
1774
1774
  providerId,
1775
1775
  status,
1776
1776
  body: chunk,
@@ -2454,7 +2454,7 @@ var ResponsesApiClient = class {
2454
2454
  body = JSON.parse(text);
2455
2455
  } catch {
2456
2456
  }
2457
- return chunkWPO3VCY4_cjs.mapOpenAICompatibleError({
2457
+ return chunkN7KS3TIR_cjs.mapOpenAICompatibleError({
2458
2458
  providerId,
2459
2459
  status: response.status,
2460
2460
  body,
@@ -2490,7 +2490,7 @@ var ResponsesApiClient = class {
2490
2490
  const failure = ResponsesStreamAccumulator.failureMessage(event);
2491
2491
  if (failure !== void 0) {
2492
2492
  yield { type: "error", message: failure };
2493
- throw chunkWPO3VCY4_cjs.mapOpenAICompatibleError({
2493
+ throw chunkN7KS3TIR_cjs.mapOpenAICompatibleError({
2494
2494
  providerId,
2495
2495
  status: 502,
2496
2496
  body: { error: { message: failure } },
@@ -2604,11 +2604,11 @@ function classifyVertexError(args, errStatus) {
2604
2604
  for (const rule of VERTEX_RULES) {
2605
2605
  if (rule.test(args.status, errStatus)) return rule.code;
2606
2606
  }
2607
- const shared = chunkWPO3VCY4_cjs.httpStatusToErrorCode(args.status);
2607
+ const shared = chunkN7KS3TIR_cjs.httpStatusToErrorCode(args.status);
2608
2608
  return shared === "auth_failed" ? "auth_permission" : shared;
2609
2609
  }
2610
2610
  function vertexMetadata(args, code) {
2611
- return chunkWPO3VCY4_cjs.buildErrorMetadata({
2611
+ return chunkN7KS3TIR_cjs.buildErrorMetadata({
2612
2612
  provider: "vertex",
2613
2613
  endpoint: args.endpoint,
2614
2614
  code,
@@ -2640,7 +2640,7 @@ var VERTEX_ERROR_BUILDERS = {
2640
2640
  unknown: (args, msg) => new chunkUNFBHV46_cjs.UnknownAgentError(`Vertex unknown: ${msg}`, { metadata: vertexMetadata(args, "unknown") })
2641
2641
  };
2642
2642
  function mapVertexError(args) {
2643
- const parsed = chunkWPO3VCY4_cjs.parseErrorBody(args.body);
2643
+ const parsed = chunkN7KS3TIR_cjs.parseErrorBody(args.body);
2644
2644
  const errStatus = parsed.error?.status ?? "";
2645
2645
  const message = parsed.error?.message ?? "Vertex request failed";
2646
2646
  const code = classifyVertexError(args, errStatus);
@@ -2662,7 +2662,7 @@ async function resolveVertexAccessToken() {
2662
2662
  async function getAuthClientOrThrow() {
2663
2663
  let mod;
2664
2664
  try {
2665
- const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-BZKF7TXX.cjs', document.baseURI).href)));
2665
+ const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-P5N3Q2NH.cjs', document.baseURI).href)));
2666
2666
  mod = r("google-auth-library");
2667
2667
  } catch (err) {
2668
2668
  const isModuleMissing = err instanceof Error && (err.message.includes("Cannot find module") || err.code === "MODULE_NOT_FOUND");
@@ -3471,5 +3471,5 @@ exports.shouldUseFixtureMode = shouldUseFixtureMode;
3471
3471
  exports.shouldUseRealLocalRuntime = shouldUseRealLocalRuntime;
3472
3472
  exports.tryFirstEvent = tryFirstEvent;
3473
3473
  exports.validateApiKeyShape = validateApiKeyShape;
3474
- //# sourceMappingURL=chunk-BZKF7TXX.cjs.map
3475
- //# sourceMappingURL=chunk-BZKF7TXX.cjs.map
3474
+ //# sourceMappingURL=chunk-P5N3Q2NH.cjs.map
3475
+ //# sourceMappingURL=chunk-P5N3Q2NH.cjs.map