@anvia/core 1.0.0-rc.5 → 1.0.0-rc.8

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 (109) hide show
  1. package/README.md +42 -9
  2. package/dist/agent/index.d.ts +20 -14
  3. package/dist/agent/index.js +15 -15
  4. package/dist/agent/interactions/index.d.ts +1 -1
  5. package/dist/agent/interactions/index.js +2 -2
  6. package/dist/{agent-LlCD_2UQ.d.ts → agent-XPQBM4rX.d.ts} +10 -10
  7. package/dist/{chunk-UBE4WH6G.js → chunk-3RWESPUG.js} +122 -3
  8. package/dist/chunk-3RWESPUG.js.map +1 -0
  9. package/dist/{chunk-BAEFBTOW.js → chunk-3SKZ2BKP.js} +7 -5
  10. package/dist/chunk-3SKZ2BKP.js.map +1 -0
  11. package/dist/{chunk-SROQA7I7.js → chunk-3XQGVDU5.js} +2 -2
  12. package/dist/chunk-3XQGVDU5.js.map +1 -0
  13. package/dist/{chunk-DNQNOHD5.js → chunk-5C6B6ZRH.js} +2 -2
  14. package/dist/{chunk-E5J4OY4K.js → chunk-6BBOCFHV.js} +2 -2
  15. package/dist/{chunk-7YAH2F3J.js → chunk-76JLMBVT.js} +24 -12
  16. package/dist/chunk-76JLMBVT.js.map +1 -0
  17. package/dist/chunk-7JLAIN6E.js +15 -0
  18. package/dist/chunk-7JLAIN6E.js.map +1 -0
  19. package/dist/chunk-7PHMK7W4.js +1516 -0
  20. package/dist/chunk-7PHMK7W4.js.map +1 -0
  21. package/dist/{chunk-MGNTXGTX.js → chunk-D4PACGPA.js} +1 -1
  22. package/dist/{chunk-7OCVDT2X.js → chunk-EFLT7XZD.js} +9 -3
  23. package/dist/chunk-EFLT7XZD.js.map +1 -0
  24. package/dist/{chunk-RZDI7B6Z.js → chunk-EMZKPRE6.js} +9 -8
  25. package/dist/chunk-EMZKPRE6.js.map +1 -0
  26. package/dist/{chunk-HVHTVGPP.js → chunk-I3Q7XSBB.js} +9 -3
  27. package/dist/chunk-I3Q7XSBB.js.map +1 -0
  28. package/dist/{chunk-YDJA4R37.js → chunk-LTXABCOO.js} +4 -4
  29. package/dist/{chunk-BEU6FCTN.js → chunk-OJBFDBLG.js} +2 -2
  30. package/dist/{chunk-G5OACQEI.js → chunk-QGX73TSQ.js} +2 -2
  31. package/dist/{chunk-JXZTTNCR.js → chunk-SJMSS5SI.js} +3 -3
  32. package/dist/{chunk-JXZTTNCR.js.map → chunk-SJMSS5SI.js.map} +1 -1
  33. package/dist/{chunk-YXLDR2O4.js → chunk-T2C3CGDQ.js} +9 -3
  34. package/dist/chunk-T2C3CGDQ.js.map +1 -0
  35. package/dist/{chunk-TEV3OB7N.js → chunk-X4LK4ODN.js} +10 -3
  36. package/dist/chunk-X4LK4ODN.js.map +1 -0
  37. package/dist/{chunk-FCANRQ5Q.js → chunk-YA2655FX.js} +308 -448
  38. package/dist/chunk-YA2655FX.js.map +1 -0
  39. package/dist/{chunk-H7BI3BSP.js → chunk-ZA564323.js} +2 -2
  40. package/dist/{client-DvUatElp.d.ts → client-DTPl0hZv.d.ts} +2 -2
  41. package/dist/completion/index.d.ts +3 -3
  42. package/dist/completion/index.js +12 -5
  43. package/dist/{dynamic-tools-AEBOTgu1.d.ts → dynamic-tools-aIZlg5x1.d.ts} +3 -3
  44. package/dist/embeddings/index.js +2 -2
  45. package/dist/evals/index.d.ts +6 -6
  46. package/dist/evals/index.js +51 -19
  47. package/dist/evals/index.js.map +1 -1
  48. package/dist/extractor/index.d.ts +1 -1
  49. package/dist/extractor/index.js +7 -6
  50. package/dist/guardrails/index.d.ts +4 -4
  51. package/dist/image-generation/index.d.ts +1 -1
  52. package/dist/image-generation/index.js +4 -2
  53. package/dist/index.d.ts +14 -14
  54. package/dist/index.js +25 -19
  55. package/dist/internal/agent.d.ts +11 -11
  56. package/dist/internal/agent.js +15 -15
  57. package/dist/mcp/index.d.ts +4 -4
  58. package/dist/mcp/index.js +10 -8
  59. package/dist/memory/index.d.ts +3 -3
  60. package/dist/memory/index.js +6 -5
  61. package/dist/{middleware-BqtLB_Xt.d.ts → middleware-kcF8AusP.d.ts} +8 -5
  62. package/dist/observability/index.d.ts +6 -6
  63. package/dist/observability/index.js +7 -6
  64. package/dist/pipeline/index.d.ts +11 -11
  65. package/dist/pipeline/index.js +8 -7
  66. package/dist/pipeline/index.js.map +1 -1
  67. package/dist/provider-output-error-BEwDgVv3.d.ts +99 -0
  68. package/dist/skills/index.d.ts +4 -4
  69. package/dist/skills/index.js +7 -8
  70. package/dist/speech-generation/index.d.ts +1 -1
  71. package/dist/speech-generation/index.js +4 -2
  72. package/dist/{text-C_6eKrbC.d.ts → text-ZLECpQE7.d.ts} +1 -1
  73. package/dist/{think-tool-Cz3QYNPX.d.ts → think-tool-BwCsJ365.d.ts} +1 -1
  74. package/dist/tool/index.d.ts +6 -6
  75. package/dist/tool/index.js +6 -6
  76. package/dist/{tool-r62gf3QY.d.ts → tool-BpqpoRSE.d.ts} +1 -1
  77. package/dist/transcription/index.d.ts +1 -1
  78. package/dist/transcription/index.js +4 -2
  79. package/dist/{types-C3gv9EX6.d.ts → types-CXNE592e.d.ts} +1 -1
  80. package/dist/{types-RT3cuyRk.d.ts → types-DC1U1XwW.d.ts} +1 -1
  81. package/dist/{types-DbolvLtZ.d.ts → types-DKOXVTcq.d.ts} +1 -1
  82. package/dist/{types-D9rKQ_as.d.ts → types-DgvozfPc.d.ts} +11 -3
  83. package/dist/{types-CIPaIbZo.d.ts → types-DhkodEft.d.ts} +1 -1
  84. package/dist/{types-1KpjDfoN.d.ts → types-Sue2hb_L.d.ts} +7 -5
  85. package/dist/vector-store/index.d.ts +4 -4
  86. package/dist/vector-store/index.js +5 -5
  87. package/package.json +1 -1
  88. package/dist/chunk-7OCVDT2X.js.map +0 -1
  89. package/dist/chunk-7YAH2F3J.js.map +0 -1
  90. package/dist/chunk-BAEFBTOW.js.map +0 -1
  91. package/dist/chunk-CQNNSZPG.js +0 -9
  92. package/dist/chunk-CQNNSZPG.js.map +0 -1
  93. package/dist/chunk-FCANRQ5Q.js.map +0 -1
  94. package/dist/chunk-HSA6NL2E.js +0 -517
  95. package/dist/chunk-HSA6NL2E.js.map +0 -1
  96. package/dist/chunk-HVHTVGPP.js.map +0 -1
  97. package/dist/chunk-RZDI7B6Z.js.map +0 -1
  98. package/dist/chunk-SROQA7I7.js.map +0 -1
  99. package/dist/chunk-TEV3OB7N.js.map +0 -1
  100. package/dist/chunk-UBE4WH6G.js.map +0 -1
  101. package/dist/chunk-YXLDR2O4.js.map +0 -1
  102. package/dist/message-schema-B2M7AYzR.d.ts +0 -52
  103. /package/dist/{chunk-DNQNOHD5.js.map → chunk-5C6B6ZRH.js.map} +0 -0
  104. /package/dist/{chunk-E5J4OY4K.js.map → chunk-6BBOCFHV.js.map} +0 -0
  105. /package/dist/{chunk-MGNTXGTX.js.map → chunk-D4PACGPA.js.map} +0 -0
  106. /package/dist/{chunk-YDJA4R37.js.map → chunk-LTXABCOO.js.map} +0 -0
  107. /package/dist/{chunk-BEU6FCTN.js.map → chunk-OJBFDBLG.js.map} +0 -0
  108. /package/dist/{chunk-G5OACQEI.js.map → chunk-QGX73TSQ.js.map} +0 -0
  109. /package/dist/{chunk-H7BI3BSP.js.map → chunk-ZA564323.js.map} +0 -0
