@anvia/core 1.9.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/agent.js +10 -9
  3. package/dist/agent/index.d.ts +5 -5
  4. package/dist/agent/index.js +13 -12
  5. package/dist/agent/resolve-options.js +4 -4
  6. package/dist/agent/resolved-agent.js +11 -10
  7. package/dist/agent/team/agent-team.js +13 -12
  8. package/dist/agent/team/index.js +13 -12
  9. package/dist/agent/tool-catalog.js +2 -2
  10. package/dist/{agent-BOoZ3jbr.d.ts → agent-BUEZxrEv.d.ts} +5 -3
  11. package/dist/{chunk-RW32K6OO.js → chunk-547CQSO2.js} +2 -2
  12. package/dist/{chunk-5I2NVRHC.js → chunk-5ZM5DB3O.js} +14 -2
  13. package/dist/chunk-5ZM5DB3O.js.map +1 -0
  14. package/dist/{chunk-AGPDR6FF.js → chunk-BH7RLRLQ.js} +3 -3
  15. package/dist/{chunk-KL652GO5.js → chunk-EF26KTFU.js} +2 -2
  16. package/dist/{chunk-AGOZCYFP.js → chunk-ET5SCES6.js} +6 -6
  17. package/dist/{chunk-7NWFT422.js → chunk-G4ZKCVBW.js} +3 -3
  18. package/dist/{chunk-V5NIO3J3.js → chunk-G7NJDOT5.js} +3 -3
  19. package/dist/{chunk-EWTZ3IAH.js → chunk-J6O567TG.js} +4 -4
  20. package/dist/{chunk-7AV3PEYW.js → chunk-LQFBCC74.js} +3 -3
  21. package/dist/chunk-M7LU47T5.js +143 -0
  22. package/dist/chunk-M7LU47T5.js.map +1 -0
  23. package/dist/{chunk-PILUQCGV.js → chunk-MNWULFRX.js} +2 -2
  24. package/dist/{chunk-AKQQG3IX.js → chunk-PFSWAJTY.js} +2 -2
  25. package/dist/{chunk-MA3TYOKF.js → chunk-PLQAN4EO.js} +25 -1
  26. package/dist/chunk-PLQAN4EO.js.map +1 -0
  27. package/dist/{chunk-M32FTMYD.js → chunk-SHSSCEGO.js} +2 -2
  28. package/dist/chunk-SHSSCEGO.js.map +1 -0
  29. package/dist/{chunk-AO2QL2VD.js → chunk-SISGNHNO.js} +48 -13
  30. package/dist/chunk-SISGNHNO.js.map +1 -0
  31. package/dist/{chunk-WLUWRBQ4.js → chunk-SVFEG2TI.js} +4 -1
  32. package/dist/chunk-SVFEG2TI.js.map +1 -0
  33. package/dist/{chunk-3YVGQNTI.js → chunk-WGUE44ZD.js} +3 -3
  34. package/dist/{chunk-KLDNHX4Z.js → chunk-X4XULHDO.js} +4 -4
  35. package/dist/{chunk-BRGNY5ZB.js → chunk-Y4Q66NQY.js} +16 -1
  36. package/dist/chunk-Y4Q66NQY.js.map +1 -0
  37. package/dist/decision/decide.js +4 -4
  38. package/dist/decision/errors.js +5 -3
  39. package/dist/decision/index.d.ts +14 -1
  40. package/dist/decision/index.js +8 -6
  41. package/dist/decision/questions.js +3 -3
  42. package/dist/decision/result.js +3 -3
  43. package/dist/decision/validation.js +2 -2
  44. package/dist/embeddings/index.js +7 -7
  45. package/dist/evals/advanced-metrics.js +2 -2
  46. package/dist/evals/cli.js +3 -3
  47. package/dist/evals/index.d.ts +2 -2
  48. package/dist/evals/index.js +32 -32
  49. package/dist/evals/metrics.js +4 -4
  50. package/dist/evals/runner.js +2 -2
  51. package/dist/index.d.ts +4 -4
  52. package/dist/index.js +22 -19
  53. package/dist/internal/agent-runtime/agent-run.js +8 -6
  54. package/dist/internal/agent-runtime/continuation-state.js +1 -1
  55. package/dist/internal/agent-runtime/execution.js +1 -1
  56. package/dist/internal/agent-runtime/loop-context.js +33 -0
  57. package/dist/internal/agent-runtime/loop-context.js.map +1 -0
  58. package/dist/internal/agent-runtime/memory.js +3 -1
  59. package/dist/internal/agent-runtime/retrieval.js +2 -2
  60. package/dist/internal/agent-runtime/tool-execution.js +2 -2
  61. package/dist/internal/agent.d.ts +46 -6
  62. package/dist/internal/agent.js +21 -11
  63. package/dist/internal/team-runtime/run.js +12 -11
  64. package/dist/memory/index.d.ts +2 -2
  65. package/dist/memory/index.js +1 -1
  66. package/dist/memory/options.js +1 -1
  67. package/dist/{middleware-BNxyEpUX.d.ts → middleware-D_WPyilQ.d.ts} +1 -1
  68. package/dist/observability/index.d.ts +2 -2
  69. package/dist/pipeline/index.d.ts +3 -3
  70. package/dist/redaction/index.js +19 -0
  71. package/dist/redaction/index.js.map +1 -1
  72. package/dist/skills/index.js +2 -2
  73. package/dist/skills/load.js +2 -2
  74. package/dist/skills/tools.js +2 -2
  75. package/dist/tool/dynamic-tools.js +2 -2
  76. package/dist/tool/index.d.ts +2 -2
  77. package/dist/tool/index.js +2 -2
  78. package/dist/{types-B8KBVXuH.d.ts → types-CaAiktBl.d.ts} +4 -1
  79. package/dist/vector-store/index.js +2 -2
  80. package/dist/vector-store/ingest.js +2 -2
  81. package/dist/vector-store/retrieve.js +1 -1
  82. package/package.json +1 -1
  83. package/dist/chunk-5I2NVRHC.js.map +0 -1
  84. package/dist/chunk-AO2QL2VD.js.map +0 -1
  85. package/dist/chunk-BRGNY5ZB.js.map +0 -1
  86. package/dist/chunk-M32FTMYD.js.map +0 -1
  87. package/dist/chunk-MA3TYOKF.js.map +0 -1
  88. package/dist/chunk-WLUWRBQ4.js.map +0 -1
  89. /package/dist/{chunk-RW32K6OO.js.map → chunk-547CQSO2.js.map} +0 -0
  90. /package/dist/{chunk-AGPDR6FF.js.map → chunk-BH7RLRLQ.js.map} +0 -0
  91. /package/dist/{chunk-KL652GO5.js.map → chunk-EF26KTFU.js.map} +0 -0
  92. /package/dist/{chunk-AGOZCYFP.js.map → chunk-ET5SCES6.js.map} +0 -0
  93. /package/dist/{chunk-7NWFT422.js.map → chunk-G4ZKCVBW.js.map} +0 -0
  94. /package/dist/{chunk-V5NIO3J3.js.map → chunk-G7NJDOT5.js.map} +0 -0
  95. /package/dist/{chunk-EWTZ3IAH.js.map → chunk-J6O567TG.js.map} +0 -0
  96. /package/dist/{chunk-7AV3PEYW.js.map → chunk-LQFBCC74.js.map} +0 -0
  97. /package/dist/{chunk-PILUQCGV.js.map → chunk-MNWULFRX.js.map} +0 -0
  98. /package/dist/{chunk-AKQQG3IX.js.map → chunk-PFSWAJTY.js.map} +0 -0
  99. /package/dist/{chunk-3YVGQNTI.js.map → chunk-WGUE44ZD.js.map} +0 -0
  100. /package/dist/{chunk-KLDNHX4Z.js.map → chunk-X4XULHDO.js.map} +0 -0
