@nifrajs/agent 2.12.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/README.md +26 -0
- package/dist/events.d.ts +23 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +61 -0
- package/dist/events.js.map +1 -0
- package/dist/execution-policy.d.ts +43 -0
- package/dist/execution-policy.d.ts.map +1 -0
- package/dist/execution-policy.js +185 -0
- package/dist/execution-policy.js.map +1 -0
- package/dist/index.d.ts +199 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +409 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/src/events.ts +85 -0
- package/src/execution-policy.ts +241 -0
- package/src/index.ts +803 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral agent turns.
|
|
3
|
+
*
|
|
4
|
+
* One turn makes one model decision and may execute one {@link ToolContract}. The multi-turn runner
|
|
5
|
+
* is intentionally bounded. The state adapter stores token-only evidence and cursor metadata; model
|
|
6
|
+
* input, tool input, and tool output remain transient caller data.
|
|
7
|
+
*/
|
|
8
|
+
import { canAttempt } from "@nifrajs/core/budget";
|
|
9
|
+
import { validateStandard } from "@nifrajs/core/schema";
|
|
10
|
+
import { toCatalogEntry } from "@nifrajs/core/tool-catalog";
|
|
11
|
+
import { executeTool, } from "@nifrajs/core/tool-contract";
|
|
12
|
+
export { createLocalProcessAdapter, LOCAL_PROCESS_LIMITATION, LocalProcessPolicyError, } from "./execution-policy.js";
|
|
13
|
+
export class MemoryAgentStateStore {
|
|
14
|
+
states = new Map();
|
|
15
|
+
load(turnId) {
|
|
16
|
+
return this.states.get(turnId);
|
|
17
|
+
}
|
|
18
|
+
save(state) {
|
|
19
|
+
this.states.set(state.turnId, freezeState(state));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function createAgentState(turnId) {
|
|
23
|
+
if (!/^[a-zA-Z0-9._:-]{1,128}$/.test(turnId))
|
|
24
|
+
throw new TypeError("agent: turnId must be a bounded token");
|
|
25
|
+
return Object.freeze({
|
|
26
|
+
version: 1,
|
|
27
|
+
turnId,
|
|
28
|
+
step: 0,
|
|
29
|
+
status: "ready",
|
|
30
|
+
evidence: Object.freeze([]),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const AGENT_SETTLE_RESERVE_MS = 5;
|
|
34
|
+
function costMilliseconds(cost) {
|
|
35
|
+
const value = cost?.ms;
|
|
36
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
37
|
+
}
|
|
38
|
+
export async function turn(definition, state, input, ports) {
|
|
39
|
+
const signal = ports.signal ?? new AbortController().signal;
|
|
40
|
+
const clock = ports.clock ?? (() => performance.now());
|
|
41
|
+
const newId = ports.idFactory ?? (() => crypto.randomUUID());
|
|
42
|
+
const evidence = [...state.evidence];
|
|
43
|
+
const responses = [];
|
|
44
|
+
const add = async (kind, outcome, fields = {}) => {
|
|
45
|
+
const at = clock();
|
|
46
|
+
if (!Number.isFinite(at) || at < 0)
|
|
47
|
+
throw new TypeError("agent: clock must return a finite non-negative number");
|
|
48
|
+
const item = Object.freeze({ seq: evidence.length, at, kind, outcome, ...fields });
|
|
49
|
+
evidence.push(item);
|
|
50
|
+
await ports.telemetry?.step(item);
|
|
51
|
+
return item;
|
|
52
|
+
};
|
|
53
|
+
const save = async (next) => {
|
|
54
|
+
await ports.state?.save(next);
|
|
55
|
+
};
|
|
56
|
+
const suspended = async (next, pending, reason) => {
|
|
57
|
+
await add("state", "suspended", { effectId: pending.effectId, code: reason });
|
|
58
|
+
const saved = freezeState({
|
|
59
|
+
...next,
|
|
60
|
+
status: "suspended",
|
|
61
|
+
pending: {
|
|
62
|
+
kind: pending.kind,
|
|
63
|
+
...(pending.tool === undefined ? {} : { tool: pending.tool }),
|
|
64
|
+
effectId: pending.effectId,
|
|
65
|
+
},
|
|
66
|
+
evidence,
|
|
67
|
+
});
|
|
68
|
+
await save(saved);
|
|
69
|
+
return {
|
|
70
|
+
status: "suspended",
|
|
71
|
+
state: saved,
|
|
72
|
+
pending,
|
|
73
|
+
reason,
|
|
74
|
+
evidence: saved.evidence,
|
|
75
|
+
transcript: {
|
|
76
|
+
version: 1,
|
|
77
|
+
turnId: state.turnId,
|
|
78
|
+
responses: Object.freeze([...responses]),
|
|
79
|
+
evidence: saved.evidence,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const inputResult = await validateStandard(definition.input, input.value);
|
|
84
|
+
if (!inputResult.ok) {
|
|
85
|
+
await add("model", "failed", { code: "input_invalid" });
|
|
86
|
+
const saved = freezeState({ ...state, status: "completed", step: state.step + 1, evidence });
|
|
87
|
+
await save(saved);
|
|
88
|
+
return completedError(saved, responses, evidence, "input_invalid", inputResult.issues);
|
|
89
|
+
}
|
|
90
|
+
if (signal.aborted)
|
|
91
|
+
return suspended(state, { kind: "cancelled", effectId: newId() }, "cancelled");
|
|
92
|
+
if (state.status === "suspended") {
|
|
93
|
+
if (input.resume !== undefined) {
|
|
94
|
+
return resumeTool(definition, state, ports, input.resume, evidence, responses, add, save, suspended);
|
|
95
|
+
}
|
|
96
|
+
// Model failures and budget suspensions have no persisted payload to replay. Once the
|
|
97
|
+
// caller supplies a live signal/budget again, retry the model step from the token-only state.
|
|
98
|
+
// Tool suspensions retain no tool input in state, so they still require an explicit continuation.
|
|
99
|
+
if (state.pending?.tool === undefined)
|
|
100
|
+
state = readyState(state);
|
|
101
|
+
else
|
|
102
|
+
return suspended(state, {
|
|
103
|
+
kind: state.pending?.kind ?? "cancelled",
|
|
104
|
+
...(state.pending?.tool === undefined ? {} : { tool: state.pending.tool }),
|
|
105
|
+
effectId: state.pending?.effectId ?? newId(),
|
|
106
|
+
}, state.pending?.kind ?? "cancelled");
|
|
107
|
+
}
|
|
108
|
+
const modelMs = costMilliseconds(definition.modelCost);
|
|
109
|
+
if (ports.deadline !== undefined &&
|
|
110
|
+
!canAttempt(ports.deadline, modelMs, AGENT_SETTLE_RESERVE_MS)) {
|
|
111
|
+
await add("budget", "denied", { code: "deadline_exceeded" });
|
|
112
|
+
return suspended(state, { kind: "budget", effectId: newId() }, "budget");
|
|
113
|
+
}
|
|
114
|
+
if (ports.budget !== undefined && !ports.budget.consume(definition.modelCost)) {
|
|
115
|
+
await add("budget", "denied", { code: "budget_exceeded" });
|
|
116
|
+
return suspended(state, { kind: "budget", effectId: newId() }, "budget");
|
|
117
|
+
}
|
|
118
|
+
await add("model", "started");
|
|
119
|
+
let response;
|
|
120
|
+
try {
|
|
121
|
+
const rawResponse = await ports.model.complete({
|
|
122
|
+
agent: definition.name,
|
|
123
|
+
instruction: definition.instruction,
|
|
124
|
+
input: inputResult.value,
|
|
125
|
+
state,
|
|
126
|
+
tools: definition.tools.map((tool) => toCatalogEntry(tool)),
|
|
127
|
+
...(input.toolResult === undefined ? {} : { toolResult: input.toolResult }),
|
|
128
|
+
...(input.previousOutput === undefined ? {} : { previousOutput: input.previousOutput }),
|
|
129
|
+
signal,
|
|
130
|
+
...(ports.deadline === undefined
|
|
131
|
+
? {}
|
|
132
|
+
: { deadline: ports.deadline.child(AGENT_SETTLE_RESERVE_MS) }),
|
|
133
|
+
});
|
|
134
|
+
response = parseModelResponse(rawResponse);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
await add("model", "failed", { code: signal.aborted ? "cancelled" : "model_failed" });
|
|
138
|
+
return suspended(state, { kind: signal.aborted ? "cancelled" : "model", effectId: newId() }, signal.aborted ? "cancelled" : "model");
|
|
139
|
+
}
|
|
140
|
+
if (ports.deadline !== undefined && !canAttempt(ports.deadline, 0, AGENT_SETTLE_RESERVE_MS)) {
|
|
141
|
+
await add("budget", "denied", { code: "deadline_exceeded" });
|
|
142
|
+
return suspended(state, { kind: "budget", effectId: newId() }, "budget");
|
|
143
|
+
}
|
|
144
|
+
if (response === undefined) {
|
|
145
|
+
await add("model", "failed", { code: "invalid_model_response" });
|
|
146
|
+
return continueWithToolError(state, evidence, responses, { name: "model", ok: false, error: { code: "invalid_model_response", stage: "execution" } }, save);
|
|
147
|
+
}
|
|
148
|
+
responses.push(response);
|
|
149
|
+
if (response.kind === "output") {
|
|
150
|
+
const outputResult = await validateStandard(definition.output, response.value);
|
|
151
|
+
if (!outputResult.ok) {
|
|
152
|
+
await add("model", "failed", { code: "output_invalid" });
|
|
153
|
+
const saved = freezeState({ ...state, status: "completed", step: state.step + 1, evidence });
|
|
154
|
+
await save(saved);
|
|
155
|
+
return completedError(saved, responses, evidence, "output_invalid", outputResult.issues);
|
|
156
|
+
}
|
|
157
|
+
await add("model", "passed");
|
|
158
|
+
const saved = freezeState({ ...state, status: "completed", step: state.step + 1, evidence });
|
|
159
|
+
await save(saved);
|
|
160
|
+
return {
|
|
161
|
+
status: "completed",
|
|
162
|
+
output: outputResult.value,
|
|
163
|
+
state: saved,
|
|
164
|
+
evidence: saved.evidence,
|
|
165
|
+
transcript: {
|
|
166
|
+
version: 1,
|
|
167
|
+
turnId: state.turnId,
|
|
168
|
+
responses: Object.freeze([...responses]),
|
|
169
|
+
evidence: saved.evidence,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const tool = definition.tools.find((candidate) => candidate.name === response.name);
|
|
174
|
+
if (tool === undefined) {
|
|
175
|
+
await add("tool", "denied", { name: response.name, code: "unknown_tool" });
|
|
176
|
+
return continueWithToolError(state, evidence, responses, { name: response.name, ok: false, error: { code: "unknown_tool", stage: "execution" } }, save);
|
|
177
|
+
}
|
|
178
|
+
return executeToolStep(state, tool, response.input, ports, evidence, responses, add, save, suspended);
|
|
179
|
+
}
|
|
180
|
+
export async function runAgent(definition, input, ports, options) {
|
|
181
|
+
const maxTurns = options.maxTurns ?? 8;
|
|
182
|
+
if (!Number.isSafeInteger(maxTurns) || maxTurns < 1)
|
|
183
|
+
throw new RangeError("agent: maxTurns must be a positive safe integer");
|
|
184
|
+
let state = options.state;
|
|
185
|
+
let nextInput = input;
|
|
186
|
+
let last;
|
|
187
|
+
const recordedResponses = [];
|
|
188
|
+
for (let count = 0; count < maxTurns; count++) {
|
|
189
|
+
last = await turn(definition, state, nextInput, ports);
|
|
190
|
+
recordedResponses.push(...last.transcript.responses);
|
|
191
|
+
if (last.status === "completed") {
|
|
192
|
+
if (last.error !== undefined || options.goal === undefined || options.goal(last.output)) {
|
|
193
|
+
return withTranscript(last, recordedResponses);
|
|
194
|
+
}
|
|
195
|
+
state = readyState(last.state);
|
|
196
|
+
nextInput = { value: input.value, previousOutput: last.output };
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (last.status === "suspended")
|
|
200
|
+
return withTranscript(last, recordedResponses);
|
|
201
|
+
state = last.state;
|
|
202
|
+
nextInput = { value: input.value, toolResult: last.toolResult };
|
|
203
|
+
}
|
|
204
|
+
const fallback = last;
|
|
205
|
+
if (fallback === undefined)
|
|
206
|
+
throw new Error("agent: no turn was executed");
|
|
207
|
+
return {
|
|
208
|
+
status: "suspended",
|
|
209
|
+
reason: "max_turns",
|
|
210
|
+
pending: { kind: "cancelled", effectId: (ports.idFactory ?? (() => crypto.randomUUID()))() },
|
|
211
|
+
state: fallback.state,
|
|
212
|
+
evidence: fallback.evidence,
|
|
213
|
+
transcript: {
|
|
214
|
+
version: 1,
|
|
215
|
+
turnId: fallback.state.turnId,
|
|
216
|
+
responses: Object.freeze([...recordedResponses]),
|
|
217
|
+
evidence: fallback.evidence,
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Load a saved token-only state record and continue a bounded run. */
|
|
222
|
+
export async function resumeAgent(definition, turnId, input, ports, options = {}) {
|
|
223
|
+
if (ports.state === undefined)
|
|
224
|
+
throw new Error("agent: resume requires a state store");
|
|
225
|
+
const state = await ports.state.load(turnId);
|
|
226
|
+
if (state === undefined)
|
|
227
|
+
throw new Error("agent: no saved state for turn");
|
|
228
|
+
return runAgent(definition, input, ports, { ...options, state });
|
|
229
|
+
}
|
|
230
|
+
export async function replayAgent(definition, input, ports, transcript, options) {
|
|
231
|
+
let index = 0;
|
|
232
|
+
const model = {
|
|
233
|
+
complete: () => {
|
|
234
|
+
const response = transcript.responses[index++];
|
|
235
|
+
if (response === undefined)
|
|
236
|
+
throw new Error("agent replay: transcript ended before the model response");
|
|
237
|
+
return response;
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
return runAgent(definition, input, { ...ports, model, dryRun: true }, options);
|
|
241
|
+
}
|
|
242
|
+
async function executeToolStep(state, tool, input, ports, evidence, responses, add, save, suspended, effectIdOverride) {
|
|
243
|
+
const effectId = effectIdOverride ?? (ports.idFactory ?? (() => crypto.randomUUID()))();
|
|
244
|
+
const toolMs = costMilliseconds(tool.cost);
|
|
245
|
+
if (ports.deadline !== undefined &&
|
|
246
|
+
!canAttempt(ports.deadline, toolMs, AGENT_SETTLE_RESERVE_MS)) {
|
|
247
|
+
await add("budget", "denied", {
|
|
248
|
+
name: tool.name,
|
|
249
|
+
effectId,
|
|
250
|
+
code: "deadline_exceeded",
|
|
251
|
+
});
|
|
252
|
+
return suspended(state, { kind: "budget", tool: tool.name, input, effectId }, "budget");
|
|
253
|
+
}
|
|
254
|
+
let approval;
|
|
255
|
+
if (tool.approval.kind !== "none") {
|
|
256
|
+
if (ports.approval === undefined)
|
|
257
|
+
return suspended(state, { kind: "approval", tool: tool.name, input, effectId }, "approval");
|
|
258
|
+
const result = await ports.approval.request({
|
|
259
|
+
turnId: state.turnId,
|
|
260
|
+
effectId,
|
|
261
|
+
tool: tool.name,
|
|
262
|
+
capability: tool.capability,
|
|
263
|
+
signal: ports.signal ?? new AbortController().signal,
|
|
264
|
+
...(ports.deadline === undefined
|
|
265
|
+
? {}
|
|
266
|
+
: {
|
|
267
|
+
deadline: ports.deadline.child(toolMs + AGENT_SETTLE_RESERVE_MS),
|
|
268
|
+
}),
|
|
269
|
+
});
|
|
270
|
+
if (result.status === "pending")
|
|
271
|
+
return suspended(state, { kind: "approval", tool: tool.name, input, effectId: result.effectId }, "approval");
|
|
272
|
+
if (result.status === "denied")
|
|
273
|
+
approval = {
|
|
274
|
+
granted: false,
|
|
275
|
+
...(result.reason === undefined ? {} : { reason: result.reason }),
|
|
276
|
+
};
|
|
277
|
+
else
|
|
278
|
+
approval = result.approval;
|
|
279
|
+
await add("approval", result.status === "approved" ? "passed" : "denied", {
|
|
280
|
+
name: tool.name,
|
|
281
|
+
effectId,
|
|
282
|
+
...(result.status === "denied" ? { code: "approval_denied" } : {}),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (ports.deadline !== undefined &&
|
|
286
|
+
!canAttempt(ports.deadline, toolMs, AGENT_SETTLE_RESERVE_MS)) {
|
|
287
|
+
await add("budget", "denied", {
|
|
288
|
+
name: tool.name,
|
|
289
|
+
effectId,
|
|
290
|
+
code: "deadline_exceeded",
|
|
291
|
+
});
|
|
292
|
+
return suspended(state, { kind: "budget", tool: tool.name, input, effectId }, "budget");
|
|
293
|
+
}
|
|
294
|
+
const result = await executeTool(tool, input, {
|
|
295
|
+
effectId,
|
|
296
|
+
capabilities: ports.capabilities,
|
|
297
|
+
...(approval === undefined ? {} : { approval }),
|
|
298
|
+
...(ports.budget === undefined ? {} : { budget: ports.budget }),
|
|
299
|
+
...(ports.idempotency === undefined ? {} : { idempotency: ports.idempotency }),
|
|
300
|
+
...(ports.executionPolicy === undefined ? {} : { executionPolicy: ports.executionPolicy }),
|
|
301
|
+
...(ports.signal === undefined ? {} : { signal: ports.signal }),
|
|
302
|
+
...(ports.deadline === undefined
|
|
303
|
+
? {}
|
|
304
|
+
: { deadline: ports.deadline.child(AGENT_SETTLE_RESERVE_MS) }),
|
|
305
|
+
...(ports.dryRun === undefined ? {} : { dryRun: ports.dryRun }),
|
|
306
|
+
...(ports.clock === undefined ? {} : { clock: ports.clock }),
|
|
307
|
+
});
|
|
308
|
+
const toolResult = toolResultOf(tool.name, result);
|
|
309
|
+
await add("tool", result.ok ? "committed" : "failed", {
|
|
310
|
+
name: tool.name,
|
|
311
|
+
effectId,
|
|
312
|
+
...(result.ok ? {} : { code: result.error.code }),
|
|
313
|
+
...(result.ledger.chain?.head === undefined ? {} : { ledgerHead: result.ledger.chain.head }),
|
|
314
|
+
});
|
|
315
|
+
if (!result.ok && result.error.code === "budget_exceeded") {
|
|
316
|
+
await add("budget", "denied", { name: tool.name, effectId, code: "budget_exceeded" });
|
|
317
|
+
return suspended(state, { kind: "budget", tool: tool.name, input, effectId }, "budget");
|
|
318
|
+
}
|
|
319
|
+
return continueWithToolError(state, evidence, responses, toolResult, save);
|
|
320
|
+
}
|
|
321
|
+
async function resumeTool(definition, state, ports, resume, evidence, responses, add, save, suspended) {
|
|
322
|
+
const tool = resume.continuation.tool === undefined
|
|
323
|
+
? undefined
|
|
324
|
+
: definition.tools.find((candidate) => candidate.name === resume.continuation.tool);
|
|
325
|
+
if (tool === undefined || !Object.hasOwn(resume.continuation, "input"))
|
|
326
|
+
return continueWithToolError(state, evidence, responses, {
|
|
327
|
+
name: resume.continuation.tool ?? "unknown",
|
|
328
|
+
ok: false,
|
|
329
|
+
error: { code: "unknown_tool", stage: "execution" },
|
|
330
|
+
}, save);
|
|
331
|
+
const approvalPorts = resume.approval === undefined
|
|
332
|
+
? ports
|
|
333
|
+
: {
|
|
334
|
+
...ports,
|
|
335
|
+
approval: { request: () => ({ status: "approved", approval: resume.approval }) },
|
|
336
|
+
};
|
|
337
|
+
return executeToolStep({ ...state, status: "ready" }, tool, resume.continuation.input, approvalPorts, evidence, responses, add, save, suspended, resume.continuation.effectId);
|
|
338
|
+
}
|
|
339
|
+
async function continueWithToolError(state, evidence, responses, toolResult, save) {
|
|
340
|
+
const { pending: _pending, ...withoutPending } = state;
|
|
341
|
+
const next = freezeState({ ...withoutPending, status: "ready", step: state.step + 1, evidence });
|
|
342
|
+
await save(next);
|
|
343
|
+
return {
|
|
344
|
+
status: "continue",
|
|
345
|
+
state: next,
|
|
346
|
+
toolResult,
|
|
347
|
+
evidence: next.evidence,
|
|
348
|
+
transcript: {
|
|
349
|
+
version: 1,
|
|
350
|
+
turnId: state.turnId,
|
|
351
|
+
responses: Object.freeze([...responses]),
|
|
352
|
+
evidence: next.evidence,
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
function toolResultOf(name, result) {
|
|
357
|
+
return result.ok
|
|
358
|
+
? { name, ok: true, ...(result.output === undefined ? {} : { output: result.output }) }
|
|
359
|
+
: { name, ok: false, error: result.error };
|
|
360
|
+
}
|
|
361
|
+
function completedError(state, responses, evidence, code, issues) {
|
|
362
|
+
return {
|
|
363
|
+
status: "completed",
|
|
364
|
+
error: { code, issues },
|
|
365
|
+
state,
|
|
366
|
+
evidence,
|
|
367
|
+
transcript: {
|
|
368
|
+
version: 1,
|
|
369
|
+
turnId: state.turnId,
|
|
370
|
+
responses: Object.freeze([...responses]),
|
|
371
|
+
evidence,
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
function parseModelResponse(value) {
|
|
376
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
377
|
+
return undefined;
|
|
378
|
+
const record = Object.fromEntries(Object.entries(value));
|
|
379
|
+
if (record.kind === "output" && Object.hasOwn(record, "value")) {
|
|
380
|
+
return Object.freeze({ kind: "output", value: record.value });
|
|
381
|
+
}
|
|
382
|
+
if (record.kind === "tool" && typeof record.name === "string" && Object.hasOwn(record, "input")) {
|
|
383
|
+
return Object.freeze({ kind: "tool", name: record.name, input: record.input });
|
|
384
|
+
}
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
387
|
+
function readyState(state) {
|
|
388
|
+
const { pending: _pending, ...withoutPending } = state;
|
|
389
|
+
return freezeState({ ...withoutPending, status: "ready" });
|
|
390
|
+
}
|
|
391
|
+
function withTranscript(result, responses) {
|
|
392
|
+
return {
|
|
393
|
+
...result,
|
|
394
|
+
transcript: {
|
|
395
|
+
version: 1,
|
|
396
|
+
turnId: result.state.turnId,
|
|
397
|
+
responses: Object.freeze([...responses]),
|
|
398
|
+
evidence: result.evidence,
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
function freezeState(state) {
|
|
403
|
+
return Object.freeze({
|
|
404
|
+
...state,
|
|
405
|
+
evidence: Object.freeze([...state.evidence]),
|
|
406
|
+
...(state.pending === undefined ? {} : { pending: Object.freeze({ ...state.pending }) }),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nifrajs/agent",
|
|
3
|
+
"version": "2.12.0",
|
|
4
|
+
"description": "Provider-neutral, typed, resumable agent turns built on Nifra tool contracts.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"bun",
|
|
7
|
+
"typescript",
|
|
8
|
+
"nifra",
|
|
9
|
+
"ai-agent",
|
|
10
|
+
"agents",
|
|
11
|
+
"tools",
|
|
12
|
+
"replay"
|
|
13
|
+
],
|
|
14
|
+
"type": "module",
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"module": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"bun": "./src/index.ts",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./events": {
|
|
25
|
+
"bun": "./src/events.ts",
|
|
26
|
+
"types": "./dist/events.d.ts",
|
|
27
|
+
"default": "./dist/events.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"src"
|
|
33
|
+
],
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -p tsconfig.build.json && bun run ../../scripts/fix-dts.ts dist"
|
|
37
|
+
},
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@nifrajs/core": "2.12.0"
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/nifrajs/nifra.git",
|
|
48
|
+
"directory": "packages/agent"
|
|
49
|
+
},
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/nifrajs/nifra/issues"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://github.com/nifrajs/nifra#readme"
|
|
54
|
+
}
|
package/src/events.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { AgentStepEvidence, AgentTelemetryPort } from "./index.ts"
|
|
2
|
+
|
|
3
|
+
/** Options for the lifecycle evidence stream. */
|
|
4
|
+
export interface AgentEvidenceStreamOptions {
|
|
5
|
+
/** Maximum number of produced evidence items waiting for a consumer. Default 1024. */
|
|
6
|
+
readonly maxQueueSize?: number
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The existing step evidence as an async iterable. No second event vocabulary is introduced.
|
|
11
|
+
*
|
|
12
|
+
* Pass the stream as `ports.telemetry`, consume it with `for await`, and call `complete()` when the
|
|
13
|
+
* runner finishes. The stream keeps queued evidence until it has been consumed, then terminates.
|
|
14
|
+
*/
|
|
15
|
+
export interface AgentEvidenceStream
|
|
16
|
+
extends AgentTelemetryPort,
|
|
17
|
+
AsyncIterableIterator<AgentStepEvidence> {
|
|
18
|
+
complete(): void
|
|
19
|
+
/**
|
|
20
|
+
* How many evidence items the queue discarded because the consumer fell behind. Non-zero means the
|
|
21
|
+
* `seq` sequence has gaps; the turn result still carries the complete, authoritative evidence array.
|
|
22
|
+
*/
|
|
23
|
+
readonly dropped: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Create an async iterable that yields the exact evidence values received by `step`. */
|
|
27
|
+
export function createAgentEvidenceStream(
|
|
28
|
+
options: AgentEvidenceStreamOptions = {},
|
|
29
|
+
): AgentEvidenceStream {
|
|
30
|
+
const maxQueueSize = options.maxQueueSize ?? 1024
|
|
31
|
+
if (!Number.isSafeInteger(maxQueueSize) || maxQueueSize < 1)
|
|
32
|
+
throw new RangeError("agent evidence stream: maxQueueSize must be a positive safe integer")
|
|
33
|
+
|
|
34
|
+
const queue: AgentStepEvidence[] = []
|
|
35
|
+
const waiters: Array<(result: IteratorResult<AgentStepEvidence>) => void> = []
|
|
36
|
+
let completed = false
|
|
37
|
+
let dropped = 0
|
|
38
|
+
|
|
39
|
+
const finishWaiters = (): void => {
|
|
40
|
+
if (!completed || queue.length > 0) return
|
|
41
|
+
while (waiters.length > 0) waiters.shift()?.({ done: true, value: undefined })
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const stream: AgentEvidenceStream = {
|
|
45
|
+
get dropped() {
|
|
46
|
+
return dropped
|
|
47
|
+
},
|
|
48
|
+
step(evidence) {
|
|
49
|
+
if (completed) return
|
|
50
|
+
const waiter = waiters.shift()
|
|
51
|
+
if (waiter !== undefined) {
|
|
52
|
+
waiter({ done: false, value: evidence })
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
// A consumer that stopped reading (a closed SSE connection is the common one) must never fail
|
|
56
|
+
// the turn it is observing. The queue is a live view; the authoritative evidence is returned by
|
|
57
|
+
// the runner either way, so the oldest item is discarded and counted instead of thrown.
|
|
58
|
+
if (queue.length >= maxQueueSize) {
|
|
59
|
+
queue.shift()
|
|
60
|
+
dropped += 1
|
|
61
|
+
}
|
|
62
|
+
queue.push(evidence)
|
|
63
|
+
},
|
|
64
|
+
complete() {
|
|
65
|
+
completed = true
|
|
66
|
+
finishWaiters()
|
|
67
|
+
},
|
|
68
|
+
next() {
|
|
69
|
+
const evidence = queue.shift()
|
|
70
|
+
if (evidence !== undefined) return Promise.resolve({ done: false, value: evidence })
|
|
71
|
+
if (completed) return Promise.resolve({ done: true, value: undefined })
|
|
72
|
+
return new Promise<IteratorResult<AgentStepEvidence>>((resolve) => waiters.push(resolve))
|
|
73
|
+
},
|
|
74
|
+
return() {
|
|
75
|
+
queue.length = 0
|
|
76
|
+
completed = true
|
|
77
|
+
finishWaiters()
|
|
78
|
+
return Promise.resolve({ done: true, value: undefined })
|
|
79
|
+
},
|
|
80
|
+
[Symbol.asyncIterator]() {
|
|
81
|
+
return this
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
return stream
|
|
85
|
+
}
|