@ixo/flow-work 0.5.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.
Files changed (90) hide show
  1. package/README.md +9 -0
  2. package/dist/bounded-canonical.d.ts +10 -0
  3. package/dist/bounded-canonical.d.ts.map +1 -0
  4. package/dist/bounded-canonical.js +77 -0
  5. package/dist/bounded-canonical.js.map +1 -0
  6. package/dist/bounded-codec.d.ts +20 -0
  7. package/dist/bounded-codec.d.ts.map +1 -0
  8. package/dist/bounded-codec.js +301 -0
  9. package/dist/bounded-codec.js.map +1 -0
  10. package/dist/bounded-contracts.d.ts +114 -0
  11. package/dist/bounded-contracts.d.ts.map +1 -0
  12. package/dist/bounded-contracts.js +311 -0
  13. package/dist/bounded-contracts.js.map +1 -0
  14. package/dist/bounded-definitions.d.ts +44 -0
  15. package/dist/bounded-definitions.d.ts.map +1 -0
  16. package/dist/bounded-definitions.js +340 -0
  17. package/dist/bounded-definitions.js.map +1 -0
  18. package/dist/bounded-protocol.d.ts +461 -0
  19. package/dist/bounded-protocol.d.ts.map +1 -0
  20. package/dist/bounded-protocol.js +193 -0
  21. package/dist/bounded-protocol.js.map +1 -0
  22. package/dist/bounded.d.ts +18 -0
  23. package/dist/bounded.d.ts.map +1 -0
  24. package/dist/bounded.js +18 -0
  25. package/dist/bounded.js.map +1 -0
  26. package/dist/capability-adapter.d.ts +6 -0
  27. package/dist/capability-adapter.d.ts.map +1 -0
  28. package/dist/capability-adapter.js +56 -0
  29. package/dist/capability-adapter.js.map +1 -0
  30. package/dist/capability.d.ts +2 -0
  31. package/dist/capability.d.ts.map +1 -1
  32. package/dist/capability.js.map +1 -1
  33. package/dist/durable-input.d.ts +18 -0
  34. package/dist/durable-input.d.ts.map +1 -0
  35. package/dist/durable-input.js +126 -0
  36. package/dist/durable-input.js.map +1 -0
  37. package/dist/durable-listener.d.ts +55 -0
  38. package/dist/durable-listener.d.ts.map +1 -0
  39. package/dist/durable-listener.js +202 -0
  40. package/dist/durable-listener.js.map +1 -0
  41. package/dist/durable-store.d.ts +43 -0
  42. package/dist/durable-store.d.ts.map +1 -0
  43. package/dist/durable-store.js +188 -0
  44. package/dist/durable-store.js.map +1 -0
  45. package/dist/execution-rpc.d.ts +19 -0
  46. package/dist/execution-rpc.d.ts.map +1 -0
  47. package/dist/execution-rpc.js +72 -0
  48. package/dist/execution-rpc.js.map +1 -0
  49. package/dist/execution-service.d.ts +117 -0
  50. package/dist/execution-service.d.ts.map +1 -0
  51. package/dist/execution-service.js +343 -0
  52. package/dist/execution-service.js.map +1 -0
  53. package/dist/external-catalog.d.ts +43 -0
  54. package/dist/external-catalog.d.ts.map +1 -0
  55. package/dist/external-catalog.js +121 -0
  56. package/dist/external-catalog.js.map +1 -0
  57. package/dist/gateway-client.d.ts +30 -0
  58. package/dist/gateway-client.d.ts.map +1 -0
  59. package/dist/gateway-client.js +97 -0
  60. package/dist/gateway-client.js.map +1 -0
  61. package/dist/index.d.ts +2 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -1
  64. package/dist/index.js.map +1 -1
  65. package/dist/input-requests.d.ts +1 -1
  66. package/dist/input-requests.d.ts.map +1 -1
  67. package/dist/input-requests.js.map +1 -1
  68. package/dist/listener.d.ts +1 -1
  69. package/dist/listener.d.ts.map +1 -1
  70. package/dist/matrix-port-types.d.ts +56 -0
  71. package/dist/matrix-port-types.d.ts.map +1 -0
  72. package/dist/matrix-port-types.js +10 -0
  73. package/dist/matrix-port-types.js.map +1 -0
  74. package/dist/matrix-port.d.ts +8 -50
  75. package/dist/matrix-port.d.ts.map +1 -1
  76. package/dist/matrix-port.js.map +1 -1
  77. package/dist/node-sqlite.d.ts +12 -0
  78. package/dist/node-sqlite.d.ts.map +1 -0
  79. package/dist/node-sqlite.js +45 -0
  80. package/dist/node-sqlite.js.map +1 -0
  81. package/dist/protocol.d.ts +4 -4
  82. package/dist/provider-journal.d.ts +26 -0
  83. package/dist/provider-journal.d.ts.map +1 -0
  84. package/dist/provider-journal.js +94 -0
  85. package/dist/provider-journal.js.map +1 -0
  86. package/dist/work-authority.d.ts +16 -0
  87. package/dist/work-authority.d.ts.map +1 -0
  88. package/dist/work-authority.js +31 -0
  89. package/dist/work-authority.js.map +1 -0
  90. package/package.json +33 -1
