@cuylabs/agent-core 0.6.0 → 0.8.0

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 (74) hide show
  1. package/README.md +5 -1
  2. package/dist/{builder-BKkipazh.d.ts → builder-UpOWQMW3.d.ts} +2 -2
  3. package/dist/{chunk-3C4VKG4P.js → chunk-4BDA7DQY.js} +273 -807
  4. package/dist/chunk-7VKQ4WPB.js +73 -0
  5. package/dist/chunk-BFM2YHNM.js +222 -0
  6. package/dist/chunk-CAA7FHIH.js +280 -0
  7. package/dist/chunk-KUVSERLJ.js +50 -0
  8. package/dist/chunk-N6HWIEEA.js +423 -0
  9. package/dist/chunk-N7P4PN3O.js +84 -0
  10. package/dist/{chunk-QWFMX226.js → chunk-RFEKJKTO.js} +252 -13
  11. package/dist/chunk-RZITT45F.js +202 -0
  12. package/dist/{chunk-X635CM2F.js → chunk-SQU2AJHO.js} +1 -1
  13. package/dist/chunk-VNQBHPCT.js +398 -0
  14. package/dist/{chunk-QAQADS4X.js → chunk-WWYYNWEW.js} +2 -1
  15. package/dist/{chunk-O2ZCFQL6.js → chunk-YSLSEQ6B.js} +105 -220
  16. package/dist/context/index.js +1 -1
  17. package/dist/errors/index.d.ts +11 -0
  18. package/dist/errors/index.js +16 -0
  19. package/dist/events-CE72w8W4.d.ts +149 -0
  20. package/dist/host/index.d.ts +45 -0
  21. package/dist/host/index.js +8 -0
  22. package/dist/{index-DZQJD_hp.d.ts → index-CWSchSql.d.ts} +42 -51
  23. package/dist/index.d.ts +98 -190
  24. package/dist/index.js +476 -939
  25. package/dist/inference/index.d.ts +62 -0
  26. package/dist/inference/index.js +27 -0
  27. package/dist/llm-error-D93FNNLY.d.ts +32 -0
  28. package/dist/middleware/index.d.ts +246 -5
  29. package/dist/middleware/index.js +7 -3
  30. package/dist/models/index.d.ts +226 -3
  31. package/dist/models/index.js +41 -3
  32. package/dist/presets/index.d.ts +53 -0
  33. package/dist/presets/index.js +28 -0
  34. package/dist/prompt/index.d.ts +12 -7
  35. package/dist/reasoning/index.d.ts +53 -8
  36. package/dist/reasoning/index.js +2 -7
  37. package/dist/{registry-CuRWWtcT.d.ts → registry-DwYqsQkX.d.ts} +1 -1
  38. package/dist/{runner-G1wxEgac.d.ts → runner-e2YRcUoX.d.ts} +82 -148
  39. package/dist/runtime/index.d.ts +44 -7
  40. package/dist/runtime/index.js +16 -5
  41. package/dist/safety/index.d.ts +38 -0
  42. package/dist/safety/index.js +12 -0
  43. package/dist/scope/index.d.ts +10 -0
  44. package/dist/scope/index.js +14 -0
  45. package/dist/{session-manager-Uawm2Le7.d.ts → session-manager-B_CWGTsl.d.ts} +1 -1
  46. package/dist/signal/index.d.ts +28 -0
  47. package/dist/signal/index.js +6 -0
  48. package/dist/skill/index.d.ts +8 -5
  49. package/dist/storage/index.d.ts +2 -2
  50. package/dist/sub-agent/index.d.ts +17 -8
  51. package/dist/tool/index.d.ts +9 -4
  52. package/dist/tool/index.js +4 -3
  53. package/dist/tool-BHbyUAy3.d.ts +150 -0
  54. package/dist/{tool-DYp6-cC3.d.ts → tool-DLXAR9Ce.d.ts} +5 -99
  55. package/dist/tracking/index.d.ts +3 -1
  56. package/dist/{tool-pFAnJc5Y.d.ts → types-BfNpU8NS.d.ts} +1 -150
  57. package/dist/types-BnpEOYV-.d.ts +50 -0
  58. package/dist/types-CHiPh8U2.d.ts +100 -0
  59. package/dist/types-CQL-SvTn.d.ts +29 -0
  60. package/dist/types-CWm-7rvB.d.ts +55 -0
  61. package/dist/types-KKDrdU9Y.d.ts +325 -0
  62. package/dist/{resolver-DOfZ-xuk.d.ts → types-QA4WhEfz.d.ts} +1 -117
  63. package/dist/types-QKHHQLLq.d.ts +336 -0
  64. package/dist/types-YuWV4ag7.d.ts +72 -0
  65. package/package.json +74 -8
  66. package/dist/capabilities/index.d.ts +0 -97
  67. package/dist/capabilities/index.js +0 -46
  68. package/dist/chunk-6TDTQJ4P.js +0 -116
  69. package/dist/chunk-FG4MD5MU.js +0 -54
  70. package/dist/config-D2xeGEHK.d.ts +0 -52
  71. package/dist/identifiers-BLUxFqV_.d.ts +0 -12
  72. package/dist/index-ipP3_ztp.d.ts +0 -198
  73. package/dist/network-D76DS5ot.d.ts +0 -5
  74. package/dist/types-BWo810L_.d.ts +0 -648