package/README.md CHANGED
@@ -126,7 +126,18 @@ console.log(result.output.priority); // fully typed
126
126
  ```
127
127
 
128
128
  `CompletionResult` consistently contains `output`, the original `text`, normalized `content`,
129
- `usage`, and `rawResponse`, plus optional message, context, source, and provider-tool metadata.
129
+ `usage`, and `rawResponse`, plus optional message, context, source, provider-tool, and finish-reason
130
+ metadata. First-party adapters normalize provider termination into `finishReason` (`stop`, `length`,
131
+ `content-filter`, `tool-calls`, or `other`) while preserving the provider value separately as
132
+ `providerFinishReason`.
133
+
134
+ Schema-backed completion checks termination before JSON parsing. `finishReason: "length"` throws
135
+ `CompletionStructuredOutputError` with `phase: "truncated"`; `finishReason: "content-filter"`
136
+ throws it with `phase: "content-filter"` and is not retried by the default policy. Ordinary text
137
+ completion remains intentional: partial text is returned unchanged with its finish reason so the
138
+ application decides whether to display, continue, or discard it. A direct structured stream can
139
+ similarly end with one typed error event after any already-emitted deltas; it does not silently
140
+ retract public stream progress.
130
141
 
131
142
  Use `streamCompletion` for the streaming form:
132
143
 
@@ -183,9 +194,11 @@ const result = await generateCompletion({
183
194
  });
184
195
  ```
185
196
 
186
- `providerOptions` contains strict JSON passed to an adapter. Canonical Anvia fields such as model,
187
- input, temperature, tools, dimensions, text, and voice take precedence over conflicting provider
188
- keys. Cancellation is forwarded to provider SDK calls and is never retried.
197
+ `providerOptions` contains a strict JSON object passed to an adapter. Runtime values such as
198
+ `undefined`, non-finite numbers, cycles, a top-level array, and class instances are rejected rather
199
+ than coerced. Nested arrays are valid JSON. Canonical Anvia fields such as model, input,
200
+ temperature, tools, dimensions, text, and voice take precedence over conflicting provider keys.
201
+ Cancellation is forwarded to provider SDK calls and is never retried.
189
202
 
190
203
  ## Agents
191
204
 
@@ -210,18 +223,38 @@ await agent.generate({
210
223
  });
