@knpkv/herdr-work 0.2.0 → 0.3.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 CHANGED
@@ -4,4 +4,12 @@ Durable fleet work checkpoints and the Rly departure-board projection used by th
4
4
 
5
5
  Each `WorkGoalCheckpoint` stores a complete, Schema-decoded goal state at its exact durable timestamp. `projectWorkSnapshots` selects the latest recorded checkpoint at now, 24 hours, 7 days, and 30 days. A goal does not appear before its creation checkpoint, and missing history is never synthesized.
6
6
 
7
- `WorkStore` persists events in SQLite. Recording the exact same checkpoint again is an idempotent replay; reusing an event ID or goal timestamp with changed content returns `WorkCheckpointConflictError`. `makeWorkService` is the small runtime interface for recording checkpoints and reading all four snapshots. `WorkBoard` renders the projection and links only through the persisted `AgentConnectTarget`.
7
+ `WorkStore` persists events in SQLite. Recording the exact same checkpoint again is an idempotent replay; reusing an event ID or goal timestamp with changed content returns `WorkCheckpointConflictError`. `makeWorkService` is the small runtime interface for recording checkpoints and reading all four snapshots.
8
+
9
+ `WorkBoard` renders these persisted outbound-link forms:
10
+
11
+ - `AgentConnectTarget.url` — local terminal handoff.
12
+ - `WorkApprovalTarget` — approval deep link with its host and job identity. The approvals ingestion boundary resolves the configured destination and verifies the URL origin before persistence; the root path and identity query remain required.
13
+ - `WorkReview.url` — review destination.
14
+
15
+ Every URL uses the credential-free HTTP(S) `LinkUrl` boundary. Provider credentials and private locators never enter these persisted or browser-visible links.
package/dist/model.d.ts CHANGED
@@ -31,6 +31,68 @@ export declare const WorkBlocker: Schema.Struct<{
31
31
  }>;
32
32
  export interface WorkBlocker extends Schema.Schema.Type<typeof WorkBlocker> {
33
33
  }
