@minpeter/pss-runtime 0.1.0-next.2 → 0.1.0-next.3
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 +166 -78
- package/dist/agent-host-session-store.js +2 -4
- package/dist/agent-host-session-store.js.map +1 -1
- package/dist/agent-loop.js +2 -3
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent-namespace.js +3 -7
- package/dist/agent-namespace.js.map +1 -1
- package/dist/agent-options.d.ts +2 -8
- package/dist/agent-options.js +4 -4
- package/dist/agent-options.js.map +1 -1
- package/dist/agent-resume.js +2 -82
- package/dist/agent-resume.js.map +1 -1
- package/dist/agent-session-entry.d.ts +1 -1
- package/dist/agent.d.ts +4 -4
- package/dist/agent.js +16 -70
- package/dist/agent.js.map +1 -1
- package/dist/cloudflare/cloudflare-agent-context.d.ts +40 -0
- package/dist/cloudflare/cloudflare-agent-context.js +37 -0
- package/dist/cloudflare/cloudflare-agent-context.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-budget.d.ts +18 -0
- package/dist/cloudflare/cloudflare-alarm-budget.js +77 -0
- package/dist/cloudflare/cloudflare-alarm-budget.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-drainer.d.ts +45 -0
- package/dist/cloudflare/cloudflare-alarm-drainer.js +103 -0
- package/dist/cloudflare/cloudflare-alarm-drainer.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-run-drain.d.ts +13 -0
- package/dist/cloudflare/cloudflare-alarm-run-drain.js +81 -0
- package/dist/cloudflare/cloudflare-alarm-run-drain.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-work.js +110 -0
- package/dist/cloudflare/cloudflare-alarm-work.js.map +1 -0
- package/dist/cloudflare/cloudflare-checkpoint-store.js +39 -0
- package/dist/cloudflare/cloudflare-checkpoint-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-durable-object-fetch.d.ts +21 -0
- package/dist/cloudflare/cloudflare-durable-object-fetch.js +11 -0
- package/dist/cloudflare/cloudflare-durable-object-fetch.js.map +1 -0
- package/dist/cloudflare/cloudflare-event-store.js +33 -0
- package/dist/cloudflare/cloudflare-event-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-execution-session-store.js +40 -0
- package/dist/cloudflare/cloudflare-execution-session-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-execution-store.js +35 -0
- package/dist/cloudflare/cloudflare-execution-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-host.d.ts +61 -0
- package/dist/cloudflare/cloudflare-host.js +113 -0
- package/dist/cloudflare/cloudflare-host.js.map +1 -0
- package/dist/cloudflare/cloudflare-notification-store.js +59 -0
- package/dist/cloudflare/cloudflare-notification-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-run-store.js +81 -0
- package/dist/cloudflare/cloudflare-run-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-store-utils.js +43 -0
- package/dist/cloudflare/cloudflare-store-utils.js.map +1 -0
- package/dist/cloudflare/durable-object-storage.d.ts +20 -0
- package/dist/cloudflare/durable-object-storage.js +76 -0
- package/dist/cloudflare/durable-object-storage.js.map +1 -0
- package/dist/cloudflare/index.d.ts +7 -0
- package/dist/cloudflare/index.js +6 -0
- package/dist/execution/capabilities.d.ts +40 -0
- package/dist/execution/host.d.ts +9 -0
- package/dist/execution/host.js +49 -1
- package/dist/execution/host.js.map +1 -1
- package/dist/execution/index.d.ts +3 -1
- package/dist/execution/index.js +2 -1
- package/dist/execution/memory.js +1 -1
- package/dist/execution/memory.js.map +1 -1
- package/dist/execution/types.d.ts +5 -10
- package/dist/index.d.ts +8 -4
- package/dist/index.js +6 -1
- package/dist/plugins.d.ts +25 -3
- package/dist/plugins.js +35 -6
- package/dist/plugins.js.map +1 -1
- package/dist/session/delegate-input.d.ts +9 -0
- package/dist/session/delegate-input.js +16 -0
- package/dist/session/delegate-input.js.map +1 -0
- package/dist/session/events.d.ts +43 -25
- package/dist/session/events.js +41 -0
- package/dist/session/events.js.map +1 -0
- package/dist/session/input-meta-types.d.ts +10 -0
- package/dist/session/input-meta.d.ts +13 -0
- package/dist/session/input-meta.js +45 -0
- package/dist/session/input-meta.js.map +1 -0
- package/dist/session/input.d.ts +4 -0
- package/dist/session/mapping.js +4 -2
- package/dist/session/mapping.js.map +1 -1
- package/dist/session/runtime-input-emit.js +41 -0
- package/dist/session/runtime-input-emit.js.map +1 -0
- package/dist/session/runtime-input.js +5 -1
- package/dist/session/runtime-input.js.map +1 -1
- package/dist/session/session-events.js +20 -6
- package/dist/session/session-events.js.map +1 -1
- package/dist/session/session-notification.js +3 -2
- package/dist/session/session-notification.js.map +1 -1
- package/dist/session/session-runtime-drain.js +3 -9
- package/dist/session/session-runtime-drain.js.map +1 -1
- package/dist/session/session-turn-processor.js +7 -17
- package/dist/session/session-turn-processor.js.map +1 -1
- package/dist/session/session.js +11 -4
- package/dist/session/session.js.map +1 -1
- package/package.json +6 -1
- package/dist/agent-child-runs.js +0 -16
- package/dist/agent-child-runs.js.map +0 -1
- package/dist/agent-host-capabilities.js +0 -9
- package/dist/agent-host-capabilities.js.map +0 -1
- package/dist/agent-validation.js +0 -35
- package/dist/agent-validation.js.map +0 -1
- package/dist/child-session-cleanups.js +0 -61
- package/dist/child-session-cleanups.js.map +0 -1
- package/dist/execution/run.js +0 -55
- package/dist/execution/run.js.map +0 -1
- package/dist/subagent-background-child-run-state.js +0 -51
- package/dist/subagent-background-child-run-state.js.map +0 -1
- package/dist/subagent-background-child-run.js +0 -103
- package/dist/subagent-background-child-run.js.map +0 -1
- package/dist/subagent-background-in-process.js +0 -98
- package/dist/subagent-background-in-process.js.map +0 -1
- package/dist/subagent-background-notification-inbox.js +0 -106
- package/dist/subagent-background-notification-inbox.js.map +0 -1
- package/dist/subagent-background-notify.js +0 -136
- package/dist/subagent-background-notify.js.map +0 -1
- package/dist/subagent-background-resume-group.js +0 -99
- package/dist/subagent-background-resume-group.js.map +0 -1
- package/dist/subagent-background-runner.js +0 -115
- package/dist/subagent-background-runner.js.map +0 -1
- package/dist/subagent-background-schedule.js +0 -43
- package/dist/subagent-background-schedule.js.map +0 -1
- package/dist/subagent-child-run.js +0 -68
- package/dist/subagent-child-run.js.map +0 -1
- package/dist/subagent-job-cancel.js +0 -84
- package/dist/subagent-job-cancel.js.map +0 -1
- package/dist/subagent-job-observer.js +0 -19
- package/dist/subagent-job-observer.js.map +0 -1
- package/dist/subagent-job-output.js +0 -87
- package/dist/subagent-job-output.js.map +0 -1
- package/dist/subagent-job-state.js +0 -66
- package/dist/subagent-job-state.js.map +0 -1
- package/dist/subagent-jobs.js +0 -96
- package/dist/subagent-jobs.js.map +0 -1
- package/dist/subagent-prompt-schema.js +0 -114
- package/dist/subagent-prompt-schema.js.map +0 -1
- package/dist/subagent-run.js +0 -111
- package/dist/subagent-run.js.map +0 -1
- package/dist/subagents.js +0 -125
- package/dist/subagents.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-notification.js","names":[],"sources":["../../src/session/session-notification.ts"],"sourcesContent":["import type { AgentEvent } from \"./events\";\nimport type { AgentInput } from \"./input\";\nimport { normalizeAgentInput } from \"./input-normalization\";\nimport { type AgentRun, BufferedAgentRun } from \"./run\";\nimport {\n createRuntimeInputState,\n type QueuedInput,\n type QueuedRuntimeInput,\n queueRuntimeInput,\n type RuntimeInputState,\n} from \"./runtime-input\";\nimport { errorMessage } from \"./session-errors\";\n\nexport interface NotifyOptions {\n readonly deferWhenUnobserved?: boolean;\n readonly observerEvents?: readonly AgentEvent[];\n}\n\ninterface QueueSessionNotificationOptions {\n readonly activeRun: BufferedAgentRun | undefined;\n readonly activeRuntimeInput: RuntimeInputState | undefined;\n readonly drain: () => Promise<void>;\n readonly inputQueue: QueuedInput[];\n readonly pendingRuntimeInputs: QueuedRuntimeInput[];\n}\n\nexport function queueSessionNotification(\n input: AgentInput,\n options: NotifyOptions,\n state: QueueSessionNotificationOptions\n): AgentRun {\n const queuedRuntimeInput: QueuedRuntimeInput = {\n input: normalizeAgentInput(input),\n placement: \"turn-start\",\n };\n const observerEvents = cloneObserverEvents(options.observerEvents ?? []);\n const queuedTurn = state.inputQueue[0];\n if (queuedTurn) {\n queuedTurn.initialEvents.push(...observerEvents);\n queuedTurn.preUserRuntimeInputs.push(queuedRuntimeInput);\n return queuedTurn.run;\n }\n\n const activeRun = state.activeRun;\n const runtimeInput = state.activeRuntimeInput;\n if (runtimeInput && activeRun && !runtimeInput.closedReason) {\n queueRuntimeInput(runtimeInput, {\n input: structuredClone(queuedRuntimeInput.input),\n placement: \"step-end\",\n });\n return activeRun;\n }\n\n if (options.deferWhenUnobserved === true) {\n state.pendingRuntimeInputs.push(queuedRuntimeInput);\n const deferredRun = new BufferedAgentRun();\n deferredRun.close();\n return deferredRun;\n }\n\n const run = new BufferedAgentRun();\n state.inputQueue.push({\n initialEvents: observerEvents,\n preUserRuntimeInputs: [],\n run,\n runtimeInput: createRuntimeInputState([queuedRuntimeInput]),\n });\n startSessionQueueDrain(run, state.drain);\n return run;\n}\n\nexport function startSessionQueueDrain(\n run: BufferedAgentRun,\n drain: () => Promise<void>\n): void {\n drain().catch((error: unknown) => {\n run.emit({ type: \"turn-error\", message: errorMessage(error) });\n run.close();\n });\n}\n\nfunction cloneObserverEvents(events: readonly AgentEvent[]): AgentEvent[] {\n return events.map((event) => structuredClone(event));\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-notification.js","names":[],"sources":["../../src/session/session-notification.ts"],"sourcesContent":["import type { AgentEvent } from \"./events\";\nimport type { AgentInput } from \"./input\";\nimport { attachInputMeta } from \"./input-meta\";\nimport { normalizeAgentInput } from \"./input-normalization\";\nimport { type AgentRun, BufferedAgentRun } from \"./run\";\nimport {\n createRuntimeInputState,\n type QueuedInput,\n type QueuedRuntimeInput,\n queueRuntimeInput,\n type RuntimeInputState,\n} from \"./runtime-input\";\nimport { errorMessage } from \"./session-errors\";\n\nexport interface NotifyOptions {\n readonly deferWhenUnobserved?: boolean;\n readonly observerEvents?: readonly AgentEvent[];\n}\n\ninterface QueueSessionNotificationOptions {\n readonly activeRun: BufferedAgentRun | undefined;\n readonly activeRuntimeInput: RuntimeInputState | undefined;\n readonly drain: () => Promise<void>;\n readonly inputQueue: QueuedInput[];\n readonly pendingRuntimeInputs: QueuedRuntimeInput[];\n}\n\nexport function queueSessionNotification(\n input: AgentInput,\n options: NotifyOptions,\n state: QueueSessionNotificationOptions\n): AgentRun {\n const queuedRuntimeInput: QueuedRuntimeInput = {\n input: attachInputMeta(normalizeAgentInput(input), { source: \"notify\" }),\n placement: \"turn-start\",\n };\n const observerEvents = cloneObserverEvents(options.observerEvents ?? []);\n const queuedTurn = state.inputQueue[0];\n if (queuedTurn) {\n queuedTurn.initialEvents.push(...observerEvents);\n queuedTurn.preUserRuntimeInputs.push(queuedRuntimeInput);\n return queuedTurn.run;\n }\n\n const activeRun = state.activeRun;\n const runtimeInput = state.activeRuntimeInput;\n if (runtimeInput && activeRun && !runtimeInput.closedReason) {\n queueRuntimeInput(runtimeInput, {\n input: structuredClone(queuedRuntimeInput.input),\n placement: \"step-end\",\n });\n return activeRun;\n }\n\n if (options.deferWhenUnobserved === true) {\n state.pendingRuntimeInputs.push(queuedRuntimeInput);\n const deferredRun = new BufferedAgentRun();\n deferredRun.close();\n return deferredRun;\n }\n\n const run = new BufferedAgentRun();\n state.inputQueue.push({\n initialEvents: observerEvents,\n preUserRuntimeInputs: [],\n run,\n runtimeInput: createRuntimeInputState([queuedRuntimeInput]),\n });\n startSessionQueueDrain(run, state.drain);\n return run;\n}\n\nexport function startSessionQueueDrain(\n run: BufferedAgentRun,\n drain: () => Promise<void>\n): void {\n drain().catch((error: unknown) => {\n run.emit({ type: \"turn-error\", message: errorMessage(error) });\n run.close();\n });\n}\n\nfunction cloneObserverEvents(events: readonly AgentEvent[]): AgentEvent[] {\n return events.map((event) => structuredClone(event));\n}\n"],"mappings":";;;;;;AA2BA,SAAgB,yBACd,OACA,SACA,OACU;CACV,MAAM,qBAAyC;EAC7C,OAAO,gBAAgB,oBAAoB,KAAK,GAAG,EAAE,QAAQ,SAAS,CAAC;EACvE,WAAW;CACb;CACA,MAAM,iBAAiB,oBAAoB,QAAQ,kBAAkB,CAAC,CAAC;CACvE,MAAM,aAAa,MAAM,WAAW;CACpC,IAAI,YAAY;EACd,WAAW,cAAc,KAAK,GAAG,cAAc;EAC/C,WAAW,qBAAqB,KAAK,kBAAkB;EACvD,OAAO,WAAW;CACpB;CAEA,MAAM,YAAY,MAAM;CACxB,MAAM,eAAe,MAAM;CAC3B,IAAI,gBAAgB,aAAa,CAAC,aAAa,cAAc;EAC3D,kBAAkB,cAAc;GAC9B,OAAO,gBAAgB,mBAAmB,KAAK;GAC/C,WAAW;EACb,CAAC;EACD,OAAO;CACT;CAEA,IAAI,QAAQ,wBAAwB,MAAM;EACxC,MAAM,qBAAqB,KAAK,kBAAkB;EAClD,MAAM,cAAc,IAAI,iBAAiB;EACzC,YAAY,MAAM;EAClB,OAAO;CACT;CAEA,MAAM,MAAM,IAAI,iBAAiB;CACjC,MAAM,WAAW,KAAK;EACpB,eAAe;EACf,sBAAsB,CAAC;EACvB;EACA,cAAc,wBAAwB,CAAC,kBAAkB,CAAC;CAC5D,CAAC;CACD,uBAAuB,KAAK,MAAM,KAAK;CACvC,OAAO;AACT;AAEA,SAAgB,uBACd,KACA,OACM;CACN,MAAM,EAAE,OAAO,UAAmB;EAChC,IAAI,KAAK;GAAE,MAAM;GAAc,SAAS,aAAa,KAAK;EAAE,CAAC;EAC7D,IAAI,MAAM;CACZ,CAAC;AACH;AAEA,SAAS,oBAAoB,QAA6C;CACxE,OAAO,OAAO,KAAK,UAAU,gBAAgB,KAAK,CAAC;AACrD"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
import { shiftRuntimeInput } from "./runtime-input.js";
|
|
2
|
+
import { emitRuntimeInputEvent } from "./runtime-input-emit.js";
|
|
2
3
|
//#region src/session/session-runtime-drain.ts
|
|
3
|
-
async function drainRuntimeInput({
|
|
4
|
+
async function drainRuntimeInput({ events, placement, run, runtimeInput, state }) {
|
|
4
5
|
let added = false;
|
|
5
6
|
let next = shiftRuntimeInput(runtimeInput, placement);
|
|
6
7
|
while (next) {
|
|
7
|
-
added = true;
|
|
8
|
-
await emit({
|
|
9
|
-
type: "runtime-input",
|
|
10
|
-
input: next.input,
|
|
11
|
-
placement
|
|
12
|
-
});
|
|
13
|
-
state.appendUserInput(next.input);
|
|
14
|
-
await state.commit();
|
|
8
|
+
if (await emitRuntimeInputEvent(events, run, state, next)) added = true;
|
|
15
9
|
next = shiftRuntimeInput(runtimeInput, placement);
|
|
16
10
|
}
|
|
17
11
|
return added;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-runtime-drain.js","names":[],"sources":["../../src/session/session-runtime-drain.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"session-runtime-drain.js","names":[],"sources":["../../src/session/session-runtime-drain.ts"],"sourcesContent":["import type { BufferedAgentRun } from \"./run\";\nimport {\n type RuntimeInputPlacement,\n type RuntimeInputState,\n shiftRuntimeInput,\n} from \"./runtime-input\";\nimport { emitRuntimeInputEvent } from \"./runtime-input-emit\";\nimport type { SessionEventDispatcher } from \"./session-events\";\nimport type { SessionState } from \"./session-state\";\n\nexport async function drainRuntimeInput({\n events,\n placement,\n run,\n runtimeInput,\n state,\n}: {\n readonly events: SessionEventDispatcher;\n readonly placement: RuntimeInputPlacement;\n readonly run: BufferedAgentRun;\n readonly runtimeInput: RuntimeInputState;\n readonly state: SessionState;\n}): Promise<boolean> {\n let added = false;\n let next = shiftRuntimeInput(runtimeInput, placement);\n while (next) {\n if (await emitRuntimeInputEvent(events, run, state, next)) {\n added = true;\n }\n next = shiftRuntimeInput(runtimeInput, placement);\n }\n\n return added;\n}\n"],"mappings":";;;AAUA,eAAsB,kBAAkB,EACtC,QACA,WACA,KACA,cACA,SAOmB;CACnB,IAAI,QAAQ;CACZ,IAAI,OAAO,kBAAkB,cAAc,SAAS;CACpD,OAAO,MAAM;EACX,IAAI,MAAM,sBAAsB,QAAQ,KAAK,OAAO,IAAI,GACtD,QAAQ;EAEV,OAAO,kBAAkB,cAAc,SAAS;CAClD;CAEA,OAAO;AACT"}
|
|
@@ -2,6 +2,7 @@ import { ToolExecutionNeedsRecoveryError } from "../llm-tool-execution.js";
|
|
|
2
2
|
import { closeRuntimeInput, withRuntimeInputWindow } from "./runtime-input.js";
|
|
3
3
|
import { errorMessage } from "./session-errors.js";
|
|
4
4
|
import { runAgentLoop } from "../agent-loop.js";
|
|
5
|
+
import { commitPreUserRuntimeInputs, emitCommittedRuntimeInputs } from "./runtime-input-emit.js";
|
|
5
6
|
import { startSessionExecutionRun } from "./session-execution.js";
|
|
6
7
|
import { drainRuntimeInput } from "./session-runtime-drain.js";
|
|
7
8
|
import { emitTurnErrorAfterRecovery } from "./session-turn-error.js";
|
|
@@ -26,7 +27,7 @@ async function processQueuedInput({ activate, deactivateRun, events, execution,
|
|
|
26
27
|
turnId
|
|
27
28
|
});
|
|
28
29
|
for (const event of initialEvents) await events.emitRunEvent(run, event);
|
|
29
|
-
await
|
|
30
|
+
const committedPreUser = await commitPreUserRuntimeInputs(events, state, preUserRuntimeInputs);
|
|
30
31
|
if (input) {
|
|
31
32
|
state.appendUserInput(input);
|
|
32
33
|
await state.commit();
|
|
@@ -34,10 +35,11 @@ async function processQueuedInput({ activate, deactivateRun, events, execution,
|
|
|
34
35
|
await withRuntimeInputWindow(runtimeInput, "turn-start", async () => {
|
|
35
36
|
await events.emitRunBoundaryEvent(run, { type: "turn-start" });
|
|
36
37
|
});
|
|
37
|
-
await
|
|
38
|
+
await emitCommittedRuntimeInputs(events, run, committedPreUser);
|
|
38
39
|
await drainRuntimeInput({
|
|
39
|
-
|
|
40
|
+
events,
|
|
40
41
|
placement: "turn-start",
|
|
42
|
+
run,
|
|
41
43
|
runtimeInput,
|
|
42
44
|
state
|
|
43
45
|
});
|
|
@@ -86,12 +88,6 @@ function executionStatusForResult(result) {
|
|
|
86
88
|
function executionStatusForError(error) {
|
|
87
89
|
return error instanceof ToolExecutionNeedsRecoveryError ? "needs-recovery" : "error";
|
|
88
90
|
}
|
|
89
|
-
async function appendRuntimeInputsToHistory(state, runtimeInputs) {
|
|
90
|
-
for (const runtimeInput of runtimeInputs) {
|
|
91
|
-
state.appendUserInput(runtimeInput.input);
|
|
92
|
-
await state.commit();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
91
|
async function closeSuccessfulTurn({ deactivateRun, events, result, run, runtimeInput }) {
|
|
96
92
|
const terminalEvent = result === "aborted" ? "turn-abort" : "turn-end";
|
|
97
93
|
closeRuntimeInput(runtimeInput, terminalEvent);
|
|
@@ -106,13 +102,6 @@ async function closeSuccessfulTurn({ deactivateRun, events, result, run, runtime
|
|
|
106
102
|
closeRuntimeInput(runtimeInput, "turn-error");
|
|
107
103
|
}
|
|
108
104
|
}
|
|
109
|
-
async function emitPreUserRuntimeInputs(events, run, runtimeInputs) {
|
|
110
|
-
for (const runtimeInput of runtimeInputs) await events.emitRunEvent(run, {
|
|
111
|
-
input: runtimeInput.input,
|
|
112
|
-
placement: runtimeInput.placement,
|
|
113
|
-
type: "runtime-input"
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
105
|
async function emitTurnEvent({ event, events, run, runtimeInput, state }) {
|
|
117
106
|
if (event.type !== "step-start" && event.type !== "step-end") {
|
|
118
107
|
await events.emitRunEvent(run, event);
|
|
@@ -122,8 +111,9 @@ async function emitTurnEvent({ event, events, run, runtimeInput, state }) {
|
|
|
122
111
|
await events.emitRunBoundaryEvent(run, event);
|
|
123
112
|
});
|
|
124
113
|
const runtimeInputAdded = await drainRuntimeInput({
|
|
125
|
-
|
|
114
|
+
events,
|
|
126
115
|
placement: event.type,
|
|
116
|
+
run,
|
|
127
117
|
runtimeInput,
|
|
128
118
|
state
|
|
129
119
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-processor.js","names":[],"sources":["../../src/session/session-turn-processor.ts"],"sourcesContent":["import { runAgentLoop } from \"../agent-loop\";\nimport type { RuntimeLlm } from \"../llm\";\nimport { ToolExecutionNeedsRecoveryError } from \"../llm-tool-execution\";\nimport type { AgentEvent } from \"./events\";\nimport type { BufferedAgentRun } from \"./run\";\nimport {\n closeRuntimeInput,\n type QueuedInput,\n type
|
|
1
|
+
{"version":3,"file":"session-turn-processor.js","names":[],"sources":["../../src/session/session-turn-processor.ts"],"sourcesContent":["import { runAgentLoop } from \"../agent-loop\";\nimport type { RuntimeLlm } from \"../llm\";\nimport { ToolExecutionNeedsRecoveryError } from \"../llm-tool-execution\";\nimport type { AgentEvent } from \"./events\";\nimport type { BufferedAgentRun } from \"./run\";\nimport {\n closeRuntimeInput,\n type QueuedInput,\n type RuntimeInputState,\n withRuntimeInputWindow,\n} from \"./runtime-input\";\nimport {\n commitPreUserRuntimeInputs,\n emitCommittedRuntimeInputs,\n} from \"./runtime-input-emit\";\nimport { errorMessage } from \"./session-errors\";\nimport type { SessionEventDispatcher } from \"./session-events\";\nimport {\n type SessionExecutionOptions,\n type SessionExecutionRun,\n type SessionExecutionTerminalStatus,\n startSessionExecutionRun,\n} from \"./session-execution\";\nimport { drainRuntimeInput } from \"./session-runtime-drain\";\n\nimport type { SessionState } from \"./session-state\";\nimport { emitTurnErrorAfterRecovery } from \"./session-turn-error\";\n\ninterface ActiveTurn {\n readonly abort: AbortController;\n readonly run: BufferedAgentRun;\n readonly runtimeInput: RuntimeInputState;\n readonly turnId: string;\n}\n\ninterface ProcessQueuedInputOptions {\n readonly activate: (turn: ActiveTurn) => void;\n readonly deactivateRun: () => void;\n readonly events: SessionEventDispatcher;\n readonly execution: SessionExecutionOptions;\n readonly item: QueuedInput;\n readonly llm: RuntimeLlm;\n readonly release: () => void;\n readonly sessionKey: string;\n readonly state: SessionState;\n}\n\nexport async function processQueuedInput({\n activate,\n deactivateRun,\n events,\n execution,\n item,\n llm,\n release,\n sessionKey,\n state,\n}: ProcessQueuedInputOptions): Promise<void> {\n const activeAbort = new AbortController();\n const { initialEvents, input, preUserRuntimeInputs, run, runtimeInput } =\n item;\n const turnId = crypto.randomUUID();\n activate({\n abort: activeAbort,\n run,\n runtimeInput,\n turnId,\n });\n const historySnapshot = state.modelSnapshot();\n let executionRun: SessionExecutionRun | undefined;\n\n try {\n executionRun = await startSessionExecutionRun({\n executionHost: execution.executionHost,\n sessionKey,\n state,\n turnId,\n });\n for (const event of initialEvents) {\n await events.emitRunEvent(run, event);\n }\n const committedPreUser = await commitPreUserRuntimeInputs(\n events,\n state,\n preUserRuntimeInputs\n );\n if (input) {\n state.appendUserInput(input);\n await state.commit();\n }\n await withRuntimeInputWindow(runtimeInput, \"turn-start\", async () => {\n await events.emitRunBoundaryEvent(run, { type: \"turn-start\" });\n });\n await emitCommittedRuntimeInputs(events, run, committedPreUser);\n await drainRuntimeInput({\n events,\n placement: \"turn-start\",\n run,\n runtimeInput,\n state,\n });\n\n const result = await runAgentLoop({\n emit: async (event) =>\n emitTurnEvent({\n event,\n events,\n run,\n runtimeInput,\n state,\n }),\n history: state.history,\n llm,\n captureObserverEvents: (callback) =>\n events.captureObserverEvents(run, callback),\n signal: activeAbort.signal,\n toolExecution: executionRun?.toolExecution,\n });\n\n await state.commit();\n await executionRun?.complete(executionStatusForResult(result));\n await closeSuccessfulTurn({\n deactivateRun,\n events,\n result,\n run,\n runtimeInput,\n });\n } catch (error) {\n const turnError = error instanceof Error ? error : new Error(String(error));\n await executionRun?.complete(executionStatusForError(turnError));\n await emitTurnErrorAfterRecovery({\n error: turnError,\n historySnapshot,\n run,\n runtimeInput,\n state,\n });\n } finally {\n closeRuntimeInput(runtimeInput);\n release();\n run.close(undefined, runtimeInput.closedReason);\n }\n}\n\nfunction executionStatusForResult(\n result: \"aborted\" | \"completed\"\n): SessionExecutionTerminalStatus {\n return result === \"aborted\" ? \"cancelled\" : \"completed\";\n}\n\nfunction executionStatusForError(error: Error): SessionExecutionTerminalStatus {\n return error instanceof ToolExecutionNeedsRecoveryError\n ? \"needs-recovery\"\n : \"error\";\n}\n\nasync function closeSuccessfulTurn({\n deactivateRun,\n events,\n result,\n run,\n runtimeInput,\n}: {\n readonly deactivateRun: () => void;\n readonly events: SessionEventDispatcher;\n readonly result: \"aborted\" | \"completed\";\n readonly run: BufferedAgentRun;\n readonly runtimeInput: RuntimeInputState;\n}): Promise<void> {\n const terminalEvent = result === \"aborted\" ? \"turn-abort\" : \"turn-end\";\n closeRuntimeInput(runtimeInput, terminalEvent);\n deactivateRun();\n try {\n await events.emitRunEvent(run, { type: terminalEvent });\n } catch (terminalError) {\n run.emit({ type: \"turn-error\", message: errorMessage(terminalError) });\n closeRuntimeInput(runtimeInput, \"turn-error\");\n }\n}\n\nasync function emitTurnEvent({\n event,\n events,\n run,\n runtimeInput,\n state,\n}: {\n readonly event: AgentEvent;\n readonly events: SessionEventDispatcher;\n readonly run: BufferedAgentRun;\n readonly runtimeInput: RuntimeInputState;\n readonly state: SessionState;\n}): Promise<{ readonly runtimeInputAdded: boolean } | undefined> {\n if (event.type !== \"step-start\" && event.type !== \"step-end\") {\n await events.emitRunEvent(run, event);\n return;\n }\n\n await withRuntimeInputWindow(runtimeInput, event.type, async () => {\n await events.emitRunBoundaryEvent(run, event);\n });\n const runtimeInputAdded = await drainRuntimeInput({\n events,\n placement: event.type,\n run,\n runtimeInput,\n state,\n });\n return event.type === \"step-end\" ? { runtimeInputAdded } : undefined;\n}\n"],"mappings":";;;;;;;;;AA+CA,eAAsB,mBAAmB,EACvC,UACA,eACA,QACA,WACA,MACA,KACA,SACA,YACA,SAC2C;CAC3C,MAAM,cAAc,IAAI,gBAAgB;CACxC,MAAM,EAAE,eAAe,OAAO,sBAAsB,KAAK,iBACvD;CACF,MAAM,SAAS,OAAO,WAAW;CACjC,SAAS;EACP,OAAO;EACP;EACA;EACA;CACF,CAAC;CACD,MAAM,kBAAkB,MAAM,cAAc;CAC5C,IAAI;CAEJ,IAAI;EACF,eAAe,MAAM,yBAAyB;GAC5C,eAAe,UAAU;GACzB;GACA;GACA;EACF,CAAC;EACD,KAAK,MAAM,SAAS,eAClB,MAAM,OAAO,aAAa,KAAK,KAAK;EAEtC,MAAM,mBAAmB,MAAM,2BAC7B,QACA,OACA,oBACF;EACA,IAAI,OAAO;GACT,MAAM,gBAAgB,KAAK;GAC3B,MAAM,MAAM,OAAO;EACrB;EACA,MAAM,uBAAuB,cAAc,cAAc,YAAY;GACnE,MAAM,OAAO,qBAAqB,KAAK,EAAE,MAAM,aAAa,CAAC;EAC/D,CAAC;EACD,MAAM,2BAA2B,QAAQ,KAAK,gBAAgB;EAC9D,MAAM,kBAAkB;GACtB;GACA,WAAW;GACX;GACA;GACA;EACF,CAAC;EAED,MAAM,SAAS,MAAM,aAAa;GAChC,MAAM,OAAO,UACX,cAAc;IACZ;IACA;IACA;IACA;IACA;GACF,CAAC;GACH,SAAS,MAAM;GACf;GACA,wBAAwB,aACtB,OAAO,sBAAsB,KAAK,QAAQ;GAC5C,QAAQ,YAAY;GACpB,eAAe,cAAc;EAC/B,CAAC;EAED,MAAM,MAAM,OAAO;EACnB,MAAM,cAAc,SAAS,yBAAyB,MAAM,CAAC;EAC7D,MAAM,oBAAoB;GACxB;GACA;GACA;GACA;GACA;EACF,CAAC;CACH,SAAS,OAAO;EACd,MAAM,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;EAC1E,MAAM,cAAc,SAAS,wBAAwB,SAAS,CAAC;EAC/D,MAAM,2BAA2B;GAC/B,OAAO;GACP;GACA;GACA;GACA;EACF,CAAC;CACH,UAAU;EACR,kBAAkB,YAAY;EAC9B,QAAQ;EACR,IAAI,MAAM,KAAA,GAAW,aAAa,YAAY;CAChD;AACF;AAEA,SAAS,yBACP,QACgC;CAChC,OAAO,WAAW,YAAY,cAAc;AAC9C;AAEA,SAAS,wBAAwB,OAA8C;CAC7E,OAAO,iBAAiB,kCACpB,mBACA;AACN;AAEA,eAAe,oBAAoB,EACjC,eACA,QACA,QACA,KACA,gBAOgB;CAChB,MAAM,gBAAgB,WAAW,YAAY,eAAe;CAC5D,kBAAkB,cAAc,aAAa;CAC7C,cAAc;CACd,IAAI;EACF,MAAM,OAAO,aAAa,KAAK,EAAE,MAAM,cAAc,CAAC;CACxD,SAAS,eAAe;EACtB,IAAI,KAAK;GAAE,MAAM;GAAc,SAAS,aAAa,aAAa;EAAE,CAAC;EACrE,kBAAkB,cAAc,YAAY;CAC9C;AACF;AAEA,eAAe,cAAc,EAC3B,OACA,QACA,KACA,cACA,SAO+D;CAC/D,IAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,YAAY;EAC5D,MAAM,OAAO,aAAa,KAAK,KAAK;EACpC;CACF;CAEA,MAAM,uBAAuB,cAAc,MAAM,MAAM,YAAY;EACjE,MAAM,OAAO,qBAAqB,KAAK,KAAK;CAC9C,CAAC;CACD,MAAM,oBAAoB,MAAM,kBAAkB;EAChD;EACA,WAAW,MAAM;EACjB;EACA;EACA;CACF,CAAC;CACD,OAAO,MAAM,SAAS,aAAa,EAAE,kBAAkB,IAAI,KAAA;AAC7D"}
|
package/dist/session/session.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { attachInputMeta, userInputFromEvent } from "./input-meta.js";
|
|
2
2
|
import { normalizeAgentInput } from "./input-normalization.js";
|
|
3
|
+
import { BufferedAgentRun } from "./run.js";
|
|
3
4
|
import { addSteeringInput, createRuntimeInputState, queueRuntimeInput } from "./runtime-input.js";
|
|
4
5
|
import { sessionKilledError, sessionTerminalError } from "./session-errors.js";
|
|
5
6
|
import { SessionEventDispatcher } from "./session-events.js";
|
|
@@ -40,12 +41,18 @@ var AgentSession = class {
|
|
|
40
41
|
await this.#state.ensureLoaded();
|
|
41
42
|
if (this.#killed || this.#deletePromise) throw sessionTerminalError(this.#killed);
|
|
42
43
|
const runtimeInput = createRuntimeInputState(this.#pendingRuntimeInputs.splice(0));
|
|
43
|
-
const
|
|
44
|
+
const normalized = normalizeAgentInput(input);
|
|
45
|
+
const acceptedInput = normalized.meta === void 0 ? attachInputMeta(normalized, { source: "send" }) : normalized;
|
|
44
46
|
const run = new BufferedAgentRun();
|
|
45
|
-
await this.#events.emitRunEvent(run, acceptedInput);
|
|
47
|
+
const emitted = await this.#events.emitRunEvent(run, acceptedInput);
|
|
48
|
+
if (emitted === "handled") {
|
|
49
|
+
run.close();
|
|
50
|
+
return run;
|
|
51
|
+
}
|
|
52
|
+
const queuedInput = userInputFromEvent(emitted.type === "user-text" || emitted.type === "user-message" ? emitted : acceptedInput);
|
|
46
53
|
this.#inputQueue.push({
|
|
47
54
|
initialEvents: [],
|
|
48
|
-
input: structuredClone(
|
|
55
|
+
input: structuredClone(queuedInput),
|
|
49
56
|
preUserRuntimeInputs: [],
|
|
50
57
|
run,
|
|
51
58
|
runtimeInput
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["#events","#execution","#inputQueue","#llm","#pendingRuntimeInputs","#sessionKey","#state","#activeAbort","#killed","#deletePromise","#drainInputQueue","#activeRun","#activeRuntimeInput","#activeTurnId","#enqueuePendingRuntimeInput","#runToCloseOnKill","#running"],"sources":["../../src/session/session.ts"],"sourcesContent":["import type { RuntimeLlm } from \"../llm\";\nimport type { AgentPlugin } from \"../plugins\";\nimport type { AgentEvent } from \"./events\";\nimport type { AgentInput, UserInput } from \"./input\";\nimport { normalizeAgentInput } from \"./input-normalization\";\nimport { type AgentRun, BufferedAgentRun } from \"./run\";\nimport {\n addSteeringInput,\n createRuntimeInputState,\n type QueuedInput,\n type QueuedRuntimeInput,\n queueRuntimeInput,\n type RuntimeInputPlacement,\n type RuntimeInputState,\n} from \"./runtime-input\";\nimport { sessionKilledError, sessionTerminalError } from \"./session-errors\";\nimport { SessionEventDispatcher } from \"./session-events\";\nimport type { SessionExecutionOptions } from \"./session-execution\";\nimport { closeKilledRuntimeInputs } from \"./session-kill\";\nimport {\n type NotifyOptions,\n queueSessionNotification,\n startSessionQueueDrain,\n} from \"./session-notification\";\nimport { type SessionPersistenceOptions, SessionState } from \"./session-state\";\nimport { processQueuedInput } from \"./session-turn-processor\";\n\nexport type { AgentInput, SessionInput, UserInput } from \"./input\";\nexport type { AgentRun } from \"./run\";\nexport type { NotifyOptions } from \"./session-notification\";\n\nexport class AgentSession {\n readonly #events: SessionEventDispatcher;\n readonly #execution: SessionExecutionOptions;\n readonly #inputQueue: QueuedInput[] = [];\n readonly #llm: RuntimeLlm;\n readonly #pendingRuntimeInputs: QueuedRuntimeInput[] = [];\n readonly #sessionKey: string;\n readonly #state: SessionState;\n #activeAbort?: AbortController;\n #activeRun?: BufferedAgentRun;\n #activeRuntimeInput?: RuntimeInputState;\n #activeTurnId?: string;\n #deletePromise?: Promise<void>;\n #killed = false;\n #running = false;\n #runToCloseOnKill?: BufferedAgentRun;\n\n constructor(\n llm: RuntimeLlm,\n persistence: SessionPersistenceOptions,\n plugins: readonly AgentPlugin[] = [],\n execution: SessionExecutionOptions = {}\n ) {\n this.#llm = llm;\n this.#execution = execution;\n this.#sessionKey = persistence.key;\n this.#state = new SessionState(persistence);\n this.#events = new SessionEventDispatcher({\n history: () => this.#state.modelSnapshot(),\n plugins,\n signal: () => this.#activeAbort?.signal,\n });\n }\n\n async send(input: AgentInput): Promise<AgentRun> {\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n await this.#state.ensureLoaded();\n\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n const runtimeInput = createRuntimeInputState(\n this.#pendingRuntimeInputs.splice(0)\n );\n const acceptedInput = normalizeAgentInput(input);\n const run = new BufferedAgentRun();\n await this.#events.emitRunEvent(run, acceptedInput);\n this.#inputQueue.push({\n initialEvents: [],\n input: structuredClone(acceptedInput),\n preUserRuntimeInputs: [],\n run,\n runtimeInput,\n });\n startSessionQueueDrain(run, () => this.#drainInputQueue());\n return run;\n }\n\n async notify(\n input: AgentInput,\n options: NotifyOptions = {}\n ): Promise<AgentRun> {\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n await this.#state.ensureLoaded();\n\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n return queueSessionNotification(input, options, {\n activeRun: this.#activeRun,\n activeRuntimeInput: this.#activeRuntimeInput,\n drain: () => this.#drainInputQueue(),\n inputQueue: this.#inputQueue,\n pendingRuntimeInputs: this.#pendingRuntimeInputs,\n });\n }\n\n async steer(input: AgentInput): Promise<AgentRun> {\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n const runtimeInput = this.#activeRuntimeInput;\n const run = this.#activeRun;\n if (!(runtimeInput && run)) {\n return this.send(input);\n }\n\n await addSteeringInput(runtimeInput, input);\n return run;\n }\n\n interrupt(): void {\n this.#activeAbort?.abort();\n }\n\n currentTurnId(): string | undefined {\n return this.#activeTurnId;\n }\n\n delete(): Promise<void> {\n if (!this.#deletePromise) {\n this.kill();\n this.#deletePromise = this.#state.delete().catch((error: unknown) => {\n this.#deletePromise = undefined;\n throw error;\n });\n }\n return this.#deletePromise;\n }\n\n enqueueRuntimeInput(\n input: UserInput,\n placement: RuntimeInputPlacement = \"turn-start\"\n ): void {\n if (this.#killed) {\n return;\n }\n\n const runtimeInput = this.#activeRuntimeInput;\n if (runtimeInput && !runtimeInput.closedReason) {\n if (placement === \"turn-start\" && runtimeInput.placement !== placement) {\n this.#enqueuePendingRuntimeInput({ input, placement });\n return;\n }\n\n queueRuntimeInput(runtimeInput, { input, placement });\n return;\n }\n\n this.#enqueuePendingRuntimeInput({ input, placement });\n }\n\n emitObserverEvent(event: AgentEvent): Promise<void> {\n return this.#events.emitObserverEvent(this.#activeRun, event);\n }\n\n #enqueuePendingRuntimeInput(input: QueuedRuntimeInput): void {\n const queuedTurn = this.#inputQueue[0];\n if (input.placement === \"turn-start\" && queuedTurn) {\n queueRuntimeInput(queuedTurn.runtimeInput, input);\n return;\n }\n\n this.#pendingRuntimeInputs.push(input);\n }\n\n kill(): void {\n if (this.#killed) {\n return;\n }\n\n this.#killed = true;\n const killedError = sessionKilledError();\n this.#pendingRuntimeInputs.length = 0;\n this.#activeAbort?.abort();\n closeKilledRuntimeInputs({\n activeRuntimeInput: this.#activeRuntimeInput,\n inputQueue: this.#inputQueue,\n message: killedError.message,\n runToClose: this.#runToCloseOnKill ?? this.#activeRun,\n });\n }\n\n async #drainInputQueue(): Promise<void> {\n if (this.#running) {\n return;\n }\n\n this.#running = true;\n try {\n while (!this.#killed && this.#inputQueue.length > 0) {\n const item = this.#inputQueue.shift();\n if (item) {\n await processQueuedInput({\n activate: ({ abort, run, runtimeInput, turnId }) => {\n this.#activeAbort = abort;\n this.#activeRun = run;\n this.#activeRuntimeInput = runtimeInput;\n this.#activeTurnId = turnId;\n this.#runToCloseOnKill = run;\n },\n deactivateRun: () => {\n this.#activeRun = undefined;\n this.#activeRuntimeInput = undefined;\n },\n events: this.#events,\n execution: this.#execution,\n item,\n llm: this.#llm,\n release: () => {\n this.#activeAbort = undefined;\n this.#activeRun = undefined;\n this.#activeRuntimeInput = undefined;\n this.#activeTurnId = undefined;\n this.#runToCloseOnKill = undefined;\n },\n sessionKey: this.#sessionKey,\n state: this.#state,\n });\n }\n }\n } finally {\n this.#running = false;\n }\n }\n}\n"],"mappings":";;;;;;;;;;AA+BA,IAAa,eAAb,MAA0B;CACxB;CACA;CACA,cAAsC,CAAC;CACvC;CACA,wBAAuD,CAAC;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACA,UAAU;CACV,WAAW;CACX;CAEA,YACE,KACA,aACA,UAAkC,CAAC,GACnC,YAAqC,CAAC,GACtC;EACA,KAAKG,OAAO;EACZ,KAAKF,aAAa;EAClB,KAAKI,cAAc,YAAY;EAC/B,KAAKC,SAAS,IAAI,aAAa,WAAW;EAC1C,KAAKN,UAAU,IAAI,uBAAuB;GACxC,eAAe,KAAKM,OAAO,cAAc;GACzC;GACA,cAAc,KAAKC,cAAc;EACnC,CAAC;CACH;CAEA,MAAM,KAAK,OAAsC;EAC/C,IAAI,KAAKC,WAAW,KAAKC,gBACvB,MAAM,qBAAqB,KAAKD,OAAO;EAGzC,MAAM,KAAKF,OAAO,aAAa;EAE/B,IAAI,KAAKE,WAAW,KAAKC,gBACvB,MAAM,qBAAqB,KAAKD,OAAO;EAGzC,MAAM,eAAe,wBACnB,KAAKJ,sBAAsB,OAAO,CAAC,CACrC;EACA,MAAM,gBAAgB,oBAAoB,KAAK;EAC/C,MAAM,MAAM,IAAI,iBAAiB;EACjC,MAAM,KAAKJ,QAAQ,aAAa,KAAK,aAAa;EAClD,KAAKE,YAAY,KAAK;GACpB,eAAe,CAAC;GAChB,OAAO,gBAAgB,aAAa;GACpC,sBAAsB,CAAC;GACvB;GACA;EACF,CAAC;EACD,uBAAuB,WAAW,KAAKQ,iBAAiB,CAAC;EACzD,OAAO;CACT;CAEA,MAAM,OACJ,OACA,UAAyB,CAAC,GACP;EACnB,IAAI,KAAKF,WAAW,KAAKC,gBACvB,MAAM,qBAAqB,KAAKD,OAAO;EAGzC,MAAM,KAAKF,OAAO,aAAa;EAE/B,IAAI,KAAKE,WAAW,KAAKC,gBACvB,MAAM,qBAAqB,KAAKD,OAAO;EAGzC,OAAO,yBAAyB,OAAO,SAAS;GAC9C,WAAW,KAAKG;GAChB,oBAAoB,KAAKC;GACzB,aAAa,KAAKF,iBAAiB;GACnC,YAAY,KAAKR;GACjB,sBAAsB,KAAKE;EAC7B,CAAC;CACH;CAEA,MAAM,MAAM,OAAsC;EAChD,IAAI,KAAKI,WAAW,KAAKC,gBACvB,MAAM,qBAAqB,KAAKD,OAAO;EAGzC,MAAM,eAAe,KAAKI;EAC1B,MAAM,MAAM,KAAKD;EACjB,IAAI,EAAE,gBAAgB,MACpB,OAAO,KAAK,KAAK,KAAK;EAGxB,MAAM,iBAAiB,cAAc,KAAK;EAC1C,OAAO;CACT;CAEA,YAAkB;EAChB,KAAKJ,cAAc,MAAM;CAC3B;CAEA,gBAAoC;EAClC,OAAO,KAAKM;CACd;CAEA,SAAwB;EACtB,IAAI,CAAC,KAAKJ,gBAAgB;GACxB,KAAK,KAAK;GACV,KAAKA,iBAAiB,KAAKH,OAAO,OAAO,EAAE,OAAO,UAAmB;IACnE,KAAKG,iBAAiB,KAAA;IACtB,MAAM;GACR,CAAC;EACH;EACA,OAAO,KAAKA;CACd;CAEA,oBACE,OACA,YAAmC,cAC7B;EACN,IAAI,KAAKD,SACP;EAGF,MAAM,eAAe,KAAKI;EAC1B,IAAI,gBAAgB,CAAC,aAAa,cAAc;GAC9C,IAAI,cAAc,gBAAgB,aAAa,cAAc,WAAW;IACtE,KAAKE,4BAA4B;KAAE;KAAO;IAAU,CAAC;IACrD;GACF;GAEA,kBAAkB,cAAc;IAAE;IAAO;GAAU,CAAC;GACpD;EACF;EAEA,KAAKA,4BAA4B;GAAE;GAAO;EAAU,CAAC;CACvD;CAEA,kBAAkB,OAAkC;EAClD,OAAO,KAAKd,QAAQ,kBAAkB,KAAKW,YAAY,KAAK;CAC9D;CAEA,4BAA4B,OAAiC;EAC3D,MAAM,aAAa,KAAKT,YAAY;EACpC,IAAI,MAAM,cAAc,gBAAgB,YAAY;GAClD,kBAAkB,WAAW,cAAc,KAAK;GAChD;EACF;EAEA,KAAKE,sBAAsB,KAAK,KAAK;CACvC;CAEA,OAAa;EACX,IAAI,KAAKI,SACP;EAGF,KAAKA,UAAU;EACf,MAAM,cAAc,mBAAmB;EACvC,KAAKJ,sBAAsB,SAAS;EACpC,KAAKG,cAAc,MAAM;EACzB,yBAAyB;GACvB,oBAAoB,KAAKK;GACzB,YAAY,KAAKV;GACjB,SAAS,YAAY;GACrB,YAAY,KAAKa,qBAAqB,KAAKJ;EAC7C,CAAC;CACH;CAEA,MAAMD,mBAAkC;EACtC,IAAI,KAAKM,UACP;EAGF,KAAKA,WAAW;EAChB,IAAI;GACF,OAAO,CAAC,KAAKR,WAAW,KAAKN,YAAY,SAAS,GAAG;IACnD,MAAM,OAAO,KAAKA,YAAY,MAAM;IACpC,IAAI,MACF,MAAM,mBAAmB;KACvB,WAAW,EAAE,OAAO,KAAK,cAAc,aAAa;MAClD,KAAKK,eAAe;MACpB,KAAKI,aAAa;MAClB,KAAKC,sBAAsB;MAC3B,KAAKC,gBAAgB;MACrB,KAAKE,oBAAoB;KAC3B;KACA,qBAAqB;MACnB,KAAKJ,aAAa,KAAA;MAClB,KAAKC,sBAAsB,KAAA;KAC7B;KACA,QAAQ,KAAKZ;KACb,WAAW,KAAKC;KAChB;KACA,KAAK,KAAKE;KACV,eAAe;MACb,KAAKI,eAAe,KAAA;MACpB,KAAKI,aAAa,KAAA;MAClB,KAAKC,sBAAsB,KAAA;MAC3B,KAAKC,gBAAgB,KAAA;MACrB,KAAKE,oBAAoB,KAAA;KAC3B;KACA,YAAY,KAAKV;KACjB,OAAO,KAAKC;IACd,CAAC;GAEL;EACF,UAAU;GACR,KAAKU,WAAW;EAClB;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["#events","#execution","#inputQueue","#llm","#pendingRuntimeInputs","#sessionKey","#state","#activeAbort","#killed","#deletePromise","#drainInputQueue","#activeRun","#activeRuntimeInput","#activeTurnId","#enqueuePendingRuntimeInput","#runToCloseOnKill","#running"],"sources":["../../src/session/session.ts"],"sourcesContent":["import type { RuntimeLlm } from \"../llm\";\nimport type { AgentPlugin } from \"../plugins\";\nimport type { AgentEvent } from \"./events\";\nimport type { AgentInput, UserInput } from \"./input\";\nimport { attachInputMeta, userInputFromEvent } from \"./input-meta\";\nimport { normalizeAgentInput } from \"./input-normalization\";\nimport { type AgentRun, BufferedAgentRun } from \"./run\";\nimport {\n addSteeringInput,\n createRuntimeInputState,\n type QueuedInput,\n type QueuedRuntimeInput,\n queueRuntimeInput,\n type RuntimeInputPlacement,\n type RuntimeInputState,\n} from \"./runtime-input\";\nimport { sessionKilledError, sessionTerminalError } from \"./session-errors\";\nimport { SessionEventDispatcher } from \"./session-events\";\nimport type { SessionExecutionOptions } from \"./session-execution\";\nimport { closeKilledRuntimeInputs } from \"./session-kill\";\nimport {\n type NotifyOptions,\n queueSessionNotification,\n startSessionQueueDrain,\n} from \"./session-notification\";\nimport { type SessionPersistenceOptions, SessionState } from \"./session-state\";\nimport { processQueuedInput } from \"./session-turn-processor\";\n\nexport type { AgentInput, SessionInput, UserInput } from \"./input\";\nexport type { AgentRun } from \"./run\";\nexport type { NotifyOptions } from \"./session-notification\";\n\nexport class AgentSession {\n readonly #events: SessionEventDispatcher;\n readonly #execution: SessionExecutionOptions;\n readonly #inputQueue: QueuedInput[] = [];\n readonly #llm: RuntimeLlm;\n readonly #pendingRuntimeInputs: QueuedRuntimeInput[] = [];\n readonly #sessionKey: string;\n readonly #state: SessionState;\n #activeAbort?: AbortController;\n #activeRun?: BufferedAgentRun;\n #activeRuntimeInput?: RuntimeInputState;\n #activeTurnId?: string;\n #deletePromise?: Promise<void>;\n #killed = false;\n #running = false;\n #runToCloseOnKill?: BufferedAgentRun;\n\n constructor(\n llm: RuntimeLlm,\n persistence: SessionPersistenceOptions,\n plugins: readonly AgentPlugin[] = [],\n execution: SessionExecutionOptions = {}\n ) {\n this.#llm = llm;\n this.#execution = execution;\n this.#sessionKey = persistence.key;\n this.#state = new SessionState(persistence);\n this.#events = new SessionEventDispatcher({\n history: () => this.#state.modelSnapshot(),\n plugins,\n signal: () => this.#activeAbort?.signal,\n });\n }\n\n async send(input: AgentInput): Promise<AgentRun> {\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n await this.#state.ensureLoaded();\n\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n const runtimeInput = createRuntimeInputState(\n this.#pendingRuntimeInputs.splice(0)\n );\n const normalized = normalizeAgentInput(input);\n const acceptedInput =\n normalized.meta === undefined\n ? attachInputMeta(normalized, { source: \"send\" })\n : normalized;\n const run = new BufferedAgentRun();\n const emitted = await this.#events.emitRunEvent(run, acceptedInput);\n if (emitted === \"handled\") {\n run.close();\n return run;\n }\n\n const queuedInput = userInputFromEvent(\n emitted.type === \"user-text\" || emitted.type === \"user-message\"\n ? emitted\n : acceptedInput\n );\n this.#inputQueue.push({\n initialEvents: [],\n input: structuredClone(queuedInput),\n preUserRuntimeInputs: [],\n run,\n runtimeInput,\n });\n startSessionQueueDrain(run, () => this.#drainInputQueue());\n return run;\n }\n\n async notify(\n input: AgentInput,\n options: NotifyOptions = {}\n ): Promise<AgentRun> {\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n await this.#state.ensureLoaded();\n\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n return queueSessionNotification(input, options, {\n activeRun: this.#activeRun,\n activeRuntimeInput: this.#activeRuntimeInput,\n drain: () => this.#drainInputQueue(),\n inputQueue: this.#inputQueue,\n pendingRuntimeInputs: this.#pendingRuntimeInputs,\n });\n }\n\n async steer(input: AgentInput): Promise<AgentRun> {\n if (this.#killed || this.#deletePromise) {\n throw sessionTerminalError(this.#killed);\n }\n\n const runtimeInput = this.#activeRuntimeInput;\n const run = this.#activeRun;\n if (!(runtimeInput && run)) {\n return this.send(input);\n }\n\n await addSteeringInput(runtimeInput, input);\n return run;\n }\n\n interrupt(): void {\n this.#activeAbort?.abort();\n }\n\n currentTurnId(): string | undefined {\n return this.#activeTurnId;\n }\n\n delete(): Promise<void> {\n if (!this.#deletePromise) {\n this.kill();\n this.#deletePromise = this.#state.delete().catch((error: unknown) => {\n this.#deletePromise = undefined;\n throw error;\n });\n }\n return this.#deletePromise;\n }\n\n enqueueRuntimeInput(\n input: UserInput,\n placement: RuntimeInputPlacement = \"turn-start\"\n ): void {\n if (this.#killed) {\n return;\n }\n\n const runtimeInput = this.#activeRuntimeInput;\n if (runtimeInput && !runtimeInput.closedReason) {\n if (placement === \"turn-start\" && runtimeInput.placement !== placement) {\n this.#enqueuePendingRuntimeInput({ input, placement });\n return;\n }\n\n queueRuntimeInput(runtimeInput, { input, placement });\n return;\n }\n\n this.#enqueuePendingRuntimeInput({ input, placement });\n }\n\n emitObserverEvent(event: AgentEvent): Promise<void> {\n return this.#events.emitObserverEvent(this.#activeRun, event);\n }\n\n #enqueuePendingRuntimeInput(input: QueuedRuntimeInput): void {\n const queuedTurn = this.#inputQueue[0];\n if (input.placement === \"turn-start\" && queuedTurn) {\n queueRuntimeInput(queuedTurn.runtimeInput, input);\n return;\n }\n\n this.#pendingRuntimeInputs.push(input);\n }\n\n kill(): void {\n if (this.#killed) {\n return;\n }\n\n this.#killed = true;\n const killedError = sessionKilledError();\n this.#pendingRuntimeInputs.length = 0;\n this.#activeAbort?.abort();\n closeKilledRuntimeInputs({\n activeRuntimeInput: this.#activeRuntimeInput,\n inputQueue: this.#inputQueue,\n message: killedError.message,\n runToClose: this.#runToCloseOnKill ?? this.#activeRun,\n });\n }\n\n async #drainInputQueue(): Promise<void> {\n if (this.#running) {\n return;\n }\n\n this.#running = true;\n try {\n while (!this.#killed && this.#inputQueue.length > 0) {\n const item = this.#inputQueue.shift();\n if (item) {\n await processQueuedInput({\n activate: ({ abort, run, runtimeInput, turnId }) => {\n this.#activeAbort = abort;\n this.#activeRun = run;\n this.#activeRuntimeInput = runtimeInput;\n this.#activeTurnId = turnId;\n this.#runToCloseOnKill = run;\n },\n deactivateRun: () => {\n this.#activeRun = undefined;\n this.#activeRuntimeInput = undefined;\n },\n events: this.#events,\n execution: this.#execution,\n item,\n llm: this.#llm,\n release: () => {\n this.#activeAbort = undefined;\n this.#activeRun = undefined;\n this.#activeRuntimeInput = undefined;\n this.#activeTurnId = undefined;\n this.#runToCloseOnKill = undefined;\n },\n sessionKey: this.#sessionKey,\n state: this.#state,\n });\n }\n }\n } finally {\n this.#running = false;\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minpeter/pss-runtime",
|
|
3
|
-
"version": "0.1.0-next.
|
|
3
|
+
"version": "0.1.0-next.3",
|
|
4
4
|
"description": "Generic agent runtime for sessions, model loops, and synchronized run events.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
"types": "./dist/session/store/file.d.ts",
|
|
22
22
|
"import": "./dist/session/store/file.js"
|
|
23
23
|
},
|
|
24
|
+
"./cloudflare": {
|
|
25
|
+
"@minpeter/pss-source": "./src/cloudflare/index.ts",
|
|
26
|
+
"types": "./dist/cloudflare/index.d.ts",
|
|
27
|
+
"import": "./dist/cloudflare/index.js"
|
|
28
|
+
},
|
|
24
29
|
"./execution": {
|
|
25
30
|
"@minpeter/pss-source": "./src/execution/index.ts",
|
|
26
31
|
"types": "./dist/execution/index.d.ts",
|
package/dist/agent-child-runs.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { executionHost } from "./execution/host.js";
|
|
2
|
-
import { cancelBackgroundChildRun } from "./subagent-background-child-run.js";
|
|
3
|
-
//#region src/agent-child-runs.ts
|
|
4
|
-
async function cancelDurableChildRuns(host, parentRunId) {
|
|
5
|
-
const durableHost = executionHost(host);
|
|
6
|
-
if (!durableHost) return;
|
|
7
|
-
const childRuns = await durableHost.store.runs.listByParentRunId(parentRunId);
|
|
8
|
-
await Promise.all(childRuns.map((run) => cancelBackgroundChildRun({
|
|
9
|
-
executionHost: durableHost,
|
|
10
|
-
runId: run.runId
|
|
11
|
-
})));
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
|
-
export { cancelDurableChildRuns };
|
|
15
|
-
|
|
16
|
-
//# sourceMappingURL=agent-child-runs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-child-runs.js","names":[],"sources":["../src/agent-child-runs.ts"],"sourcesContent":["import { executionHost } from \"./execution/host\";\nimport type { AgentHost } from \"./execution/types\";\nimport { cancelBackgroundChildRun } from \"./subagent-background-child-run\";\n\nexport async function cancelDurableChildRuns(\n host: AgentHost,\n parentRunId: string\n): Promise<void> {\n const durableHost = executionHost(host);\n if (!durableHost) {\n return;\n }\n\n const childRuns = await durableHost.store.runs.listByParentRunId(parentRunId);\n await Promise.all(\n childRuns.map((run) =>\n cancelBackgroundChildRun({\n executionHost: durableHost,\n runId: run.runId,\n })\n )\n );\n}\n"],"mappings":";;;AAIA,eAAsB,uBACpB,MACA,aACe;CACf,MAAM,cAAc,cAAc,IAAI;CACtC,IAAI,CAAC,aACH;CAGF,MAAM,YAAY,MAAM,YAAY,MAAM,KAAK,kBAAkB,WAAW;CAC5E,MAAM,QAAQ,IACZ,UAAU,KAAK,QACb,yBAAyB;EACvB,eAAe;EACf,OAAO,IAAI;CACb,CAAC,CACH,CACF;AACF"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
//#region src/agent-host-capabilities.ts
|
|
2
|
-
function supportsBackgroundSubagents(host, executionHost) {
|
|
3
|
-
const capability = host.capabilities?.backgroundSubagents;
|
|
4
|
-
return capability === "in-process" || capability === "durable" && executionHost !== void 0;
|
|
5
|
-
}
|
|
6
|
-
//#endregion
|
|
7
|
-
export { supportsBackgroundSubagents };
|
|
8
|
-
|
|
9
|
-
//# sourceMappingURL=agent-host-capabilities.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-host-capabilities.js","names":[],"sources":["../src/agent-host-capabilities.ts"],"sourcesContent":["import type { AgentHost, ExecutionHost } from \"./execution/types\";\n\nexport function supportsBackgroundSubagents(\n host: AgentHost,\n executionHost: ExecutionHost | undefined\n): boolean {\n const capability = host.capabilities?.backgroundSubagents;\n return (\n capability === \"in-process\" ||\n (capability === \"durable\" && executionHost !== undefined)\n );\n}\n"],"mappings":";AAEA,SAAgB,4BACd,MACA,eACS;CACT,MAAM,aAAa,KAAK,cAAc;CACtC,OACE,eAAe,gBACd,eAAe,aAAa,kBAAkB,KAAA;AAEnD"}
|
package/dist/agent-validation.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
//#region src/agent-validation.ts
|
|
2
|
-
const subagentNamePattern = /^[a-z][a-z0-9_-]{0,51}$/;
|
|
3
|
-
function assertSubagents(options, agentClass, hasRuntimeModel) {
|
|
4
|
-
if (!("subagents" in options) || options.subagents === void 0) return;
|
|
5
|
-
if (hasRuntimeModel) throw new TypeError("Agent: subagents require an AI SDK model.");
|
|
6
|
-
if (!Array.isArray(options.subagents)) throw new TypeError("Agent: subagents must be an array.");
|
|
7
|
-
assertSubagentTools(options.subagents, agentClass, options.tools ?? {});
|
|
8
|
-
}
|
|
9
|
-
function assertSubagentTools(subagents, agentClass, tools) {
|
|
10
|
-
const toolNames = new Set(Object.keys(tools));
|
|
11
|
-
const generatedToolNames = /* @__PURE__ */ new Set();
|
|
12
|
-
for (const [index, subagent] of subagents.entries()) {
|
|
13
|
-
const toolName = `delegate_to_${assertSubagentMetadata(subagent, index, agentClass).replaceAll("-", "_")}`;
|
|
14
|
-
if (toolNames.has(toolName)) throw new TypeError(`Agent: subagent tool ${toolName} collides with an existing tool.`);
|
|
15
|
-
if (generatedToolNames.has(toolName)) throw new TypeError(`Agent: duplicate subagent tool name ${toolName}.`);
|
|
16
|
-
generatedToolNames.add(toolName);
|
|
17
|
-
}
|
|
18
|
-
for (const reservedToolName of ["background_output", "background_cancel"]) if (toolNames.has(reservedToolName)) throw new TypeError(`Agent: ${reservedToolName} collides with a reserved subagent tool.`);
|
|
19
|
-
}
|
|
20
|
-
function assertSubagentMetadata(subagent, index, agentClass) {
|
|
21
|
-
if (!(subagent instanceof agentClass)) throw new TypeError(`Agent: subagents[${index}] must be an Agent.`);
|
|
22
|
-
if (!isValidSubagentName(subagent.name)) throw new TypeError(`Agent: subagents[${index}].name is required or too long.`);
|
|
23
|
-
if (!isNonEmptyText(subagent.description)) throw new TypeError(`Agent: subagents[${index}].description is required.`);
|
|
24
|
-
return subagent.name;
|
|
25
|
-
}
|
|
26
|
-
function isNonEmptyText(value) {
|
|
27
|
-
return typeof value === "string" && value.trim().length > 0;
|
|
28
|
-
}
|
|
29
|
-
function isValidSubagentName(value) {
|
|
30
|
-
return typeof value === "string" && subagentNamePattern.test(value);
|
|
31
|
-
}
|
|
32
|
-
//#endregion
|
|
33
|
-
export { assertSubagents };
|
|
34
|
-
|
|
35
|
-
//# sourceMappingURL=agent-validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-validation.js","names":[],"sources":["../src/agent-validation.ts"],"sourcesContent":["import type { ToolSet } from \"ai\";\nimport type { Agent } from \"./agent\";\nimport type { AgentOptions } from \"./agent-options\";\n\nconst subagentNamePattern = /^[a-z][a-z0-9_-]{0,51}$/;\n\nexport function assertSubagents(\n options: AgentOptions,\n agentClass: new (options: AgentOptions) => Agent,\n hasRuntimeModel: boolean\n): void {\n if (!(\"subagents\" in options) || options.subagents === undefined) {\n return;\n }\n\n if (hasRuntimeModel) {\n throw new TypeError(\"Agent: subagents require an AI SDK model.\");\n }\n\n if (!Array.isArray(options.subagents)) {\n throw new TypeError(\"Agent: subagents must be an array.\");\n }\n\n assertSubagentTools(options.subagents, agentClass, options.tools ?? {});\n}\n\nfunction assertSubagentTools(\n subagents: readonly Agent[],\n agentClass: new (options: AgentOptions) => Agent,\n tools: ToolSet\n): void {\n const toolNames = new Set(Object.keys(tools));\n const generatedToolNames = new Set<string>();\n for (const [index, subagent] of subagents.entries()) {\n const name = assertSubagentMetadata(subagent, index, agentClass);\n const toolName = `delegate_to_${name.replaceAll(\"-\", \"_\")}`;\n if (toolNames.has(toolName)) {\n throw new TypeError(\n `Agent: subagent tool ${toolName} collides with an existing tool.`\n );\n }\n\n if (generatedToolNames.has(toolName)) {\n throw new TypeError(`Agent: duplicate subagent tool name ${toolName}.`);\n }\n\n generatedToolNames.add(toolName);\n }\n\n for (const reservedToolName of [\"background_output\", \"background_cancel\"]) {\n if (toolNames.has(reservedToolName)) {\n throw new TypeError(\n `Agent: ${reservedToolName} collides with a reserved subagent tool.`\n );\n }\n }\n}\n\nfunction assertSubagentMetadata(\n subagent: Agent,\n index: number,\n agentClass: new (options: AgentOptions) => Agent\n): string {\n if (!(subagent instanceof agentClass)) {\n throw new TypeError(`Agent: subagents[${index}] must be an Agent.`);\n }\n\n if (!isValidSubagentName(subagent.name)) {\n throw new TypeError(\n `Agent: subagents[${index}].name is required or too long.`\n );\n }\n\n if (!isNonEmptyText(subagent.description)) {\n throw new TypeError(`Agent: subagents[${index}].description is required.`);\n }\n\n return subagent.name;\n}\n\nfunction isNonEmptyText(value: string | undefined): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction isValidSubagentName(value: string | undefined): value is string {\n return typeof value === \"string\" && subagentNamePattern.test(value);\n}\n"],"mappings":";AAIA,MAAM,sBAAsB;AAE5B,SAAgB,gBACd,SACA,YACA,iBACM;CACN,IAAI,EAAE,eAAe,YAAY,QAAQ,cAAc,KAAA,GACrD;CAGF,IAAI,iBACF,MAAM,IAAI,UAAU,2CAA2C;CAGjE,IAAI,CAAC,MAAM,QAAQ,QAAQ,SAAS,GAClC,MAAM,IAAI,UAAU,oCAAoC;CAG1D,oBAAoB,QAAQ,WAAW,YAAY,QAAQ,SAAS,CAAC,CAAC;AACxE;AAEA,SAAS,oBACP,WACA,YACA,OACM;CACN,MAAM,YAAY,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;CAC5C,MAAM,qCAAqB,IAAI,IAAY;CAC3C,KAAK,MAAM,CAAC,OAAO,aAAa,UAAU,QAAQ,GAAG;EAEnD,MAAM,WAAW,eADJ,uBAAuB,UAAU,OAAO,UAClB,EAAE,WAAW,KAAK,GAAG;EACxD,IAAI,UAAU,IAAI,QAAQ,GACxB,MAAM,IAAI,UACR,wBAAwB,SAAS,iCACnC;EAGF,IAAI,mBAAmB,IAAI,QAAQ,GACjC,MAAM,IAAI,UAAU,uCAAuC,SAAS,EAAE;EAGxE,mBAAmB,IAAI,QAAQ;CACjC;CAEA,KAAK,MAAM,oBAAoB,CAAC,qBAAqB,mBAAmB,GACtE,IAAI,UAAU,IAAI,gBAAgB,GAChC,MAAM,IAAI,UACR,UAAU,iBAAiB,yCAC7B;AAGN;AAEA,SAAS,uBACP,UACA,OACA,YACQ;CACR,IAAI,EAAE,oBAAoB,aACxB,MAAM,IAAI,UAAU,oBAAoB,MAAM,oBAAoB;CAGpE,IAAI,CAAC,oBAAoB,SAAS,IAAI,GACpC,MAAM,IAAI,UACR,oBAAoB,MAAM,gCAC5B;CAGF,IAAI,CAAC,eAAe,SAAS,WAAW,GACtC,MAAM,IAAI,UAAU,oBAAoB,MAAM,2BAA2B;CAG3E,OAAO,SAAS;AAClB;AAEA,SAAS,eAAe,OAA4C;CAClE,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEA,SAAS,oBAAoB,OAA4C;CACvE,OAAO,OAAO,UAAU,YAAY,oBAAoB,KAAK,KAAK;AACpE"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
//#region src/child-session-cleanups.ts
|
|
2
|
-
var ChildSessionCleanups = class {
|
|
3
|
-
#byParentSession = /* @__PURE__ */ new Map();
|
|
4
|
-
async delete(parentSessionKey) {
|
|
5
|
-
const cleanups = this.#byParentSession.get(parentSessionKey);
|
|
6
|
-
if (!cleanups) return;
|
|
7
|
-
this.#byParentSession.delete(parentSessionKey);
|
|
8
|
-
const results = await Promise.all([...cleanups].map(runCleanup));
|
|
9
|
-
const failedCleanups = [];
|
|
10
|
-
let firstError;
|
|
11
|
-
for (const result of results) {
|
|
12
|
-
if (result.ok) continue;
|
|
13
|
-
firstError ??= result.error;
|
|
14
|
-
failedCleanups.push(result.cleanup);
|
|
15
|
-
}
|
|
16
|
-
if (failedCleanups.length === 0) return;
|
|
17
|
-
this.#restore(parentSessionKey, failedCleanups);
|
|
18
|
-
throw firstError instanceof Error ? firstError : new Error(String(firstError));
|
|
19
|
-
}
|
|
20
|
-
register(parentSessionKey, cleanup) {
|
|
21
|
-
const existing = this.#byParentSession.get(parentSessionKey);
|
|
22
|
-
if (existing) {
|
|
23
|
-
existing.add(cleanup);
|
|
24
|
-
return () => this.#unregister(parentSessionKey, existing, cleanup);
|
|
25
|
-
}
|
|
26
|
-
const cleanups = new Set([cleanup]);
|
|
27
|
-
this.#byParentSession.set(parentSessionKey, cleanups);
|
|
28
|
-
return () => this.#unregister(parentSessionKey, cleanups, cleanup);
|
|
29
|
-
}
|
|
30
|
-
#unregister(parentSessionKey, cleanups, cleanup) {
|
|
31
|
-
cleanups.delete(cleanup);
|
|
32
|
-
if (cleanups.size === 0 && this.#byParentSession.get(parentSessionKey) === cleanups) this.#byParentSession.delete(parentSessionKey);
|
|
33
|
-
}
|
|
34
|
-
#restore(parentSessionKey, failedCleanups) {
|
|
35
|
-
const current = this.#byParentSession.get(parentSessionKey);
|
|
36
|
-
if (current) {
|
|
37
|
-
for (const cleanup of failedCleanups) current.add(cleanup);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
this.#byParentSession.set(parentSessionKey, new Set(failedCleanups));
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
async function runCleanup(cleanup) {
|
|
44
|
-
try {
|
|
45
|
-
await cleanup();
|
|
46
|
-
return {
|
|
47
|
-
cleanup,
|
|
48
|
-
ok: true
|
|
49
|
-
};
|
|
50
|
-
} catch (error) {
|
|
51
|
-
return {
|
|
52
|
-
cleanup,
|
|
53
|
-
error,
|
|
54
|
-
ok: false
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
//#endregion
|
|
59
|
-
export { ChildSessionCleanups };
|
|
60
|
-
|
|
61
|
-
//# sourceMappingURL=child-session-cleanups.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"child-session-cleanups.js","names":["#byParentSession","#restore","#unregister"],"sources":["../src/child-session-cleanups.ts"],"sourcesContent":["type ChildSessionCleanup = () => Promise<void>;\n\ntype CleanupResult =\n | { readonly cleanup: ChildSessionCleanup; readonly ok: true }\n | {\n readonly cleanup: ChildSessionCleanup;\n readonly error: unknown;\n readonly ok: false;\n };\n\nexport class ChildSessionCleanups {\n readonly #byParentSession = new Map<string, Set<ChildSessionCleanup>>();\n\n async delete(parentSessionKey: string): Promise<void> {\n const cleanups = this.#byParentSession.get(parentSessionKey);\n if (!cleanups) {\n return;\n }\n\n this.#byParentSession.delete(parentSessionKey);\n const results = await Promise.all([...cleanups].map(runCleanup));\n const failedCleanups: ChildSessionCleanup[] = [];\n let firstError: unknown;\n for (const result of results) {\n if (result.ok) {\n continue;\n }\n\n firstError ??= result.error;\n failedCleanups.push(result.cleanup);\n }\n\n if (failedCleanups.length === 0) {\n return;\n }\n\n this.#restore(parentSessionKey, failedCleanups);\n throw firstError instanceof Error\n ? firstError\n : new Error(String(firstError));\n }\n\n register(parentSessionKey: string, cleanup: ChildSessionCleanup): () => void {\n const existing = this.#byParentSession.get(parentSessionKey);\n if (existing) {\n existing.add(cleanup);\n return () => this.#unregister(parentSessionKey, existing, cleanup);\n }\n\n const cleanups = new Set([cleanup]);\n this.#byParentSession.set(parentSessionKey, cleanups);\n return () => this.#unregister(parentSessionKey, cleanups, cleanup);\n }\n\n #unregister(\n parentSessionKey: string,\n cleanups: Set<ChildSessionCleanup>,\n cleanup: ChildSessionCleanup\n ): void {\n cleanups.delete(cleanup);\n if (\n cleanups.size === 0 &&\n this.#byParentSession.get(parentSessionKey) === cleanups\n ) {\n this.#byParentSession.delete(parentSessionKey);\n }\n }\n\n #restore(\n parentSessionKey: string,\n failedCleanups: readonly ChildSessionCleanup[]\n ): void {\n const current = this.#byParentSession.get(parentSessionKey);\n if (current) {\n for (const cleanup of failedCleanups) {\n current.add(cleanup);\n }\n return;\n }\n\n this.#byParentSession.set(parentSessionKey, new Set(failedCleanups));\n }\n}\n\nasync function runCleanup(\n cleanup: ChildSessionCleanup\n): Promise<CleanupResult> {\n try {\n await cleanup();\n return { cleanup, ok: true };\n } catch (error) {\n return { cleanup, error, ok: false };\n }\n}\n"],"mappings":";AAUA,IAAa,uBAAb,MAAkC;CAChC,mCAA4B,IAAI,IAAsC;CAEtE,MAAM,OAAO,kBAAyC;EACpD,MAAM,WAAW,KAAKA,iBAAiB,IAAI,gBAAgB;EAC3D,IAAI,CAAC,UACH;EAGF,KAAKA,iBAAiB,OAAO,gBAAgB;EAC7C,MAAM,UAAU,MAAM,QAAQ,IAAI,CAAC,GAAG,QAAQ,EAAE,IAAI,UAAU,CAAC;EAC/D,MAAM,iBAAwC,CAAC;EAC/C,IAAI;EACJ,KAAK,MAAM,UAAU,SAAS;GAC5B,IAAI,OAAO,IACT;GAGF,eAAe,OAAO;GACtB,eAAe,KAAK,OAAO,OAAO;EACpC;EAEA,IAAI,eAAe,WAAW,GAC5B;EAGF,KAAKC,SAAS,kBAAkB,cAAc;EAC9C,MAAM,sBAAsB,QACxB,aACA,IAAI,MAAM,OAAO,UAAU,CAAC;CAClC;CAEA,SAAS,kBAA0B,SAA0C;EAC3E,MAAM,WAAW,KAAKD,iBAAiB,IAAI,gBAAgB;EAC3D,IAAI,UAAU;GACZ,SAAS,IAAI,OAAO;GACpB,aAAa,KAAKE,YAAY,kBAAkB,UAAU,OAAO;EACnE;EAEA,MAAM,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;EAClC,KAAKF,iBAAiB,IAAI,kBAAkB,QAAQ;EACpD,aAAa,KAAKE,YAAY,kBAAkB,UAAU,OAAO;CACnE;CAEA,YACE,kBACA,UACA,SACM;EACN,SAAS,OAAO,OAAO;EACvB,IACE,SAAS,SAAS,KAClB,KAAKF,iBAAiB,IAAI,gBAAgB,MAAM,UAEhD,KAAKA,iBAAiB,OAAO,gBAAgB;CAEjD;CAEA,SACE,kBACA,gBACM;EACN,MAAM,UAAU,KAAKA,iBAAiB,IAAI,gBAAgB;EAC1D,IAAI,SAAS;GACX,KAAK,MAAM,WAAW,gBACpB,QAAQ,IAAI,OAAO;GAErB;EACF;EAEA,KAAKA,iBAAiB,IAAI,kBAAkB,IAAI,IAAI,cAAc,CAAC;CACrE;AACF;AAEA,eAAe,WACb,SACwB;CACxB,IAAI;EACF,MAAM,QAAQ;EACd,OAAO;GAAE;GAAS,IAAI;EAAK;CAC7B,SAAS,OAAO;EACd,OAAO;GAAE;GAAS;GAAO,IAAI;EAAM;CACrC;AACF"}
|
package/dist/execution/run.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
//#region src/execution/run.ts
|
|
2
|
-
var StoredAgentRun = class {
|
|
3
|
-
#cursor;
|
|
4
|
-
#eventStore;
|
|
5
|
-
#runId;
|
|
6
|
-
#eventsStarted = false;
|
|
7
|
-
constructor({ cursor, eventStore, runId }) {
|
|
8
|
-
this.#cursor = cursor;
|
|
9
|
-
this.#eventStore = eventStore;
|
|
10
|
-
this.#runId = runId;
|
|
11
|
-
}
|
|
12
|
-
events() {
|
|
13
|
-
if (this.#eventsStarted) throw new Error("AgentRun.events() can only be consumed once");
|
|
14
|
-
this.#eventsStarted = true;
|
|
15
|
-
return new StoredAgentEventIterator(this.#eventStore.read(this.#runId, this.#cursor));
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
var StoredAgentEventIterator = class {
|
|
19
|
-
#source;
|
|
20
|
-
#nextPending = false;
|
|
21
|
-
constructor(events) {
|
|
22
|
-
this.#source = events[Symbol.asyncIterator]();
|
|
23
|
-
}
|
|
24
|
-
[Symbol.asyncIterator]() {
|
|
25
|
-
return this;
|
|
26
|
-
}
|
|
27
|
-
async next() {
|
|
28
|
-
if (this.#nextPending) throw new Error("AgentRun.events() does not allow concurrent next() calls");
|
|
29
|
-
this.#nextPending = true;
|
|
30
|
-
try {
|
|
31
|
-
const next = await this.#source.next();
|
|
32
|
-
if (next.done) return {
|
|
33
|
-
done: true,
|
|
34
|
-
value: void 0
|
|
35
|
-
};
|
|
36
|
-
return {
|
|
37
|
-
done: false,
|
|
38
|
-
value: next.value.event
|
|
39
|
-
};
|
|
40
|
-
} finally {
|
|
41
|
-
this.#nextPending = false;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
async return() {
|
|
45
|
-
await this.#source.return?.();
|
|
46
|
-
return {
|
|
47
|
-
done: true,
|
|
48
|
-
value: void 0
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
//#endregion
|
|
53
|
-
export { StoredAgentRun };
|
|
54
|
-
|
|
55
|
-
//# sourceMappingURL=run.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","names":["#cursor","#eventStore","#runId","#eventsStarted","#source","#nextPending"],"sources":["../../src/execution/run.ts"],"sourcesContent":["import type { AgentEvent } from \"../session/events\";\nimport type { AgentRun } from \"../session/run\";\nimport type { EventCursor, EventStore, StoredAgentEvent } from \"./types\";\n\nexport class StoredAgentRun implements AgentRun {\n readonly #cursor: EventCursor | undefined;\n readonly #eventStore: EventStore;\n readonly #runId: string;\n #eventsStarted = false;\n\n constructor({\n cursor,\n eventStore,\n runId,\n }: {\n readonly cursor?: EventCursor;\n readonly eventStore: EventStore;\n readonly runId: string;\n }) {\n this.#cursor = cursor;\n this.#eventStore = eventStore;\n this.#runId = runId;\n }\n\n events(): AsyncIterable<AgentEvent> {\n if (this.#eventsStarted) {\n throw new Error(\"AgentRun.events() can only be consumed once\");\n }\n this.#eventsStarted = true;\n\n return new StoredAgentEventIterator(\n this.#eventStore.read(this.#runId, this.#cursor)\n );\n }\n}\n\nclass StoredAgentEventIterator implements AsyncIterableIterator<AgentEvent> {\n readonly #source: AsyncIterator<StoredAgentEvent>;\n #nextPending = false;\n\n constructor(events: AsyncIterable<StoredAgentEvent>) {\n this.#source = events[Symbol.asyncIterator]();\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<AgentEvent> {\n return this;\n }\n\n async next(): Promise<IteratorResult<AgentEvent>> {\n if (this.#nextPending) {\n throw new Error(\n \"AgentRun.events() does not allow concurrent next() calls\"\n );\n }\n\n this.#nextPending = true;\n try {\n const next = await this.#source.next();\n if (next.done) {\n return { done: true, value: undefined };\n }\n\n return { done: false, value: next.value.event };\n } finally {\n this.#nextPending = false;\n }\n }\n\n async return(): Promise<IteratorResult<AgentEvent>> {\n await this.#source.return?.();\n return { done: true, value: undefined };\n }\n}\n"],"mappings":";AAIA,IAAa,iBAAb,MAAgD;CAC9C;CACA;CACA;CACA,iBAAiB;CAEjB,YAAY,EACV,QACA,YACA,SAKC;EACD,KAAKA,UAAU;EACf,KAAKC,cAAc;EACnB,KAAKC,SAAS;CAChB;CAEA,SAAoC;EAClC,IAAI,KAAKC,gBACP,MAAM,IAAI,MAAM,6CAA6C;EAE/D,KAAKA,iBAAiB;EAEtB,OAAO,IAAI,yBACT,KAAKF,YAAY,KAAK,KAAKC,QAAQ,KAAKF,OAAO,CACjD;CACF;AACF;AAEA,IAAM,2BAAN,MAA4E;CAC1E;CACA,eAAe;CAEf,YAAY,QAAyC;EACnD,KAAKI,UAAU,OAAO,OAAO,eAAe;CAC9C;CAEA,CAAC,OAAO,iBAAoD;EAC1D,OAAO;CACT;CAEA,MAAM,OAA4C;EAChD,IAAI,KAAKC,cACP,MAAM,IAAI,MACR,0DACF;EAGF,KAAKA,eAAe;EACpB,IAAI;GACF,MAAM,OAAO,MAAM,KAAKD,QAAQ,KAAK;GACrC,IAAI,KAAK,MACP,OAAO;IAAE,MAAM;IAAM,OAAO,KAAA;GAAU;GAGxC,OAAO;IAAE,MAAM;IAAO,OAAO,KAAK,MAAM;GAAM;EAChD,UAAU;GACR,KAAKC,eAAe;EACtB;CACF;CAEA,MAAM,SAA8C;EAClD,MAAM,KAAKD,QAAQ,SAAS;EAC5B,OAAO;GAAE,MAAM;GAAM,OAAO,KAAA;EAAU;CACxC;AACF"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
//#region src/subagent-background-child-run-state.ts
|
|
2
|
-
function durableBackgroundChildRunState({ delegateToolCallId, description, groupId, parentSessionKey, prompt, subagent }) {
|
|
3
|
-
return {
|
|
4
|
-
...delegateToolCallId ? { delegateToolCallId } : {},
|
|
5
|
-
...description ? { description } : {},
|
|
6
|
-
...groupId ? { groupId } : {},
|
|
7
|
-
kind: "background-subagent",
|
|
8
|
-
...parentSessionKey ? { parentSessionKey } : {},
|
|
9
|
-
prompt: structuredClone(prompt),
|
|
10
|
-
subagent: subagent ?? "subagent"
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function readDurableBackgroundChildRunState(checkpoint) {
|
|
14
|
-
const state = checkpoint?.runtimeState;
|
|
15
|
-
if (!isRecord(state) || state.kind !== "background-subagent") return null;
|
|
16
|
-
if (!isAgentInput(state.prompt) || typeof state.subagent !== "string") return null;
|
|
17
|
-
return {
|
|
18
|
-
...typeof state.delegateToolCallId === "string" ? { delegateToolCallId: state.delegateToolCallId } : {},
|
|
19
|
-
...typeof state.description === "string" ? { description: state.description } : {},
|
|
20
|
-
...typeof state.groupId === "string" ? { groupId: state.groupId } : {},
|
|
21
|
-
kind: "background-subagent",
|
|
22
|
-
...typeof state.parentSessionKey === "string" ? { parentSessionKey: state.parentSessionKey } : {},
|
|
23
|
-
prompt: state.prompt,
|
|
24
|
-
subagent: state.subagent
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
function isAgentInput(value) {
|
|
28
|
-
return typeof value === "string" || isStringArray(value) || isUserInput(value) || isMessageContent(value);
|
|
29
|
-
}
|
|
30
|
-
function isUserInput(value) {
|
|
31
|
-
if (!isRecord(value)) return false;
|
|
32
|
-
if (value.type === "user-text") return typeof value.text === "string" || isStringArray(value.text);
|
|
33
|
-
return value.type === "user-message" && isMessageContent(value.content);
|
|
34
|
-
}
|
|
35
|
-
function isMessageContent(value) {
|
|
36
|
-
return Array.isArray(value) && value.every(isMessageContentPart);
|
|
37
|
-
}
|
|
38
|
-
function isMessageContentPart(value) {
|
|
39
|
-
if (!isRecord(value) || typeof value.type !== "string") return false;
|
|
40
|
-
return value.type === "text" || value.type === "image" || value.type === "file";
|
|
41
|
-
}
|
|
42
|
-
function isRecord(value) {
|
|
43
|
-
return typeof value === "object" && value !== null;
|
|
44
|
-
}
|
|
45
|
-
function isStringArray(value) {
|
|
46
|
-
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
47
|
-
}
|
|
48
|
-
//#endregion
|
|
49
|
-
export { durableBackgroundChildRunState, readDurableBackgroundChildRunState };
|
|
50
|
-
|
|
51
|
-
//# sourceMappingURL=subagent-background-child-run-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-background-child-run-state.js","names":[],"sources":["../src/subagent-background-child-run-state.ts"],"sourcesContent":["import type { RunCheckpoint } from \"./execution/types\";\nimport type { AgentInput } from \"./session/input\";\n\nexport interface DurableBackgroundChildRunState {\n readonly delegateToolCallId?: string;\n readonly description?: string;\n readonly groupId?: string;\n readonly kind: \"background-subagent\";\n readonly parentSessionKey?: string;\n readonly prompt: AgentInput;\n readonly subagent: string;\n}\n\nexport function durableBackgroundChildRunState({\n delegateToolCallId,\n description,\n groupId,\n parentSessionKey,\n prompt,\n subagent,\n}: {\n readonly delegateToolCallId?: string;\n readonly description?: string;\n readonly groupId?: string;\n readonly parentSessionKey?: string;\n readonly prompt: AgentInput;\n readonly subagent?: string;\n}): DurableBackgroundChildRunState {\n return {\n ...(delegateToolCallId ? { delegateToolCallId } : {}),\n ...(description ? { description } : {}),\n ...(groupId ? { groupId } : {}),\n kind: \"background-subagent\",\n ...(parentSessionKey ? { parentSessionKey } : {}),\n prompt: structuredClone(prompt),\n subagent: subagent ?? \"subagent\",\n };\n}\n\nexport function readDurableBackgroundChildRunState(\n checkpoint: RunCheckpoint | null\n): DurableBackgroundChildRunState | null {\n const state = checkpoint?.runtimeState;\n if (!isRecord(state) || state.kind !== \"background-subagent\") {\n return null;\n }\n\n if (!isAgentInput(state.prompt) || typeof state.subagent !== \"string\") {\n return null;\n }\n\n return {\n ...(typeof state.delegateToolCallId === \"string\"\n ? { delegateToolCallId: state.delegateToolCallId }\n : {}),\n ...(typeof state.description === \"string\"\n ? { description: state.description }\n : {}),\n ...(typeof state.groupId === \"string\" ? { groupId: state.groupId } : {}),\n kind: \"background-subagent\",\n ...(typeof state.parentSessionKey === \"string\"\n ? { parentSessionKey: state.parentSessionKey }\n : {}),\n prompt: state.prompt,\n subagent: state.subagent,\n };\n}\n\nfunction isAgentInput(value: unknown): value is AgentInput {\n return (\n typeof value === \"string\" ||\n isStringArray(value) ||\n isUserInput(value) ||\n isMessageContent(value)\n );\n}\n\nfunction isUserInput(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.type === \"user-text\") {\n return typeof value.text === \"string\" || isStringArray(value.text);\n }\n\n return value.type === \"user-message\" && isMessageContent(value.content);\n}\n\nfunction isMessageContent(value: unknown): boolean {\n return Array.isArray(value) && value.every(isMessageContentPart);\n}\n\nfunction isMessageContentPart(value: unknown): boolean {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" || value.type === \"image\" || value.type === \"file\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return (\n Array.isArray(value) && value.every((item) => typeof item === \"string\")\n );\n}\n"],"mappings":";AAaA,SAAgB,+BAA+B,EAC7C,oBACA,aACA,SACA,kBACA,QACA,YAQiC;CACjC,OAAO;EACL,GAAI,qBAAqB,EAAE,mBAAmB,IAAI,CAAC;EACnD,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;EACrC,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC7B,MAAM;EACN,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;EAC/C,QAAQ,gBAAgB,MAAM;EAC9B,UAAU,YAAY;CACxB;AACF;AAEA,SAAgB,mCACd,YACuC;CACvC,MAAM,QAAQ,YAAY;CAC1B,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,uBACrC,OAAO;CAGT,IAAI,CAAC,aAAa,MAAM,MAAM,KAAK,OAAO,MAAM,aAAa,UAC3D,OAAO;CAGT,OAAO;EACL,GAAI,OAAO,MAAM,uBAAuB,WACpC,EAAE,oBAAoB,MAAM,mBAAmB,IAC/C,CAAC;EACL,GAAI,OAAO,MAAM,gBAAgB,WAC7B,EAAE,aAAa,MAAM,YAAY,IACjC,CAAC;EACL,GAAI,OAAO,MAAM,YAAY,WAAW,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;EACtE,MAAM;EACN,GAAI,OAAO,MAAM,qBAAqB,WAClC,EAAE,kBAAkB,MAAM,iBAAiB,IAC3C,CAAC;EACL,QAAQ,MAAM;EACd,UAAU,MAAM;CAClB;AACF;AAEA,SAAS,aAAa,OAAqC;CACzD,OACE,OAAO,UAAU,YACjB,cAAc,KAAK,KACnB,YAAY,KAAK,KACjB,iBAAiB,KAAK;AAE1B;AAEA,SAAS,YAAY,OAAyB;CAC5C,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAGT,IAAI,MAAM,SAAS,aACjB,OAAO,OAAO,MAAM,SAAS,YAAY,cAAc,MAAM,IAAI;CAGnE,OAAO,MAAM,SAAS,kBAAkB,iBAAiB,MAAM,OAAO;AACxE;AAEA,SAAS,iBAAiB,OAAyB;CACjD,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,oBAAoB;AACjE;AAEA,SAAS,qBAAqB,OAAyB;CACrD,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAC5C,OAAO;CAGT,OACE,MAAM,SAAS,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS;AAEtE;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,cAAc,OAA4C;CACjE,OACE,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ;AAE1E"}
|