@ixo/flow-work 0.2.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/input.js ADDED
@@ -0,0 +1,198 @@
1
+ import { z } from 'zod';
2
+ /** Interactive-input sub-protocol v1 wire constants and schemas. */
3
+ export const FLOW_WORK_INPUT_REQUEST_EVENT = 'ixo.flow.work.input.request';
4
+ export const FLOW_WORK_INPUT_RESPONSE_EVENT = 'ixo.flow.work.input.response';
5
+ export const FLOW_WORK_INPUT_INDEX_EVENT = 'ixo.flow.work.input.index';
6
+ export const FLOW_WORK_INPUT_RESPONSE_REL_TYPE = 'm.reference';
7
+ export const FLOW_WORK_INPUT_PROTOCOL_VERSION = 1;
8
+ const nonEmpty = z.string().trim().min(1);
9
+ const sha256Hex = z.string().regex(/^sha256:[0-9a-f]{64}$/);
10
+ const requestKeySchema = z
11
+ .string()
12
+ .min(1)
13
+ .max(128)
14
+ .refine((value) => value === value.trim(), 'requestKey must not have leading or trailing whitespace');
15
+ export const FLOW_WORK_INPUT_TEMPLATES = [
16
+ 'approval',
17
+ 'select',
18
+ 'entity-select',
19
+ 'entity-protocol-select',
20
+ 'suggestion',
21
+ 'text',
22
+ ];
23
+ export const flowWorkInputTargetSchema = z
24
+ .object({
25
+ matrixUserId: nonEmpty.optional(),
26
+ did: nonEmpty.optional(),
27
+ })
28
+ .strict()
29
+ .refine((value) => value.matrixUserId !== undefined || value.did !== undefined, 'target requires a matrixUserId or a did');
30
+ export const flowWorkSelectOptionSchema = z
31
+ .object({
32
+ id: nonEmpty,
33
+ label: nonEmpty,
34
+ description: nonEmpty.optional(),
35
+ })
36
+ .strict();
37
+ export const flowWorkEntityOptionSchema = z
38
+ .object({
39
+ id: nonEmpty,
40
+ label: nonEmpty,
41
+ })
42
+ .strict();
43
+ const requestShape = {
44
+ protocolVersion: z.literal(1),
45
+ requestKey: requestKeySchema,
46
+ invocationId: nonEmpty.optional(),
47
+ target: flowWorkInputTargetSchema.optional(),
48
+ deadline: z.number().int().positive().optional(),
49
+ title: nonEmpty.optional(),
50
+ prompt: nonEmpty,
51
+ };
52
+ export const flowWorkInputRequestSchema = z.discriminatedUnion('template', [
53
+ z
54
+ .object({
55
+ ...requestShape,
56
+ template: z.literal('approval'),
57
+ approveLabel: nonEmpty.optional(),
58
+ rejectLabel: nonEmpty.optional(),
59
+ })
60
+ .strict(),
61
+ z
62
+ .object({
63
+ ...requestShape,
64
+ template: z.literal('select'),
65
+ options: z.array(flowWorkSelectOptionSchema).min(1).max(50),
66
+ })
67
+ .strict(),
68
+ z
69
+ .object({
70
+ ...requestShape,
71
+ template: z.literal('entity-select'),
72
+ options: z.array(flowWorkEntityOptionSchema).min(1).max(50),
73
+ })
74
+ .strict(),
75
+ // Options are resolved by the RENDERING CLIENT, not the sender: the Portal
76
+ // fetches the entity's linked claim protocols with the viewing user's own
77
+ // credentials (getEntityClaimProtocols) — the orchestrator has no access to
78
+ // entity-room state and only names the entity to fetch for.
79
+ z
80
+ .object({
81
+ ...requestShape,
82
+ template: z.literal('entity-protocol-select'),
83
+ entityDid: nonEmpty,
84
+ })
85
+ .strict(),
86
+ // Informational only — no response template exists. The card surfaces a
87
+ // discovered oracle the human MAY act on by their own means (e.g. copy the
88
+ // address into a grant); nothing is started and nothing awaits an answer.
89
+ z
90
+ .object({
91
+ ...requestShape,
92
+ template: z.literal('suggestion'),
93
+ suggestion: z
94
+ .object({
95
+ kind: nonEmpty,
96
+ name: nonEmpty,
97
+ did: nonEmpty,
98
+ address: nonEmpty.optional(),
99
+ matrixUserId: nonEmpty.optional(),
100
+ capability: nonEmpty,
101
+ })
102
+ .strict(),
103
+ })
104
+ .strict(),
105
+ z
106
+ .object({
107
+ ...requestShape,
108
+ template: z.literal('text'),
109
+ placeholder: nonEmpty.optional(),
110
+ minLength: z.number().int().min(0).optional(),
111
+ maxLength: z.number().int().min(1).optional(),
112
+ pattern: nonEmpty.optional(),
113
+ multiline: z.boolean().optional(),
114
+ })
115
+ .strict(),
116
+ ]);
117
+ export const flowWorkInputRelatesToSchema = z
118
+ .object({
119
+ rel_type: z.literal('m.reference'),
120
+ event_id: nonEmpty,
121
+ })
122
+ .strict();
123
+ const responseShape = {
124
+ protocolVersion: z.literal(1),
125
+ requestKey: requestKeySchema,
126
+ invocationId: nonEmpty.optional(),
127
+ 'm.relates_to': flowWorkInputRelatesToSchema,
128
+ };
129
+ /** Response readers intentionally strip unknown fields for version tolerance. */
130
+ export const flowWorkInputResponseSchema = z.discriminatedUnion('template', [
131
+ z.object({
132
+ ...responseShape,
133
+ template: z.literal('approval'),
134
+ approved: z.boolean(),
135
+ }),
136
+ z.object({
137
+ ...responseShape,
138
+ template: z.literal('select'),
139
+ optionId: nonEmpty,
140
+ }),
141
+ z.object({
142
+ ...responseShape,
143
+ template: z.literal('entity-select'),
144
+ entityId: nonEmpty,
145
+ }),
146
+ z.object({
147
+ ...responseShape,
148
+ template: z.literal('entity-protocol-select'),
149
+ /** The selected protocol DID (the option id the client resolved). */
150
+ optionId: nonEmpty,
151
+ }),
152
+ z.object({
153
+ ...responseShape,
154
+ template: z.literal('text'),
155
+ text: z
156
+ .string()
157
+ .refine((value) => value.trim().length > 0, 'text must not be blank'),
158
+ }),
159
+ ]);
160
+ export const flowWorkInputIndexSchema = z
161
+ .object({
162
+ protocolVersion: z.literal(1),
163
+ requestEventId: nonEmpty,
164
+ requestKey: requestKeySchema,
165
+ invocationId: nonEmpty,
166
+ nodeId: nonEmpty,
167
+ attempt: z.number().int().min(1),
168
+ inputHash: sha256Hex,
169
+ contentHash: sha256Hex,
170
+ deadline: z.number().int().positive(),
171
+ })
172
+ .strict();
173
+ export function parseInputRequest(content) {
174
+ return flowWorkInputRequestSchema.safeParse(content);
175
+ }
176
+ export function parseInputResponse(content) {
177
+ return flowWorkInputResponseSchema.safeParse(content);
178
+ }
179
+ export function inputRequestIdentity(roomId, sender, requestKey) {
180
+ return `${roomId}\u0000${sender}\u0000${requestKey}`;
181
+ }
182
+ export function responseAnswersRequest(response, request, requestEventId) {
183
+ if (response['m.relates_to'].event_id !== requestEventId)
184
+ return false;
185
+ if (response.requestKey !== request.requestKey)
186
+ return false;
187
+ if (response.template !== request.template)
188
+ return false;
189
+ if (request.template === 'select' && response.template === 'select') {
190
+ return request.options.some((option) => option.id === response.optionId);
191
+ }
192
+ if (request.template === 'entity-select' &&
193
+ response.template === 'entity-select') {
194
+ return request.options.some((option) => option.id === response.entityId);
195
+ }
196
+ return true;
197
+ }
198
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
@@ -8,44 +8,85 @@ export interface FlowWorkLogger {
8
8
  }
