@anvia/core 1.5.1 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +32 -1073
  2. package/dist/agent/agent-tool.js +4 -4
  3. package/dist/agent/agent.js +17 -17
  4. package/dist/agent/index.js +20 -20
  5. package/dist/agent/resolve-options.js +6 -6
  6. package/dist/agent/resolved-agent.js +18 -18
  7. package/dist/agent/team/agent-team.js +20 -20
  8. package/dist/agent/team/index.js +20 -20
  9. package/dist/agent/tool-catalog.js +6 -6
  10. package/dist/{chunk-QHGYCYV6.js → chunk-3FIX7GLM.js} +2 -2
  11. package/dist/{chunk-SIXS4CCU.js → chunk-4IOC4SP6.js} +4 -4
  12. package/dist/chunk-4IOC4SP6.js.map +1 -0
  13. package/dist/{chunk-JMMZICU7.js → chunk-4OSA3MMA.js} +39 -5
  14. package/dist/chunk-4OSA3MMA.js.map +1 -0
  15. package/dist/{chunk-YOLOFTAY.js → chunk-57AUTEQ6.js} +57 -5
  16. package/dist/chunk-57AUTEQ6.js.map +1 -0
  17. package/dist/{chunk-4VDDYI6P.js → chunk-5CQRCTIN.js} +2 -2
  18. package/dist/{chunk-F4BOW76L.js → chunk-5TGVDMGM.js} +4 -4
  19. package/dist/{chunk-TK2VXQVZ.js → chunk-7G3YQQVE.js} +3 -3
  20. package/dist/{chunk-NDAGW32C.js → chunk-7OHHMYRO.js} +2 -2
  21. package/dist/{chunk-3SUEXGRA.js → chunk-7V3DKQTI.js} +4 -4
  22. package/dist/{chunk-DXW37JLZ.js → chunk-AMPQJMDG.js} +5 -5
  23. package/dist/{chunk-ZQC6M22O.js → chunk-AQ47TF5K.js} +2 -2
  24. package/dist/{chunk-PZ7ATNR6.js → chunk-BI3T62GL.js} +9 -9
  25. package/dist/chunk-BI3T62GL.js.map +1 -0
  26. package/dist/{chunk-HAAGSIZH.js → chunk-CB2L2NIQ.js} +2 -2
  27. package/dist/{chunk-KX2TRKO2.js → chunk-GNBPXJC6.js} +2 -2
  28. package/dist/{chunk-YMTBHHLQ.js → chunk-HG6ASDNI.js} +3 -3
  29. package/dist/{chunk-JMNIWUFV.js → chunk-HILMAFZK.js} +2 -2
  30. package/dist/{chunk-PWWKX2HA.js → chunk-LGMH6PCB.js} +7 -7
  31. package/dist/{chunk-PPMK7CG4.js → chunk-LW6F3IGP.js} +2 -2
  32. package/dist/{chunk-UYODZ7OE.js → chunk-LWF6AHDG.js} +2 -2
  33. package/dist/{chunk-2JZV4LUS.js → chunk-MKY7KTZY.js} +3 -13
  34. package/dist/chunk-MKY7KTZY.js.map +1 -0
  35. package/dist/{chunk-RFFOL6ON.js → chunk-MWG2PMTE.js} +18 -5
  36. package/dist/chunk-MWG2PMTE.js.map +1 -0
  37. package/dist/{chunk-AJC6YRVB.js → chunk-O7NN7PF4.js} +3 -3
  38. package/dist/{chunk-GDY2Z2SZ.js → chunk-PFJN5OIQ.js} +2 -2
  39. package/dist/{chunk-XAVSWLX5.js → chunk-PV6KJWYO.js} +2 -2
  40. package/dist/chunk-PZC5UHIN.js +190 -0
  41. package/dist/chunk-PZC5UHIN.js.map +1 -0
  42. package/dist/{chunk-V5DWNXVH.js → chunk-W2XPREWL.js} +135 -26
  43. package/dist/chunk-W2XPREWL.js.map +1 -0
  44. package/dist/chunk-W6V63YPY.js +96 -0
  45. package/dist/chunk-W6V63YPY.js.map +1 -0
  46. package/dist/{chunk-LJGQ6VQB.js → chunk-XJ5X3NI4.js} +89 -30
  47. package/dist/chunk-XJ5X3NI4.js.map +1 -0
  48. package/dist/{chunk-HHMLE3TZ.js → chunk-YCTXTOOQ.js} +7 -16
  49. package/dist/chunk-YCTXTOOQ.js.map +1 -0
  50. package/dist/{chunk-7TUAAGVR.js → chunk-YKWUFYXT.js} +2 -2
  51. package/dist/{chunk-5SJBSCG2.js → chunk-YSR6KLCS.js} +8 -2
  52. package/dist/chunk-YSR6KLCS.js.map +1 -0
  53. package/dist/completion/generate-completion.js +3 -3
  54. package/dist/completion/index.js +3 -3
  55. package/dist/completion/stream-accumulator.js +1 -1
  56. package/dist/embeddings/embed.js +1 -1
  57. package/dist/embeddings/index.js +1 -1
  58. package/dist/evals/advanced-metrics.js +6 -6
  59. package/dist/evals/agent-target.js +2 -1
  60. package/dist/evals/cli.js +6 -6
  61. package/dist/evals/execution.js +3 -1
  62. package/dist/evals/index.js +12 -12
  63. package/dist/evals/judge.js +5 -5
  64. package/dist/evals/metrics.js +6 -6
  65. package/dist/evals/runner.js +5 -5
  66. package/dist/extractor/extractor.js +4 -4
  67. package/dist/extractor/index.js +4 -4
  68. package/dist/index.js +23 -23
  69. package/dist/internal/agent-runtime/agent-run.js +13 -13
  70. package/dist/internal/agent-runtime/continuation-state.js +3 -3
  71. package/dist/internal/agent-runtime/interaction-suspension.js +3 -3
  72. package/dist/internal/agent-runtime/memory.js +5 -5
  73. package/dist/internal/agent-runtime/retrieval.js +5 -5
  74. package/dist/internal/agent-runtime/tool-execution.js +8 -8
  75. package/dist/internal/agent.js +18 -18
  76. package/dist/internal/team-runtime/member.js +3 -3
  77. package/dist/internal/team-runtime/run.js +19 -19
  78. package/dist/memory/compaction.js +4 -4
  79. package/dist/memory/index.js +4 -4
  80. package/dist/observability/group.js +3 -3
  81. package/dist/observability/index.js +3 -3
  82. package/dist/pipeline/index.js +6 -6
  83. package/dist/pipeline/pipeline.js +6 -6
  84. package/dist/schema/standard-json-schema.js +1 -1
  85. package/dist/skills/index.js +7 -7
  86. package/dist/skills/load.js +7 -7
  87. package/dist/skills/tools.js +6 -6
  88. package/dist/streaming/index.d.ts +2 -1
  89. package/dist/streaming/index.js +2 -1
  90. package/dist/streaming/readable-stream.js +2 -1
  91. package/dist/tool/dynamic-tools.js +5 -5
  92. package/dist/tool/index.js +5 -5
  93. package/dist/vector-store/index.js +4 -4
  94. package/dist/vector-store/ingest.js +2 -2
  95. package/dist/vector-store/retrieve.js +2 -2
  96. package/package.json +1 -1
  97. package/dist/chunk-2JZV4LUS.js.map +0 -1
  98. package/dist/chunk-54ZZJRP2.js +0 -57
  99. package/dist/chunk-54ZZJRP2.js.map +0 -1
  100. package/dist/chunk-5SJBSCG2.js.map +0 -1
  101. package/dist/chunk-HHMLE3TZ.js.map +0 -1
  102. package/dist/chunk-JMMZICU7.js.map +0 -1
  103. package/dist/chunk-LJGQ6VQB.js.map +0 -1
  104. package/dist/chunk-NNEKBZSM.js +0 -66
  105. package/dist/chunk-NNEKBZSM.js.map +0 -1
  106. package/dist/chunk-PZ7ATNR6.js.map +0 -1
  107. package/dist/chunk-RFFOL6ON.js.map +0 -1
  108. package/dist/chunk-SIXS4CCU.js.map +0 -1
  109. package/dist/chunk-V5DWNXVH.js.map +0 -1
  110. package/dist/chunk-YOLOFTAY.js.map +0 -1
  111. /package/dist/{chunk-QHGYCYV6.js.map → chunk-3FIX7GLM.js.map} +0 -0
  112. /package/dist/{chunk-4VDDYI6P.js.map → chunk-5CQRCTIN.js.map} +0 -0
  113. /package/dist/{chunk-F4BOW76L.js.map → chunk-5TGVDMGM.js.map} +0 -0
  114. /package/dist/{chunk-TK2VXQVZ.js.map → chunk-7G3YQQVE.js.map} +0 -0
  115. /package/dist/{chunk-NDAGW32C.js.map → chunk-7OHHMYRO.js.map} +0 -0
  116. /package/dist/{chunk-3SUEXGRA.js.map → chunk-7V3DKQTI.js.map} +0 -0
  117. /package/dist/{chunk-DXW37JLZ.js.map → chunk-AMPQJMDG.js.map} +0 -0
  118. /package/dist/{chunk-ZQC6M22O.js.map → chunk-AQ47TF5K.js.map} +0 -0
  119. /package/dist/{chunk-HAAGSIZH.js.map → chunk-CB2L2NIQ.js.map} +0 -0
  120. /package/dist/{chunk-KX2TRKO2.js.map → chunk-GNBPXJC6.js.map} +0 -0
  121. /package/dist/{chunk-YMTBHHLQ.js.map → chunk-HG6ASDNI.js.map} +0 -0
  122. /package/dist/{chunk-JMNIWUFV.js.map → chunk-HILMAFZK.js.map} +0 -0
  123. /package/dist/{chunk-PWWKX2HA.js.map → chunk-LGMH6PCB.js.map} +0 -0
  124. /package/dist/{chunk-PPMK7CG4.js.map → chunk-LW6F3IGP.js.map} +0 -0
  125. /package/dist/{chunk-UYODZ7OE.js.map → chunk-LWF6AHDG.js.map} +0 -0
  126. /package/dist/{chunk-AJC6YRVB.js.map → chunk-O7NN7PF4.js.map} +0 -0
  127. /package/dist/{chunk-GDY2Z2SZ.js.map → chunk-PFJN5OIQ.js.map} +0 -0
  128. /package/dist/{chunk-XAVSWLX5.js.map → chunk-PV6KJWYO.js.map} +0 -0
  129. /package/dist/{chunk-7TUAAGVR.js.map → chunk-YKWUFYXT.js.map} +0 -0