@@ -0,0 +1,343 @@
1
+ import { z } from 'zod';
2
+ import { readBoundedRecord } from './bounded-codec.js';
3
+ import { decodeDefinitionRecord, } from './bounded-definitions.js';
4
+ import { bindingSchema, bounded, decodeBoundedJson, encodeBoundedJson, eventSchema, EVENT_TYPES, hash, parse, resultSchema, same, text, validateRequest, id, digest, operationIdentity, } from './bounded-protocol.js';
5
+ export const workAuthorizationSchema = z.union([
6
+ z.object({ host: z.literal('builtin') }).strict(),
7
+ z
8
+ .object({ binding: bindingSchema, delegation: z.string().min(1).max(8192) })
9
+ .strict(),
10
+ ]);
11
+ export const actionReferenceSchema = z
12
+ .object({
13
+ type: id,
14
+ can: id,
15
+ contractVersion: id,
16
+ contractDigest: digest,
17
+ manifestDigest: digest,
18
+ })
19
+ .strict();
20
+ const json = z.custom(() => true);
21
+ const requestCodec = z.custom(() => true);
22
+ /** Manager-side durable assign/ready/invoke/receipt state. No domain handler runs in this adapter. */
23
+ export class HelperExecutionService {
24
+ options;
25
+ activePoll;
26
+ constructor(options) {
27
+ this.options = options;
28
+ options.storage.sql.exec(`CREATE TABLE IF NOT EXISTS helper_execution (
29
+ id TEXT PRIMARY KEY, flow_id TEXT NOT NULL, operation_id TEXT NOT NULL,
30
+ request TEXT NOT NULL, authorization TEXT NOT NULL, action_type TEXT NOT NULL,
31
+ capability TEXT NOT NULL, assign_event TEXT, ready_event TEXT, invoke_event TEXT,
32
+ result TEXT)`);
33
+ options.storage.sql.exec('CREATE INDEX IF NOT EXISTS helper_execution_operation ON helper_execution(flow_id,operation_id)');
34
+ options.storage.sql
35
+ .exec(`CREATE TABLE IF NOT EXISTS helper_execution_events (
36
+ event_id TEXT PRIMARY KEY, fingerprint TEXT NOT NULL, accepted INTEGER NOT NULL)`);
37
+ }
38
+ row(id) {
39
+ return this.options.storage.sql
40
+ .exec('SELECT * FROM helper_execution WHERE id=? LIMIT 1', id)
41
+ .toArray()[0];
42
+ }
43
+ async authorize(admission) {
44
+ const grant = await this.options.authority.authorizeExecution(admission.flowId, encodeBoundedJson(admission));
45
+ if (grant.stateVersion !== admission.stateVersion ||
46
+ grant.grantDigest !== admission.grantDigest ||
47
+ grant.expiresAt <= (this.options.now?.() ?? Date.now()))
48
+ throw new Error('EXECUTION_AUTHORITY_DENIED');
49
+ }
50
+ async submit(value) {
51
+ const request = await validateRequest(value);
52
+ const a = request.effect.admission;
53
+ const previous = this.row(a.id);
54
+ if (previous) {
55
+ const prior = parse(requestCodec, String(previous.request));
56
+ if (!same(prior.effect.admission, a) ||
57
+ !same(prior.inputs, request.inputs))
58
+ throw new Error('EXECUTION_REPLAY_CONFLICT');
59
+ return this.readback(request);
60
+ }
61
+ await this.authorize(a);
62
+ if (request.effect.state !== 'armed' ||
63
+ !request.effect.startEvent ||
64
+ !request.effect.owner ||
65
+ request.effect.expiresAt <= (this.options.now?.() ?? Date.now()))
66
+ throw new Error('ARMED_EFFECT_REQUIRED');
67
+ const definition = decodeDefinitionRecord(await this.options.definitions.readExecutionDefinition(a.flowId, a.id));
68
+ if (definition.category !== 'step' || definition.value.stepId !== a.stepId)
69
+ throw new Error('DEFINITION_STEP_MISMATCH');
70
+ const action = bounded(actionReferenceSchema, definition.value.action);
71
+ this.options.catalog.validate(action);
72
+ const metadata = this.options.catalog.describe(action.type, action.contractDigest, action.contractVersion);
73
+ if (metadata.safety !== a.safety)
74
+ throw new Error('EXECUTION_SAFETY_MISMATCH');
75
+ const authorization = workAuthorizationSchema.parse(decodeBoundedJson(await this.options.definitions.readExecutionAuthorization(a.flowId, a.id)));
76
+ if ('binding' in authorization) {
77
+ const b = authorization.binding;
78
+ if (metadata.host !== 'helper' ||
79
+ metadata.helperDid !== b.helperDid ||
80
+ metadata.helperMatrixId !== b.helperMatrixId ||
81
+ !same(b.admission, a) ||
82
+ b.actionType !== action.type ||
83
+ b.capability !== action.can ||
84
+ b.resource !== definition.value.resource)
85
+ throw new Error('WORK_AUTHORIZATION_MISMATCH');
86
+ }
87
+ else if (metadata.host !== 'builtin' || a.safety !== 'pure')
88
+ throw new Error('BUILTIN_PURE_ACTION_REQUIRED');
89
+ this.options.storage.transactionSync(() => {
90
+ const duplicate = this.row(a.id);
91
+ if (duplicate) {
92
+ if (duplicate.request !== text(request) ||
93
+ duplicate.authorization !== text(authorization))
94
+ throw new Error('EXECUTION_REPLAY_CONFLICT');
95
+ return;
96
+ }
97
+ const operation = this.options.storage.sql
98
+ .exec('SELECT authorization FROM helper_execution WHERE flow_id=? AND operation_id=? LIMIT 1', a.flowId, a.operationId)
99
+ .toArray()[0];
100
+ if (operation && 'binding' in authorization) {
101
+ const prior = parse(workAuthorizationSchema, String(operation.authorization));
102
+ if (!('binding' in prior) ||
103
+ !same(operationIdentity(prior.binding), operationIdentity(authorization.binding)))
104
+ throw new Error('OPERATION_IDENTITY_CONFLICT');
105
+ }
106
+ this.options.storage.sql.exec(`INSERT INTO helper_execution VALUES (?,?,?,?,?,?,?,NULL,NULL,NULL,NULL)`, a.id, a.flowId, a.operationId, text(request), text(authorization), action.type, action.can);
107
+ });
108
+ return this.advance(a.id);
109
+ }
110
+ async readback(value) {
111
+ const request = await validateRequest(value);
112
+ const a = request.effect.admission;
113
+ const row = this.row(a.id);
114
+ // A lost request that never reached this durable host has no evidence. Do not create new work here.
115
+ if (!row)
116
+ return { outcome: 'needs_verification' };
117
+ const prior = parse(requestCodec, String(row.request));
118
+ if (!same(prior.effect.admission, a) || !same(prior.inputs, request.inputs))
119
+ throw new Error('READBACK_BINDING_MISMATCH');
120
+ if (row.result)
121
+ return parse(resultSchema, String(row.result));
122
+ await this.poll();
123
+ return this.advance(a.id);
124
+ }
125
+ async advance(id) {
126
+ const row = this.row(id);
127
+ if (!row)
128
+ throw new Error('EXECUTION_NOT_FOUND');
129
+ if (row.result)
130
+ return parse(resultSchema, String(row.result));
131
+ const request = parse(requestCodec, String(row.request));
132
+ // Receipt recovery requires the immutable request and private transport, not a fresh execution grant.
133
+ // New work still requires current authority. An expired grant preserves uncertainty.
134
+ try {
135
+ await this.authorize(request.effect.admission);
136
+ }
137
+ catch {
138
+ return { outcome: 'needs_verification' };
139
+ }
140
+ const authorization = parse(workAuthorizationSchema, String(row.authorization));
141
+ if ('host' in authorization) {
142
+ const result = bounded(resultSchema, await this.options.builtin.execute(String(row.action_type), String(row.capability), request));
143
+ // Pure deterministic handlers may recompute after a crash; their durable result remains immutable.
144
+ if (result.outcome !== 'needs_verification')
145
+ this.saveResult(id, result);
146
+ return result;
147
+ }
148
+ const binding = authorization.binding;
149
+ if (binding.deadline <= (this.options.now?.() ?? Date.now()))
150
+ return { outcome: 'needs_verification' };
151
+ if (!row.assign_event) {
152
+ const eventId = await this.options.gateway.send({
153
+ transactionId: `assign:${binding.invocationId}:${binding.attempt}`,
154
+ roomId: binding.admission.roomId,
155
+ type: EVENT_TYPES.assign,
156
+ epoch: binding.admission.epoch,
157
+ content: {
158
+ phase: 'assign',
159
+ ...authorization,
160
+ },
161
+ });
162
+ this.options.storage.sql.exec('UPDATE helper_execution SET assign_event=? WHERE id=? AND assign_event IS NULL', eventId, id);
163
+ }
164
+ else if (row.ready_event && !row.invoke_event) {
165
+ const eventId = await this.options.gateway.send({
166
+ transactionId: `invoke:${binding.invocationId}:${binding.attempt}`,
167
+ roomId: binding.admission.roomId,
168
+ type: EVENT_TYPES.invoke,
169
+ epoch: binding.admission.epoch,
170
+ content: {
171
+ phase: 'invoke',
172
+ binding,
173
+ requestEventId: String(row.ready_event),
174
+ inputs: request.inputs,
175
+ },
176
+ });
177
+ this.options.storage.sql.exec('UPDATE helper_execution SET invoke_event=? WHERE id=? AND invoke_event IS NULL', eventId, id);
178
+ }
179
+ return { outcome: 'needs_verification' };
180
+ }
181
+ saveResult(id, result) {
182
+ const prior = this.row(id);
183
+ if (!prior || (prior.result !== null && prior.result !== text(result)))
184
+ throw new Error('RECEIPT_CONFLICT');
185
+ this.options.storage.sql.exec('UPDATE helper_execution SET result=? WHERE id=?', text(result), id);
186
+ }
187
+ async consume(event) {
188
+ const content = bounded(eventSchema, event.content);
189
+ if (content.phase !== 'ready' && content.phase !== 'receipt')
190
+ return;
191
+ const row = this.row(content.binding.admission.id);
192
+ if (!row)
193
+ throw new Error('UNRELATED_HELPER_EVENT');
194
+ const authorization = parse(workAuthorizationSchema, String(row.authorization));
195
+ if (!('binding' in authorization) ||
196
+ !same(authorization.binding, content.binding) ||
197
+ !event.encrypted ||
198
+ event.roomId !== content.binding.admission.roomId ||
199
+ event.sender !== content.binding.helperMatrixId ||
200
+ event.type !== EVENT_TYPES[content.phase])
201
+ throw new Error('HELPER_EVENT_AUTHORITY_DENIED');
202
+ this.options.storage.transactionSync(() => {
203
+ if (content.phase === 'ready') {
204
+ if (row.assign_event !== content.requestEventId ||
205
+ (row.ready_event !== null && row.ready_event !== event.eventId))
206
+ throw new Error('READY_RELATION_MISMATCH');
207
+ this.options.storage.sql.exec('UPDATE helper_execution SET ready_event=? WHERE id=?', event.eventId, String(row.id));
208
+ }
209
+ else {
210
+ if (row.invoke_event !== content.requestEventId)
211
+ throw new Error('RECEIPT_RELATION_MISMATCH');
212
+ if (content.result.outcome !== 'needs_verification')
213
+ this.saveResult(String(row.id), content.result);
214
+ }
215
+ });
216
+ }
217
+ async pollOnce() {
218
+ const page = await this.options.gateway.read();
219
+ for (const event of page.events) {
220
+ const fingerprint = await hash(event);
221
+ const old = this.options.storage.sql
222
+ .exec('SELECT fingerprint FROM helper_execution_events WHERE event_id=?', event.eventId)
223
+ .toArray()[0];
224
+ if (old && old.fingerprint !== fingerprint)
225
+ throw new Error('EVENT_REPLAY_CONFLICT');
226
+ if (!old) {
227
+ await this.consume(event);
228
+ this.options.storage.sql.exec('INSERT INTO helper_execution_events VALUES (?,?,1)', event.eventId, fingerprint);
229
+ }
230
+ await this.options.gateway.ack(event.eventId);
231
+ }
232
+ }
233
+ async poll() {
234
+ this.activePoll ??= this.pollOnce().finally(() => {
235
+ this.activePoll = undefined;
236
+ });
237
+ return this.activePoll;
238
+ }
239
+ /** Recover a bounded page. Every transition remains safe after a process restart. */
240
+ async recover(limit = 16) {
241
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 32)
242
+ throw new Error('RECOVERY_LIMIT_INVALID');
243
+ await this.poll();
244
+ const rows = this.options.storage.sql
245
+ .exec('SELECT id FROM helper_execution WHERE result IS NULL ORDER BY id LIMIT ?', limit)
246
+ .toArray();
247
+ for (const row of rows)
248
+ await this.advance(String(row.id));
249
+ }
250
+ async done(value) {
251
+ const query = bounded(z.object({ flowId: id, commandId: id }).strict(), value);
252
+ const definition = decodeDefinitionRecord(await this.options.definitions.readExecutionDefinition(query.flowId, query.commandId));
253
+ if (definition.category !== 'step')
254
+ throw new Error('DEFINITION_STEP_REQUIRED');
255
+ const reference = bounded(actionReferenceSchema, definition.value.action);
256
+ this.options.catalog.validate(reference);
257
+ const bytes = await this.options.definitions.readProjection(query.flowId, query.commandId);
258
+ if (bytes === null)
259
+ return { done: false };
260
+ const projection = decodeBoundedJson(bytes);
261
+ if (!projection ||
262
+ typeof projection !== 'object' ||
263
+ Array.isArray(projection) ||
264
+ projection.id !== query.commandId ||
265
+ projection.flow_id !== query.flowId ||
266
+ projection.step_id !== definition.value.stepId)
267
+ throw new Error('PROJECTION_BINDING_MISMATCH');
268
+ if (projection.state !== 'succeeded')
269
+ return { done: false };
270
+ const result = bounded(z
271
+ .object({
272
+ outcome: z.literal('succeeded'),
273
+ outputDigest: digest,
274
+ outcomesDigest: digest,
275
+ })
276
+ .strict(), projection.result);
277
+ const outputBytes = await this.options.definitions.readExecutionOutput(query.flowId, query.commandId);
278
+ if (outputBytes === null)
279
+ return { done: false };
280
+ const output = decodeBoundedJson(outputBytes);
281
+ if ((await hash(output)) !== result.outputDigest ||
282
+ (await hash(result)) !== projection.result_digest)
283
+ throw new Error('PROJECTION_RECEIPT_MISMATCH');
284
+ return {
285
+ done: await this.options.catalog.done(reference, definition, {
286
+ ...projection,
287
+ result: { outcome: 'succeeded', output },
288
+ }),
289
+ };
290
+ }
291
+ /** Expose only on a private service binding or an authenticated Node server. */
292
+ async fetch(request) {
293
+ const path = new URL(request.url).pathname;
294
+ if (request.method !== 'POST' ||
295
+ ![
296
+ '/v1/execution/invoke',
297
+ '/v1/execution/readback',
298
+ '/v1/execution/describe',
299
+ '/v1/execution/done',
300
+ '/v1/execution/catalog',
301
+ ].includes(path))
302
+ return new Response(null, { status: 404 });
303
+ if (!request.body)
304
+ return new Response(null, { status: 400 });
305
+ try {
306
+ const payload = await readBoundedRecord(request.body);
307
+ let result;
308
+ if (path.endsWith('/catalog')) {
309
+ const query = bounded(z
310
+ .object({
311
+ cursor: z.number().int().safe().nonnegative().default(0),
312
+ })
313
+ .strict(), payload);
314
+ result = this.options.catalog.page(query.cursor);
315
+ }
316
+ else if (path.endsWith('/describe')) {
317
+ const query = bounded(z
318
+ .object({
319
+ actionType: id,
320
+ contractDigest: digest,
321
+ contractVersion: id,
322
+ })
323
+ .strict(), payload);
324
+ result = this.options.catalog.describe(query.actionType, query.contractDigest, query.contractVersion);
325
+ }
326
+ else if (path.endsWith('/done'))
327
+ result = await this.done(payload);
328
+ else
329
+ result = path.endsWith('/invoke')
330
+ ? await this.submit(payload)
331
+ : await this.readback(payload);
332
+ return new Response(encodeBoundedJson(result), { headers: { 'content-type': 'application/json' } });
333
+ }
334
+ catch {
335
+ // Transport rejection is deliberately distinct from a domain outcome.
336
+ return new Response('{"error":"EXECUTION_REQUEST_REJECTED"}', {
337
+ status: 409,
338
+ headers: { 'content-type': 'application/json' },
339
+ });
340
+ }
341
+ }
342
+ }
343
+ //# sourceMappingURL=execution-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-service.js","sourceRoot":"","sources":["../src/execution-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ import { type BoundedJson } from './bounded-protocol.js';
3
+ import type { PrivateBinding } from './gateway-client.js';
4
+ import type { FlowWorkCapability } from './capability.js';
5
+ export declare const externalContractSchema: z.ZodObject<{
6
+ kind: z.ZodLiteral<"flow-work.external-contract">;
7
+ protocol: z.ZodLiteral<"bounded-v1">;
8
+ type: z.ZodString;
9
+ can: z.ZodString;
10
+ contractVersion: z.ZodString;
11
+ description: z.ZodString;
12
+ inputSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
13
+ outputSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
14
+ proof: z.ZodArray<z.ZodString>;
15
+ safety: z.ZodEnum<{
16
+ pure: "pure";
17
+ provider_idempotent: "provider_idempotent";
18
+ fenced: "fenced";
19
+ approval_only: "approval_only";
20
+ }>;
21
+ readback: z.ZodEnum<{
22
+ "provider-proof": "provider-proof";
23
+ "durable-receipt": "durable-receipt";
24
+ "pure-read": "pure-read";
25
+ }>;
26
+ completion: z.ZodEnum<{
27
+ never: "never";
28
+ proof: "proof";
29
+ }>;
30
+ events: z.ZodArray<z.ZodObject<{
31
+ name: z.ZodString;
32
+ fields: z.ZodArray<z.ZodString>;
33
+ }, z.core.$strict>>;
34
+ contractDigest: z.ZodString;
35
+ manifestDigest: z.ZodString;
36
+ }, z.core.$strict>;
37
+ export type ExternalActionContract = z.infer<typeof externalContractSchema>;
38
+ /** Generate a distinct contract from the real handler schemas. Never derive it from a neighboring Editor action. */
39
+ export declare function externalContract(capability: FlowWorkCapability, policy: Pick<ExternalActionContract, 'contractVersion' | 'proof' | 'safety' | 'readback' | 'completion' | 'events'>): Promise<ExternalActionContract>;
40
+ export declare function validateExternalContract(value: unknown): Promise<ExternalActionContract>;
41
+ export declare function externalOutcomes(contract: ExternalActionContract, output: BoundedJson): BoundedJson;
42
+ export declare function loadExternalContracts(binding: PrivateBinding): Promise<ExternalActionContract[]>;
43
+ //# sourceMappingURL=external-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-catalog.d.ts","sourceRoot":"","sources":["../src/external-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAqB1D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAExB,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,oHAAoH;AACpH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,IAAI,CACV,sBAAsB,EACpB,iBAAiB,GACjB,OAAO,GACP,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,QAAQ,CACX,GACA,OAAO,CAAC,sBAAsB,CAAC,CA+BjC;AACD,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,sBAAsB,CAAC,CAajC;AACD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,WAAW,GAClB,WAAW,CAuBb;AACD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAqCnC"}
@@ -0,0 +1,121 @@
1
+ import { z } from 'zod';
2
+ import { bounded, hash, id, digest, encodeBoundedJson, readBoundedRecord, } from './bounded-protocol.js';
3
+ const bodySchema = z
4
+ .object({
5
+ kind: z.literal('flow-work.external-contract'),
6
+ protocol: z.literal('bounded-v1'),
7
+ type: id,
8
+ can: id,
9
+ contractVersion: id,
10
+ description: z.string().max(4096),
11
+ inputSchema: z.record(z.string(), z.unknown()),
12
+ outputSchema: z.record(z.string(), z.unknown()),
13
+ proof: z.array(id).min(1).max(16),
14
+ safety: z.enum(['pure', 'fenced', 'approval_only', 'provider_idempotent']),
15
+ readback: z.enum(['provider-proof', 'durable-receipt', 'pure-read']),
16
+ completion: z.enum(['proof', 'never']),
17
+ events: z
18
+ .array(z.object({ name: id, fields: z.array(id).max(32) }).strict())
19
+ .max(16),
20
+ })
21
+ .strict();
22
+ export const externalContractSchema = bodySchema
23
+ .extend({ contractDigest: digest, manifestDigest: digest })
24
+ .strict();
25
+ /** Generate a distinct contract from the real handler schemas. Never derive it from a neighboring Editor action. */
26
+ export async function externalContract(capability, policy) {
27
+ if (!capability.outputSchema)
28
+ throw new Error('EXTERNAL_OUTPUT_SCHEMA_REQUIRED');
29
+ const body = bounded(bodySchema, {
30
+ kind: 'flow-work.external-contract',
31
+ protocol: 'bounded-v1',
32
+ type: capability.actionType,
33
+ can: capability.can,
34
+ description: capability.description,
35
+ inputSchema: z.toJSONSchema(capability.inputSchema, {
36
+ io: 'input',
37
+ unrepresentable: 'any',
38
+ }),
39
+ outputSchema: z.toJSONSchema(capability.outputSchema, {
40
+ io: 'output',
41
+ unrepresentable: 'any',
42
+ }),
43
+ ...policy,
44
+ });
45
+ const contractDigest = await hash(body);
46
+ // A single independently publishable capability has a one-entry external manifest.
47
+ const manifestDigest = await hash({
48
+ kind: 'flow-work.external-manifest',
49
+ protocol: 'bounded-v1',
50
+ contracts: [contractDigest],
51
+ });
52
+ return bounded(externalContractSchema, {
53
+ ...body,
54
+ contractDigest,
55
+ manifestDigest,
56
+ });
57
+ }
58
+ export async function validateExternalContract(value) {
59
+ const record = bounded(externalContractSchema, value);
60
+ const { contractDigest, manifestDigest, ...body } = record;
61
+ if ((await hash(body)) !== contractDigest ||
62
+ (await hash({
63
+ kind: 'flow-work.external-manifest',
64
+ protocol: 'bounded-v1',
65
+ contracts: [contractDigest],
66
+ })) !== manifestDigest)
67
+ throw new Error('EXTERNAL_CONTRACT_DIGEST_MISMATCH');
68
+ return record;
69
+ }
70
+ export function externalOutcomes(contract, output) {
71
+ if (!output || typeof output !== 'object' || Array.isArray(output))
72
+ throw new Error('EXTERNAL_OUTPUT_REQUIRED');
73
+ for (const field of contract.proof) {
74
+ const value = output[field];
75
+ if (value === null ||
76
+ value === undefined ||
77
+ value === '' ||
78
+ value === false)
79
+ throw new Error('EXTERNAL_PROOF_REQUIRED');
80
+ }
81
+ return contract.events.map((event) => ({
82
+ name: event.name,
83
+ payload: Object.fromEntries(event.fields.map((field) => {
84
+ if (!(field in output))
85
+ throw new Error('EXTERNAL_EVENT_FIELD_REQUIRED');
86
+ return [field, output[field]];
87
+ })),
88
+ }));
89
+ }
90
+ export async function loadExternalContracts(binding) {
91
+ const records = [];
92
+ let cursor = 0;
93
+ while (cursor !== null) {
94
+ if (records.length >= 32)
95
+ throw new Error('EXTERNAL_CATALOG_LIMIT');
96
+ const response = await binding.fetch('https://flow.internal/v1/execution/catalog', {
97
+ method: 'POST',
98
+ headers: { 'content-type': 'application/json' },
99
+ body: encodeBoundedJson({ cursor }),
100
+ signal: AbortSignal.timeout(25_000),
101
+ });
102
+ if (!response.ok || !response.body) {
103
+ await response.body?.cancel();
104
+ throw new Error('EXTERNAL_CATALOG_UNAVAILABLE');
105
+ }
106
+ const page = bounded(z
107
+ .object({
108
+ contract: externalContractSchema.nullable(),
109
+ nextCursor: z.number().int().safe().nonnegative().nullable(),
110
+ })
111
+ .strict(), await readBoundedRecord(response.body));
112
+ if (page.contract)
113
+ records.push(await validateExternalContract(page.contract));
114
+ if (page.nextCursor !== null &&
115
+ (page.nextCursor !== cursor + 1 || !page.contract))
116
+ throw new Error('EXTERNAL_CATALOG_CURSOR_INVALID');
117
+ cursor = page.nextCursor;
118
+ }
119
+ return records;
120
+ }
121
+ //# sourceMappingURL=external-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-catalog.js","sourceRoot":"","sources":["../src/external-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type BoundedJson, type GatewayEvent } from './bounded-protocol.js';
2
+ export interface PrivateBinding {
3
+ fetch(input: string | Request, init?: RequestInit): Promise<Response>;
4
+ }
5
+ export declare class GatewayClient {
6
+ private readonly binding;
7
+ readonly consumer: string;
8
+ constructor(binding: PrivateBinding, consumer: string);
9
+ call(path: string, body: unknown): Promise<BoundedJson>;
10
+ read(): Promise<{
11
+ events: GatewayEvent[];
12
+ hasMore: boolean;
13
+ }>;
14
+ ack(eventId: string): Promise<void>;
15
+ send(request: {
16
+ transactionId: string;
17
+ roomId: string;
18
+ type: string;
19
+ content: BoundedJson;
20
+ epoch: number;
21
+ }): Promise<string>;
22
+ }
23
+ /** Node hosts use a fixed configured service URL and a distinct private credential. */
24
+ export declare class AuthenticatedServiceBinding implements PrivateBinding {
25
+ private readonly baseUrl;
26
+ private readonly credential;
27
+ constructor(baseUrl: string, credential: string);
28
+ fetch(input: string | Request, init?: RequestInit): Promise<Response>;
29
+ }
30
+ //# sourceMappingURL=gateway-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-client.d.ts","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvE;AAYD,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADR,OAAO,EAAE,cAAc,EAC/B,QAAQ,EAAE,MAAM;IAIrB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IA4BvD,IAAI,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAS7D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,IAAI,CAAC,OAAO,EAAE;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,WAAW,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,MAAM,CAAC;CAOpB;AAED,uFAAuF;AACvF,qBAAa,2BAA4B,YAAW,cAAc;IAE9D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM;IAiBrC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAWtE"}