@cuylabs/agent-core 0.7.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 (58) hide show
  1. package/dist/{builder-BRvqCcIk.d.ts → builder-UpOWQMW3.d.ts} +2 -2
  2. package/dist/{chunk-3HNO5SVI.js → chunk-4BDA7DQY.js} +3 -3
  3. package/dist/chunk-BFM2YHNM.js +222 -0
  4. package/dist/chunk-CAA7FHIH.js +280 -0
  5. package/dist/chunk-DWYX7ASF.js +26 -0
  6. package/dist/chunk-KUVSERLJ.js +50 -0
  7. package/dist/{chunk-5K7AQVOU.js → chunk-N6HWIEEA.js} +8 -204
  8. package/dist/{chunk-QGOGIP7T.js → chunk-RFEKJKTO.js} +131 -25
  9. package/dist/chunk-RZITT45F.js +202 -0
  10. package/dist/{chunk-ZPMACVZK.js → chunk-SQU2AJHO.js} +1 -1
  11. package/dist/{chunk-BNSHUWCV.js → chunk-WWYYNWEW.js} +1 -1
  12. package/dist/{chunk-CDTV2UYU.js → chunk-YSLSEQ6B.js} +52 -252
  13. package/dist/context/index.js +1 -1
  14. package/dist/errors/index.d.ts +11 -0
  15. package/dist/errors/index.js +16 -0
  16. package/dist/events-CE72w8W4.d.ts +149 -0
  17. package/dist/{index-C33hlD6H.d.ts → index-CWSchSql.d.ts} +36 -50
  18. package/dist/index.d.ts +36 -109
  19. package/dist/index.js +213 -396
  20. package/dist/inference/index.d.ts +10 -7
  21. package/dist/inference/index.js +7 -5
  22. package/dist/llm-error-D93FNNLY.d.ts +32 -0
  23. package/dist/middleware/index.d.ts +245 -7
  24. package/dist/middleware/index.js +3 -1
  25. package/dist/models/index.d.ts +125 -4
  26. package/dist/models/index.js +7 -3
  27. package/dist/presets/index.d.ts +53 -0
  28. package/dist/presets/index.js +28 -0
  29. package/dist/prompt/index.d.ts +10 -8
  30. package/dist/reasoning/index.d.ts +1 -2
  31. package/dist/reasoning/index.js +3 -7
  32. package/dist/{registry-BDLIHOQB.d.ts → registry-DwYqsQkX.d.ts} +1 -1
  33. package/dist/{runner-DSKaEz3z.d.ts → runner-e2YRcUoX.d.ts} +58 -151
  34. package/dist/runtime/index.d.ts +11 -8
  35. package/dist/runtime/index.js +9 -7
  36. package/dist/safety/index.d.ts +38 -0
  37. package/dist/safety/index.js +12 -0
  38. package/dist/scope/index.d.ts +2 -2
  39. package/dist/signal/index.d.ts +28 -0
  40. package/dist/signal/index.js +6 -0
  41. package/dist/skill/index.d.ts +7 -6
  42. package/dist/sub-agent/index.d.ts +14 -9
  43. package/dist/tool/index.d.ts +7 -5
  44. package/dist/tool/index.js +2 -2
  45. package/dist/tool-BHbyUAy3.d.ts +150 -0
  46. package/dist/{tool-HUtkiVBx.d.ts → tool-DLXAR9Ce.d.ts} +1 -1
  47. package/dist/tracking/index.d.ts +2 -2
  48. package/dist/{tool-Db1Ue-1U.d.ts → types-BfNpU8NS.d.ts} +1 -150
  49. package/dist/types-BnpEOYV-.d.ts +50 -0
  50. package/dist/{types-9jGQUjqW.d.ts → types-CQL-SvTn.d.ts} +1 -1
  51. package/dist/types-CWm-7rvB.d.ts +55 -0
  52. package/dist/{types-FRpzzg_9.d.ts → types-KKDrdU9Y.d.ts} +5 -35
  53. package/dist/{capability-resolver-CgRGsWVX.d.ts → types-QA4WhEfz.d.ts} +1 -117
  54. package/dist/{types-CqDZTh4d.d.ts → types-QKHHQLLq.d.ts} +5 -4
  55. package/dist/types-YuWV4ag7.d.ts +72 -0
  56. package/package.json +58 -3
  57. package/dist/index-CfBGYrpd.d.ts +0 -317
  58. package/dist/{chunk-IEFIQENH.js → chunk-7VKQ4WPB.js} +4 -4