@@ -0,0 +1,96 @@
1
+ import {
2
+ abortable,
3
+ composeEvalSignals
4
+ } from "./chunk-4OSA3MMA.js";
5
+ import {
6
+ AgentRunBlockedError
7
+ } from "./chunk-WN6AVBO4.js";
8
+
9
+ // src/evals/agent-target.ts
10
+ var AgentEvalSuspensionError = class extends Error {
11
+ constructor(result, message = "Agent eval target suspended without an interaction responder.") {
12
+ super(message);
13
+ this.result = result;
14
+ this.name = "AgentEvalSuspensionError";
15
+ }
16
+ result;
17
+ };
18
+ function agentEvalTarget(options) {
19
+ return async (input, testCase, context) => {
20
+ context?.signal.throwIfAborted();
21
+ const maxResponses = options.interactions?.maxResponses ?? 10;
22
+ if (!Number.isSafeInteger(maxResponses) || maxResponses < 1) {
23
+ throw new TypeError("Agent eval interactions.maxResponses must be a positive integer.");
24
+ }
25
+ const request = await abortable(
26
+ context?.signal,
27
+ Promise.resolve(options.request({ input, testCase }))
28
+ );
29
+ context?.signal.throwIfAborted();
30
+ const invocation = composeEvalSignals(context?.signal, request.abortSignal);
31
+ const { signal } = invocation;
32
+ try {
33
+ signal?.throwIfAborted();
34
+ const ownedRequest = { ...request, abortSignal: signal };
35
+ const runSettings = agentRunSettings(ownedRequest);
36
+ let response = await abortable(signal, options.agent.generate(ownedRequest));
37
+ signal?.throwIfAborted();
38
+ let phase = 0;
39
+ while (response.type === "interaction") {
40
+ if (options.interactions === void 0) {
41
+ throw new AgentEvalSuspensionError(response);
42
+ }
43
+ if (phase >= maxResponses) {
44
+ throw new AgentEvalSuspensionError(
45
+ response,
46
+ `Agent eval target exceeded the interaction response limit of ${maxResponses}.`
47
+ );
48
+ }
49
+ phase += 1;
50
+ const interactionResponse = await abortable(
51
+ signal,
52
+ Promise.resolve(
53
+ options.interactions.respond({
54
+ interaction: response.interaction,
55
+ testCase,
56
+ phase
57
+ })
58
+ )
59
+ );
60
+ signal?.throwIfAborted();
61
+ response = await abortable(
62
+ signal,
63
+ options.agent.generate({
64
+ continuation: response.continuation,
65
+ response: interactionResponse,
66
+ ...runSettings
67
+ })
68
+ );
69
+ signal?.throwIfAborted();
70
+ }
71
+ if (response.type === "blocked") throw new AgentRunBlockedError(response);
72
+ const output = options.output === void 0 ? response : await abortable(signal, Promise.resolve(options.output({ response, testCase })));
73
+ signal?.throwIfAborted();
74
+ return output;
75
+ } finally {
76
+ invocation.dispose();
77
+ }
78
+ };
79
+ }
80
+ function agentRunSettings(request) {
81
+ const {
82
+ prompt: _prompt,
83
+ messages: _messages,
84
+ session: _session,
85
+ continuation: _continuation,
86
+ response: _response,
87
+ ...settings
88
+ } = request;
89
+ return settings;
90
+ }
91
+
92
+ export {
93
+ AgentEvalSuspensionError,
94
+ agentEvalTarget
95
+ };
96
+ //# sourceMappingURL=chunk-W6V63YPY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/evals/agent-target.ts"],"sourcesContent":["import { AgentRunBlockedError } from \"../agent/errors\";\nimport type { AgentInteractionRequest, AgentInteractionResponse } from \"../agent/interactions\";\nimport type {\n AgentInteractionOutcome,\n AgentOutcome,\n AgentResponse,\n AgentRunOptions,\n AgentRunSettings,\n} from \"../agent/run-types\";\nimport { abortable, composeEvalSignals } from \"./execution\";\nimport type { EvalCase, EvalTarget } from \"./types\";\n\ntype EvaluableAgent<Output> = {\n generate(input: AgentRunOptions<Output>): Promise<AgentOutcome<Output>>;\n};\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\ntype IsExactly<Left, Right> =\n IsAny<Left> extends true\n ? false\n : [Left] extends [Right]\n ? [Right] extends [Left]\n ? true\n : false\n : false;\n\nexport type AgentEvalTargetOptions<\n Input,\n AgentOutput = string,\n Output = AgentResponse<AgentOutput>,\n Expected = unknown,\n> = {\n agent: EvaluableAgent<AgentOutput>;\n request(args: {\n input: Input;\n testCase: EvalCase<Input, Expected>;\n }): AgentRunOptions<AgentOutput> | Promise<AgentRunOptions<AgentOutput>>;\n interactions?:\n | {\n maxResponses?: number | undefined;\n respond(args: {\n interaction: AgentInteractionRequest;\n testCase: EvalCase<Input, Expected>;\n phase: number;\n }): AgentInteractionResponse | Promise<AgentInteractionResponse>;\n }\n | undefined;\n} & (IsExactly<Output, AgentResponse<AgentOutput>> extends true\n ? {\n output?(args: {\n response: AgentResponse<AgentOutput>;\n testCase: EvalCase<Input, Expected>;\n }): Output | Promise<Output>;\n }\n : {\n output(args: {\n response: AgentResponse<AgentOutput>;\n testCase: EvalCase<Input, Expected>;\n }): Output | Promise<Output>;\n });\n\nexport class AgentEvalSuspensionError extends Error {\n constructor(\n readonly result: AgentInteractionOutcome,\n message = \"Agent eval target suspended without an interaction responder.\",\n ) {\n super(message);\n this.name = \"AgentEvalSuspensionError\";\n }\n}\n\nexport function agentEvalTarget<\n Input,\n AgentOutput = string,\n Output = AgentResponse<AgentOutput>,\n Expected = unknown,\n>(\n options: AgentEvalTargetOptions<Input, AgentOutput, Output, Expected>,\n): EvalTarget<Input, Output, Expected> {\n return async (input, testCase, context) => {\n context?.signal.throwIfAborted();\n const maxResponses = options.interactions?.maxResponses ?? 10;\n if (!Number.isSafeInteger(maxResponses) || maxResponses < 1) {\n throw new TypeError(\"Agent eval interactions.maxResponses must be a positive integer.\");\n }\n const request = await abortable(\n context?.signal,\n Promise.resolve(options.request({ input, testCase })),\n );\n context?.signal.throwIfAborted();\n const invocation = composeEvalSignals(context?.signal, request.abortSignal);\n const { signal } = invocation;\n try {\n signal?.throwIfAborted();\n const ownedRequest = { ...request, abortSignal: signal };\n const runSettings = agentRunSettings(ownedRequest);\n let response = await abortable(signal, options.agent.generate(ownedRequest));\n signal?.throwIfAborted();\n let phase = 0;\n while (response.type === \"interaction\") {\n if (options.interactions === undefined) {\n throw new AgentEvalSuspensionError(response);\n }\n if (phase >= maxResponses) {\n throw new AgentEvalSuspensionError(\n response,\n `Agent eval target exceeded the interaction response limit of ${maxResponses}.`,\n );\n }\n phase += 1;\n const interactionResponse = await abortable(\n signal,\n Promise.resolve(\n options.interactions.respond({\n interaction: response.interaction,\n testCase,\n phase,\n }),\n ),\n );\n signal?.throwIfAborted();\n response = await abortable(\n signal,\n options.agent.generate({\n continuation: response.continuation,\n response: interactionResponse,\n ...runSettings,\n }),\n );\n signal?.throwIfAborted();\n }\n if (response.type === \"blocked\") throw new AgentRunBlockedError(response);\n const output =\n options.output === undefined\n ? (response as Output)\n : await abortable(signal, Promise.resolve(options.output({ response, testCase })));\n signal?.throwIfAborted();\n return output;\n } finally {\n invocation.dispose();\n }\n };\n}\n\nfunction agentRunSettings<Output>(request: AgentRunOptions<Output>): AgentRunSettings<Output> {\n const {\n prompt: _prompt,\n messages: _messages,\n session: _session,\n continuation: _continuation,\n response: _response,\n ...settings\n } = request;\n return settings;\n}\n"],"mappings":";;;;;;;;;AA6DO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YACW,QACT,UAAU,iEACV;AACA,UAAM,OAAO;AAHJ;AAIT,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAMb;AAEO,SAAS,gBAMd,SACqC;AACrC,SAAO,OAAO,OAAO,UAAU,YAAY;AACzC,aAAS,OAAO,eAAe;AAC/B,UAAM,eAAe,QAAQ,cAAc,gBAAgB;AAC3D,QAAI,CAAC,OAAO,cAAc,YAAY,KAAK,eAAe,GAAG;AAC3D,YAAM,IAAI,UAAU,kEAAkE;AAAA,IACxF;AACA,UAAM,UAAU,MAAM;AAAA,MACpB,SAAS;AAAA,MACT,QAAQ,QAAQ,QAAQ,QAAQ,EAAE,OAAO,SAAS,CAAC,CAAC;AAAA,IACtD;AACA,aAAS,OAAO,eAAe;AAC/B,UAAM,aAAa,mBAAmB,SAAS,QAAQ,QAAQ,WAAW;AAC1E,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI;AACF,cAAQ,eAAe;AACvB,YAAM,eAAe,EAAE,GAAG,SAAS,aAAa,OAAO;AACvD,YAAM,cAAc,iBAAiB,YAAY;AACjD,UAAI,WAAW,MAAM,UAAU,QAAQ,QAAQ,MAAM,SAAS,YAAY,CAAC;AAC3E,cAAQ,eAAe;AACvB,UAAI,QAAQ;AACZ,aAAO,SAAS,SAAS,eAAe;AACtC,YAAI,QAAQ,iBAAiB,QAAW;AACtC,gBAAM,IAAI,yBAAyB,QAAQ;AAAA,QAC7C;AACA,YAAI,SAAS,cAAc;AACzB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,gEAAgE,YAAY;AAAA,UAC9E;AAAA,QACF;AACA,iBAAS;AACT,cAAM,sBAAsB,MAAM;AAAA,UAChC;AAAA,UACA,QAAQ;AAAA,YACN,QAAQ,aAAa,QAAQ;AAAA,cAC3B,aAAa,SAAS;AAAA,cACtB;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AACA,gBAAQ,eAAe;AACvB,mBAAW,MAAM;AAAA,UACf;AAAA,UACA,QAAQ,MAAM,SAAS;AAAA,YACrB,cAAc,SAAS;AAAA,YACvB,UAAU;AAAA,YACV,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AACA,gBAAQ,eAAe;AAAA,MACzB;AACA,UAAI,SAAS,SAAS,UAAW,OAAM,IAAI,qBAAqB,QAAQ;AACxE,YAAM,SACJ,QAAQ,WAAW,SACd,WACD,MAAM,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,EAAE,UAAU,SAAS,CAAC,CAAC,CAAC;AACrF,cAAQ,eAAe;AACvB,aAAO;AAAA,IACT,UAAE;AACA,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,iBAAyB,SAA4D;AAC5F,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,GAAG;AAAA,EACL,IAAI;AACJ,SAAO;AACT;","names":[]}
@@ -4,6 +4,10 @@ import {
4
4
  import {
5
5
  createTool
6
6
  } from "./chunk-Y365ABZY.js";
7
+ import {
8
+ abortError,
9
+ throwIfAborted
10
+ } from "./chunk-USRKPEQN.js";
7
11
 
8
12
  // src/skills/tools.ts
9
13
  import { spawn } from "child_process";
@@ -12,6 +16,8 @@ import { isAbsolute, relative, resolve } from "path";
12
16
  import { z } from "zod";
13
17
  var DEFAULT_TIMEOUT_MS = 3e4;
14
18
  var MAX_OUTPUT_CHARS = 2e4;
19
+ var TERMINATION_GRACE_MS = 250;
20
+ var TERMINATION_WATCHDOG_MS = 1250;
15
21
  function createSkillTools(skills) {
16
22
  const registry = new SkillRegistry(skills);
17
23
  return [
@@ -61,7 +67,7 @@ function createSkillTools(skills) {
61
67
  timeoutMs: z.number().int().positive().optional().describe("Execution timeout in ms.")
62
68
  }),
63
69
  outputSchema: z.string(),
64
- execute: ({ skillName, scriptPath, args = [], timeoutMs = DEFAULT_TIMEOUT_MS }) => registry.runScript(skillName, scriptPath, args, timeoutMs)
70
+ execute: ({ skillName, scriptPath, args = [], timeoutMs = DEFAULT_TIMEOUT_MS }, context) => registry.runScript(skillName, scriptPath, args, timeoutMs, context.abortSignal)
65
71
  })
