@oni.bot/core 0.6.3 → 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.
- package/CHANGELOG.md +111 -0
- package/README.md +315 -200
- package/SECURITY.md +71 -0
- package/dist/checkpointers/sqlite.d.ts.map +1 -1
- package/dist/checkpointers/sqlite.js +20 -18
- package/dist/checkpointers/sqlite.js.map +1 -1
- package/dist/circuit-breaker.d.ts +20 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +58 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +32 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +17 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/templates.d.ts +8 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +119 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/dlq.d.ts +17 -0
- package/dist/dlq.d.ts.map +1 -0
- package/dist/dlq.js +41 -0
- package/dist/dlq.js.map +1 -0
- package/dist/errors.d.ts +36 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +163 -7
- package/dist/errors.js.map +1 -1
- package/dist/graph.d.ts +17 -0
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +13 -2
- package/dist/graph.js.map +1 -1
- package/dist/harness/agent-loop.d.ts +8 -0
- package/dist/harness/agent-loop.d.ts.map +1 -0
- package/dist/harness/agent-loop.js +327 -0
- package/dist/harness/agent-loop.js.map +1 -0
- package/dist/harness/context-compactor.d.ts +73 -0
- package/dist/harness/context-compactor.d.ts.map +1 -0
- package/dist/harness/context-compactor.js +162 -0
- package/dist/harness/context-compactor.js.map +1 -0
- package/dist/harness/harness.d.ts +41 -0
- package/dist/harness/harness.d.ts.map +1 -0
- package/dist/harness/harness.js +140 -0
- package/dist/harness/harness.js.map +1 -0
- package/dist/harness/hooks-engine.d.ts +71 -0
- package/dist/harness/hooks-engine.d.ts.map +1 -0
- package/dist/harness/hooks-engine.js +232 -0
- package/dist/harness/hooks-engine.js.map +1 -0
- package/dist/harness/index.d.ts +16 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +19 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/safety-gate.d.ts +29 -0
- package/dist/harness/safety-gate.d.ts.map +1 -0
- package/dist/harness/safety-gate.js +72 -0
- package/dist/harness/safety-gate.js.map +1 -0
- package/dist/harness/skill-loader.d.ts +63 -0
- package/dist/harness/skill-loader.d.ts.map +1 -0
- package/dist/harness/skill-loader.js +214 -0
- package/dist/harness/skill-loader.js.map +1 -0
- package/dist/harness/todo-module.d.ts +39 -0
- package/dist/harness/todo-module.d.ts.map +1 -0
- package/dist/harness/todo-module.js +179 -0
- package/dist/harness/todo-module.js.map +1 -0
- package/dist/harness/types.d.ts +78 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +9 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/hitl/interrupt.d.ts.map +1 -1
- package/dist/hitl/interrupt.js +7 -6
- package/dist/hitl/interrupt.js.map +1 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/models/google.d.ts.map +1 -1
- package/dist/models/google.js +7 -6
- package/dist/models/google.js.map +1 -1
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1 -0
- package/dist/models/index.js.map +1 -1
- package/dist/models/openai.js +6 -1
- package/dist/models/openai.js.map +1 -1
- package/dist/models/openrouter.d.ts +13 -0
- package/dist/models/openrouter.d.ts.map +1 -0
- package/dist/models/openrouter.js +322 -0
- package/dist/models/openrouter.js.map +1 -0
- package/dist/prebuilt/tool-node.d.ts.map +1 -1
- package/dist/prebuilt/tool-node.js +0 -1
- package/dist/prebuilt/tool-node.js.map +1 -1
- package/dist/pregel.d.ts +11 -1
- package/dist/pregel.d.ts.map +1 -1
- package/dist/pregel.js +88 -7
- package/dist/pregel.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +6 -1
- package/dist/retry.js.map +1 -1
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +7 -1
- package/dist/store/index.js.map +1 -1
- package/dist/stream-events.js +2 -2
- package/dist/stream-events.js.map +1 -1
- package/dist/streaming.d.ts +10 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +28 -0
- package/dist/streaming.js.map +1 -1
- package/dist/swarm/graph.d.ts.map +1 -1
- package/dist/swarm/graph.js +0 -4
- package/dist/swarm/graph.js.map +1 -1
- package/dist/swarm/supervisor.d.ts.map +1 -1
- package/dist/swarm/supervisor.js +0 -4
- package/dist/swarm/supervisor.js.map +1 -1
- package/dist/telemetry.d.ts +41 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +69 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/testing/index.d.ts +33 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +95 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- 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,
|
|
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,
|
|
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
|
-
|
|
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
|
}
|
package/dist/pregel.d.ts.map
CHANGED
|
@@ -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;
|
|
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;AAGpB,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAK5D,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;AACvD,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAiB,MAAM,gBAAgB,CAAC;AAS3E,qBAAa,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAe1D,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;IAGtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAvBtB,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,SAAS,CAAmE;IACpF,OAAO,CAAC,eAAe,CAAqC;IAC5D,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;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;gBAGR,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,EAC/B,QAAQ,CAAC,EAAQ;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,YAAA,EACzC,GAAG,GAAc,eAAe,GAAG,IAAW,EAC/D,MAAM,CAAC,EAA2B,UAAU,GAAG,IAAI;IAYrD,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;YA0BN,WAAW;IAsGzB,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;IAyX9B,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;IAMvC,OAAO,CAAC,iBAAiB;IAkBzB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;YAMhC,cAAc;IAiB5B,OAAO,CAAC,GAAG;CAMZ"}
|
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
|
-
|
|
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 (
|
|
135
|
-
result = await
|
|
136
|
-
|
|
137
|
-
|
|
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 };
|