@@ -3,7 +3,183 @@ import {
3
3
  getProviderId
4
4
  } from "./chunk-DWYX7ASF.js";
5
5
 
6
- // src/capabilities/types.ts
6
+ // src/models/resolver.ts
7
+ function parseKey(input) {
8
+ const [engineId, ...rest] = input.split("/");
9
+ if (!engineId || rest.length === 0) return null;
10
+ return { engineId, modelId: rest.join("/") };
11
+ }
12
+ function mergeSettings(base, override) {
13
+ return {
14
+ apiKey: override?.apiKey ?? base?.apiKey,
15
+ baseUrl: override?.baseUrl ?? base?.baseUrl,
16
+ headers: {
17
+ ...base?.headers ?? {},
18
+ ...override?.headers ?? {}
19
+ },
20
+ extra: {
21
+ ...base?.extra ?? {},
22
+ ...override?.extra ?? {}
23
+ }
24
+ };
25
+ }
26
+ function settingsKey(settings, adapter, engineId) {
27
+ return JSON.stringify({
28
+ engineId,
29
+ adapter,
30
+ apiKey: settings.apiKey ?? "",
31
+ baseUrl: settings.baseUrl ?? "",
32
+ headers: settings.headers ?? {},
33
+ extra: settings.extra ?? {}
34
+ });
35
+ }
36
+ function buildOptions(settings) {
37
+ const opts = { ...settings.extra ?? {} };
38
+ if (settings.apiKey) opts.apiKey = settings.apiKey;
39
+ if (settings.baseUrl) opts.baseURL = settings.baseUrl;
40
+ if (settings.headers && Object.keys(settings.headers).length > 0) opts.headers = settings.headers;
41
+ return opts;
42
+ }
43
+ async function createFactory(adapter, settings) {
44
+ const asModel = (m) => m;
45
+ const opts = buildOptions(settings);
46
+ switch (adapter) {
47
+ case "openai": {
48
+ const { createOpenAI } = await import("@ai-sdk/openai").catch(() => {
49
+ throw new Error(
50
+ `Provider "@ai-sdk/openai" is required for the "openai" adapter. Install it with: pnpm add @ai-sdk/openai`
51
+ );
52
+ });
53
+ const provider = createOpenAI(opts);
54
+ return (modelId) => provider.languageModel(modelId);
55
+ }
56
+ case "anthropic": {
57
+ const { createAnthropic } = await import("@ai-sdk/anthropic").catch(() => {
58
+ throw new Error(
59
+ `Provider "@ai-sdk/anthropic" is required for the "anthropic" adapter. Install it with: pnpm add @ai-sdk/anthropic`
60
+ );
61
+ });
62
+ const provider = createAnthropic(opts);
63
+ return (modelId) => provider.languageModel(modelId);
64
+ }
65
+ case "google": {
66
+ const { createGoogleGenerativeAI } = await import("@ai-sdk/google").catch(() => {
67
+ throw new Error(
68
+ `Provider "@ai-sdk/google" is required for the "google" adapter. Install it with: pnpm add @ai-sdk/google`
69
+ );
70
+ });
71
+ const provider = createGoogleGenerativeAI(opts);
72
+ return (modelId) => asModel(provider.languageModel(modelId));
73
+ }
74
+ case "openai-compatible": {
75
+ const { createOpenAICompatible } = await import("@ai-sdk/openai-compatible").catch(() => {
76
+ throw new Error(
77
+ `Provider "@ai-sdk/openai-compatible" is required for the "openai-compatible" adapter. Install it with: pnpm add @ai-sdk/openai-compatible`
78
+ );
79
+ });
80
+ const provider = createOpenAICompatible({
81
+ name: opts.name ?? "custom",
82
+ baseURL: opts.baseURL ?? "",
83
+ ...opts.apiKey ? { apiKey: opts.apiKey } : {},
84
+ ...opts.headers ? { headers: opts.headers } : {}
85
+ });
86
+ return (modelId) => provider.languageModel(modelId);
87
+ }
88
+ case "openrouter": {
89
+ const { createOpenRouter } = await import("@openrouter/ai-sdk-provider").catch(() => {
90
+ throw new Error(
91
+ `Provider "@openrouter/ai-sdk-provider" is required for the "openrouter" adapter. Install it with: pnpm add @openrouter/ai-sdk-provider`
92
+ );
93
+ });
94
+ const provider = createOpenRouter(opts);
95
+ return (modelId) => asModel(provider.languageModel(modelId));
96
+ }
97
+ case "azure": {
98
+ const { createAzure } = await import("@ai-sdk/azure").catch(() => {
99
+ throw new Error(
100
+ `Provider "@ai-sdk/azure" is required for the "azure" adapter. Install it with: pnpm add @ai-sdk/azure`
101
+ );
102
+ });
103
+ const provider = createAzure(opts);
104
+ return (modelId) => provider.languageModel(modelId);
105
+ }
106
+ case "bedrock": {
107
+ const { createAmazonBedrock } = await import("@ai-sdk/amazon-bedrock").catch(() => {
108
+ throw new Error(
109
+ `Provider "@ai-sdk/amazon-bedrock" is required for the "bedrock" adapter. Install it with: pnpm add @ai-sdk/amazon-bedrock`
110
+ );
111
+ });
112
+ const provider = createAmazonBedrock(opts);
113
+ return (modelId) => provider.languageModel(modelId);
114
+ }
115
+ case "vertex": {
116
+ const { createVertex } = await import("@ai-sdk/google-vertex").catch(() => {
117
+ throw new Error(
118
+ `Provider "@ai-sdk/google-vertex" is required for the "vertex" adapter. Install it with: pnpm add @ai-sdk/google-vertex`
119
+ );
120
+ });
121
+ const provider = createVertex(opts);
122
+ return (modelId) => asModel(provider.languageModel(modelId));
123
+ }
124
+ case "xai": {
125
+ const { createXai } = await import("@ai-sdk/xai").catch(() => {
126
+ throw new Error(
127
+ `Provider "@ai-sdk/xai" is required for the "xai" adapter. Install it with: pnpm add @ai-sdk/xai`
128
+ );
129
+ });
130
+ const provider = createXai(opts);
131
+ return (modelId) => provider.languageModel(modelId);
132
+ }
133
+ case "mistral": {
134
+ const { createMistral } = await import("@ai-sdk/mistral").catch(() => {
135
+ throw new Error(
136
+ `Provider "@ai-sdk/mistral" is required for the "mistral" adapter. Install it with: pnpm add @ai-sdk/mistral`
137
+ );
138
+ });
139
+ const provider = createMistral(opts);
140
+ return (modelId) => provider.languageModel(modelId);
141
+ }
142
+ case "groq": {
143
+ const { createGroq } = await import("@ai-sdk/groq").catch(() => {
144
+ throw new Error(
145
+ `Provider "@ai-sdk/groq" is required for the "groq" adapter. Install it with: pnpm add @ai-sdk/groq`
146
+ );
147
+ });
148
+ const provider = createGroq(opts);
149
+ return (modelId) => provider.languageModel(modelId);
150
+ }
151
+ default:
152
+ throw new Error(`No factory registered for adapter: ${adapter}`);
153
+ }
154
+ }
155
+ function createResolver(directory) {
156
+ const factoryCache = /* @__PURE__ */ new Map();
157
+ return async (key) => {
158
+ const parsed = parseKey(key);
159
+ const entry = parsed ? void 0 : directory.entries?.[key];
160
+ const engineId = parsed?.engineId ?? entry?.engine;
161
+ const modelId = parsed?.modelId ?? entry?.id;
162
+ if (!engineId || !modelId) {
163
+ throw new Error(`Unknown model reference: ${key}`);
164
+ }
165
+ const engine = directory.engines[engineId];
166
+ if (!engine) {
167
+ throw new Error(`Unknown engine: ${engineId}`);
168
+ }
169
+ const settings = mergeSettings(engine.settings, entry?.settings);
170
+ if (engine.build) {
171
+ return engine.build(modelId, settings);
172
+ }
173
+ const cacheKey2 = settingsKey(settings, engine.adapter, engineId);
174
+ const cached = factoryCache.get(cacheKey2);
175
+ if (cached) return cached(modelId);
176
+ const factory = await createFactory(engine.adapter, settings);
177
+ factoryCache.set(cacheKey2, factory);
178
+ return factory(modelId);
179
+ };
180
+ }
181
+
182
+ // src/models/types.ts
7
183
  var SourcePriority = /* @__PURE__ */ ((SourcePriority3) => {
8
184
  SourcePriority3[SourcePriority3["UserConfig"] = 0] = "UserConfig";
9
185
  SourcePriority3[SourcePriority3["LocalCache"] = 1] = "LocalCache";
@@ -23,7 +199,7 @@ var DEFAULT_RESOLVER_OPTIONS = {
23
199
  modelOverrides: {}
24
200
  };
25
201
 
26
- // src/capabilities/patterns.ts
202
+ // src/models/profiles.ts
27
203
  var REASONING_PATTERNS = [
28
204
  // OpenAI o-series
29
205
  {
@@ -110,6 +286,63 @@ var PROVIDER_PATTERNS = [
110
286
  { pattern: /^qwen/i, provider: "alibaba" },
111
287
  { pattern: /^command/i, provider: "cohere" }
112
288
  ];
289
+ var CONTEXT_WINDOW_PROFILES = [
290
+ // Anthropic Claude 4.x — 200k
291
+ { pattern: /claude[_-]?(opus|sonnet)[_-]?4/i, tokens: 2e5 },
292
+ // Anthropic Claude 3.5 — 200k
293
+ { pattern: /claude[_-]?3[._-]?5/i, tokens: 2e5 },
294
+ // Anthropic Claude 3 Opus/Sonnet/Haiku — 200k
295
+ { pattern: /claude[_-]?3/i, tokens: 2e5 },
296
+ // Anthropic Claude 2 — 100k
297
+ { pattern: /claude[_-]?2/i, tokens: 1e5 },
298
+ // OpenAI o-series (o1, o3, o4) — 200k
299
+ { pattern: /^o[134]-?(mini|pro|preview)?$/i, tokens: 2e5 },
300
+ // OpenAI GPT-5.x — 1M
301
+ { pattern: /gpt-?5/i, tokens: 1e6 },
302
+ // OpenAI GPT-4o — 128k
303
+ { pattern: /gpt-?4o/i, tokens: 128e3 },
304
+ // OpenAI GPT-4 turbo — 128k
305
+ { pattern: /gpt-?4[_-]?turbo/i, tokens: 128e3 },
306
+ // OpenAI GPT-4 — 8k (original)
307
+ { pattern: /gpt-?4(?!o|[_-]?turbo)/i, tokens: 8192 },
308
+ // OpenAI GPT-3.5 turbo — 16k
309
+ { pattern: /gpt-?3[._-]?5/i, tokens: 16384 },
310
+ // Google Gemini 2.5 Pro — 1M
311
+ { pattern: /gemini[_-]?2[._-]?5[_-]?pro/i, tokens: 1e6 },
312
+ // Google Gemini 2.x Flash — 1M
313
+ { pattern: /gemini[_-]?2.*flash/i, tokens: 1e6 },
314
+ // Google Gemini 2.x Pro — 1M
315
+ { pattern: /gemini[_-]?2[._-]?\d?[_-]?pro/i, tokens: 1e6 },
316
+ // Google Gemini 1.5 Pro/Flash — 1M
317
+ { pattern: /gemini[_-]?1[._-]?5/i, tokens: 1e6 },
318
+ // xAI Grok 3+ — 128k
319
+ { pattern: /grok[_-]?\d/i, tokens: 128e3 },
320
+ // Mistral Large — 128k
321
+ { pattern: /mistral[_-]?large/i, tokens: 128e3 },
322
+ // Mistral Medium — 32k
323
+ { pattern: /mistral[_-]?medium/i, tokens: 32768 },
324
+ // Codestral — 256k
325
+ { pattern: /codestral/i, tokens: 256e3 },
326
+ // Mistral generic — 32k
327
+ { pattern: /mistral|mixtral/i, tokens: 32768 },
328
+ // DeepSeek R1/V3 — 128k
329
+ { pattern: /deepseek/i, tokens: 128e3 },
330
+ // Qwen 3 — 128k
331
+ { pattern: /qwen/i, tokens: 128e3 },
332
+ // Meta Llama 3 — 128k
333
+ { pattern: /llama[_-]?3/i, tokens: 128e3 },
334
+ // Cohere Command R+ — 128k
335
+ { pattern: /command[_-]?r/i, tokens: 128e3 }
336
+ ];
337
+ function inferContextWindow(modelId) {
338
+ const normalized = modelId.toLowerCase();
339
+ for (const { pattern, tokens } of CONTEXT_WINDOW_PROFILES) {
340
+ if (pattern.test(normalized)) {
341
+ return tokens;
342
+ }
343
+ }
344
+ return void 0;
345
+ }
113
346
  function inferProvider(modelId) {
114
347
  const normalized = modelId.toLowerCase();
115
348
  for (const { pattern, provider } of PROVIDER_PATTERNS) {
@@ -160,7 +393,8 @@ var PatternCapabilitySource = class {
160
393
  provider: match.rule.provider || provider || "unknown",
161
394
  capabilities: {
162
395
  ...baseCapabilities,
163
- ...match.rule.capabilities
396
+ ...match.rule.capabilities,
397
+ contextWindow: inferContextWindow(modelId)
164
398
  },
165
399
  compatibility: match.rule.compatibility
166
400
  };
@@ -175,7 +409,10 @@ var PatternCapabilitySource = class {
175
409
  id: modelId,
176
410
  name: modelId,
177
411
  provider: provider || "unknown",
178
- capabilities: baseCapabilities
412
+ capabilities: {
413
+ ...baseCapabilities,
414
+ contextWindow: inferContextWindow(modelId)
415
+ }
179
416
  },
180
417
  source: this.priority,
181
418
  confident: false
@@ -194,7 +431,7 @@ function getProviderCompatibility(modelId, provider) {
194
431
  return match?.rule.compatibility;
195
432
  }
196
433
 
197
- // src/capabilities/overrides.ts
434
+ // src/models/overrides.ts
198
435
  function normalizeKey(value) {
199
436
  const trimmed = value?.trim();
200
437
  return trimmed && trimmed.length > 0 ? trimmed : void 0;
@@ -228,7 +465,7 @@ function applyCapabilityOverride(entry, override) {
228
465
  };
229
466
  }
230
467
 
231
- // src/capabilities/cache/adapters.ts
468
+ // src/models/cache/adapters.ts
232
469
  function isNodeEnvironment() {
233
470
  return typeof process !== "undefined" && process.versions != null && process.versions.node != null;
234
471
  }
@@ -325,7 +562,7 @@ function createCapabilityCacheAdapter(cachePath) {
325
562
  return new MemoryAdapter();
326
563
  }
327
564
 
328
- // src/capabilities/cache/types.ts
565
+ // src/models/cache/types.ts
329
566
  var CACHE_VERSION = 1;
330
567
  function cacheKey(modelId, provider) {
331
568
  return provider ? `${provider}:${modelId}` : modelId;
@@ -334,7 +571,7 @@ function isExpired(data) {
334
571
  return Date.now() > new Date(data.expiresAt).getTime();
335
572
  }
336
573
 
337
- // src/capabilities/cache/manager.ts
574
+ // src/models/cache/manager.ts
338
575
  var CapabilityCache = class {
339
576
  adapter;
340
577
  memoryCache = /* @__PURE__ */ new Map();
@@ -436,7 +673,7 @@ var CacheCapabilitySource = class {
436
673
  }
437
674
  };
438
675
 
439
- // src/capabilities/remote/network.ts
676
+ // src/models/remote/network.ts
440
677
  function hasBrowserNetworkAPI() {
441
678
  return typeof globalThis.navigator !== "undefined" && "onLine" in globalThis.navigator;
442
679
  }
@@ -509,7 +746,7 @@ async function fetchWithTimeout(url, timeoutMs) {
509
746
  }
510
747
  }
511
748
 
512
- // src/capabilities/remote/transform.ts
749
+ // src/models/remote/transform.ts
513
750
  function transformModelsDevEntry(raw) {
514
751
  const capabilities = {
515
752
  reasoning: raw.reasoning ?? false,
@@ -533,7 +770,7 @@ function transformModelsDevEntry(raw) {
533
770
  };
534
771
  }
535
772
 
536
- // src/capabilities/remote/fetcher.ts
773
+ // src/models/remote/fetcher.ts
537
774
  var RemoteCapabilityFetcher = class {
538
775
  apiUrl;
539
776
  timeoutMs;
@@ -592,7 +829,7 @@ var RemoteCapabilityFetcher = class {
592
829
  }
593
830
  };
594
831
 
595
- // src/capabilities/remote/source.ts
832
+ // src/models/remote/source.ts
596
833
  var RemoteCapabilitySource = class {
597
834
  priority = 4 /* RemoteAPI */;
598
835
  name = "Remote API (models.dev)";
@@ -659,7 +896,7 @@ var RemoteCapabilitySource = class {
659
896
  }
660
897
  };
661
898
 
662
- // src/capabilities/resolver.ts
899
+ // src/models/capability-resolver.ts
663
900
  function extractModelId(model) {
664
901
  return getModelId(model);
665
902
  }
@@ -858,8 +1095,10 @@ function configureResolver(options) {
858
1095
  }
859
1096
 
860
1097
  export {
1098
+ createResolver,
861
1099
  SourcePriority,
862
1100
  DEFAULT_RESOLVER_OPTIONS,
1101
+ inferContextWindow,
863
1102
  inferProvider,
864
1103
  PatternCapabilitySource,
865
1104
  likelySupportsReasoning,
@@ -0,0 +1,202 @@
1
+ // src/errors/classify.ts
2
+ function isRetryableCategory(category) {
3
+ switch (category) {
4
+ case "rate_limit":
5
+ case "overloaded":
6
+ case "network":
7
+ case "timeout":
8
+ return true;
9
+ case "auth":
10
+ case "invalid_request":
11
+ case "context_overflow":
12
+ case "content_filter":
13
+ case "cancelled":
14
+ case "unknown":
15
+ return false;
16
+ }
17
+ }
18
+ function classifyFromStatusAndMessage(status, message) {
19
+ const lowerMessage = message.toLowerCase();
20
+ if (status) {
21
+ if (status === 429) return "rate_limit";
22
+ if (status === 401 || status === 403) return "auth";
23
+ if (status === 400) {
24
+ if (lowerMessage.includes("context") || lowerMessage.includes("token")) {
25
+ return "context_overflow";
26
+ }
27
+ return "invalid_request";
28
+ }
29
+ if (status === 503 || status === 502) return "overloaded";
30
+ if (status >= 500) return "network";
31
+ }
32
+ if (lowerMessage.includes("rate") && lowerMessage.includes("limit")) {
33
+ return "rate_limit";
34
+ }
35
+ if (lowerMessage.includes("overload") || lowerMessage.includes("capacity")) {
36
+ return "overloaded";
37
+ }
38
+ if (lowerMessage.includes("too_many_requests")) {
39
+ return "rate_limit";
40
+ }
41
+ if (lowerMessage.includes("unauthorized") || lowerMessage.includes("invalid api key")) {
42
+ return "auth";
43
+ }
44
+ if (lowerMessage.includes("context") && lowerMessage.includes("length")) {
45
+ return "context_overflow";
46
+ }
47
+ if (lowerMessage.includes("content") && lowerMessage.includes("filter")) {
48
+ return "content_filter";
49
+ }
50
+ if (lowerMessage.includes("timeout") || lowerMessage.includes("timed out")) {
51
+ return "timeout";
52
+ }
53
+ if (lowerMessage.includes("network") || lowerMessage.includes("econnrefused") || lowerMessage.includes("econnreset")) {
54
+ return "network";
55
+ }
56
+ return "unknown";
57
+ }
58
+ function parseRetryDelay(headers) {
59
+ const retryAfterMs = headers["retry-after-ms"];
60
+ if (retryAfterMs) {
61
+ const parsed = parseFloat(retryAfterMs);
62
+ if (!Number.isNaN(parsed) && parsed > 0) {
63
+ return parsed;
64
+ }
65
+ }
66
+ const retryAfter = headers["retry-after"];
67
+ if (retryAfter) {
68
+ const seconds = parseFloat(retryAfter);
69
+ if (!Number.isNaN(seconds) && seconds > 0) {
70
+ return Math.ceil(seconds * 1e3);
71
+ }
72
+ const dateMs = Date.parse(retryAfter);
73
+ if (!Number.isNaN(dateMs)) {
74
+ const delayMs = dateMs - Date.now();
75
+ if (delayMs > 0) {
76
+ return Math.ceil(delayMs);
77
+ }
78
+ }
79
+ }
80
+ return void 0;
81
+ }
82
+
83
+ // src/errors/extract.ts
84
+ function extractFromAISDKError(error) {
85
+ const result = {};
86
+ const anyError = error;
87
+ if (typeof anyError.status === "number") {
88
+ result.status = anyError.status;
89
+ } else if (typeof anyError.statusCode === "number") {
90
+ result.status = anyError.statusCode;
91
+ }
92
+ if (anyError.responseHeaders && typeof anyError.responseHeaders === "object") {
93
+ result.headers = anyError.responseHeaders;
94
+ } else if (anyError.headers && typeof anyError.headers === "object") {
95
+ result.headers = anyError.headers;
96
+ }
97
+ if (anyError.data && typeof anyError.data === "object") {
98
+ const data = anyError.data;
99
+ if (data.type === "error" && typeof data.error === "object") {
100
+ const innerError = data.error;
101
+ if (innerError.type === "too_many_requests") {
102
+ result.category = "rate_limit";
103
+ } else if (innerError.type === "overloaded") {
104
+ result.category = "overloaded";
105
+ }
106
+ }
107
+ if (typeof data.isRetryable === "boolean" && !data.isRetryable && !result.category) {
108
+ result.category = "invalid_request";
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+
114
+ // src/errors/llm-error.ts
115
+ var LLMError = class _LLMError extends Error {
116
+ category;
117
+ status;
118
+ headers;
119
+ provider;
120
+ model;
121
+ isRetryable;
122
+ retryDelayMs;
123
+ constructor(options) {
124
+ super(options.message, { cause: options.cause });
125
+ this.name = "LLMError";
126
+ this.status = options.status;
127
+ this.headers = options.headers;
128
+ this.provider = options.provider;
129
+ this.model = options.model;
130
+ this.category = options.category ?? classifyFromStatusAndMessage(
131
+ options.status,
132
+ options.message
133
+ );
134
+ this.isRetryable = isRetryableCategory(this.category);
135
+ this.retryDelayMs = this.headers ? parseRetryDelay(this.headers) : void 0;
136
+ }
137
+ static from(error, context) {
138
+ if (error instanceof _LLMError) {
139
+ return error;
140
+ }
141
+ if (error instanceof Error) {
142
+ if (error.name === "AbortError" || error.message.includes("abort")) {
143
+ return new _LLMError({
144
+ message: error.message,
145
+ category: "cancelled",
146
+ cause: error,
147
+ ...context
148
+ });
149
+ }
150
+ return new _LLMError({
151
+ message: error.message,
152
+ cause: error,
153
+ ...extractFromAISDKError(error),
154
+ ...context
155
+ });
156
+ }
157
+ return new _LLMError({
158
+ message: String(error),
159
+ category: "unknown",
160
+ ...context
161
+ });
162
+ }
163
+ get description() {
164
+ const parts = [this.message];
165
+ if (this.provider) parts.unshift(`[${this.provider}]`);
166
+ if (this.status) parts.push(`(HTTP ${this.status})`);
167
+ if (this.isRetryable && this.retryDelayMs) {
168
+ parts.push(`retry in ${Math.ceil(this.retryDelayMs / 1e3)}s`);
169
+ }
170
+ return parts.join(" ");
171
+ }
172
+ };
173
+
174
+ // src/errors/utils.ts
175
+ function isRetryable(error) {
176
+ if (error instanceof LLMError) {
177
+ return error.isRetryable;
178
+ }
179
+ return LLMError.from(error).isRetryable;
180
+ }
181
+ function getRetryDelay(error) {
182
+ if (error instanceof LLMError) {
183
+ return error.isRetryable ? error.retryDelayMs : void 0;
184
+ }
185
+ const llmError = LLMError.from(error);
186
+ return llmError.isRetryable ? llmError.retryDelayMs : void 0;
187
+ }
188
+ function getErrorCategory(error) {
189
+ if (error instanceof LLMError) {
190
+ return error.category;
191
+ }
192
+ return LLMError.from(error).category;
193
+ }
194
+
195
+ export {
196
+ isRetryableCategory,
197
+ parseRetryDelay,
198
+ LLMError,
199
+ isRetryable,
200
+ getRetryDelay,
201
+ getErrorCategory
202
+ };
@@ -3,7 +3,7 @@ import {
3
3
  extractProvider,
4
4
  getDefaultResolver,
5
5
  likelySupportsReasoning
6
- } from "./chunk-QWFMX226.js";
6
+ } from "./chunk-RFEKJKTO.js";
7
7
 
8
8
  // src/reasoning/types.ts
9
9
  var STANDARD_LEVELS = ["off", "low", "medium", "high"];