@tessar/core 0.1.0-alpha.0 → 0.1.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 +168 -31
- package/dist/agent.d.ts +37 -87
- package/dist/agent.js +101 -1116
- package/dist/agent.js.map +1 -1
- package/dist/controller.d.ts +13 -4
- package/dist/controller.js +184 -19
- package/dist/controller.js.map +1 -1
- package/dist/engine/call.d.ts +8 -0
- package/dist/engine/call.js +136 -0
- package/dist/engine/call.js.map +1 -0
- package/dist/engine/checkpoint.d.ts +11 -0
- package/dist/engine/checkpoint.js +187 -0
- package/dist/engine/checkpoint.js.map +1 -0
- package/dist/engine/delivery.js +6 -13
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/execution.d.ts +5 -0
- package/dist/engine/execution.js +292 -0
- package/dist/engine/execution.js.map +1 -0
- package/dist/engine/frame.d.ts +77 -0
- package/dist/engine/frame.js +83 -0
- package/dist/engine/frame.js.map +1 -0
- package/dist/engine/hooks.d.ts +4 -0
- package/dist/engine/hooks.js +138 -0
- package/dist/engine/hooks.js.map +1 -0
- package/dist/engine/interrupt.d.ts +1 -1
- package/dist/engine/lineage.d.ts +1 -1
- package/dist/engine/recovery.d.ts +1 -2
- package/dist/engine/recovery.js +4 -2
- package/dist/engine/recovery.js.map +1 -1
- package/dist/engine/resume.d.ts +12 -1
- package/dist/engine/resume.js +189 -0
- package/dist/engine/resume.js.map +1 -1
- package/dist/engine/runtime.d.ts +16 -0
- package/dist/engine/runtime.js +29 -0
- package/dist/engine/runtime.js.map +1 -0
- package/dist/engine/services.d.ts +3 -0
- package/dist/engine/services.js +125 -0
- package/dist/engine/services.js.map +1 -0
- package/dist/engine/tool-executor.d.ts +8 -2
- package/dist/engine/tool-executor.js +266 -3
- package/dist/engine/tool-executor.js.map +1 -1
- package/dist/engine/tracked-effects.js +5 -6
- package/dist/engine/tracked-effects.js.map +1 -1
- package/dist/errors.js +24 -9
- package/dist/errors.js.map +1 -1
- package/dist/events/definition.d.ts +2 -0
- package/dist/events/definition.js +2 -0
- package/dist/events/definition.js.map +1 -1
- package/dist/events/dispatcher.d.ts +1 -1
- package/dist/events/dispatcher.js +35 -4
- package/dist/events/dispatcher.js.map +1 -1
- package/dist/events/observer.d.ts +3 -0
- package/dist/events/observer.js +13 -0
- package/dist/events/observer.js.map +1 -0
- package/dist/events/{catalog.d.ts → type.d.ts} +170 -47
- package/dist/events/type.js +175 -0
- package/dist/events/type.js.map +1 -0
- package/dist/identity.d.ts +1 -0
- package/dist/identity.js +23 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/instructions/instruction.d.ts +2 -0
- package/dist/instructions/instruction.js +10 -3
- package/dist/instructions/instruction.js.map +1 -1
- package/dist/loop.d.ts +5 -5
- package/dist/loop.js +44 -204
- package/dist/loop.js.map +1 -1
- package/dist/messages/codec.js +4 -2
- package/dist/messages/codec.js.map +1 -1
- package/dist/messages/message.d.ts +2 -3
- package/dist/messages/message.js +3 -3
- package/dist/messages/message.js.map +1 -1
- package/dist/models/contract.d.ts +15 -0
- package/dist/models/options.d.ts +3 -0
- package/dist/models/options.js +13 -0
- package/dist/models/options.js.map +1 -0
- package/dist/models/registry.d.ts +2 -0
- package/dist/models/registry.js +18 -1
- package/dist/models/registry.js.map +1 -1
- package/dist/models/resolver.d.ts +4 -2
- package/dist/models/resolver.js +9 -4
- package/dist/models/resolver.js.map +1 -1
- package/dist/models/stream.d.ts +6 -0
- package/dist/models/stream.js +61 -2
- package/dist/models/stream.js.map +1 -1
- package/dist/plugins/context.d.ts +27 -2
- package/dist/plugins/host.d.ts +5 -1
- package/dist/plugins/host.js +33 -11
- package/dist/plugins/host.js.map +1 -1
- package/dist/plugins/registry.d.ts +1 -1
- package/dist/plugins/registry.js +18 -10
- package/dist/plugins/registry.js.map +1 -1
- package/dist/session.d.ts +16 -6
- package/dist/session.js +126 -55
- package/dist/session.js.map +1 -1
- package/dist/state/commit.d.ts +5 -0
- package/dist/state/commit.js +50 -5
- package/dist/state/commit.js.map +1 -1
- package/dist/state/fork.js +27 -6
- package/dist/state/fork.js.map +1 -1
- package/dist/state/memory-backend.js +307 -38
- package/dist/state/memory-backend.js.map +1 -1
- package/dist/state/plugin-state.js +73 -18
- package/dist/state/plugin-state.js.map +1 -1
- package/dist/state/queries.d.ts +14 -14
- package/dist/state/queries.js +150 -48
- package/dist/state/queries.js.map +1 -1
- package/dist/state/schema.d.ts +47 -6
- package/dist/state/schema.js +9 -1
- package/dist/state/schema.js.map +1 -1
- package/dist/state/scope.js +3 -2
- package/dist/state/scope.js.map +1 -1
- package/dist/state/sessions.d.ts +2 -0
- package/dist/state/sessions.js +21 -0
- package/dist/state/sessions.js.map +1 -0
- package/dist/state/storage-ports.d.ts +16 -2
- package/dist/state/threads.d.ts +1 -0
- package/dist/state/threads.js +77 -12
- package/dist/state/threads.js.map +1 -1
- package/dist/testing/harness.d.ts +2 -1
- package/dist/testing/harness.js +6 -4
- package/dist/testing/harness.js.map +1 -1
- package/dist/testing/scripted-provider.d.ts +1 -0
- package/dist/testing/scripted-provider.js +7 -0
- package/dist/testing/scripted-provider.js.map +1 -1
- package/dist/testing/storage-conformance.js +111 -0
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/thread.d.ts +4 -2
- package/dist/thread.js +14 -6
- package/dist/thread.js.map +1 -1
- package/dist/tools/tool.d.ts +11 -12
- package/dist/tools/tool.js +27 -10
- package/dist/tools/tool.js.map +1 -1
- package/dist/trace/records.d.ts +11 -6
- package/dist/trace/records.js +28 -1
- package/dist/trace/records.js.map +1 -1
- package/package.json +7 -1
- package/dist/events/catalog.js +0 -89
- package/dist/events/catalog.js.map +0 -1
- package/dist/models/cache.d.ts +0 -12
- package/dist/models/cache.js +0 -17
- package/dist/models/cache.js.map +0 -1
- package/dist/session-events.d.ts +0 -60
- package/dist/session-events.js +0 -14
- package/dist/session-events.js.map +0 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { stream as streamHooks, model as modelHooks, input as inputHooks, } from "../events/type.js";
|
|
2
|
+
import { TessarError, errorInfo, errorFromInfo, fail } from "../errors.js";
|
|
3
|
+
import { aggregateUsage } from "../trace/usage.js";
|
|
4
|
+
import { bindExecutionModel } from "../models/stream.js";
|
|
5
|
+
import { loop } from "../loop.js";
|
|
6
|
+
import { createDelivery, } from "./delivery.js";
|
|
7
|
+
import { createFrame, loadRecords, watchLease, } from "./frame.js";
|
|
8
|
+
import { eventContext } from "./hooks.js";
|
|
9
|
+
import { Suspension } from "./interrupt.js";
|
|
10
|
+
import { resolveChildAdmission } from "./lineage.js";
|
|
11
|
+
import { prepareResume, prepareRecovery, restoreFrame } from "./resume.js";
|
|
12
|
+
import { recoverTools } from "./tool-executor.js";
|
|
13
|
+
export async function execute(execution, request, sink, registry) {
|
|
14
|
+
let frame;
|
|
15
|
+
let pendingLease;
|
|
16
|
+
try {
|
|
17
|
+
if (sink.controller.signal.aborted)
|
|
18
|
+
fail("Cancelled", "Execution cancelled before admission");
|
|
19
|
+
if (request.kind === "resume") {
|
|
20
|
+
frame = await prepareResume(execution, request, sink, registry);
|
|
21
|
+
execution.active.set(frame.stream.id, frame);
|
|
22
|
+
watchLease(execution, frame);
|
|
23
|
+
sink.admitted();
|
|
24
|
+
await execution.hook(frame, streamHooks.resumed, {
|
|
25
|
+
checkpointId: frame.cp.id,
|
|
26
|
+
interruptId: request.interruptId,
|
|
27
|
+
reason: "response",
|
|
28
|
+
});
|
|
29
|
+
const cursor = frame.cp.execution.handlerCursor;
|
|
30
|
+
if (cursor?.eventId === streamHooks.before) {
|
|
31
|
+
const result = await execution.hook(frame, streamHooks.before, cursor.payload);
|
|
32
|
+
if (result?.decision === "deny" || result?.decision === "stop") {
|
|
33
|
+
await execution.finish(frame, "stopped", result.reason ?? "PolicyStopped");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (cursor?.eventId === modelHooks.recover) {
|
|
38
|
+
const result = await execution.hook(frame, modelHooks.recover, cursor.payload);
|
|
39
|
+
if (result?.decision !== "retry")
|
|
40
|
+
fail("ProviderError", "Recovery policy declined retry");
|
|
41
|
+
frame.cp.execution.phase = "BeforeModel";
|
|
42
|
+
await execution.commit(frame, "ExecutionTransition");
|
|
43
|
+
}
|
|
44
|
+
await loop(frame, execution);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (request.kind === "recover") {
|
|
48
|
+
frame = await prepareRecovery(execution, request, sink, registry);
|
|
49
|
+
execution.active.set(frame.stream.id, frame);
|
|
50
|
+
watchLease(execution, frame);
|
|
51
|
+
sink.admitted();
|
|
52
|
+
if (frame.cp.execution?.pendingInterruptId) {
|
|
53
|
+
const interrupt = await execution.runtime.backend.executions.get("interrupts", frame.cp.execution.pendingInterruptId, { threadId: request.threadId });
|
|
54
|
+
await execution.hook(frame, streamHooks.suspended, {
|
|
55
|
+
checkpointId: frame.cp.id,
|
|
56
|
+
interrupt: interrupt,
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await execution.hook(frame, streamHooks.resumed, {
|
|
61
|
+
checkpointId: frame.cp.id,
|
|
62
|
+
interruptId: null,
|
|
63
|
+
reason: "recovery",
|
|
64
|
+
});
|
|
65
|
+
await loop(frame, execution);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const head = await execution.runtime.backend.threads.get(request.threadId);
|
|
69
|
+
if (!head)
|
|
70
|
+
fail("ThreadNotFound", "Thread not found");
|
|
71
|
+
if (head.activeStreamId)
|
|
72
|
+
fail("ThreadBusy", "Thread already has unfinished execution");
|
|
73
|
+
const lease = await execution.runtime.backend.ownership.acquire({
|
|
74
|
+
threadId: request.threadId,
|
|
75
|
+
ownerToken: execution.ids.next("owner"),
|
|
76
|
+
ttlMs: 30000,
|
|
77
|
+
});
|
|
78
|
+
pendingLease = lease;
|
|
79
|
+
const cp = structuredClone((await execution.runtime.backend.checkpoints.get(head.currentCheckpointId)));
|
|
80
|
+
const streamId = request.origin
|
|
81
|
+
? await resolveChildAdmission(execution.runtime.backend, request.origin, request.threadId)
|
|
82
|
+
: execution.ids.next("stream"), usage = aggregateUsage([]);
|
|
83
|
+
const stream = {
|
|
84
|
+
id: streamId,
|
|
85
|
+
threadId: request.threadId,
|
|
86
|
+
scope: head.scope,
|
|
87
|
+
parentStreamId: request.origin?.parentStreamId ?? null,
|
|
88
|
+
parentToolExecutionId: request.origin?.parentToolExecutionId ?? null,
|
|
89
|
+
triggerMessageId: null,
|
|
90
|
+
status: "running",
|
|
91
|
+
stopReason: null,
|
|
92
|
+
startedAt: execution.clock.now(),
|
|
93
|
+
endedAt: null,
|
|
94
|
+
durationMs: null,
|
|
95
|
+
error: null,
|
|
96
|
+
directUsage: usage,
|
|
97
|
+
inclusiveUsage: usage,
|
|
98
|
+
outputMessageIds: [],
|
|
99
|
+
};
|
|
100
|
+
const records = await loadRecords(execution, request.threadId);
|
|
101
|
+
frame = createFrame(execution, {
|
|
102
|
+
request,
|
|
103
|
+
sink,
|
|
104
|
+
registry,
|
|
105
|
+
lease,
|
|
106
|
+
cp,
|
|
107
|
+
stream,
|
|
108
|
+
records,
|
|
109
|
+
admitted: false,
|
|
110
|
+
});
|
|
111
|
+
execution.put(frame, "streams", stream);
|
|
112
|
+
sink.setId(streamId);
|
|
113
|
+
execution.active.set(streamId, frame);
|
|
114
|
+
watchLease(execution, frame);
|
|
115
|
+
cp.execution = {
|
|
116
|
+
timing: { completedActiveMs: 0, segmentOpen: true, complete: true },
|
|
117
|
+
streamId,
|
|
118
|
+
turnId: null,
|
|
119
|
+
phase: "BeforeTurn",
|
|
120
|
+
modelRef: request.model,
|
|
121
|
+
...(request.modelOptions ? { modelOptions: request.modelOptions } : {}),
|
|
122
|
+
baseInstructions: execution.agent.instructions,
|
|
123
|
+
pendingToolExecutionIds: [],
|
|
124
|
+
pendingInterruptId: null,
|
|
125
|
+
handlerCursor: null,
|
|
126
|
+
budgets: {
|
|
127
|
+
turns: 0,
|
|
128
|
+
modelAttempts: 0,
|
|
129
|
+
toolCalls: 0,
|
|
130
|
+
limits: { ...execution.agent.limits, ...request.limits },
|
|
131
|
+
},
|
|
132
|
+
registryManifest: [
|
|
133
|
+
...registry.values.map((r) => ({
|
|
134
|
+
pluginId: r.pluginId,
|
|
135
|
+
kind: r.kind,
|
|
136
|
+
id: r.id,
|
|
137
|
+
version: r.version,
|
|
138
|
+
pluginVersion: r.pluginVersion,
|
|
139
|
+
configurationId: r.configurationId,
|
|
140
|
+
requiredForContinuation: true,
|
|
141
|
+
})),
|
|
142
|
+
...registry.handlers.map((r) => ({
|
|
143
|
+
pluginId: r.pluginId,
|
|
144
|
+
kind: "handler",
|
|
145
|
+
id: r.id,
|
|
146
|
+
version: r.version,
|
|
147
|
+
pluginVersion: r.pluginVersion,
|
|
148
|
+
configurationId: r.configurationId,
|
|
149
|
+
requiredForContinuation: r.kind !== "notification",
|
|
150
|
+
})),
|
|
151
|
+
],
|
|
152
|
+
};
|
|
153
|
+
bindExecutionModel(registry, cp.execution, request.adapter);
|
|
154
|
+
const input = await execution.hook(frame, inputHooks.prepare, {
|
|
155
|
+
messages: request.input,
|
|
156
|
+
});
|
|
157
|
+
if (input.rejected)
|
|
158
|
+
throw errorFromInfo(input.rejected);
|
|
159
|
+
for (const message of input.messages)
|
|
160
|
+
cp.state = {
|
|
161
|
+
...cp.state,
|
|
162
|
+
messages: [
|
|
163
|
+
...cp.state.messages,
|
|
164
|
+
await execution.prepareMessage(frame, message),
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
stream.triggerMessageId = input.messages[0]?.id ?? null;
|
|
168
|
+
await execution.commit(frame, "InputCommitted");
|
|
169
|
+
frame.admitted = true;
|
|
170
|
+
sink.admitted();
|
|
171
|
+
await execution.hook(frame, streamHooks.started, {
|
|
172
|
+
modelRef: request.model,
|
|
173
|
+
checkpointId: frame.cp.id,
|
|
174
|
+
});
|
|
175
|
+
await execution.hook(frame, inputHooks.received, {
|
|
176
|
+
messages: input.messages,
|
|
177
|
+
});
|
|
178
|
+
if (input.handled) {
|
|
179
|
+
for (const message of input.handled.output)
|
|
180
|
+
await execution.appendMessage(frame, message);
|
|
181
|
+
await execution.finish(frame, "completed", null);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const before = await execution.hook(frame, streamHooks.before, {
|
|
185
|
+
input: input.messages,
|
|
186
|
+
});
|
|
187
|
+
if (before?.decision === "deny" || before?.decision === "stop") {
|
|
188
|
+
await execution.finish(frame, "stopped", before.reason ?? "PolicyStopped");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
await loop(frame, execution);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (error instanceof Suspension)
|
|
195
|
+
return;
|
|
196
|
+
if (frame?.ownershipError)
|
|
197
|
+
error = new TessarError("OwnershipLost", "Execution ownership was lost");
|
|
198
|
+
const info = errorInfo(error);
|
|
199
|
+
if (frame?.admitted &&
|
|
200
|
+
info.source !== "storage" &&
|
|
201
|
+
![
|
|
202
|
+
"StorageUnavailable",
|
|
203
|
+
"CommitConflict",
|
|
204
|
+
"OwnershipLost",
|
|
205
|
+
"RecoveryRequired",
|
|
206
|
+
].includes(info.code)) {
|
|
207
|
+
try {
|
|
208
|
+
await execution.finish(frame, sink.controller.signal.aborted ? "cancelled" : "failed", info.code, info);
|
|
209
|
+
return error;
|
|
210
|
+
}
|
|
211
|
+
catch (finalizeError) {
|
|
212
|
+
error = finalizeError;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const finalError = errorInfo(error);
|
|
216
|
+
execution.runtime.report(finalError, eventContext(execution, frame));
|
|
217
|
+
sink.emit(streamHooks.error, {
|
|
218
|
+
error: finalError,
|
|
219
|
+
lastKnownCheckpointId: frame?.cp.id ?? null,
|
|
220
|
+
persistedStatus: frame?.stream.status ?? null,
|
|
221
|
+
}, eventContext(execution, frame));
|
|
222
|
+
sink.rejected(finalError);
|
|
223
|
+
return error;
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
if (frame) {
|
|
227
|
+
if (["completed", "failed", "stopped", "cancelled"].includes(frame.stream.status) ||
|
|
228
|
+
!frame.admitted)
|
|
229
|
+
execution.pendingModels.delete(frame.request.threadId);
|
|
230
|
+
if (frame.heartbeat)
|
|
231
|
+
clearInterval(frame.heartbeat);
|
|
232
|
+
execution.active.delete(frame.stream.id);
|
|
233
|
+
try {
|
|
234
|
+
await execution.runtime.backend.ownership.release(frame.lease);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
/* recovery uses lease expiry */
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (pendingLease) {
|
|
241
|
+
try {
|
|
242
|
+
await execution.runtime.backend.ownership.release(pendingLease);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
/* lease expiry remains authoritative */
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
await registry.release();
|
|
249
|
+
sink.close();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export async function cancel(execution, threadId, streamId, reason = "Cancelled", target = { kind: "observer", observe: () => { } }, context = {}) {
|
|
253
|
+
const active = execution.active.get(streamId);
|
|
254
|
+
if (active) {
|
|
255
|
+
if (active.cp.threadId !== threadId)
|
|
256
|
+
fail("InvalidTransition", "Execution belongs to a different thread");
|
|
257
|
+
await execution.hook(active, streamHooks.cancel, { reason });
|
|
258
|
+
active.sink.controller.abort(reason);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const registry = execution.runtime.hooks.capture(), sink = createDelivery(threadId, execution.ids, target, undefined, execution.runtime.report);
|
|
262
|
+
let frame;
|
|
263
|
+
try {
|
|
264
|
+
frame = await restoreFrame(execution, { ...context, kind: "recover", threadId, streamId }, sink, registry, false);
|
|
265
|
+
watchLease(execution, frame);
|
|
266
|
+
if (frame.cp.execution?.pendingToolExecutionIds.length)
|
|
267
|
+
await recoverTools(frame, execution, true);
|
|
268
|
+
for (const interrupt of execution.rows(frame, "interrupts"))
|
|
269
|
+
if (interrupt.streamId === streamId && interrupt.status === "pending") {
|
|
270
|
+
interrupt.status = "cancelled";
|
|
271
|
+
interrupt.resolvedAt = execution.clock.now();
|
|
272
|
+
}
|
|
273
|
+
for (const attempt of execution.rows(frame, "model_attempts"))
|
|
274
|
+
if (attempt.streamId === streamId && attempt.status === "running") {
|
|
275
|
+
attempt.status = "cancelled";
|
|
276
|
+
attempt.endedAt = execution.clock.now();
|
|
277
|
+
}
|
|
278
|
+
await execution.hook(frame, streamHooks.cancel, { reason });
|
|
279
|
+
await execution.finish(frame, "cancelled", reason);
|
|
280
|
+
execution.pendingModels.delete(threadId);
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
if (frame) {
|
|
284
|
+
if (frame.heartbeat)
|
|
285
|
+
clearInterval(frame.heartbeat);
|
|
286
|
+
await execution.runtime.backend.ownership.release(frame.lease);
|
|
287
|
+
}
|
|
288
|
+
await registry.release();
|
|
289
|
+
sink.close();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/engine/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,IAAI,WAAW,EACrB,KAAK,IAAI,UAAU,EACnB,KAAK,IAAI,UAAU,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EACL,cAAc,GAGf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,GAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,SAA2B,EAC3B,OAAyB,EACzB,IAAgB,EAChB,QAAuB;IAEvB,IAAI,KAAiC,CAAC;IACtC,IAAI,YAA+B,CAAC;IACpC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;YAChC,IAAI,CAAC,WAAW,EAAE,sCAAsC,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC7C,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE;gBAC/C,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBACzB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,SAAU,CAAC,aAAa,CAAC;YACjD,IAAI,MAAM,EAAE,OAAO,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CACjC,KAAK,EACL,WAAW,CAAC,MAAM,EAClB,MAAM,CAAC,OAAc,CACtB,CAAC;gBACF,IAAI,MAAM,EAAE,QAAQ,KAAK,MAAM,IAAI,MAAM,EAAE,QAAQ,KAAK,MAAM,EAAE,CAAC;oBAC/D,MAAM,SAAS,CAAC,MAAM,CACpB,KAAK,EACL,SAAS,EACT,MAAM,CAAC,MAAM,IAAI,eAAe,CACjC,CAAC;oBACF,OAAO;gBACT,CAAC;YACH,CAAC;YACD,IAAI,MAAM,EAAE,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CACjC,KAAK,EACL,UAAU,CAAC,OAAO,EAClB,MAAM,CAAC,OAAc,CACtB,CAAC;gBACF,IAAI,MAAM,EAAE,QAAQ,KAAK,OAAO;oBAC9B,IAAI,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;gBAC1D,KAAK,CAAC,EAAE,CAAC,SAAU,CAAC,KAAK,GAAG,aAAa,CAAC;gBAC1C,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAClE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC7C,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAC9D,YAAY,EACZ,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,kBAAkB,EACrC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAC/B,CAAC;gBACF,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE;oBACjD,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;oBACzB,SAAS,EAAE,SAAU;iBACtB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE;gBAC/C,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;gBACzB,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,cAAc;YACrB,IAAI,CAAC,YAAY,EAAE,yCAAyC,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;YAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;YACvC,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,YAAY,GAAG,KAAK,CAAC;QACrB,MAAM,EAAE,GAAG,eAAe,CACxB,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAC9C,IAAI,CAAC,mBAAmB,CACzB,CAAE,CACJ,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM;YAC3B,CAAC,CAAC,MAAM,qBAAqB,CACzB,SAAS,CAAC,OAAO,CAAC,OAAO,EACzB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,QAAQ,CACjB;YACH,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAChC,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAiB;YAC3B,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,IAAI;YACtD,qBAAqB,EAAE,OAAO,CAAC,MAAM,EAAE,qBAAqB,IAAI,IAAI;YACpE,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,KAAK;YACrB,gBAAgB,EAAE,EAAE;SACrB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/D,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE;YAC7B,OAAO;YACP,IAAI;YACJ,QAAQ;YACR,KAAK;YACL,EAAE;YACF,MAAM;YACN,OAAO;YACP,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7B,EAAE,CAAC,SAAS,GAAG;YACb,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnE,QAAQ;YACR,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,OAAO,CAAC,KAAK;YACvB,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY;YAC9C,uBAAuB,EAAE,EAAE;YAC3B,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE,CAAC;gBACR,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;aACzD;YACD,gBAAgB,EAAE;gBAChB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,aAAa,EAAE,CAAC,CAAC,aAAa;oBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe;oBAClC,uBAAuB,EAAE,IAAI;iBAC9B,CAAC,CAAC;gBACH,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/B,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,IAAI,EAAE,SAAS;oBACf,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,aAAa,EAAE,CAAC,CAAC,aAAa;oBAC9B,eAAe,EAAE,CAAC,CAAC,eAAe;oBAClC,uBAAuB,EAAE,CAAC,CAAC,IAAI,KAAK,cAAc;iBACnD,CAAC,CAAC;aACJ;SACF,CAAC;QACF,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE;YAC5D,QAAQ,EAAE,OAAO,CAAC,KAAK;SACxB,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,QAAQ;YAAE,MAAM,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;YAClC,EAAE,CAAC,KAAK,GAAG;gBACT,GAAG,EAAE,CAAC,KAAK;gBACX,QAAQ,EAAE;oBACR,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ;oBACpB,MAAM,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;iBAC/C;aACF,CAAC;QACJ,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;QACxD,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAChD,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE;YAC/C,QAAQ,EAAE,OAAO,CAAC,KAAK;YACvB,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE;SAC1B,CAAC,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE;YAC/C,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM;gBACxC,MAAM,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE;YAC7D,KAAK,EAAE,KAAK,CAAC,QAAQ;SACtB,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,QAAQ,KAAK,MAAM,IAAI,MAAM,EAAE,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC/D,MAAM,SAAS,CAAC,MAAM,CACpB,KAAK,EACL,SAAS,EACT,MAAM,CAAC,MAAM,IAAI,eAAe,CACjC,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU;YAAE,OAAO;QACxC,IAAI,KAAK,EAAE,cAAc;YACvB,KAAK,GAAG,IAAI,WAAW,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IACE,KAAK,EAAE,QAAQ;YACf,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC;gBACC,oBAAoB;gBACpB,gBAAgB;gBAChB,eAAe;gBACf,kBAAkB;aACnB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EACrB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,MAAM,CACpB,KAAK,EACL,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EACvD,IAAI,CAAC,IAAI,EACT,IAAI,CACL,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,OAAO,aAAa,EAAE,CAAC;gBACvB,KAAK,GAAG,aAAa,CAAC;YACxB,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CACP,WAAW,CAAC,KAAK,EACjB;YACE,KAAK,EAAE,UAAU;YACjB,qBAAqB,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI;YAC3C,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;SAC9C,EACD,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAC/B,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,EAAE,CAAC;YACV,IACE,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CACtD,KAAK,CAAC,MAAM,CAAC,MAAM,CACpB;gBACD,CAAC,KAAK,CAAC,QAAQ;gBAEf,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,SAAS;gBAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpD,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,SAA2B,EAC3B,QAAgB,EAChB,QAAgB,EAChB,MAAM,GAAG,WAAW,EACpB,MAAM,GAAmB,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,EAChE,OAAO,GAAiD,EAAE;IAE1D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ;YACjC,IAAI,CAAC,mBAAmB,EAAE,yCAAyC,CAAC,CAAC;QACvE,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAChD,IAAI,GAAG,cAAc,CACnB,QAAQ,EACR,SAAS,CAAC,GAAG,EACb,MAAM,EACN,SAAS,EACT,SAAS,CAAC,OAAO,CAAC,MAAM,CACzB,CAAC;IACJ,IAAI,KAAiC,CAAC;IACtC,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,YAAY,CACxB,SAAS,EACT,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EACnD,IAAI,EACJ,QAAQ,EACR,KAAK,CACN,CAAC;QACF,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,uBAAuB,CAAC,MAAM;YACpD,MAAM,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,IAAI,CAEpC,KAAK,EAAE,YAAY,CAAC;YACpB,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtE,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC/B,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC/C,CAAC;QACH,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,IAAI,CAClC,KAAK,EACL,gBAAgB,CACjB;YACC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAClE,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC7B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC1C,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACnD,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,SAAS;gBAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Agent } from "../agent.js";
|
|
2
|
+
import type { ExecutionRuntime } from "./runtime.js";
|
|
3
|
+
import { type ErrorInfo } from "../errors.js";
|
|
4
|
+
import type { JsonObject, JsonValue } from "../json.js";
|
|
5
|
+
import type { MessageData } from "../messages/message.js";
|
|
6
|
+
import type { ModelAdapter, ModelRef } from "../models/contract.js";
|
|
7
|
+
import type { RegistryLease } from "../plugins/registry.js";
|
|
8
|
+
import { PluginStateAccess } from "../state/plugin-state.js";
|
|
9
|
+
import type { Lease } from "../state/storage-ports.js";
|
|
10
|
+
import type { Checkpoint, RecordEntry, StreamLimits } from "../state/schema.js";
|
|
11
|
+
import type { StreamRecord } from "../trace/records.js";
|
|
12
|
+
import type { LoopContext } from "../loop.js";
|
|
13
|
+
import type { Attachment } from "./delivery.js";
|
|
14
|
+
import type { SessionHookHandle, ThreadHookHandle } from "../plugins/context.js";
|
|
15
|
+
export interface ExecutionOrigin {
|
|
16
|
+
parentStreamId: string;
|
|
17
|
+
parentToolExecutionId?: string;
|
|
18
|
+
dispatchId: string;
|
|
19
|
+
}
|
|
20
|
+
export type ExecutionRequest = ({
|
|
21
|
+
kind: "input";
|
|
22
|
+
threadId: string;
|
|
23
|
+
input: readonly MessageData[];
|
|
24
|
+
model: ModelRef;
|
|
25
|
+
origin?: ExecutionOrigin;
|
|
26
|
+
context?: JsonObject;
|
|
27
|
+
limits?: Partial<StreamLimits>;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "resume";
|
|
30
|
+
threadId: string;
|
|
31
|
+
interruptId: string;
|
|
32
|
+
value: JsonValue;
|
|
33
|
+
model?: ModelRef;
|
|
34
|
+
} | {
|
|
35
|
+
kind: "recover";
|
|
36
|
+
threadId: string;
|
|
37
|
+
streamId: string;
|
|
38
|
+
model?: ModelRef;
|
|
39
|
+
}) & {
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
adapter?: ModelAdapter;
|
|
42
|
+
modelOptions?: JsonObject;
|
|
43
|
+
session?: SessionHookHandle;
|
|
44
|
+
thread?: ThreadHookHandle;
|
|
45
|
+
};
|
|
46
|
+
export interface ExecutionFrame {
|
|
47
|
+
activeSegmentStartedAt?: number;
|
|
48
|
+
turnStartedAt?: number;
|
|
49
|
+
effectLocks?: Map<string, Promise<unknown>>;
|
|
50
|
+
commitQueue?: Promise<void>;
|
|
51
|
+
heartbeat?: ReturnType<typeof setInterval>;
|
|
52
|
+
ownershipError?: ErrorInfo;
|
|
53
|
+
request: ExecutionRequest;
|
|
54
|
+
sink: Attachment;
|
|
55
|
+
registry: RegistryLease;
|
|
56
|
+
lease: Lease;
|
|
57
|
+
cp: Checkpoint;
|
|
58
|
+
stream: StreamRecord;
|
|
59
|
+
records: Map<string, RecordEntry>;
|
|
60
|
+
state: PluginStateAccess;
|
|
61
|
+
admitted: boolean;
|
|
62
|
+
sequence: number;
|
|
63
|
+
}
|
|
64
|
+
export type ExecutionContext = Omit<LoopContext, "finish"> & {
|
|
65
|
+
agent: Agent;
|
|
66
|
+
runtime: ExecutionRuntime;
|
|
67
|
+
active: Map<string, ExecutionFrame>;
|
|
68
|
+
pendingModels: Map<string, ModelAdapter>;
|
|
69
|
+
resumeAdmissions: Map<string, Promise<ExecutionFrame>>;
|
|
70
|
+
prepareMessage(frame: ExecutionFrame, message: MessageData): Promise<MessageData>;
|
|
71
|
+
finish(frame: ExecutionFrame, status: "completed" | "stopped" | "failed" | "cancelled", reason: string | null, error?: ErrorInfo | null): Promise<void>;
|
|
72
|
+
};
|
|
73
|
+
export declare function loadRecords(execution: ExecutionContext, threadId: string): Promise<Map<string, RecordEntry>>;
|
|
74
|
+
export declare function createFrame(execution: ExecutionContext, options: Pick<ExecutionFrame, "request" | "sink" | "registry" | "lease" | "cp" | "stream" | "records" | "admitted">): ExecutionFrame;
|
|
75
|
+
export declare function watchLease(execution: ExecutionContext, frame: ExecutionFrame): void;
|
|
76
|
+
/** Account only observed attachment time; a crashed open segment is incomplete. */
|
|
77
|
+
export declare function sampleActiveTime(frame: ExecutionFrame, close?: boolean): void;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { errorInfo } from "../errors.js";
|
|
2
|
+
import { PluginStateAccess, } from "../state/plugin-state.js";
|
|
3
|
+
import { childStateDefinition } from "./tracked-effects.js";
|
|
4
|
+
export async function loadRecords(execution, threadId) {
|
|
5
|
+
const records = new Map();
|
|
6
|
+
for (const kind of [
|
|
7
|
+
"streams",
|
|
8
|
+
"turns",
|
|
9
|
+
"model_attempts",
|
|
10
|
+
"tool_executions",
|
|
11
|
+
"interrupts",
|
|
12
|
+
])
|
|
13
|
+
for (const row of await execution.runtime.backend.executions.listRecords(kind, threadId)) {
|
|
14
|
+
const id = "id" in row ? row.id : "";
|
|
15
|
+
records.set(kind + ":" + id, {
|
|
16
|
+
kind,
|
|
17
|
+
id,
|
|
18
|
+
threadId,
|
|
19
|
+
data: structuredClone(row),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return records;
|
|
23
|
+
}
|
|
24
|
+
export function createFrame(execution, options) {
|
|
25
|
+
if (options.request.adapter)
|
|
26
|
+
execution.pendingModels.set(options.request.threadId, options.request.adapter);
|
|
27
|
+
else if (options.request.kind !== "input")
|
|
28
|
+
options = {
|
|
29
|
+
...options,
|
|
30
|
+
request: {
|
|
31
|
+
...options.request,
|
|
32
|
+
adapter: execution.pendingModels.get(options.request.threadId),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
let frame;
|
|
36
|
+
const state = new PluginStateAccess([
|
|
37
|
+
childStateDefinition,
|
|
38
|
+
...options.registry.list("state"),
|
|
39
|
+
], { type: "thread", id: options.request.threadId }, options.cp.state.pluginStates, async () => {
|
|
40
|
+
await execution.commit(frame, "PluginStateCommitted");
|
|
41
|
+
return frame.cp.id;
|
|
42
|
+
}, undefined, execution.runtime.backend.ownedState);
|
|
43
|
+
const timing = options.cp.execution?.timing;
|
|
44
|
+
if (options.cp.execution)
|
|
45
|
+
options.cp.execution.timing = {
|
|
46
|
+
completedActiveMs: timing?.completedActiveMs ?? 0,
|
|
47
|
+
complete: timing !== undefined && timing.complete && !timing.segmentOpen,
|
|
48
|
+
segmentOpen: true,
|
|
49
|
+
};
|
|
50
|
+
frame = {
|
|
51
|
+
...options,
|
|
52
|
+
state,
|
|
53
|
+
sequence: 0,
|
|
54
|
+
activeSegmentStartedAt: performance.now(),
|
|
55
|
+
};
|
|
56
|
+
return frame;
|
|
57
|
+
}
|
|
58
|
+
export function watchLease(execution, frame) {
|
|
59
|
+
if (frame.heartbeat)
|
|
60
|
+
return;
|
|
61
|
+
frame.heartbeat = setInterval(() => {
|
|
62
|
+
void execution.runtime.backend.ownership.renew(frame.lease, 30000).then((lease) => {
|
|
63
|
+
frame.lease = lease;
|
|
64
|
+
}, (error) => {
|
|
65
|
+
frame.ownershipError = errorInfo(error, {
|
|
66
|
+
source: "storage",
|
|
67
|
+
backendId: execution.runtime.backend.id,
|
|
68
|
+
});
|
|
69
|
+
frame.sink.controller.abort("OwnershipLost");
|
|
70
|
+
});
|
|
71
|
+
}, 10000);
|
|
72
|
+
}
|
|
73
|
+
/** Account only observed attachment time; a crashed open segment is incomplete. */
|
|
74
|
+
export function sampleActiveTime(frame, close = false) {
|
|
75
|
+
const timing = frame.cp.execution?.timing;
|
|
76
|
+
if (!timing || frame.activeSegmentStartedAt === undefined)
|
|
77
|
+
return;
|
|
78
|
+
const now = performance.now();
|
|
79
|
+
timing.completedActiveMs += Math.max(0, now - frame.activeSegmentStartedAt);
|
|
80
|
+
timing.segmentOpen = !close;
|
|
81
|
+
frame.activeSegmentStartedAt = close ? undefined : now;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/engine/frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AnyEvent, EventContext, PayloadOf, ResultOf } from "../events/definition.js";
|
|
2
|
+
import type { ExecutionContext, ExecutionFrame } from "./frame.js";
|
|
3
|
+
export declare function eventContext(execution: ExecutionContext, frame?: ExecutionFrame): EventContext;
|
|
4
|
+
export declare function hook<D extends AnyEvent>(execution: ExecutionContext, frame: ExecutionFrame, definition: D, payload: PayloadOf<D>, toolExecutionId?: string): Promise<ResultOf<D>>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { stream as streamHooks } from "../events/type.js";
|
|
2
|
+
import { fail } from "../errors.js";
|
|
3
|
+
import { immutable } from "../json.js";
|
|
4
|
+
import {} from "../events/type.js";
|
|
5
|
+
import { canonicalJson } from "../state/commit.js";
|
|
6
|
+
import { Suspension } from "./interrupt.js";
|
|
7
|
+
import { phaseForEvent } from "./resume.js";
|
|
8
|
+
export function eventContext(execution, frame) {
|
|
9
|
+
return {
|
|
10
|
+
agentId: execution.agent.id,
|
|
11
|
+
controllerId: execution.runtime.id,
|
|
12
|
+
...(frame
|
|
13
|
+
? {
|
|
14
|
+
scope: frame.cp.state.scope,
|
|
15
|
+
sessionId: frame.request.session?.id,
|
|
16
|
+
streamId: frame.stream.id,
|
|
17
|
+
threadId: frame.cp.threadId,
|
|
18
|
+
sequence: ++frame.sequence,
|
|
19
|
+
timestamp: execution.clock.now(),
|
|
20
|
+
}
|
|
21
|
+
: {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function hook(execution, frame, definition, payload, toolExecutionId) {
|
|
25
|
+
const cursor = frame.cp.execution?.handlerCursor?.eventId === definition
|
|
26
|
+
? frame.cp.execution.handlerCursor
|
|
27
|
+
: null;
|
|
28
|
+
const decisions = cursor?.decisions.slice() ?? [];
|
|
29
|
+
const kind = execution.runtime.hooks.kind(definition);
|
|
30
|
+
const mutable = kind === "transformation" || kind === "decision";
|
|
31
|
+
const context = {
|
|
32
|
+
...eventContext(execution, frame),
|
|
33
|
+
...(frame.request.session ? { session: frame.request.session } : {}),
|
|
34
|
+
...(frame.request.thread ? { thread: frame.request.thread } : {}),
|
|
35
|
+
...(mutable
|
|
36
|
+
? {
|
|
37
|
+
...execution.services(frame, toolExecutionId),
|
|
38
|
+
state: frame.state,
|
|
39
|
+
}
|
|
40
|
+
: {}),
|
|
41
|
+
signal: frame.sink.controller.signal,
|
|
42
|
+
context: frame.request.kind === "input" ? frame.request.context : undefined,
|
|
43
|
+
turnId: frame.cp.execution?.turnId,
|
|
44
|
+
streamId: frame.stream.id,
|
|
45
|
+
threadId: frame.cp.threadId,
|
|
46
|
+
startIndex: cursor?.nextIndex ?? 0,
|
|
47
|
+
initialDecision: decisions.at(-1) ?? undefined,
|
|
48
|
+
allowedHandlerIds: frame.cp.execution?.registryManifest
|
|
49
|
+
.filter((r) => r.kind === "handler")
|
|
50
|
+
.map((r) => r.id),
|
|
51
|
+
suspend: kind === "decision"
|
|
52
|
+
? (def, data) => {
|
|
53
|
+
phaseForEvent(definition);
|
|
54
|
+
const binding = frame.registry.find("interruption", def.id);
|
|
55
|
+
if (!binding || binding.definition.version !== def.version)
|
|
56
|
+
fail("ResumeIncompatible", "Interruption definition is not registered");
|
|
57
|
+
return {
|
|
58
|
+
decision: "suspend",
|
|
59
|
+
definitionId: def.id,
|
|
60
|
+
definitionVersion: def.version,
|
|
61
|
+
pluginId: binding.pluginId,
|
|
62
|
+
payload: immutable(def.payload ? def.payload.parse(data) : data),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
: undefined,
|
|
66
|
+
onDecision: execution.runtime.hooks.kind(definition) === "decision"
|
|
67
|
+
? async (entry) => {
|
|
68
|
+
const value = entry.decision;
|
|
69
|
+
decisions.push(value ? immutable(value) : null);
|
|
70
|
+
frame.cp.execution.handlerCursor = {
|
|
71
|
+
eventId: definition,
|
|
72
|
+
handlerId: entry.handlerId,
|
|
73
|
+
nextIndex: entry.index + 1,
|
|
74
|
+
payload: immutable(cursor?.payload ?? payload),
|
|
75
|
+
decisions,
|
|
76
|
+
};
|
|
77
|
+
if (value?.decision !== "suspend")
|
|
78
|
+
await execution.commit(frame, "ExecutionTransition");
|
|
79
|
+
}
|
|
80
|
+
: undefined,
|
|
81
|
+
};
|
|
82
|
+
const value = await execution.runtime.hooks.dispatch(definition, payload, context, frame.registry);
|
|
83
|
+
if (execution.runtime.hooks.kind(definition) === "decision") {
|
|
84
|
+
if (value?.decision === "suspend")
|
|
85
|
+
await suspend(execution, frame, value, toolExecutionId);
|
|
86
|
+
if (frame.cp.execution?.handlerCursor?.eventId === definition)
|
|
87
|
+
frame.cp.execution.handlerCursor = null;
|
|
88
|
+
}
|
|
89
|
+
if (execution.runtime.hooks.kind(definition) === "notification")
|
|
90
|
+
frame.sink.emit(definition, payload, context);
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
async function suspend(execution, frame, decision, toolExecutionId) {
|
|
94
|
+
if (decision.decision !== "suspend")
|
|
95
|
+
fail("InvalidTransition", "Expected suspension decision");
|
|
96
|
+
const binding = frame.registry.find("interruption", decision.definitionId);
|
|
97
|
+
const position = frame.cp.execution, id = execution.ids.next("interrupt");
|
|
98
|
+
const tool = toolExecutionId
|
|
99
|
+
? execution
|
|
100
|
+
.rows(frame, "tool_executions")
|
|
101
|
+
.find((t) => t.id === toolExecutionId)
|
|
102
|
+
: null;
|
|
103
|
+
const interrupt = {
|
|
104
|
+
id,
|
|
105
|
+
threadId: frame.cp.threadId,
|
|
106
|
+
streamId: frame.stream.id,
|
|
107
|
+
checkpointId: frame.cp.id,
|
|
108
|
+
definitionId: decision.definitionId,
|
|
109
|
+
definitionVersion: decision.definitionVersion,
|
|
110
|
+
pluginId: decision.pluginId,
|
|
111
|
+
payload: decision.payload,
|
|
112
|
+
responseSchema: binding.definition.response.jsonSchema,
|
|
113
|
+
actionRef: tool
|
|
114
|
+
? {
|
|
115
|
+
toolExecutionId: tool.id,
|
|
116
|
+
toolName: tool.toolName,
|
|
117
|
+
argumentsDigest: canonicalJson(tool.arguments),
|
|
118
|
+
}
|
|
119
|
+
: null,
|
|
120
|
+
status: "pending",
|
|
121
|
+
response: null,
|
|
122
|
+
resolvedDecision: null,
|
|
123
|
+
createdAt: execution.clock.now(),
|
|
124
|
+
resolvedAt: null,
|
|
125
|
+
revision: frame.cp.revision,
|
|
126
|
+
};
|
|
127
|
+
execution.put(frame, "interrupts", interrupt);
|
|
128
|
+
position.pendingInterruptId = id;
|
|
129
|
+
position.phase = "Suspended";
|
|
130
|
+
frame.stream.status = "suspended";
|
|
131
|
+
await execution.commit(frame, "Suspended");
|
|
132
|
+
await execution.hook(frame, streamHooks.suspended, {
|
|
133
|
+
checkpointId: frame.cp.id,
|
|
134
|
+
interrupt,
|
|
135
|
+
});
|
|
136
|
+
throw new Suspension();
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/engine/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type JsonValue } from "../json.js";
|
|
2
2
|
import type { InputDefinition } from "../tools/input-definition.js";
|
|
3
|
-
import type { ControlDecision } from "../events/
|
|
3
|
+
import type { ControlDecision } from "../events/type.js";
|
|
4
4
|
import type { PluginStateAccess } from "../state/plugin-state.js";
|
|
5
5
|
import type { ExecutionHookContext } from "./tracked-effects.js";
|
|
6
6
|
export interface InterruptionDefinition<R = any, D extends ControlDecision = ControlDecision, P extends JsonValue = JsonValue> {
|
package/dist/engine/lineage.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { StorageBackend } from "../state/storage-ports.js";
|
|
|
2
2
|
import type { PluginStateSnapshot } from "../state/schema.js";
|
|
3
3
|
import type { ModelAttemptRecord } from "../trace/records.js";
|
|
4
4
|
import { type ChildReservation } from "./tracked-effects.js";
|
|
5
|
-
import type { ExecutionOrigin } from "
|
|
5
|
+
import type { ExecutionOrigin } from "./frame.js";
|
|
6
6
|
export declare function reservations(states: readonly PluginStateSnapshot[], streamId: string): ChildReservation[];
|
|
7
7
|
export declare function resolveChildAdmission(backend: StorageBackend, origin: ExecutionOrigin, threadId: string): Promise<string>;
|
|
8
8
|
export declare function summarizeStreamUsage(backend: StorageBackend, streamId: string, local?: {
|