9
9
  export interface FlowWorkListenerOptions {
10
10
  port: FlowWorkMatrixPort;
11
- /** This oracle's DID — invocations addressed elsewhere are ignored. */
11
+ /** This oracle entity DID — the expected UCAN delegation audience. */
12
12
  oracleDid: string;
13
- /** Homeserver domains whose room invites are accepted. */
14
- trustedHomeservers: readonly string[];
15
13
  capabilities: readonly FlowWorkCapability[];
16
14
  validateDelegation: DelegationValidator;
17
15
  logger: FlowWorkLogger;
18
- /** How many recent room events to scan for an existing receipt. */
16
+ /** Delay before retrying an unchanged ready/receipt state publication. */
17
+ receiptRetryMs?: number;
18
+ /** Injectable wall clock for deadline tests. */
19
+ now?: () => number;
20
+ /** @deprecated v2 receipt replay uses Matrix current state, never a timeline scan. */
19
21
  receiptScanLimit?: number;
20
22
  }
21
- /** Hostname of '@user:server.tld' or a bare/prefixed server name. */
22
- export declare function homeserverOf(value: string): string | null;
23
23
  /**
24
- * The oracle side of the flow-work contract: accepts invites from trusted
25
- * homeservers, executes UCAN-authorized `ixo.flow.work.invoke` events via
26
- * the declared capability handlers, and posts `ixo.flow.work.receipt`s.
24
+ * Oracle-side flow-work v2 state machine.
25
+ *
26
+ * Assignment and ready are durable state events. Invoke remains a timeline
27
+ * command. Receipt is durable state keyed by invocationId, so restart replay
28
+ * does not depend on a recent-event window.
27
29
  */
