@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,18 @@
|
|
|
1
|
+
export * from './bounded-protocol.js';
|
|
2
|
+
export * from './bounded-codec.js';
|
|
3
|
+
export * from './bounded-contracts.js';
|
|
4
|
+
export * from './bounded-definitions.js';
|
|
5
|
+
export * from './durable-store.js';
|
|
6
|
+
export * from './durable-input.js';
|
|
7
|
+
export * from './durable-listener.js';
|
|
8
|
+
export * from './gateway-client.js';
|
|
9
|
+
export * from './execution-service.js';
|
|
10
|
+
export * from './provider-journal.js';
|
|
11
|
+
export * from './capability-adapter.js';
|
|
12
|
+
export * from './work-authority.js';
|
|
13
|
+
export * from './execution-rpc.js';
|
|
14
|
+
export * from './external-catalog.js';
|
|
15
|
+
export { buildDelegationValidator, type DelegationValidator } from './ucan.js';
|
|
16
|
+
export { findCapability, type FlowWorkCapability, type FlowWorkInputApi, type FlowWorkInvocationContext, } from './capability.js';
|
|
17
|
+
export { z } from 'zod';
|
|
18
|
+
//# sourceMappingURL=bounded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded.d.ts","sourceRoot":"","sources":["../src/bounded.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
package/dist/bounded.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './bounded-protocol.js';
|
|
2
|
+
export * from './bounded-codec.js';
|
|
3
|
+
export * from './bounded-contracts.js';
|
|
4
|
+
export * from './bounded-definitions.js';
|
|
5
|
+
export * from './durable-store.js';
|
|
6
|
+
export * from './durable-input.js';
|
|
7
|
+
export * from './durable-listener.js';
|
|
8
|
+
export * from './gateway-client.js';
|
|
9
|
+
export * from './execution-service.js';
|
|
10
|
+
export * from './provider-journal.js';
|
|
11
|
+
export * from './capability-adapter.js';
|
|
12
|
+
export * from './work-authority.js';
|
|
13
|
+
export * from './execution-rpc.js';
|
|
14
|
+
export * from './external-catalog.js';
|
|
15
|
+
export { buildDelegationValidator } from './ucan.js';
|
|
16
|
+
export { findCapability, } from './capability.js';
|
|
17
|
+
export { z } from 'zod';
|
|
18
|
+
//# sourceMappingURL=bounded.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded.js","sourceRoot":"","sources":["../src/bounded.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAA4B,MAAM,WAAW,CAAC;AAC/E,OAAO,EACL,cAAc,GAIf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FlowWorkCapability, FlowWorkInvocationContext } from './capability.js';
|
|
2
|
+
import type { DurableCapability } from './durable-listener.js';
|
|
3
|
+
import type { BoundedJson, ExecutionResult } from './bounded-protocol.js';
|
|
4
|
+
/** The domain adapter supplies an explicit readback handler; legacy handlers are never replayed implicitly. */
|
|
5
|
+
export declare function adaptDurableCapability(capability: FlowWorkCapability, recover: (inputs: BoundedJson, context: FlowWorkInvocationContext) => Promise<ExecutionResult>, outcomes?: (output: BoundedJson) => BoundedJson): DurableCapability;
|
|
6
|
+
//# sourceMappingURL=capability-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-adapter.d.ts","sourceRoot":"","sources":["../src/capability-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG1E,+GAA+G;AAC/G,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE,CACP,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,eAAe,CAAC,EAC7B,QAAQ,GAAE,CAAC,MAAM,EAAE,WAAW,KAAK,WAAsB,GACxD,iBAAiB,CAwDnB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { bounded, resultSchema } from './bounded-protocol.js';
|
|
3
|
+
/** The domain adapter supplies an explicit readback handler; legacy handlers are never replayed implicitly. */
|
|
4
|
+
export function adaptDurableCapability(capability, recover, outcomes = () => []) {
|
|
5
|
+
const contextFor = (ctx) => {
|
|
6
|
+
const b = ctx.binding;
|
|
7
|
+
return {
|
|
8
|
+
invocationId: b.invocationId,
|
|
9
|
+
operationId: b.admission.operationId,
|
|
10
|
+
managerDid: b.managerDid,
|
|
11
|
+
capability: b.capability,
|
|
12
|
+
actionType: b.actionType,
|
|
13
|
+
nodeId: b.admission.stepId,
|
|
14
|
+
resource: b.resource,
|
|
15
|
+
inputHash: b.admission.inputDigest,
|
|
16
|
+
attempt: b.attempt,
|
|
17
|
+
deadline: b.deadline,
|
|
18
|
+
contractCaveats: b.contractCaveats,
|
|
19
|
+
audience: b.helperDid,
|
|
20
|
+
delegation: ctx.delegation,
|
|
21
|
+
input: {
|
|
22
|
+
request: async (params) => {
|
|
23
|
+
const { signal, ...request } = params;
|
|
24
|
+
signal?.throwIfAborted();
|
|
25
|
+
const configured = b.contractCaveats.inputResponders;
|
|
26
|
+
const responders = z
|
|
27
|
+
.array(z.string().min(1))
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(32)
|
|
30
|
+
.parse(configured);
|
|
31
|
+
return ctx.input.request(ctx.work, {
|
|
32
|
+
protocolVersion: 1,
|
|
33
|
+
...request,
|
|
34
|
+
invocationId: b.invocationId,
|
|
35
|
+
deadline: Math.min(params.deadline ?? b.deadline, b.deadline),
|
|
36
|
+
}, responders);
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
can: capability.can,
|
|
43
|
+
actionType: capability.actionType,
|
|
44
|
+
inputSchema: capability.inputSchema,
|
|
45
|
+
outputSchema: capability.outputSchema ?? z.record(z.string(), z.unknown()),
|
|
46
|
+
invoke: async (inputs, ctx) => {
|
|
47
|
+
const output = await capability.handler(inputs, contextFor(ctx));
|
|
48
|
+
return {
|
|
49
|
+
output: output,
|
|
50
|
+
outcomes: outcomes(output),
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
readback: async (inputs, ctx) => bounded(resultSchema, await recover(inputs, contextFor(ctx))),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=capability-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-adapter.js","sourceRoot":"","sources":["../src/capability-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE9D,+GAA+G;AAC/G,MAAM,UAAU,sBAAsB,CACpC,UAA8B,EAC9B,OAG6B,EAC7B,WAAiD,GAAG,EAAE,CAAC,EAAE;IAEzD,MAAM,UAAU,GAAG,CAAC,GAAmB,EAA6B,EAAE;QACpE,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;QACtB,OAAO;YACL,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW;YACpC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW;YAClC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBACxB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC;oBACtC,MAAM,EAAE,cAAc,EAAE,CAAC;oBACzB,MAAM,UAAU,GAAG,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC;oBACrD,MAAM,UAAU,GAAG,CAAC;yBACjB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;yBACxB,GAAG,CAAC,CAAC,CAAC;yBACN,GAAG,CAAC,EAAE,CAAC;yBACP,KAAK,CAAC,UAAU,CAAC,CAAC;oBACrB,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CACtB,GAAG,CAAC,IAAI,EACR;wBACE,eAAe,EAAE,CAAC;wBAClB,GAAG,OAAO;wBACV,YAAY,EAAE,CAAC,CAAC,YAAY;wBAC5B,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;qBAC9D,EACD,UAAU,CACF,CAAC;gBACb,CAAC;aACF;SACF,CAAC;IACJ,CAAC,CAAC;IACF,OAAO;QACL,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,OAAO;gBACL,MAAM,EAAE,MAAqB;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,MAAqB,CAAC;aAC1C,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAC9B,OAAO,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;KAChE,CAAC;AACJ,CAAC"}
|
package/dist/capability.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface FlowWorkInputApi {
|
|
|
21
21
|
* to a single flow node.
|
|
22
22
|
*/
|
|
23
23
|
export interface FlowWorkInvocationContext {
|
|
24
|
+
/** Bounded execution identity; stable across attempts and receipt recovery. */
|
|
25
|
+
operationId?: string;
|
|
24
26
|
/** Unique id of this invocation — stable across redelivery. */
|
|
25
27
|
invocationId: string;
|
|
26
28
|
/** DID of the manager authenticated by the exact UCAN invoker binding. */
|
package/dist/capability.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,CAAC,SAAS,qBAAqB,EACrC,MAAM,EAAE,OAAO,CAAC,sBAAsB,EAAE;QAAE,QAAQ,EAAE,CAAC,CAAA;KAAE,CAAC,GACvD,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,yBAAyB;IACxC,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IACtE,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACzB;;;;;OAKG;IACH,OAAO,EAAE,CACP,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EACvB,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,wBAAgB,cAAc,CAC5B,YAAY,EAAE,SAAS,kBAAkB,EAAE,EAC3C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,kBAAkB,GAAG,SAAS,CAIhC"}
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,CAAC,SAAS,qBAAqB,EACrC,MAAM,EAAE,OAAO,CAAC,sBAAsB,EAAE;QAAE,QAAQ,EAAE,CAAC,CAAA;KAAE,CAAC,GACvD,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,yBAAyB;IACxC,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IACtE,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACzB;;;;;OAKG;IACH,OAAO,EAAE,CACP,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EACvB,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,wBAAgB,cAAc,CAC5B,YAAY,EAAE,SAAS,kBAAkB,EAAE,EAC3C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,kBAAkB,GAAG,SAAS,CAIhC"}
|
package/dist/capability.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAqGA,MAAM,UAAU,cAAc,CAC5B,YAA2C,EAC3C,GAAW,EACX,UAAkB;IAElB,OAAO,YAAY,CAAC,IAAI,CACtB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type BoundedWorkEvent, type GatewayEvent, type BoundedJson } from './bounded-protocol.js';
|
|
2
|
+
import { DurableWorkStore, type StoredWork } from './durable-store.js';
|
|
3
|
+
export declare class InputPending extends Error {
|
|
4
|
+
readonly requestKey: string;
|
|
5
|
+
constructor(requestKey: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class DurableInput {
|
|
8
|
+
private readonly store;
|
|
9
|
+
private readonly now;
|
|
10
|
+
constructor(store: DurableWorkStore, now?: () => number);
|
|
11
|
+
request(work: StoredWork, requestValue: unknown, responders: string[]): BoundedJson;
|
|
12
|
+
private pending;
|
|
13
|
+
deliveryId(work: StoredWork, requestKey: string): string;
|
|
14
|
+
accept(work: StoredWork, event: GatewayEvent, content: Extract<BoundedWorkEvent, {
|
|
15
|
+
phase: 'input_response';
|
|
16
|
+
}>): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=durable-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-input.d.ts","sourceRoot":"","sources":["../src/durable-input.ts"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGvE,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAGxC;AACD,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADH,KAAK,EAAE,gBAAgB,EACvB,GAAG,eAAW;IAEjC,OAAO,CACL,IAAI,EAAE,UAAU,EAChB,YAAY,EAAE,OAAO,EACrB,UAAU,EAAE,MAAM,EAAE,GACnB,WAAW;IA2Ed,OAAO,CAAC,OAAO;IAGf,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAGxD,MAAM,CACJ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,OAAO,CAAC,gBAAgB,EAAE;QAAE,KAAK,EAAE,gBAAgB,CAAA;KAAE,CAAC,GAC9D,IAAI;CA6ER"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { flowWorkInputRequestSchema, flowWorkInputResponseSchema, } from './input.js';
|
|
3
|
+
import { bounded, same, text, parse, EVENT_TYPES, } from './bounded-protocol.js';
|
|
4
|
+
export class InputPending extends Error {
|
|
5
|
+
requestKey;
|
|
6
|
+
constructor(requestKey) {
|
|
7
|
+
super('INPUT_PENDING');
|
|
8
|
+
this.requestKey = requestKey;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class DurableInput {
|
|
12
|
+
store;
|
|
13
|
+
now;
|
|
14
|
+
constructor(store, now = Date.now) {
|
|
15
|
+
this.store = store;
|
|
16
|
+
this.now = now;
|
|
17
|
+
}
|
|
18
|
+
request(work, requestValue, responders) {
|
|
19
|
+
const request = bounded(flowWorkInputRequestSchema, requestValue);
|
|
20
|
+
if (!request.deadline ||
|
|
21
|
+
request.deadline > work.binding.deadline ||
|
|
22
|
+
request.invocationId !== work.binding.invocationId)
|
|
23
|
+
throw new Error('INPUT_REQUEST_BINDING_MISMATCH');
|
|
24
|
+
const deadline = request.deadline;
|
|
25
|
+
if (!responders.length ||
|
|
26
|
+
responders.length > 32 ||
|
|
27
|
+
new Set(responders).size !== responders.length)
|
|
28
|
+
throw new Error('INVALID_RESPONDER_POLICY');
|
|
29
|
+
if (request.target?.matrixUserId &&
|
|
30
|
+
!responders.includes(request.target.matrixUserId))
|
|
31
|
+
throw new Error('INPUT_TARGET_MISMATCH');
|
|
32
|
+
// DID-only selection requires an authenticated host resolution to concrete Matrix users.
|
|
33
|
+
if (request.target?.did && !request.target.matrixUserId)
|
|
34
|
+
throw new Error('INPUT_TARGET_RESOLUTION_REQUIRED');
|
|
35
|
+
return (this.store.storage.transactionSync(() => {
|
|
36
|
+
this.store.assertCurrent(work);
|
|
37
|
+
const prior = this.store.storage.sql
|
|
38
|
+
.exec('SELECT * FROM helper_input WHERE work_key=? AND request_key=?', work.key, request.requestKey)
|
|
39
|
+
.toArray()[0];
|
|
40
|
+
if (prior) {
|
|
41
|
+
if (prior.body !== text(request) ||
|
|
42
|
+
prior.responders !== text(responders) ||
|
|
43
|
+
prior.binding !== text(work.binding))
|
|
44
|
+
throw new Error('INPUT_REQUEST_CONFLICT');
|
|
45
|
+
if (prior.response !== null)
|
|
46
|
+
return parse(z.custom(() => true), String(prior.response));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.store.storage.sql.exec(`INSERT INTO helper_input VALUES (?,?,?,?,?,?,NULL,NULL,NULL)`, work.key, request.requestKey, text(work.binding), text(request), text(responders), deadline);
|
|
50
|
+
this.store.enqueue(this.deliveryId(work, request.requestKey), work, EVENT_TYPES.input_request, {
|
|
51
|
+
phase: 'input_request',
|
|
52
|
+
binding: work.binding,
|
|
53
|
+
requestKey: request.requestKey,
|
|
54
|
+
request: request,
|
|
55
|
+
responders,
|
|
56
|
+
deadline: request.deadline,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (deadline <= this.now())
|
|
60
|
+
return { status: 'expired', deadline };
|
|
61
|
+
// Return outside the transaction before suspending the domain handler.
|
|
62
|
+
return null;
|
|
63
|
+
}) ?? this.pending(request.requestKey));
|
|
64
|
+
}
|
|
65
|
+
pending(key) {
|
|
66
|
+
throw new InputPending(key);
|
|
67
|
+
}
|
|
68
|
+
deliveryId(work, requestKey) {
|
|
69
|
+
return `input:${work.binding.invocationId}:${work.binding.attempt}:${requestKey}`;
|
|
70
|
+
}
|
|
71
|
+
accept(work, event, content) {
|
|
72
|
+
this.store.assertCurrent(work);
|
|
73
|
+
const prior = this.store.storage.sql
|
|
74
|
+
.exec('SELECT * FROM helper_input WHERE work_key=? AND request_key=?', work.key, content.requestKey)
|
|
75
|
+
.toArray()[0];
|
|
76
|
+
if (!prior ||
|
|
77
|
+
!same(work.binding, content.binding) ||
|
|
78
|
+
prior.binding !== text(content.binding) ||
|
|
79
|
+
prior.event_id !== content.requestEventId)
|
|
80
|
+
throw new Error('INPUT_RELATION_MISMATCH');
|
|
81
|
+
if (this.now() >= Number(prior.deadline) ||
|
|
82
|
+
event.originServerTs >= Number(prior.deadline))
|
|
83
|
+
throw new Error('INPUT_DEADLINE_EXPIRED');
|
|
84
|
+
const responders = parse(z.array(z.string()), String(prior.responders));
|
|
85
|
+
if (!responders.includes(event.sender))
|
|
86
|
+
throw new Error('INPUT_RESPONDER_DENIED');
|
|
87
|
+
const request = parse(flowWorkInputRequestSchema, String(prior.body));
|
|
88
|
+
const response = bounded(flowWorkInputResponseSchema, content.response);
|
|
89
|
+
if (response.invocationId !== work.binding.invocationId ||
|
|
90
|
+
response.requestKey !== content.requestKey ||
|
|
91
|
+
response.template !== request.template ||
|
|
92
|
+
response['m.relates_to'].event_id !== content.requestEventId)
|
|
93
|
+
throw new Error('INPUT_RESPONSE_MISMATCH');
|
|
94
|
+
if (request.template === 'select' &&
|
|
95
|
+
response.template === 'select' &&
|
|
96
|
+
!request.options.some((o) => o.id === response.optionId))
|
|
97
|
+
throw new Error('INPUT_OPTION_INVALID');
|
|
98
|
+
if (request.template === 'entity-select' &&
|
|
99
|
+
response.template === 'entity-select' &&
|
|
100
|
+
!request.options.some((o) => o.id === response.entityId))
|
|
101
|
+
throw new Error('INPUT_OPTION_INVALID');
|
|
102
|
+
if (request.template === 'text' && response.template === 'text') {
|
|
103
|
+
if (response.text.length < (request.minLength ?? 1) ||
|
|
104
|
+
response.text.length > (request.maxLength ?? 8192))
|
|
105
|
+
throw new Error('INPUT_TEXT_INVALID');
|
|
106
|
+
// Arbitrary regular expressions are not safe in the bounded execution lane.
|
|
107
|
+
if (request.pattern)
|
|
108
|
+
throw new Error('INPUT_PATTERN_REQUIRES_VALIDATOR');
|
|
109
|
+
}
|
|
110
|
+
const outcome = {
|
|
111
|
+
status: 'answered',
|
|
112
|
+
response,
|
|
113
|
+
requestEventId: content.requestEventId,
|
|
114
|
+
responseEventId: event.eventId,
|
|
115
|
+
sender: event.sender,
|
|
116
|
+
respondedAtMs: event.originServerTs,
|
|
117
|
+
fromHistory: true,
|
|
118
|
+
};
|
|
119
|
+
if (prior.response !== null &&
|
|
120
|
+
(prior.response_event !== event.eventId ||
|
|
121
|
+
prior.response !== text(outcome)))
|
|
122
|
+
throw new Error('INPUT_RESPONSE_CONFLICT');
|
|
123
|
+
this.store.storage.sql.exec('UPDATE helper_input SET response=?,response_event=? WHERE work_key=? AND request_key=?', text(outcome), event.eventId, work.key, content.requestKey);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=durable-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-input.js","sourceRoot":"","sources":["../src/durable-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type BoundedJson, type BoundedWorkBinding, type ExecutionResult, type GatewayEvent } from './bounded-protocol.js';
|
|
3
|
+
import { DurableWorkStore, type StoredWork } from './durable-store.js';
|
|
4
|
+
import { DurableInput } from './durable-input.js';
|
|
5
|
+
import { GatewayClient } from './gateway-client.js';
|
|
6
|
+
import type { DelegationValidator } from './ucan.js';
|
|
7
|
+
export interface DurableCapability {
|
|
8
|
+
can: string;
|
|
9
|
+
actionType: string;
|
|
10
|
+
inputSchema: z.ZodType;
|
|
11
|
+
outputSchema: z.ZodType;
|
|
12
|
+
invoke(inputs: BoundedJson, context: DurableContext): Promise<{
|
|
13
|
+
output: BoundedJson;
|
|
14
|
+
outcomes: BoundedJson;
|
|
15
|
+
} | ExecutionResult>;
|
|
16
|
+
readback(inputs: BoundedJson, context: DurableContext): Promise<ExecutionResult>;
|
|
17
|
+
}
|
|
18
|
+
export interface DurableContext {
|
|
19
|
+
binding: BoundedWorkBinding;
|
|
20
|
+
delegation: string;
|
|
21
|
+
input: DurableInput;
|
|
22
|
+
work: StoredWork;
|
|
23
|
+
}
|
|
24
|
+
export interface WorkAuthority {
|
|
25
|
+
/** Check current epoch, execution grant, eligibility, revision, actor, and helper routing at the trusted definition service. */
|
|
26
|
+
authorize(binding: BoundedWorkBinding): Promise<{
|
|
27
|
+
expiresAt: number;
|
|
28
|
+
stateVersion: number;
|
|
29
|
+
grantDigest: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export declare class DurableWorkListener {
|
|
33
|
+
private readonly options;
|
|
34
|
+
readonly input: DurableInput;
|
|
35
|
+
constructor(options: {
|
|
36
|
+
store: DurableWorkStore;
|
|
37
|
+
gateway: GatewayClient;
|
|
38
|
+
oracleDid: string;
|
|
39
|
+
matrixUserId: string;
|
|
40
|
+
capabilities: readonly DurableCapability[];
|
|
41
|
+
validateDelegation: DelegationValidator;
|
|
42
|
+
authority: WorkAuthority;
|
|
43
|
+
now?: () => number;
|
|
44
|
+
});
|
|
45
|
+
private now;
|
|
46
|
+
authorize(binding: BoundedWorkBinding, delegation: string): Promise<DurableCapability>;
|
|
47
|
+
consume(event: GatewayEvent): Promise<void>;
|
|
48
|
+
private enqueueReady;
|
|
49
|
+
advance(work: StoredWork): Promise<void>;
|
|
50
|
+
private enqueueReceipt;
|
|
51
|
+
flush(): Promise<void>;
|
|
52
|
+
/** One bounded delivery per turn. Persist accepted state before the gateway acknowledgement. */
|
|
53
|
+
tick(): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=durable-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-listener.d.ts","sourceRoot":"","sources":["../src/durable-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAUL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC;IACxB,MAAM,CACJ,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAE,GAAG,eAAe,CAAC,CAAC;IAC7E,QAAQ,CACN,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7B;AACD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;CAClB;AACD,MAAM,WAAW,aAAa;IAC5B,gIAAgI;IAChI,SAAS,CACP,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E;AACD,qBAAa,mBAAmB;IAG5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;gBAEV,OAAO,EAAE;QACxB,KAAK,EAAE,gBAAgB,CAAC;QACxB,OAAO,EAAE,aAAa,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAAC;QAC3C,kBAAkB,EAAE,mBAAmB,CAAC;QACxC,SAAS,EAAE,aAAa,CAAC;QACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;KACpB;IAIH,OAAO,CAAC,GAAG;IAGL,SAAS,CACb,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC;IAuCvB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDjD,OAAO,CAAC,YAAY;IAYd,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA4D9C,OAAO,CAAC,cAAc;IAahB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B5B,gGAAgG;IAC1F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { bounded, eventSchema, resultSchema, EVENT_TYPES, grantCaveats, hash, same, parse, } from './bounded-protocol.js';
|
|
2
|
+
import { DurableInput } from './durable-input.js';
|
|
3
|
+
export class DurableWorkListener {
|
|
4
|
+
options;
|
|
5
|
+
input;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.input = new DurableInput(options.store, () => this.now());
|
|
9
|
+
}
|
|
10
|
+
now() {
|
|
11
|
+
return this.options.now?.() ?? Date.now();
|
|
12
|
+
}
|
|
13
|
+
async authorize(binding, delegation) {
|
|
14
|
+
const { oracleDid, matrixUserId, capabilities, authority, validateDelegation, } = this.options;
|
|
15
|
+
if (binding.helperDid !== oracleDid ||
|
|
16
|
+
binding.helperMatrixId !== matrixUserId ||
|
|
17
|
+
binding.deadline <= this.now())
|
|
18
|
+
throw new Error('HELPER_AUTHORITY_DENIED');
|
|
19
|
+
const capability = capabilities.find((c) => c.can === binding.capability && c.actionType === binding.actionType);
|
|
20
|
+
if (!capability)
|
|
21
|
+
throw new Error('CAPABILITY_NOT_DECLARED');
|
|
22
|
+
const grant = await validateDelegation(delegation);
|
|
23
|
+
if (!grant.ok ||
|
|
24
|
+
grant.invokerDid !== binding.managerDid ||
|
|
25
|
+
grant.capability?.can !== binding.capability ||
|
|
26
|
+
grant.capability.with !== binding.resource ||
|
|
27
|
+
!same(grant.capability.nb, grantCaveats(binding)) ||
|
|
28
|
+
!grant.expiration ||
|
|
29
|
+
grant.expiration * 1000 < binding.deadline)
|
|
30
|
+
throw new Error('DOMAIN_GRANT_DENIED');
|
|
31
|
+
const authorized = await authority.authorize(binding);
|
|
32
|
+
if (authorized.expiresAt <= this.now() ||
|
|
33
|
+
authorized.stateVersion !== binding.admission.stateVersion ||
|
|
34
|
+
authorized.grantDigest !== binding.admission.grantDigest)
|
|
35
|
+
throw new Error('EXECUTION_AUTHORITY_DENIED');
|
|
36
|
+
return capability;
|
|
37
|
+
}
|
|
38
|
+
async consume(event) {
|
|
39
|
+
const { store } = this.options;
|
|
40
|
+
const fingerprint = await hash(event);
|
|
41
|
+
if (store.seen(event.eventId, fingerprint))
|
|
42
|
+
return;
|
|
43
|
+
const content = bounded(eventSchema, event.content);
|
|
44
|
+
const binding = content.binding;
|
|
45
|
+
if (!event.encrypted ||
|
|
46
|
+
event.roomId !== binding.admission.roomId ||
|
|
47
|
+
event.type !== EVENT_TYPES[content.phase])
|
|
48
|
+
throw new Error('EVENT_BINDING_MISMATCH');
|
|
49
|
+
const key = store.key(binding);
|
|
50
|
+
if (content.phase === 'assign') {
|
|
51
|
+
if (event.sender !== binding.managerMatrixId)
|
|
52
|
+
throw new Error('SENDER_UNTRUSTED');
|
|
53
|
+
await this.authorize(binding, content.delegation);
|
|
54
|
+
store.storage.transactionSync(() => {
|
|
55
|
+
const work = store.assign(binding, content.delegation, event.eventId);
|
|
56
|
+
this.enqueueReady(work);
|
|
57
|
+
store.markSeen(event.eventId, fingerprint);
|
|
58
|
+
});
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const work = store.read(key);
|
|
62
|
+
if (!work || !same(work.binding, binding))
|
|
63
|
+
throw new Error('ASSIGNMENT_MISSING');
|
|
64
|
+
if (content.phase === 'invoke') {
|
|
65
|
+
if (event.sender !== binding.managerMatrixId ||
|
|
66
|
+
content.requestEventId !== work.readyEvent)
|
|
67
|
+
throw new Error('INVOKE_RELATION_MISMATCH');
|
|
68
|
+
if ((await hash(content.inputs)) !== binding.admission.inputDigest)
|
|
69
|
+
throw new Error('INPUT_DIGEST_MISMATCH');
|
|
70
|
+
await this.authorize(binding, work.delegation);
|
|
71
|
+
store.storage.transactionSync(() => {
|
|
72
|
+
const accepted = store.accept(work, content.inputs, event.eventId);
|
|
73
|
+
if (accepted.result && accepted.result.outcome !== 'needs_verification')
|
|
74
|
+
this.enqueueReceipt(accepted, accepted.result);
|
|
75
|
+
store.markSeen(event.eventId, fingerprint);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (content.phase === 'input_response') {
|
|
79
|
+
store.storage.transactionSync(() => {
|
|
80
|
+
this.input.accept(work, event, content);
|
|
81
|
+
store.markSeen(event.eventId, fingerprint);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else
|
|
85
|
+
throw new Error('UNEXPECTED_HELPER_EVENT');
|
|
86
|
+
}
|
|
87
|
+
enqueueReady(work) {
|
|
88
|
+
this.options.store.enqueue(`ready:${work.binding.invocationId}:${work.binding.attempt}`, work, EVENT_TYPES.ready, {
|
|
89
|
+
phase: 'ready',
|
|
90
|
+
binding: work.binding,
|
|
91
|
+
requestEventId: work.assignEvent,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async advance(work) {
|
|
95
|
+
const { store } = this.options;
|
|
96
|
+
if (!work.invokeEvent || work.inputs === null) {
|
|
97
|
+
if (!work.readyEvent)
|
|
98
|
+
this.enqueueReady(work);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (work.result && work.result.outcome !== 'needs_verification') {
|
|
102
|
+
this.enqueueReceipt(work, work.result);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
let capability;
|
|
106
|
+
try {
|
|
107
|
+
capability = await this.authorize(work.binding, work.delegation);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return;
|
|
111
|
+
} // Current read authority is absent. Retain the durable uncertain state.
|
|
112
|
+
const context = {
|
|
113
|
+
binding: work.binding,
|
|
114
|
+
delegation: work.delegation,
|
|
115
|
+
input: this.input,
|
|
116
|
+
work,
|
|
117
|
+
};
|
|
118
|
+
let inputs;
|
|
119
|
+
try {
|
|
120
|
+
inputs = bounded(capability.inputSchema, work.inputs);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
if (work.state === 'accepted') {
|
|
124
|
+
const result = {
|
|
125
|
+
outcome: 'failed_before_effect',
|
|
126
|
+
error: { code: 'ACTION_INPUT_INVALID' },
|
|
127
|
+
};
|
|
128
|
+
store.storage.transactionSync(() => {
|
|
129
|
+
store.finish(work, result);
|
|
130
|
+
this.enqueueReceipt(work, result);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const first = store.arm(work);
|
|
136
|
+
let result;
|
|
137
|
+
try {
|
|
138
|
+
if (first) {
|
|
139
|
+
const invoked = await capability.invoke(inputs, context);
|
|
140
|
+
result =
|
|
141
|
+
'outcome' in invoked ? invoked : { outcome: 'succeeded', ...invoked };
|
|
142
|
+
}
|
|
143
|
+
else
|
|
144
|
+
result = await capability.readback(inputs, context);
|
|
145
|
+
result = bounded(resultSchema, result);
|
|
146
|
+
if (result.outcome === 'succeeded')
|
|
147
|
+
bounded(capability.outputSchema, result.output);
|
|
148
|
+
// A readback adapter may prove a durable pre-effect rejection, such as a declined approval.
|
|
149
|
+
// An exception never supplies that proof and always remains uncertain.
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
result = { outcome: 'needs_verification' };
|
|
153
|
+
}
|
|
154
|
+
store.storage.transactionSync(() => {
|
|
155
|
+
store.finish(work, result);
|
|
156
|
+
if (result.outcome !== 'needs_verification')
|
|
157
|
+
this.enqueueReceipt(work, result);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
enqueueReceipt(work, result) {
|
|
161
|
+
this.options.store.enqueue(`receipt:${work.binding.invocationId}:${work.binding.attempt}`, work, EVENT_TYPES.receipt, {
|
|
162
|
+
phase: 'receipt',
|
|
163
|
+
binding: work.binding,
|
|
164
|
+
requestEventId: work.invokeEvent,
|
|
165
|
+
result,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
async flush() {
|
|
169
|
+
const { store, gateway } = this.options;
|
|
170
|
+
for (const delivery of store.deliveries()) {
|
|
171
|
+
const content = parse(eventSchema, String(delivery.content));
|
|
172
|
+
const eventId = await gateway.send({
|
|
173
|
+
transactionId: String(delivery.id),
|
|
174
|
+
roomId: String(delivery.room_id),
|
|
175
|
+
type: String(delivery.type),
|
|
176
|
+
content: content,
|
|
177
|
+
epoch: Number(delivery.epoch),
|
|
178
|
+
});
|
|
179
|
+
store.storage.transactionSync(() => {
|
|
180
|
+
store.delivered(String(delivery.id), eventId);
|
|
181
|
+
const work = store.read(String(delivery.work_key));
|
|
182
|
+
if (content.phase === 'ready' && same(work.binding, content.binding))
|
|
183
|
+
store.ready(work, eventId);
|
|
184
|
+
if (content.phase === 'input_request')
|
|
185
|
+
store.storage.sql.exec('UPDATE helper_input SET event_id=? WHERE work_key=? AND request_key=?', eventId, work.key, content.requestKey);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** One bounded delivery per turn. Persist accepted state before the gateway acknowledgement. */
|
|
190
|
+
async tick() {
|
|
191
|
+
await this.flush();
|
|
192
|
+
const page = await this.options.gateway.read();
|
|
193
|
+
for (const event of page.events) {
|
|
194
|
+
await this.consume(event);
|
|
195
|
+
await this.options.gateway.ack(event.eventId);
|
|
196
|
+
}
|
|
197
|
+
for (const work of this.options.store.pending())
|
|
198
|
+
await this.advance(work);
|
|
199
|
+
await this.flush();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=durable-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-listener.js","sourceRoot":"","sources":["../src/durable-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type BoundedWorkBinding, type BoundedJson, type ExecutionResult } from './bounded-protocol.js';
|
|
2
|
+
/** Structurally compatible with the runtime-core SQL port and Durable Object storage. */
|
|
3
|
+
export interface WorkSql {
|
|
4
|
+
sql: {
|
|
5
|
+
exec<T extends Record<string, string | number | null | ArrayBuffer>>(query: string, ...args: (string | number | null)[]): {
|
|
6
|
+
toArray(): T[];
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
transactionSync<T>(body: () => T): T;
|
|
10
|
+
}
|
|
11
|
+
type Row = Record<string, string | number | null | ArrayBuffer>;
|
|
12
|
+
export type WorkState = 'assigned' | 'ready' | 'accepted' | 'armed' | 'needs_verification' | 'complete';
|
|
13
|
+
export interface StoredWork {
|
|
14
|
+
key: string;
|
|
15
|
+
binding: BoundedWorkBinding;
|
|
16
|
+
delegation: string;
|
|
17
|
+
assignEvent: string;
|
|
18
|
+
readyEvent: string | null;
|
|
19
|
+
invokeEvent: string | null;
|
|
20
|
+
inputs: BoundedJson | null;
|
|
21
|
+
state: WorkState;
|
|
22
|
+
result: ExecutionResult | null;
|
|
23
|
+
}
|
|
24
|
+
export declare class DurableWorkStore {
|
|
25
|
+
readonly storage: WorkSql;
|
|
26
|
+
constructor(storage: WorkSql);
|
|
27
|
+
key(binding: BoundedWorkBinding): string;
|
|
28
|
+
read(key: string): StoredWork | null;
|
|
29
|
+
assign(binding: BoundedWorkBinding, delegation: string, eventId: string): StoredWork;
|
|
30
|
+
assertCurrent(work: StoredWork): void;
|
|
31
|
+
ready(work: StoredWork, eventId: string): void;
|
|
32
|
+
accept(work: StoredWork, inputs: BoundedJson, eventId: string): StoredWork;
|
|
33
|
+
arm(work: StoredWork): boolean;
|
|
34
|
+
finish(work: StoredWork, result: ExecutionResult): void;
|
|
35
|
+
pending(limit?: number): StoredWork[];
|
|
36
|
+
enqueue(id: string, work: StoredWork, type: string, content: BoundedJson): void;
|
|
37
|
+
deliveries(limit?: number): Row[];
|
|
38
|
+
delivered(id: string, eventId: string): void;
|
|
39
|
+
seen(eventId: string, fingerprint: string): boolean;
|
|
40
|
+
markSeen(eventId: string, fingerprint: string): void;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=durable-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-store.d.ts","sourceRoot":"","sources":["../src/durable-store.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,yFAAyF;AACzF,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE;QACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,WAAW,CAAC,EACjE,KAAK,EAAE,MAAM,EACb,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAClC;YAAE,OAAO,IAAI,CAAC,EAAE,CAAA;SAAE,CAAC;KACvB,CAAC;IACF,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;CACtC;AACD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC;AAChE,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,OAAO,GACP,UAAU,GACV,OAAO,GACP,oBAAoB,GACpB,UAAU,CAAC;AACf,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CAChC;AAED,qBAAa,gBAAgB;IACf,QAAQ,CAAC,OAAO,EAAE,OAAO;gBAAhB,OAAO,EAAE,OAAO;IA8BrC,GAAG,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM;IAGxC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAmBpC,MAAM,CACJ,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,UAAU;IA4Db,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAerC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAU9C,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU;IAgB1E,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAW9B,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAmBvD,OAAO,CAAC,KAAK,SAAI,GAAG,UAAU,EAAE;IA+BhC,OAAO,CACL,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,IAAI;IAsBP,UAAU,CAAC,KAAK,SAAI,GAAG,GAAG,EAAE;IAU5B,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAY5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAWnD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;CAOrD"}
|