34
+ export declare const WorkAgentHierarchy: Schema.Struct<{
35
+ readonly agent: Schema.Struct<{
36
+ readonly host: Schema.String;
37
+ readonly agentId: Schema.String;
38
+ readonly name: Schema.String;
39
+ readonly paneId: Schema.String;
40
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
41
+ readonly parentAgentId: Schema.String;
42
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
43
+ }>>;
44
+ }>;
45
+ }>;
46
+ export interface WorkAgentHierarchy extends Schema.Schema.Type<typeof WorkAgentHierarchy> {
47
+ }
48
+ export declare const WorkActivityKind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
49
+ export type WorkActivityKind = typeof WorkActivityKind.Type;
50
+ export declare const WorkActivity: Schema.Struct<{
51
+ readonly id: Schema.String;
52
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
53
+ readonly summary: Schema.String;
54
+ readonly occurredAt: Schema.Number;
55
+ }>;
56
+ export interface WorkActivity extends Schema.Schema.Type<typeof WorkActivity> {
57
+ }
58
+ export declare const WorkApprovalTarget: Schema.Struct<{
59
+ readonly host: Schema.String;
60
+ readonly jobId: Schema.String;
61
+ readonly url: Schema.String;
62
+ }>;
63
+ export interface WorkApprovalTarget extends Schema.Schema.Type<typeof WorkApprovalTarget> {
64
+ }
65
+ /**
66
+ * Checks a decoded approval target against the origin resolved by the
67
+ * configuration-aware approvals boundary before the target is persisted.
68
+ */
69
+ export declare const approvalTargetMatchesOrigin: (target: WorkApprovalTarget, authoritativeOrigin: string) => boolean;
70
+ export declare const WorkRequestState: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
71
+ export type WorkRequestState = typeof WorkRequestState.Type;
72
+ export declare const WorkRequest: Schema.Struct<{
73
+ readonly id: Schema.String;
74
+ readonly summary: Schema.String;
75
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
76
+ readonly requestedAt: Schema.Number;
77
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
78
+ readonly host: Schema.String;
79
+ readonly jobId: Schema.String;
80
+ readonly url: Schema.String;
81
+ }>>;
82
+ }>;
83
+ export interface WorkRequest extends Schema.Schema.Type<typeof WorkRequest> {
84
+ }
85
+ export declare const WorkReviewState: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
86
+ export type WorkReviewState = typeof WorkReviewState.Type;
87
+ /** Review status plus the persisted credential-free destination, when known. */
88
+ export declare const WorkReview: Schema.Struct<{
89
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
90
+ readonly summary: Schema.NullOr<Schema.String>;
91
+ readonly updatedAt: Schema.Number;
92
+ readonly url: Schema.NullOr<Schema.String>;
93
+ }>;
94
+ export interface WorkReview extends Schema.Schema.Type<typeof WorkReview> {
95
+ }
34
96
  export declare const WorkGoal: Schema.Struct<{
35
97
  readonly id: Schema.String;
36
98
  readonly title: Schema.String;
@@ -59,6 +121,50 @@ export declare const WorkGoal: Schema.Struct<{
59
121
  readonly agentId: Schema.String;
60
122
  readonly url: Schema.String;
61
123
  }>>;
124
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
125
+ readonly agent: Schema.Struct<{
126
+ readonly host: Schema.String;
127
+ readonly agentId: Schema.String;
128
+ readonly name: Schema.String;
129
+ readonly paneId: Schema.String;
130
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
131
+ readonly parentAgentId: Schema.String;
132
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
133
+ }>>;
134
+ }>;
135
+ }>>>;
136
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
137
+ readonly id: Schema.String;
138
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
139
+ readonly summary: Schema.String;
140
+ readonly occurredAt: Schema.Number;
141
+ }>>>;
142
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
143
+ readonly summary: Schema.String;
144
+ readonly since: Schema.Number;
145
+ }>>>;
146
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
147
+ readonly id: Schema.String;
148
+ readonly summary: Schema.String;
149
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
150
+ readonly requestedAt: Schema.Number;
151
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
152
+ readonly host: Schema.String;
153
+ readonly jobId: Schema.String;
154
+ readonly url: Schema.String;
155
+ }>>;
156
+ }>>>;
157
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
158
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
159
+ readonly summary: Schema.NullOr<Schema.String>;
160
+ readonly updatedAt: Schema.Number;
161
+ readonly url: Schema.NullOr<Schema.String>;
162
+ }>>>;
163
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
164
+ readonly host: Schema.String;
165
+ readonly jobId: Schema.String;
166
+ readonly url: Schema.String;
167
+ }>>>;
62
168
  readonly createdAt: Schema.Number;
63
169
  readonly updatedAt: Schema.Number;
64
170
  }>;
@@ -96,6 +202,50 @@ export declare const WorkGoalCheckpoint: Schema.Struct<{
96
202
  readonly agentId: Schema.String;
97
203
  readonly url: Schema.String;
98
204
  }>>;
205
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
206
+ readonly agent: Schema.Struct<{
207
+ readonly host: Schema.String;
208
+ readonly agentId: Schema.String;
209
+ readonly name: Schema.String;
210
+ readonly paneId: Schema.String;
211
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
212
+ readonly parentAgentId: Schema.String;
213
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
214
+ }>>;
215
+ }>;
216
+ }>>>;
217
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
218
+ readonly id: Schema.String;
219
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
220
+ readonly summary: Schema.String;
221
+ readonly occurredAt: Schema.Number;
222
+ }>>>;
223
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
224
+ readonly summary: Schema.String;
225
+ readonly since: Schema.Number;
226
+ }>>>;
227
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
228
+ readonly id: Schema.String;
229
+ readonly summary: Schema.String;
230
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
231
+ readonly requestedAt: Schema.Number;
232
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
233
+ readonly host: Schema.String;
234
+ readonly jobId: Schema.String;
235
+ readonly url: Schema.String;
236
+ }>>;
237
+ }>>>;
238
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
239
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
240
+ readonly summary: Schema.NullOr<Schema.String>;
241
+ readonly updatedAt: Schema.Number;
242
+ readonly url: Schema.NullOr<Schema.String>;
243
+ }>>>;
244
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
245
+ readonly host: Schema.String;
246
+ readonly jobId: Schema.String;
247
+ readonly url: Schema.String;
248
+ }>>>;
99
249
  readonly createdAt: Schema.Number;
