@polpo-ai/core 0.15.76 → 0.15.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/run-delivery-follower.d.ts +41 -0
- package/dist/run-delivery-follower.d.ts.map +1 -0
- package/dist/run-delivery-follower.js +194 -0
- package/dist/run-delivery-follower.js.map +1 -0
- package/dist/run-delivery-follower.test.d.ts +2 -0
- package/dist/run-delivery-follower.test.d.ts.map +1 -0
- package/dist/run-delivery-follower.test.js +223 -0
- package/dist/run-delivery-follower.test.js.map +1 -0
- package/dist/run-delivery-owner.d.ts +34 -0
- package/dist/run-delivery-owner.d.ts.map +1 -0
- package/dist/run-delivery-owner.js +156 -0
- package/dist/run-delivery-owner.js.map +1 -0
- package/dist/run-delivery-owner.test.d.ts +2 -0
- package/dist/run-delivery-owner.test.d.ts.map +1 -0
- package/dist/run-delivery-owner.test.js +135 -0
- package/dist/run-delivery-owner.test.js.map +1 -0
- package/dist/run-delivery.d.ts +155 -0
- package/dist/run-delivery.d.ts.map +1 -0
- package/dist/run-delivery.js +422 -0
- package/dist/run-delivery.js.map +1 -0
- package/dist/run-delivery.test.d.ts +2 -0
- package/dist/run-delivery.test.d.ts.map +1 -0
- package/dist/run-delivery.test.js +212 -0
- package/dist/run-delivery.test.js.map +1 -0
- package/package.json +13 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { RunDeliveryValidationError, } from "./run-delivery.js";
|
|
2
|
+
/** Execute one run under a renewable lease. Only explicit cancellation aborts an owner. */
|
|
3
|
+
export async function executeOwnedRun(options) {
|
|
4
|
+
const leaseDurationMs = options.leaseDurationMs ?? 30_000;
|
|
5
|
+
const heartbeatIntervalMs = options.heartbeatIntervalMs ?? 10_000;
|
|
6
|
+
validateTimings(heartbeatIntervalMs, leaseDurationMs);
|
|
7
|
+
const now = options.now ?? (() => new Date());
|
|
8
|
+
const currentTime = () => {
|
|
9
|
+
const value = now();
|
|
10
|
+
if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {
|
|
11
|
+
throw new RunDeliveryValidationError("Run execution owner clock returned an invalid date");
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
const makeLease = () => ({
|
|
16
|
+
owner: options.owner,
|
|
17
|
+
token: options.token,
|
|
18
|
+
expiresAt: new Date(currentTime().getTime() + leaseDurationMs).toISOString(),
|
|
19
|
+
});
|
|
20
|
+
let activeLease = makeLease();
|
|
21
|
+
if (!await options.leaseStore.claim(options.runId, activeLease)) {
|
|
22
|
+
return { status: "not-owner" };
|
|
23
|
+
}
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
let stopHeartbeat = false;
|
|
26
|
+
let heartbeatTimer;
|
|
27
|
+
let releaseHeartbeatWait;
|
|
28
|
+
let lostLease = false;
|
|
29
|
+
let cancellationObserved = false;
|
|
30
|
+
const waitForHeartbeat = () => new Promise((resolve) => {
|
|
31
|
+
let settled = false;
|
|
32
|
+
const finish = () => {
|
|
33
|
+
if (settled)
|
|
34
|
+
return;
|
|
35
|
+
settled = true;
|
|
36
|
+
if (heartbeatTimer)
|
|
37
|
+
clearTimeout(heartbeatTimer);
|
|
38
|
+
heartbeatTimer = undefined;
|
|
39
|
+
releaseHeartbeatWait = undefined;
|
|
40
|
+
resolve();
|
|
41
|
+
};
|
|
42
|
+
releaseHeartbeatWait = finish;
|
|
43
|
+
heartbeatTimer = setTimeout(finish, heartbeatIntervalMs);
|
|
44
|
+
});
|
|
45
|
+
const heartbeat = async () => {
|
|
46
|
+
while (!stopHeartbeat) {
|
|
47
|
+
await waitForHeartbeat();
|
|
48
|
+
if (stopHeartbeat)
|
|
49
|
+
return;
|
|
50
|
+
const cancellation = await options.cancellationStore?.get(options.runId);
|
|
51
|
+
if (cancellation) {
|
|
52
|
+
cancellationObserved = true;
|
|
53
|
+
await options.journal.append(options.runId, {
|
|
54
|
+
id: "run.cancelling",
|
|
55
|
+
type: "run.cancelling",
|
|
56
|
+
data: {
|
|
57
|
+
...(cancellation.reason ? { reason: cancellation.reason } : {}),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
controller.abort("run_cancelled");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const renewed = makeLease();
|
|
64
|
+
if (!await options.leaseStore.renew(options.runId, renewed)) {
|
|
65
|
+
lostLease = true;
|
|
66
|
+
controller.abort("run_lease_lost");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
activeLease = renewed;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
let heartbeatPromise;
|
|
73
|
+
try {
|
|
74
|
+
await options.journal.append(options.runId, {
|
|
75
|
+
id: "run.started",
|
|
76
|
+
type: "run.started",
|
|
77
|
+
data: {},
|
|
78
|
+
});
|
|
79
|
+
const existingCancellation = await options.cancellationStore?.get(options.runId);
|
|
80
|
+
if (existingCancellation) {
|
|
81
|
+
cancellationObserved = true;
|
|
82
|
+
await options.journal.append(options.runId, {
|
|
83
|
+
id: "run.cancelling",
|
|
84
|
+
type: "run.cancelling",
|
|
85
|
+
data: {
|
|
86
|
+
...(existingCancellation.reason ? { reason: existingCancellation.reason } : {}),
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
controller.abort("run_cancelled");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
heartbeatPromise = heartbeat();
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await options.producer({
|
|
96
|
+
runId: options.runId,
|
|
97
|
+
signal: controller.signal,
|
|
98
|
+
journal: options.journal,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (lostLease)
|
|
103
|
+
return { status: "lost-lease" };
|
|
104
|
+
if (!cancellationObserved) {
|
|
105
|
+
const message = safeErrorMessage(error);
|
|
106
|
+
await options.journal.append(options.runId, {
|
|
107
|
+
id: "run.failed",
|
|
108
|
+
type: "run.failed",
|
|
109
|
+
data: { message },
|
|
110
|
+
});
|
|
111
|
+
return { status: "failed", error: message };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (lostLease)
|
|
115
|
+
return { status: "lost-lease" };
|
|
116
|
+
if (cancellationObserved) {
|
|
117
|
+
await options.journal.append(options.runId, {
|
|
118
|
+
id: "run.cancelled",
|
|
119
|
+
type: "run.cancelled",
|
|
120
|
+
data: {},
|
|
121
|
+
});
|
|
122
|
+
await options.cancellationStore?.clear(options.runId);
|
|
123
|
+
return { status: "cancelled" };
|
|
124
|
+
}
|
|
125
|
+
await options.journal.append(options.runId, {
|
|
126
|
+
id: "run.completed",
|
|
127
|
+
type: "run.completed",
|
|
128
|
+
data: {},
|
|
129
|
+
});
|
|
130
|
+
return { status: "completed" };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
stopHeartbeat = true;
|
|
134
|
+
releaseHeartbeatWait?.();
|
|
135
|
+
await heartbeatPromise;
|
|
136
|
+
await options.leaseStore.release(options.runId, activeLease);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function validateTimings(heartbeatIntervalMs, leaseDurationMs) {
|
|
140
|
+
if (!Number.isInteger(heartbeatIntervalMs) || heartbeatIntervalMs < 1) {
|
|
141
|
+
throw new RunDeliveryValidationError("heartbeatIntervalMs must be a positive integer");
|
|
142
|
+
}
|
|
143
|
+
if (!Number.isInteger(leaseDurationMs) || leaseDurationMs < 2) {
|
|
144
|
+
throw new RunDeliveryValidationError("leaseDurationMs must be an integer greater than one");
|
|
145
|
+
}
|
|
146
|
+
if (heartbeatIntervalMs >= leaseDurationMs) {
|
|
147
|
+
throw new RunDeliveryValidationError("heartbeatIntervalMs must be shorter than leaseDurationMs");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function safeErrorMessage(error) {
|
|
151
|
+
const message = error instanceof Error && error.message.trim()
|
|
152
|
+
? error.message.trim()
|
|
153
|
+
: "Run execution failed";
|
|
154
|
+
return message.slice(0, 2_000);
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=run-delivery-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-delivery-owner.js","sourceRoot":"","sources":["../src/run-delivery-owner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-delivery-owner.test.d.ts","sourceRoot":"","sources":["../src/run-delivery-owner.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { InMemoryRunCancellationStore, InMemoryRunEventStore, InMemoryRunExecutionLeaseStore, } from "./run-delivery.js";
|
|
3
|
+
import { RunEventJournal } from "./run-delivery-follower.js";
|
|
4
|
+
import { executeOwnedRun } from "./run-delivery-owner.js";
|
|
5
|
+
const lease = {
|
|
6
|
+
owner: "worker-a",
|
|
7
|
+
token: "token-a",
|
|
8
|
+
};
|
|
9
|
+
describe("executeOwnedRun", () => {
|
|
10
|
+
it("claims one owner, journals lifecycle events, and releases its lease", async () => {
|
|
11
|
+
const events = new InMemoryRunEventStore();
|
|
12
|
+
const leases = new InMemoryRunExecutionLeaseStore();
|
|
13
|
+
const journal = new RunEventJournal(events);
|
|
14
|
+
const result = await executeOwnedRun({
|
|
15
|
+
runId: "run-a",
|
|
16
|
+
...lease,
|
|
17
|
+
journal,
|
|
18
|
+
leaseStore: leases,
|
|
19
|
+
producer: async ({ journal: producerJournal }) => {
|
|
20
|
+
await producerJournal.append("run-a", {
|
|
21
|
+
type: "output.text.delta",
|
|
22
|
+
data: { text: "hello" },
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
expect(result).toEqual({ status: "completed" });
|
|
27
|
+
expect((await events.listAfter("run-a")).events.map((event) => event.type)).toEqual([
|
|
28
|
+
"run.started",
|
|
29
|
+
"output.text.delta",
|
|
30
|
+
"run.completed",
|
|
31
|
+
]);
|
|
32
|
+
expect(await leases.get("run-a")).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
it("does not execute a second producer while another lease is active", async () => {
|
|
35
|
+
const events = new InMemoryRunEventStore();
|
|
36
|
+
const leases = new InMemoryRunExecutionLeaseStore();
|
|
37
|
+
const now = new Date();
|
|
38
|
+
await leases.claim("run-a", {
|
|
39
|
+
owner: "worker-other",
|
|
40
|
+
token: "token-other",
|
|
41
|
+
expiresAt: new Date(now.getTime() + 60_000).toISOString(),
|
|
42
|
+
});
|
|
43
|
+
let called = false;
|
|
44
|
+
const result = await executeOwnedRun({
|
|
45
|
+
runId: "run-a",
|
|
46
|
+
...lease,
|
|
47
|
+
journal: new RunEventJournal(events),
|
|
48
|
+
leaseStore: leases,
|
|
49
|
+
producer: async () => { called = true; },
|
|
50
|
+
});
|
|
51
|
+
expect(result).toEqual({ status: "not-owner" });
|
|
52
|
+
expect(called).toBe(false);
|
|
53
|
+
expect((await events.listAfter("run-a")).events).toEqual([]);
|
|
54
|
+
});
|
|
55
|
+
it("records a safe failure event and still releases the lease", async () => {
|
|
56
|
+
const events = new InMemoryRunEventStore();
|
|
57
|
+
const leases = new InMemoryRunExecutionLeaseStore();
|
|
58
|
+
const result = await executeOwnedRun({
|
|
59
|
+
runId: "run-a",
|
|
60
|
+
...lease,
|
|
61
|
+
journal: new RunEventJournal(events),
|
|
62
|
+
leaseStore: leases,
|
|
63
|
+
producer: async () => { throw new Error("provider unavailable"); },
|
|
64
|
+
});
|
|
65
|
+
expect(result).toEqual({ status: "failed", error: "provider unavailable" });
|
|
66
|
+
const persisted = (await events.listAfter("run-a")).events;
|
|
67
|
+
expect(persisted.map((event) => event.type)).toEqual(["run.started", "run.failed"]);
|
|
68
|
+
expect(persisted[1]?.data).toEqual({ message: "provider unavailable" });
|
|
69
|
+
expect(await leases.get("run-a")).toBeNull();
|
|
70
|
+
});
|
|
71
|
+
it("turns an explicit cancellation request into producer abort and run.cancelled", async () => {
|
|
72
|
+
const events = new InMemoryRunEventStore();
|
|
73
|
+
const leases = new InMemoryRunExecutionLeaseStore();
|
|
74
|
+
const cancellations = new InMemoryRunCancellationStore();
|
|
75
|
+
let producerStarted;
|
|
76
|
+
const started = new Promise((resolve) => { producerStarted = resolve; });
|
|
77
|
+
const execution = executeOwnedRun({
|
|
78
|
+
runId: "run-a",
|
|
79
|
+
...lease,
|
|
80
|
+
journal: new RunEventJournal(events),
|
|
81
|
+
leaseStore: leases,
|
|
82
|
+
cancellationStore: cancellations,
|
|
83
|
+
heartbeatIntervalMs: 5,
|
|
84
|
+
leaseDurationMs: 50,
|
|
85
|
+
producer: async ({ signal }) => {
|
|
86
|
+
producerStarted();
|
|
87
|
+
await new Promise((resolve) => signal.addEventListener("abort", () => resolve(), { once: true }));
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
await started;
|
|
91
|
+
await cancellations.request("run-a", {
|
|
92
|
+
requestedAt: new Date().toISOString(),
|
|
93
|
+
reason: "user_request",
|
|
94
|
+
});
|
|
95
|
+
expect(await execution).toEqual({ status: "cancelled" });
|
|
96
|
+
expect((await events.listAfter("run-a")).events.map((event) => event.type)).toEqual([
|
|
97
|
+
"run.started",
|
|
98
|
+
"run.cancelling",
|
|
99
|
+
"run.cancelled",
|
|
100
|
+
]);
|
|
101
|
+
expect(await cancellations.get("run-a")).toBeNull();
|
|
102
|
+
});
|
|
103
|
+
it("does not terminalize after losing its lease to another owner", async () => {
|
|
104
|
+
let renewCount = 0;
|
|
105
|
+
const baseLeases = new InMemoryRunExecutionLeaseStore();
|
|
106
|
+
const leaseStore = {
|
|
107
|
+
claim: baseLeases.claim.bind(baseLeases),
|
|
108
|
+
get: baseLeases.get.bind(baseLeases),
|
|
109
|
+
release: baseLeases.release.bind(baseLeases),
|
|
110
|
+
renew: async (...args) => {
|
|
111
|
+
renewCount += 1;
|
|
112
|
+
if (renewCount === 1)
|
|
113
|
+
return false;
|
|
114
|
+
return baseLeases.renew(...args);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const events = new InMemoryRunEventStore();
|
|
118
|
+
const result = await executeOwnedRun({
|
|
119
|
+
runId: "run-a",
|
|
120
|
+
...lease,
|
|
121
|
+
journal: new RunEventJournal(events),
|
|
122
|
+
leaseStore,
|
|
123
|
+
heartbeatIntervalMs: 5,
|
|
124
|
+
leaseDurationMs: 50,
|
|
125
|
+
producer: async ({ signal }) => {
|
|
126
|
+
await new Promise((resolve) => signal.addEventListener("abort", () => resolve(), { once: true }));
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
expect(result).toEqual({ status: "lost-lease" });
|
|
130
|
+
expect((await events.listAfter("run-a")).events.map((event) => event.type)).toEqual([
|
|
131
|
+
"run.started",
|
|
132
|
+
]);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=run-delivery-owner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-delivery-owner.test.js","sourceRoot":"","sources":["../src/run-delivery-owner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,KAAK;YACR,OAAO;YACP,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE;gBAC/C,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;oBACpC,IAAI,EAAE,mBAAmB;oBACzB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;iBACxB,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAClF,aAAa;YACb,mBAAmB;YACnB,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;YAC1B,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,aAAa;YACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;SAC1D,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,KAAK;YACR,OAAO,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC;YACpC,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,KAAK;YACR,OAAO,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC;YACpC,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;SACnE,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,4BAA4B,EAAE,CAAC;QACzD,IAAI,eAA4B,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,eAAe,CAAC;YAChC,KAAK,EAAE,OAAO;YACd,GAAG,KAAK;YACR,OAAO,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC;YACpC,UAAU,EAAE,MAAM;YAClB,iBAAiB,EAAE,aAAa;YAChC,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,EAAE;YACnB,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7B,eAAe,EAAE,CAAC;gBAClB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1G,CAAC;SACF,CAAC,CAAC;QACH,MAAM,OAAO,CAAC;QAEd,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE;YACnC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAClF,aAAa;YACb,gBAAgB;YAChB,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACxC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YACpC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5C,KAAK,EAAE,KAAK,EAAE,GAAG,IAAyC,EAAE,EAAE;gBAC5D,UAAU,IAAI,CAAC,CAAC;gBAChB,IAAI,UAAU,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACnC,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YACnC,CAAC;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,KAAK;YACR,OAAO,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC;YACpC,UAAU;YACV,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,EAAE;YACnB,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1G,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAClF,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
export declare const RUN_STREAM_EVENT_SCHEMA_VERSION: 1;
|
|
2
|
+
export declare const DEFAULT_RUN_EVENT_PAGE_SIZE = 100;
|
|
3
|
+
export declare const MAX_RUN_EVENT_PAGE_SIZE = 1000;
|
|
4
|
+
export declare const MAX_RUN_EVENT_BYTES: number;
|
|
5
|
+
export declare const MAX_RUN_EVENT_ID_LENGTH = 500;
|
|
6
|
+
export declare const MAX_RUN_ID_LENGTH = 200;
|
|
7
|
+
export declare const MAX_RUN_EVENT_TYPE_LENGTH = 200;
|
|
8
|
+
export declare const MAX_RUN_EVENT_BATCH_SIZE = 256;
|
|
9
|
+
export type RunDisconnectPolicy = "cancel" | "continue";
|
|
10
|
+
export interface RunDeliveryPolicy {
|
|
11
|
+
onDisconnect: RunDisconnectPolicy;
|
|
12
|
+
}
|
|
13
|
+
export type RunStreamEventType = "run.accepted" | "run.started" | "run.cancelling" | "run.cancelled" | "run.completed" | "run.failed" | "response.chunk" | "response.done" | "response.error" | "output.text.delta" | "output.reasoning.delta" | "tool.started" | "tool.arguments" | "tool.completed" | "tool.failed" | "loop.step.started" | "loop.step.completed" | "loop.step.failed" | "interaction.ask_user" | "interaction.resumed" | "approval.requested" | "approval.resolved" | "outcome.registered" | "usage.completed";
|
|
14
|
+
export type RunEventJsonValue = null | boolean | number | string | RunEventJsonValue[] | {
|
|
15
|
+
[key: string]: RunEventJsonValue;
|
|
16
|
+
};
|
|
17
|
+
export interface RunStreamEvent<TData extends Record<string, RunEventJsonValue> = Record<string, RunEventJsonValue>> {
|
|
18
|
+
id: string;
|
|
19
|
+
runId: string;
|
|
20
|
+
sequence: number;
|
|
21
|
+
schemaVersion: typeof RUN_STREAM_EVENT_SCHEMA_VERSION;
|
|
22
|
+
type: RunStreamEventType;
|
|
23
|
+
data: TData;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AppendRunStreamEvent {
|
|
27
|
+
/** Stable producer identity. Reusing it with different content is a conflict. */
|
|
28
|
+
id?: string;
|
|
29
|
+
type: RunStreamEventType;
|
|
30
|
+
data: Record<string, RunEventJsonValue>;
|
|
31
|
+
createdAt?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface NormalizedRunStreamEventInput {
|
|
34
|
+
id?: string;
|
|
35
|
+
type: RunStreamEventType;
|
|
36
|
+
data: Record<string, RunEventJsonValue>;
|
|
37
|
+
createdAt: string;
|
|
38
|
+
/** Generated timestamps are not part of producer retry identity. */
|
|
39
|
+
createdAtExplicit: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface RunEventPage {
|
|
42
|
+
events: RunStreamEvent[];
|
|
43
|
+
nextCursor: string;
|
|
44
|
+
hasMore: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface RunEventBounds {
|
|
47
|
+
firstCursor: string;
|
|
48
|
+
lastCursor: string;
|
|
49
|
+
count: number;
|
|
50
|
+
}
|
|
51
|
+
export interface RunEventStore {
|
|
52
|
+
append(runId: string, event: AppendRunStreamEvent): Promise<RunStreamEvent>;
|
|
53
|
+
/**
|
|
54
|
+
* Append an ordered batch using one store transaction when supported.
|
|
55
|
+
* Implementations that omit this method remain compatible; RunEventJournal
|
|
56
|
+
* falls back to ordered single-event appends.
|
|
57
|
+
*/
|
|
58
|
+
appendMany?(runId: string, events: readonly AppendRunStreamEvent[]): Promise<RunStreamEvent[]>;
|
|
59
|
+
listAfter(runId: string, cursor?: string, limit?: number): Promise<RunEventPage>;
|
|
60
|
+
bounds(runId: string): Promise<RunEventBounds | null>;
|
|
61
|
+
}
|
|
62
|
+
export interface RunExecutionLease {
|
|
63
|
+
owner: string;
|
|
64
|
+
token: string;
|
|
65
|
+
expiresAt: string;
|
|
66
|
+
}
|
|
67
|
+
export interface RunExecutionLeaseStore {
|
|
68
|
+
claim(runId: string, lease: RunExecutionLease): Promise<boolean>;
|
|
69
|
+
renew(runId: string, lease: RunExecutionLease): Promise<boolean>;
|
|
70
|
+
release(runId: string, lease: RunExecutionLease): Promise<boolean>;
|
|
71
|
+
get(runId: string): Promise<RunExecutionLease | null>;
|
|
72
|
+
}
|
|
73
|
+
export interface RunCancellationRequest {
|
|
74
|
+
requestedAt: string;
|
|
75
|
+
reason?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface RunCancellationStore {
|
|
78
|
+
request(runId: string, request: RunCancellationRequest): Promise<RunCancellationRequest>;
|
|
79
|
+
get(runId: string): Promise<RunCancellationRequest | null>;
|
|
80
|
+
clear(runId: string): Promise<boolean>;
|
|
81
|
+
}
|
|
82
|
+
export declare class RunDeliveryValidationError extends Error {
|
|
83
|
+
readonly name: string;
|
|
84
|
+
}
|
|
85
|
+
export declare class RunEventCursorError extends RunDeliveryValidationError {
|
|
86
|
+
readonly name: string;
|
|
87
|
+
}
|
|
88
|
+
export declare class RunEventCursorAheadError extends RunEventCursorError {
|
|
89
|
+
readonly name = "RunEventCursorAheadError";
|
|
90
|
+
}
|
|
91
|
+
export declare class RunEventCursorExpiredError extends RunEventCursorError {
|
|
92
|
+
readonly name = "RunEventCursorExpiredError";
|
|
93
|
+
}
|
|
94
|
+
export declare class RunEventConflictError extends Error {
|
|
95
|
+
readonly name = "RunEventConflictError";
|
|
96
|
+
}
|
|
97
|
+
export declare class RunExecutionLeaseValidationError extends RunDeliveryValidationError {
|
|
98
|
+
readonly name = "RunExecutionLeaseValidationError";
|
|
99
|
+
}
|
|
100
|
+
export declare function resolveRunDeliveryPolicy(input?: unknown): RunDeliveryPolicy;
|
|
101
|
+
/** Parse a run-scoped cursor. Empty means before the first event. */
|
|
102
|
+
export declare function parseRunEventCursor(cursor?: string): number;
|
|
103
|
+
export declare function formatRunEventCursor(sequence: number): string;
|
|
104
|
+
export declare function validateRunDeliveryRunId(runId: unknown): string;
|
|
105
|
+
export interface InMemoryRunEventStoreOptions {
|
|
106
|
+
now?: () => Date;
|
|
107
|
+
maxEventBytes?: number;
|
|
108
|
+
}
|
|
109
|
+
/** Reference store for conformance tests and ephemeral single-process runtimes. */
|
|
110
|
+
export declare class InMemoryRunEventStore implements RunEventStore {
|
|
111
|
+
private readonly eventsByRun;
|
|
112
|
+
private readonly eventsByProducerId;
|
|
113
|
+
private readonly now;
|
|
114
|
+
private readonly maxEventBytes;
|
|
115
|
+
constructor(options?: InMemoryRunEventStoreOptions);
|
|
116
|
+
append(runId: string, input: AppendRunStreamEvent): Promise<RunStreamEvent>;
|
|
117
|
+
appendMany(runId: string, inputs: readonly AppendRunStreamEvent[]): Promise<RunStreamEvent[]>;
|
|
118
|
+
listAfter(runId: string, cursor?: string, limit?: number): Promise<RunEventPage>;
|
|
119
|
+
bounds(runId: string): Promise<RunEventBounds | null>;
|
|
120
|
+
}
|
|
121
|
+
export interface InMemoryRunExecutionLeaseStoreOptions {
|
|
122
|
+
now?: () => Date;
|
|
123
|
+
}
|
|
124
|
+
/** Compare-and-set reference lease store used by local runtimes and tests. */
|
|
125
|
+
export declare class InMemoryRunExecutionLeaseStore implements RunExecutionLeaseStore {
|
|
126
|
+
private readonly leases;
|
|
127
|
+
private readonly now;
|
|
128
|
+
constructor(options?: InMemoryRunExecutionLeaseStoreOptions);
|
|
129
|
+
claim(runId: string, input: RunExecutionLease): Promise<boolean>;
|
|
130
|
+
renew(runId: string, input: RunExecutionLease): Promise<boolean>;
|
|
131
|
+
release(runId: string, input: RunExecutionLease): Promise<boolean>;
|
|
132
|
+
get(runId: string): Promise<RunExecutionLease | null>;
|
|
133
|
+
}
|
|
134
|
+
export declare class InMemoryRunCancellationStore implements RunCancellationStore {
|
|
135
|
+
private readonly requests;
|
|
136
|
+
request(runId: string, input: RunCancellationRequest): Promise<RunCancellationRequest>;
|
|
137
|
+
get(runId: string): Promise<RunCancellationRequest | null>;
|
|
138
|
+
clear(runId: string): Promise<boolean>;
|
|
139
|
+
}
|
|
140
|
+
export declare function normalizeRunCancellationRequest(runId: string, input: RunCancellationRequest): RunCancellationRequest;
|
|
141
|
+
export interface NormalizeRunExecutionLeaseOptions {
|
|
142
|
+
now?: Date;
|
|
143
|
+
requireFuture?: boolean;
|
|
144
|
+
}
|
|
145
|
+
export declare function normalizeRunExecutionLease(runId: string, input: RunExecutionLease, options?: NormalizeRunExecutionLeaseOptions): RunExecutionLease;
|
|
146
|
+
export interface NormalizeRunStreamEventOptions {
|
|
147
|
+
now?: () => Date;
|
|
148
|
+
}
|
|
149
|
+
export declare function normalizeRunStreamEventInput(runId: string, input: AppendRunStreamEvent, options?: NormalizeRunStreamEventOptions): NormalizedRunStreamEventInput;
|
|
150
|
+
export interface MaterializeRunStreamEventOptions {
|
|
151
|
+
maxEventBytes?: number;
|
|
152
|
+
}
|
|
153
|
+
export declare function materializeRunStreamEvent(runId: string, sequence: number, input: NormalizedRunStreamEventInput, options?: MaterializeRunStreamEventOptions): RunStreamEvent;
|
|
154
|
+
export declare function runStreamEventMatchesInput(event: RunStreamEvent, input: NormalizedRunStreamEventInput): boolean;
|
|
155
|
+
//# sourceMappingURL=run-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-delivery.d.ts","sourceRoot":"","sources":["../src/run-delivery.ts"],"names":[],"mappings":"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"}
|