@ixo/flow-work 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/bounded-canonical.d.ts +10 -0
- package/dist/bounded-canonical.d.ts.map +1 -0
- package/dist/bounded-canonical.js +77 -0
- package/dist/bounded-canonical.js.map +1 -0
- package/dist/bounded-codec.d.ts +20 -0
- package/dist/bounded-codec.d.ts.map +1 -0
- package/dist/bounded-codec.js +301 -0
- package/dist/bounded-codec.js.map +1 -0
- package/dist/bounded-contracts.d.ts +114 -0
- package/dist/bounded-contracts.d.ts.map +1 -0
- package/dist/bounded-contracts.js +311 -0
- package/dist/bounded-contracts.js.map +1 -0
- package/dist/bounded-definitions.d.ts +44 -0
- package/dist/bounded-definitions.d.ts.map +1 -0
- package/dist/bounded-definitions.js +340 -0
- package/dist/bounded-definitions.js.map +1 -0
- package/dist/bounded-protocol.d.ts +461 -0
- package/dist/bounded-protocol.d.ts.map +1 -0
- package/dist/bounded-protocol.js +193 -0
- package/dist/bounded-protocol.js.map +1 -0
- package/dist/bounded.d.ts +18 -0
- package/dist/bounded.d.ts.map +1 -0
- package/dist/bounded.js +18 -0
- package/dist/bounded.js.map +1 -0
- package/dist/capability-adapter.d.ts +6 -0
- package/dist/capability-adapter.d.ts.map +1 -0
- package/dist/capability-adapter.js +56 -0
- package/dist/capability-adapter.js.map +1 -0
- package/dist/capability.d.ts +2 -0
- package/dist/capability.d.ts.map +1 -1
- package/dist/capability.js.map +1 -1
- package/dist/durable-input.d.ts +18 -0
- package/dist/durable-input.d.ts.map +1 -0
- package/dist/durable-input.js +126 -0
- package/dist/durable-input.js.map +1 -0
- package/dist/durable-listener.d.ts +55 -0
- package/dist/durable-listener.d.ts.map +1 -0
- package/dist/durable-listener.js +202 -0
- package/dist/durable-listener.js.map +1 -0
- package/dist/durable-store.d.ts +43 -0
- package/dist/durable-store.d.ts.map +1 -0
- package/dist/durable-store.js +188 -0
- package/dist/durable-store.js.map +1 -0
- package/dist/execution-rpc.d.ts +19 -0
- package/dist/execution-rpc.d.ts.map +1 -0
- package/dist/execution-rpc.js +72 -0
- package/dist/execution-rpc.js.map +1 -0
- package/dist/execution-service.d.ts +117 -0
- package/dist/execution-service.d.ts.map +1 -0
- package/dist/execution-service.js +343 -0
- package/dist/execution-service.js.map +1 -0
- package/dist/external-catalog.d.ts +43 -0
- package/dist/external-catalog.d.ts.map +1 -0
- package/dist/external-catalog.js +121 -0
- package/dist/external-catalog.js.map +1 -0
- package/dist/gateway-client.d.ts +30 -0
- package/dist/gateway-client.d.ts.map +1 -0
- package/dist/gateway-client.js +97 -0
- package/dist/gateway-client.js.map +1 -0
- package/dist/node-sqlite.d.ts +12 -0
- package/dist/node-sqlite.d.ts.map +1 -0
- package/dist/node-sqlite.js +45 -0
- package/dist/node-sqlite.js.map +1 -0
- package/dist/protocol.d.ts +4 -4
- package/dist/provider-journal.d.ts +26 -0
- package/dist/provider-journal.d.ts.map +1 -0
- package/dist/provider-journal.js +94 -0
- package/dist/provider-journal.js.map +1 -0
- package/dist/work-authority.d.ts +16 -0
- package/dist/work-authority.d.ts.map +1 -0
- package/dist/work-authority.js +31 -0
- package/dist/work-authority.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { bindingSchema, resultSchema, parse, text, same, operationIdentity, } from './bounded-protocol.js';
|
|
3
|
+
const arbitraryJson = z.custom(() => true);
|
|
4
|
+
export class DurableWorkStore {
|
|
5
|
+
storage;
|
|
6
|
+
constructor(storage) {
|
|
7
|
+
this.storage = storage;
|
|
8
|
+
storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_work (
|
|
9
|
+
key TEXT PRIMARY KEY, flow_id TEXT NOT NULL, operation_id TEXT NOT NULL,
|
|
10
|
+
identity TEXT NOT NULL, binding TEXT NOT NULL, delegation TEXT NOT NULL,
|
|
11
|
+
assign_event TEXT NOT NULL, ready_event TEXT, invoke_event TEXT,
|
|
12
|
+
inputs TEXT, state TEXT NOT NULL, result TEXT, UNIQUE(flow_id,operation_id))`);
|
|
13
|
+
storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_delivery (
|
|
14
|
+
id TEXT PRIMARY KEY, work_key TEXT NOT NULL, room_id TEXT NOT NULL,
|
|
15
|
+
type TEXT NOT NULL, epoch INTEGER NOT NULL, content TEXT NOT NULL, event_id TEXT)`);
|
|
16
|
+
storage.sql.exec(`CREATE INDEX IF NOT EXISTS helper_delivery_pending ON helper_delivery(event_id,id)`);
|
|
17
|
+
storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_input (
|
|
18
|
+
work_key TEXT NOT NULL, request_key TEXT NOT NULL, binding TEXT NOT NULL,
|
|
19
|
+
body TEXT NOT NULL, responders TEXT NOT NULL, deadline INTEGER NOT NULL,
|
|
20
|
+
event_id TEXT, response TEXT, response_event TEXT, PRIMARY KEY(work_key,request_key))`);
|
|
21
|
+
storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_seen (event_id TEXT PRIMARY KEY, fingerprint TEXT NOT NULL)`);
|
|
22
|
+
storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_epochs (flow_id TEXT PRIMARY KEY, epoch INTEGER NOT NULL)`);
|
|
23
|
+
storage.sql.exec(`CREATE INDEX IF NOT EXISTS helper_work_pending ON helper_work(state,key)`);
|
|
24
|
+
storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_scan (id INTEGER PRIMARY KEY, cursor TEXT NOT NULL)`);
|
|
25
|
+
storage.sql.exec(`INSERT OR IGNORE INTO helper_scan VALUES (1,'')`);
|
|
26
|
+
}
|
|
27
|
+
key(binding) {
|
|
28
|
+
return text([binding.admission.flowId, binding.admission.operationId]);
|
|
29
|
+
}
|
|
30
|
+
read(key) {
|
|
31
|
+
const row = this.storage.sql
|
|
32
|
+
.exec('SELECT * FROM helper_work WHERE key=? LIMIT 1', key)
|
|
33
|
+
.toArray()[0];
|
|
34
|
+
if (!row)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
key,
|
|
38
|
+
binding: parse(bindingSchema, String(row.binding)),
|
|
39
|
+
delegation: String(row.delegation),
|
|
40
|
+
assignEvent: String(row.assign_event),
|
|
41
|
+
readyEvent: row.ready_event,
|
|
42
|
+
invokeEvent: row.invoke_event,
|
|
43
|
+
state: row.state,
|
|
44
|
+
inputs: row.inputs === null ? null : parse(arbitraryJson, String(row.inputs)),
|
|
45
|
+
result: row.result === null ? null : parse(resultSchema, String(row.result)),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
assign(binding, delegation, eventId) {
|
|
49
|
+
const key = this.key(binding);
|
|
50
|
+
return this.storage.transactionSync(() => {
|
|
51
|
+
const epoch = this.storage.sql
|
|
52
|
+
.exec('SELECT epoch FROM helper_epochs WHERE flow_id=?', binding.admission.flowId)
|
|
53
|
+
.toArray()[0];
|
|
54
|
+
if (epoch && Number(epoch.epoch) > binding.admission.epoch)
|
|
55
|
+
throw new Error('STALE_OWNERSHIP_EPOCH');
|
|
56
|
+
this.storage.sql.exec(`INSERT INTO helper_epochs VALUES (?,?) ON CONFLICT(flow_id) DO UPDATE SET epoch=MAX(epoch,excluded.epoch)`, binding.admission.flowId, binding.admission.epoch);
|
|
57
|
+
const prior = this.read(key);
|
|
58
|
+
if (prior) {
|
|
59
|
+
if (!same(operationIdentity(prior.binding), operationIdentity(binding)))
|
|
60
|
+
throw new Error('OPERATION_IDENTITY_CONFLICT');
|
|
61
|
+
if (same(prior.binding, binding)) {
|
|
62
|
+
if (prior.delegation !== delegation || prior.assignEvent !== eventId)
|
|
63
|
+
throw new Error('ASSIGNMENT_REPLAY_CONFLICT');
|
|
64
|
+
return prior;
|
|
65
|
+
}
|
|
66
|
+
// A new attempt may recover an old result, but cannot replace active work or its input request policy.
|
|
67
|
+
if (binding.attempt <= prior.binding.attempt ||
|
|
68
|
+
!['complete', 'needs_verification'].includes(prior.state))
|
|
69
|
+
throw new Error('ATTEMPT_CONFLICT');
|
|
70
|
+
const unanswered = this.storage.sql
|
|
71
|
+
.exec('SELECT request_key FROM helper_input WHERE work_key=? AND response IS NULL LIMIT 1', key)
|
|
72
|
+
.toArray()[0];
|
|
73
|
+
if (unanswered)
|
|
74
|
+
throw new Error('INTERACTIVE_ATTEMPT_STILL_OPEN');
|
|
75
|
+
this.storage.sql.exec(`UPDATE helper_work SET binding=?,delegation=?,assign_event=?,ready_event=NULL,invoke_event=NULL WHERE key=?`, text(binding), delegation, eventId, key);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.storage.sql.exec(`INSERT INTO helper_work VALUES (?,?,?,?,?,?,?,NULL,NULL,NULL,'assigned',NULL)`, key, binding.admission.flowId, binding.admission.operationId, text(operationIdentity(binding)), text(binding), delegation, eventId);
|
|
79
|
+
}
|
|
80
|
+
return this.read(key);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
assertCurrent(work) {
|
|
84
|
+
const current = this.read(work.key);
|
|
85
|
+
const epoch = this.storage.sql
|
|
86
|
+
.exec('SELECT epoch FROM helper_epochs WHERE flow_id=?', work.binding.admission.flowId)
|
|
87
|
+
.toArray()[0];
|
|
88
|
+
if (!current ||
|
|
89
|
+
!same(current.binding, work.binding) ||
|
|
90
|
+
Number(epoch?.epoch) !== work.binding.admission.epoch)
|
|
91
|
+
throw new Error('STALE_WORK');
|
|
92
|
+
}
|
|
93
|
+
ready(work, eventId) {
|
|
94
|
+
this.assertCurrent(work);
|
|
95
|
+
if (work.readyEvent && work.readyEvent !== eventId)
|
|
96
|
+
throw new Error('READY_EVENT_CONFLICT');
|
|
97
|
+
this.storage.sql.exec(`UPDATE helper_work SET ready_event=?,state=CASE WHEN state='assigned' THEN 'ready' ELSE state END WHERE key=?`, eventId, work.key);
|
|
98
|
+
}
|
|
99
|
+
accept(work, inputs, eventId) {
|
|
100
|
+
this.assertCurrent(work);
|
|
101
|
+
if (!work.readyEvent)
|
|
102
|
+
throw new Error('READY_REQUIRED');
|
|
103
|
+
if ((work.invokeEvent && work.invokeEvent !== eventId) ||
|
|
104
|
+
(work.inputs !== null && !same(work.inputs, inputs)))
|
|
105
|
+
throw new Error('INVOKE_CONFLICT');
|
|
106
|
+
this.storage.sql.exec(`UPDATE helper_work SET inputs=?,invoke_event=?,state=CASE WHEN state='ready' THEN 'accepted' ELSE state END WHERE key=?`, text(inputs), eventId, work.key);
|
|
107
|
+
return this.read(work.key);
|
|
108
|
+
}
|
|
109
|
+
arm(work) {
|
|
110
|
+
return this.storage.transactionSync(() => {
|
|
111
|
+
this.assertCurrent(work);
|
|
112
|
+
if (this.read(work.key).state !== 'accepted')
|
|
113
|
+
return false;
|
|
114
|
+
this.storage.sql.exec(`UPDATE helper_work SET state='armed' WHERE key=?`, work.key);
|
|
115
|
+
return true;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
finish(work, result) {
|
|
119
|
+
this.assertCurrent(work);
|
|
120
|
+
const encoded = text(resultSchema.parse(result));
|
|
121
|
+
const prior = this.read(work.key);
|
|
122
|
+
if (prior.result &&
|
|
123
|
+
prior.result.outcome !== 'needs_verification' &&
|
|
124
|
+
!same(prior.result, result))
|
|
125
|
+
throw new Error('RESULT_CONFLICT');
|
|
126
|
+
this.storage.sql.exec('UPDATE helper_work SET result=?,state=? WHERE key=?', encoded, result.outcome === 'needs_verification'
|
|
127
|
+
? 'needs_verification'
|
|
128
|
+
: 'complete', work.key);
|
|
129
|
+
}
|
|
130
|
+
pending(limit = 8) {
|
|
131
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 32)
|
|
132
|
+
throw new Error('INVALID_PAGE_LIMIT');
|
|
133
|
+
return this.storage.transactionSync(() => {
|
|
134
|
+
const cursor = String(this.storage.sql
|
|
135
|
+
.exec('SELECT cursor FROM helper_scan WHERE id=1')
|
|
136
|
+
.toArray()[0].cursor);
|
|
137
|
+
let rows = this.storage.sql
|
|
138
|
+
.exec(`SELECT key FROM helper_work WHERE state IN ('assigned','accepted','armed','needs_verification') AND key>? ORDER BY key LIMIT ?`, cursor, limit)
|
|
139
|
+
.toArray();
|
|
140
|
+
if (!rows.length)
|
|
141
|
+
rows = this.storage.sql
|
|
142
|
+
.exec(`SELECT key FROM helper_work WHERE state IN ('assigned','accepted','armed','needs_verification') ORDER BY key LIMIT ?`, limit)
|
|
143
|
+
.toArray();
|
|
144
|
+
if (rows.length)
|
|
145
|
+
this.storage.sql.exec('UPDATE helper_scan SET cursor=? WHERE id=1', String(rows[rows.length - 1].key));
|
|
146
|
+
return rows.map((row) => this.read(String(row.key)));
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
enqueue(id, work, type, content) {
|
|
150
|
+
const encoded = text(content);
|
|
151
|
+
const prior = this.storage.sql
|
|
152
|
+
.exec('SELECT * FROM helper_delivery WHERE id=?', id)
|
|
153
|
+
.toArray()[0];
|
|
154
|
+
if (prior &&
|
|
155
|
+
(prior.content !== encoded ||
|
|
156
|
+
prior.work_key !== work.key ||
|
|
157
|
+
prior.type !== type))
|
|
158
|
+
throw new Error('DELIVERY_CONFLICT');
|
|
159
|
+
this.storage.sql.exec(`INSERT OR IGNORE INTO helper_delivery VALUES (?,?,?,?,?,?,NULL)`, id, work.key, work.binding.admission.roomId, type, work.binding.admission.epoch, encoded);
|
|
160
|
+
}
|
|
161
|
+
deliveries(limit = 8) {
|
|
162
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 32)
|
|
163
|
+
throw new Error('INVALID_PAGE_LIMIT');
|
|
164
|
+
return this.storage.sql
|
|
165
|
+
.exec('SELECT * FROM helper_delivery WHERE event_id IS NULL ORDER BY id LIMIT ?', limit)
|
|
166
|
+
.toArray();
|
|
167
|
+
}
|
|
168
|
+
delivered(id, eventId) {
|
|
169
|
+
const prior = this.storage.sql
|
|
170
|
+
.exec('SELECT event_id FROM helper_delivery WHERE id=?', id)
|
|
171
|
+
.toArray()[0];
|
|
172
|
+
if (!prior || (prior.event_id !== null && prior.event_id !== eventId))
|
|
173
|
+
throw new Error('DELIVERY_ACK_CONFLICT');
|
|
174
|
+
this.storage.sql.exec('UPDATE helper_delivery SET event_id=? WHERE id=?', eventId, id);
|
|
175
|
+
}
|
|
176
|
+
seen(eventId, fingerprint) {
|
|
177
|
+
const row = this.storage.sql
|
|
178
|
+
.exec('SELECT fingerprint FROM helper_seen WHERE event_id=?', eventId)
|
|
179
|
+
.toArray()[0];
|
|
180
|
+
if (row && row.fingerprint !== fingerprint)
|
|
181
|
+
throw new Error('EVENT_REPLAY_CONFLICT');
|
|
182
|
+
return Boolean(row);
|
|
183
|
+
}
|
|
184
|
+
markSeen(eventId, fingerprint) {
|
|
185
|
+
this.storage.sql.exec('INSERT OR IGNORE INTO helper_seen VALUES (?,?)', eventId, fingerprint);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=durable-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-store.js","sourceRoot":"","sources":["../src/durable-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExecutionAuthorityPort, ExecutionDefinitionPort } from './execution-service.js';
|
|
2
|
+
import type { PrivateBinding } from './gateway-client.js';
|
|
3
|
+
/** The Node bridge uses a fixed private binding. The bridge also enforces the caller's flow and recipient scope. */
|
|
4
|
+
export declare class ExecutionRpcClient implements ExecutionAuthorityPort, ExecutionDefinitionPort {
|
|
5
|
+
private readonly binding;
|
|
6
|
+
constructor(binding: PrivateBinding);
|
|
7
|
+
private call;
|
|
8
|
+
readExecutionDefinition(flowId: string, commandId: string): Promise<Uint8Array>;
|
|
9
|
+
readExecutionAuthorization(flowId: string, commandId: string): Promise<Uint8Array>;
|
|
10
|
+
readProjection(flowId: string, commandId: string): Promise<Uint8Array | null>;
|
|
11
|
+
readExecutionOutput(flowId: string, commandId: string): Promise<Uint8Array | null>;
|
|
12
|
+
readExecutionOutcomes(flowId: string, commandId: string): Promise<Uint8Array>;
|
|
13
|
+
authorizeExecution(flowId: string, bytes: Uint8Array): Promise<{
|
|
14
|
+
expiresAt: number;
|
|
15
|
+
stateVersion: number;
|
|
16
|
+
grantDigest: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=execution-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-rpc.d.ts","sourceRoot":"","sources":["../src/execution-rpc.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,oHAAoH;AACpH,qBAAa,kBACX,YAAW,sBAAsB,EAAE,uBAAuB;IAE9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;YACtC,IAAI;IA0BZ,uBAAuB,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC;IAQhB,0BAA0B,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC;IAQhB,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAOvB,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQvB,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC;IAQhB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;;;;;CAkB3D"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readBoundedRecord } from './bounded-codec.js';
|
|
3
|
+
import { admissionSchema, bounded, decodeBoundedJson, encodeBoundedJson, digest, id, } from './bounded-protocol.js';
|
|
4
|
+
/** The Node bridge uses a fixed private binding. The bridge also enforces the caller's flow and recipient scope. */
|
|
5
|
+
export class ExecutionRpcClient {
|
|
6
|
+
binding;
|
|
7
|
+
constructor(binding) {
|
|
8
|
+
this.binding = binding;
|
|
9
|
+
}
|
|
10
|
+
async call(method, value) {
|
|
11
|
+
const response = await this.binding.fetch(`https://flow.internal/internal/v1/execution/${method}`, {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: { 'content-type': 'application/json' },
|
|
14
|
+
body: encodeBoundedJson(value),
|
|
15
|
+
signal: AbortSignal.timeout(25_000),
|
|
16
|
+
});
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
await response.body?.cancel();
|
|
19
|
+
throw new Error(`EXECUTION_RPC_HTTP_${response.status}`);
|
|
20
|
+
}
|
|
21
|
+
if (!response.body)
|
|
22
|
+
throw new Error('EXECUTION_RPC_BODY_REQUIRED');
|
|
23
|
+
return readBoundedRecord(response.body);
|
|
24
|
+
}
|
|
25
|
+
async readExecutionDefinition(flowId, commandId) {
|
|
26
|
+
return encodeBoundedJson(await this.call('definition', {
|
|
27
|
+
flowId: id.parse(flowId),
|
|
28
|
+
commandId: id.parse(commandId),
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
async readExecutionAuthorization(flowId, commandId) {
|
|
32
|
+
return encodeBoundedJson(await this.call('authorization', {
|
|
33
|
+
flowId: id.parse(flowId),
|
|
34
|
+
commandId: id.parse(commandId),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
async readProjection(flowId, commandId) {
|
|
38
|
+
const value = await this.call('projection', {
|
|
39
|
+
flowId: id.parse(flowId),
|
|
40
|
+
commandId: id.parse(commandId),
|
|
41
|
+
});
|
|
42
|
+
return value === null ? null : encodeBoundedJson(value);
|
|
43
|
+
}
|
|
44
|
+
async readExecutionOutput(flowId, commandId) {
|
|
45
|
+
return encodeBoundedJson(await this.call('output', {
|
|
46
|
+
flowId: id.parse(flowId),
|
|
47
|
+
commandId: id.parse(commandId),
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
async readExecutionOutcomes(flowId, commandId) {
|
|
51
|
+
return encodeBoundedJson(await this.call('outcomes', {
|
|
52
|
+
flowId: id.parse(flowId),
|
|
53
|
+
commandId: id.parse(commandId),
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
async authorizeExecution(flowId, bytes) {
|
|
57
|
+
const admission = bounded(admissionSchema, decodeBoundedJson(bytes));
|
|
58
|
+
if (admission.flowId !== id.parse(flowId))
|
|
59
|
+
throw new Error('AUTHORIZATION_FLOW_MISMATCH');
|
|
60
|
+
return bounded(z
|
|
61
|
+
.object({
|
|
62
|
+
expiresAt: z.number().int().safe().positive(),
|
|
63
|
+
stateVersion: z.number().int().safe().positive(),
|
|
64
|
+
grantDigest: digest,
|
|
65
|
+
})
|
|
66
|
+
.strict(), await this.call('authorize', {
|
|
67
|
+
flowId,
|
|
68
|
+
admission,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=execution-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-rpc.js","sourceRoot":"","sources":["../src/execution-rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type DefinitionRecord } from './bounded-definitions.js';
|
|
3
|
+
import { type Admission, type BoundedJson, type ExecutionRequest, type ExecutionResult, type GatewayEvent } from './bounded-protocol.js';
|
|
4
|
+
import { GatewayClient } from './gateway-client.js';
|
|
5
|
+
import type { WorkSql } from './durable-store.js';
|
|
6
|
+
export declare const workAuthorizationSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
7
|
+
host: z.ZodLiteral<"builtin">;
|
|
8
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
9
|
+
binding: z.ZodObject<{
|
|
10
|
+
protocol: z.ZodLiteral<"bounded-v1">;
|
|
11
|
+
resourceProfile: z.ZodLiteral<"bounded-v1-60mib">;
|
|
12
|
+
admission: z.ZodObject<{
|
|
13
|
+
id: z.ZodString;
|
|
14
|
+
flowId: z.ZodString;
|
|
15
|
+
roomId: z.ZodString;
|
|
16
|
+
runId: z.ZodString;
|
|
17
|
+
stepId: z.ZodString;
|
|
18
|
+
operationId: z.ZodString;
|
|
19
|
+
fingerprint: z.ZodString;
|
|
20
|
+
inputDigest: z.ZodString;
|
|
21
|
+
eligibilityDigest: z.ZodString;
|
|
22
|
+
grantDigest: z.ZodString;
|
|
23
|
+
definitionRevision: z.ZodString;
|
|
24
|
+
actor: z.ZodString;
|
|
25
|
+
audience: z.ZodString;
|
|
26
|
+
epoch: z.ZodNumber;
|
|
27
|
+
stateVersion: z.ZodNumber;
|
|
28
|
+
safety: z.ZodEnum<{
|
|
29
|
+
pure: "pure";
|
|
30
|
+
provider_idempotent: "provider_idempotent";
|
|
31
|
+
fenced: "fenced";
|
|
32
|
+
approval_only: "approval_only";
|
|
33
|
+
}>;
|
|
34
|
+
}, z.core.$strict>;
|
|
35
|
+
invocationId: z.ZodString;
|
|
36
|
+
attempt: z.ZodNumber;
|
|
37
|
+
managerDid: z.ZodString;
|
|
38
|
+
managerMatrixId: z.ZodString;
|
|
39
|
+
helperDid: z.ZodString;
|
|
40
|
+
helperMatrixId: z.ZodString;
|
|
41
|
+
capability: z.ZodString;
|
|
42
|
+
actionType: z.ZodString;
|
|
43
|
+
resource: z.ZodString;
|
|
44
|
+
deadline: z.ZodNumber;
|
|
45
|
+
contractCaveats: z.ZodRecord<z.ZodString, z.ZodCustom<import("./bounded-canonical.js").CanonicalJsonValue, import("./bounded-canonical.js").CanonicalJsonValue>>;
|
|
46
|
+
}, z.core.$strict>;
|
|
47
|
+
delegation: z.ZodString;
|
|
48
|
+
}, z.core.$strict>]>;
|
|
49
|
+
export interface ExecutionDefinitionPort {
|
|
50
|
+
readExecutionDefinition(flowId: string, commandId: string): Promise<Uint8Array>;
|
|
51
|
+
readExecutionAuthorization(flowId: string, commandId: string): Promise<Uint8Array>;
|
|
52
|
+
readProjection(flowId: string, commandId: string): Promise<Uint8Array | null>;
|
|
53
|
+
readExecutionOutput(flowId: string, commandId: string): Promise<Uint8Array | null>;
|
|
54
|
+
}
|
|
55
|
+
export declare const actionReferenceSchema: z.ZodObject<{
|
|
56
|
+
type: z.ZodString;
|
|
57
|
+
can: z.ZodString;
|
|
58
|
+
contractVersion: z.ZodString;
|
|
59
|
+
contractDigest: z.ZodString;
|
|
60
|
+
manifestDigest: z.ZodString;
|
|
61
|
+
}, z.core.$strict>;
|
|
62
|
+
export type ActionReference = z.infer<typeof actionReferenceSchema>;
|
|
63
|
+
export interface ExecutionCatalog {
|
|
64
|
+
page(cursor: number): {
|
|
65
|
+
contract: BoundedJson | null;
|
|
66
|
+
nextCursor: number | null;
|
|
67
|
+
};
|
|
68
|
+
describe(actionType: string, contractDigest: string, contractVersion: string): {
|
|
69
|
+
host: 'builtin' | 'helper';
|
|
70
|
+
safety: Admission['safety'];
|
|
71
|
+
helperDid: string | null;
|
|
72
|
+
helperMatrixId: string | null;
|
|
73
|
+
};
|
|
74
|
+
validate(reference: ActionReference): void;
|
|
75
|
+
done(reference: ActionReference, definition: DefinitionRecord, projection: BoundedJson): Promise<boolean>;
|
|
76
|
+
}
|
|
77
|
+
export interface ExecutionAuthorityPort {
|
|
78
|
+
authorizeExecution(flowId: string, admission: Uint8Array): Promise<{
|
|
79
|
+
expiresAt: number;
|
|
80
|
+
stateVersion: number;
|
|
81
|
+
grantDigest: string;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
export interface BuiltinExecutor {
|
|
85
|
+
execute(actionType: string, capability: string, request: ExecutionRequest): Promise<ExecutionResult>;
|
|
86
|
+
}
|
|
87
|
+
/** Manager-side durable assign/ready/invoke/receipt state. No domain handler runs in this adapter. */
|
|
88
|
+
export declare class HelperExecutionService {
|
|
89
|
+
private readonly options;
|
|
90
|
+
private activePoll;
|
|
91
|
+
constructor(options: {
|
|
92
|
+
storage: WorkSql;
|
|
93
|
+
definitions: ExecutionDefinitionPort;
|
|
94
|
+
authority: ExecutionAuthorityPort;
|
|
95
|
+
gateway: GatewayClient;
|
|
96
|
+
builtin: BuiltinExecutor;
|
|
97
|
+
catalog: ExecutionCatalog;
|
|
98
|
+
now?: () => number;
|
|
99
|
+
});
|
|
100
|
+
private row;
|
|
101
|
+
private authorize;
|
|
102
|
+
submit(value: unknown): Promise<ExecutionResult>;
|
|
103
|
+
readback(value: unknown): Promise<ExecutionResult>;
|
|
104
|
+
advance(id: string): Promise<ExecutionResult>;
|
|
105
|
+
private saveResult;
|
|
106
|
+
consume(event: GatewayEvent): Promise<void>;
|
|
107
|
+
private pollOnce;
|
|
108
|
+
poll(): Promise<void>;
|
|
109
|
+
/** Recover a bounded page. Every transition remains safe after a process restart. */
|
|
110
|
+
recover(limit?: number): Promise<void>;
|
|
111
|
+
done(value: unknown): Promise<{
|
|
112
|
+
done: boolean;
|
|
113
|
+
}>;
|
|
114
|
+
/** Expose only on a private service binding or an authenticated Node server. */
|
|
115
|
+
fetch(request: Request): Promise<Response>;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=execution-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../src/execution-service.ts"],"names":[],"mappings":"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"}
|