100
250
  readonly updatedAt: Schema.Number;
101
251
  }>;
@@ -136,6 +286,50 @@ export declare const WorkSnapshot: Schema.Struct<{
136
286
  readonly agentId: Schema.String;
137
287
  readonly url: Schema.String;
138
288
  }>>;
289
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
290
+ readonly agent: Schema.Struct<{
291
+ readonly host: Schema.String;
292
+ readonly agentId: Schema.String;
293
+ readonly name: Schema.String;
294
+ readonly paneId: Schema.String;
295
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
296
+ readonly parentAgentId: Schema.String;
297
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
298
+ }>>;
299
+ }>;
300
+ }>>>;
301
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
302
+ readonly id: Schema.String;
303
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
304
+ readonly summary: Schema.String;
305
+ readonly occurredAt: Schema.Number;
306
+ }>>>;
307
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
308
+ readonly summary: Schema.String;
309
+ readonly since: Schema.Number;
310
+ }>>>;
311
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
312
+ readonly id: Schema.String;
313
+ readonly summary: Schema.String;
314
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
315
+ readonly requestedAt: Schema.Number;
316
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
317
+ readonly host: Schema.String;
318
+ readonly jobId: Schema.String;
319
+ readonly url: Schema.String;
320
+ }>>;
321
+ }>>>;
322
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
323
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
324
+ readonly summary: Schema.NullOr<Schema.String>;
325
+ readonly updatedAt: Schema.Number;
326
+ readonly url: Schema.NullOr<Schema.String>;
327
+ }>>>;
328
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
329
+ readonly host: Schema.String;
330
+ readonly jobId: Schema.String;
331
+ readonly url: Schema.String;
332
+ }>>>;
139
333
  readonly createdAt: Schema.Number;
140
334
  readonly updatedAt: Schema.Number;
141
335
  }>>;
@@ -176,6 +370,50 @@ export declare const WorkSnapshots: Schema.Struct<{
176
370
  readonly agentId: Schema.String;
177
371
  readonly url: Schema.String;
178
372
  }>>;
373
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
374
+ readonly agent: Schema.Struct<{
375
+ readonly host: Schema.String;
376
+ readonly agentId: Schema.String;
377
+ readonly name: Schema.String;
378
+ readonly paneId: Schema.String;
379
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
380
+ readonly parentAgentId: Schema.String;
381
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
382
+ }>>;
383
+ }>;
384
+ }>>>;
385
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
386
+ readonly id: Schema.String;
387
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
388
+ readonly summary: Schema.String;
389
+ readonly occurredAt: Schema.Number;
390
+ }>>>;
391
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
392
+ readonly summary: Schema.String;
393
+ readonly since: Schema.Number;
394
+ }>>>;
395
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
396
+ readonly id: Schema.String;
397
+ readonly summary: Schema.String;
398
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
399
+ readonly requestedAt: Schema.Number;
400
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
401
+ readonly host: Schema.String;
402
+ readonly jobId: Schema.String;
403
+ readonly url: Schema.String;
404
+ }>>;
405
+ }>>>;
406
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
407
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
408
+ readonly summary: Schema.NullOr<Schema.String>;
409
+ readonly updatedAt: Schema.Number;
410
+ readonly url: Schema.NullOr<Schema.String>;
411
+ }>>>;
412
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
413
+ readonly host: Schema.String;
414
+ readonly jobId: Schema.String;
415
+ readonly url: Schema.String;
416
+ }>>>;
179
417
  readonly createdAt: Schema.Number;