66
72
  )
67
73
  ];
@@ -96,13 +102,13 @@ var SkillRegistry = class {
96
102
  }
97
103
  return readFile(path, "utf8");
98
104
  }
99
- async runScript(skillName, scriptPath, args, timeoutMs) {
105
+ async runScript(skillName, scriptPath, args, timeoutMs, abortSignal) {
100
106
  const skill = this.get(skillName);
101
107
  const script = this.resolveContainedPath(skill, "scripts", scriptPath);
102
108
  if (!skill.scripts.includes(scriptPath)) {
103
109
  throw new Error(`Skill script not found: ${skillName}/${scriptPath}`);
104
110
  }
105
- return runExecutable(script, args, skill.directory, timeoutMs);
111
+ return runExecutable(script, args, skill.directory, timeoutMs, abortSignal);
106
112
  }
107
113
  resolveContainedPath(skill, section, requestedPath) {
108
114
  if (requestedPath.length === 0 || isAbsolute(requestedPath)) {
@@ -117,8 +123,9 @@ var SkillRegistry = class {
117
123
  return resolved;
118
124
  }
119
125
  };
120
- function runExecutable(command, args, cwd, timeoutMs) {
126
+ function runExecutable(command, args, cwd, timeoutMs, abortSignal) {
121
127
  return new Promise((resolvePromise, reject) => {
128
+ throwIfAborted(abortSignal);
122
129
  const child = spawn(command, args, {
123
130
  cwd,
124
131
  shell: false,
@@ -126,40 +133,92 @@ function runExecutable(command, args, cwd, timeoutMs) {
126
133
  });
127
134
  let stdout = "";
128
135
  let stderr = "";
129
- let timedOut = false;
136
+ let exited = false;
137
+ let settled = false;
138
+ let firstCause;
139
+ let escalation;
140
+ let watchdog;
130
141
  const timeout = setTimeout(() => {
131
- timedOut = true;
132
- child.kill();
142
+ beginTermination(new Error(`Skill script timed out after ${timeoutMs}ms`));
133
143
  }, timeoutMs);
134
- child.stdout.setEncoding("utf8");
135
- child.stderr.setEncoding("utf8");
136
- child.stdout.on("data", (chunk) => {
137
- stdout = appendLimited(stdout, chunk);
138
- });
139
- child.stderr.on("data", (chunk) => {
140
- stderr = appendLimited(stderr, chunk);
141
- });
142
- child.on("error", (error) => {
144
+ function settle(error, output = "") {
145
+ if (settled) return;
146
+ settled = true;
143
147
  clearTimeout(timeout);
144
- reject(error);
145
- });
146
- child.on("close", (code, signal) => {
148
+ clearTimeout(escalation);
149
+ clearTimeout(watchdog);
150
+ abortSignal?.removeEventListener("abort", onAbort);
151
+ child.removeListener("error", onError);
152
+ child.removeListener("exit", onExit);
153
+ child.removeListener("close", onClose);
154
+ child.stdout.removeListener("data", onStdout);
155
+ child.stderr.removeListener("data", onStderr);
156
+ if (error !== void 0) reject(error);
157
+ else resolvePromise(output);
158
+ }
159
+ function finishTermination() {
160
+ child.stdout.destroy();
161
+ child.stderr.destroy();
162
+ settle(firstCause);
163
+ }
164
+ function beginTermination(cause) {
165
+ if (settled || firstCause !== void 0) return;
166
+ firstCause = cause;
147
167
  clearTimeout(timeout);
148
- if (timedOut) {
149
- reject(new Error(`Skill script timed out after ${timeoutMs}ms`));
168
+ if (exited) {
169
+ finishTermination();
150
170
  return;
151
171
  }
152
- const output = formatProcessOutput(stdout, stderr);
153
- if (code !== 0) {
154
- reject(new Error(`Skill script exited with code ${code ?? "unknown"}: ${output}`));
172
+ escalation = setTimeout(() => {
173
+ if (!exited) child.kill("SIGKILL");
174
+ }, TERMINATION_GRACE_MS);
175
+ watchdog = setTimeout(() => {
176
+ child.stdout.destroy();
177
+ child.stderr.destroy();
178
+ settle(new Error("Skill script termination could not be confirmed", { cause: firstCause }));
179
+ }, TERMINATION_WATCHDOG_MS);
180
+ child.kill("SIGTERM");
181
+ }
182
+ function onAbort() {
183
+ beginTermination(abortError(abortSignal?.reason));
184
+ }
185
+ function onError(error) {
186
+ if (child.pid === void 0) settle(error);
187
+ else beginTermination(error);
188
+ }
189
+ function onExit() {
190
+ exited = true;
191
+ if (firstCause !== void 0) finishTermination();
192
+ }
193
+ function onClose(code, signal) {
194
+ if (firstCause !== void 0) {
195
+ if (exited) finishTermination();
155
196
  return;
156
197
  }
157
- if (signal !== null) {
158
- reject(new Error(`Skill script exited with signal ${signal}: ${output}`));
159
- return;
198
+ const output = formatProcessOutput(stdout, stderr);
199
+ if (code !== 0) {
200
+ settle(new Error(`Skill script exited with code ${code ?? "unknown"}: ${output}`));
201
+ } else if (signal !== null) {
202
+ settle(new Error(`Skill script exited with signal ${signal}: ${output}`));
203
+ } else {
204
+ settle(void 0, output);
160
205
  }
161
- resolvePromise(output);
162
- });
206
+ }
207
+ function onStdout(chunk) {
208
+ stdout = appendLimited(stdout, chunk);
209
+ }
210
+ function onStderr(chunk) {
211
+ stderr = appendLimited(stderr, chunk);
212
+ }
213
+ child.stdout.setEncoding("utf8");
214
+ child.stderr.setEncoding("utf8");
215
+ child.stdout.on("data", onStdout);
216
+ child.stderr.on("data", onStderr);
217
+ child.on("error", onError);
218
+ child.on("exit", onExit);
219
+ child.on("close", onClose);
220
+ abortSignal?.addEventListener("abort", onAbort, { once: true });
221
+ if (abortSignal?.aborted === true) onAbort();
163
222
  });
164
223
  }
165
224
  function formatProcessOutput(stdout, stderr) {
@@ -186,4 +245,4 @@ function appendLimited(current, chunk) {
186
245
  export {
187
246
  createSkillTools
188
247
  };
189
- //# sourceMappingURL=chunk-LJGQ6VQB.js.map
248
+ //# sourceMappingURL=chunk-XJ5X3NI4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skills/tools.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { abortError, throwIfAborted } from \"../internal/abort\";\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;\nconst TERMINATION_GRACE_MS = 250;\nconst TERMINATION_WATCHDOG_MS = 1_250;\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 }, context) =>\n registry.runScript(skillName, scriptPath, args, timeoutMs, context.abortSignal),\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 abortSignal?: AbortSignal,\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, abortSignal);\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 abortSignal?: AbortSignal,\n): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n throwIfAborted(abortSignal);\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 exited = false;\n let settled = false;\n let firstCause: Error | undefined;\n let escalation: ReturnType<typeof setTimeout> | undefined;\n let watchdog: ReturnType<typeof setTimeout> | undefined;\n const timeout = setTimeout(() => {\n beginTermination(new Error(`Skill script timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n function settle(error?: Error, output = \"\"): void {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n clearTimeout(escalation);\n clearTimeout(watchdog);\n abortSignal?.removeEventListener(\"abort\", onAbort);\n child.removeListener(\"error\", onError);\n child.removeListener(\"exit\", onExit);\n child.removeListener(\"close\", onClose);\n child.stdout.removeListener(\"data\", onStdout);\n child.stderr.removeListener(\"data\", onStderr);\n if (error !== undefined) reject(error);\n else resolvePromise(output);\n }\n\n function finishTermination(): void {\n // Descendants can hold inherited pipes after the direct child has exited.\n child.stdout.destroy();\n child.stderr.destroy();\n settle(firstCause);\n }\n\n function beginTermination(cause: Error): void {\n if (settled || firstCause !== undefined) return;\n firstCause = cause;\n clearTimeout(timeout);\n if (exited) {\n finishTermination();\n return;\n }\n escalation = setTimeout(() => {\n if (!exited) child.kill(\"SIGKILL\");\n }, TERMINATION_GRACE_MS);\n watchdog = setTimeout(() => {\n child.stdout.destroy();\n child.stderr.destroy();\n settle(new Error(\"Skill script termination could not be confirmed\", { cause: firstCause }));\n }, TERMINATION_WATCHDOG_MS);\n child.kill(\"SIGTERM\");\n }\n\n function onAbort(): void {\n beginTermination(abortError(abortSignal?.reason));\n }\n\n function onError(error: Error): void {\n if (child.pid === undefined) settle(error);\n else beginTermination(error);\n }\n\n function onExit(): void {\n exited = true;\n if (firstCause !== undefined) finishTermination();\n }\n\n function onClose(code: number | null, signal: NodeJS.Signals | null): void {\n if (firstCause !== undefined) {\n if (exited) finishTermination();\n return;\n }\n const output = formatProcessOutput(stdout, stderr);\n if (code !== 0) {\n settle(new Error(`Skill script exited with code ${code ?? \"unknown\"}: ${output}`));\n } else if (signal !== null) {\n settle(new Error(`Skill script exited with signal ${signal}: ${output}`));\n } else {\n settle(undefined, output);\n }\n }\n\n function onStdout(chunk: string): void {\n stdout = appendLimited(stdout, chunk);\n }\n\n function onStderr(chunk: string): void {\n stderr = appendLimited(stderr, chunk);\n }\n\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", onStdout);\n child.stderr.on(\"data\", onStderr);\n child.on(\"error\", onError);\n child.on(\"exit\", onExit);\n child.on(\"close\", onClose);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n if (abortSignal?.aborted === true) onAbort();\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"],"mappings":"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","names":[]}
@@ -31,11 +31,6 @@ async function embedTexts(options) {
31
31
  (batch) => embedDenseBatch(options.model, batch, options)
32
32
  );
33
33
  const embeddings = results.flat();
34
- if (embeddings.length !== options.texts.length) {
35
- throw new Error(
36
- `Embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`
37
- );
38
- }
39
34
  return { embeddings };
40
35
  }
41
36
  async function embedSparseTexts(options) {
@@ -48,11 +43,6 @@ async function embedSparseTexts(options) {
48
43
  (batch) => embedSparseBatch(options.model, batch, options)
49
44
  );
50
45
  const embeddings = results.flat();
51
- if (embeddings.length !== options.texts.length) {
52
- throw new Error(
53
- `Sparse embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`
54
- );
55
- }
56
46
  return { embeddings };
57
47
  }
58
48
  async function embedSparseQuery(options) {
@@ -84,7 +74,6 @@ async function embedDocuments(options) {
84
74
  batch.map((item) => item.text),
85
75
  options
86
76
  );
87
- assertBatchLength("Embedding", embeddings.length, batch.length);
88
77
  return batch.map((item, index) => ({
89
78
  documentIndex: item.documentIndex,
90
79
  embedding: embeddings[index]
@@ -106,7 +95,6 @@ async function embedDocuments(options) {
106
95
  batch.map((item) => item.text),
107
96
  options
108
97
  );
109
- assertBatchLength("Embedding", embeddings.length, batch.length);
110
98
  return batch.map((item, index) => ({
111
99
  documentIndex: item.documentIndex,
112
100
  embedding: embeddings[index]
@@ -122,7 +110,6 @@ async function embedDocuments(options) {
122
110
  batch.map((item) => item.text),
123
111
  options
124
112
  );
125
- assertBatchLength("Sparse embedding", embeddings.length, batch.length);
126
113
  return batch.map((item, index) => ({
127
114
  documentIndex: item.documentIndex,
128
115
  embedding: embeddings[index]
@@ -147,6 +134,7 @@ async function embedDocuments(options) {
147
134
  }
148
135
  async function embedDenseBatch(model, texts, options) {
149
136
  throwIfAborted(options.abortSignal);
137
+ const expected = texts.length;
150
138
  const embeddings = await runWithRetries(
151
139
  () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),
152
140
  resolveRetries(options),
@@ -156,10 +144,12 @@ async function embedDenseBatch(model, texts, options) {
156
144
  for (const [index, embedding] of embeddings.entries()) {
157
145
  validateDenseEmbedding(embedding, model.dimensions, index);
158
146
  }
159
- return embeddings;
147
+ assertBatchLength("Embedding", embeddings.length, expected);
148
+ return embeddings.slice();
160
149
  }
161
150
  async function embedSparseBatch(model, texts, options) {
162
151
  throwIfAborted(options.abortSignal);
152
+ const expected = texts.length;
163
153
  const embeddings = await runWithRetries(
164
154
  () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),
165
155
  resolveRetries(options),
@@ -167,7 +157,8 @@ async function embedSparseBatch(model, texts, options) {
167
157
  );
168
158
  throwIfAborted(options.abortSignal);
169
159
  for (const [index, embedding] of embeddings.entries()) validateSparseEmbedding(embedding, index);
170
- return embeddings;
160
+ assertBatchLength("Sparse embedding", embeddings.length, expected);
161
+ return embeddings.slice();
171
162
  }
172
163
  function prepareDocuments(documents, options) {
173
164
  const ids = /* @__PURE__ */ new Set();
@@ -280,4 +271,4 @@ export {
280
271
  embedSparseQuery,
281
272
  embedDocuments
282
273
  };
283
- //# sourceMappingURL=chunk-HHMLE3TZ.js.map
274
+ //# sourceMappingURL=chunk-YCTXTOOQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embeddings/embed.ts"],"sourcesContent":["import { throwIfAborted } from \"../internal/abort\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport type { ModelCallOptions } from \"../model-call-options\";\nimport { type ResolvedRetryOptions, resolveRetryOptions, runWithRetries } from \"../retry\";\nimport type {\n EmbedDocumentsOptions,\n EmbedDocumentsResult,\n EmbeddedDocument,\n Embedding,\n EmbeddingOperationOptions,\n EmbedHybridDocumentsOptions,\n EmbedSparseQueryOptions,\n EmbedSparseQueryResult,\n EmbedSparseTextsOptions,\n EmbedSparseTextsResult,\n EmbedTextOptions,\n EmbedTextResult,\n EmbedTextsOptions,\n EmbedTextsResult,\n SparseEmbedding,\n VectorMetadata,\n} from \"./types\";\n\nexport async function embedText(options: EmbedTextOptions): Promise<EmbedTextResult> {\n const { embeddings } = await embedTexts({\n model: options.model,\n texts: [options.text],\n retries: options.retries,\n abortSignal: options.abortSignal,\n });\n const embedding = embeddings[0];\n if (embedding === undefined) throw new Error(\"Embedding model returned no embeddings\");\n return { embedding };\n}\n\nexport async function embedTexts(options: EmbedTextsOptions): Promise<EmbedTextsResult> {\n throwIfAborted(options.abortSignal);\n if (options.texts.length === 0) return { embeddings: [] };\n const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));\n const results = await mapWithConcurrency(batches, concurrency(options.concurrency), (batch) =>\n embedDenseBatch(options.model, batch, options),\n );\n const embeddings = results.flat();\n return { embeddings };\n}\n\nexport async function embedSparseTexts(\n options: EmbedSparseTextsOptions,\n): Promise<EmbedSparseTextsResult> {\n throwIfAborted(options.abortSignal);\n if (options.texts.length === 0) return { embeddings: [] };\n const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));\n const results = await mapWithConcurrency(batches, concurrency(options.concurrency), (batch) =>\n embedSparseBatch(options.model, batch, options),\n );\n const embeddings = results.flat();\n return { embeddings };\n}\n\nexport async function embedSparseQuery(\n options: EmbedSparseQueryOptions,\n): Promise<EmbedSparseQueryResult> {\n throwIfAborted(options.abortSignal);\n const embedding = await runWithRetries(\n () => {\n throwIfAborted(options.abortSignal);\n return options.model.embedQuery(options.query, modelCallOptions(options.abortSignal));\n },\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n validateSparseEmbedding(embedding, \"query\");\n return { embedding };\n}\n\nexport function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>>;\nexport function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedHybridDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>>;\nexport async function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedDocumentsOptions<T, Metadata> | EmbedHybridDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>> {\n throwIfAborted(options.abortSignal);\n const prepared = prepareDocuments(options.documents, options);\n const flatTexts = prepared.flatMap((item, documentIndex) =>\n item.texts.map((text) => ({ documentIndex, text })),\n );\n const concurrencyLimit = concurrency(options.concurrency);\n\n if (\"model\" in options && options.model !== undefined) {\n const batches = chunk(flatTexts, batchSize(options.model.maxBatchSize, flatTexts.length || 1));\n const results = await mapWithConcurrency(batches, concurrencyLimit, async (batch) => {\n const embeddings = await embedDenseBatch(\n options.model,\n batch.map((item) => item.text),\n options,\n );\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as Embedding,\n }));\n });\n const byDocument = groupEmbeddings(results.flat());\n return {\n documents: prepared.map((item, index) => embeddedDocument(item, byDocument.get(index) ?? [])),\n };\n }\n\n const { dense, sparse } = options.models;\n const [denseResults, sparseResults] = await Promise.all([\n mapWithConcurrency(\n chunk(flatTexts, batchSize(dense.maxBatchSize, flatTexts.length || 1)),\n concurrencyLimit,\n async (batch) => {\n const embeddings = await embedDenseBatch(\n dense,\n batch.map((item) => item.text),\n options,\n );\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as Embedding,\n }));\n },\n ),\n mapWithConcurrency(\n chunk(flatTexts, batchSize(sparse.maxBatchSize, flatTexts.length || 1)),\n concurrencyLimit,\n async (batch) => {\n const embeddings = await embedSparseBatch(\n sparse,\n batch.map((item) => item.text),\n options,\n );\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as SparseEmbedding,\n }));\n },\n ),\n ]);\n const denseByDocument = groupEmbeddings(denseResults.flat());\n const sparseByDocument = groupEmbeddings(sparseResults.flat());\n return {\n documents: prepared.map((item, index) => {\n const embeddings = denseByDocument.get(index) ?? [];\n const sparseEmbeddings = sparseByDocument.get(index) ?? [];\n if (embeddings.length !== sparseEmbeddings.length) {\n throw new Error(\n `Hybrid embedding produced ${embeddings.length} dense and ${sparseEmbeddings.length} sparse vectors for document ${item.id}`,\n );\n }\n return embeddedDocument(item, embeddings, sparseEmbeddings);\n }),\n };\n}\n\nasync function embedDenseBatch(\n model: EmbedTextOptions[\"model\"],\n texts: string[],\n options: EmbeddingOperationOptions,\n): Promise<Embedding[]> {\n throwIfAborted(options.abortSignal);\n const expected = texts.length;\n const embeddings = await runWithRetries(\n () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n for (const [index, embedding] of embeddings.entries()) {\n validateDenseEmbedding(embedding, model.dimensions, index);\n }\n assertBatchLength(\"Embedding\", embeddings.length, expected);\n return embeddings.slice();\n}\n\nasync function embedSparseBatch(\n model: EmbedSparseTextsOptions[\"model\"],\n texts: string[],\n options: EmbeddingOperationOptions,\n): Promise<SparseEmbedding[]> {\n throwIfAborted(options.abortSignal);\n const expected = texts.length;\n const embeddings = await runWithRetries(\n () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n for (const [index, embedding] of embeddings.entries()) validateSparseEmbedding(embedding, index);\n assertBatchLength(\"Sparse embedding\", embeddings.length, expected);\n return embeddings.slice();\n}\n\nfunction prepareDocuments<T, Metadata extends VectorMetadata>(\n documents: T[],\n options: Pick<EmbedDocumentsOptions<T, Metadata>, \"id\" | \"content\" | \"metadata\">,\n) {\n const ids = new Set<string>();\n return documents.map((document, index) => {\n const id = options.id?.(document, index) ?? `doc${index}`;\n if (id.length === 0) throw new TypeError(\"Embedded document ids must not be empty\");\n if (ids.has(id)) throw new TypeError(`Duplicate embedded document id: ${id}`);\n ids.add(id);\n const content = options.content(document, index);\n if (Array.isArray(content) && content.length === 0)\n throw new TypeError(`Embedded document ${id} must contain at least one text chunk`);\n return {\n id,\n document,\n metadata: options.metadata?.(document, index),\n texts: Array.isArray(content) ? content : [content],\n };\n });\n}\n\nfunction embeddedDocument<T, Metadata extends VectorMetadata>(\n item: { id: string; document: T; metadata: Metadata | undefined },\n embeddings: Embedding[],\n sparseEmbeddings?: SparseEmbedding[],\n): EmbeddedDocument<T, Metadata> {\n let result: EmbeddedDocument<T, Metadata> = {\n id: item.id,\n document: item.document,\n embeddings,\n };\n if (item.metadata !== undefined) {\n result = { ...result, metadata: item.metadata };\n }\n if (sparseEmbeddings !== undefined) {\n result = { ...result, sparseEmbeddings };\n }\n return result;\n}\n\nfunction groupEmbeddings<E>(\n items: Array<{ documentIndex: number; embedding: E }>,\n): Map<number, E[]> {\n const groups = new Map<number, E[]>();\n for (const item of items) {\n const list = groups.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n groups.set(item.documentIndex, list);\n }\n return groups;\n}\n\nfunction assertBatchLength(name: string, actual: number, expected: number): void {\n if (actual !== expected)\n throw new Error(`${name} model returned ${actual} embeddings for ${expected} texts`);\n}\n\nfunction resolveRetries(options: EmbeddingOperationOptions): ResolvedRetryOptions | undefined {\n return options.retries === undefined || options.retries === false\n ? undefined\n : resolveRetryOptions(options.retries);\n}\n\nfunction modelCallOptions(abortSignal: AbortSignal | undefined): ModelCallOptions | undefined {\n return abortSignal === undefined ? undefined : { abortSignal };\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let index = 0; index < items.length; index += size)\n chunks.push(items.slice(index, index + size));\n return chunks;\n}\n\nfunction batchSize(configured: number | undefined, fallback: number): number {\n if (configured === undefined) return fallback;\n if (!Number.isSafeInteger(configured) || configured < 1) {\n throw new RangeError(\"Embedding model maxBatchSize must be a positive safe integer\");\n }\n return configured;\n}\n\nfunction concurrency(configured: number | undefined): number {\n if (configured === undefined) return 1;\n if (!Number.isSafeInteger(configured) || configured < 1) {\n throw new RangeError(\"Embedding concurrency must be a positive safe integer\");\n }\n return configured;\n}\n\nfunction validateDenseEmbedding(\n embedding: Embedding,\n dimensions: number | undefined,\n index: number,\n): void {\n if (embedding.vector.length === 0) {\n throw new TypeError(`Embedding model returned an empty vector at index ${index}`);\n }\n if (!embedding.vector.every(Number.isFinite)) {\n throw new TypeError(`Embedding model returned a non-finite vector at index ${index}`);\n }\n if (dimensions !== undefined) {\n if (!Number.isSafeInteger(dimensions) || dimensions < 1)\n throw new TypeError(\"Embedding model dimensions must be a positive safe integer\");\n if (embedding.vector.length !== dimensions) {\n throw new Error(\n `Embedding model returned ${embedding.vector.length} dimensions at index ${index}; expected ${dimensions}`,\n );\n }\n }\n}\n\nfunction validateSparseEmbedding(embedding: SparseEmbedding, index: number | \"query\"): void {\n const { indices, values } = embedding.vector;\n if (indices.length !== values.length) {\n throw new Error(`Sparse embedding at ${index} has mismatched indices and values`);\n }\n if (!indices.every((value) => Number.isSafeInteger(value) && value >= 0)) {\n throw new TypeError(`Sparse embedding at ${index} has an invalid index`);\n }\n if (new Set(indices).size !== indices.length) {\n throw new TypeError(`Sparse embedding at ${index} has duplicate indices`);\n }\n if (!values.every(Number.isFinite)) {\n throw new TypeError(`Sparse embedding at ${index} has a non-finite value`);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generateCompletion
3
- } from "./chunk-YMTBHHLQ.js";
3
+ } from "./chunk-HG6ASDNI.js";
4
4
  import {
5
5
  CompletionCapabilityError,
6
6
  Usage
@@ -128,4 +128,4 @@ export {
128
128
  ExtractionError,
129
129
  extract
130
130
  };
131
- //# sourceMappingURL=chunk-7TUAAGVR.js.map
131
+ //# sourceMappingURL=chunk-YKWUFYXT.js.map
@@ -1,13 +1,18 @@
1
1
  import {
2
2
  extract
3
- } from "./chunk-7TUAAGVR.js";
3
+ } from "./chunk-YKWUFYXT.js";
4
4
  import {
5
5
  Usage
6
6
  } from "./chunk-HJ6KTQTZ.js";
7
+ import {
8
+ throwIfAborted
9
+ } from "./chunk-USRKPEQN.js";
7
10
 
8
11
  // src/evals/judge.ts
9
12
  async function runJudge(args) {
13
+ throwIfAborted(args.abortSignal);
10
14
  const result = await extract({
15
+ abortSignal: args.abortSignal,
11
16
  model: args.model,
12
17
  outputSchema: args.schema,
13
18
  instructions: args.instructions,
@@ -15,6 +20,7 @@ async function runJudge(args) {
15
20
  temperature: 0,
16
21
  retries: args.retries <= 0 ? void 0 : { maxAttempts: Math.trunc(args.retries) + 1 }
17
22
  });
23
+ throwIfAborted(args.abortSignal);
18
24
  return { data: result.output, usage: result.usage };
19
25
  }
20
26
  function addUsage(...values) {
@@ -46,4 +52,4 @@ export {
46
52
  addUsage,
47
53
  evaluationMetadata
48
54
  };
49
- //# sourceMappingURL=chunk-5SJBSCG2.js.map
55
+ //# sourceMappingURL=chunk-YSR6KLCS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/evals/judge.ts"],"sourcesContent":["import type { CompletionModel, JsonObject, Usage } from \"../completion\";\nimport { Usage as UsageValue } from \"../completion\";\nimport { extract } from \"../extractor\";\nimport { throwIfAborted } from \"../internal/abort\";\nimport type { ZodSchema } from \"../schema\";\nimport type { EvalMetadata } from \"./types\";\n\nexport type JudgeResult<T> = {\n data: T;\n usage: Usage;\n};\n\nexport async function runJudge<T>(args: {\n model: CompletionModel;\n schema: ZodSchema<T>;\n instructions: string;\n prompt: string;\n retries: number;\n abortSignal?: AbortSignal | undefined;\n}): Promise<JudgeResult<T>> {\n throwIfAborted(args.abortSignal);\n const result = await extract({\n abortSignal: args.abortSignal,\n model: args.model,\n outputSchema: args.schema,\n instructions: args.instructions,\n text: args.prompt,\n temperature: 0,\n retries: args.retries <= 0 ? undefined : { maxAttempts: Math.trunc(args.retries) + 1 },\n });\n throwIfAborted(args.abortSignal);\n return { data: result.output, usage: result.usage };\n}\n\nexport function addUsage(...values: Usage[]): Usage {\n return values.reduce((total, usage) => UsageValue.add(total, usage), UsageValue.empty());\n}\n\nexport function evaluationMetadata(details: JsonObject, usage: Usage): EvalMetadata {\n const evaluation: JsonObject = {\n ...details,\n usage: usageToJson(usage),\n };\n return { evaluation };\n}\n\nfunction usageToJson(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) {\n value.details = { ...usage.details };\n }\n return value;\n}\n"],"mappings":";;;;;;;;;;;AAYA,eAAsB,SAAY,MAON;AAC1B,iBAAe,KAAK,WAAW;AAC/B,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK;AAAA,IACnB,cAAc,KAAK;AAAA,IACnB,MAAM,KAAK;AAAA,IACX,aAAa;AAAA,IACb,SAAS,KAAK,WAAW,IAAI,SAAY,EAAE,aAAa,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE;AAAA,EACvF,CAAC;AACD,iBAAe,KAAK,WAAW;AAC/B,SAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,OAAO,MAAM;AACpD;AAEO,SAAS,YAAY,QAAwB;AAClD,SAAO,OAAO,OAAO,CAAC,OAAO,UAAU,MAAW,IAAI,OAAO,KAAK,GAAG,MAAW,MAAM,CAAC;AACzF;AAEO,SAAS,mBAAmB,SAAqB,OAA4B;AAClF,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,OAAO,YAAY,KAAK;AAAA,EAC1B;AACA,SAAO,EAAE,WAAW;AACtB;AAEA,SAAS,YAAY,OAA0B;AAC7C,QAAM,QAAoB;AAAA,IACxB,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,aAAa,MAAM;AAAA,IACnB,mBAAmB,MAAM;AAAA,IACzB,0BAA0B,MAAM;AAAA,EAClC;AACA,MAAI,MAAM,YAAY,QAAW;AAC/B,UAAM,UAAU,EAAE,GAAG,MAAM,QAAQ;AAAA,EACrC;AACA,SAAO;AACT;","names":[]}
@@ -3,12 +3,12 @@ import {
3
3
  generateCompletion,
4
4
  isStreamingCompletionModel,
5
5
  streamCompletion
6
- } from "../chunk-YMTBHHLQ.js";
7
- import "../chunk-YOLOFTAY.js";
6
+ } from "../chunk-HG6ASDNI.js";
7
+ import "../chunk-57AUTEQ6.js";
8
8
  import "../chunk-6OO5C5GW.js";
9
9
  import "../chunk-GSVOMQEE.js";
10
10
  import "../chunk-4ONUNWGC.js";
11
- import "../chunk-2JZV4LUS.js";
11
+ import "../chunk-MKY7KTZY.js";
12
12
  import "../chunk-XQV3XNVT.js";
13
13
  import "../chunk-HJ6KTQTZ.js";
14
14
  import "../chunk-BONQTXRQ.js";
@@ -13,12 +13,12 @@ import {
13
13
  generateCompletion,
14
14
  isStreamingCompletionModel,
15
15
  streamCompletion
16
- } from "../chunk-YMTBHHLQ.js";
17
- import "../chunk-YOLOFTAY.js";
16
+ } from "../chunk-HG6ASDNI.js";
17
+ import "../chunk-57AUTEQ6.js";
18
18
  import "../chunk-6OO5C5GW.js";
19
19
  import "../chunk-GSVOMQEE.js";
20
20
  import "../chunk-4ONUNWGC.js";
21
- import "../chunk-2JZV4LUS.js";
21
+ import "../chunk-MKY7KTZY.js";
22
22
  import {
23
23
  COMPLETION_PROVIDER_OUTPUT_ERROR_CODE,
24
24
  CompletionProviderOutputError
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CompletionStreamAccumulator
3
- } from "../chunk-2JZV4LUS.js";
3
+ } from "../chunk-MKY7KTZY.js";
4
4
  import "../chunk-XQV3XNVT.js";
5
5
  import "../chunk-HJ6KTQTZ.js";
6
6
  import "../chunk-4C7AXYOM.js";
@@ -4,7 +4,7 @@ import {
4
4
  embedSparseTexts,
5
5
  embedText,
6
6
  embedTexts
7
- } from "../chunk-HHMLE3TZ.js";
7
+ } from "../chunk-YCTXTOOQ.js";
8
8
  import "../chunk-4FIVU53H.js";
9
9
  import "../chunk-POXHJF3H.js";
10
10
  import "../chunk-USRKPEQN.js";
@@ -13,7 +13,7 @@ import {
13
13
  embedSparseTexts,
14
14
  embedText,
15
15
  embedTexts
16
- } from "../chunk-HHMLE3TZ.js";
16
+ } from "../chunk-YCTXTOOQ.js";
17
17
  import "../chunk-DU4WA6LQ.js";
18
18
  import "../chunk-4FIVU53H.js";
19
19
  import "../chunk-POXHJF3H.js";
@@ -9,23 +9,23 @@ import {
9
9
  promptAlignment,
10
10
  summarization,
11
11
  turnRelevancy
12
- } from "../chunk-V5DWNXVH.js";
13
- import "../chunk-5SJBSCG2.js";
12
+ } from "../chunk-W2XPREWL.js";
13
+ import "../chunk-YSR6KLCS.js";
14
14
  import "../chunk-ZPXOBQDS.js";
15
15
  import "../chunk-3P3YVJ7V.js";
16
- import "../chunk-7TUAAGVR.js";
16
+ import "../chunk-YKWUFYXT.js";
17
17
  import "../chunk-ZYXMWEL4.js";
18
18
  import "../chunk-EJR6VVB3.js";
19
19
  import "../chunk-TP3MCUXS.js";
20
20
  import "../chunk-6RQYWZI3.js";
21
21
  import "../chunk-NF6WBPFG.js";
22
22
  import "../chunk-4FIVU53H.js";
23
- import "../chunk-YMTBHHLQ.js";
24
- import "../chunk-YOLOFTAY.js";
23
+ import "../chunk-HG6ASDNI.js";
24
+ import "../chunk-57AUTEQ6.js";
25
25
  import "../chunk-6OO5C5GW.js";
26
26
  import "../chunk-GSVOMQEE.js";
27
27
  import "../chunk-4ONUNWGC.js";
28
- import "../chunk-2JZV4LUS.js";
28
+ import "../chunk-MKY7KTZY.js";
29
29
  import "../chunk-XQV3XNVT.js";
30
30
  import "../chunk-HJ6KTQTZ.js";
31
31
  import "../chunk-BONQTXRQ.js";
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  AgentEvalSuspensionError,
3
3
  agentEvalTarget
4
- } from "../chunk-NNEKBZSM.js";
4
+ } from "../chunk-W6V63YPY.js";
5
+ import "../chunk-4OSA3MMA.js";
5
6
  import "../chunk-WN6AVBO4.js";
6
7
  export {
7
8
  AgentEvalSuspensionError,
package/dist/evals/cli.js CHANGED
@@ -7,21 +7,21 @@ import {
7
7
  formatEvalResult,
8
8
  printEvalResult,
9
9
  runEvalCli
10
- } from "../chunk-KX2TRKO2.js";
11
- import "../chunk-SIXS4CCU.js";
10
+ } from "../chunk-GNBPXJC6.js";
11
+ import "../chunk-4IOC4SP6.js";
12
12
  import "../chunk-PHLGGRHC.js";
13
13
  import "../chunk-ZYXMWEL4.js";
14
14
  import "../chunk-EJR6VVB3.js";
15
- import "../chunk-JMMZICU7.js";
15
+ import "../chunk-4OSA3MMA.js";
16
16
  import "../chunk-TP3MCUXS.js";
17
17
  import "../chunk-6RQYWZI3.js";
18
18
  import "../chunk-NF6WBPFG.js";
19
- import "../chunk-YMTBHHLQ.js";
20
- import "../chunk-YOLOFTAY.js";
19
+ import "../chunk-HG6ASDNI.js";
20
+ import "../chunk-57AUTEQ6.js";
21
21
  import "../chunk-6OO5C5GW.js";
22
22
  import "../chunk-GSVOMQEE.js";
23
23
  import "../chunk-4ONUNWGC.js";
24
- import "../chunk-2JZV4LUS.js";
24
+ import "../chunk-MKY7KTZY.js";
25
25
  import "../chunk-XQV3XNVT.js";
26
26
  import "../chunk-HJ6KTQTZ.js";
27
27
  import "../chunk-BONQTXRQ.js";