@oni.bot/core 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +315 -200
  3. package/SECURITY.md +71 -0
  4. package/dist/checkpointers/sqlite.d.ts.map +1 -1
  5. package/dist/checkpointers/sqlite.js +20 -18
  6. package/dist/checkpointers/sqlite.js.map +1 -1
  7. package/dist/circuit-breaker.d.ts +20 -0
  8. package/dist/circuit-breaker.d.ts.map +1 -0
  9. package/dist/circuit-breaker.js +58 -0
  10. package/dist/circuit-breaker.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +32 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/init.d.ts +2 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +17 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/cli/templates.d.ts +8 -0
  20. package/dist/cli/templates.d.ts.map +1 -0
  21. package/dist/cli/templates.js +119 -0
  22. package/dist/cli/templates.js.map +1 -0
  23. package/dist/dlq.d.ts +17 -0
  24. package/dist/dlq.d.ts.map +1 -0
  25. package/dist/dlq.js +41 -0
  26. package/dist/dlq.js.map +1 -0
  27. package/dist/errors.d.ts +36 -1
  28. package/dist/errors.d.ts.map +1 -1
  29. package/dist/errors.js +163 -7
  30. package/dist/errors.js.map +1 -1
  31. package/dist/graph.d.ts +17 -0
  32. package/dist/graph.d.ts.map +1 -1
  33. package/dist/graph.js +13 -2
  34. package/dist/graph.js.map +1 -1
  35. package/dist/harness/agent-loop.d.ts +8 -0
  36. package/dist/harness/agent-loop.d.ts.map +1 -0
  37. package/dist/harness/agent-loop.js +327 -0
  38. package/dist/harness/agent-loop.js.map +1 -0
  39. package/dist/harness/context-compactor.d.ts +73 -0
  40. package/dist/harness/context-compactor.d.ts.map +1 -0
  41. package/dist/harness/context-compactor.js +162 -0
  42. package/dist/harness/context-compactor.js.map +1 -0
  43. package/dist/harness/harness.d.ts +41 -0
  44. package/dist/harness/harness.d.ts.map +1 -0
  45. package/dist/harness/harness.js +140 -0
  46. package/dist/harness/harness.js.map +1 -0
  47. package/dist/harness/hooks-engine.d.ts +71 -0
  48. package/dist/harness/hooks-engine.d.ts.map +1 -0
  49. package/dist/harness/hooks-engine.js +232 -0
  50. package/dist/harness/hooks-engine.js.map +1 -0
  51. package/dist/harness/index.d.ts +16 -0
  52. package/dist/harness/index.d.ts.map +1 -0
  53. package/dist/harness/index.js +19 -0
  54. package/dist/harness/index.js.map +1 -0
  55. package/dist/harness/safety-gate.d.ts +29 -0
  56. package/dist/harness/safety-gate.d.ts.map +1 -0
  57. package/dist/harness/safety-gate.js +72 -0
  58. package/dist/harness/safety-gate.js.map +1 -0
  59. package/dist/harness/skill-loader.d.ts +63 -0
  60. package/dist/harness/skill-loader.d.ts.map +1 -0
  61. package/dist/harness/skill-loader.js +214 -0
  62. package/dist/harness/skill-loader.js.map +1 -0
  63. package/dist/harness/todo-module.d.ts +39 -0
  64. package/dist/harness/todo-module.d.ts.map +1 -0
  65. package/dist/harness/todo-module.js +179 -0
  66. package/dist/harness/todo-module.js.map +1 -0
  67. package/dist/harness/types.d.ts +78 -0
  68. package/dist/harness/types.d.ts.map +1 -0
  69. package/dist/harness/types.js +9 -0
  70. package/dist/harness/types.js.map +1 -0
  71. package/dist/hitl/interrupt.d.ts.map +1 -1
  72. package/dist/hitl/interrupt.js +7 -6
  73. package/dist/hitl/interrupt.js.map +1 -1
  74. package/dist/index.d.ts +14 -3
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +12 -3
  77. package/dist/index.js.map +1 -1
  78. package/dist/models/google.d.ts.map +1 -1
  79. package/dist/models/google.js +7 -6
  80. package/dist/models/google.js.map +1 -1
  81. package/dist/models/index.d.ts +2 -0
  82. package/dist/models/index.d.ts.map +1 -1
  83. package/dist/models/index.js +1 -0
  84. package/dist/models/index.js.map +1 -1
  85. package/dist/models/openai.js +6 -1
  86. package/dist/models/openai.js.map +1 -1
  87. package/dist/models/openrouter.d.ts +13 -0
  88. package/dist/models/openrouter.d.ts.map +1 -0
  89. package/dist/models/openrouter.js +322 -0
  90. package/dist/models/openrouter.js.map +1 -0
  91. package/dist/prebuilt/tool-node.d.ts.map +1 -1
  92. package/dist/prebuilt/tool-node.js +0 -1
  93. package/dist/prebuilt/tool-node.js.map +1 -1
  94. package/dist/pregel.d.ts +11 -1
  95. package/dist/pregel.d.ts.map +1 -1
  96. package/dist/pregel.js +88 -7
  97. package/dist/pregel.js.map +1 -1
  98. package/dist/retry.d.ts.map +1 -1
  99. package/dist/retry.js +6 -1
  100. package/dist/retry.js.map +1 -1
  101. package/dist/store/index.d.ts +10 -0
  102. package/dist/store/index.d.ts.map +1 -1
  103. package/dist/store/index.js +15 -1
  104. package/dist/store/index.js.map +1 -1
  105. package/dist/stream-events.js +2 -2
  106. package/dist/stream-events.js.map +1 -1
  107. package/dist/streaming.d.ts +10 -0
  108. package/dist/streaming.d.ts.map +1 -1
  109. package/dist/streaming.js +28 -0
  110. package/dist/streaming.js.map +1 -1
  111. package/dist/swarm/graph.d.ts.map +1 -1
  112. package/dist/swarm/graph.js +0 -4
  113. package/dist/swarm/graph.js.map +1 -1
  114. package/dist/swarm/supervisor.d.ts.map +1 -1
  115. package/dist/swarm/supervisor.js +0 -4
  116. package/dist/swarm/supervisor.js.map +1 -1
  117. package/dist/telemetry.d.ts +41 -0
  118. package/dist/telemetry.d.ts.map +1 -0
  119. package/dist/telemetry.js +69 -0
  120. package/dist/telemetry.js.map +1 -0
  121. package/dist/testing/index.d.ts +33 -0
  122. package/dist/testing/index.d.ts.map +1 -0
  123. package/dist/testing/index.js +95 -0
  124. package/dist/testing/index.js.map +1 -0
  125. package/dist/types.d.ts +9 -0
  126. package/dist/types.d.ts.map +1 -1
  127. package/dist/types.js +1 -1
  128. package/dist/types.js.map +1 -1
  129. package/package.json +38 -5