@@ -1,12 +1,16 @@
1
- import {
2
- buildReasoningOptionsSync
3
- } from "./chunk-ZPMACVZK.js";
4
1
  import {
5
2
  executeAgentToolCall
6
- } from "./chunk-IEFIQENH.js";
3
+ } from "./chunk-7VKQ4WPB.js";
4
+ import {
5
+ buildReasoningOptionsSync
6
+ } from "./chunk-SQU2AJHO.js";
7
7
  import {
8
8
  snapshotScope
9
9
  } from "./chunk-N7P4PN3O.js";
10
+ import {
11
+ LLMError,
12
+ isRetryable
13
+ } from "./chunk-RZITT45F.js";
10
14
 
11
15
  // src/inference/toolset.ts
12
16
  import { tool, zodSchema } from "ai";
@@ -44,200 +48,6 @@ import {
44
48
  streamText
45
49
  } from "ai";
46
50
 
47
- // src/errors/classify.ts
48
- function isRetryableCategory(category) {
49
- switch (category) {
50
- case "rate_limit":
51
- case "overloaded":
52
- case "network":
53
- case "timeout":
54
- return true;
55
- case "auth":
56
- case "invalid_request":
57
- case "context_overflow":
58
- case "content_filter":
59
- case "cancelled":
60
- case "unknown":
61
- return false;
62
- }
63
- }
64
- function classifyFromStatusAndMessage(status, message) {
65
- const lowerMessage = message.toLowerCase();
66
- if (status) {
67
- if (status === 429) return "rate_limit";
68
- if (status === 401 || status === 403) return "auth";
69
- if (status === 400) {
70
- if (lowerMessage.includes("context") || lowerMessage.includes("token")) {
71
- return "context_overflow";
72
- }
73
- return "invalid_request";
74
- }
75
- if (status === 503 || status === 502) return "overloaded";
76
- if (status >= 500) return "network";
77
- }
78
- if (lowerMessage.includes("rate") && lowerMessage.includes("limit")) {
79
- return "rate_limit";
80
- }
81
- if (lowerMessage.includes("overload") || lowerMessage.includes("capacity")) {
82
- return "overloaded";
83
- }
84
- if (lowerMessage.includes("too_many_requests")) {
85
- return "rate_limit";
86
- }
87
- if (lowerMessage.includes("unauthorized") || lowerMessage.includes("invalid api key")) {
88
- return "auth";
89
- }
90
- if (lowerMessage.includes("context") && lowerMessage.includes("length")) {
91
- return "context_overflow";
92
- }
93
- if (lowerMessage.includes("content") && lowerMessage.includes("filter")) {
94
- return "content_filter";
95
- }
96
- if (lowerMessage.includes("timeout") || lowerMessage.includes("timed out")) {
97
- return "timeout";
98
- }
99
- if (lowerMessage.includes("network") || lowerMessage.includes("econnrefused") || lowerMessage.includes("econnreset")) {
100
- return "network";
101
- }
102
- return "unknown";
103
- }
104
- function parseRetryDelay(headers) {
105
- const retryAfterMs = headers["retry-after-ms"];
106
- if (retryAfterMs) {
107
- const parsed = parseFloat(retryAfterMs);
108
- if (!Number.isNaN(parsed) && parsed > 0) {
109
- return parsed;
110
- }
111
- }
112
- const retryAfter = headers["retry-after"];
113
- if (retryAfter) {
114
- const seconds = parseFloat(retryAfter);
115
- if (!Number.isNaN(seconds) && seconds > 0) {
116
- return Math.ceil(seconds * 1e3);
117
- }
118
- const dateMs = Date.parse(retryAfter);
119
- if (!Number.isNaN(dateMs)) {
120
- const delayMs = dateMs - Date.now();
121
- if (delayMs > 0) {
122
- return Math.ceil(delayMs);
123
- }
124
- }
125
- }
126
- return void 0;
127
- }
128
-
129
- // src/errors/extract.ts
130
- function extractFromAISDKError(error) {
131
- const result = {};
132
- const anyError = error;
133
- if (typeof anyError.status === "number") {
134
- result.status = anyError.status;
135
- } else if (typeof anyError.statusCode === "number") {
136
- result.status = anyError.statusCode;
137
- }
138
- if (anyError.responseHeaders && typeof anyError.responseHeaders === "object") {
139
- result.headers = anyError.responseHeaders;
140
- } else if (anyError.headers && typeof anyError.headers === "object") {
141
- result.headers = anyError.headers;
142
- }
143
- if (anyError.data && typeof anyError.data === "object") {
144
- const data = anyError.data;
145
- if (data.type === "error" && typeof data.error === "object") {
146
- const innerError = data.error;
147
- if (innerError.type === "too_many_requests") {
148
- result.category = "rate_limit";
149
- } else if (innerError.type === "overloaded") {
150
- result.category = "overloaded";
151
- }
152
- }
153
- if (typeof data.isRetryable === "boolean" && !data.isRetryable && !result.category) {
154
- result.category = "invalid_request";
155
- }
156
- }
157
- return result;
158
- }
159
-
160
- // src/errors/llm-error.ts
161
- var LLMError = class _LLMError extends Error {
162
- category;
163
- status;
164
- headers;
165
- provider;
166
- model;
167
- isRetryable;
168
- retryDelayMs;
169
- constructor(options) {
170
- super(options.message, { cause: options.cause });
171
- this.name = "LLMError";
172
- this.status = options.status;
173
- this.headers = options.headers;
174
- this.provider = options.provider;
175
- this.model = options.model;
176
- this.category = options.category ?? classifyFromStatusAndMessage(
177
- options.status,
178
- options.message
179
- );
180
- this.isRetryable = isRetryableCategory(this.category);
181
- this.retryDelayMs = this.headers ? parseRetryDelay(this.headers) : void 0;
182
- }
183
- static from(error, context) {
184
- if (error instanceof _LLMError) {
185
- return error;
186
- }
187
- if (error instanceof Error) {
188
- if (error.name === "AbortError" || error.message.includes("abort")) {
189
- return new _LLMError({
190
- message: error.message,
191
- category: "cancelled",
192
- cause: error,
193
- ...context
194
- });
195
- }
196
- return new _LLMError({
197
- message: error.message,
198
- cause: error,
199
- ...extractFromAISDKError(error),
200
- ...context
201
- });
202
- }
203
- return new _LLMError({
204
- message: String(error),
205
- category: "unknown",
206
- ...context
207
- });
208
- }
209
- get description() {
210
- const parts = [this.message];
211
- if (this.provider) parts.unshift(`[${this.provider}]`);
212
- if (this.status) parts.push(`(HTTP ${this.status})`);
213
- if (this.isRetryable && this.retryDelayMs) {
214
- parts.push(`retry in ${Math.ceil(this.retryDelayMs / 1e3)}s`);
215
- }
216
- return parts.join(" ");
217
- }
218
- };
219
-
220
- // src/errors/utils.ts
221
- function isRetryable(error) {
222
- if (error instanceof LLMError) {
223
- return error.isRetryable;
224
- }
225
- return LLMError.from(error).isRetryable;
226
- }
227
- function getRetryDelay(error) {
228
- if (error instanceof LLMError) {
229
- return error.isRetryable ? error.retryDelayMs : void 0;
230
- }
231
- const llmError = LLMError.from(error);
232
- return llmError.isRetryable ? llmError.retryDelayMs : void 0;
233
- }
234
- function getErrorCategory(error) {
235
- if (error instanceof LLMError) {
236
- return error.category;
237
- }
238
- return LLMError.from(error).category;
239
- }
240
-
241
51
  // src/retry.ts