180
418
  readonly updatedAt: Schema.Number;
181
419
  }>>;
@@ -212,6 +450,50 @@ export declare const WorkSnapshots: Schema.Struct<{
212
450
  readonly agentId: Schema.String;
213
451
  readonly url: Schema.String;
214
452
  }>>;
453
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
454
+ readonly agent: Schema.Struct<{
455
+ readonly host: Schema.String;
456
+ readonly agentId: Schema.String;
457
+ readonly name: Schema.String;
458
+ readonly paneId: Schema.String;
459
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
460
+ readonly parentAgentId: Schema.String;
461
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
462
+ }>>;
463
+ }>;
464
+ }>>>;
465
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
466
+ readonly id: Schema.String;
467
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
468
+ readonly summary: Schema.String;
469
+ readonly occurredAt: Schema.Number;
470
+ }>>>;
471
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
472
+ readonly summary: Schema.String;
473
+ readonly since: Schema.Number;
474
+ }>>>;
475
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
476
+ readonly id: Schema.String;
477
+ readonly summary: Schema.String;
478
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
479
+ readonly requestedAt: Schema.Number;
480
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
481
+ readonly host: Schema.String;
482
+ readonly jobId: Schema.String;
483
+ readonly url: Schema.String;
484
+ }>>;
485
+ }>>>;
486
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
487
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
488
+ readonly summary: Schema.NullOr<Schema.String>;
489
+ readonly updatedAt: Schema.Number;
490
+ readonly url: Schema.NullOr<Schema.String>;
491
+ }>>>;
492
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
493
+ readonly host: Schema.String;
494
+ readonly jobId: Schema.String;
495
+ readonly url: Schema.String;
496
+ }>>>;
215
497
  readonly createdAt: Schema.Number;
216
498
  readonly updatedAt: Schema.Number;
217
499
  }>>;
@@ -248,6 +530,50 @@ export declare const WorkSnapshots: Schema.Struct<{
248
530
  readonly agentId: Schema.String;
249
531
  readonly url: Schema.String;
250
532
  }>>;
533
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
534
+ readonly agent: Schema.Struct<{
535
+ readonly host: Schema.String;
536
+ readonly agentId: Schema.String;
537
+ readonly name: Schema.String;
538
+ readonly paneId: Schema.String;
539
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
540
+ readonly parentAgentId: Schema.String;
541
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
542
+ }>>;
543
+ }>;
544
+ }>>>;
545
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
546
+ readonly id: Schema.String;
547
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
548
+ readonly summary: Schema.String;
549
+ readonly occurredAt: Schema.Number;
550
+ }>>>;
551
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
552
+ readonly summary: Schema.String;
553
+ readonly since: Schema.Number;
554
+ }>>>;
555
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
556
+ readonly id: Schema.String;
557
+ readonly summary: Schema.String;
558
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
559
+ readonly requestedAt: Schema.Number;
560
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
561
+ readonly host: Schema.String;
562
+ readonly jobId: Schema.String;
563
+ readonly url: Schema.String;
564
+ }>>;
565
+ }>>>;
566
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
567
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
568
+ readonly summary: Schema.NullOr<Schema.String>;
569
+ readonly updatedAt: Schema.Number;
570
+ readonly url: Schema.NullOr<Schema.String>;
571
+ }>>>;
572
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
573
+ readonly host: Schema.String;
574
+ readonly jobId: Schema.String;
575
+ readonly url: Schema.String;
576
+ }>>>;
251
577
  readonly createdAt: Schema.Number;
252
578
  readonly updatedAt: Schema.Number;
253
579
  }>>;
@@ -284,6 +610,50 @@ export declare const WorkSnapshots: Schema.Struct<{
284
610
  readonly agentId: Schema.String;
285
611
  readonly url: Schema.String;
286
612
  }>>;