@@ -0,0 +1,322 @@
1
+ /* ------------------------------------------------------------------ */
2
+ /* Message conversion */
3
+ /* ------------------------------------------------------------------ */
4
+ function contentToString(content) {
5
+ if (typeof content === "string")
6
+ return content;
7
+ return content
8
+ .filter((p) => p.type === "text")
9
+ .map((p) => p.text ?? "")
10
+ .join("");
11
+ }
12
+ function convertMessages(messages, systemPrompt) {
13
+ const converted = [];
14
+ if (systemPrompt) {
15
+ converted.push({ role: "system", content: systemPrompt });
16
+ }
17
+ for (const msg of messages) {
18
+ if (msg.role === "system") {
19
+ converted.push({ role: "system", content: contentToString(msg.content) });
20
+ continue;
21
+ }
22
+ if (msg.role === "tool") {
23
+ converted.push({
24
+ role: "tool",
25
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content),
26
+ tool_call_id: msg.toolCallId,
27
+ });
28
+ continue;
29
+ }
30
+ if (msg.role === "assistant" && msg.toolCalls && msg.toolCalls.length > 0) {
31
+ const text = contentToString(msg.content);
32
+ const toolCalls = msg.toolCalls.map((tc) => ({
33
+ id: tc.id,
34
+ type: "function",
35
+ function: { name: tc.name, arguments: JSON.stringify(tc.args) },
36
+ }));
37
+ converted.push({
38
+ role: "assistant",
39
+ content: text || null,
40
+ tool_calls: toolCalls,
41
+ });
42
+ continue;
43
+ }
44
+ converted.push({
45
+ role: msg.role,
46
+ content: contentToString(msg.content),
47
+ });
48
+ }
49
+ return converted;
50
+ }
51
+ function convertTools(tools) {
52
+ return tools.map((t) => ({
53
+ type: "function",
54
+ function: {
55
+ name: t.name,
56
+ description: t.description,
57
+ parameters: t.parameters,
58
+ },
59
+ }));
60
+ }
61
+ function mapFinishReason(reason) {
62
+ if (reason === "tool_calls")
63
+ return "tool_use";
64
+ if (reason === "length")
65
+ return "max_tokens";
66
+ if (reason === "stop")
67
+ return "end";
68
+ return "end";
69
+ }
70
+ /* ------------------------------------------------------------------ */
71
+ /* SSE line parser */
72
+ /* ------------------------------------------------------------------ */
73
+ async function* parseSSE(body) {
74
+ const reader = body.getReader();
75
+ const decoder = new TextDecoder();
76
+ let buffer = "";
77
+ try {
78
+ for (;;) {
79
+ const { done, value } = await reader.read();
80
+ if (done)
81
+ break;
82
+ buffer += decoder.decode(value, { stream: true });
83
+ const lines = buffer.split("\n");
84
+ buffer = lines.pop();
85
+ for (const line of lines) {
86
+ if (line.startsWith("data: ")) {
87
+ const data = line.slice(6).trim();
88
+ if (data && data !== "[DONE]") {
89
+ yield data;
90
+ }
91
+ if (data === "[DONE]")
92
+ return;
93
+ }
94
+ }
95
+ }
96
+ if (buffer.trim()) {
97
+ const lines = buffer.split("\n");
98
+ for (const line of lines) {
99
+ if (line.startsWith("data: ")) {
100
+ const data = line.slice(6).trim();
101
+ if (data && data !== "[DONE]") {
102
+ yield data;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ finally {
109
+ reader.releaseLock();
110
+ }
111
+ }
112
+ /* ------------------------------------------------------------------ */
113
+ /* Factory */
114
+ /* ------------------------------------------------------------------ */
115
+ export function openrouter(modelId, opts) {
116
+ const apiKey = opts?.apiKey ?? process.env["OPENROUTER_API_KEY"] ?? "";
117
+ const baseUrl = (opts?.baseUrl ?? "https://openrouter.ai/api").replace(/\/$/, "");
118
+ const defaultMaxTokens = opts?.defaultMaxTokens;
119
+ const defaultTemperature = opts?.defaultTemperature;
120
+ const referer = opts?.referer ?? process.env["OPENROUTER_REFERER"] ?? "";
121
+ const appTitle = opts?.appTitle ?? process.env["OPENROUTER_APP_TITLE"] ?? "";
122
+ const providerPrefs = opts?.provider;
123
+ const transforms = opts?.transforms;
124
+ function headers() {
125
+ const h = {
126
+ "Content-Type": "application/json",
127
+ "Authorization": `Bearer ${apiKey}`,
128
+ };
129
+ if (referer)
130
+ h["HTTP-Referer"] = referer;
131
+ if (appTitle)
132
+ h["X-Title"] = appTitle;
133
+ return h;
134
+ }
135
+ function buildBody(params, stream) {
136
+ const messages = convertMessages(params.messages, params.systemPrompt);
137
+ const body = {
138
+ model: modelId,
139
+ messages,
140
+ };
141
+ const maxTokens = params.maxTokens ?? defaultMaxTokens;
142
+ if (maxTokens !== undefined) {
143
+ body.max_tokens = maxTokens;
144
+ }
145
+ if (params.temperature !== undefined || defaultTemperature !== undefined) {
146
+ body.temperature = params.temperature ?? defaultTemperature;
147
+ }
148
+ if (params.stopSequences && params.stopSequences.length > 0) {
149
+ body.stop = params.stopSequences;
150
+ }
151
+ if (params.tools && params.tools.length > 0) {
152
+ body.tools = convertTools(params.tools);
153
+ }
154
+ if (providerPrefs) {
155
+ body.provider = providerPrefs;
156
+ }
157
+ if (transforms) {
158
+ body.transforms = transforms;
159
+ }
160
+ if (stream) {
161
+ body.stream = true;
162
+ }
163
+ return body;
164
+ }
165
+ /* ---- chat -------------------------------------------------------- */
166
+ async function chat(params) {
167
+ const body = buildBody(params, false);
168
+ const res = await fetch(`${baseUrl}/v1/chat/completions`, {
169
+ method: "POST",
170
+ headers: headers(),
171
+ body: JSON.stringify(body),
172
+ signal: params.signal,
173
+ });
174
+ if (!res.ok) {
175
+ const text = await res.text().catch(() => "");
176
+ throw new Error(`OpenRouter API error ${res.status}: ${text}`);
177
+ }
178
+ const json = (await res.json());
179
+ const choice = json.choices[0];
180
+ const message = choice.message;
181
+ const content = message.content ?? "";
182
+ let toolCalls;
183
+ if (message.tool_calls && message.tool_calls.length > 0) {
184
+ toolCalls = message.tool_calls.map((tc) => ({
185
+ id: tc.id,
186
+ name: tc.function.name,
187
+ args: (() => { try {
188
+ return JSON.parse(tc.function.arguments);
189
+ }
190
+ catch {
191
+ return {};
192
+ } })(),
193
+ }));
194
+ }
195
+ return {
196
+ content,
197
+ toolCalls,
198
+ usage: {
199
+ inputTokens: json.usage.prompt_tokens,
200
+ outputTokens: json.usage.completion_tokens,
201
+ },
202
+ stopReason: mapFinishReason(choice.finish_reason),
203
+ raw: json,
204
+ };
205
+ }
206
+ /* ---- stream ------------------------------------------------------ */
207
+ async function* stream(params) {
208
+ const body = buildBody(params, true);
209
+ const res = await fetch(`${baseUrl}/v1/chat/completions`, {
210
+ method: "POST",
211
+ headers: headers(),
212
+ body: JSON.stringify(body),
213
+ signal: params.signal,
214
+ });
215
+ if (!res.ok) {
216
+ const text = await res.text().catch(() => "");
217
+ throw new Error(`OpenRouter API error ${res.status}: ${text}`);
218
+ }
219
+ if (!res.body) {
220
+ throw new Error("OpenRouter API returned no body for stream");
221
+ }
222
+ const activeToolCalls = new Map();
223
+ for await (const data of parseSSE(res.body)) {
224
+ let parsed;
225
+ try {
226
+ parsed = JSON.parse(data);
227
+ }
228
+ catch {
229
+ continue;
230
+ }
231
+ const choices = parsed["choices"];
232
+ if (!choices || choices.length === 0)
233
+ continue;
234
+ const choice = choices[0];
235
+ const delta = choice["delta"];
236
+ if (!delta)
237
+ continue;
238
+ // Text content
239
+ if (delta["content"] && typeof delta["content"] === "string") {
240
+ yield { type: "text", text: delta["content"] };
241
+ }
242
+ // Tool calls
243
+ const toolCalls = delta["tool_calls"];
244
+ if (toolCalls) {
245
+ for (const tc of toolCalls) {
246
+ const index = tc["index"];
247
+ const fn = tc["function"];
248
+ if (tc["id"]) {
249
+ activeToolCalls.set(index, {
250
+ id: tc["id"],
251
+ name: fn?.["name"] ?? "",
252
+ args: fn?.["arguments"] ?? "",
253
+ });
254
+ yield {
255
+ type: "tool_call_start",
256
+ toolCall: {
257
+ id: tc["id"],
258
+ name: fn?.["name"] ?? "",
259
+ args: {},
260
+ },
261
+ };
262
+ }
263
+ else if (fn?.["arguments"]) {
264
+ const active = activeToolCalls.get(index);
265
+ if (active) {
266
+ active.args += fn["arguments"];
267
+ }
268
+ yield {
269
+ type: "tool_call_delta",
270
+ toolCall: {
271
+ args: { __partial: fn["arguments"] },
272
+ },
273
+ };
274
+ }
275
+ }
276
+ }
277
+ // Finish reason → emit tool_call_end
278
+ const finishReason = choice["finish_reason"];
279
+ if (finishReason === "tool_calls") {
280
+ for (const [, active] of activeToolCalls) {
281
+ let args = {};
282
+ try {
283
+ args = JSON.parse(active.args);
284
+ }
285
+ catch {
286
+ // partial args
287
+ }
288
+ yield {
289
+ type: "tool_call_end",
290
+ toolCall: { id: active.id, name: active.name, args },
291
+ };
292
+ }
293
+ activeToolCalls.clear();
294
+ }
295
+ // Usage
296
+ const usage = parsed["usage"];
297
+ if (usage) {
298
+ yield {
299
+ type: "usage",
300
+ usage: {
301
+ inputTokens: usage.prompt_tokens ?? 0,
302
+ outputTokens: usage.completion_tokens ?? 0,
303
+ },
304
+ };
305
+ }
306
+ }
307
+ }
308
+ /* ---- model object ------------------------------------------------ */
309
+ return {
310
+ chat,
311
+ stream,
312
+ provider: "openrouter",
313
+ modelId,
314
+ capabilities: {
315
+ tools: true,
316
+ vision: true,
317
+ streaming: true,
318
+ embeddings: false,
319
+ },
320
+ };
321
+ }
322
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/models/openrouter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-node.d.ts","sourceRoot":"","sources":["../../src/prebuilt/tool-node.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAM3D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAS,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,EAAE,EAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC5E;AAMD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EAAE,GACf,MAAM,CAAC;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CA8CpC;AAOD,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAChC,OAAO,GAAG,SAAS,CAIrB"}
1
+ {"version":3,"file":"tool-node.d.ts","sourceRoot":"","sources":["../../src/prebuilt/tool-node.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAM3D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAS,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,EAAE,EAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC5E;AAMD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EAAE,GACf,MAAM,CAAC;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CA6CpC;AAOD,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAChC,OAAO,GAAG,SAAS,CAIrB"}
@@ -13,7 +13,6 @@ export function createToolNode(tools) {
13
13
  return async (state) => {
14
14
  const lastMsg = state.messages.at(-1);
15
15
  if (!lastMsg || lastMsg.role !== "assistant" || !lastMsg.tool_calls?.length) {
16
- console.warn("[ToolNode] No tool calls found in last assistant message.");
17
16
  return {};
18
17
  }
19
18
  const results = await Promise.all(lastMsg.tool_calls.map(async (tc) => {
@@ -1 +1 @@
1
- {"version":3,"file":"tool-node.js","sourceRoot":"","sources":["../../src/prebuilt/tool-node.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAC/D,0DAA0D;AAC1D,8DAA8D;AAC9D,wDAAwD;AACxD,+DAA+D;AAgB/D,mEAAmE;AACnE,mBAAmB;AACnB,mEAAmE;AAEnE,MAAM,UAAU,cAAc,CAC5B,KAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC1E,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAe,EAAE,EAAE;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,IAAI,EAAW,MAAe;oBAC9B,OAAO,EAAQ,gBAAgB,EAAE,CAAC,IAAI,cAAc;oBACpD,IAAI,EAAW,EAAE,CAAC,IAAI;oBACtB,YAAY,EAAG,EAAE,CAAC,EAAE;iBACrB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAW,MAAe;oBAC9B,OAAO,EAAQ,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;oBAC3E,IAAI,EAAW,EAAE,CAAC,IAAI;oBACtB,YAAY,EAAG,EAAE,CAAC,EAAE;iBACrB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO;oBACL,IAAI,EAAW,MAAe;oBAC9B,OAAO,EAAQ,uBAAuB,EAAE,CAAC,IAAI,MAAM,GAAG,EAAE;oBACxD,IAAI,EAAW,EAAE,CAAC,IAAI;oBACtB,YAAY,EAAG,EAAE,CAAC,EAAE;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,iEAAiE;AACjE,+CAA+C;AAC/C,mEAAmE;AAEnE,MAAM,UAAU,cAAc,CAC5B,KAAiC;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM;QAAE,OAAO,OAAO,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"tool-node.js","sourceRoot":"","sources":["../../src/prebuilt/tool-node.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAC/D,0DAA0D;AAC1D,8DAA8D;AAC9D,wDAAwD;AACxD,+DAA+D;AAgB/D,mEAAmE;AACnE,mBAAmB;AACnB,mEAAmE;AAEnE,MAAM,UAAU,cAAc,CAC5B,KAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAC5E,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAe,EAAE,EAAE;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,IAAI,EAAW,MAAe;oBAC9B,OAAO,EAAQ,gBAAgB,EAAE,CAAC,IAAI,cAAc;oBACpD,IAAI,EAAW,EAAE,CAAC,IAAI;oBACtB,YAAY,EAAG,EAAE,CAAC,EAAE;iBACrB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAW,MAAe;oBAC9B,OAAO,EAAQ,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;oBAC3E,IAAI,EAAW,EAAE,CAAC,IAAI;oBACtB,YAAY,EAAG,EAAE,CAAC,EAAE;iBACrB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO;oBACL,IAAI,EAAW,MAAe;oBAC9B,OAAO,EAAQ,uBAAuB,EAAE,CAAC,IAAI,MAAM,GAAG,EAAE;oBACxD,IAAI,EAAW,EAAE,CAAC,IAAI;oBACtB,YAAY,EAAG,EAAE,CAAC,EAAE;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,iEAAiE;AACjE,+CAA+C;AAC/C,mEAAmE;AAEnE,MAAM,UAAU,cAAc,CAC5B,KAAiC;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM;QAAE,OAAO,OAAO,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/dist/pregel.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type NodeDefinition, type Edge, type ChannelSchema, type ONIConfig, type ONIStreamEvent, type StreamMode, type InterruptConfig, type ONICheckpointer, type ONICheckpoint } from "./types.js";
2
+ import { DeadLetterQueue, type DeadLetter } from "./dlq.js";
2
3
  import type { BaseStore } from "./store/index.js";
3
4
  import { HITLSessionStore } from "./hitl/index.js";
4
5
  import { EventBus } from "./events/bus.js";
@@ -6,6 +7,7 @@ import type { GuardrailsConfig } from "./guardrails/types.js";
6
7
  import type { EventListeners } from "./events/types.js";
7
8
  import { AuditLog } from "./guardrails/audit.js";
8
9
  import { BudgetTracker } from "./guardrails/budget.js";
10
+ import { ONITracer, type TracerLike } from "./telemetry.js";
9
11
  export declare class ONIPregelRunner<S extends Record<string, unknown>> {
10
12
  private readonly nodes;
11
13
  private readonly edges;
@@ -13,8 +15,11 @@ export declare class ONIPregelRunner<S extends Record<string, unknown>> {
13
15
  private readonly interruptConfig;
14
16
  private readonly checkpointer;
15
17
  private readonly store;
18
+ private readonly defaults?;
19
+ private readonly dlq;
16
20
  private hitlStore;
17
21
  private nodeCache;
22
+ private circuitBreakers;
18
23
  /** Set to true when this runner is being invoked as a subgraph */
19
24
  private _isSubgraph;
20
25
  /** Accumulated parent updates from Command.PARENT during subgraph execution */
@@ -22,7 +27,10 @@ export declare class ONIPregelRunner<S extends Record<string, unknown>> {
22
27
  readonly eventBus: EventBus;
23
28
  readonly auditLog: AuditLog | null;
24
29
  readonly budgetTracker: BudgetTracker | null;
25
- constructor(nodes: Map<string, NodeDefinition<S>>, edges: Edge<S>[], channels: ChannelSchema<S>, interruptConfig?: InterruptConfig, checkpointer?: ONICheckpointer<S> | null, store?: BaseStore | null, guardrails?: GuardrailsConfig, listeners?: EventListeners);
30
+ readonly tracer: ONITracer;
31
+ constructor(nodes: Map<string, NodeDefinition<S>>, edges: Edge<S>[], channels: ChannelSchema<S>, interruptConfig?: InterruptConfig, checkpointer?: ONICheckpointer<S> | null, store?: BaseStore | null, guardrails?: GuardrailsConfig, listeners?: EventListeners, defaults?: {
32
+ nodeTimeout?: number;
33
+ } | undefined, dlq?: DeadLetterQueue | null, tracer?: TracerLike | null);
26
34
  private buildInitialState;
27
35
  private applyUpdate;
28
36
  private resetEphemeral;
@@ -42,6 +50,8 @@ export declare class ONIPregelRunner<S extends Record<string, unknown>> {
42
50
  forkFrom(threadId: string, step: number, newThreadId: string): Promise<void>;
43
51
  getPendingInterrupts(threadId: string): import("./hitl/resume.js").HITLSession<S>[];
44
52
  hitlSessionStore(): HITLSessionStore<S>;
53
+ private getCircuitBreaker;
54
+ getDeadLetters(threadId: string): DeadLetter[];
45
55
  private saveCheckpoint;
46
56
  private evt;
47
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pregel.d.ts","sourceRoot":"","sources":["../src/pregel.ts"],"names":[],"mappings":"AAKA,OAAO,EAEU,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EACjE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAC1E,KAAK,eAAe,EAAE,KAAK,aAAa,EAEzC,MAAM,YAAY,CAAC;AAMpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EACwC,gBAAgB,EAG9D,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AASvD,qBAAa,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAa1D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAjBxB,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,SAAS,CAAmE;IACpF,kEAAkE;IAClE,OAAO,CAAC,WAAW,CAAS;IAC5B,+EAA+E;IAC/E,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM;IAE7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;gBAG1B,KAAK,EAAY,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAC/C,KAAK,EAAY,IAAI,CAAC,CAAC,CAAC,EAAE,EAC1B,QAAQ,EAAS,aAAa,CAAC,CAAC,CAAC,EACjC,eAAe,GAAE,eAAoB,EACrC,YAAY,GAAK,eAAe,CAAC,CAAC,CAAC,GAAG,IAAW,EACjD,KAAK,GAAY,SAAS,GAAG,IAAW,EACzD,UAAU,CAAC,EAAuB,gBAAgB,EAClD,SAAS,CAAC,EAAwB,cAAc;IAWlD,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;YA0BN,WAAW;IAoEzB,OAAO,CAAC,qBAAqB;IActB,OAAO,CACZ,KAAK,EAAO,OAAO,CAAC,CAAC,CAAC,EACtB,MAAM,CAAC,EAAK,SAAS,EACrB,UAAU,GAAE,UAAU,GAAG,UAAU,EAAc,GAChD,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAmW9B,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAQxD,MAAM,CACX,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,MAAM,CAAC,EAAE,SAAS,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAA;KAAE,GAC9D,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAI9B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAa7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAK7C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAM7D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAKzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelF,oBAAoB,CAAC,QAAQ,EAAE,MAAM;IAIrC,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC;YAMzB,cAAc;IAe5B,OAAO,CAAC,GAAG;CAMZ"}
1
+ {"version":3,"file":"pregel.d.ts","sourceRoot":"","sources":["../src/pregel.ts"],"names":[],"mappings":"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"}
package/dist/pregel.js CHANGED
@@ -3,7 +3,8 @@
3
3
  // New: interrupt() context management, HITL resume, token streaming
4
4
  // ============================================================
5
5
  import { START, END, Send, Command, } from "./types.js";
6
- import { RecursionLimitError, NodeNotFoundError, ONIInterrupt } from "./errors.js";
6
+ import { RecursionLimitError, NodeNotFoundError, ONIInterrupt, NodeTimeoutError } from "./errors.js";
7
+ import { CircuitBreaker } from "./circuit-breaker.js";
7
8
  import { withRetry } from "./retry.js";
8
9
  import { NamespacedCheckpointer } from "./checkpointers/namespaced.js";
9
10
  import { _runWithContext } from "./context.js";
@@ -12,6 +13,7 @@ import { NodeInterruptSignal, HITLInterruptException, HITLSessionStore, _install
12
13
  import { EventBus } from "./events/bus.js";
13
14
  import { AuditLog } from "./guardrails/audit.js";
14
15
  import { BudgetTracker } from "./guardrails/budget.js";
16
+ import { ONITracer } from "./telemetry.js";
15
17
  const DEFAULT_RECURSION_LIMIT = 25;
16
18
  export class ONIPregelRunner {
17
19
  nodes;
@@ -20,8 +22,11 @@ export class ONIPregelRunner {
20
22
  interruptConfig;
21
23
  checkpointer;
22
24
  store;
25
+ defaults;
26
+ dlq;
23
27
  hitlStore = new HITLSessionStore();
24
28
  nodeCache = new Map();
29
+ circuitBreakers = new Map();
25
30
  /** Set to true when this runner is being invoked as a subgraph */
26
31
  _isSubgraph = false;
27
32
  /** Accumulated parent updates from Command.PARENT during subgraph execution */
@@ -29,16 +34,20 @@ export class ONIPregelRunner {
29
34
  eventBus;
30
35
  auditLog;
31
36
  budgetTracker;
32
- constructor(nodes, edges, channels, interruptConfig = {}, checkpointer = null, store = null, guardrails, listeners) {
37
+ tracer;
38
+ constructor(nodes, edges, channels, interruptConfig = {}, checkpointer = null, store = null, guardrails, listeners, defaults, dlq = null, tracer) {
33
39
  this.nodes = nodes;
34
40
  this.edges = edges;
35
41
  this.channels = channels;
36
42
  this.interruptConfig = interruptConfig;
37
43
  this.checkpointer = checkpointer;
38
44
  this.store = store;
45
+ this.defaults = defaults;
46
+ this.dlq = dlq;
39
47
  this.eventBus = new EventBus(listeners);
40
48
  this.auditLog = guardrails?.audit ? new AuditLog() : null;
41
49
  this.budgetTracker = guardrails?.budget ? new BudgetTracker(guardrails.budget) : null;
50
+ this.tracer = new ONITracer(tracer ?? null);
42
51
  }
43
52
  // ----------------------------------------------------------------
44
53
  // State helpers
@@ -130,11 +139,43 @@ export class ONIPregelRunner {
130
139
  });
131
140
  try {
132
141
  const run = () => Promise.resolve(nodeDef.fn(state, config));
142
+ // Core execute call: retry-aware
143
+ const executeCall = async () => {
144
+ if (nodeDef.retry)
145
+ return withRetry(run, nodeDef.name, nodeDef.retry);
146
+ return run();
147
+ };
148
+ // Wrap with timeout if configured (per-node > global default > none)
149
+ const timeoutMs = nodeDef.timeout ?? this.defaults?.nodeTimeout;
150
+ const executeWithTimeout = async () => {
151
+ if (timeoutMs != null && timeoutMs > 0) {
152
+ const ac = new AbortController();
153
+ const timer = setTimeout(() => ac.abort(), timeoutMs);
154
+ try {
155
+ return await Promise.race([
156
+ executeCall(),
157
+ new Promise((_, reject) => {
158
+ ac.signal.addEventListener("abort", () => {
159
+ reject(new NodeTimeoutError(nodeDef.name, timeoutMs));
160
+ });
161
+ }),
162
+ ]);
163
+ }
164
+ finally {
165
+ clearTimeout(timer);
166
+ }
167
+ }
168
+ return executeCall();
169
+ };
170
+ // Wrap with circuit breaker if configured
171
+ const cb = this.getCircuitBreaker(nodeDef);
133
172
  let result;
134
- if (nodeDef.retry)
135
- result = await withRetry(run, nodeDef.name, nodeDef.retry);
136
- else
137
- result = await run();
173
+ if (cb) {
174
+ result = await cb.execute(executeWithTimeout);
175
+ }
176
+ else {
177
+ result = await executeWithTimeout();
178
+ }
138
179
  // Store in cache
139
180
  if (nodeDef.cache) {
140
181
  const policy = typeof nodeDef.cache === "object" ? nodeDef.cache : {};
@@ -172,6 +213,8 @@ export class ONIPregelRunner {
172
213
  const modes = new Set(Array.isArray(streamMode) ? streamMode : [streamMode]);
173
214
  const isMultiMode = Array.isArray(streamMode);
174
215
  const tag = (evt, mode) => isMultiMode ? { ...evt, mode } : evt;
216
+ // Telemetry: graph-level span
217
+ const graphSpan = this.tracer.startGraphSpan("invoke", { threadId, agentId });
175
218
  // Load resume values from config (set by resume() call)
176
219
  const resumeMap = config?.__resumeValues ?? {};
177
220
  // Load or init state
@@ -206,6 +249,7 @@ export class ONIPregelRunner {
206
249
  while (true) {
207
250
  const nextNodes = [];
208
251
  const nextSends = [];
252
+ state = this.resetEphemeral(state);
209
253
  // Drain sends — group by target node for parallel fan-out execution
210
254
  const sendGroups = new Map();
211
255
  for (const send of pendingSends) {
@@ -262,7 +306,6 @@ export class ONIPregelRunner {
262
306
  break;
263
307
  if (step >= recursionLimit)
264
308
  throw new RecursionLimitError(recursionLimit);
265
- state = this.resetEphemeral(state);
266
309
  // Emit debug node_start events before parallel execution
267
310
  if (modes.has("debug")) {
268
311
  for (const nodeName of executableNodes) {
@@ -304,6 +347,8 @@ export class ONIPregelRunner {
304
347
  // Emit agent.start lifecycle event
305
348
  const nodeStartTime = Date.now();
306
349
  this.eventBus.emit({ type: "agent.start", agent: name, timestamp: nodeStartTime, step });
350
+ // Telemetry: node-level span
351
+ const nodeSpan = this.tracer.startNodeSpan(name, { threadId, step, agentId });
307
352
  let result;
308
353
  let subParentUpdates = [];
309
354
  try {
@@ -368,8 +413,18 @@ export class ONIPregelRunner {
368
413
  }
369
414
  throw new HITLInterruptException(threadId, iv, state);
370
415
  }
416
+ // Record to DLQ before re-throwing
417
+ if (this.dlq && err instanceof Error) {
418
+ this.dlq.record(threadId, name, state, err, nodeDef.retry?.maxAttempts ?? 1);
419
+ }
420
+ // Telemetry: record error on node span
421
+ if (err instanceof Error)
422
+ this.tracer.recordError(nodeSpan, err);
423
+ this.tracer.endSpan(nodeSpan);
371
424
  throw err;
372
425
  }
426
+ // Telemetry: end node span
427
+ this.tracer.endSpan(nodeSpan);
373
428
  // Emit agent.end lifecycle event
374
429
  this.eventBus.emit({ type: "agent.end", agent: name, timestamp: Date.now(), step, duration: Date.now() - nodeStartTime });
375
430
  // Collect events for yielding after parallel execution
@@ -497,6 +552,9 @@ export class ONIPregelRunner {
497
552
  }
498
553
  if (modes.has("values"))
499
554
  yield tag(this.evt("state_update", state, step, agentId), "values");
555
+ // Telemetry: end graph span
556
+ graphSpan.setAttribute("oni.steps", step);
557
+ this.tracer.endSpan(graphSpan);
500
558
  }
501
559
  // ----------------------------------------------------------------
502
560
  // Public API
@@ -565,16 +623,39 @@ export class ONIPregelRunner {
565
623
  hitlSessionStore() {
566
624
  return this.hitlStore;
567
625
  }
626
+ // ---- Circuit Breaker ----
627
+ getCircuitBreaker(nodeDef) {
628
+ if (!nodeDef.circuitBreaker)
629
+ return null;
630
+ let cb = this.circuitBreakers.get(nodeDef.name);
631
+ if (!cb) {
632
+ cb = new CircuitBreaker({
633
+ threshold: nodeDef.circuitBreaker.threshold,
634
+ resetAfter: nodeDef.circuitBreaker.resetAfter,
635
+ fallback: nodeDef.circuitBreaker.fallback
636
+ ? () => nodeDef.circuitBreaker.fallback(undefined, undefined)
637
+ : undefined,
638
+ }, nodeDef.name);
639
+ this.circuitBreakers.set(nodeDef.name, cb);
640
+ }
641
+ return cb;
642
+ }
643
+ // ---- Dead Letter Queue ----
644
+ getDeadLetters(threadId) {
645
+ return this.dlq?.getAll(threadId) ?? [];
646
+ }
568
647
  // ---- Helpers ----
569
648
  async saveCheckpoint(threadId, step, state, nextNodes, pendingSends, agentId, metadata, pendingWrites) {
570
649
  if (!this.checkpointer)
571
650
  return;
651
+ const cpSpan = this.tracer.startCheckpointSpan("put", { threadId });
572
652
  await this.checkpointer.put({
573
653
  threadId, step, state, agentId, metadata, pendingWrites,
574
654
  nextNodes: nextNodes.map(String),
575
655
  pendingSends: pendingSends,
576
656
  timestamp: Date.now(),
577
657
  });
658
+ this.tracer.endSpan(cpSpan);
578
659
  }
579
660
  evt(event, data, step, agentId, node) {
580
661
  return { event, data, step, timestamp: Date.now(), agentId, node };