242
52
  var DEFAULT_RETRY_CONFIG = {
243
53
  maxAttempts: 3,
@@ -596,12 +406,6 @@ var LLM = Inference;
596
406
 
597
407
  export {
598
408
  buildToolSet,
599
- isRetryableCategory,
600
- parseRetryDelay,
601
- LLMError,
602
- isRetryable,
603
- getRetryDelay,
604
- getErrorCategory,
605
409
  DEFAULT_RETRY_CONFIG,
606
410
  createRetryState,
607
411
  calculateDelay,
@@ -1,24 +1,7 @@
1
- // src/models/identifiers.ts
2
- function getModelId(model) {
3
- if (typeof model === "string") return model;
4
- if (typeof model === "object" && model !== null && "modelId" in model) {
5
- return String(model.modelId);
6
- }
7
- return String(model);
8
- }
9
- function getProviderId(model) {
10
- if (typeof model === "string") {
11
- if (model.includes("/")) {
12
- return model.split("/")[0];
13
- }
14
- return void 0;
15
- }
16
- if (typeof model === "object" && model !== null && "provider" in model) {
17
- const provider = String(model.provider);
18
- return provider.split(".")[0];
19
- }
20
- return void 0;
21
- }
1
+ import {
2
+ getModelId,
3
+ getProviderId
4
+ } from "./chunk-DWYX7ASF.js";
22
5
 
23
6
  // src/models/resolver.ts
24
7
  function parseKey(input) {
@@ -102,6 +85,69 @@ async function createFactory(adapter, settings) {
102
85
  });
103
86
  return (modelId) => provider.languageModel(modelId);
104
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
+ }
105
151
  default:
106
152
  throw new Error(`No factory registered for adapter: ${adapter}`);
107
153
  }