28
30
  export declare class FlowWorkListener {
29
31
  private readonly options;
30
- private readonly trusted;
32
+ private readonly assignments;
31
33
  private readonly active;
32
34
  private readonly completed;
35
+ private readonly pendingReceipts;
36
+ private readonly publishedReceipts;
37
+ private readonly publishing;
38
+ private readonly retryTimers;
39
+ private readonly readyTimers;
40
+ /** Per-room seeding chain, so concurrent seeds never interleave. */
41
+ private readonly seeding;
42
+ /** In-flight ready publications, so a seed never double-sends a ready. */
43
+ private readonly acknowledging;
33
44
  private unsubscribe;
45
+ private started;
46
+ private readonly inputCoordinator;
34
47
  constructor(options: FlowWorkListenerOptions);
48
+ /** Subscribe synchronously before any Matrix initial sync is started. */
35
49
  start(): void;
36
50
  stop(): void;
51
+ /** Reconcile invitations and current assignment state after initial sync. */
52
+ bootstrap(): Promise<void>;
53
+ private now;
54
+ private retryMs;
37
55
  private handleInvite;
56
+ /**
57
+ * Seed the assignment table from a room's current state.
58
+ *
59
+ * Serialised per room and chained behind any seed already running, so a join
60
+ * transition, a pending invite and post-sync bootstrap can all request the
61
+ * same room without interleaving. Every accepted assignment is routed through
62
+ * {@link handleAssignment} — the same validation and deduplication path the
63
+ * live timeline handler uses — so a seeded assignment is never reprocessed
64
+ * and never re-acknowledged.
65
+ */
66
+ private bootstrapRoom;
67
+ /** Never rejects: one unreadable event must not abandon the rest of a room. */
68
+ private seedRoomAssignments;
38
69
  private handleRoomEvent;
70
+ private handleAssignment;
71
+ private hasOwnReady;
39
72
  /**
40
- * Bind nb caveats to the invocation before executing. A delegation minted
41
- * for one claim schema must not be reusable with unrelated claim data:
42
- * `nb.claimSchema` requires the invocation's `inputs.claimSchemaId` to be
43
- * present and equal.
73
+ * Publish ready at most once per accepted assignment at a time.
74
+ *
75
+ * `handleAssignment` runs to the point of registering the assignment
76
+ * synchronously, but the send that follows is awaited. Without this guard a
77
+ * seed and the live delivery of the same assign could both observe
78
+ * `ready === false` and each publish a ready. Concurrent callers for the same
79
+ * assignment object share the in-flight publication; a genuinely new
80
+ * assignment object (a later attempt) is allowed its own send.
44
81
  */
45
- private enforceCaveats;
82
+ private acknowledgeAssignment;
83
+ private publishReady;
84
+ private handleInvocation;
46
85
  private execute;
47
- private hasExistingReceipt;
48
- private postFailure;
49
- private postReceipt;
86
+ /** Preserve service contract caveats after the full exact nb comparison. */
87
+ private enforceCaveats;
88
+ private hasOwnReceipt;
89
+ private publishReceipt;
90
+ private scheduleReceiptRetry;
50
91
  }
51
92
  //# sourceMappingURL=listener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,kBAAkB,CAAC;IACzB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC5C,kBAAkB,EAAE,mBAAmB,CAAC;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAYD,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBzD;AAMD;;;;GAIG;AACH,qBAAa,gBAAgB;IAMf,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,WAAW,CAAyB;gBAEf,OAAO,EAAE,uBAAuB;IAa7D,KAAK,IAAI,IAAI;IAuBb,IAAI,IAAI,IAAI;YAKE,YAAY;YAcZ,eAAe;IAgE7B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;YAiBR,OAAO;IA4DrB,OAAO,CAAC,kBAAkB;YAYZ,WAAW;YAcX,WAAW;CAQ1B"}
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAK1E,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAmB1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,kBAAkB,CAAC;IACzB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC5C,kBAAkB,EAAE,mBAAmB,CAAC;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA4BD;;;;;;GAMG;AACH,qBAAa,gBAAgB;IA0Bf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAzBpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyC;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IACJ,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IACJ,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG1B;IACJ,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;gBAE9B,OAAO,EAAE,uBAAuB;IAc7D,yEAAyE;IACzE,KAAK,IAAI,IAAI;IA0Cb,IAAI,IAAI,IAAI;IAWZ,6EAA6E;IACvE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;YAKD,YAAY;IAQ1B;;;;;;;;;OASG;YACW,aAAa;IAW3B,+EAA+E;YACjE,mBAAmB;YAqBnB,eAAe;YAUf,gBAAgB;IAoE9B,OAAO,CAAC,WAAW;IAcnB;;;;;;;;;OASG;YACW,qBAAqB;YAmBrB,YAAY;YAmCZ,gBAAgB;YAwHhB,OAAO;IA+GrB,4EAA4E;IAC5E,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,aAAa;YAcP,cAAc;IA2B5B,OAAO,CAAC,oBAAoB;CAS7B"}