613
+ readonly agentHierarchy: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
614
+ readonly agent: Schema.Struct<{
615
+ readonly host: Schema.String;
616
+ readonly agentId: Schema.String;
617
+ readonly name: Schema.String;
618
+ readonly paneId: Schema.String;
619
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
620
+ readonly parentAgentId: Schema.String;
621
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
622
+ }>>;
623
+ }>;
624
+ }>>>;
625
+ readonly activity: Schema.optionalKey<Schema.$Array<Schema.Struct<{
626
+ readonly id: Schema.String;
627
+ readonly kind: Schema.Literals<readonly ["note", "status", "blocker", "request", "review", "shipment"]>;
628
+ readonly summary: Schema.String;
629
+ readonly occurredAt: Schema.Number;
630
+ }>>>;
631
+ readonly blockers: Schema.optionalKey<Schema.$Array<Schema.Struct<{
632
+ readonly summary: Schema.String;
633
+ readonly since: Schema.Number;
634
+ }>>>;
635
+ readonly requests: Schema.optionalKey<Schema.$Array<Schema.Struct<{
636
+ readonly id: Schema.String;
637
+ readonly summary: Schema.String;
638
+ readonly state: Schema.Literals<readonly ["open", "approved", "rejected", "fulfilled"]>;
639
+ readonly requestedAt: Schema.Number;
640
+ readonly approvalTarget: Schema.NullOr<Schema.Struct<{
641
+ readonly host: Schema.String;
642
+ readonly jobId: Schema.String;
643
+ readonly url: Schema.String;
644
+ }>>;
645
+ }>>>;
646
+ readonly review: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
647
+ readonly state: Schema.Literals<readonly ["not_requested", "requested", "changes_requested", "approved"]>;
648
+ readonly summary: Schema.NullOr<Schema.String>;
649
+ readonly updatedAt: Schema.Number;
650
+ readonly url: Schema.NullOr<Schema.String>;
651
+ }>>>;
652
+ readonly approvalTarget: Schema.optionalKey<Schema.NullOr<Schema.Struct<{
653
+ readonly host: Schema.String;
654
+ readonly jobId: Schema.String;
655
+ readonly url: Schema.String;
656
+ }>>>;
287
657
  readonly createdAt: Schema.Number;
288
658
  readonly updatedAt: Schema.Number;
289
659
  }>>;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAS/B,eAAO,MAAM,oBAAoB,QAAS,CAAA;AAC1C,eAAO,MAAM,oBAAoB,OAAQ,CAAA;AAEzC,eAAO,MAAM,UAAU,eAAa,CAAA;AACpC,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,eAAO,MAAM,SAAS,gGAAwF,CAAA;AAC9G,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAE7C,eAAO,MAAM,aAAa,qFAA6E,CAAA;AACvG,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD,eAAO,MAAM,SAAS;;;EAAgD,CAAA;AACtE,MAAM,WAAW,SAAU,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC;CAAG;AAE1E,eAAO,MAAM,cAAc;;;EAGzB,CAAA;AACF,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,cAAc,CAAC;CAAG;AAEpF,eAAO,MAAM,SAAS;;;EAGpB,CAAA;AACF,MAAM,WAAW,SAAU,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC;CAAG;AAE1E,eAAO,MAAM,WAAW;;;EAGtB,CAAA;AACF,MAAM,WAAW,WAAY,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC;CAAG;AAE9E,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBpB,CAAA;AACD,MAAM,WAAW,QAAS,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC;CAAG;AAExE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAA;AACD,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,kBAAkB,CAAC;CAAG;AAE5F,eAAO,MAAM,kBAAkB,2DAAmD,CAAA;AAClF,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,IAAI,CAAA;AAE/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvB,CAAA;AACF,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC;CAAG;AAEhF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMxB,CAAA;AACF,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC;CAAG"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js CHANGED
@@ -1,8 +1,23 @@
1
- import { AgentConnectTarget } from "@knpkv/herdr-fleet/model";
1
+ import { AgentConnectTarget, AgentWorkerIdentity } from "@knpkv/herdr-fleet/model";
2
2
  import { Schema } from "effect";
3
3
  const Identifier = Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(256));