211
224
  ```
212
225
 
213
- When an Agent has `outputSchema`, JSON parsing and schema-validation failures use the same retry
214
- budget when retries are explicitly enabled. A correction request includes the rejected response in
215
- the provider transcript and asks for raw JSON matching the schema, without Markdown or commentary.
226
+ When an Agent has `outputSchema`, truncation, JSON parsing, and schema-validation failures use the
227
+ same retry budget when retries are explicitly enabled. Each retry starts from the original request
228
+ rather than recursively accumulating failed attempts. Truncated output and reasoning are omitted;
229
+ parse and schema repairs include only a bounded, text-only preview of the latest failed response.
230
+ The correction asks for shorter raw JSON matching the schema, without Markdown or commentary.
216
231
  Transport failures and structured-output failures therefore cannot exceed `maxAttempts` in total.
232
+ Completed Agent results expose the last generation's `finishReason` and `providerFinishReason`, and
233
+ the same fields remain attached to each assistant message's Anvia generation metadata.
234
+
235
+ Malformed, incomplete, or non-JSON provider tool arguments fail with
236
+ `CompletionProviderOutputError`. The default policy retries only explicitly retry-safe provider
237
+ output failures when retries are enabled; it does not make arbitrary `SyntaxError` instances
238
+ retryable. Tool calls are validated as a complete set before any tool executes, and filtered tool
239
+ calls are never retried by default. Raw provider arguments are not retained in the error or retry
240
+ metadata. A no-argument tool call must still contain the JSON value `{}`; blank argument text is
241
+ malformed provider output and is never replaced with invented input.
242
+
243
+ Streaming attempts are retried only before any provider event has been exposed. Once progress has
244
+ been emitted, Anvia returns the failure without starting another provider attempt, because replaying
245
+ the stream could duplicate text, tool-call deltas, or other observable events. Applications that
246
+ want post-progress recovery must buffer attempts and define their own reset or resume protocol.
217
247
 
218
248
  Structured output remains strict: Core trims surrounding whitespace, parses JSON, and validates the
219
249
  result with the configured Zod schema. As a compatibility fallback for OpenAI-compatible providers
220
250
  that violate strict JSON mode, Core also accepts a response consisting entirely of one lowercase
221
251
  `json` Markdown fence or one unlabeled Markdown fence. It does not search prose for JSON, accept
222
252
  content before or after a fence, or bypass schema validation. `AgentStructuredOutputError` reports
223
- the `parse` or `schema` phase, attempt counts, output length/format metadata, cumulative attempt
224
- usage, and the original `cause`; its message never contains the rejected model response.
253
+ the `truncated`, `content-filter`, `parse`, or `schema` phase, attempt counts, output length/format
254
+ metadata, per-attempt and cumulative usage, finish reasons, and the original `cause` when one
255
+ exists; its message never contains the rejected model response. The `completion.retry` observer
256
+ event records the same safe diagnostics and whether failed output was omitted or previewed, never
257
+ the model output itself.
225
258
 
226
259
  Agent results are discriminated by `status`. Completed results include typed `output` and `text`;
227
260
  guardrail blocks return `status: "blocked"`, `stage`, and `text`; tool approvals and first-class
@@ -1,29 +1,29 @@
1
1
  export { M as ModelCallOptions } from '../model-call-options-CZkSw_xN.js';
2
2
  export { R as RetryContext, a as RetryOptions, b as RetrySetting } from '../retry-CjvSlKGW.js';
3
- export { A as Agent, a as AgentContextInput, b as AgentMemory, c as AgentMemoryOptions, d as AgentOptions, e as AgentToolInput, f as AgentToolOptions, C as CreateHybridVectorContextOptions, g as CreateVectorContextOptions, V as VectorContext, h as VectorContextBaseOptions, i as createVectorContext, j as isVectorContext } from '../agent-LlCD_2UQ.js';
4
- import { M as Message, U as Usage } from '../types-D9rKQ_as.js';
5
- import { A as AgentBlockedResult, t as AgentSuspendedResult } from '../types-1KpjDfoN.js';
6
- export { a as AgentChildStreamEvent, b as AgentDeltaEvent, c as AgentErrorEvent, d as AgentErrorStreamEvent, e as AgentFinishEvent, f as AgentInput, g as AgentLifecycle, h as AgentMemoryCompactionEvent, i as AgentPrompt, j as AgentResponse, k as AgentResult, l as AgentRunOptions, m as AgentRunSettings, n as AgentStartEvent, o as AgentSteerInput, p as AgentSteerReceipt, q as AgentStepFinishEvent, r as AgentStream, s as AgentStreamEvent, u as AgentToolCallDeltaEvent, v as AgentToolFinishEvent, w as AgentToolStartEvent } from '../types-1KpjDfoN.js';
3
+ export { A as Agent, a as AgentContextInput, b as AgentMemory, c as AgentMemoryOptions, d as AgentOptions, e as AgentToolInput, f as AgentToolOptions, C as CreateHybridVectorContextOptions, g as CreateVectorContextOptions, V as VectorContext, h as VectorContextBaseOptions, i as createVectorContext, j as isVectorContext } from '../agent-XPQBM4rX.js';
4
+ import { M as Message, U as Usage, C as CompletionFinishReason } from '../types-DgvozfPc.js';
5
+ import { A as AgentBlockedResult, t as AgentSuspendedResult } from '../types-Sue2hb_L.js';
6
+ export { a as AgentChildStreamEvent, b as AgentDeltaEvent, c as AgentErrorEvent, d as AgentErrorStreamEvent, e as AgentFinishEvent, f as AgentInput, g as AgentLifecycle, h as AgentMemoryCompactionEvent, i as AgentPrompt, j as AgentResponse, k as AgentResult, l as AgentRunOptions, m as AgentRunSettings, n as AgentStartEvent, o as AgentSteerInput, p as AgentSteerReceipt, q as AgentStepFinishEvent, r as AgentStream, s as AgentStreamEvent, u as AgentToolCallDeltaEvent, v as AgentToolFinishEvent, w as AgentToolStartEvent } from '../types-Sue2hb_L.js';
7
7
  import '../zod-schema-C7F4clpm.js';
8
8
  import 'zod';
9
- import '../types-CIPaIbZo.js';
9
+ import '../types-DhkodEft.js';
10
10
  import '../type-utils-CtHVDRn_.js';
11
- import '../client-DvUatElp.js';
11
+ import '../client-DTPl0hZv.js';
12
12
  import 'node:child_process';
13
13
  import 'node:stream';
14
14
  import '@modelcontextprotocol/sdk/client/auth.js';
15
15
  import '@modelcontextprotocol/sdk/client/streamableHttp.js';
16
16
  import '@modelcontextprotocol/sdk/shared/transport.js';
17
- import '../tool-r62gf3QY.js';
18
- import '../middleware-BqtLB_Xt.js';
19
- import '../types-DbolvLtZ.js';
20
- import '../types-RT3cuyRk.js';
21
- import '../dynamic-tools-AEBOTgu1.js';
17
+ import '../tool-BpqpoRSE.js';
18
+ import '../middleware-kcF8AusP.js';
19
+ import '../types-DKOXVTcq.js';
20
+ import '../types-DC1U1XwW.js';
21
+ import '../dynamic-tools-aIZlg5x1.js';
22
22
  import '../types-Cr4uiYo5.js';
23
- import '../types-C3gv9EX6.js';
23
+ import '../types-CXNE592e.js';
24
24
  import './interactions/index.js';
25
25
 
26
- type AgentStructuredOutputPhase = "parse" | "schema";
26
+ type AgentStructuredOutputPhase = "truncated" | "content-filter" | "parse" | "schema";
27
27
  type AgentStructuredOutputFormat = "raw" | "json-fence" | "unlabeled-fence";
28
28
  declare class AgentStructuredOutputError extends Error {
29
29
  readonly phase: AgentStructuredOutputPhase;
@@ -32,7 +32,10 @@ declare class AgentStructuredOutputError extends Error {
32
32
  readonly outputLength: number;
33
33
  readonly normalizedLength: number;
34
34
  readonly outputFormat: AgentStructuredOutputFormat;
35
+ readonly attemptUsage: Usage;
35
36
  readonly usage: Usage;
37
+ readonly finishReason: CompletionFinishReason | undefined;
38
+ readonly providerFinishReason: string | undefined;
36
39
  constructor(options: {
37
40
  phase: AgentStructuredOutputPhase;
38
41
  attempt: number;
@@ -40,8 +43,11 @@ declare class AgentStructuredOutputError extends Error {
40
43
  outputLength: number;
41
44
  normalizedLength: number;
42
45
  outputFormat: AgentStructuredOutputFormat;
46
+ attemptUsage: Usage;
43
47
  usage: Usage;
44
- cause: unknown;
48
+ finishReason?: CompletionFinishReason | undefined;
49
+ providerFinishReason?: string | undefined;
50
+ cause?: unknown;
45
51
  });
46
52
  }
47
53
  declare class MaxTurnsError extends Error {
@@ -2,15 +2,14 @@ import {
2
2
  Agent,
3
3
  createVectorContext,
4
4
  isVectorContext
5
- } from "../chunk-FCANRQ5Q.js";
6
- import "../chunk-BEU6FCTN.js";
7
- import "../chunk-7YAH2F3J.js";
8
- import "../chunk-DNQNOHD5.js";
9
- import "../chunk-E5J4OY4K.js";
5
+ } from "../chunk-YA2655FX.js";
6
+ import "../chunk-OJBFDBLG.js";
7
+ import "../chunk-76JLMBVT.js";
8
+ import "../chunk-5C6B6ZRH.js";
9
+ import "../chunk-6BBOCFHV.js";
10
10
  import "../chunk-YK4WAAS4.js";
11
- import "../chunk-CQNNSZPG.js";
12
- import "../chunk-JXZTTNCR.js";
13
- import "../chunk-RZDI7B6Z.js";
11
+ import "../chunk-SJMSS5SI.js";
12
+ import "../chunk-EMZKPRE6.js";
14
13
  import {
15
14
  AgentRunBlockedError,
16
15
  AgentRunCancelledError,
@@ -18,14 +17,15 @@ import {
18
17
  AgentStructuredOutputError,
19
18
  AgentToolSuspensionError,
20
19
  MaxTurnsError
21
- } from "../chunk-TEV3OB7N.js";
22
- import "../chunk-H7BI3BSP.js";
20
+ } from "../chunk-X4LK4ODN.js";
21
+ import "../chunk-ZA564323.js";
23
22
  import "../chunk-3RM57ZT2.js";
24
- import "../chunk-MGNTXGTX.js";
25
- import "../chunk-HSA6NL2E.js";
26
- import "../chunk-G5OACQEI.js";
27
- import "../chunk-SROQA7I7.js";
28
- import "../chunk-UBE4WH6G.js";
23
+ import "../chunk-D4PACGPA.js";
24
+ import "../chunk-7PHMK7W4.js";
25
+ import "../chunk-7JLAIN6E.js";
26
+ import "../chunk-QGX73TSQ.js";
27
+ import "../chunk-3XQGVDU5.js";
28
+ import "../chunk-3RWESPUG.js";
29
29
  import "../chunk-AZB6N7P4.js";
30
30
  export {
31
31
  Agent,
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { o as JsonValue, J as JsonObject, _ as ToolQuestionAnswer } from '../../types-D9rKQ_as.js';
2
+ import { p as JsonValue, J as JsonObject, $ as ToolQuestionAnswer } from '../../types-DgvozfPc.js';
3
3
  import '../../model-call-options-CZkSw_xN.js';
4
4
 
5
5
  type AgentQuestionChoice = Readonly<{
@@ -6,8 +6,8 @@ import {
6
6
  parseAgentContinuation,
7
7
  parseAgentInteractionRequest,
8
8
  parseAgentInteractionResponse
9
- } from "../../chunk-BEU6FCTN.js";
10
- import "../../chunk-SROQA7I7.js";
9
+ } from "../../chunk-OJBFDBLG.js";
10
+ import "../../chunk-3XQGVDU5.js";
11
11
  export {
12
12
  agentContinuationSchema,
13
13
  agentInteractionRequestSchema,
@@ -1,16 +1,16 @@
1
1
  import { b as RetrySetting } from './retry-CjvSlKGW.js';
2
- import { D as Document, C as CompletionModel, P as ProviderTool, J as JsonObject, u as ToolChoice } from './types-D9rKQ_as.js';
2
+ import { D as Document, c as CompletionModel, P as ProviderTool, J as JsonObject, v as ToolChoice } from './types-DgvozfPc.js';
3
3
  import { Z as ZodSchema } from './zod-schema-C7F4clpm.js';
4
- import { d as GuardrailPolicyInput, c as GuardrailPolicy } from './types-CIPaIbZo.js';
5
- import { a as McpServer } from './client-DvUatElp.js';
6
- import { g as AgentLifecycle, E as AgentObservabilityOptions, l as AgentRunOptions, k as AgentResult, r as AgentStream, s as AgentStreamEvent } from './types-1KpjDfoN.js';
7
- import { A as AgentMiddleware } from './middleware-BqtLB_Xt.js';
8
- import { A as AnyTool, T as Tool, c as ToolCallContext, N as NormalizedToolOutput } from './tool-r62gf3QY.js';
9
- import { D as MemoryStore, y as MemorySavePolicy, m as MemoryCompactor, d as MemoryCompactionConflictRetryOptions, x as MemoryOptions } from './types-DbolvLtZ.js';
10
- import { a as SkillSet } from './types-RT3cuyRk.js';
11
- import { T as ToolIndex } from './dynamic-tools-AEBOTgu1.js';
4
+ import { d as GuardrailPolicyInput, c as GuardrailPolicy } from './types-DhkodEft.js';
5
+ import { a as McpServer } from './client-DTPl0hZv.js';
6
+ import { g as AgentLifecycle, E as AgentObservabilityOptions, l as AgentRunOptions, k as AgentResult, r as AgentStream, s as AgentStreamEvent } from './types-Sue2hb_L.js';
7
+ import { A as AgentMiddleware } from './middleware-kcF8AusP.js';
8
+ import { A as AnyTool, T as Tool, c as ToolCallContext, N as NormalizedToolOutput } from './tool-BpqpoRSE.js';
9
+ import { D as MemoryStore, y as MemorySavePolicy, m as MemoryCompactor, d as MemoryCompactionConflictRetryOptions, x as MemoryOptions } from './types-DKOXVTcq.js';
10
+ import { a as SkillSet } from './types-DC1U1XwW.js';
11
+ import { T as ToolIndex } from './dynamic-tools-aIZlg5x1.js';
12
12
  import { E as EmbeddingModel, c as SparseEmbeddingModel } from './types-Cr4uiYo5.js';
13
- import { V as VectorFilter, a as VectorSearchResult, d as VectorStore, H as HybridVectorStore, e as VectorFusion } from './types-C3gv9EX6.js';
13
+ import { V as VectorFilter, a as VectorSearchResult, d as VectorStore, H as HybridVectorStore, e as VectorFusion } from './types-CXNE592e.js';
14
14
 
15
15
  type VectorContextBaseOptions<T = unknown> = {
16
16
  topK: number;
@@ -54,11 +54,33 @@ var MAX_TIMER_DELAY_MS = 2147483647;
54
54
  var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([408, 409, 425, 429]);
55
55
  var RETRYABLE_NUMERIC_ERROR_CODES = /* @__PURE__ */ new Set([4, 8, 14]);
56
56
  var RETRYABLE_ERROR_NAMES = /* @__PURE__ */ new Set([
57
- "AgentStructuredOutputError",
58
57
  "APIConnectionError",
59
58
  "APIConnectionTimeoutError",
60
59
  "TimeoutError"
61
60
  ]);
61
+ var RETRYABLE_STRUCTURED_OUTPUT_PHASES = /* @__PURE__ */ new Set(["truncated", "parse", "schema"]);
62
+ var RETRYABLE_PROVIDER_OUTPUT_KINDS = /* @__PURE__ */ new Set([
63
+ "malformed-tool-arguments",
64
+ "invalid-tool-arguments",
65
+ "invalid-stream-event",
66
+ "incomplete-stream",
67
+ "incomplete-tool-call",
68
+ "invalid-tool-call",
69
+ "truncated-tool-call"
70
+ ]);
71
+ var PROVIDER_OUTPUT_KINDS = /* @__PURE__ */ new Set([
72
+ ...RETRYABLE_PROVIDER_OUTPUT_KINDS,
73
+ "filtered-tool-call",
74
+ "invalid-response"
75
+ ]);
76
+ var PROVIDER_OUTPUT_FINISH_REASONS = /* @__PURE__ */ new Set([
77
+ "stop",
78
+ "length",
79
+ "content-filter",
80
+ "tool-calls",
81
+ "other"
82
+ ]);
83
+ var COMPLETION_PROVIDER_OUTPUT_ERROR_CODE = "ANVIA_COMPLETION_PROVIDER_OUTPUT";
62
84
  var RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
63
85
  "DEADLINE_EXCEEDED",
64
86
  "EAI_AGAIN",
@@ -107,7 +129,28 @@ function retryErrorAttributes(error) {
107
129
  const errorName = errors.map((candidate) => stringProperty(candidate, "name")).find((value) => value !== void 0);
108
130
  const statusCode = firstStatusCode(errors);
109
131
  const errorCode = errors.map((candidate) => errorCodeProperty(candidate)).find((value) => value !== void 0);
110
- return { errorName, statusCode, errorCode };
132
+ const attributes = {};
133
+ if (errorName !== void 0) attributes.errorName = errorName;
134
+ if (statusCode !== void 0) attributes.statusCode = statusCode;
135
+ if (errorCode !== void 0) attributes.errorCode = errorCode;
136
+ const providerOutputError = errors.find(isCompletionProviderOutputErrorRecord);
137
+ if (providerOutputError !== void 0) {
138
+ const kind = stringProperty(providerOutputError, "kind");
139
+ if (kind !== void 0) attributes.providerOutputKind = kind;
140
+ const finishReason = stringProperty(providerOutputError, "finishReason");
141
+ if (finishReason !== void 0) attributes.finishReason = finishReason;
142
+ const usage = usageProperty(providerOutputError);
143
+ if (usage !== void 0) attributes.attemptUsage = usageEventValue(usage);
144
+ }
145
+ return attributes;
146
+ }
147
+ function completionProviderOutputErrorUsage(error) {
148
+ for (const candidate of errorChain(error)) {
149
+ if (!isCompletionProviderOutputErrorRecord(candidate)) continue;
150
+ const usage = usageProperty(candidate);
151
+ if (usage !== void 0) return usage;
152
+ }
153
+ return void 0;
111
154
  }
112
155
  async function waitForRetry(delayMs, abortSignal) {
113
156
  await waitForAbortableDelay(delayMs, abortSignal);
@@ -136,6 +179,19 @@ async function runWithRetries(operation, options, context) {
136
179
  function defaultShouldRetry(context) {
137
180
  const errors = errorChain(context.error);
138
181
  if (isAbortError(context.error)) return false;
182
+ const providerOutputErrorMarker = errors.find(isCompletionProviderOutputErrorMarker);
183
+ if (providerOutputErrorMarker !== void 0) {
184
+ if (!isCompletionProviderOutputErrorRecord(providerOutputErrorMarker)) return false;
185
+ const kind = stringProperty(providerOutputErrorMarker, "kind");
186
+ return kind !== void 0 && RETRYABLE_PROVIDER_OUTPUT_KINDS.has(kind);
187
+ }
188
+ const structuredOutputError = errors.find(
189
+ (error) => stringProperty(error, "name") === "AgentStructuredOutputError"
190
+ );
191
+ if (structuredOutputError !== void 0) {
192
+ const phase = stringProperty(structuredOutputError, "phase");
193
+ return phase !== void 0 && RETRYABLE_STRUCTURED_OUTPUT_PHASES.has(phase);
194
+ }
139
195
  const statusCode = firstStatusCode(errors);
140
196
  if (statusCode !== void 0) {
141
197
  return RETRYABLE_STATUS_CODES.has(statusCode) || statusCode >= 500 && statusCode <= 599;
@@ -149,6 +205,64 @@ function defaultShouldRetry(context) {
149
205
  return numericCode !== void 0 && RETRYABLE_NUMERIC_ERROR_CODES.has(numericCode);
150
206
  });
151
207
  }
208
+ function isCompletionProviderOutputErrorRecord(error) {
209
+ const kind = stringProperty(error, "kind");
210
+ return isCompletionProviderOutputErrorMarker(error) && kind !== void 0 && PROVIDER_OUTPUT_KINDS.has(kind) && hasConsistentProviderOutputFinish(error, kind);
211
+ }
212
+ function isCompletionProviderOutputErrorMarker(error) {
213
+ return stringProperty(error, "name") === "CompletionProviderOutputError" && stringProperty(error, "code") === COMPLETION_PROVIDER_OUTPUT_ERROR_CODE;
214
+ }
215
+ function hasConsistentProviderOutputFinish(error, kind) {
216
+ const rawFinishReason = property(error, "finishReason");
217
+ if (rawFinishReason !== void 0 && (typeof rawFinishReason !== "string" || !PROVIDER_OUTPUT_FINISH_REASONS.has(rawFinishReason))) {
218
+ return false;
219
+ }
220
+ const finishReason = rawFinishReason;
221
+ if (kind === "truncated-tool-call") return finishReason === "length";
222
+ if (kind === "filtered-tool-call") return finishReason === "content-filter";
223
+ return finishReason !== "length" && finishReason !== "content-filter";
224
+ }
225
+ function usageProperty(value) {
226
+ const usage = property(value, "usage");
227
+ if (!isObject(usage)) return void 0;
228
+ const inputTokens = nonnegativeNumberProperty(usage, "inputTokens");
229
+ const outputTokens = nonnegativeNumberProperty(usage, "outputTokens");
230
+ const totalTokens = nonnegativeNumberProperty(usage, "totalTokens");
231
+ const cachedInputTokens = nonnegativeNumberProperty(usage, "cachedInputTokens");
232
+ const cacheCreationInputTokens = nonnegativeNumberProperty(usage, "cacheCreationInputTokens");
233
+ if (inputTokens === void 0 || outputTokens === void 0 || totalTokens === void 0 || cachedInputTokens === void 0 || cacheCreationInputTokens === void 0) {
234
+ return void 0;
235
+ }
236
+ const result = {
237
+ inputTokens,
238
+ outputTokens,
239
+ totalTokens,
240
+ cachedInputTokens,
241
+ cacheCreationInputTokens
242
+ };
243
+ const details = property(usage, "details");
244
+ if (details !== void 0) {
245
+ if (!isObject(details)) return void 0;
246
+ const copiedDetails = {};
247
+ for (const [key, detail] of Object.entries(details)) {
248
+ if (typeof detail !== "number" || !Number.isFinite(detail) || detail < 0) return void 0;
249
+ copiedDetails[key] = detail;
250
+ }
251
+ result.details = copiedDetails;
252
+ }
253
+ return result;
254
+ }
255
+ function usageEventValue(usage) {
256
+ const value = {
257
+ inputTokens: usage.inputTokens,
258
+ outputTokens: usage.outputTokens,
259
+ totalTokens: usage.totalTokens,
260
+ cachedInputTokens: usage.cachedInputTokens,
261
+ cacheCreationInputTokens: usage.cacheCreationInputTokens
262
+ };
263
+ if (usage.details !== void 0) value.details = { ...usage.details };
264
+ return value;
265
+ }
152
266
  function firstStatusCode(errors) {
153
267
  for (const error of errors) {
154
268
  const status = numberProperty(error, "status");
@@ -180,6 +294,10 @@ function numberProperty(value, name) {
180
294
  const candidate = property(value, name);
181
295
  return typeof candidate === "number" && Number.isFinite(candidate) ? candidate : void 0;
182
296
  }
297
+ function nonnegativeNumberProperty(value, name) {
298
+ const candidate = numberProperty(value, name);
299
+ return candidate !== void 0 && candidate >= 0 ? candidate : void 0;
300
+ }
183
301
  function stringProperty(value, name) {
184
302
  const candidate = property(value, name);
185
303
  return typeof candidate === "string" && candidate.length > 0 ? candidate : void 0;
@@ -205,8 +323,9 @@ export {
205
323
  resolveRetryOptions,
206
324
  retryDelayMs,
207
325
  retryErrorAttributes,
326
+ completionProviderOutputErrorUsage,
208
327
  waitForRetry,
209
328
  retryOptionsForFailure,
210
329
  runWithRetries
211
330
  };
212
- //# sourceMappingURL=chunk-UBE4WH6G.js.map
331
+ //# sourceMappingURL=chunk-3RWESPUG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/abort.ts","../src/retry.ts"],"sourcesContent":["export function throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw abortError(signal.reason);\n }\n}\n\nexport function abortError(reason?: unknown): Error {\n if (isAbortError(reason)) {\n return reason;\n }\n\n const error = new Error(\n \"The operation was aborted.\",\n reason === undefined ? undefined : { cause: reason },\n );\n error.name = \"AbortError\";\n return error;\n}\n\nexport function isAbortError(error: unknown): error is Error {\n const seen = new Set<object>();\n let current = error;\n while (typeof current === \"object\" && current !== null && !seen.has(current)) {\n seen.add(current);\n if (\"name\" in current && current.name === \"AbortError\") {\n return true;\n }\n current = \"cause\" in current ? current.cause : undefined;\n }\n return false;\n}\n\nexport function waitForAbortableDelay(\n delayMs: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n throwIfAborted(signal);\n if (delayMs === 0) return Promise.resolve();\n if (signal === undefined) {\n return new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortError(signal.reason));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import type { JsonObject, Usage } from \"./completion/types\";\nimport { abortError, isAbortError, waitForAbortableDelay } from \"./internal/abort\";\n\nexport type RetryContext = {\n error: unknown;\n attempt: number;\n maxAttempts: number;\n streaming: boolean;\n turn?: number | undefined;\n};\n\nexport type RetryOptions = {\n maxAttempts?: number | undefined;\n initialDelayMs?: number | undefined;\n maxDelayMs?: number | undefined;\n shouldRetry?: ((context: RetryContext) => boolean) | undefined;\n};\n\nexport type RetrySetting = RetryOptions | false;\n\nexport type ResolvedRetryOptions = {\n maxAttempts: number;\n initialDelayMs: number;\n maxDelayMs: number;\n shouldRetry: (context: RetryContext) => boolean;\n};\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_INITIAL_DELAY_MS = 100;\nconst DEFAULT_MAX_DELAY_MS = 1_000;\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 409, 425, 429]);\nconst RETRYABLE_NUMERIC_ERROR_CODES = new Set([4, 8, 14]);\nconst RETRYABLE_ERROR_NAMES = new Set([\n \"APIConnectionError\",\n \"APIConnectionTimeoutError\",\n \"TimeoutError\",\n]);\nconst RETRYABLE_STRUCTURED_OUTPUT_PHASES = new Set([\"truncated\", \"parse\", \"schema\"]);\nconst RETRYABLE_PROVIDER_OUTPUT_KINDS = new Set([\n \"malformed-tool-arguments\",\n \"invalid-tool-arguments\",\n \"invalid-stream-event\",\n \"incomplete-stream\",\n \"incomplete-tool-call\",\n \"invalid-tool-call\",\n \"truncated-tool-call\",\n]);\nconst PROVIDER_OUTPUT_KINDS = new Set([\n ...RETRYABLE_PROVIDER_OUTPUT_KINDS,\n \"filtered-tool-call\",\n \"invalid-response\",\n]);\nconst PROVIDER_OUTPUT_FINISH_REASONS = new Set([\n \"stop\",\n \"length\",\n \"content-filter\",\n \"tool-calls\",\n \"other\",\n]);\nconst COMPLETION_PROVIDER_OUTPUT_ERROR_CODE = \"ANVIA_COMPLETION_PROVIDER_OUTPUT\";\nconst RETRYABLE_ERROR_CODES = new Set([\n \"DEADLINE_EXCEEDED\",\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETDOWN\",\n \"ENETUNREACH\",\n \"EPIPE\",\n \"ETIMEDOUT\",\n \"RESOURCE_EXHAUSTED\",\n \"UNAVAILABLE\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n]);\n\nexport function resolveRetryOptions(options: RetryOptions): ResolvedRetryOptions {\n const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n const initialDelayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS;\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;\n\n if (!Number.isSafeInteger(maxAttempts) || maxAttempts < 1) {\n throw new RangeError(\"Retry maxAttempts must be a positive integer.\");\n }\n assertDelay(initialDelayMs, \"initialDelayMs\");\n assertDelay(maxDelayMs, \"maxDelayMs\");\n if (maxDelayMs < initialDelayMs) {\n throw new RangeError(\"Retry maxDelayMs must be greater than or equal to initialDelayMs.\");\n }\n if (options.shouldRetry !== undefined && typeof options.shouldRetry !== \"function\") {\n throw new TypeError(\"Retry shouldRetry must be a function.\");\n }\n\n return {\n maxAttempts,\n initialDelayMs,\n maxDelayMs,\n shouldRetry: options.shouldRetry ?? defaultShouldRetry,\n };\n}\n\nexport function retryDelayMs(options: ResolvedRetryOptions, failedAttempt: number): number {\n const exponentialDelay = options.initialDelayMs * 2 ** (failedAttempt - 1);\n const cappedDelay = Math.min(options.maxDelayMs, exponentialDelay);\n return Math.random() * cappedDelay;\n}\n\nexport function retryErrorAttributes(error: unknown): JsonObject {\n const errors = errorChain(error);\n const errorName = errors\n .map((candidate) => stringProperty(candidate, \"name\"))\n .find((value) => value !== undefined);\n const statusCode = firstStatusCode(errors);\n const errorCode = errors\n .map((candidate) => errorCodeProperty(candidate))\n .find((value) => value !== undefined);\n\n const attributes: JsonObject = {};\n if (errorName !== undefined) attributes.errorName = errorName;\n if (statusCode !== undefined) attributes.statusCode = statusCode;\n if (errorCode !== undefined) attributes.errorCode = errorCode;\n const providerOutputError = errors.find(isCompletionProviderOutputErrorRecord);\n if (providerOutputError !== undefined) {\n const kind = stringProperty(providerOutputError, \"kind\");\n if (kind !== undefined) attributes.providerOutputKind = kind;\n const finishReason = stringProperty(providerOutputError, \"finishReason\");\n if (finishReason !== undefined) attributes.finishReason = finishReason;\n const usage = usageProperty(providerOutputError);\n if (usage !== undefined) attributes.attemptUsage = usageEventValue(usage);\n }\n return attributes;\n}\n\nexport function completionProviderOutputErrorUsage(error: unknown): Usage | undefined {\n for (const candidate of errorChain(error)) {\n if (!isCompletionProviderOutputErrorRecord(candidate)) continue;\n const usage = usageProperty(candidate);\n if (usage !== undefined) return usage;\n }\n return undefined;\n}\n\nexport async function waitForRetry(\n delayMs: number,\n abortSignal?: AbortSignal | undefined,\n): Promise<void> {\n await waitForAbortableDelay(delayMs, abortSignal);\n}\n\nexport function retryOptionsForFailure(\n options: ResolvedRetryOptions | undefined,\n context: Omit<RetryContext, \"maxAttempts\">,\n): ResolvedRetryOptions | undefined {\n if (isAbortError(context.error)) return undefined;\n if (options === undefined || context.attempt >= options.maxAttempts) return undefined;\n return options.shouldRetry({ ...context, maxAttempts: options.maxAttempts })\n ? options\n : undefined;\n}\n\nexport async function runWithRetries<T>(\n operation: () => Promise<T>,\n options: ResolvedRetryOptions | undefined,\n context: {\n streaming: boolean;\n turn?: number | undefined;\n abortSignal?: AbortSignal | undefined;\n },\n): Promise<T> {\n let attempt = 1;\n while (true) {\n try {\n return await operation();\n } catch (error) {\n if (context.abortSignal?.aborted === true) {\n throw abortError(context.abortSignal.reason);\n }\n const retryOptions = retryOptionsForFailure(options, { error, attempt, ...context });\n if (retryOptions === undefined) throw error;\n await waitForRetry(retryDelayMs(retryOptions, attempt), context.abortSignal);\n attempt += 1;\n }\n }\n}\n\nfunction defaultShouldRetry(context: RetryContext): boolean {\n const errors = errorChain(context.error);\n if (isAbortError(context.error)) return false;\n\n const providerOutputErrorMarker = errors.find(isCompletionProviderOutputErrorMarker);\n if (providerOutputErrorMarker !== undefined) {\n if (!isCompletionProviderOutputErrorRecord(providerOutputErrorMarker)) return false;\n const kind = stringProperty(providerOutputErrorMarker, \"kind\");\n return kind !== undefined && RETRYABLE_PROVIDER_OUTPUT_KINDS.has(kind);\n }\n\n const structuredOutputError = errors.find(\n (error) => stringProperty(error, \"name\") === \"AgentStructuredOutputError\",\n );\n if (structuredOutputError !== undefined) {\n const phase = stringProperty(structuredOutputError, \"phase\");\n return phase !== undefined && RETRYABLE_STRUCTURED_OUTPUT_PHASES.has(phase);\n }\n\n const statusCode = firstStatusCode(errors);\n if (statusCode !== undefined) {\n return RETRYABLE_STATUS_CODES.has(statusCode) || (statusCode >= 500 && statusCode <= 599);\n }\n\n return errors.some((error) => {\n const name = stringProperty(error, \"name\");\n if (name !== undefined && RETRYABLE_ERROR_NAMES.has(name)) return true;\n const code = stringProperty(error, \"code\")?.toUpperCase();\n if (code !== undefined && RETRYABLE_ERROR_CODES.has(code)) return true;\n const numericCode = numberProperty(error, \"code\");\n return numericCode !== undefined && RETRYABLE_NUMERIC_ERROR_CODES.has(numericCode);\n });\n}\n\nfunction isCompletionProviderOutputErrorRecord(error: Record<string, unknown>): boolean {\n const kind = stringProperty(error, \"kind\");\n return (\n isCompletionProviderOutputErrorMarker(error) &&\n kind !== undefined &&\n PROVIDER_OUTPUT_KINDS.has(kind) &&\n hasConsistentProviderOutputFinish(error, kind)\n );\n}\n\nfunction isCompletionProviderOutputErrorMarker(error: Record<string, unknown>): boolean {\n return (\n stringProperty(error, \"name\") === \"CompletionProviderOutputError\" &&\n stringProperty(error, \"code\") === COMPLETION_PROVIDER_OUTPUT_ERROR_CODE\n );\n}\n\nfunction hasConsistentProviderOutputFinish(error: Record<string, unknown>, kind: string): boolean {\n const rawFinishReason = property(error, \"finishReason\");\n if (\n rawFinishReason !== undefined &&\n (typeof rawFinishReason !== \"string\" || !PROVIDER_OUTPUT_FINISH_REASONS.has(rawFinishReason))\n ) {\n return false;\n }\n const finishReason = rawFinishReason as string | undefined;\n if (kind === \"truncated-tool-call\") return finishReason === \"length\";\n if (kind === \"filtered-tool-call\") return finishReason === \"content-filter\";\n return finishReason !== \"length\" && finishReason !== \"content-filter\";\n}\n\nfunction usageProperty(value: Record<string, unknown>): Usage | undefined {\n const usage = property(value, \"usage\");\n if (!isObject(usage)) return undefined;\n const inputTokens = nonnegativeNumberProperty(usage, \"inputTokens\");\n const outputTokens = nonnegativeNumberProperty(usage, \"outputTokens\");\n const totalTokens = nonnegativeNumberProperty(usage, \"totalTokens\");\n const cachedInputTokens = nonnegativeNumberProperty(usage, \"cachedInputTokens\");\n const cacheCreationInputTokens = nonnegativeNumberProperty(usage, \"cacheCreationInputTokens\");\n if (\n inputTokens === undefined ||\n outputTokens === undefined ||\n totalTokens === undefined ||\n cachedInputTokens === undefined ||\n cacheCreationInputTokens === undefined\n ) {\n return undefined;\n }\n const result: Usage = {\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens,\n cacheCreationInputTokens,\n };\n const details = property(usage, \"details\");\n if (details !== undefined) {\n if (!isObject(details)) return undefined;\n const copiedDetails: Record<string, number> = {};\n for (const [key, detail] of Object.entries(details)) {\n if (typeof detail !== \"number\" || !Number.isFinite(detail) || detail < 0) return undefined;\n copiedDetails[key] = detail;\n }\n result.details = copiedDetails;\n }\n return result;\n}\n\nfunction usageEventValue(usage: Usage): JsonObject {\n const value: JsonObject = {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n if (usage.details !== undefined) value.details = { ...usage.details };\n return value;\n}\n\nfunction firstStatusCode(errors: Record<string, unknown>[]): number | undefined {\n for (const error of errors) {\n const status = numberProperty(error, \"status\");\n if (status !== undefined && status >= 100 && status <= 599) return status;\n const statusCode = numberProperty(error, \"statusCode\");\n if (statusCode !== undefined && statusCode >= 100 && statusCode <= 599) return statusCode;\n const code = numberProperty(error, \"code\");\n if (code !== undefined && code >= 100 && code <= 599) return code;\n }\n return undefined;\n}\n\nfunction errorChain(error: unknown): Record<string, unknown>[] {\n const errors: Record<string, unknown>[] = [];\n const seen = new Set<object>();\n let current = error;\n while (isObject(current) && !seen.has(current)) {\n seen.add(current);\n errors.push(current);\n current = property(current, \"cause\");\n }\n return errors;\n}\n\nfunction assertDelay(value: number, name: string): void {\n if (!Number.isFinite(value) || value < 0 || value > MAX_TIMER_DELAY_MS) {\n throw new RangeError(`Retry ${name} must be between 0 and ${MAX_TIMER_DELAY_MS} milliseconds.`);\n }\n}\n\nfunction numberProperty(value: Record<string, unknown>, name: string): number | undefined {\n const candidate = property(value, name);\n return typeof candidate === \"number\" && Number.isFinite(candidate) ? candidate : undefined;\n}\n\nfunction nonnegativeNumberProperty(\n value: Record<string, unknown>,\n name: string,\n): number | undefined {\n const candidate = numberProperty(value, name);\n return candidate !== undefined && candidate >= 0 ? candidate : undefined;\n}\n\nfunction stringProperty(value: Record<string, unknown>, name: string): string | undefined {\n const candidate = property(value, name);\n return typeof candidate === \"string\" && candidate.length > 0 ? candidate : undefined;\n}\n\nfunction errorCodeProperty(value: Record<string, unknown>): string | number | undefined {\n return stringProperty(value, \"code\") ?? numberProperty(value, \"code\");\n}\n\nfunction property(value: Record<string, unknown>, name: string): unknown {\n try {\n return value[name];\n } catch {\n return undefined;\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,9 @@
1
1
  import {
2
2
  markSkillTool
3
3
  } from "./chunk-YK4WAAS4.js";
4
- import {
5
- isRecord
6
- } from "./chunk-CQNNSZPG.js";
7
4
  import {
8
5
  createTool
9
- } from "./chunk-RZDI7B6Z.js";
6
+ } from "./chunk-EMZKPRE6.js";
10
7
 
11
8
  // src/skills/instructions.ts
12
9
  function skillInstructions(skills) {
@@ -239,6 +236,11 @@ import { readdir, readFile as readFile2, stat } from "fs/promises";
239
236
  import { basename, join, relative as relative2, resolve as resolve2, sep } from "path";
240
237
  import { parse as parseYaml } from "yaml";
241
238
 
239
+ // src/internal/record.ts
240
+ function isRecord(value) {
241
+ return typeof value === "object" && value !== null && !Array.isArray(value);
242
+ }
243
+
242
244
  // src/skills/types.ts
243
245
  var SkillValidationError = class extends Error {
244
246
  issues;
@@ -395,4 +397,4 @@ export {
395
397
  SkillValidationError,
396
398
  skill
397
399
  };
398
- //# sourceMappingURL=chunk-BAEFBTOW.js.map
400
+ //# sourceMappingURL=chunk-3SKZ2BKP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skills/instructions.ts","../src/skills/tools.ts","../src/skills/load.ts","../src/skills/local.ts","../src/internal/record.ts","../src/skills/types.ts"],"sourcesContent":["import type { Skill } from \"./types\";\n\nexport function skillInstructions(skills: Skill[]): string {\n if (skills.length === 0) {\n return \"\";\n }\n\n return [\n \"You have access to Agent Skills.\",\n \"Skills are compact capability packages. Use the skill tools to load full instructions, references, or scripts only when a skill is relevant.\",\n \"\",\n \"Available skills:\",\n ...skills.map(formatSkill),\n \"\",\n \"Skill tools:\",\n \"- get_skill_instructions: load full SKILL.md guidance for a skill.\",\n \"- get_skill_reference: read a reference file from a skill.\",\n \"- get_skill_script: read a script file from a skill.\",\n \"- run_skill_script: execute a script from a skill with arguments.\",\n ].join(\"\\n\");\n}\n\nfunction formatSkill(skill: Skill): string {\n const lines = [`- ${skill.name}: ${skill.description}`];\n if (skill.references.length > 0) {\n lines.push(` references: ${skill.references.join(\", \")}`);\n }\n if (skill.scripts.length > 0) {\n lines.push(` scripts: ${skill.scripts.join(\", \")}`);\n }\n return lines.join(\"\\n\");\n}\n","import { spawn } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { type AnyTool, createTool } from \"../tool\";\nimport { markSkillTool } from \"../tool/skill-tool-marker\";\nimport type { Skill } from \"./types\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_OUTPUT_CHARS = 20_000;\n\nexport function createSkillTools(skills: Skill[]): AnyTool[] {\n const registry = new SkillRegistry(skills);\n\n return [\n markSkillTool(\n createTool({\n name: \"get_skill_instructions\",\n description: \"Load the full SKILL.md instructions for an Agent Skill.\",\n inputSchema: z.object({\n skillName: z.string().describe(\"The name of the skill to load.\"),\n }),\n outputSchema: z.string(),\n execute: ({ skillName }) => registry.get(skillName).instructions,\n }),\n ),\n markSkillTool(\n createTool({\n name: \"get_skill_reference\",\n description: \"Read a reference file from an Agent Skill.\",\n inputSchema: z.object({\n skillName: z.string().describe(\"The name of the skill.\"),\n referencePath: z.string().describe(\"A path listed in the skill references.\"),\n }),\n outputSchema: z.string(),\n execute: ({ skillName, referencePath }) => registry.readReference(skillName, referencePath),\n }),\n ),\n markSkillTool(\n createTool({\n name: \"get_skill_script\",\n description: \"Read a script file from an Agent Skill.\",\n inputSchema: z.object({\n skillName: z.string().describe(\"The name of the skill.\"),\n scriptPath: z.string().describe(\"A path listed in the skill scripts.\"),\n }),\n outputSchema: z.string(),\n execute: ({ skillName, scriptPath }) => registry.readScript(skillName, scriptPath),\n }),\n ),\n markSkillTool(\n createTool({\n name: \"run_skill_script\",\n description: \"Execute a script from an Agent Skill with optional arguments.\",\n inputSchema: z.object({\n skillName: z.string().describe(\"The name of the skill.\"),\n scriptPath: z.string().describe(\"A path listed in the skill scripts.\"),\n args: z.array(z.string()).optional().describe(\"Arguments passed to the script.\"),\n timeoutMs: z.number().int().positive().optional().describe(\"Execution timeout in ms.\"),\n }),\n outputSchema: z.string(),\n execute: ({ skillName, scriptPath, args = [], timeoutMs = DEFAULT_TIMEOUT_MS }) =>\n registry.runScript(skillName, scriptPath, args, timeoutMs),\n }),\n ),\n ];\n}\n\nclass SkillRegistry {\n private readonly skills = new Map<string, Skill>();\n\n constructor(skills: Skill[]) {\n for (const skill of skills) {\n this.skills.set(skill.name, skill);\n }\n }\n\n get(skillName: string): Skill {\n const skill = this.skills.get(skillName);\n if (skill === undefined) {\n throw new Error(`Skill not found: ${skillName}`);\n }\n return skill;\n }\n\n async readReference(skillName: string, referencePath: string): Promise<string> {\n const skill = this.get(skillName);\n const path = this.resolveContainedPath(skill, \"references\", referencePath);\n if (!skill.references.includes(referencePath)) {\n throw new Error(`Skill reference not found: ${skillName}/${referencePath}`);\n }\n return readFile(path, \"utf8\");\n }\n\n async readScript(skillName: string, scriptPath: string): Promise<string> {\n const skill = this.get(skillName);\n const path = this.resolveContainedPath(skill, \"scripts\", scriptPath);\n if (!skill.scripts.includes(scriptPath)) {\n throw new Error(`Skill script not found: ${skillName}/${scriptPath}`);\n }\n return readFile(path, \"utf8\");\n }\n\n async runScript(\n skillName: string,\n scriptPath: string,\n args: string[],\n timeoutMs: number,\n ): Promise<string> {\n const skill = this.get(skillName);\n const script = this.resolveContainedPath(skill, \"scripts\", scriptPath);\n if (!skill.scripts.includes(scriptPath)) {\n throw new Error(`Skill script not found: ${skillName}/${scriptPath}`);\n }\n return runExecutable(script, args, skill.directory, timeoutMs);\n }\n\n private resolveContainedPath(\n skill: Skill,\n section: \"references\" | \"scripts\",\n requestedPath: string,\n ): string {\n if (requestedPath.length === 0 || isAbsolute(requestedPath)) {\n throw new Error(`Invalid skill path: ${requestedPath}`);\n }\n\n const root = resolve(skill.directory, section);\n const resolved = resolve(root, requestedPath);\n const rel = relative(root, resolved);\n if (rel === \"..\" || rel.startsWith(`..${\"/\"}`) || rel.startsWith(`..${\"\\\\\"}`)) {\n throw new Error(`Invalid skill path: ${requestedPath}`);\n }\n\n return resolved;\n }\n}\n\nfunction runExecutable(\n command: string,\n args: string[],\n cwd: string,\n timeoutMs: number,\n): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(command, args, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill();\n }, timeoutMs);\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => {\n stdout = appendLimited(stdout, chunk);\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr = appendLimited(stderr, chunk);\n });\n child.on(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n child.on(\"close\", (code, signal) => {\n clearTimeout(timeout);\n if (timedOut) {\n reject(new Error(`Skill script timed out after ${timeoutMs}ms`));\n return;\n }\n\n const output = formatProcessOutput(stdout, stderr);\n if (code !== 0) {\n reject(new Error(`Skill script exited with code ${code ?? \"unknown\"}: ${output}`));\n return;\n }\n if (signal !== null) {\n reject(new Error(`Skill script exited with signal ${signal}: ${output}`));\n return;\n }\n\n resolvePromise(output);\n });\n });\n}\n\nfunction formatProcessOutput(stdout: string, stderr: string): string {\n const parts: string[] = [];\n if (stdout.length > 0) {\n parts.push(`stdout:\\n${stdout}`);\n }\n if (stderr.length > 0) {\n parts.push(`stderr:\\n${stderr}`);\n }\n return parts.length === 0 ? \"\" : parts.join(\"\\n\\n\");\n}\n\nfunction appendLimited(current: string, chunk: string): string {\n const next = current + chunk;\n if (next.length <= MAX_OUTPUT_CHARS) {\n return next;\n }\n return `${next.slice(0, MAX_OUTPUT_CHARS)}\\n[truncated]`;\n}\n","import { skillInstructions } from \"./instructions\";\nimport { createSkillTools } from \"./tools\";\nimport type { Skill, SkillLoader, SkillSet } from \"./types\";\n\nexport async function loadSkills(loaders: SkillLoader | SkillLoader[]): Promise<SkillSet> {\n const ordered = Array.isArray(loaders) ? loaders : [loaders];\n const byName = new Map<string, Skill>();\n\n for (const loader of ordered) {\n for (const loaded of await loader.load()) {\n byName.delete(loaded.name);\n byName.set(loaded.name, loaded);\n }\n }\n\n const skills = [...byName.values()];\n return {\n skills,\n instructions: skillInstructions(skills),\n tools: skills.length === 0 ? [] : createSkillTools(skills),\n };\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { basename, join, relative, resolve, sep } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { isRecord } from \"../internal/record\";\nimport type { Skill, SkillLoader, SkillValidationIssue } from \"./types\";\nimport { SkillValidationError } from \"./types\";\n\ntype SkillFrontmatter = {\n name?: unknown;\n description?: unknown;\n license?: unknown;\n metadata?: unknown;\n};\n\nconst NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst MAX_NAME_LENGTH = 64;\nconst MAX_DESCRIPTION_LENGTH = 1024;\n\nexport const skill = {\n local(path: string): SkillLoader {\n return {\n load: () => loadLocalSkills(path),\n };\n },\n};\n\nasync function loadLocalSkills(path: string): Promise<Skill[]> {\n const root = resolve(path);\n if (await hasSkillFile(root)) {\n return [await readSkill(root)];\n }\n\n const entries = await readdir(root, { withFileTypes: true });\n const skills: Skill[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const directory = join(root, entry.name);\n if (await hasSkillFile(directory)) {\n skills.push(await readSkill(directory));\n }\n }\n return skills;\n}\n\nasync function hasSkillFile(directory: string): Promise<boolean> {\n try {\n const info = await stat(join(directory, \"SKILL.md\"));\n return info.isFile();\n } catch {\n return false;\n }\n}\n\nasync function readSkill(directory: string): Promise<Skill> {\n const skillPath = join(directory, \"SKILL.md\");\n const markdown = await readFile(skillPath, \"utf8\");\n const parsed = parseSkillMarkdown(markdown, skillPath);\n validateSkillFrontmatter(parsed.frontmatter, directory, skillPath);\n\n const name = parsed.frontmatter.name as string;\n const description = parsed.frontmatter.description as string;\n const license =\n typeof parsed.frontmatter.license === \"string\" ? parsed.frontmatter.license : undefined;\n const metadata = isRecord(parsed.frontmatter.metadata) ? parsed.frontmatter.metadata : undefined;\n\n return {\n name,\n description,\n instructions: parsed.body.trim(),\n directory,\n references: await listRelativeFiles(join(directory, \"references\")),\n scripts: await listRelativeFiles(join(directory, \"scripts\")),\n license,\n metadata,\n };\n}\n\nfunction parseSkillMarkdown(\n markdown: string,\n path: string,\n): { frontmatter: SkillFrontmatter; body: string } {\n if (!markdown.startsWith(\"---\\n\") && !markdown.startsWith(\"---\\r\\n\")) {\n throw new SkillValidationError(\"Skill validation failed\", [\n { path, message: \"SKILL.md must start with YAML frontmatter\" },\n ]);\n }\n\n const newline = markdown.startsWith(\"---\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const marker = `${newline}---${newline}`;\n const end = markdown.indexOf(marker, 3);\n if (end === -1) {\n throw new SkillValidationError(\"Skill validation failed\", [\n { path, message: \"SKILL.md frontmatter must end with ---\" },\n ]);\n }\n\n const rawFrontmatter = markdown.slice(3 + newline.length, end);\n const body = markdown.slice(end + marker.length);\n const parsed = parseYaml(rawFrontmatter);\n if (!isRecord(parsed)) {\n throw new SkillValidationError(\"Skill validation failed\", [\n { path, message: \"SKILL.md frontmatter must be a YAML object\" },\n ]);\n }\n\n return { frontmatter: parsed, body };\n}\n\nfunction validateSkillFrontmatter(\n frontmatter: SkillFrontmatter,\n directory: string,\n path: string,\n): void {\n const issues: SkillValidationIssue[] = [];\n const name = frontmatter.name;\n const description = frontmatter.description;\n\n if (typeof name !== \"string\" || name.length === 0) {\n issues.push({ path, message: \"name is required\" });\n } else {\n if (name.length > MAX_NAME_LENGTH) {\n issues.push({ path, message: `name must be at most ${MAX_NAME_LENGTH} characters` });\n }\n if (!NAME_PATTERN.test(name)) {\n issues.push({\n path,\n message: \"name must contain lowercase letters, numbers, and hyphens only\",\n });\n }\n if (basename(directory) !== name) {\n issues.push({ path, message: \"name must match the skill directory name\" });\n }\n }\n\n if (typeof description !== \"string\" || description.length === 0) {\n issues.push({ path, message: \"description is required\" });\n } else if (description.length > MAX_DESCRIPTION_LENGTH) {\n issues.push({\n path,\n message: `description must be at most ${MAX_DESCRIPTION_LENGTH} characters`,\n });\n }\n\n if (issues.length > 0) {\n throw new SkillValidationError(\"Skill validation failed\", issues);\n }\n}\n\nasync function listRelativeFiles(directory: string): Promise<string[]> {\n try {\n const info = await stat(directory);\n if (!info.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const files: string[] = [];\n await collectFiles(directory, directory, files);\n return files.sort();\n}\n\nasync function collectFiles(root: string, directory: string, files: string[]): Promise<void> {\n const entries = await readdir(directory, { withFileTypes: true });\n for (const entry of entries) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n await collectFiles(root, path, files);\n } else if (entry.isFile()) {\n files.push(toPortablePath(relative(root, path)));\n }\n }\n}\n\nfunction toPortablePath(path: string): string {\n return sep === \"/\" ? path : path.split(sep).join(\"/\");\n}\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { AnyTool } from \"../tool\";\n\nexport type Skill = {\n readonly name: string;\n readonly description: string;\n readonly instructions: string;\n readonly directory: string;\n readonly references: string[];\n readonly scripts: string[];\n readonly license?: string | undefined;\n readonly metadata?: Record<string, unknown> | undefined;\n};\n\nexport type SkillLoader = {\n load(): Promise<Skill[]>;\n};\n\nexport type SkillSet = {\n readonly skills: Skill[];\n readonly tools: AnyTool[];\n readonly instructions: string;\n};\n\nexport type SkillValidationIssue = {\n path: string;\n message: string;\n};\n\nexport class SkillValidationError extends Error {\n readonly issues: SkillValidationIssue[];\n\n constructor(message: string, issues: SkillValidationIssue[]) {\n super(message);\n this.name = \"SkillValidationError\";\n this.issues = issues;\n }\n}\n"],"mappings":"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","names":["skill","skill","readFile","relative","resolve","resolve","readFile","relative"]}
@@ -15,7 +15,7 @@ function isJsonValueWithAncestors(value, ancestors) {
15
15
  ancestors.add(value);
16
16
  try {
17
17
  if (Array.isArray(value)) {
18
- if (!hasOnlyDenseArrayProperties(value)) {
18
+ if (Object.getPrototypeOf(value) !== Array.prototype || !hasOnlyDenseArrayProperties(value)) {
19
19
  return false;
20
20
  }
21
21
  for (let index = 0; index < value.length; index += 1) {
@@ -66,4 +66,4 @@ function hasOnlyDenseArrayProperties(value) {
66
66
  export {
67
67
  isJsonValue
68
68
  };
69
- //# sourceMappingURL=chunk-SROQA7I7.js.map
69
+ //# sourceMappingURL=chunk-3XQGVDU5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/completion/json.ts"],"sourcesContent":["import type { JsonValue } from \"./types\";\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n return isJsonValueWithAncestors(value, new WeakSet<object>());\n}\n\nfunction isJsonValueWithAncestors(value: unknown, ancestors: WeakSet<object>): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return true;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value);\n }\n if (typeof value !== \"object\" || ancestors.has(value)) {\n return false;\n }\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n if (Object.getPrototypeOf(value) !== Array.prototype || !hasOnlyDenseArrayProperties(value)) {\n return false;\n }\n for (let index = 0; index < value.length; index += 1) {\n if (!isJsonValueWithAncestors(value[index], ancestors)) {\n return false;\n }\n }\n return true;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return false;\n }\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== \"string\") {\n return false;\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (\n descriptor === undefined ||\n !descriptor.enumerable ||\n !(\"value\" in descriptor) ||\n !isJsonValueWithAncestors(descriptor.value, ancestors)\n ) {\n return false;\n }\n }\n return true;\n } catch {\n return false;\n } finally {\n ancestors.delete(value);\n }\n}\n\nfunction hasOnlyDenseArrayProperties(value: unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || keys.at(-1) !== \"length\") {\n return false;\n }\n for (let index = 0; index < value.length; index += 1) {\n const key = String(index);\n if (keys[index] !== key) {\n return false;\n }\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !descriptor.enumerable || !(\"value\" in descriptor)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":";AAEO,SAAS,YAAY,OAAoC;AAC9D,SAAO,yBAAyB,OAAO,oBAAI,QAAgB,CAAC;AAC9D;AAEA,SAAS,yBAAyB,OAAgB,WAAgD;AAChG,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC7E,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK;AAAA,EAC9B;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,IAAI,KAAK,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,YAAU,IAAI,KAAK;AACnB,MAAI;AACF,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAI,OAAO,eAAe,KAAK,MAAM,MAAM,aAAa,CAAC,4BAA4B,KAAK,GAAG;AAC3F,eAAO;AAAA,MACT;AACA,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAI,CAAC,yBAAyB,MAAM,KAAK,GAAG,SAAS,GAAG;AACtD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,QAAI,cAAc,OAAO,aAAa,cAAc,MAAM;AACxD,aAAO;AAAA,IACT;AACA,eAAW,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxC,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAO;AAAA,MACT;AACA,YAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAC7D,UACE,eAAe,UACf,CAAC,WAAW,cACZ,EAAE,WAAW,eACb,CAAC,yBAAyB,WAAW,OAAO,SAAS,GACrD;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,cAAU,OAAO,KAAK;AAAA,EACxB;AACF;AAEA,SAAS,4BAA4B,OAA2B;AAC9D,QAAM,OAAO,QAAQ,QAAQ,KAAK;AAClC,MAAI,KAAK,WAAW,MAAM,SAAS,KAAK,KAAK,GAAG,EAAE,MAAM,UAAU;AAChE,WAAO;AAAA,EACT;AACA,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,KAAK,KAAK,MAAM,KAAK;AACvB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAC7D,QAAI,eAAe,UAAa,CAAC,WAAW,cAAc,EAAE,WAAW,aAAa;AAClF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generateCompletion
3
- } from "./chunk-HSA6NL2E.js";
3
+ } from "./chunk-7PHMK7W4.js";
4
4
 
5
5
  // src/memory/errors.ts
6
6
  var MemoryCompactionError = class extends Error {
@@ -235,4 +235,4 @@ export {
235
235
  createMemoryCompactionSummary,
236
236
  cumulativeCompactedMessageCount
237
237
  };
238
- //# sourceMappingURL=chunk-DNQNOHD5.js.map
238
+ //# sourceMappingURL=chunk-5C6B6ZRH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Usage
3
- } from "./chunk-HSA6NL2E.js";
3
+ } from "./chunk-7PHMK7W4.js";
4
4
 
5
5
  // src/observability/snapshot.ts
6
6
  function observerSnapshot(value) {
@@ -320,4 +320,4 @@ export {
320
320
  AgentObserverDispatchError,
321
321
  startAgentRunObservers
322
322
  };
323
- //# sourceMappingURL=chunk-E5J4OY4K.js.map
323
+ //# sourceMappingURL=chunk-6BBOCFHV.js.map