@substrat-run/engine-protocol 0.1.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 ADDED
@@ -0,0 +1,60 @@
1
+ # @substrat-run/engine-protocol
2
+
3
+ Protocol engine for [Substrat](https://github.com/substrat-run/substrat) —
4
+ checklists/protocols (egenkontroll, condition reports, inspection records) with the
5
+ **sign → immutable** invariant: versioned templates, append-only responses, a
6
+ verifiable content hash, and counter-signatures on frozen content.
7
+
8
+ The engine owns only the invariants. Template *content* — which protocols exist and
9
+ what they contain — is 100% vertical-owned, and an instance binds to any `EntityRef`
10
+ (a work order today, anything tomorrow).
11
+
12
+ ## Invariants the engine owns
13
+
14
+ 1. **Sign freezes** — any write to a signed instance's responses fails.
15
+ 2. **Content hash** — SHA-256 over template content + latest responses at sign time,
16
+ verifiable against replayed state.
17
+ 3. **Counter-sign** — an *additional* signature on the same frozen content (the hash
18
+ is recomputed and must match; a principal never counter-signs their own signature).
19
+ Exactly one primary signature per instance.
20
+ 4. **Append-only responses** — an edit is a new row; history is audit material.
21
+ 5. **Version-pinned templates** — templates version immutably; an instance pins
22
+ `(key, version)` at instantiation forever.
23
+ 6. **Void, not delete** — a protocol is superseded, never mutated or removed.
24
+
25
+ ## Composing from a vertical
26
+
27
+ Operations (`protocol/define-template`, `instantiate`, `fill`, `sign`, `countersign`,
28
+ `void`, `get`, `list-for-entity`) are default bindings over exported in-scope
29
+ functions your own operations can call — same transaction, your permission check:
30
+
31
+ ```ts
32
+ import { instantiateProtocol, requireSigned, PROTOCOL_PERM } from '@substrat-run/engine-protocol';
33
+
34
+ host.defineOperation('acme/start-inspection', async (ctx, input) => {
35
+ assertAllowed(await ctx.check(PROTOCOL_PERM.create));
36
+ return instantiateProtocol(ctx, {
37
+ templateKey: 'condition-report',
38
+ entity: input.bike, // any EntityRef — the vertical owns the vocabulary
39
+ });
40
+ });
41
+ ```
42
+
43
+ `requireSigned(ctx, entity, templateKey)` is the completion-guard building block: a
44
+ vertical can refuse to close its own entity until the protocol on it is signed.
45
+
46
+ Signing records the authenticated principal with an `in-app` method; connector-backed
47
+ methods (BankID/Scrive-class) arrive later through the same operation shape with
48
+ upgraded evidence. Signed/countersigned events carry the frozen answers in the
49
+ payload — consumers never query back.
50
+
51
+ ## Related packages
52
+
53
+ - [`@substrat-run/kernel`](https://npmjs.com/package/@substrat-run/kernel) — the
54
+ scope-host contract these operations run on
55
+ - [`@substrat-run/contracts`](https://npmjs.com/package/@substrat-run/contracts) — the
56
+ Zod shapes (`EntityRef`, permission keys) this engine builds on
57
+
58
+ ## Status
59
+
60
+ Pre-release (0.x): surfaces change without notice until the first vertical ships.
@@ -0,0 +1,400 @@
1
+ import { z } from 'zod';
2
+ import { type EntityRef } from '@substrat-run/contracts';
3
+ import { type ModuleRegistration, type OperationContext } from '@substrat-run/kernel';
4
+ export declare const PROTOCOL_PERM: {
5
+ create: string & z.BRAND<"PermissionKey">;
6
+ fill: string & z.BRAND<"PermissionKey">;
7
+ sign: string & z.BRAND<"PermissionKey">;
8
+ countersign: string & z.BRAND<"PermissionKey">;
9
+ read: string & z.BRAND<"PermissionKey">;
10
+ void: string & z.BRAND<"PermissionKey">;
11
+ };
12
+ export declare const protocolManifest: {
13
+ id: string & z.BRAND<"ModuleId">;
14
+ permissions: {
15
+ key: string & z.BRAND<"PermissionKey">;
16
+ description: string;
17
+ }[];
18
+ version: string;
19
+ kernelContract: string;
20
+ events: {
21
+ emits: {
22
+ type: string;
23
+ schemaVersion: number;
24
+ }[];
25
+ consumes: {
26
+ type: string;
27
+ schemaVersion: number;
28
+ }[];
29
+ };
30
+ migrations: {
31
+ journalDir: string;
32
+ compatibleFrom: string;
33
+ };
34
+ attachmentTargets: {
35
+ entityType: string;
36
+ readPermission: string & z.BRAND<"PermissionKey">;
37
+ }[];
38
+ entitlementKey: string;
39
+ entityRelations?: {
40
+ entityType: string;
41
+ parentType: string;
42
+ }[] | undefined;
43
+ api?: string | undefined;
44
+ searchables?: {
45
+ entityType: string;
46
+ fields: string[];
47
+ }[] | undefined;
48
+ ui?: {
49
+ routes?: {
50
+ path: string;
51
+ permission: string & z.BRAND<"PermissionKey">;
52
+ screen: string;
53
+ }[] | undefined;
54
+ nav?: {
55
+ permission: string & z.BRAND<"PermissionKey">;
56
+ label: string;
57
+ to: string;
58
+ icon?: string | undefined;
59
+ }[] | undefined;
60
+ entityViews?: {
61
+ entityType: string;
62
+ view: string;
63
+ }[] | undefined;
64
+ widgets?: {
65
+ permission: string & z.BRAND<"PermissionKey">;
66
+ slot: string;
67
+ component: string;
68
+ }[] | undefined;
69
+ settingsPanels?: {
70
+ permission: string & z.BRAND<"PermissionKey">;
71
+ label: string;
72
+ component: string;
73
+ }[] | undefined;
74
+ } | undefined;
75
+ };
76
+ export declare const protocolMigrations: {
77
+ version: string;
78
+ sql: string;
79
+ }[];
80
+ export declare const protocolItem: z.ZodObject<{
81
+ key: z.ZodString;
82
+ label: z.ZodString;
83
+ type: z.ZodEnum<["check", "value", "text"]>;
84
+ unit: z.ZodOptional<z.ZodString>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ key: string;
87
+ label: string;
88
+ type: "value" | "check" | "text";
89
+ unit?: string | undefined;
90
+ }, {
91
+ key: string;
92
+ label: string;
93
+ type: "value" | "check" | "text";
94
+ unit?: string | undefined;
95
+ }>;
96
+ export type ProtocolItem = z.infer<typeof protocolItem>;
97
+ export declare const protocolTemplateContent: z.ZodObject<{
98
+ sections: z.ZodArray<z.ZodObject<{
99
+ title: z.ZodString;
100
+ items: z.ZodArray<z.ZodObject<{
101
+ key: z.ZodString;
102
+ label: z.ZodString;
103
+ type: z.ZodEnum<["check", "value", "text"]>;
104
+ unit: z.ZodOptional<z.ZodString>;
105
+ }, "strip", z.ZodTypeAny, {
106
+ key: string;
107
+ label: string;
108
+ type: "value" | "check" | "text";
109
+ unit?: string | undefined;
110
+ }, {
111
+ key: string;
112
+ label: string;
113
+ type: "value" | "check" | "text";
114
+ unit?: string | undefined;
115
+ }>, "many">;
116
+ }, "strip", z.ZodTypeAny, {
117
+ title: string;
118
+ items: {
119
+ key: string;
120
+ label: string;
121
+ type: "value" | "check" | "text";
122
+ unit?: string | undefined;
123
+ }[];
124
+ }, {
125
+ title: string;
126
+ items: {
127
+ key: string;
128
+ label: string;
129
+ type: "value" | "check" | "text";
130
+ unit?: string | undefined;
131
+ }[];
132
+ }>, "many">;
133
+ }, "strip", z.ZodTypeAny, {
134
+ sections: {
135
+ title: string;
136
+ items: {
137
+ key: string;
138
+ label: string;
139
+ type: "value" | "check" | "text";
140
+ unit?: string | undefined;
141
+ }[];
142
+ }[];
143
+ }, {
144
+ sections: {
145
+ title: string;
146
+ items: {
147
+ key: string;
148
+ label: string;
149
+ type: "value" | "check" | "text";
150
+ unit?: string | undefined;
151
+ }[];
152
+ }[];
153
+ }>;
154
+ export type ProtocolTemplateContent = z.infer<typeof protocolTemplateContent>;
155
+ export interface ProtocolTemplateRow {
156
+ id: string;
157
+ key: string;
158
+ version: number;
159
+ title: string;
160
+ content_json: string;
161
+ created_at: string;
162
+ }
163
+ export interface ProtocolInstanceRow {
164
+ id: string;
165
+ template_key: string;
166
+ template_version: number;
167
+ entity_type: string;
168
+ entity_id: string;
169
+ status: 'open' | 'signed' | 'voided';
170
+ created_by: string;
171
+ created_at: string;
172
+ voided_by: string | null;
173
+ voided_reason: string | null;
174
+ voided_at: string | null;
175
+ }
176
+ export interface ProtocolResponseRow {
177
+ id: string;
178
+ instance_id: string;
179
+ item_key: string;
180
+ value_json: string;
181
+ note: string | null;
182
+ responded_by: string;
183
+ responded_at: string;
184
+ }
185
+ export interface ProtocolSignatureRow {
186
+ id: string;
187
+ instance_id: string;
188
+ signed_by: string;
189
+ kind: 'primary' | 'counter';
190
+ method: string;
191
+ content_hash: string;
192
+ evidence_ref: string | null;
193
+ signed_at: string;
194
+ }
195
+ export declare function protocolContentHash(template: Pick<ProtocolTemplateRow, 'key' | 'version' | 'content_json'>, latest: Record<string, ProtocolResponseRow>): Promise<string>;
196
+ export declare function requireSigned(ctx: OperationContext, entity: EntityRef, templateKey: string): void;
197
+ export declare const defineTemplateInput: z.ZodObject<{
198
+ key: z.ZodString;
199
+ title: z.ZodString;
200
+ content: z.ZodObject<{
201
+ sections: z.ZodArray<z.ZodObject<{
202
+ title: z.ZodString;
203
+ items: z.ZodArray<z.ZodObject<{
204
+ key: z.ZodString;
205
+ label: z.ZodString;
206
+ type: z.ZodEnum<["check", "value", "text"]>;
207
+ unit: z.ZodOptional<z.ZodString>;
208
+ }, "strip", z.ZodTypeAny, {
209
+ key: string;
210
+ label: string;
211
+ type: "value" | "check" | "text";
212
+ unit?: string | undefined;
213
+ }, {
214
+ key: string;
215
+ label: string;
216
+ type: "value" | "check" | "text";
217
+ unit?: string | undefined;
218
+ }>, "many">;
219
+ }, "strip", z.ZodTypeAny, {
220
+ title: string;
221
+ items: {
222
+ key: string;
223
+ label: string;
224
+ type: "value" | "check" | "text";
225
+ unit?: string | undefined;
226
+ }[];
227
+ }, {
228
+ title: string;
229
+ items: {
230
+ key: string;
231
+ label: string;
232
+ type: "value" | "check" | "text";
233
+ unit?: string | undefined;
234
+ }[];
235
+ }>, "many">;
236
+ }, "strip", z.ZodTypeAny, {
237
+ sections: {
238
+ title: string;
239
+ items: {
240
+ key: string;
241
+ label: string;
242
+ type: "value" | "check" | "text";
243
+ unit?: string | undefined;
244
+ }[];
245
+ }[];
246
+ }, {
247
+ sections: {
248
+ title: string;
249
+ items: {
250
+ key: string;
251
+ label: string;
252
+ type: "value" | "check" | "text";
253
+ unit?: string | undefined;
254
+ }[];
255
+ }[];
256
+ }>;
257
+ }, "strip", z.ZodTypeAny, {
258
+ key: string;
259
+ title: string;
260
+ content: {
261
+ sections: {
262
+ title: string;
263
+ items: {
264
+ key: string;
265
+ label: string;
266
+ type: "value" | "check" | "text";
267
+ unit?: string | undefined;
268
+ }[];
269
+ }[];
270
+ };
271
+ }, {
272
+ key: string;
273
+ title: string;
274
+ content: {
275
+ sections: {
276
+ title: string;
277
+ items: {
278
+ key: string;
279
+ label: string;
280
+ type: "value" | "check" | "text";
281
+ unit?: string | undefined;
282
+ }[];
283
+ }[];
284
+ };
285
+ }>;
286
+ export type DefineTemplateInput = z.infer<typeof defineTemplateInput>;
287
+ /**
288
+ * Templates version immutably: same key + new content = next version, the
289
+ * old row is never touched. Editing a template never rewrites what a signed
290
+ * document referred to.
291
+ */
292
+ export declare function defineTemplate(ctx: OperationContext, rawInput: DefineTemplateInput): ProtocolTemplateRow;
293
+ /** Latest version per key — the instantiation picker's list. */
294
+ export declare function listTemplates(ctx: OperationContext): ProtocolTemplateRow[];
295
+ export declare const instantiateProtocolInput: z.ZodObject<{
296
+ templateKey: z.ZodString;
297
+ entity: z.ZodObject<{
298
+ entityType: z.ZodString;
299
+ entityId: z.ZodString;
300
+ }, "strip", z.ZodTypeAny, {
301
+ entityType: string;
302
+ entityId: string;
303
+ }, {
304
+ entityType: string;
305
+ entityId: string;
306
+ }>;
307
+ }, "strip", z.ZodTypeAny, {
308
+ templateKey: string;
309
+ entity: {
310
+ entityType: string;
311
+ entityId: string;
312
+ };
313
+ }, {
314
+ templateKey: string;
315
+ entity: {
316
+ entityType: string;
317
+ entityId: string;
318
+ };
319
+ }>;
320
+ export type InstantiateProtocolInput = z.infer<typeof instantiateProtocolInput>;
321
+ /**
322
+ * Pins the latest template version at instantiation — forever (invariant 5).
323
+ * One OPEN instance per (template, entity). Which entity types may carry
324
+ * which protocols, and when, is vertical policy — enforced by the caller.
325
+ */
326
+ export declare function instantiateProtocol(ctx: OperationContext, rawInput: InstantiateProtocolInput): ProtocolInstanceRow;
327
+ export declare const fillProtocolInput: z.ZodObject<{
328
+ instanceId: z.ZodString;
329
+ itemKey: z.ZodString;
330
+ value: z.ZodUnion<[z.ZodBoolean, z.ZodString]>;
331
+ note: z.ZodOptional<z.ZodString>;
332
+ }, "strip", z.ZodTypeAny, {
333
+ value: string | boolean;
334
+ instanceId: string;
335
+ itemKey: string;
336
+ note?: string | undefined;
337
+ }, {
338
+ value: string | boolean;
339
+ instanceId: string;
340
+ itemKey: string;
341
+ note?: string | undefined;
342
+ }>;
343
+ export type FillProtocolInput = z.infer<typeof fillProtocolInput>;
344
+ export declare function fillProtocol(ctx: OperationContext, rawInput: FillProtocolInput): ProtocolResponseRow;
345
+ export interface SignResult {
346
+ instance: ProtocolInstanceRow;
347
+ signature: ProtocolSignatureRow;
348
+ }
349
+ /**
350
+ * In-app sign (engine-protocol.md §5): the authenticated principal signs;
351
+ * integrity comes from the hash + immutability + the spine event. Connector
352
+ * methods (bankid/scrive) arrive later through the SAME operation shape with
353
+ * upgraded evidence. Exactly ONE primary signature per instance — enforced by
354
+ * the open → signed transition.
355
+ */
356
+ export declare function signProtocol(ctx: OperationContext, input: {
357
+ instanceId: string;
358
+ }): Promise<SignResult>;
359
+ /**
360
+ * Counter-sign (invariant 3): a SECOND signature on the SAME frozen content —
361
+ * the customer at pickup. Requires a signed instance; the content hash is
362
+ * recomputed and must equal the primary signature's hash (frozen content,
363
+ * verified, never assumed). One counter-signature per principal; a principal
364
+ * never counter-signs what they primary-signed.
365
+ */
366
+ export declare function countersignProtocol(ctx: OperationContext, input: {
367
+ instanceId: string;
368
+ }): Promise<SignResult>;
369
+ /** Voiding, not deleting: a superseded protocol keeps its rows forever. */
370
+ export declare function voidProtocol(ctx: OperationContext, input: {
371
+ instanceId: string;
372
+ reason: string;
373
+ }): ProtocolInstanceRow;
374
+ export interface ProtocolDetail {
375
+ instance: ProtocolInstanceRow;
376
+ template: {
377
+ key: string;
378
+ version: number;
379
+ title: string;
380
+ content: ProtocolTemplateContent;
381
+ };
382
+ responses: ProtocolResponseRow[];
383
+ latest: Record<string, ProtocolResponseRow>;
384
+ signature: ProtocolSignatureRow | null;
385
+ signatures: ProtocolSignatureRow[];
386
+ }
387
+ export declare function getProtocol(ctx: OperationContext, instanceId: string): ProtocolDetail;
388
+ export interface ProtocolSummary {
389
+ instance: ProtocolInstanceRow;
390
+ title: string;
391
+ answered: number;
392
+ total: number;
393
+ signedBy: string | null;
394
+ signedAt: string | null;
395
+ countersignedBy: string | null;
396
+ countersignedAt: string | null;
397
+ }
398
+ export declare function listProtocolsForEntity(ctx: OperationContext, entity: EntityRef): ProtocolSummary[];
399
+ export declare const protocolModule: ModuleRegistration;
400
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}