@@ -0,0 +1,143 @@
1
+ import {
2
+ createMemoryCompactionSummary,
3
+ cumulativeCompactedMessageCount
4
+ } from "./chunk-5CKB7RQY.js";
5
+ import {
6
+ MemoryCompactionError
7
+ } from "./chunk-LQJ4KHMY.js";
8
+ import {
9
+ estimateMemoryTokens
10
+ } from "./chunk-SVFEG2TI.js";
11
+ import {
12
+ Usage
13
+ } from "./chunk-HJ6KTQTZ.js";
14
+ import {
15
+ throwIfAborted
16
+ } from "./chunk-USRKPEQN.js";
17
+
18
+ // src/internal/agent-runtime/loop-context.ts
19
+ async function countContextTokens(counter, messages, signal) {
20
+ throwIfAborted(signal);
21
+ const value = await counter(structuredClone(messages));
22
+ throwIfAborted(signal);
23
+ if (!Number.isSafeInteger(value) || value < 0)
24
+ throw new TypeError("Compaction token counter must return a nonnegative safe integer.");
25
+ return value;
26
+ }
27
+ function projectLoopContext(messages, checkpoint) {
28
+ if (checkpoint === void 0) return [...messages];
29
+ return [
30
+ createMemoryCompactionSummary(checkpoint.summary, checkpoint.compactedMessageCount),
31
+ ...retainedLoopMessages(messages, checkpoint.coveredMessages)
32
+ ];
33
+ }
34
+ function retainedLoopMessages(messages, coveredMessages) {
35
+ const tail = messages.slice(coveredMessages);
36
+ let latestUser = messages.length - 1;
37
+ while (latestUser >= 0 && messages[latestUser].role !== "user") latestUser -= 1;
38
+ return latestUser >= 0 && latestUser < coveredMessages ? [messages[latestUser], ...tail] : tail;
39
+ }
40
+ async function planLoopContext(messages, checkpoint, options, signal) {
41
+ const counter = options.tokenCounter ?? estimateMemoryTokens;
42
+ const projected = projectLoopContext(messages, checkpoint);
43
+ const originalTokenCount = await countContextTokens(counter, projected, signal);
44
+ if (originalTokenCount <= options.afterTokens) return void 0;
45
+ const boundaries = [];
46
+ const pending = /* @__PURE__ */ new Set();
47
+ for (const [index, message] of messages.entries()) {
48
+ if (message.role === "assistant" && Array.isArray(message.content)) {
49
+ for (const part of message.content)
50
+ if (part.type === "tool-call") pending.add(part.toolCallId);
51
+ }
52
+ if (message.role === "tool" && pending.size > 0) {
53
+ for (const part of message.content)
54
+ if (part.type === "tool-result") pending.delete(part.toolCallId);
55
+ if (pending.size === 0) boundaries.push(index + 1);
56
+ } else if (message.role === "assistant" && pending.size === 0 && boundaries.at(-1) === index) {
57
+ boundaries[boundaries.length - 1] = index + 1;
58
+ }
59
+ }
60
+ const end = boundaries[boundaries.length - 1 - (options.recentToolTurns ?? 1)] ?? 0;
61
+ if (end <= (checkpoint?.coveredMessages ?? 0)) return void 0;
62
+ const prefix = checkpoint === void 0 ? messages.slice(0, end) : [
63
+ createMemoryCompactionSummary(checkpoint.summary, checkpoint.compactedMessageCount),
64
+ ...messages.slice(checkpoint.coveredMessages, end)
65
+ ];
66
+ const retained = retainedLoopMessages(messages, end);
67
+ return {
68
+ messages: retained,
69
+ prefix,
70
+ coveredMessages: end,
71
+ compactedMessageCount: cumulativeCompactedMessageCount(messages.slice(0, end)),
72
+ originalMessageCount: projected.length,
73
+ originalTokenCount,
74
+ compactedTokenCount: await countContextTokens(counter, prefix, signal),
75
+ retainedTokenCount: await countContextTokens(counter, retained, signal)
76
+ };
77
+ }
78
+ async function summarizeLoopContext(plan, compactor, scope, signal) {
79
+ throwIfAborted(signal);
80
+ const result = await compactor({
81
+ scope,
82
+ messages: structuredClone(plan.prefix),
83
+ abortSignal: signal
84
+ });
85
+ throwIfAborted(signal);
86
+ const usage = result?.usage ?? Usage.empty();
87
+ if (typeof result?.summary !== "string" || result.summary.trim().length === 0)
88
+ throw new MemoryCompactionError("Memory compactor returned an empty summary.", { usage });
89
+ for (const value of [
90
+ usage.inputTokens,
91
+ usage.outputTokens,
92
+ usage.totalTokens,
93
+ usage.cachedInputTokens,
94
+ usage.cacheCreationInputTokens
95
+ ])
96
+ if (!Number.isSafeInteger(value) || value < 0) throw new TypeError("Invalid compaction usage.");
97
+ if (usage.details !== void 0 && Object.values(usage.details).some((value) => !Number.isFinite(value)))
98
+ throw new TypeError("Invalid compaction usage details.");
99
+ return { summary: result.summary.trim(), usage };
100
+ }
101
+ async function finishLoopContext(plan, result, counter = estimateMemoryTokens, signal, attempts = 1) {
102
+ const checkpoint = {
103
+ summary: result.summary,
104
+ coveredMessages: plan.coveredMessages,
105
+ compactedMessageCount: plan.compactedMessageCount
106
+ };
107
+ const messages = [
108
+ createMemoryCompactionSummary(result.summary, plan.compactedMessageCount),
109
+ ...plan.messages
110
+ ];
111
+ let resultTokenCount;
112
+ try {
113
+ resultTokenCount = await countContextTokens(counter, messages, signal);
114
+ } catch (error) {
115
+ throw new MemoryCompactionError("Memory token counter failed after summarization.", {
116
+ cause: error,
117
+ usage: result.usage
118
+ });
119
+ }
120
+ return {
121
+ messages,
122
+ checkpoint,
123
+ compaction: {
124
+ originalMessageCount: plan.originalMessageCount,
125
+ compactedMessageCount: plan.prefix.length,
126
+ retainedMessageCount: plan.messages.length,
127
+ originalTokenCount: plan.originalTokenCount,
128
+ compactedTokenCount: plan.compactedTokenCount,
129
+ retainedTokenCount: plan.retainedTokenCount,
130
+ resultTokenCount,
131
+ attempts,
132
+ usage: result.usage
133
+ }
134
+ };
135
+ }
136
+
137
+ export {
138
+ projectLoopContext,
139
+ planLoopContext,
140
+ summarizeLoopContext,
141
+ finishLoopContext
142
+ };
143
+ //# sourceMappingURL=chunk-M7LU47T5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/agent-runtime/loop-context.ts"],"sourcesContent":["import { Usage, type Message } from \"../../completion\";\nimport {\n createMemoryCompactionSummary,\n cumulativeCompactedMessageCount,\n} from \"../../memory/compaction\";\nimport { MemoryCompactionError } from \"../../memory/errors\";\nimport { estimateMemoryTokens } from \"../../memory/options\";\nimport type {\n MemoryCompactionInfo,\n MemoryCompactor,\n MemoryScope,\n MemoryTokenCounter,\n} from \"../../memory/types\";\nimport { throwIfAborted } from \"../abort\";\n\n/** Indexes refer to the unchanged input transcript of this execution segment. */\nexport type LoopContextCheckpoint = {\n summary: string;\n coveredMessages: number;\n compactedMessageCount: number;\n};\nexport type PreparedLoopContext = {\n messages: Message[];\n checkpoint?: LoopContextCheckpoint | undefined;\n compaction?: MemoryCompactionInfo | undefined;\n};\nexport type LoopContextPlan = {\n messages: Message[];\n prefix: Message[];\n coveredMessages: number;\n compactedMessageCount: number;\n originalMessageCount: number;\n originalTokenCount: number;\n compactedTokenCount: number;\n retainedTokenCount: number;\n};\n\nasync function countContextTokens(\n counter: MemoryTokenCounter,\n messages: readonly Message[],\n signal?: AbortSignal,\n): Promise<number> {\n throwIfAborted(signal);\n const value = await counter(structuredClone(messages));\n throwIfAborted(signal);\n if (!Number.isSafeInteger(value) || value < 0)\n throw new TypeError(\"Compaction token counter must return a nonnegative safe integer.\");\n return value;\n}\n\nexport function projectLoopContext(\n messages: readonly Message[],\n checkpoint?: LoopContextCheckpoint,\n): Message[] {\n if (checkpoint === undefined) return [...messages];\n return [\n createMemoryCompactionSummary(checkpoint.summary, checkpoint.compactedMessageCount),\n ...retainedLoopMessages(messages, checkpoint.coveredMessages),\n ];\n}\n\nfunction retainedLoopMessages(messages: readonly Message[], coveredMessages: number): Message[] {\n const tail = messages.slice(coveredMessages);\n // Keep the active user request verbatim even when all completed tool rounds are summarized.\n let latestUser = messages.length - 1;\n while (latestUser >= 0 && messages[latestUser]!.role !== \"user\") latestUser -= 1;\n return latestUser >= 0 && latestUser < coveredMessages ? [messages[latestUser]!, ...tail] : tail;\n}\n\n/** Select only complete exchanges; parallel tool calls must all have results before a cut. */\nexport async function planLoopContext(\n messages: readonly Message[],\n checkpoint: LoopContextCheckpoint | undefined,\n options: {\n afterTokens: number;\n recentToolTurns?: number | undefined;\n tokenCounter?: MemoryTokenCounter | undefined;\n },\n signal?: AbortSignal,\n): Promise<LoopContextPlan | undefined> {\n const counter = options.tokenCounter ?? estimateMemoryTokens;\n const projected = projectLoopContext(messages, checkpoint);\n const originalTokenCount = await countContextTokens(counter, projected, signal);\n if (originalTokenCount <= options.afterTokens) return undefined;\n const boundaries: number[] = [];\n const pending = new Set<string>();\n for (const [index, message] of messages.entries()) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content)\n if (part.type === \"tool-call\") pending.add(part.toolCallId);\n }\n if (message.role === \"tool\" && pending.size > 0) {\n for (const part of message.content)\n if (part.type === \"tool-result\") pending.delete(part.toolCallId);\n if (pending.size === 0) boundaries.push(index + 1);\n } else if (message.role === \"assistant\" && pending.size === 0 && boundaries.at(-1) === index) {\n // A final answer belongs to the preceding completed round, not another retained tool round.\n boundaries[boundaries.length - 1] = index + 1;\n }\n }\n const end = boundaries[boundaries.length - 1 - (options.recentToolTurns ?? 1)] ?? 0;\n if (end <= (checkpoint?.coveredMessages ?? 0)) return undefined;\n const prefix =\n checkpoint === undefined\n ? messages.slice(0, end)\n : [\n createMemoryCompactionSummary(checkpoint.summary, checkpoint.compactedMessageCount),\n ...messages.slice(checkpoint.coveredMessages, end),\n ];\n const retained = retainedLoopMessages(messages, end);\n return {\n messages: retained,\n prefix,\n coveredMessages: end,\n compactedMessageCount: cumulativeCompactedMessageCount(messages.slice(0, end)),\n originalMessageCount: projected.length,\n originalTokenCount,\n compactedTokenCount: await countContextTokens(counter, prefix, signal),\n retainedTokenCount: await countContextTokens(counter, retained, signal),\n };\n}\n\n/** Validation is inside the summarizer boundary so durable retry budgets cover invalid results. */\nexport async function summarizeLoopContext(\n plan: LoopContextPlan,\n compactor: MemoryCompactor,\n scope: MemoryScope,\n signal?: AbortSignal,\n): Promise<{ summary: string; usage: Usage }> {\n throwIfAborted(signal);\n const result = await compactor({\n scope,\n messages: structuredClone(plan.prefix),\n abortSignal: signal,\n });\n throwIfAborted(signal);\n const usage = result?.usage ?? Usage.empty();\n if (typeof result?.summary !== \"string\" || result.summary.trim().length === 0)\n throw new MemoryCompactionError(\"Memory compactor returned an empty summary.\", { usage });\n for (const value of [\n usage.inputTokens,\n usage.outputTokens,\n usage.totalTokens,\n usage.cachedInputTokens,\n usage.cacheCreationInputTokens,\n ])\n if (!Number.isSafeInteger(value) || value < 0) throw new TypeError(\"Invalid compaction usage.\");\n if (\n usage.details !== undefined &&\n Object.values(usage.details).some((value) => !Number.isFinite(value))\n )\n throw new TypeError(\"Invalid compaction usage details.\");\n return { summary: result.summary.trim(), usage };\n}\n\nexport async function finishLoopContext(\n plan: LoopContextPlan,\n result: { summary: string; usage: Usage },\n counter: MemoryTokenCounter = estimateMemoryTokens,\n signal?: AbortSignal,\n attempts = 1,\n): Promise<PreparedLoopContext> {\n const checkpoint = {\n summary: result.summary,\n coveredMessages: plan.coveredMessages,\n compactedMessageCount: plan.compactedMessageCount,\n };\n const messages = [\n createMemoryCompactionSummary(result.summary, plan.compactedMessageCount),\n ...plan.messages,\n ];\n let resultTokenCount: number;\n try {\n resultTokenCount = await countContextTokens(counter, messages, signal);\n } catch (error) {\n throw new MemoryCompactionError(\"Memory token counter failed after summarization.\", {\n cause: error,\n usage: result.usage,\n });\n }\n return {\n messages,\n checkpoint,\n compaction: {\n originalMessageCount: plan.originalMessageCount,\n compactedMessageCount: plan.prefix.length,\n retainedMessageCount: plan.messages.length,\n originalTokenCount: plan.originalTokenCount,\n compactedTokenCount: plan.compactedTokenCount,\n retainedTokenCount: plan.retainedTokenCount,\n resultTokenCount,\n attempts,\n usage: result.usage,\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveMemoryOptions
3
- } from "./chunk-WLUWRBQ4.js";
3
+ } from "./chunk-SVFEG2TI.js";
4
4
  import {
5
5
  appendGuardrailPolicies
6
6
  } from "./chunk-6BTJC3ES.js";