4
+ // Approval hosts are bounded identifiers, not DNS names; the approvals app also
5
+ // accepts labels such as "PI 5".
6
+ const ApprovalHostName = Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(256));
4
7
  const Text = Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(4_096), Schema.isPattern(/^[^\p{Cc}]+$/u));
5
8
  const Timestamp = Schema.Number.check(Schema.isInt(), Schema.isBetween({ minimum: 0, maximum: 8_640_000_000_000_000 }));
9
+ /**
10
+ * Credential-free HTTP(S) URL persisted for an outbound handoff. Provider
11
+ * credentials and private locators never belong in this representation.
12
+ */
13
+ const LinkUrl = Schema.String.check(Schema.isMaxLength(2_048), Schema.makeFilter((value) => {
14
+ if (!URL.canParse(value))
15
+ return false;
16
+ const url = new URL(value);
17
+ return (url.protocol === "http:" || url.protocol === "https:") &&
18
+ url.username === "" &&
19
+ url.password === "";
20
+ }, { expected: "an HTTP(S) URL without embedded credentials" }));
6
21
  export const workHistoryMaxEvents = 16_384;
7
22
  export const workSnapshotMaxGoals = 1_024;
8
23
  export const WorkGoalId = Identifier;
@@ -21,6 +36,63 @@ export const WorkBlocker = Schema.Struct({
21
36
  summary: Text,
22
37
  since: Timestamp
23
38
  });
