@cotal-ai/runtime 0.47.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mesh-handler.d.ts +12 -15
- package/dist/mesh-handler.d.ts.map +1 -1
- package/dist/mesh-handler.js +108 -39
- package/dist/mesh-handler.js.map +1 -1
- package/dist/run-command.d.ts.map +1 -1
- package/dist/run-command.js +47 -27
- package/dist/run-command.js.map +1 -1
- package/dist/run-driver.d.ts +1 -1
- package/dist/run-driver.d.ts.map +1 -1
- package/dist/run-driver.js +16 -40
- package/dist/run-driver.js.map +1 -1
- package/dist/run-effect-host.d.ts +13 -0
- package/dist/run-effect-host.d.ts.map +1 -0
- package/dist/run-effect-host.js +57 -0
- package/dist/run-effect-host.js.map +1 -0
- package/dist/run-host.d.ts.map +1 -1
- package/dist/run-host.js +14 -13
- package/dist/run-host.js.map +1 -1
- package/dist/run-pause-host.d.ts +23 -0
- package/dist/run-pause-host.d.ts.map +1 -0
- package/dist/run-pause-host.js +99 -0
- package/dist/run-pause-host.js.map +1 -0
- package/dist/run-record-host.d.ts +20 -0
- package/dist/run-record-host.d.ts.map +1 -0
- package/dist/run-record-host.js +76 -0
- package/dist/run-record-host.js.map +1 -0
- package/dist/run-scope-authority.d.ts +51 -0
- package/dist/run-scope-authority.d.ts.map +1 -0
- package/dist/run-scope-authority.js +193 -0
- package/dist/run-scope-authority.js.map +1 -0
- package/dist/run-wait-host.d.ts +22 -0
- package/dist/run-wait-host.d.ts.map +1 -0
- package/dist/run-wait-host.js +70 -0
- package/dist/run-wait-host.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type EffectContext, type JournalEntry } from "@cotal-ai/lang";
|
|
2
|
+
import { type RunHostPlanes, type RunHostLease, type RunJournalActivation } from "@cotal-ai/core";
|
|
3
|
+
interface RunScopeSnapshot {
|
|
4
|
+
readonly entries: readonly JournalEntry[];
|
|
5
|
+
readonly activation: RunJournalActivation | undefined;
|
|
6
|
+
}
|
|
7
|
+
/** The reader and its replay durable are host-bound. No request selects another run. */
|
|
8
|
+
export declare function createRunScopeAuthority(broker: RunHostPlanes, runId: string, lease: RunHostLease): RunScopeAuthority;
|
|
9
|
+
export type PauseOperation = "read" | "mint" | "attach" | "rearm" | "heartbeat" | "claim" | "fire";
|
|
10
|
+
export type WaitOperation = "open" | "fetch" | "ack" | "close";
|
|
11
|
+
export declare class RunScopeDenied extends Error {
|
|
12
|
+
constructor(runId: string, resource: string, operation: string);
|
|
13
|
+
}
|
|
14
|
+
/** The caller supplies a reader already bound to one run's broker journal. Requests cannot
|
|
15
|
+
* replace that reader or provide their own entries. Each decision uses a fresh folded snapshot. */
|
|
16
|
+
export declare class RunScopeAuthority {
|
|
17
|
+
private readonly runId;
|
|
18
|
+
private readonly readJournal;
|
|
19
|
+
private readonly attempt;
|
|
20
|
+
private reading;
|
|
21
|
+
constructor(runId: string, readJournal: () => Promise<RunScopeSnapshot>, attempt: Pick<RunHostLease, "holder" | "epoch" | "fencingToken">);
|
|
22
|
+
private entries;
|
|
23
|
+
/** Fork prefixes keep settled parent ids as history. Such an entry can be replayed but
|
|
24
|
+
* cannot authorize this child to operate on a parent's checkpoint or wait consumer. */
|
|
25
|
+
private owns;
|
|
26
|
+
journal(): Promise<readonly JournalEntry[]>;
|
|
27
|
+
effect(kind: string, ctx: Pick<EffectContext, "key" | "requestId" | "attempt">): Promise<JournalEntry>;
|
|
28
|
+
private cleanup;
|
|
29
|
+
/** Cleanup authority comes from the settled parent scope. A settled child alone carries none. */
|
|
30
|
+
cleanupEntries(): Promise<readonly JournalEntry[]>;
|
|
31
|
+
pause(token: string, operation: PauseOperation): Promise<JournalEntry>;
|
|
32
|
+
wait(requestId: string, operation: WaitOperation): Promise<JournalEntry>;
|
|
33
|
+
matchedMessage(requestId: string, sequence: number): Promise<JournalEntry>;
|
|
34
|
+
/** The driver cannot add tokens to the adoption sweep. Plane status still decides whether
|
|
35
|
+
* a derived wait timer exists and needs rearming. This list never authorizes its first mint. */
|
|
36
|
+
rearmTokens(): Promise<readonly string[]>;
|
|
37
|
+
}
|
|
38
|
+
/** A receipt's identity is held in a WeakMap. Serializing, copying or inventing a receipt
|
|
39
|
+
* does not copy the delivery it authorizes. The host never exposes its ACK subject. */
|
|
40
|
+
export interface WaitReceipt {
|
|
41
|
+
readonly _brand: "WaitReceipt";
|
|
42
|
+
}
|
|
43
|
+
export declare class WaitReceipts {
|
|
44
|
+
private readonly deliveries;
|
|
45
|
+
private readonly byWait;
|
|
46
|
+
issue(requestId: string, ack: () => void | Promise<void>): WaitReceipt;
|
|
47
|
+
ack(requestId: string, receipt: WaitReceipt): Promise<void>;
|
|
48
|
+
close(requestId: string): void;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=run-scope-authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-scope-authority.d.ts","sourceRoot":"","sources":["../src/run-scope-authority.ts"],"names":[],"mappings":"AACA,OAAO,EAAyD,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9H,OAAO,EAAoB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEpH,UAAU,gBAAgB;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACvD;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,GAClB,iBAAiB,CAUnB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AACnG,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/D,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAI/D;AAED;oGACoG;AACpG,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,OAAO,CAAoC;gBAGhC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAC5C,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,cAAc,CAAC;YAGrE,OAAO;IAgBrB;4FACwF;IACxF,OAAO,CAAC,IAAI;IASN,OAAO,IAAI,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAI3C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAU5G,OAAO,CAAC,OAAO;IAaf,iGAAiG;IAC3F,cAAc,IAAI,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAMlD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAiBtE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAWxE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOhF;qGACiG;IAC3F,WAAW,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;CAKhD;AAoBD;wFACwF;AACxF,MAAM,WAAW,WAAW;IAAG,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE;AAE/D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsF;IACjH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;IAShE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAM/B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { Journal, digest, journalEntryKeyString, stepKeyString } from "@cotal-ai/lang";
|
|
3
|
+
import { replayRunJournal } from "@cotal-ai/core";
|
|
4
|
+
/** The reader and its replay durable are host-bound. No request selects another run. */
|
|
5
|
+
export function createRunScopeAuthority(broker, runId, lease) {
|
|
6
|
+
const pinned = structuredClone(lease);
|
|
7
|
+
return new RunScopeAuthority(runId, async () => {
|
|
8
|
+
const replay = await replayRunJournal(broker.js, broker.jsm, broker.space, runId, pinned.takeoverId);
|
|
9
|
+
const last = replay.records.findLast(({ record }) => record.kind === "activation")?.record;
|
|
10
|
+
return {
|
|
11
|
+
entries: replay.records.flatMap(({ record }) => record.kind === "step" ? [record.entry] : []),
|
|
12
|
+
activation: last?.kind === "activation" ? last : undefined,
|
|
13
|
+
};
|
|
14
|
+
}, pinned);
|
|
15
|
+
}
|
|
16
|
+
export class RunScopeDenied extends Error {
|
|
17
|
+
constructor(runId, resource, operation) {
|
|
18
|
+
super(`run ${runId} has no current journal authority to ${operation} ${resource}`);
|
|
19
|
+
this.name = "RunScopeDenied";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** The caller supplies a reader already bound to one run's broker journal. Requests cannot
|
|
23
|
+
* replace that reader or provide their own entries. Each decision uses a fresh folded snapshot. */
|
|
24
|
+
export class RunScopeAuthority {
|
|
25
|
+
runId;
|
|
26
|
+
readJournal;
|
|
27
|
+
attempt;
|
|
28
|
+
reading = Promise.resolve();
|
|
29
|
+
constructor(runId, readJournal, attempt) {
|
|
30
|
+
this.runId = runId;
|
|
31
|
+
this.readJournal = readJournal;
|
|
32
|
+
this.attempt = attempt;
|
|
33
|
+
}
|
|
34
|
+
async entries() {
|
|
35
|
+
const reading = this.reading.then(() => this.readJournal());
|
|
36
|
+
this.reading = reading.then(() => undefined, () => undefined);
|
|
37
|
+
const snapshot = await reading;
|
|
38
|
+
const active = snapshot.activation;
|
|
39
|
+
if (active === undefined || active.run !== this.runId || active.holder !== this.attempt.holder
|
|
40
|
+
|| active.epoch !== this.attempt.epoch || active.fencingToken !== this.attempt.fencingToken)
|
|
41
|
+
throw new RunScopeDenied(this.runId, "drive attempt", "use superseded host");
|
|
42
|
+
const entries = new Journal({ run: this.runId, entries: snapshot.entries }).entries();
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (entry.requestId === undefined || entry.state === "settled")
|
|
45
|
+
continue;
|
|
46
|
+
if (!this.owns(entry))
|
|
47
|
+
throw new RunScopeDenied(this.runId, entry.requestId, "load");
|
|
48
|
+
}
|
|
49
|
+
return entries;
|
|
50
|
+
}
|
|
51
|
+
/** Fork prefixes keep settled parent ids as history. Such an entry can be replayed but
|
|
52
|
+
* cannot authorize this child to operate on a parent's checkpoint or wait consumer. */
|
|
53
|
+
owns(entry) {
|
|
54
|
+
if (entry.requestId === undefined)
|
|
55
|
+
return false;
|
|
56
|
+
const attempt = entry.attempt ?? 0;
|
|
57
|
+
if (!Number.isSafeInteger(attempt) || attempt < 0)
|
|
58
|
+
return false;
|
|
59
|
+
const hash = digest([this.runId, journalEntryKeyString(entry), entry.inputHash, attempt]);
|
|
60
|
+
const expected = Buffer.from(hash.slice("sha256:".length), "hex").toString("base64url");
|
|
61
|
+
return entry.requestId === expected;
|
|
62
|
+
}
|
|
63
|
+
async journal() {
|
|
64
|
+
return this.entries();
|
|
65
|
+
}
|
|
66
|
+
async effect(kind, ctx) {
|
|
67
|
+
const entries = await this.entries();
|
|
68
|
+
const entry = entries.find((candidate) => journalEntryKeyString(candidate) === stepKeyString(ctx.key));
|
|
69
|
+
if (entry === undefined || entry.kind !== kind || entry.requestId !== ctx.requestId
|
|
70
|
+
|| (entry.attempt ?? 0) !== ctx.attempt || entry.state !== "pending"
|
|
71
|
+
|| this.cleanup(entries).has(journalEntryKeyString(entry)))
|
|
72
|
+
throw new RunScopeDenied(this.runId, ctx.requestId, `perform ${kind}`);
|
|
73
|
+
return entry;
|
|
74
|
+
}
|
|
75
|
+
cleanup(entries) {
|
|
76
|
+
const owed = new Set();
|
|
77
|
+
for (const parent of entries) {
|
|
78
|
+
if (parent.state !== "settled" || parent.cancel === undefined || parent.cancel.issued)
|
|
79
|
+
continue;
|
|
80
|
+
const prefixes = parent.cancel.losers.map((branch) => `${journalEntryKeyString(parent)}/b:${branch}/`);
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
const key = journalEntryKeyString(entry);
|
|
83
|
+
if (prefixes.some((prefix) => key.startsWith(prefix)))
|
|
84
|
+
owed.add(key);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return owed;
|
|
88
|
+
}
|
|
89
|
+
/** Cleanup authority comes from the settled parent scope. A settled child alone carries none. */
|
|
90
|
+
async cleanupEntries() {
|
|
91
|
+
const entries = await this.entries();
|
|
92
|
+
const owed = this.cleanup(entries);
|
|
93
|
+
return entries.filter((entry) => this.owns(entry) && owed.has(journalEntryKeyString(entry)));
|
|
94
|
+
}
|
|
95
|
+
async pause(token, operation) {
|
|
96
|
+
const entries = await this.entries();
|
|
97
|
+
const entry = entries.find((candidate) => this.owns(candidate) && pauseTokens(candidate).includes(token));
|
|
98
|
+
if (entry !== undefined) {
|
|
99
|
+
if (entry.kind === "wait" && (operation === "mint" || operation === "heartbeat")) {
|
|
100
|
+
const timers = entry.external?.waitTimers;
|
|
101
|
+
if (!Array.isArray(timers) || !timers.includes(token))
|
|
102
|
+
throw new RunScopeDenied(this.runId, token, `${operation} unrecorded wait timer`);
|
|
103
|
+
}
|
|
104
|
+
if (operation === "read")
|
|
105
|
+
return entry;
|
|
106
|
+
const cleaning = this.cleanup(entries).has(journalEntryKeyString(entry));
|
|
107
|
+
if (operation === "claim" && cleaning)
|
|
108
|
+
return entry;
|
|
109
|
+
if (entry.state === "pending" && !cleaning)
|
|
110
|
+
return entry;
|
|
111
|
+
}
|
|
112
|
+
throw new RunScopeDenied(this.runId, token, operation);
|
|
113
|
+
}
|
|
114
|
+
async wait(requestId, operation) {
|
|
115
|
+
const entries = await this.entries();
|
|
116
|
+
const entry = entries.find((candidate) => this.owns(candidate) && candidate.kind === "wait" && candidate.requestId === requestId);
|
|
117
|
+
if (entry !== undefined) {
|
|
118
|
+
const cleaning = this.cleanup(entries).has(journalEntryKeyString(entry));
|
|
119
|
+
if (operation === "close" && cleaning)
|
|
120
|
+
return entry;
|
|
121
|
+
if (entry.state === "pending" && !cleaning)
|
|
122
|
+
return entry;
|
|
123
|
+
}
|
|
124
|
+
throw new RunScopeDenied(this.runId, requestId, operation);
|
|
125
|
+
}
|
|
126
|
+
async matchedMessage(requestId, sequence) {
|
|
127
|
+
const entry = (await this.entries()).find((candidate) => this.owns(candidate) && candidate.kind === "wait" && candidate.requestId === requestId);
|
|
128
|
+
if (!Number.isSafeInteger(sequence) || sequence <= 0 || entry?.external?.chatSeq !== sequence)
|
|
129
|
+
throw new RunScopeDenied(this.runId, `${requestId}/${sequence}`, "read message");
|
|
130
|
+
return entry;
|
|
131
|
+
}
|
|
132
|
+
/** The driver cannot add tokens to the adoption sweep. Plane status still decides whether
|
|
133
|
+
* a derived wait timer exists and needs rearming. This list never authorizes its first mint. */
|
|
134
|
+
async rearmTokens() {
|
|
135
|
+
const entries = await this.entries();
|
|
136
|
+
const owed = this.cleanup(entries);
|
|
137
|
+
return entries.filter((entry) => this.owns(entry) && entry.state === "pending" && !owed.has(journalEntryKeyString(entry))).flatMap(pauseTokens);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Identities a step can own. An ask's old attempt drops out as soon as the next bind lands. */
|
|
141
|
+
function pauseTokens(entry) {
|
|
142
|
+
const id = entry.requestId;
|
|
143
|
+
if (id === undefined)
|
|
144
|
+
return [];
|
|
145
|
+
if (entry.kind === "sleep" || entry.kind === "checkpoint" || entry.kind === "turn")
|
|
146
|
+
return [id];
|
|
147
|
+
if (entry.kind === "wait")
|
|
148
|
+
return [id, derive(id, "wait-timeout")];
|
|
149
|
+
if (entry.kind !== "ask")
|
|
150
|
+
return [];
|
|
151
|
+
const attempt = entry.external?.attempt ?? 1;
|
|
152
|
+
if (typeof attempt !== "number" || !Number.isSafeInteger(attempt) || attempt < 1)
|
|
153
|
+
return [];
|
|
154
|
+
const expected = attempt === 1 ? id : derive(id, `ask-attempt-${attempt}`);
|
|
155
|
+
if (entry.external?.askToken !== undefined && entry.external.askToken !== expected)
|
|
156
|
+
return [];
|
|
157
|
+
return [expected];
|
|
158
|
+
}
|
|
159
|
+
function derive(requestId, purpose) {
|
|
160
|
+
return createHash("sha256").update(`${requestId}:${purpose}`, "utf8").digest("base64url");
|
|
161
|
+
}
|
|
162
|
+
export class WaitReceipts {
|
|
163
|
+
deliveries = new WeakMap();
|
|
164
|
+
byWait = new Map();
|
|
165
|
+
issue(requestId, ack) {
|
|
166
|
+
const receipt = Object.freeze({ _brand: "WaitReceipt" });
|
|
167
|
+
this.deliveries.set(receipt, { requestId, ack });
|
|
168
|
+
const held = this.byWait.get(requestId) ?? new Set();
|
|
169
|
+
held.add(receipt);
|
|
170
|
+
this.byWait.set(requestId, held);
|
|
171
|
+
return receipt;
|
|
172
|
+
}
|
|
173
|
+
async ack(requestId, receipt) {
|
|
174
|
+
const delivery = this.deliveries.get(receipt);
|
|
175
|
+
if (delivery === undefined || delivery.requestId !== requestId)
|
|
176
|
+
throw new Error(`wait ${requestId} has no live delivery for this receipt`);
|
|
177
|
+
this.deliveries.delete(receipt);
|
|
178
|
+
const held = this.byWait.get(requestId);
|
|
179
|
+
held.delete(receipt);
|
|
180
|
+
if (held.size === 0)
|
|
181
|
+
this.byWait.delete(requestId);
|
|
182
|
+
await delivery.ack();
|
|
183
|
+
}
|
|
184
|
+
close(requestId) {
|
|
185
|
+
const held = this.byWait.get(requestId);
|
|
186
|
+
if (held === undefined)
|
|
187
|
+
return;
|
|
188
|
+
for (const receipt of held)
|
|
189
|
+
this.deliveries.delete(receipt);
|
|
190
|
+
this.byWait.delete(requestId);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=run-scope-authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-scope-authority.js","sourceRoot":"","sources":["../src/run-scope-authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { JetStreamClient, JetStreamManager } from "@nats-io/jetstream";
|
|
2
|
+
import { RunScopeAuthority, type WaitReceipt } from "./run-scope-authority.js";
|
|
3
|
+
export interface RunWaitMessage {
|
|
4
|
+
readonly sequence: number;
|
|
5
|
+
readonly data: Uint8Array;
|
|
6
|
+
readonly receipt: WaitReceipt;
|
|
7
|
+
}
|
|
8
|
+
/** Only these operations cross from a driver into the trusted wait host. Broker objects,
|
|
9
|
+
* consumer names and ACK subjects remain inside the closure. */
|
|
10
|
+
export interface RunWaitHost {
|
|
11
|
+
open(requestId: string, channel: string): Promise<void>;
|
|
12
|
+
fetch(requestId: string): Promise<readonly RunWaitMessage[]>;
|
|
13
|
+
ack(requestId: string, receipt: WaitReceipt): Promise<void>;
|
|
14
|
+
close(requestId: string): Promise<void>;
|
|
15
|
+
messageAt(requestId: string, sequence: number): Promise<Uint8Array>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createRunWaitHost(broker: {
|
|
18
|
+
js: JetStreamClient;
|
|
19
|
+
jsm: JetStreamManager;
|
|
20
|
+
space: string;
|
|
21
|
+
}, authority: RunScopeAuthority): RunWaitHost;
|
|
22
|
+
//# sourceMappingURL=run-wait-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-wait-host.d.ts","sourceRoot":"","sources":["../src/run-wait-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAgC,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE7G,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED;iEACiE;AACjE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAC7D,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IAAE,EAAE,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACrE,SAAS,EAAE,iBAAiB,GAC3B,WAAW,CA6Db"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { chatStream, chatSubject, subjectMatches, waitConsumerConfig, waitConsumerName } from "@cotal-ai/core";
|
|
2
|
+
import { RunScopeAuthority, RunScopeDenied, WaitReceipts } from "./run-scope-authority.js";
|
|
3
|
+
export function createRunWaitHost(broker, authority) {
|
|
4
|
+
const stream = chatStream(broker.space);
|
|
5
|
+
const receipts = new WaitReceipts();
|
|
6
|
+
return Object.freeze({
|
|
7
|
+
async open(requestId, channel) {
|
|
8
|
+
const entry = await authority.wait(requestId, "open");
|
|
9
|
+
if (entry.external?.waitChannel !== channel)
|
|
10
|
+
throw new RunScopeDenied(entry.run, channel, "open unrecorded wait channel");
|
|
11
|
+
await broker.jsm.consumers.add(stream, waitConsumerConfig(broker.space, requestId, channel));
|
|
12
|
+
},
|
|
13
|
+
async fetch(requestId) {
|
|
14
|
+
const entry = await authority.wait(requestId, "fetch");
|
|
15
|
+
const channel = entry.external?.waitChannel;
|
|
16
|
+
if (typeof channel !== "string")
|
|
17
|
+
throw new RunScopeDenied(entry.run, requestId, "fetch unrecorded wait channel");
|
|
18
|
+
const consumer = await broker.js.consumers.get(stream, waitConsumerName(requestId));
|
|
19
|
+
const info = await consumer.info();
|
|
20
|
+
const expected = chatSubject(broker.space, "*", "*", channel);
|
|
21
|
+
if (info.config.filter_subject !== expected || (info.config.filter_subjects?.length ?? 0) !== 0)
|
|
22
|
+
throw new RunScopeDenied(entry.run, requestId, "fetch changed wait filter");
|
|
23
|
+
const messages = [];
|
|
24
|
+
const batch = await consumer.fetch({ max_messages: 16, expires: 2_000 });
|
|
25
|
+
try {
|
|
26
|
+
for await (const message of batch) {
|
|
27
|
+
if (!subjectMatches(expected, message.subject))
|
|
28
|
+
throw new RunScopeDenied(entry.run, message.subject, "receive outside wait channel");
|
|
29
|
+
messages.push(Object.freeze({
|
|
30
|
+
sequence: message.seq,
|
|
31
|
+
data: message.data.slice(),
|
|
32
|
+
receipt: receipts.issue(requestId, () => message.ack()),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
batch.stop();
|
|
38
|
+
}
|
|
39
|
+
return messages;
|
|
40
|
+
},
|
|
41
|
+
async ack(requestId, receipt) {
|
|
42
|
+
await authority.wait(requestId, "ack");
|
|
43
|
+
await receipts.ack(requestId, receipt);
|
|
44
|
+
},
|
|
45
|
+
async close(requestId) {
|
|
46
|
+
await authority.wait(requestId, "close");
|
|
47
|
+
try {
|
|
48
|
+
await broker.jsm.consumers.delete(stream, waitConsumerName(requestId));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error?.code !== 10014)
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
receipts.close(requestId);
|
|
55
|
+
},
|
|
56
|
+
async messageAt(requestId, sequence) {
|
|
57
|
+
const entry = await authority.matchedMessage(requestId, sequence);
|
|
58
|
+
const channel = entry.external?.waitChannel;
|
|
59
|
+
if (typeof channel !== "string")
|
|
60
|
+
throw new RunScopeDenied(entry.run, requestId, "read unrecorded wait channel");
|
|
61
|
+
const message = await broker.jsm.streams.getMessage(stream, { seq: sequence });
|
|
62
|
+
if (message === null || message === undefined)
|
|
63
|
+
throw new Error(`wait ${requestId}'s recorded message ${sequence} no longer exists`);
|
|
64
|
+
if (!subjectMatches(chatSubject(broker.space, "*", "*", channel), message.subject))
|
|
65
|
+
throw new RunScopeDenied(entry.run, requestId, "read outside wait channel");
|
|
66
|
+
return message.data.slice();
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=run-wait-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-wait-host.js","sourceRoot":"","sources":["../src/run-wait-host.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cotal-ai/runtime",
|
|
3
3
|
"description": "Cotal workflow runtime: hosts cotal-lang runs on the mesh — the durable step-journal store, the effect handler, and the run driver.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.48.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"@nats-io/jetstream": "^3.4.0",
|
|
22
22
|
"@nats-io/kv": "^3.4.0",
|
|
23
23
|
"@nats-io/transport-node": "^3.4.0",
|
|
24
|
-
"@cotal-ai/core": "0.
|
|
25
|
-
"@cotal-ai/lang": "0.
|
|
26
|
-
"@cotal-ai/workspace": "0.
|
|
24
|
+
"@cotal-ai/core": "0.48.0",
|
|
25
|
+
"@cotal-ai/lang": "0.48.0",
|
|
26
|
+
"@cotal-ai/workspace": "0.48.0"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist"
|