@@ -109,4 +109,4 @@ export {
109
109
  resolveAgentOptions,
110
110
  markResolvedAgentOptions
111
111
  };
112
- //# sourceMappingURL=chunk-PILUQCGV.js.map
112
+ //# sourceMappingURL=chunk-MNWULFRX.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  assertQuestion
3
- } from "./chunk-RW32K6OO.js";
3
+ } from "./chunk-547CQSO2.js";
4
4
 
5
5
  // src/decision/questions.ts
6
6
  function choice(options) {
@@ -30,4 +30,4 @@ export {
30
30
  score,
31
31
  check
32
32
  };
33
- //# sourceMappingURL=chunk-AKQQG3IX.js.map
33
+ //# sourceMappingURL=chunk-PFSWAJTY.js.map
@@ -1,3 +1,9 @@
1
+ import {
2
+ finishLoopContext,
3
+ planLoopContext,
4
+ projectLoopContext,
5
+ summarizeLoopContext
6
+ } from "./chunk-M7LU47T5.js";
1
7
  import {
2
8
  createMemoryCompactionSummary,
3
9
  cumulativeCompactedMessageCount
@@ -23,6 +29,24 @@ var AgentRunMemory = class {
23
29
  agent;
24
30
  memoryScope;
25
31
  initialHistory;
32
+ async prepareLoop(messages, checkpoint, signal) {
33
+ const options = this.memory()?.compaction;
34
+ if (options === void 0 || this.memoryScope === void 0) return { messages: [...messages] };
35
+ const plan = await planLoopContext(
36
+ messages,
37
+ checkpoint,
38
+ {
39
+ afterTokens: options.trigger.afterTokens,
40
+ recentToolTurns: options.retention.recentToolTurns,
41
+ tokenCounter: options.tokenCounter
42
+ },
43
+ signal
44
+ );
45
+ if (plan === void 0) return { messages: projectLoopContext(messages, checkpoint) };
46
+ const summary = await summarizeLoopContext(plan, options.compactor, this.memoryScope, signal);
47
+ const prepared = await finishLoopContext(plan, summary, options.tokenCounter, signal);
48
+ return prepared;
49
+ }
26
50
  memoryPolicy() {
27
51
  return this.memory()?.savePolicy;
28
52
  }
@@ -349,4 +373,4 @@ function isEmptyUsage(usage) {
349
373
  export {
350
374
  AgentRunMemory
351
375
  };
352
- //# sourceMappingURL=chunk-MA3TYOKF.js.map
376
+ //# sourceMappingURL=chunk-PLQAN4EO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/agent-runtime/memory.ts"],"sourcesContent":["import {\n planLoopContext,\n projectLoopContext,\n summarizeLoopContext,\n finishLoopContext,\n type LoopContextCheckpoint,\n type PreparedLoopContext,\n} from \"./loop-context\";\nimport type { Agent } from \"../../agent/agent\";\nimport type { AgentMemory } from \"../../agent/types\";\nimport { type Message as MessageType, Usage } from \"../../completion/index\";\nimport {\n createMemoryCompactionSummary,\n cumulativeCompactedMessageCount,\n} from \"../../memory/compaction\";\nimport { MemoryCompactionConflictError, MemoryCompactionError } from \"../../memory/errors\";\nimport type {\n MemoryCompactionInfo,\n MemoryCompactionResult,\n MemorySavePolicy,\n MemoryScope,\n MemoryTokenCounter,\n} from \"../../memory/types\";\nimport { throwIfAborted } from \"../abort\";\n\nexport type MemoryPreparation = {\n history: MessageType[];\n usage: ReturnType<typeof Usage.empty>;\n compaction?: MemoryCompactionInfo | undefined;\n originalTokenCount?: number | undefined;\n};\n\ntype MemoryAgent = Pick<Agent, \"memory\">;\n\nexport class AgentRunMemory {\n async prepareLoop(\n messages: readonly MessageType[],\n checkpoint: LoopContextCheckpoint | undefined,\n signal: AbortSignal,\n ): Promise<PreparedLoopContext> {\n const options = this.memory()?.compaction;\n if (options === undefined || this.memoryScope === undefined) return { messages: [...messages] };\n const plan = await planLoopContext(\n messages,\n checkpoint,\n {\n afterTokens: options.trigger.afterTokens,\n recentToolTurns: options.retention.recentToolTurns,\n tokenCounter: options.tokenCounter,\n },\n signal,\n );\n if (plan === undefined) return { messages: projectLoopContext(messages, checkpoint) };\n const summary = await summarizeLoopContext(plan, options.compactor, this.memoryScope, signal);\n const prepared = await finishLoopContext(plan, summary, options.tokenCounter, signal);\n return prepared;\n }\n\n constructor(\n private readonly agent: MemoryAgent,\n private readonly memoryScope: MemoryScope | undefined,\n private readonly initialHistory: MessageType[],\n ) {}\n\n memoryPolicy(): MemorySavePolicy | undefined {\n return this.memory()?.savePolicy;\n }\n\n pendingTurnMessages(newMessages: MessageType[]): MessageType[] {\n return this.memoryPolicy() === \"turn\" ? [...newMessages] : [];\n }\n\n async prepareHistory(\n runId: string,\n incomingMessages: readonly MessageType[],\n abortSignal?: AbortSignal | undefined,\n ): Promise<MemoryPreparation> {\n const memory = this.memory();\n if (memory === undefined || this.memoryScope === undefined) {\n return {\n history: this.initialHistory,\n usage: Usage.empty(),\n };\n }\n\n const preparation = await this.prepareStoredHistory(\n memory,\n runId,\n incomingMessages,\n abortSignal,\n );\n const memoryHistory = preparation.history;\n const chatHistory = [...memoryHistory, ...this.initialHistory];\n return {\n ...preparation,\n history: chatHistory,\n };\n }\n\n async compact(\n runId: string,\n abortSignal?: AbortSignal | undefined,\n ): Promise<MemoryCompactionResult> {\n const memory = this.memory();\n const scope = this.memoryScope;\n if (memory === undefined || scope === undefined) {\n throw new TypeError(\"Manual memory compaction requires an Agent with configured memory.\");\n }\n if (memory.compaction === undefined || memory.store.compaction === undefined) {\n throw new TypeError(\"Manual memory compaction requires a configured compaction policy.\");\n }\n const preparation = await this.prepareStoredHistory(memory, runId, [], abortSignal, true);\n if (preparation.compaction !== undefined) {\n return { type: \"compacted\", ...preparation.compaction };\n }\n return {\n type: \"skipped\",\n reason: \"nothing_to_compact\",\n originalMessageCount: preparation.history.length,\n originalTokenCount:\n preparation.originalTokenCount ??\n (await countTokens(memory.compaction.tokenCounter, preparation.history)),\n };\n }\n\n async commitAcceptedInput(runId: string, messages: MessageType[]): Promise<void> {\n const memory = this.memory();\n if (\n memory === undefined ||\n this.memoryScope === undefined ||\n memory.savePolicy !== \"message\" ||\n messages.length === 0\n ) {\n return;\n }\n\n await memory.store.append({\n scope: this.memoryScope,\n runId,\n turn: 1,\n messages,\n });\n }\n\n async commitMessages(\n runId: string,\n turn: number,\n messages: MessageType[],\n pendingTurnMessages: MessageType[],\n ): Promise<void> {\n const memory = this.memory();\n if (memory === undefined || this.memoryScope === undefined || messages.length === 0) {\n return;\n }\n if (memory.savePolicy === \"message\") {\n await memory.store.append({\n scope: this.memoryScope,\n runId,\n turn,\n messages,\n });\n } else if (memory.savePolicy === \"turn\") {\n pendingTurnMessages.push(...messages);\n }\n }\n\n async commitCompletedTurn(\n runId: string,\n turn: number,\n pendingTurnMessages: MessageType[],\n ): Promise<void> {\n const memory = this.memory();\n if (\n memory === undefined ||\n this.memoryScope === undefined ||\n memory.savePolicy !== \"turn\" ||\n pendingTurnMessages.length === 0\n ) {\n return;\n }\n await memory.store.append({\n scope: this.memoryScope,\n runId,\n turn,\n messages: [...pendingTurnMessages],\n });\n pendingTurnMessages.length = 0;\n }\n\n async commitCompletedRun(\n runId: string,\n turn: number,\n newMessages: MessageType[],\n pendingTurnMessages: MessageType[],\n ): Promise<void> {\n await this.commitCompletedTurn(runId, turn, pendingTurnMessages);\n const memory = this.memory();\n if (memory === undefined || this.memoryScope === undefined || memory.savePolicy !== \"run\") {\n return;\n }\n await memory.store.append({\n scope: this.memoryScope,\n runId,\n turn,\n messages: [...newMessages],\n });\n }\n\n async recordError(runId: string, error: unknown, newMessages: MessageType[]): Promise<void> {\n const memory = this.memory();\n if (memory === undefined || this.memoryScope === undefined) {\n return;\n }\n await memory.store.recordError?.({\n scope: this.memoryScope,\n runId,\n error,\n messages: [...newMessages],\n });\n }\n\n private memory(): AgentMemory | undefined {\n return this.memoryScope === undefined ? undefined : this.agent.memory;\n }\n\n private async prepareStoredHistory(\n memory: AgentMemory,\n runId: string,\n incomingMessages: readonly MessageType[],\n abortSignal?: AbortSignal | undefined,\n force = false,\n ): Promise<MemoryPreparation> {\n const scope = this.memoryScope;\n if (scope === undefined) {\n return { history: [], usage: Usage.empty() };\n }\n const options = memory.compaction;\n const capability = memory.store.compaction;\n if (options === undefined || capability === undefined) {\n return {\n history: await memory.store.load({ scope }),\n usage: Usage.empty(),\n };\n }\n\n let usage = Usage.empty();\n const maxAttempts = options.conflictRetries === false ? 1 : options.conflictRetries.maxAttempts;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n throwIfAborted(abortSignal);\n const snapshot = await capability.snapshot({ scope });\n throwIfAborted(abortSignal);\n const selection = await selectCompactionPrefix(\n snapshot.messages,\n incomingMessages,\n options.trigger.afterTokens,\n options.retention,\n options.tokenCounter,\n force,\n );\n throwIfAborted(abortSignal);\n const compactedMessageCount = selection.compactedMessageCount;\n if (compactedMessageCount === 0) {\n return {\n history: snapshot.messages,\n usage,\n originalTokenCount: selection.originalTokenCount,\n };\n }\n\n const prefix = snapshot.messages.slice(0, compactedMessageCount);\n let result: Awaited<ReturnType<typeof options.compactor>>;\n try {\n result = await options.compactor({\n scope,\n messages: prefix,\n abortSignal,\n });\n } catch (error) {\n throw remappedCompactorError(error, usage);\n }\n if (result.usage !== undefined) {\n usage = Usage.add(usage, result.usage);\n }\n if (typeof result?.summary !== \"string\") {\n throw new MemoryCompactionError(\"Memory compactor must return a summary string.\", {\n usage,\n });\n }\n const summaryText = result.summary.trim();\n if (summaryText.length === 0) {\n throw new MemoryCompactionError(\"Memory compactor returned an empty summary.\", {\n usage,\n });\n }\n const summary = createMemoryCompactionSummary(\n summaryText,\n cumulativeCompactedMessageCount(prefix),\n );\n const retained = snapshot.messages.slice(compactedMessageCount);\n let resultTokenCount: number;\n try {\n resultTokenCount = await countTokens(options.tokenCounter, [summary, ...retained]);\n } catch (error) {\n throw remappedCompactorError(error, usage);\n }\n throwIfAborted(abortSignal);\n let replacement: Awaited<ReturnType<typeof capability.replacePrefix>>;\n try {\n replacement = await capability.replacePrefix({\n scope,\n revision: snapshot.revision,\n messageCount: compactedMessageCount,\n replacement: summary,\n runId: `memory-compaction:${runId}:${attempt}`,\n });\n } catch (error) {\n throw new MemoryCompactionError(\"Memory compaction prefix replacement failed.\", {\n cause: error,\n usage,\n });\n }\n if (replacement.status === \"committed\") {\n return {\n history: [summary, ...retained],\n usage,\n compaction: {\n originalMessageCount: snapshot.messages.length,\n compactedMessageCount,\n retainedMessageCount: retained.length,\n originalTokenCount: selection.originalTokenCount,\n compactedTokenCount: selection.compactedTokenCount,\n retainedTokenCount: selection.retainedTokenCount,\n resultTokenCount,\n attempts: attempt,\n usage,\n },\n };\n }\n throwIfAborted(abortSignal);\n }\n\n throw new MemoryCompactionConflictError(maxAttempts, usage);\n }\n}\n\ntype CompactionSelection = {\n compactedMessageCount: number;\n originalTokenCount: number;\n compactedTokenCount: number;\n retainedTokenCount: number;\n};\n\nasync function selectCompactionPrefix(\n messages: readonly MessageType[],\n incomingMessages: readonly MessageType[],\n afterTokens: number,\n retention:\n | { recentTurns: number; recentTokens?: undefined }\n | { recentTokens: number; recentTurns?: undefined },\n tokenCounter: MemoryTokenCounter,\n force: boolean,\n): Promise<CompactionSelection> {\n const originalTokenCount = await countTokens(tokenCounter, messages);\n const incomingTokenCount =\n incomingMessages.length === 0 ? 0 : await countTokens(tokenCounter, incomingMessages);\n const none = {\n compactedMessageCount: 0,\n originalTokenCount,\n compactedTokenCount: 0,\n retainedTokenCount: originalTokenCount,\n };\n if (!force && originalTokenCount + incomingTokenCount <= afterTokens) {\n return none;\n }\n const userMessageIndexes = messages.flatMap((message, index) =>\n message.role === \"user\" ? [index] : [],\n );\n let compactedMessageCount: number;\n let retainedTokenCount: number;\n if (retention.recentTurns !== undefined) {\n if (userMessageIndexes.length <= retention.recentTurns) {\n return none;\n }\n compactedMessageCount =\n retention.recentTurns === 0\n ? messages.length\n : (userMessageIndexes[userMessageIndexes.length - retention.recentTurns] ?? 0);\n retainedTokenCount = await countTokens(tokenCounter, messages.slice(compactedMessageCount));\n } else {\n if (userMessageIndexes.length <= 1) {\n return none;\n }\n\n // Legacy token retention still keeps complete user-led turns. The newest turn is always kept\n // even when it alone exceeds the budget. Find the earliest fitting tail logarithmically.\n const tailTokenCounts = new Map<number, number>();\n const countTail = async (messageIndex: number): Promise<number> => {\n const cached = tailTokenCounts.get(messageIndex);\n if (cached !== undefined) return cached;\n const count = await countTokens(tokenCounter, messages.slice(messageIndex));\n tailTokenCounts.set(messageIndex, count);\n return count;\n };\n let lower = 0;\n let upper = userMessageIndexes.length - 1;\n let retainedBoundary = upper;\n while (lower <= upper) {\n const middle = Math.floor((lower + upper) / 2);\n const candidate = userMessageIndexes[middle] ?? 0;\n if ((await countTail(candidate)) <= retention.recentTokens) {\n retainedBoundary = middle;\n upper = middle - 1;\n } else {\n lower = middle + 1;\n }\n }\n compactedMessageCount = userMessageIndexes[retainedBoundary] ?? 0;\n retainedTokenCount =\n tailTokenCounts.get(compactedMessageCount) ??\n (await countTokens(tokenCounter, messages.slice(compactedMessageCount)));\n }\n if (compactedMessageCount === 0) {\n return none;\n }\n const compactedTokenCount = await countTokens(\n tokenCounter,\n messages.slice(0, compactedMessageCount),\n );\n return {\n compactedMessageCount,\n originalTokenCount,\n compactedTokenCount,\n retainedTokenCount,\n };\n}\n\nasync function countTokens(\n tokenCounter: MemoryTokenCounter,\n messages: readonly MessageType[],\n): Promise<number> {\n let count: number;\n try {\n count = await tokenCounter(messages);\n } catch (error) {\n throw new MemoryCompactionError(\"Memory token counter failed.\", { cause: error });\n }\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new MemoryCompactionError(\"Memory token counter must return a nonnegative safe integer.\");\n }\n return count;\n}\n\nfunction remappedCompactorError(error: unknown, usage: ReturnType<typeof Usage.empty>): Error {\n if (error instanceof MemoryCompactionError) {\n const mergedUsage =\n error.usage === undefined\n ? usage\n : isEmptyUsage(usage)\n ? error.usage\n : Usage.add(usage, error.usage);\n if (mergedUsage === error.usage || (error.usage === undefined && isEmptyUsage(usage))) {\n return error;\n }\n return new MemoryCompactionError(error.message, {\n cause: error,\n usage: mergedUsage,\n });\n }\n return new MemoryCompactionError(\"Memory compactor failed.\", {\n cause: error,\n usage,\n });\n}\n\nfunction isEmptyUsage(usage: ReturnType<typeof Usage.empty>): boolean {\n return (\n usage.inputTokens === 0 &&\n usage.outputTokens === 0 &&\n usage.totalTokens === 0 &&\n usage.cachedInputTokens === 0 &&\n usage.cacheCreationInputTokens === 0\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  // src/internal/agent-runtime/execution.ts
2
- var AGENT_RUN_EXECUTION_VERSION = 2;
2
+ var AGENT_RUN_EXECUTION_VERSION = 3;
3
3
 
4
4
  export {
5
5
  AGENT_RUN_EXECUTION_VERSION
6
6
  };
7
- //# sourceMappingURL=chunk-M32FTMYD.js.map
7
+ //# sourceMappingURL=chunk-SHSSCEGO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/agent-runtime/execution.ts"],"sourcesContent":["import type { PreparedLoopContext, LoopContextCheckpoint } from \"./loop-context\";\nimport type {\n CompletionRequest,\n CompletionResponse,\n ToolCallPart,\n Message,\n} from \"../../completion\";\nimport type { NormalizedToolOutput, ToolCallContext } from \"../../tool\";\nimport type { AgentStreamEvent } from \"../../agent/run-types\";\n\n/** Runtime capability marker: older core versions must fail before accepting durable work. */\nexport const AGENT_RUN_EXECUTION_VERSION = 3;\n\n/** Normalized generation progress; never includes raw provider responses. */\nexport type AgentCompletionStreamEvent = Extract<\n AgentStreamEvent<unknown, unknown>,\n {\n type:\n | \"text_delta\"\n | \"reasoning_delta\"\n | \"tool_call_delta\"\n | \"tool_call\"\n | \"source\"\n | \"provider_tool_call\";\n }\n>;\n\nexport type AgentCompletionStream = AsyncGenerator<AgentCompletionStreamEvent, CompletionResponse>;\n\nexport type AgentToolExecutionResult =\n | { output: NormalizedToolOutput; failed: false }\n | { output: NormalizedToolOutput; failed: true; error: unknown };\n\n/** Internal persistence boundary used by execution runtimes. Callbacks own external effects. */\nexport interface AgentRunExecution {\n /** Persist the context selected before each model call, including skipped compaction decisions. */\n prepareMessages?(\n turn: number,\n messages: readonly Message[],\n checkpoint?: LoopContextCheckpoint,\n ): Promise<PreparedLoopContext>;\n completion(\n turn: number,\n request: CompletionRequest,\n execute: () => Promise<CompletionResponse>,\n ): Promise<CompletionResponse>;\n streamCompletion?(\n turn: number,\n request: CompletionRequest,\n execute: () => AgentCompletionStream,\n ): AgentCompletionStream;\n tool(\n call: { turn: number; toolCall: ToolCallPart; args: string },\n execute: (context?: Pick<ToolCallContext, \"operationId\">) => Promise<AgentToolExecutionResult>,\n ): Promise<AgentToolExecutionResult>;\n}\n"],"mappings":";AAWO,IAAM,8BAA8B;","names":[]}
@@ -1,3 +1,9 @@
1
+ import {
2
+ STRUCTURED_OUTPUT_RETRY_PROMPT,
3
+ STRUCTURED_OUTPUT_TRUNCATED_RETRY_PROMPT,
4
+ normalizeStructuredOutput,
5
+ structuredOutputRepairPreview
6
+ } from "./chunk-SXE4J43E.js";
1
7
  import {
2
8
  ToolCallExecutor
3
9
  } from "./chunk-DRSKZVC6.js";
@@ -6,7 +12,7 @@ import {
6
12
  } from "./chunk-LAIATEUB.js";
7
13
  import {
8
14
  AgentRunMemory
9
- } from "./chunk-MA3TYOKF.js";
15
+ } from "./chunk-PLQAN4EO.js";
10
16
  import {
11
17
  fetchContextDocuments,
12
18
  fetchToolDefinitions
@@ -23,17 +29,11 @@ import {
23
29
  addTurnToToolCallDelta,
24
30
  isGenerationDeltaEvent
25
31
  } from "./chunk-YWRXOPHC.js";
26
- import {
27
- STRUCTURED_OUTPUT_RETRY_PROMPT,
28
- STRUCTURED_OUTPUT_TRUNCATED_RETRY_PROMPT,
29
- normalizeStructuredOutput,
30
- structuredOutputRepairPreview
31
- } from "./chunk-SXE4J43E.js";
32
32
  import {
33
33
  parseContinuationState,
34
34
  questionResult,
35
35
  serializeContinuationState
36
- } from "./chunk-5I2NVRHC.js";
36
+ } from "./chunk-5ZM5DB3O.js";
37
37
  import {
38
38
  AgentInteractionSignal,
39
39
  ToolExecutionSuspension,
@@ -176,6 +176,7 @@ var AgentRun = class _AgentRun {
176
176
  this.memoryScope = options.memoryScope;
177
177
  this.memoryRecorder = new AgentRunMemory(agent, options.memoryScope, initialHistory);
178
178
  this.continuationState = options.continuationState;
179
+ this.loopContextCheckpoint = options.continuationState?.loopContextCheckpoint;
179
180
  this.interactionResponse = options.interactionResponse;
180
181
  if (options.continuationState !== void 0) {
181
182
  this.steeringMessages.push(
@@ -212,6 +213,7 @@ var AgentRun = class _AgentRun {
212
213
  onSteeringApplied;
213
214
  onInternalMemoryCompaction;
214
215
  memoryCompaction;
216
+ loopContextCheckpoint;
215
217
  requestedRunId;
216
218
  continuationState;
217
219
  interactionResponse;
@@ -392,7 +394,14 @@ var AgentRun = class _AgentRun {
392
394
  const historyForRequest = [...this.chatHistory, ...newMessages.slice(0, -1)];
393
395
  await this.runTurnStartHook(currentTurns, prompt, historyForRequest, newMessages);
394
396
  await this.runCompletionCallHook(prompt, historyForRequest, newMessages);
395
- const request = await this.createTurnRequest(prompt, historyForRequest, currentTurns);
397
+ const prepared = this.execution?.prepareMessages !== void 0 || this.agent.memory?.compaction !== void 0 ? await this.prepareTurnMessages(currentTurns, [...historyForRequest, prompt]) : { messages: [...historyForRequest, prompt] };
398
+ if (prepared.compaction !== void 0) {
399
+ usage = Usage.add(usage, prepared.compaction.usage);
400
+ this.memoryCompaction = prepared.compaction;
401
+ await this.notifyInternalMemoryCompaction(prepared.compaction);
402
+ await this.recordMemoryCompaction(prepared, runObservers);
403
+ }
404
+ const request = await this.createTurnRequest(prompt, prepared.messages, currentTurns);
396
405
  let response;
397
406
  try {
398
407
  response = await this.runCompletion(request, currentTurns, runObservers);
@@ -702,7 +711,15 @@ var AgentRun = class _AgentRun {
702
711
  };
703
712
  await this.runTurnStartHook(currentTurns, prompt, historyForRequest, newMessages);
704
713
  await this.runCompletionCallHook(prompt, historyForRequest, newMessages);
705
- const request = await this.createTurnRequest(prompt, historyForRequest, currentTurns);
714
+ const prepared = this.execution?.prepareMessages !== void 0 || this.agent.memory?.compaction !== void 0 ? await this.prepareTurnMessages(currentTurns, [...historyForRequest, prompt]) : { messages: [...historyForRequest, prompt] };
715
+ if (prepared.compaction !== void 0) {
716
+ usage = Usage.add(usage, prepared.compaction.usage);
717
+ this.memoryCompaction = prepared.compaction;
718
+ await this.notifyInternalMemoryCompaction(prepared.compaction);
719
+ await this.recordMemoryCompaction(prepared, runObservers);
720
+ yield { type: "memory_compaction", ...prepared.compaction };
721
+ }
722
+ const request = await this.createTurnRequest(prompt, prepared.messages, currentTurns);
706
723
  assertCompletionRequestSupported(this.agent.model, request, { streaming: true });
707
724
  const providerRequest = this.providerTraceRequest(request, { stream: true });
708
725
  const generationStartArgs = this.generationStartArgs(
@@ -1024,12 +1041,28 @@ var AgentRun = class _AgentRun {
1024
1041
  throw error;
1025
1042
  }
1026
1043
  }
1027
- async createTurnRequest(prompt, history, turn) {
1044
+ async prepareTurnMessages(turn, messages) {
1045
+ let prepared;
1046
+ if (this.execution?.prepareMessages !== void 0) {
1047
+ prepared = await this.execution.prepareMessages(turn, messages, this.loopContextCheckpoint);
1048
+ } else if (turn > 1 || this.continuationState !== void 0 || messages.some((message) => message.role === "tool")) {
1049
+ prepared = await this.memoryRecorder.prepareLoop(
1050
+ messages,
1051
+ this.loopContextCheckpoint,
1052
+ this.abortController.signal
1053
+ );
1054
+ } else {
1055
+ prepared = { messages };
1056
+ }
1057
+ if (prepared.checkpoint !== void 0) this.loopContextCheckpoint = prepared.checkpoint;
1058
+ return prepared;
1059
+ }
1060
+ async createTurnRequest(prompt, messages, turn) {
1028
1061
  const ragText = extractRagText(prompt);
1029
1062
  const abortSignal = this.abortController.signal;
1030
1063
  const documents = await fetchContextDocuments(this.agent, ragText, abortSignal);
1031
1064
  const toolDefinitions = await fetchToolDefinitions(this.agent, ragText, abortSignal);
1032
- const request = createCompletionRequest(providerMessages([...history, prompt]), {
1065
+ const request = createCompletionRequest(providerMessages(messages), {
1033
1066
  instructions: this.agent.instructions,
1034
1067
  documents,
1035
1068
  tools: [...toolDefinitions, ...getAgentToolState(this.agent).providerTools],
@@ -1235,6 +1268,8 @@ var AgentRun = class _AgentRun {
1235
1268
  }))
1236
1269
  };
1237
1270
  if (this.memoryScope !== void 0) continuationState.memoryScope = this.memoryScope;
1271
+ if (this.loopContextCheckpoint !== void 0)
1272
+ continuationState.loopContextCheckpoint = this.loopContextCheckpoint;
1238
1273
  const continuation = parseAgentContinuation({
1239
1274
  version: 1,
1240
1275
  agentId: this.agent.id,
@@ -2349,4 +2384,4 @@ function observerRunEnd(outcome) {
2349
2384
  export {
2350
2385
  AgentRun
2351
2386
  };
2352
- //# sourceMappingURL=chunk-AO2QL2VD.js.map
2387
+ //# sourceMappingURL=chunk-SISGNHNO.js.map