39
+ export const WorkAgentHierarchy = Schema.Struct({
40
+ agent: AgentWorkerIdentity
41
+ });
42
+ export const WorkActivityKind = Schema.Literals([
43
+ "note",
44
+ "status",
45
+ "blocker",
46
+ "request",
47
+ "review",
48
+ "shipment"
49
+ ]);
50
+ export const WorkActivity = Schema.Struct({
51
+ id: Identifier,
52
+ kind: WorkActivityKind,
53
+ summary: Text,
54
+ occurredAt: Timestamp
55
+ });
56
+ export const WorkApprovalTarget = Schema.Struct({
57
+ host: ApprovalHostName,
58
+ jobId: Identifier,
59
+ url: LinkUrl
60
+ }).check(Schema.makeFilter(({ host, jobId, url }) => {
61
+ const parsed = new URL(url);
62
+ const queryKeys = [...parsed.searchParams.keys()];
63
+ const approvalHosts = parsed.searchParams.getAll("approvalHost");
64
+ const approvalJobs = parsed.searchParams.getAll("approvalJob");
65
+ return parsed.pathname === "/" &&
66
+ parsed.hash === "" &&
67
+ queryKeys.length === 3 &&
68
+ parsed.searchParams.getAll("tab").length === 1 &&
69
+ parsed.searchParams.get("tab") === "approvals" &&
70
+ approvalHosts.length === 1 &&
71
+ approvalJobs.length === 1 &&
72
+ approvalHosts[0]?.toLowerCase() === host.toLowerCase() &&
73
+ approvalJobs[0] === jobId;
74
+ }, { expected: "an approval URL with matching host and job identity" }));
75
+ /**
76
+ * Checks a decoded approval target against the origin resolved by the
77
+ * configuration-aware approvals boundary before the target is persisted.
78
+ */
79
+ export const approvalTargetMatchesOrigin = (target, authoritativeOrigin) => new URL(target.url).origin === authoritativeOrigin;
80
+ export const WorkRequestState = Schema.Literals(["open", "approved", "rejected", "fulfilled"]);
81
+ export const WorkRequest = Schema.Struct({
82
+ id: Identifier,
83
+ summary: Text,
84
+ state: WorkRequestState,
85
+ requestedAt: Timestamp,
86
+ approvalTarget: Schema.NullOr(WorkApprovalTarget)
87
+ });
88
+ export const WorkReviewState = Schema.Literals(["not_requested", "requested", "changes_requested", "approved"]);
89
+ /** Review status plus the persisted credential-free destination, when known. */
90
+ export const WorkReview = Schema.Struct({
91
+ state: WorkReviewState,
92
+ summary: Schema.NullOr(Text),
93
+ updatedAt: Timestamp,
94
+ url: Schema.NullOr(LinkUrl)
95
+ });
24
96
  export const WorkGoal = Schema.Struct({
25
97
  id: WorkGoalId,
26
98
  title: Text,
@@ -33,9 +105,38 @@ export const WorkGoal = Schema.Struct({
33
105
  delivery: DeliveryStage,
34
106
  blocker: Schema.NullOr(WorkBlocker),
35
107
  connectTarget: Schema.NullOr(AgentConnectTarget),
108
+ agentHierarchy: Schema.optionalKey(Schema.NullOr(WorkAgentHierarchy)),
109
+ activity: Schema.optionalKey(Schema.Array(WorkActivity)
110
+ .check(Schema.isMaxLength(128))
111
+ .check(Schema.makeFilter((activities) => new Set(activities.map(({ id }) => id)).size === activities.length, { expected: "unique activity ids" }))),
112
+ blockers: Schema.optionalKey(Schema.Array(WorkBlocker)
113
+ .check(Schema.isMaxLength(32))
114
+ .check(Schema.makeFilter((blockers) => new Set(blockers.map(({ since, summary }) => `${since}\u0000${summary}`)).size === blockers.length, { expected: "unique blocker records" }))),
115
+ requests: Schema.optionalKey(Schema.Array(WorkRequest)
116
+ .check(Schema.isMaxLength(32))
117
+ .check(Schema.makeFilter((requests) => new Set(requests.map(({ id }) => id)).size === requests.length, { expected: "unique request ids" }))),
118
+ review: Schema.optionalKey(Schema.NullOr(WorkReview)),
119
+ approvalTarget: Schema.optionalKey(Schema.NullOr(WorkApprovalTarget)),
36
120
  createdAt: Timestamp,
37
121
  updatedAt: Timestamp
38
- }).check(Schema.makeFilter((goal) => goal.updatedAt >= goal.createdAt && ((goal.state === "blocked") === (goal.blocker !== null)), { expected: "ordered goal timestamps and blocker present exactly for blocked state" }));
122
+ }).check(Schema.makeFilter((goal) => {
123
+ const hasBlocker = goal.blocker !== null ||
124
+ (goal.blockers !== undefined && goal.blockers.length > 0);
125
+ const agent = goal.agentHierarchy?.agent;
126
+ const isDetailTimestamp = (timestamp) => timestamp >= goal.createdAt && timestamp <= goal.updatedAt;
127
+ return goal.updatedAt >= goal.createdAt &&
128
+ ((goal.state === "blocked") === hasBlocker) &&
129
+ (goal.blockers === undefined || goal.blocker === null) &&
130
+ (goal.blocker === null || isDetailTimestamp(goal.blocker.since)) &&
131
+ (goal.blockers === undefined || goal.blockers.every(({ since }) => isDetailTimestamp(since))) &&
132
+ (goal.activity === undefined || goal.activity.every(({ occurredAt }) => isDetailTimestamp(occurredAt))) &&
133
+ (goal.requests === undefined || goal.requests.every(({ requestedAt }) => isDetailTimestamp(requestedAt))) &&
134
+ (goal.review === undefined || goal.review === null || isDetailTimestamp(goal.review.updatedAt)) &&
135
+ (agent === undefined || agent === null || ((agent.relationship === undefined || agent.relationship.parentAgentId !== agent.agentId) &&
136
+ goal.connectTarget !== null &&
137
+ goal.connectTarget.agentId === agent.agentId &&
138
+ goal.connectTarget.host.toLowerCase() === agent.host.toLowerCase()));
139
+ }, { expected: "ordered goal timestamps, blocker state, and non-cyclic authoritative agent target" }));
39
140
  export const WorkGoalCheckpoint = Schema.Struct({
40
141
  version: Schema.Literal("herdr.work.event.v1"),
41
142
  eventId: Identifier,
package/dist/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}