@@ -240,6 +286,63 @@ var PROVIDER_PATTERNS = [
240
286
  { pattern: /^qwen/i, provider: "alibaba" },
241
287
  { pattern: /^command/i, provider: "cohere" }
242
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
+ }
243
346
  function inferProvider(modelId) {
244
347
  const normalized = modelId.toLowerCase();
245
348
  for (const { pattern, provider } of PROVIDER_PATTERNS) {
@@ -290,7 +393,8 @@ var PatternCapabilitySource = class {
290
393
  provider: match.rule.provider || provider || "unknown",
291
394
  capabilities: {
292
395
  ...baseCapabilities,
293
- ...match.rule.capabilities
396
+ ...match.rule.capabilities,
397
+ contextWindow: inferContextWindow(modelId)
294
398
  },
295
399
  compatibility: match.rule.compatibility
296
400
  };
@@ -305,7 +409,10 @@ var PatternCapabilitySource = class {
305
409
  id: modelId,
306
410
  name: modelId,
307
411
  provider: provider || "unknown",
308
- capabilities: baseCapabilities
412
+ capabilities: {
413
+ ...baseCapabilities,
414
+ contextWindow: inferContextWindow(modelId)
415
+ }
309
416
  },
310
417
  source: this.priority,
311
418
  confident: false
@@ -988,11 +1095,10 @@ function configureResolver(options) {
988
1095
  }
989
1096
 
990
1097
  export {
991
- getModelId,
992
- getProviderId,
993
1098
  createResolver,
994
1099
  SourcePriority,
995
1100
  DEFAULT_RESOLVER_OPTIONS,
1101
+ inferContextWindow,
996
1102
  inferProvider,
997
1103
  PatternCapabilitySource,
998
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-QGOGIP7T.js";
6
+ } from "./chunk-RFEKJKTO.js";
7
7
 
8
8
  // src/reasoning/types.ts
9
9
  var STANDARD_LEVELS = ["off", "low", "medium", "high"];
@@ -30,7 +30,7 @@ function estimateConversationTokens(messages) {
30
30
  return total;
31
31
  }
32
32
 
33
- // src/types/agent/compaction.ts
33
+ // src/agent/types/compaction.ts
34
34
  var PRUNE_PROTECTED_TOOLS = ["skill"];
35
35
 
36
36
  // src/context/pruning.ts