@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.
Files changed (74) 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/node-sqlite.d.ts +12 -0
  62. package/dist/node-sqlite.d.ts.map +1 -0
  63. package/dist/node-sqlite.js +45 -0
  64. package/dist/node-sqlite.js.map +1 -0
  65. package/dist/protocol.d.ts +4 -4
  66. package/dist/provider-journal.d.ts +26 -0
  67. package/dist/provider-journal.d.ts.map +1 -0
  68. package/dist/provider-journal.js +94 -0
  69. package/dist/provider-journal.js.map +1 -0
  70. package/dist/work-authority.d.ts +16 -0
  71. package/dist/work-authority.d.ts.map +1 -0
  72. package/dist/work-authority.js +31 -0
  73. package/dist/work-authority.js.map +1 -0
  74. 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"}
@@ -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"}
@@ -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. */
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAmGA,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"}
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"}