@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/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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,sBAAsB,CAAA;AAGrE,OAAO,EAA6C,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAClG,OAAO,EAAyB,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EACL,WAAW,GAOZ,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,yBAAyB,EAGzB,wBAAwB,EAGxB,uBAAuB,GAGxB,MAAM,uBAAuB,CAAA;AA6G9B,MAAM,OAAO,qBAAqB;IACf,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAA;IAE3D,IAAI,CAAC,MAAc;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IACnD,CAAC;CACF;AAsFD,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAA;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAC;QACV,MAAM;QACN,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;KAC5B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,CAAA;AAEjC,SAAS,gBAAgB,CAAC,IAA4B;IACpD,MAAM,KAAK,GAAG,IAAI,EAAE,EAAE,CAAA;IACtB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAIxB,UAAsD,EACtD,KAAqB,EACrB,KAAqB,EACrB,KAAiB;IAEjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAA;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAwB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,SAAS,GAAyB,EAAE,CAAA;IAC1C,MAAM,GAAG,GAAG,KAAK,EACf,IAA+B,EAC/B,OAAqC,EACrC,SAAqE,EAAE,EAC3C,EAAE;QAC9B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAA;QAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;YAChC,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAA;QAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QAClF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,MAAM,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAoB,EAAiB,EAAE;QACzD,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC,CAAA;IACD,MAAM,SAAS,GAAG,KAAK,EACrB,IAAoB,EACpB,OAAiC,EACjC,MAAqD,EACgC,EAAE;QACvF,MAAM,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7E,MAAM,KAAK,GAAG,WAAW,CAAC;YACxB,GAAG,IAAI;YACP,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC7D,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;YACD,QAAQ;SACT,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,KAAK;YACZ,OAAO;YACP,MAAM;YACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;gBACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB;SACF,CAAA;IACH,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACzE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5F,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,OAAO,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACxF,CAAC;IACD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAA;IAElG,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,UAAU,CACf,UAAU,EACV,KAAK,EACL,KAAK,EACL,KAAK,CAAC,MAAM,EACZ,QAAQ,EACR,SAAS,EACT,GAAG,EACH,IAAI,EACJ,SAAS,CACV,CAAA;QACH,CAAC;QACD,sFAAsF;QACtF,8FAA8F;QAC9F,kGAAkG;QAClG,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS;YAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;;YAE9D,OAAO,SAAS,CACd,KAAK,EACL;gBACE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW;gBACxC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1E,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE;aAC7C,EACD,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CACnC,CAAA;IACL,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IACtD,IACE,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC,EAC7D,CAAC;QACD,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;QAC5D,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC1E,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9E,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;QAC1D,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC1E,CAAC;IACD,MAAM,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAC7B,IAAI,QAAwC,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC7C,KAAK,EAAE,UAAU,CAAC,IAAI;YACtB,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,KAAK;YACL,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3D,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YAC3E,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;YACvF,MAAM;YACN,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAC9B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;SACjE,CAAC,CAAA;QACF,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAA;QACrF,OAAO,SAAS,CACd,KAAK,EACL,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EACnE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CACvC,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,uBAAuB,CAAC,EAAE,CAAC;QAC5F,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;QAC5D,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC1E,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAA;QAChE,OAAO,qBAAqB,CAC1B,KAAK,EACL,QAAQ,EACR,SAAS,EACT,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAC3F,IAAI,CACL,CAAA;IACH,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC9E,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAA;YACxD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC5F,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;YACjB,OAAO,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;QAC1F,CAAC;QACD,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5F,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,YAAY,CAAC,KAAK;YAC1B,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;gBACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB;SACF,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;QAC1E,OAAO,qBAAqB,CAC1B,KAAK,EACL,QAAQ,EACR,SAAS,EACT,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EACvF,IAAI,CACL,CAAA;IACH,CAAC;IACD,OAAO,eAAe,CACpB,KAAK,EACL,IAAI,EACJ,QAAQ,CAAC,KAAK,EACd,KAAK,EACL,QAAQ,EACR,SAAS,EACT,GAAG,EACH,IAAI,EACJ,SAAS,CACV,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAI5B,UAAsD,EACtD,KAAqB,EACrB,KAAiB,EACjB,OAAwB;IAExB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAA;IACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iDAAiD,CAAC,CAAA;IACzE,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IACzB,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,IAAI,IAA4F,CAAA;IAChG,MAAM,iBAAiB,GAAyB,EAAE,CAAA;IAClD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;QACtD,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACpD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,OAAO,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;YAChD,CAAC;YACD,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC9B,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;YAC/D,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;QAC/E,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QAClB,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAA;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAA;IACrB,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC1E,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5F,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;YAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC;YAChD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B;KACF,CAAA;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,WAAW,CAI/B,UAAsD,EACtD,MAAc,EACd,KAAqB,EACrB,KAAiB,EACjB,UAA0C,EAAE;IAE5C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACtF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC5C,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAC1E,OAAO,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAI/B,UAAsD,EACtD,KAAqB,EACrB,KAAgC,EAChC,UAA2B,EAC3B,OAAwB;IAExB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,KAAK,GAAmB;QAC5B,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAA;YAC9C,IAAI,QAAQ,KAAK,SAAS;gBACxB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;YAC7E,OAAO,QAAQ,CAAA;QACjB,CAAC;KACF,CAAA;IACD,OAAO,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;AAChF,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAqB,EACrB,IAAuB,EACvB,KAAc,EACd,KAAiB,EACjB,QAA6B,EAC7B,SAA+B,EAC/B,GAI+B,EAC/B,IAA8C,EAC9C,SAIwF,EACxF,gBAAyB;IAEzB,MAAM,QAAQ,GAAG,gBAAgB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAA;IACvF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1C,IACE,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAC5D,CAAC;QACD,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAA;QACF,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAA;IACzF,CAAC;IACD,IAAI,QAAkC,CAAA;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAC9B,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAA;QAC7F,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM;YACpD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAC9B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,uBAAuB,CAAC;iBACjE,CAAC;SACP,CAAC,CAAA;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAC7B,OAAO,SAAS,CACd,KAAK,EACL,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EACvE,UAAU,CACX,CAAA;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAC5B,QAAQ,GAAG;gBACT,OAAO,EAAE,KAAK;gBACd,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;aAClE,CAAA;;YACE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,MAAM,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;YACxE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC,CAAA;IACJ,CAAC;IACD,IACE,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAC5D,CAAC;QACD,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAA;QACF,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;QAC5C,QAAQ;QACR,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1F,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS;YAC9B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;KAC7D,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAClD,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;QACpD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ;QACR,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KAC7F,CAAC,CAAA;IACF,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC1D,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;QACrF,OAAO,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAA;IACzF,CAAC;IACD,OAAO,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;AAC5E,CAAC;AAED,KAAK,UAAU,UAAU,CAIvB,UAAsD,EACtD,KAAqB,EACrB,KAAiB,EACjB,MAA6C,EAC7C,QAA6B,EAC7B,SAA+B,EAC/B,GAI+B,EAC/B,IAA8C,EAC9C,SAIwF;IAExF,MAAM,IAAI,GACR,MAAM,CAAC,YAAY,CAAC,IAAI,KAAK,SAAS;QACpC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IACvF,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;QACpE,OAAO,qBAAqB,CAC1B,KAAK,EACL,QAAQ,EACR,SAAS,EACT;YACE,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI,SAAS;YAC3C,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE;SACpD,EACD,IAAI,CACL,CAAA;IACH,MAAM,aAAa,GACjB,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC;YACE,GAAG,KAAK;YACR,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAS,EAAE,CAAC,EAAE;SAClF,CAAA;IACP,OAAO,eAAe,CACpB,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAC7B,IAAI,EACJ,MAAM,CAAC,YAAY,CAAC,KAAK,EACzB,aAAa,EACb,QAAQ,EACR,SAAS,EACT,GAAG,EACH,IAAI,EACJ,SAAS,EACT,MAAM,CAAC,YAAY,CAAC,QAAQ,CAC7B,CAAA;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAAqB,EACrB,QAAsC,EACtC,SAAwC,EACxC,UAA2B,EAC3B,IAA8C;IAE9C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAA;IACtD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;IAChG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,IAAI;QACX,UAAU;QACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB;KACF,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAA+B;IACjE,OAAO,MAAM,CAAC,EAAE;QACd,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QACvF,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;AAC9C,CAAC;AAED,SAAS,cAAc,CACrB,KAAqB,EACrB,SAAwC,EACxC,QAAsC,EACtC,IAAwC,EACxC,MAAgC;IAMhC,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACvB,KAAK;QACL,QAAQ;QACR,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YACxC,QAAQ;SACT;KACF,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACzF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAChG,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,KAAqB;IACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAA;IACtD,OAAO,WAAW,CAAC,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,cAAc,CACrB,MAA+B,EAC/B,SAAwC;IAExC,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;YAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B;KACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAqB;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,KAAK;QACR,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;KACzF,CAAC,CAAA;AACJ,CAAC"}
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
+ }