@camstack/types 1.2.43 → 1.2.45

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 (38) hide show
  1. package/dist/addon.js +8 -2
  2. package/dist/addon.mjs +8 -2
  3. package/dist/capabilities/index.d.ts +21 -3
  4. package/dist/capabilities/osd-manager.cap.d.ts +900 -0
  5. package/dist/capabilities/pipeline-analytics.cap.d.ts +1192 -74
  6. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +10 -0
  7. package/dist/capabilities/pipeline-runner.cap.d.ts +6 -0
  8. package/dist/capabilities/schemas/streaming-shared.d.ts +2 -0
  9. package/dist/capabilities/server-management.cap.d.ts +3 -3
  10. package/dist/capabilities/stream-broker.cap.d.ts +32 -0
  11. package/dist/ffmpeg/fmp4-box-splitter.d.ts +113 -0
  12. package/dist/ffmpeg/fmp4-fragment-child.d.ts +85 -0
  13. package/dist/ffmpeg/fmp4-fragment-plane.d.ts +142 -0
  14. package/dist/ffmpeg/invocation.d.ts +4 -2
  15. package/dist/fmp4-box-splitter-B53u9-Nu.mjs +615 -0
  16. package/dist/fmp4-box-splitter-BkWH7O3L.js +686 -0
  17. package/dist/generated/addon-api.d.ts +162 -0
  18. package/dist/generated/cap-input-defaults.d.ts +1 -1
  19. package/dist/generated/capability-router-map.d.ts +5 -2
  20. package/dist/generated/device-proxy.d.ts +3 -1
  21. package/dist/generated/method-access-map.d.ts +1 -1
  22. package/dist/generated/system-proxy.d.ts +2 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +1114 -407
  25. package/dist/index.mjs +1075 -397
  26. package/dist/interfaces/camera-switches.d.ts +48 -0
  27. package/dist/interfaces/stream-broker.d.ts +19 -49
  28. package/dist/node.d.ts +4 -0
  29. package/dist/node.js +509 -3
  30. package/dist/node.mjs +507 -3
  31. package/dist/notification/schedule.d.ts +20 -0
  32. package/dist/{sleep-Bx9IIoT0.js → sleep-BOI-sVEA.js} +37 -1
  33. package/dist/{sleep-DtstvzWm.mjs → sleep-Bf5fBs7u.mjs} +37 -1
  34. package/dist/types/detection.d.ts +31 -0
  35. package/dist/types/pipeline-step.d.ts +22 -1
  36. package/package.json +1 -1
  37. package/dist/canonical-hash-7nfBbEqR.mjs +0 -35
  38. package/dist/canonical-hash-BcZHRHIx.js +0 -40
@@ -247,6 +247,31 @@ export declare const TrackSourceSchema: z.ZodEnum<{
247
247
  pipeline: "pipeline";
248
248
  }>;
249
249
  export type TrackSource = z.infer<typeof TrackSourceSchema>;
250
+ /**
251
+ * Where a track sits in the RETRAIN lifecycle (D81).
252
+ *
253
+ * - `none` — never marked, or un-marked. Evictable.
254
+ * - `staging` — the operator wants this track as training material and has not
255
+ * finished with it. **This is the only state retention holds**: the track and
256
+ * everything it owns (object events, crops, keyframes, CLIP vector) survive
257
+ * the device's age window.
258
+ * - `trained` — the retrain page has taken what it needed. The frames it chose
259
+ * were COPIED into the retrain dataset at selection time, so the dataset no
260
+ * longer depends on the track's media and the track becomes EVICTABLE again.
261
+ * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
262
+ * a deliberate action of the retrain page, not a side effect of a checkbox.
263
+ *
264
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
265
+ * the store's filter language has only positive equality and `whereIn` — no
266
+ * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
267
+ * would make the entire pre-column history immortal in one deploy.
268
+ */
269
+ export declare const RetrainStatusSchema: z.ZodEnum<{
270
+ none: "none";
271
+ staging: "staging";
272
+ trained: "trained";
273
+ }>;
274
+ export type RetrainStatus = z.infer<typeof RetrainStatusSchema>;
250
275
  /**
251
276
  * The write half: a PARTIAL patch. An omitted key is left untouched, so setting
252
277
  * one flag can never clear the other — the toggles are independent and are
@@ -266,15 +291,83 @@ export declare const TrackFlagsSchema: z.ZodObject<{
266
291
  trackId: z.ZodString;
267
292
  markForTrain: z.ZodBoolean;
268
293
  debug: z.ZodBoolean;
294
+ retrainStatus: z.ZodEnum<{
295
+ none: "none";
296
+ staging: "staging";
297
+ trained: "trained";
298
+ }>;
269
299
  }, z.core.$strip>;
270
300
  export type TrackFlags = z.infer<typeof TrackFlagsSchema>;
301
+ /**
302
+ * WHICH tier a label occupies. The slot a label lands in is DECLARED by the
303
+ * step that produced it (`StepDefinition.labelTier`), never inferred from the
304
+ * text or the step's name.
305
+ *
306
+ * - `1` — a SUB-CLASS: finer than the macro class, still a taxonomy token.
307
+ * `animal-type` (`dog`, `bird`), `vehicle-type` (`van`), and the root
308
+ * detector's own raw class when it is finer than the macro it maps to.
309
+ * - `2` — an INSTANCE: the finest thing said about this subject.
310
+ * `species` (`Turdus migratorius`), `identity` (`Alice`), `plate-text`.
311
+ *
312
+ * The macro class itself (`person`, `vehicle`, `animal`, `package`, `face`,
313
+ * `plate`, `audio`) is NOT a tier — it is `className`, and a macro token
314
+ * offered for either label slot is refused (2026-08-07 rule; the refusal is
315
+ * logged as `label tier collapse refused`).
316
+ */
317
+ export declare const LabelTierSchema: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>]>;
318
+ export type LabelTier = z.infer<typeof LabelTierSchema>;
319
+ /**
320
+ * WHO decided a label, and when. Carried per tier so a value can be traced to
321
+ * the step and model that produced it — which is what makes the write rule
322
+ * arguable after the fact ("why is 592's label `dog` and not `Canis lupus`?")
323
+ * and what lets a migrated, UNATTRIBUTED value be told apart from a real one.
324
+ *
325
+ * `stepId` is the pipeline step id (`animal-classifier`, `bird-classifier`,
326
+ * `plate-ocr`, `face-embedding`, `object-detection`), or the sentinel
327
+ * `migration:4g` for a value the 4g migration moved from the single-slot era —
328
+ * that value has no provenance, and the write rule lets ANY properly-attributed
329
+ * write of the same tier replace it regardless of score.
330
+ */
331
+ export declare const LabelAttributionSchema: z.ZodObject<{
332
+ stepId: z.ZodString;
333
+ modelId: z.ZodOptional<z.ZodString>;
334
+ decidedAt: z.ZodNumber;
335
+ }, z.core.$strip>;
336
+ export type LabelAttribution = z.infer<typeof LabelAttributionSchema>;
337
+ /** Per-camera slice of a training-export estimate. */
338
+ export declare const TrainingExportDeviceTotalsSchema: z.ZodObject<{
339
+ deviceId: z.ZodNumber;
340
+ tracks: z.ZodNumber;
341
+ files: z.ZodNumber;
342
+ bytes: z.ZodNumber;
343
+ }, z.core.$strip>;
344
+ export type TrainingExportDeviceTotals = z.infer<typeof TrainingExportDeviceTotalsSchema>;
345
+ /**
346
+ * What a training export WOULD contain. Computed from media index rows only —
347
+ * no blob is read to produce this.
348
+ */
349
+ export declare const TrainingExportSummarySchema: z.ZodObject<{
350
+ generatedAt: z.ZodNumber;
351
+ trackCount: z.ZodNumber;
352
+ fileCount: z.ZodNumber;
353
+ byteCount: z.ZodNumber;
354
+ truncated: z.ZodBoolean;
355
+ devices: z.ZodReadonly<z.ZodArray<z.ZodObject<{
356
+ deviceId: z.ZodNumber;
357
+ tracks: z.ZodNumber;
358
+ files: z.ZodNumber;
359
+ bytes: z.ZodNumber;
360
+ }, z.core.$strip>>>;
361
+ }, z.core.$strip>;
362
+ export type TrainingExportSummary = z.infer<typeof TrainingExportSummarySchema>;
271
363
  declare const TrackSchema: z.ZodObject<{
364
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
365
+ none: "none";
366
+ staging: "staging";
367
+ trained: "trained";
368
+ }>>;
272
369
  markForTrain: z.ZodOptional<z.ZodBoolean>;
273
370
  debug: z.ZodOptional<z.ZodBoolean>;
274
- trackId: z.ZodString;
275
- deviceId: z.ZodNumber;
276
- className: z.ZodString;
277
- label: z.ZodOptional<z.ZodString>;
278
371
  producingDeviceName: z.ZodOptional<z.ZodString>;
279
372
  source: z.ZodOptional<z.ZodEnum<{
280
373
  sensor: "sensor";
@@ -336,6 +429,23 @@ declare const TrackSchema: z.ZodObject<{
336
429
  maxX: z.ZodNumber;
337
430
  maxY: z.ZodNumber;
338
431
  }, z.core.$strip>>;
432
+ label: z.ZodOptional<z.ZodString>;
433
+ labelScore: z.ZodOptional<z.ZodNumber>;
434
+ labelMeta: z.ZodOptional<z.ZodObject<{
435
+ stepId: z.ZodString;
436
+ modelId: z.ZodOptional<z.ZodString>;
437
+ decidedAt: z.ZodNumber;
438
+ }, z.core.$strip>>;
439
+ subLabel: z.ZodOptional<z.ZodString>;
440
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
441
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
442
+ stepId: z.ZodString;
443
+ modelId: z.ZodOptional<z.ZodString>;
444
+ decidedAt: z.ZodNumber;
445
+ }, z.core.$strip>>;
446
+ trackId: z.ZodString;
447
+ deviceId: z.ZodNumber;
448
+ className: z.ZodString;
339
449
  }, z.core.$strip>;
340
450
  export type Track = z.infer<typeof TrackSchema>;
341
451
  declare const MotionEventSchema: z.ZodObject<{
@@ -410,15 +520,6 @@ export declare const ZoneCrossingSchema: z.ZodObject<{
410
520
  }, z.core.$strip>;
411
521
  export type ZoneCrossing = z.infer<typeof ZoneCrossingSchema>;
412
522
  declare const ObjectEventSchema: z.ZodObject<{
413
- kind: z.ZodLiteral<"object">;
414
- source: z.ZodOptional<z.ZodEnum<{
415
- pipeline: "pipeline";
416
- onboard: "onboard";
417
- }>>;
418
- frameId: z.ZodOptional<z.ZodString>;
419
- trackId: z.ZodOptional<z.ZodString>;
420
- className: z.ZodString;
421
- label: z.ZodOptional<z.ZodString>;
422
523
  confidence: z.ZodOptional<z.ZodNumber>;
423
524
  bbox: z.ZodOptional<z.ZodObject<{
424
525
  x: z.ZodNumber;
@@ -448,6 +549,28 @@ declare const ObjectEventSchema: z.ZodObject<{
448
549
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
449
550
  mediaUrl: z.ZodOptional<z.ZodString>;
450
551
  importance: z.ZodOptional<z.ZodNumber>;
552
+ label: z.ZodOptional<z.ZodString>;
553
+ labelScore: z.ZodOptional<z.ZodNumber>;
554
+ labelMeta: z.ZodOptional<z.ZodObject<{
555
+ stepId: z.ZodString;
556
+ modelId: z.ZodOptional<z.ZodString>;
557
+ decidedAt: z.ZodNumber;
558
+ }, z.core.$strip>>;
559
+ subLabel: z.ZodOptional<z.ZodString>;
560
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
561
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
562
+ stepId: z.ZodString;
563
+ modelId: z.ZodOptional<z.ZodString>;
564
+ decidedAt: z.ZodNumber;
565
+ }, z.core.$strip>>;
566
+ kind: z.ZodLiteral<"object">;
567
+ source: z.ZodOptional<z.ZodEnum<{
568
+ pipeline: "pipeline";
569
+ onboard: "onboard";
570
+ }>>;
571
+ frameId: z.ZodOptional<z.ZodString>;
572
+ trackId: z.ZodOptional<z.ZodString>;
573
+ className: z.ZodString;
451
574
  id: z.ZodString;
452
575
  deviceId: z.ZodNumber;
453
576
  timestamp: z.ZodNumber;
@@ -536,6 +659,337 @@ declare const MediaFileInfoSchema: z.ZodObject<{
536
659
  sizeBytes: z.ZodNumber;
537
660
  }, z.core.$strip>;
538
661
  export type MediaFileInfo = z.infer<typeof MediaFileInfoSchema>;
662
+ /**
663
+ * The MACRO tier of an annotation — a CLOSED set.
664
+ *
665
+ * This is what the exported detector predicts, so a typo here is a new class
666
+ * with one example in it. `label` and `subLabel` are open strings by contrast:
667
+ * the whole point of the page is teaching the model things it does not know
668
+ * yet, and constraining that vocabulary would make it useless.
669
+ *
670
+ * A macro class is NEVER a label. The provider refuses a write whose `label` or
671
+ * `subLabel` is one of these values, in any casing, because once `person`
672
+ * exists in both tiers "every person box" stops being answerable without
673
+ * knowing every string anyone ever typed — and the damage is retroactive.
674
+ */
675
+ export declare const RetrainMacroClassSchema: z.ZodEnum<{
676
+ person: "person";
677
+ vehicle: "vehicle";
678
+ animal: "animal";
679
+ face: "face";
680
+ plate: "plate";
681
+ package: "package";
682
+ }>;
683
+ export type RetrainMacroClass = z.infer<typeof RetrainMacroClassSchema>;
684
+ /** A subject to learn, or a phantom to unlearn (taught by OMISSION). */
685
+ export declare const RetrainAnnotationKindSchema: z.ZodEnum<{
686
+ subject: "subject";
687
+ model_error: "model_error";
688
+ }>;
689
+ /** Did a human draw this box, or did the assist propose it? */
690
+ export declare const RetrainAnnotationSourceSchema: z.ZodEnum<{
691
+ operator: "operator";
692
+ assist: "assist";
693
+ }>;
694
+ /**
695
+ * One annotated subject.
696
+ *
697
+ * `bbox` is normalised against the full frame, ALWAYS. The per-model shapes
698
+ * (letterboxed root / zone-cropped package / subject-cropped classifier) are
699
+ * derived from it at export and never stored — storing them is how one feature
700
+ * space ends up holding two crops of the same subject (D52).
701
+ */
702
+ export declare const RetrainAnnotationSchema: z.ZodObject<{
703
+ id: z.ZodString;
704
+ trackId: z.ZodString;
705
+ deviceId: z.ZodNumber;
706
+ mediaKey: z.ZodString;
707
+ bbox: z.ZodObject<{
708
+ x: z.ZodNumber;
709
+ y: z.ZodNumber;
710
+ w: z.ZodNumber;
711
+ h: z.ZodNumber;
712
+ }, z.core.$strip>;
713
+ macroClass: z.ZodEnum<{
714
+ person: "person";
715
+ vehicle: "vehicle";
716
+ animal: "animal";
717
+ face: "face";
718
+ plate: "plate";
719
+ package: "package";
720
+ }>;
721
+ label: z.ZodOptional<z.ZodString>;
722
+ subLabel: z.ZodOptional<z.ZodString>;
723
+ kind: z.ZodEnum<{
724
+ subject: "subject";
725
+ model_error: "model_error";
726
+ }>;
727
+ source: z.ZodEnum<{
728
+ operator: "operator";
729
+ assist: "assist";
730
+ }>;
731
+ assistModelId: z.ZodOptional<z.ZodString>;
732
+ assistScore: z.ZodOptional<z.ZodNumber>;
733
+ exportedInBatch: z.ZodOptional<z.ZodString>;
734
+ createdAt: z.ZodNumber;
735
+ }, z.core.$strip>;
736
+ export type RetrainAnnotation = z.infer<typeof RetrainAnnotationSchema>;
737
+ /** The write form — the server owns `id`, `createdAt` and the frame binding. */
738
+ export declare const RetrainAnnotationDraftSchema: z.ZodObject<{
739
+ label: z.ZodOptional<z.ZodString>;
740
+ kind: z.ZodEnum<{
741
+ subject: "subject";
742
+ model_error: "model_error";
743
+ }>;
744
+ source: z.ZodEnum<{
745
+ operator: "operator";
746
+ assist: "assist";
747
+ }>;
748
+ bbox: z.ZodObject<{
749
+ x: z.ZodNumber;
750
+ y: z.ZodNumber;
751
+ w: z.ZodNumber;
752
+ h: z.ZodNumber;
753
+ }, z.core.$strip>;
754
+ macroClass: z.ZodEnum<{
755
+ person: "person";
756
+ vehicle: "vehicle";
757
+ animal: "animal";
758
+ face: "face";
759
+ plate: "plate";
760
+ package: "package";
761
+ }>;
762
+ subLabel: z.ZodOptional<z.ZodString>;
763
+ assistModelId: z.ZodOptional<z.ZodString>;
764
+ assistScore: z.ZodOptional<z.ZodNumber>;
765
+ }, z.core.$strip>;
766
+ export type RetrainAnnotationDraft = z.infer<typeof RetrainAnnotationDraftSchema>;
767
+ /** A track sitting in `staging`, with everything the worklist needs to rank it. */
768
+ export declare const RetrainTrackSchema: z.ZodObject<{
769
+ trackId: z.ZodString;
770
+ deviceId: z.ZodNumber;
771
+ className: z.ZodString;
772
+ label: z.ZodOptional<z.ZodString>;
773
+ firstSeen: z.ZodNumber;
774
+ lastSeen: z.ZodNumber;
775
+ frameCount: z.ZodNumber;
776
+ annotationCount: z.ZodNumber;
777
+ }, z.core.$strip>;
778
+ export type RetrainTrack = z.infer<typeof RetrainTrackSchema>;
779
+ /** A frame the picker may offer — an index row, no blob was read to produce it. */
780
+ export declare const RetrainFrameCandidateSchema: z.ZodObject<{
781
+ mediaKey: z.ZodString;
782
+ kind: z.ZodEnum<{
783
+ snapshot: "snapshot";
784
+ crop: "crop";
785
+ keyFrame: "keyFrame";
786
+ thumbnail: "thumbnail";
787
+ firstFrame: "firstFrame";
788
+ lastFrame: "lastFrame";
789
+ fullFrame: "fullFrame";
790
+ fullFrameBoxed: "fullFrameBoxed";
791
+ faceCrop: "faceCrop";
792
+ plateCrop: "plateCrop";
793
+ keyFrameSmall: "keyFrameSmall";
794
+ thumbnailSmall: "thumbnailSmall";
795
+ }>;
796
+ timestamp: z.ZodNumber;
797
+ sizeBytes: z.ZodNumber;
798
+ copied: z.ZodBoolean;
799
+ }, z.core.$strip>;
800
+ export type RetrainFrameCandidate = z.infer<typeof RetrainFrameCandidateSchema>;
801
+ /** A frame the dataset OWNS: bytes copied at selection time. */
802
+ export declare const RetrainFrameSchema: z.ZodObject<{
803
+ frameId: z.ZodString;
804
+ deviceId: z.ZodNumber;
805
+ trackId: z.ZodString;
806
+ sourceMediaKey: z.ZodString;
807
+ sourceKind: z.ZodEnum<{
808
+ snapshot: "snapshot";
809
+ crop: "crop";
810
+ keyFrame: "keyFrame";
811
+ thumbnail: "thumbnail";
812
+ firstFrame: "firstFrame";
813
+ lastFrame: "lastFrame";
814
+ fullFrame: "fullFrame";
815
+ fullFrameBoxed: "fullFrameBoxed";
816
+ faceCrop: "faceCrop";
817
+ plateCrop: "plateCrop";
818
+ keyFrameSmall: "keyFrameSmall";
819
+ thumbnailSmall: "thumbnailSmall";
820
+ }>;
821
+ sizeBytes: z.ZodNumber;
822
+ width: z.ZodNumber;
823
+ height: z.ZodNumber;
824
+ copiedAt: z.ZodNumber;
825
+ }, z.core.$strip>;
826
+ export type RetrainFrame = z.infer<typeof RetrainFrameSchema>;
827
+ /** Why a copy-on-select could not be honoured — named, never a silent skip. */
828
+ export declare const RetrainCopyRefusalSchema: z.ZodEnum<{
829
+ "source-missing": "source-missing";
830
+ "unreadable-image": "unreadable-image";
831
+ "write-failed": "write-failed";
832
+ }>;
833
+ export declare const RetrainFrameSelectionSchema: z.ZodObject<{
834
+ copied: z.ZodReadonly<z.ZodArray<z.ZodObject<{
835
+ frameId: z.ZodString;
836
+ deviceId: z.ZodNumber;
837
+ trackId: z.ZodString;
838
+ sourceMediaKey: z.ZodString;
839
+ sourceKind: z.ZodEnum<{
840
+ snapshot: "snapshot";
841
+ crop: "crop";
842
+ keyFrame: "keyFrame";
843
+ thumbnail: "thumbnail";
844
+ firstFrame: "firstFrame";
845
+ lastFrame: "lastFrame";
846
+ fullFrame: "fullFrame";
847
+ fullFrameBoxed: "fullFrameBoxed";
848
+ faceCrop: "faceCrop";
849
+ plateCrop: "plateCrop";
850
+ keyFrameSmall: "keyFrameSmall";
851
+ thumbnailSmall: "thumbnailSmall";
852
+ }>;
853
+ sizeBytes: z.ZodNumber;
854
+ width: z.ZodNumber;
855
+ height: z.ZodNumber;
856
+ copiedAt: z.ZodNumber;
857
+ }, z.core.$strip>>>;
858
+ refused: z.ZodReadonly<z.ZodArray<z.ZodObject<{
859
+ sourceMediaKey: z.ZodString;
860
+ reason: z.ZodEnum<{
861
+ "source-missing": "source-missing";
862
+ "unreadable-image": "unreadable-image";
863
+ "write-failed": "write-failed";
864
+ }>;
865
+ }, z.core.$strip>>>;
866
+ }, z.core.$strip>;
867
+ export type RetrainFrameSelection = z.infer<typeof RetrainFrameSelectionSchema>;
868
+ export declare const RetrainFrameListSchema: z.ZodObject<{
869
+ candidates: z.ZodReadonly<z.ZodArray<z.ZodObject<{
870
+ mediaKey: z.ZodString;
871
+ kind: z.ZodEnum<{
872
+ snapshot: "snapshot";
873
+ crop: "crop";
874
+ keyFrame: "keyFrame";
875
+ thumbnail: "thumbnail";
876
+ firstFrame: "firstFrame";
877
+ lastFrame: "lastFrame";
878
+ fullFrame: "fullFrame";
879
+ fullFrameBoxed: "fullFrameBoxed";
880
+ faceCrop: "faceCrop";
881
+ plateCrop: "plateCrop";
882
+ keyFrameSmall: "keyFrameSmall";
883
+ thumbnailSmall: "thumbnailSmall";
884
+ }>;
885
+ timestamp: z.ZodNumber;
886
+ sizeBytes: z.ZodNumber;
887
+ copied: z.ZodBoolean;
888
+ }, z.core.$strip>>>;
889
+ copies: z.ZodReadonly<z.ZodArray<z.ZodObject<{
890
+ frameId: z.ZodString;
891
+ deviceId: z.ZodNumber;
892
+ trackId: z.ZodString;
893
+ sourceMediaKey: z.ZodString;
894
+ sourceKind: z.ZodEnum<{
895
+ snapshot: "snapshot";
896
+ crop: "crop";
897
+ keyFrame: "keyFrame";
898
+ thumbnail: "thumbnail";
899
+ firstFrame: "firstFrame";
900
+ lastFrame: "lastFrame";
901
+ fullFrame: "fullFrame";
902
+ fullFrameBoxed: "fullFrameBoxed";
903
+ faceCrop: "faceCrop";
904
+ plateCrop: "plateCrop";
905
+ keyFrameSmall: "keyFrameSmall";
906
+ thumbnailSmall: "thumbnailSmall";
907
+ }>;
908
+ sizeBytes: z.ZodNumber;
909
+ width: z.ZodNumber;
910
+ height: z.ZodNumber;
911
+ copiedAt: z.ZodNumber;
912
+ }, z.core.$strip>>>;
913
+ autoPickMediaKey: z.ZodOptional<z.ZodString>;
914
+ }, z.core.$strip>;
915
+ export type RetrainFrameList = z.infer<typeof RetrainFrameListSchema>;
916
+ /** What the operator asked the assist to look for. */
917
+ export declare const RetrainAssistSubjectSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
918
+ kind: z.ZodLiteral<"package">;
919
+ zone: z.ZodOptional<z.ZodObject<{
920
+ x: z.ZodNumber;
921
+ y: z.ZodNumber;
922
+ w: z.ZodNumber;
923
+ h: z.ZodNumber;
924
+ }, z.core.$strip>>;
925
+ }, z.core.$strip>, z.ZodObject<{
926
+ kind: z.ZodLiteral<"objects">;
927
+ modelId: z.ZodString;
928
+ minScore: z.ZodOptional<z.ZodNumber>;
929
+ }, z.core.$strip>], "kind">;
930
+ /**
931
+ * The assist's answer — a discriminated union, because "the model saw nothing"
932
+ * and "this node cannot run that model" lead to different next moves and a
933
+ * nullable result cannot tell them apart.
934
+ */
935
+ export declare const RetrainAssistResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
936
+ kind: z.ZodLiteral<"proposed">;
937
+ modelId: z.ZodString;
938
+ stepId: z.ZodString;
939
+ minScore: z.ZodNumber;
940
+ proposals: z.ZodReadonly<z.ZodArray<z.ZodObject<{
941
+ label: z.ZodOptional<z.ZodString>;
942
+ kind: z.ZodEnum<{
943
+ subject: "subject";
944
+ model_error: "model_error";
945
+ }>;
946
+ source: z.ZodEnum<{
947
+ operator: "operator";
948
+ assist: "assist";
949
+ }>;
950
+ bbox: z.ZodObject<{
951
+ x: z.ZodNumber;
952
+ y: z.ZodNumber;
953
+ w: z.ZodNumber;
954
+ h: z.ZodNumber;
955
+ }, z.core.$strip>;
956
+ macroClass: z.ZodEnum<{
957
+ person: "person";
958
+ vehicle: "vehicle";
959
+ animal: "animal";
960
+ face: "face";
961
+ plate: "plate";
962
+ package: "package";
963
+ }>;
964
+ subLabel: z.ZodOptional<z.ZodString>;
965
+ assistModelId: z.ZodOptional<z.ZodString>;
966
+ assistScore: z.ZodOptional<z.ZodNumber>;
967
+ }, z.core.$strip>>>;
968
+ belowThreshold: z.ZodNumber;
969
+ }, z.core.$strip>, z.ZodObject<{
970
+ kind: z.ZodLiteral<"refused">;
971
+ reason: z.ZodString;
972
+ detail: z.ZodOptional<z.ZodString>;
973
+ }, z.core.$strip>], "kind">;
974
+ export type RetrainAssistResult = z.infer<typeof RetrainAssistResultSchema>;
975
+ /** The outcome of a lifecycle move owned by the retrain page. */
976
+ export declare const RetrainTransitionResultSchema: z.ZodObject<{
977
+ trackId: z.ZodString;
978
+ retrainStatus: z.ZodEnum<{
979
+ none: "none";
980
+ staging: "staging";
981
+ trained: "trained";
982
+ }>;
983
+ changed: z.ZodBoolean;
984
+ reason: z.ZodOptional<z.ZodEnum<{
985
+ unchanged: "unchanged";
986
+ "unknown-track": "unknown-track";
987
+ "no-frames-copied": "no-frames-copied";
988
+ "not-staging": "not-staging";
989
+ "not-trained": "not-trained";
990
+ }>>;
991
+ }, z.core.$strip>;
992
+ export type RetrainTransitionResult = z.infer<typeof RetrainTransitionResultSchema>;
539
993
  declare const RecentTracksQueryInput: z.ZodObject<{
540
994
  deviceIds: z.ZodArray<z.ZodNumber>;
541
995
  since: z.ZodOptional<z.ZodNumber>;
@@ -550,12 +1004,13 @@ declare const RecentTracksQueryInput: z.ZodObject<{
550
1004
  export type RecentTracksQuery = z.infer<typeof RecentTracksQueryInput>;
551
1005
  declare const RecentTracksPageSchema: z.ZodObject<{
552
1006
  tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1007
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1008
+ none: "none";
1009
+ staging: "staging";
1010
+ trained: "trained";
1011
+ }>>;
553
1012
  markForTrain: z.ZodOptional<z.ZodBoolean>;
554
1013
  debug: z.ZodOptional<z.ZodBoolean>;
555
- trackId: z.ZodString;
556
- deviceId: z.ZodNumber;
557
- className: z.ZodString;
558
- label: z.ZodOptional<z.ZodString>;
559
1014
  producingDeviceName: z.ZodOptional<z.ZodString>;
560
1015
  source: z.ZodOptional<z.ZodEnum<{
561
1016
  sensor: "sensor";
@@ -617,21 +1072,56 @@ declare const RecentTracksPageSchema: z.ZodObject<{
617
1072
  maxX: z.ZodNumber;
618
1073
  maxY: z.ZodNumber;
619
1074
  }, z.core.$strip>>;
1075
+ label: z.ZodOptional<z.ZodString>;
1076
+ labelScore: z.ZodOptional<z.ZodNumber>;
1077
+ labelMeta: z.ZodOptional<z.ZodObject<{
1078
+ stepId: z.ZodString;
1079
+ modelId: z.ZodOptional<z.ZodString>;
1080
+ decidedAt: z.ZodNumber;
1081
+ }, z.core.$strip>>;
1082
+ subLabel: z.ZodOptional<z.ZodString>;
1083
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1084
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1085
+ stepId: z.ZodString;
1086
+ modelId: z.ZodOptional<z.ZodString>;
1087
+ decidedAt: z.ZodNumber;
1088
+ }, z.core.$strip>>;
1089
+ trackId: z.ZodString;
1090
+ deviceId: z.ZodNumber;
1091
+ className: z.ZodString;
620
1092
  }, z.core.$strip>>>;
621
1093
  nextCursor: z.ZodNullable<z.ZodString>;
622
1094
  }, z.core.$strip>;
623
1095
  export type RecentTracksPage = z.infer<typeof RecentTracksPageSchema>;
624
1096
  declare const KeyEventSchema: z.ZodObject<{
1097
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1098
+ none: "none";
1099
+ staging: "staging";
1100
+ trained: "trained";
1101
+ }>>;
625
1102
  markForTrain: z.ZodOptional<z.ZodBoolean>;
626
1103
  debug: z.ZodOptional<z.ZodBoolean>;
1104
+ importance: z.ZodNumber;
1105
+ bestEventId: z.ZodString;
1106
+ windowMs: z.ZodOptional<z.ZodNumber>;
1107
+ label: z.ZodOptional<z.ZodString>;
1108
+ labelScore: z.ZodOptional<z.ZodNumber>;
1109
+ labelMeta: z.ZodOptional<z.ZodObject<{
1110
+ stepId: z.ZodString;
1111
+ modelId: z.ZodOptional<z.ZodString>;
1112
+ decidedAt: z.ZodNumber;
1113
+ }, z.core.$strip>>;
1114
+ subLabel: z.ZodOptional<z.ZodString>;
1115
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1116
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1117
+ stepId: z.ZodString;
1118
+ modelId: z.ZodOptional<z.ZodString>;
1119
+ decidedAt: z.ZodNumber;
1120
+ }, z.core.$strip>>;
627
1121
  id: z.ZodString;
628
1122
  trackId: z.ZodString;
629
1123
  timestamp: z.ZodNumber;
630
1124
  className: z.ZodString;
631
- label: z.ZodOptional<z.ZodString>;
632
- importance: z.ZodNumber;
633
- bestEventId: z.ZodString;
634
- windowMs: z.ZodOptional<z.ZodNumber>;
635
1125
  }, z.core.$strip>;
636
1126
  export type KeyEvent = z.infer<typeof KeyEventSchema>;
637
1127
  declare const TrackedDetectionSchema: z.ZodObject<{
@@ -654,15 +1144,6 @@ declare const TrackedDetectionSchema: z.ZodObject<{
654
1144
  }>;
655
1145
  }, z.core.$strip>;
656
1146
  export declare const ScoredObjectEventSchema: z.ZodObject<{
657
- kind: z.ZodLiteral<"object">;
658
- source: z.ZodOptional<z.ZodEnum<{
659
- pipeline: "pipeline";
660
- onboard: "onboard";
661
- }>>;
662
- frameId: z.ZodOptional<z.ZodString>;
663
- trackId: z.ZodOptional<z.ZodString>;
664
- className: z.ZodString;
665
- label: z.ZodOptional<z.ZodString>;
666
1147
  confidence: z.ZodOptional<z.ZodNumber>;
667
1148
  bbox: z.ZodOptional<z.ZodObject<{
668
1149
  x: z.ZodNumber;
@@ -692,6 +1173,28 @@ export declare const ScoredObjectEventSchema: z.ZodObject<{
692
1173
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
693
1174
  mediaUrl: z.ZodOptional<z.ZodString>;
694
1175
  importance: z.ZodOptional<z.ZodNumber>;
1176
+ label: z.ZodOptional<z.ZodString>;
1177
+ labelScore: z.ZodOptional<z.ZodNumber>;
1178
+ labelMeta: z.ZodOptional<z.ZodObject<{
1179
+ stepId: z.ZodString;
1180
+ modelId: z.ZodOptional<z.ZodString>;
1181
+ decidedAt: z.ZodNumber;
1182
+ }, z.core.$strip>>;
1183
+ subLabel: z.ZodOptional<z.ZodString>;
1184
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1185
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1186
+ stepId: z.ZodString;
1187
+ modelId: z.ZodOptional<z.ZodString>;
1188
+ decidedAt: z.ZodNumber;
1189
+ }, z.core.$strip>>;
1190
+ kind: z.ZodLiteral<"object">;
1191
+ source: z.ZodOptional<z.ZodEnum<{
1192
+ pipeline: "pipeline";
1193
+ onboard: "onboard";
1194
+ }>>;
1195
+ frameId: z.ZodOptional<z.ZodString>;
1196
+ trackId: z.ZodOptional<z.ZodString>;
1197
+ className: z.ZodString;
695
1198
  id: z.ZodString;
696
1199
  deviceId: z.ZodNumber;
697
1200
  timestamp: z.ZodNumber;
@@ -744,12 +1247,13 @@ export declare const pipelineAnalyticsCapability: {
744
1247
  readonly getActiveTracks: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
745
1248
  deviceId: z.ZodNumber;
746
1249
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1250
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1251
+ none: "none";
1252
+ staging: "staging";
1253
+ trained: "trained";
1254
+ }>>;
747
1255
  markForTrain: z.ZodOptional<z.ZodBoolean>;
748
1256
  debug: z.ZodOptional<z.ZodBoolean>;
749
- trackId: z.ZodString;
750
- deviceId: z.ZodNumber;
751
- className: z.ZodString;
752
- label: z.ZodOptional<z.ZodString>;
753
1257
  producingDeviceName: z.ZodOptional<z.ZodString>;
754
1258
  source: z.ZodOptional<z.ZodEnum<{
755
1259
  sensor: "sensor";
@@ -811,17 +1315,35 @@ export declare const pipelineAnalyticsCapability: {
811
1315
  maxX: z.ZodNumber;
812
1316
  maxY: z.ZodNumber;
813
1317
  }, z.core.$strip>>;
1318
+ label: z.ZodOptional<z.ZodString>;
1319
+ labelScore: z.ZodOptional<z.ZodNumber>;
1320
+ labelMeta: z.ZodOptional<z.ZodObject<{
1321
+ stepId: z.ZodString;
1322
+ modelId: z.ZodOptional<z.ZodString>;
1323
+ decidedAt: z.ZodNumber;
1324
+ }, z.core.$strip>>;
1325
+ subLabel: z.ZodOptional<z.ZodString>;
1326
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1327
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1328
+ stepId: z.ZodString;
1329
+ modelId: z.ZodOptional<z.ZodString>;
1330
+ decidedAt: z.ZodNumber;
1331
+ }, z.core.$strip>>;
1332
+ trackId: z.ZodString;
1333
+ deviceId: z.ZodNumber;
1334
+ className: z.ZodString;
814
1335
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
815
1336
  readonly getTrack: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
816
1337
  deviceId: z.ZodNumber;
817
1338
  trackId: z.ZodString;
818
1339
  }, z.core.$strip>, z.ZodNullable<z.ZodObject<{
1340
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1341
+ none: "none";
1342
+ staging: "staging";
1343
+ trained: "trained";
1344
+ }>>;
819
1345
  markForTrain: z.ZodOptional<z.ZodBoolean>;
820
1346
  debug: z.ZodOptional<z.ZodBoolean>;
821
- trackId: z.ZodString;
822
- deviceId: z.ZodNumber;
823
- className: z.ZodString;
824
- label: z.ZodOptional<z.ZodString>;
825
1347
  producingDeviceName: z.ZodOptional<z.ZodString>;
826
1348
  source: z.ZodOptional<z.ZodEnum<{
827
1349
  sensor: "sensor";
@@ -883,6 +1405,23 @@ export declare const pipelineAnalyticsCapability: {
883
1405
  maxX: z.ZodNumber;
884
1406
  maxY: z.ZodNumber;
885
1407
  }, z.core.$strip>>;
1408
+ label: z.ZodOptional<z.ZodString>;
1409
+ labelScore: z.ZodOptional<z.ZodNumber>;
1410
+ labelMeta: z.ZodOptional<z.ZodObject<{
1411
+ stepId: z.ZodString;
1412
+ modelId: z.ZodOptional<z.ZodString>;
1413
+ decidedAt: z.ZodNumber;
1414
+ }, z.core.$strip>>;
1415
+ subLabel: z.ZodOptional<z.ZodString>;
1416
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1417
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1418
+ stepId: z.ZodString;
1419
+ modelId: z.ZodOptional<z.ZodString>;
1420
+ decidedAt: z.ZodNumber;
1421
+ }, z.core.$strip>>;
1422
+ trackId: z.ZodString;
1423
+ deviceId: z.ZodNumber;
1424
+ className: z.ZodString;
886
1425
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
887
1426
  /** Historical completed tracks for a device. Queried from the
888
1427
  * persisted `pipeline-analytics:tracks` collection; active tracks
@@ -910,12 +1449,13 @@ export declare const pipelineAnalyticsCapability: {
910
1449
  slim: "slim";
911
1450
  }>>;
912
1451
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1452
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1453
+ none: "none";
1454
+ staging: "staging";
1455
+ trained: "trained";
1456
+ }>>;
913
1457
  markForTrain: z.ZodOptional<z.ZodBoolean>;
914
1458
  debug: z.ZodOptional<z.ZodBoolean>;
915
- trackId: z.ZodString;
916
- deviceId: z.ZodNumber;
917
- className: z.ZodString;
918
- label: z.ZodOptional<z.ZodString>;
919
1459
  producingDeviceName: z.ZodOptional<z.ZodString>;
920
1460
  source: z.ZodOptional<z.ZodEnum<{
921
1461
  sensor: "sensor";
@@ -977,6 +1517,23 @@ export declare const pipelineAnalyticsCapability: {
977
1517
  maxX: z.ZodNumber;
978
1518
  maxY: z.ZodNumber;
979
1519
  }, z.core.$strip>>;
1520
+ label: z.ZodOptional<z.ZodString>;
1521
+ labelScore: z.ZodOptional<z.ZodNumber>;
1522
+ labelMeta: z.ZodOptional<z.ZodObject<{
1523
+ stepId: z.ZodString;
1524
+ modelId: z.ZodOptional<z.ZodString>;
1525
+ decidedAt: z.ZodNumber;
1526
+ }, z.core.$strip>>;
1527
+ subLabel: z.ZodOptional<z.ZodString>;
1528
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1529
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1530
+ stepId: z.ZodString;
1531
+ modelId: z.ZodOptional<z.ZodString>;
1532
+ decidedAt: z.ZodNumber;
1533
+ }, z.core.$strip>>;
1534
+ trackId: z.ZodString;
1535
+ deviceId: z.ZodNumber;
1536
+ className: z.ZodString;
980
1537
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
981
1538
  /**
982
1539
  * Batched cluster-wide track listing — ONE call for the events page /
@@ -1000,12 +1557,13 @@ export declare const pipelineAnalyticsCapability: {
1000
1557
  }>>;
1001
1558
  }, z.core.$strip>, z.ZodObject<{
1002
1559
  tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1003
- markForTrain: z.ZodOptional<z.ZodBoolean>;
1004
- debug: z.ZodOptional<z.ZodBoolean>;
1005
- trackId: z.ZodString;
1006
- deviceId: z.ZodNumber;
1007
- className: z.ZodString;
1008
- label: z.ZodOptional<z.ZodString>;
1560
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1561
+ none: "none";
1562
+ staging: "staging";
1563
+ trained: "trained";
1564
+ }>>;
1565
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
1566
+ debug: z.ZodOptional<z.ZodBoolean>;
1009
1567
  producingDeviceName: z.ZodOptional<z.ZodString>;
1010
1568
  source: z.ZodOptional<z.ZodEnum<{
1011
1569
  sensor: "sensor";
@@ -1067,6 +1625,23 @@ export declare const pipelineAnalyticsCapability: {
1067
1625
  maxX: z.ZodNumber;
1068
1626
  maxY: z.ZodNumber;
1069
1627
  }, z.core.$strip>>;
1628
+ label: z.ZodOptional<z.ZodString>;
1629
+ labelScore: z.ZodOptional<z.ZodNumber>;
1630
+ labelMeta: z.ZodOptional<z.ZodObject<{
1631
+ stepId: z.ZodString;
1632
+ modelId: z.ZodOptional<z.ZodString>;
1633
+ decidedAt: z.ZodNumber;
1634
+ }, z.core.$strip>>;
1635
+ subLabel: z.ZodOptional<z.ZodString>;
1636
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1637
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1638
+ stepId: z.ZodString;
1639
+ modelId: z.ZodOptional<z.ZodString>;
1640
+ decidedAt: z.ZodNumber;
1641
+ }, z.core.$strip>>;
1642
+ trackId: z.ZodString;
1643
+ deviceId: z.ZodNumber;
1644
+ className: z.ZodString;
1070
1645
  }, z.core.$strip>>>;
1071
1646
  nextCursor: z.ZodNullable<z.ZodString>;
1072
1647
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
@@ -1113,15 +1688,6 @@ export declare const pipelineAnalyticsCapability: {
1113
1688
  }>>;
1114
1689
  classFilter: z.ZodOptional<z.ZodString>;
1115
1690
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1116
- kind: z.ZodLiteral<"object">;
1117
- source: z.ZodOptional<z.ZodEnum<{
1118
- pipeline: "pipeline";
1119
- onboard: "onboard";
1120
- }>>;
1121
- frameId: z.ZodOptional<z.ZodString>;
1122
- trackId: z.ZodOptional<z.ZodString>;
1123
- className: z.ZodString;
1124
- label: z.ZodOptional<z.ZodString>;
1125
1691
  confidence: z.ZodOptional<z.ZodNumber>;
1126
1692
  bbox: z.ZodOptional<z.ZodObject<{
1127
1693
  x: z.ZodNumber;
@@ -1151,6 +1717,28 @@ export declare const pipelineAnalyticsCapability: {
1151
1717
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
1152
1718
  mediaUrl: z.ZodOptional<z.ZodString>;
1153
1719
  importance: z.ZodOptional<z.ZodNumber>;
1720
+ label: z.ZodOptional<z.ZodString>;
1721
+ labelScore: z.ZodOptional<z.ZodNumber>;
1722
+ labelMeta: z.ZodOptional<z.ZodObject<{
1723
+ stepId: z.ZodString;
1724
+ modelId: z.ZodOptional<z.ZodString>;
1725
+ decidedAt: z.ZodNumber;
1726
+ }, z.core.$strip>>;
1727
+ subLabel: z.ZodOptional<z.ZodString>;
1728
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1729
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1730
+ stepId: z.ZodString;
1731
+ modelId: z.ZodOptional<z.ZodString>;
1732
+ decidedAt: z.ZodNumber;
1733
+ }, z.core.$strip>>;
1734
+ kind: z.ZodLiteral<"object">;
1735
+ source: z.ZodOptional<z.ZodEnum<{
1736
+ pipeline: "pipeline";
1737
+ onboard: "onboard";
1738
+ }>>;
1739
+ frameId: z.ZodOptional<z.ZodString>;
1740
+ trackId: z.ZodOptional<z.ZodString>;
1741
+ className: z.ZodString;
1154
1742
  id: z.ZodString;
1155
1743
  deviceId: z.ZodNumber;
1156
1744
  timestamp: z.ZodNumber;
@@ -1323,16 +1911,34 @@ export declare const pipelineAnalyticsCapability: {
1323
1911
  minImportance: z.ZodOptional<z.ZodNumber>;
1324
1912
  classFilter: z.ZodOptional<z.ZodString>;
1325
1913
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1914
+ retrainStatus: z.ZodOptional<z.ZodEnum<{
1915
+ none: "none";
1916
+ staging: "staging";
1917
+ trained: "trained";
1918
+ }>>;
1326
1919
  markForTrain: z.ZodOptional<z.ZodBoolean>;
1327
1920
  debug: z.ZodOptional<z.ZodBoolean>;
1921
+ importance: z.ZodNumber;
1922
+ bestEventId: z.ZodString;
1923
+ windowMs: z.ZodOptional<z.ZodNumber>;
1924
+ label: z.ZodOptional<z.ZodString>;
1925
+ labelScore: z.ZodOptional<z.ZodNumber>;
1926
+ labelMeta: z.ZodOptional<z.ZodObject<{
1927
+ stepId: z.ZodString;
1928
+ modelId: z.ZodOptional<z.ZodString>;
1929
+ decidedAt: z.ZodNumber;
1930
+ }, z.core.$strip>>;
1931
+ subLabel: z.ZodOptional<z.ZodString>;
1932
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
1933
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
1934
+ stepId: z.ZodString;
1935
+ modelId: z.ZodOptional<z.ZodString>;
1936
+ decidedAt: z.ZodNumber;
1937
+ }, z.core.$strip>>;
1328
1938
  id: z.ZodString;
1329
1939
  trackId: z.ZodString;
1330
1940
  timestamp: z.ZodNumber;
1331
1941
  className: z.ZodString;
1332
- label: z.ZodOptional<z.ZodString>;
1333
- importance: z.ZodNumber;
1334
- bestEventId: z.ZodString;
1335
- windowMs: z.ZodOptional<z.ZodNumber>;
1336
1942
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
1337
1943
  /** Server-side bucketed event counts for the 24-hour timeline.
1338
1944
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
@@ -1434,11 +2040,29 @@ export declare const pipelineAnalyticsCapability: {
1434
2040
  *
1435
2041
  * `auth: 'protected'` (the default), NOT `admin`: the viewer is an
1436
2042
  * authenticated non-admin surface and two of the three call sites are
1437
- * there. Revisit if a flag ever gains an effect that costs storage
1438
- * `deleteTracks` next door is admin for exactly that reason.
2043
+ * there. The note that used to sit here said to revisit this the day a flag
2044
+ * gained an effect that costs storage, and D81 is that day — `markForTrain`
2045
+ * now pins. It STAYS protected, and the reason is that the alternative
2046
+ * makes the feature pointless: marking a track is something you do while
2047
+ * looking at it, on the surface you were already looking at it on, and that
2048
+ * surface is the viewer. What the storage cost gets instead is a BOUND — a
2049
+ * per-device pin budget enforced in the body, refusing a new pin past the
2050
+ * limit while always allowing un-marking. `deleteTracks` next door is still
2051
+ * admin, because destroying evidence and preserving it are not symmetric.
2052
+ *
2053
+ * `markForTrain` writes the retrain LIFECYCLE, not a boolean column: `true`
2054
+ * is `none → staging`, `false` is `staging → none`. A track already
2055
+ * `trained` refuses BOTH — its frames are copies inside the retrain dataset
2056
+ * and re-staging it from a generic toggle is how the same material gets
2057
+ * annotated twice under two ground truths. Returning a trained track to
2058
+ * staging is a deliberate action of the retrain page, which is also the only
2059
+ * thing that produces `trained` in the first place.
1439
2060
  *
1440
- * Returns the RESOLVED state of both flags (absent → `false`) so a caller
1441
- * can drive its toggle without a re-fetch. Rejects an unknown track.
2061
+ * Returns the RESOLVED state of both flags (absent → `false`) plus the
2062
+ * `retrainStatus` they were derived from, so a caller can drive its toggle
2063
+ * — and render a `trained` badge — without a re-fetch. Rejects an unknown
2064
+ * track, a new staging mark on a device already holding its full budget, and
2065
+ * any `markForTrain` write against a trained track.
1442
2066
  */
1443
2067
  readonly setTrackFlags: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1444
2068
  deviceId: z.ZodNumber;
@@ -1451,6 +2075,11 @@ export declare const pipelineAnalyticsCapability: {
1451
2075
  trackId: z.ZodString;
1452
2076
  markForTrain: z.ZodBoolean;
1453
2077
  debug: z.ZodBoolean;
2078
+ retrainStatus: z.ZodEnum<{
2079
+ none: "none";
2080
+ staging: "staging";
2081
+ trained: "trained";
2082
+ }>;
1454
2083
  }, z.core.$strip>, "mutation">;
1455
2084
  /**
1456
2085
  * Durable event-store footprint for the management UI: event rows
@@ -1570,6 +2199,482 @@ export declare const pipelineAnalyticsCapability: {
1570
2199
  detail: z.ZodNullable<z.ZodString>;
1571
2200
  actor: z.ZodString;
1572
2201
  }, z.core.$strip>>>, "query">;
2202
+ /**
2203
+ * The CHEAP QUESTION, asked before any media moves: how big is the dataset
2204
+ * the marked (`markForTrain`) tracks would produce?
2205
+ *
2206
+ * Answered from media INDEX rows only — key, kind, size, timestamp — so it
2207
+ * costs ~2 KB of reads per track and no blob reads at all. The measured harm
2208
+ * behind D56 was a bulk pass that read and base64'd every blob a track owned
2209
+ * before deciding anything, taking hub-main to 82 s busy out of 120; an
2210
+ * export is that same I/O shape, so it inherits the same discipline: know
2211
+ * the size, then decide.
2212
+ *
2213
+ * `truncated` reports that more marked tracks exist than one pass carries.
2214
+ * Empty `deviceIds` ⇒ every device that has marked tracks.
2215
+ */
2216
+ readonly getTrainingExportSummary: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2217
+ deviceIds: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
2218
+ }, z.core.$strip>, z.ZodObject<{
2219
+ generatedAt: z.ZodNumber;
2220
+ trackCount: z.ZodNumber;
2221
+ fileCount: z.ZodNumber;
2222
+ byteCount: z.ZodNumber;
2223
+ truncated: z.ZodBoolean;
2224
+ devices: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2225
+ deviceId: z.ZodNumber;
2226
+ tracks: z.ZodNumber;
2227
+ files: z.ZodNumber;
2228
+ bytes: z.ZodNumber;
2229
+ }, z.core.$strip>>>;
2230
+ }, z.core.$strip>, "query">;
2231
+ /**
2232
+ * Where to download the dataset archive.
2233
+ *
2234
+ * The BYTES do not come back through this cap — they come from the returned
2235
+ * data-plane URL, which streams a tar built entry by entry. A multi-gigabyte
2236
+ * archive base64'd through a unary RPC envelope would be held whole in
2237
+ * memory twice on a hub this repo has already OOM'd once (D9/D18 are the
2238
+ * same lesson about frames). `getDownloadUrl` on `recordingExport` is the
2239
+ * precedent, and this follows it deliberately.
2240
+ *
2241
+ * The archive contains a `manifest.json` FIRST, then the stored media
2242
+ * VERBATIM under `tracks/<deviceId>/<trackId>/…`. No crop is derived and no
2243
+ * model is run: a training set's pixels must be the pixels the pipeline saw.
2244
+ */
2245
+ readonly getTrainingExportUrl: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2246
+ deviceIds: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
2247
+ }, z.core.$strip>, z.ZodObject<{
2248
+ url: z.ZodString;
2249
+ }, z.core.$strip>, "query">;
2250
+ /**
2251
+ * The staging worklist for one camera, or for every camera that has one.
2252
+ *
2253
+ * Fetched ON DEMAND, over the staging set only — the page never scans
2254
+ * history, because making the working set small is the entire purpose of
2255
+ * the mark. Each row carries how many frames the dataset already holds from
2256
+ * the track and how many subjects were annotated on them, so
2257
+ * `frameCount: 0` reads as "still to work" without a second call per track.
2258
+ *
2259
+ * `auth: 'admin'`, unlike the viewer-level mark itself: marking a track is
2260
+ * curation you do while looking at it, but building the training set the
2261
+ * fleet's models are fine-tuned on is not.
2262
+ */
2263
+ readonly listRetrainStaging: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2264
+ deviceIds: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
2265
+ limit: z.ZodOptional<z.ZodNumber>;
2266
+ }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
2267
+ trackId: z.ZodString;
2268
+ deviceId: z.ZodNumber;
2269
+ className: z.ZodString;
2270
+ label: z.ZodOptional<z.ZodString>;
2271
+ firstSeen: z.ZodNumber;
2272
+ lastSeen: z.ZodNumber;
2273
+ frameCount: z.ZodNumber;
2274
+ annotationCount: z.ZodNumber;
2275
+ }, z.core.$strip>>>, "query">;
2276
+ /**
2277
+ * What a track can contribute, and what it already has.
2278
+ *
2279
+ * `candidates` are the track's whole, unannotated frames — index rows only,
2280
+ * so this is cheap. `copies` are the frames already inside the dataset, and
2281
+ * a candidate whose copy exists is marked `copied: true`: selecting it again
2282
+ * is free and CANNOT fail, whatever became of the original.
2283
+ *
2284
+ * A crop, a thumbnail and `fullFrameBoxed` are never candidates. The last
2285
+ * one matters most: it has the model's own rectangle burned into the pixels,
2286
+ * and a detector trained on it learns to find a green line.
2287
+ */
2288
+ readonly listRetrainFrames: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2289
+ trackId: z.ZodString;
2290
+ }, z.core.$strip>, z.ZodObject<{
2291
+ candidates: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2292
+ mediaKey: z.ZodString;
2293
+ kind: z.ZodEnum<{
2294
+ snapshot: "snapshot";
2295
+ crop: "crop";
2296
+ keyFrame: "keyFrame";
2297
+ thumbnail: "thumbnail";
2298
+ firstFrame: "firstFrame";
2299
+ lastFrame: "lastFrame";
2300
+ fullFrame: "fullFrame";
2301
+ fullFrameBoxed: "fullFrameBoxed";
2302
+ faceCrop: "faceCrop";
2303
+ plateCrop: "plateCrop";
2304
+ keyFrameSmall: "keyFrameSmall";
2305
+ thumbnailSmall: "thumbnailSmall";
2306
+ }>;
2307
+ timestamp: z.ZodNumber;
2308
+ sizeBytes: z.ZodNumber;
2309
+ copied: z.ZodBoolean;
2310
+ }, z.core.$strip>>>;
2311
+ copies: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2312
+ frameId: z.ZodString;
2313
+ deviceId: z.ZodNumber;
2314
+ trackId: z.ZodString;
2315
+ sourceMediaKey: z.ZodString;
2316
+ sourceKind: z.ZodEnum<{
2317
+ snapshot: "snapshot";
2318
+ crop: "crop";
2319
+ keyFrame: "keyFrame";
2320
+ thumbnail: "thumbnail";
2321
+ firstFrame: "firstFrame";
2322
+ lastFrame: "lastFrame";
2323
+ fullFrame: "fullFrame";
2324
+ fullFrameBoxed: "fullFrameBoxed";
2325
+ faceCrop: "faceCrop";
2326
+ plateCrop: "plateCrop";
2327
+ keyFrameSmall: "keyFrameSmall";
2328
+ thumbnailSmall: "thumbnailSmall";
2329
+ }>;
2330
+ sizeBytes: z.ZodNumber;
2331
+ width: z.ZodNumber;
2332
+ height: z.ZodNumber;
2333
+ copiedAt: z.ZodNumber;
2334
+ }, z.core.$strip>>>;
2335
+ autoPickMediaKey: z.ZodOptional<z.ZodString>;
2336
+ }, z.core.$strip>, "query">;
2337
+ /**
2338
+ * COPY-ON-SELECT — the write that makes `trained` safe to evict.
2339
+ *
2340
+ * Selecting a frame copies its bytes into retrain storage immediately: not
2341
+ * a reference, not a lease. Once the copy exists the dataset no longer
2342
+ * depends on the track's media, which is exactly what lets D81 hand a
2343
+ * `trained` track back to retention.
2344
+ *
2345
+ * The order inside is load-bearing and is pinned by a test: an EXISTING
2346
+ * copy is returned without touching the source, so an original that
2347
+ * evaporated blocks the selection of THAT ORIGINAL and never the copy
2348
+ * already taken. Every refusal comes back named — a dropped selection is
2349
+ * never silent, on the wire or in the log.
2350
+ */
2351
+ readonly selectRetrainFrames: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2352
+ deviceId: z.ZodNumber;
2353
+ trackId: z.ZodString;
2354
+ mediaKeys: z.ZodArray<z.ZodString>;
2355
+ }, z.core.$strip>, z.ZodObject<{
2356
+ copied: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2357
+ frameId: z.ZodString;
2358
+ deviceId: z.ZodNumber;
2359
+ trackId: z.ZodString;
2360
+ sourceMediaKey: z.ZodString;
2361
+ sourceKind: z.ZodEnum<{
2362
+ snapshot: "snapshot";
2363
+ crop: "crop";
2364
+ keyFrame: "keyFrame";
2365
+ thumbnail: "thumbnail";
2366
+ firstFrame: "firstFrame";
2367
+ lastFrame: "lastFrame";
2368
+ fullFrame: "fullFrame";
2369
+ fullFrameBoxed: "fullFrameBoxed";
2370
+ faceCrop: "faceCrop";
2371
+ plateCrop: "plateCrop";
2372
+ keyFrameSmall: "keyFrameSmall";
2373
+ thumbnailSmall: "thumbnailSmall";
2374
+ }>;
2375
+ sizeBytes: z.ZodNumber;
2376
+ width: z.ZodNumber;
2377
+ height: z.ZodNumber;
2378
+ copiedAt: z.ZodNumber;
2379
+ }, z.core.$strip>>>;
2380
+ refused: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2381
+ sourceMediaKey: z.ZodString;
2382
+ reason: z.ZodEnum<{
2383
+ "source-missing": "source-missing";
2384
+ "unreadable-image": "unreadable-image";
2385
+ "write-failed": "write-failed";
2386
+ }>;
2387
+ }, z.core.$strip>>>;
2388
+ }, z.core.$strip>, "mutation">;
2389
+ /** Un-select a frame: its annotations go first, then the copy and its blob.
2390
+ * Deliberately destructive and deliberately explicit — it is the only way
2391
+ * a frame leaves the dataset before export. */
2392
+ readonly deselectRetrainFrame: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2393
+ deviceId: z.ZodNumber;
2394
+ trackId: z.ZodString;
2395
+ frameId: z.ZodString;
2396
+ }, z.core.$strip>, z.ZodObject<{
2397
+ removed: z.ZodBoolean;
2398
+ removedAnnotations: z.ZodNumber;
2399
+ }, z.core.$strip>, "mutation">;
2400
+ /**
2401
+ * The pixels of ONE copied frame, base64.
2402
+ *
2403
+ * Through the cap rather than a data plane because it is genuinely one
2404
+ * frame at a time, on demand, at human speed — the shape D9/D18 permit
2405
+ * (what they forbid is frames crossing a boundary at frame RATE). The
2406
+ * annotation canvas needs the image and its exact dimensions in the same
2407
+ * answer: a canvas that places a normalised box against a size it guessed
2408
+ * draws every box in the wrong place.
2409
+ */
2410
+ readonly getRetrainFrameImage: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2411
+ frameId: z.ZodString;
2412
+ }, z.core.$strip>, z.ZodObject<{
2413
+ base64: z.ZodString;
2414
+ width: z.ZodNumber;
2415
+ height: z.ZodNumber;
2416
+ }, z.core.$strip>, "query">;
2417
+ /**
2418
+ * Ask the pipeline what it sees, as a PROPOSAL.
2419
+ *
2420
+ * Runs through `pipelineRunner.runStatelessStep` on the COPIED frame, and
2421
+ * every box comes back as a draft with `source: 'assist'` plus the model and
2422
+ * score that produced it. The operator confirms, edits, adds and deletes;
2423
+ * nothing is stored until `saveRetrainAnnotations`.
2424
+ *
2425
+ * For packages the request is `rfdetr-package` on the ZONE CROP at 0.35 —
2426
+ * never the whole frame, where a package detector at that threshold proposes
2427
+ * furniture. A package request with no zone is REFUSED rather than widened,
2428
+ * because the silent widening would look like a bad model for as long as
2429
+ * nobody checked which rectangle it ran on.
2430
+ */
2431
+ readonly proposeRetrainAnnotations: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2432
+ deviceId: z.ZodNumber;
2433
+ trackId: z.ZodString;
2434
+ frameId: z.ZodString;
2435
+ subject: z.ZodDiscriminatedUnion<[z.ZodObject<{
2436
+ kind: z.ZodLiteral<"package">;
2437
+ zone: z.ZodOptional<z.ZodObject<{
2438
+ x: z.ZodNumber;
2439
+ y: z.ZodNumber;
2440
+ w: z.ZodNumber;
2441
+ h: z.ZodNumber;
2442
+ }, z.core.$strip>>;
2443
+ }, z.core.$strip>, z.ZodObject<{
2444
+ kind: z.ZodLiteral<"objects">;
2445
+ modelId: z.ZodString;
2446
+ minScore: z.ZodOptional<z.ZodNumber>;
2447
+ }, z.core.$strip>], "kind">;
2448
+ nodeId: z.ZodOptional<z.ZodString>;
2449
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
2450
+ kind: z.ZodLiteral<"proposed">;
2451
+ modelId: z.ZodString;
2452
+ stepId: z.ZodString;
2453
+ minScore: z.ZodNumber;
2454
+ proposals: z.ZodReadonly<z.ZodArray<z.ZodObject<{
2455
+ label: z.ZodOptional<z.ZodString>;
2456
+ kind: z.ZodEnum<{
2457
+ subject: "subject";
2458
+ model_error: "model_error";
2459
+ }>;
2460
+ source: z.ZodEnum<{
2461
+ operator: "operator";
2462
+ assist: "assist";
2463
+ }>;
2464
+ bbox: z.ZodObject<{
2465
+ x: z.ZodNumber;
2466
+ y: z.ZodNumber;
2467
+ w: z.ZodNumber;
2468
+ h: z.ZodNumber;
2469
+ }, z.core.$strip>;
2470
+ macroClass: z.ZodEnum<{
2471
+ person: "person";
2472
+ vehicle: "vehicle";
2473
+ animal: "animal";
2474
+ face: "face";
2475
+ plate: "plate";
2476
+ package: "package";
2477
+ }>;
2478
+ subLabel: z.ZodOptional<z.ZodString>;
2479
+ assistModelId: z.ZodOptional<z.ZodString>;
2480
+ assistScore: z.ZodOptional<z.ZodNumber>;
2481
+ }, z.core.$strip>>>;
2482
+ belowThreshold: z.ZodNumber;
2483
+ }, z.core.$strip>, z.ZodObject<{
2484
+ kind: z.ZodLiteral<"refused">;
2485
+ reason: z.ZodString;
2486
+ detail: z.ZodOptional<z.ZodString>;
2487
+ }, z.core.$strip>], "kind">, "mutation">;
2488
+ /** Every annotation on a track, oldest first. */
2489
+ readonly listRetrainAnnotations: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2490
+ trackId: z.ZodString;
2491
+ }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
2492
+ id: z.ZodString;
2493
+ trackId: z.ZodString;
2494
+ deviceId: z.ZodNumber;
2495
+ mediaKey: z.ZodString;
2496
+ bbox: z.ZodObject<{
2497
+ x: z.ZodNumber;
2498
+ y: z.ZodNumber;
2499
+ w: z.ZodNumber;
2500
+ h: z.ZodNumber;
2501
+ }, z.core.$strip>;
2502
+ macroClass: z.ZodEnum<{
2503
+ person: "person";
2504
+ vehicle: "vehicle";
2505
+ animal: "animal";
2506
+ face: "face";
2507
+ plate: "plate";
2508
+ package: "package";
2509
+ }>;
2510
+ label: z.ZodOptional<z.ZodString>;
2511
+ subLabel: z.ZodOptional<z.ZodString>;
2512
+ kind: z.ZodEnum<{
2513
+ subject: "subject";
2514
+ model_error: "model_error";
2515
+ }>;
2516
+ source: z.ZodEnum<{
2517
+ operator: "operator";
2518
+ assist: "assist";
2519
+ }>;
2520
+ assistModelId: z.ZodOptional<z.ZodString>;
2521
+ assistScore: z.ZodOptional<z.ZodNumber>;
2522
+ exportedInBatch: z.ZodOptional<z.ZodString>;
2523
+ createdAt: z.ZodNumber;
2524
+ }, z.core.$strip>>>, "query">;
2525
+ /**
2526
+ * Replace EVERY annotation on one frame with the supplied set.
2527
+ *
2528
+ * Whole-frame replacement, not per-box upsert: the unit of ground truth is
2529
+ * the frame, and "the operator deleted a box" must be the same durable
2530
+ * outcome as "the operator never drew it". A per-box patch would let a frame
2531
+ * keep a box the operator removed on a surface that only knew about the
2532
+ * boxes it sent.
2533
+ *
2534
+ * Refuses a macro class typed into `label` or `subLabel` — the tiers are
2535
+ * separate and the guard is at the WRITE, because a mixed taxonomy cannot
2536
+ * be un-mixed by reading it.
2537
+ */
2538
+ readonly saveRetrainAnnotations: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2539
+ deviceId: z.ZodNumber;
2540
+ trackId: z.ZodString;
2541
+ frameId: z.ZodString;
2542
+ annotations: z.ZodArray<z.ZodObject<{
2543
+ label: z.ZodOptional<z.ZodString>;
2544
+ kind: z.ZodEnum<{
2545
+ subject: "subject";
2546
+ model_error: "model_error";
2547
+ }>;
2548
+ source: z.ZodEnum<{
2549
+ operator: "operator";
2550
+ assist: "assist";
2551
+ }>;
2552
+ bbox: z.ZodObject<{
2553
+ x: z.ZodNumber;
2554
+ y: z.ZodNumber;
2555
+ w: z.ZodNumber;
2556
+ h: z.ZodNumber;
2557
+ }, z.core.$strip>;
2558
+ macroClass: z.ZodEnum<{
2559
+ person: "person";
2560
+ vehicle: "vehicle";
2561
+ animal: "animal";
2562
+ face: "face";
2563
+ plate: "plate";
2564
+ package: "package";
2565
+ }>;
2566
+ subLabel: z.ZodOptional<z.ZodString>;
2567
+ assistModelId: z.ZodOptional<z.ZodString>;
2568
+ assistScore: z.ZodOptional<z.ZodNumber>;
2569
+ }, z.core.$strip>>;
2570
+ }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
2571
+ id: z.ZodString;
2572
+ trackId: z.ZodString;
2573
+ deviceId: z.ZodNumber;
2574
+ mediaKey: z.ZodString;
2575
+ bbox: z.ZodObject<{
2576
+ x: z.ZodNumber;
2577
+ y: z.ZodNumber;
2578
+ w: z.ZodNumber;
2579
+ h: z.ZodNumber;
2580
+ }, z.core.$strip>;
2581
+ macroClass: z.ZodEnum<{
2582
+ person: "person";
2583
+ vehicle: "vehicle";
2584
+ animal: "animal";
2585
+ face: "face";
2586
+ plate: "plate";
2587
+ package: "package";
2588
+ }>;
2589
+ label: z.ZodOptional<z.ZodString>;
2590
+ subLabel: z.ZodOptional<z.ZodString>;
2591
+ kind: z.ZodEnum<{
2592
+ subject: "subject";
2593
+ model_error: "model_error";
2594
+ }>;
2595
+ source: z.ZodEnum<{
2596
+ operator: "operator";
2597
+ assist: "assist";
2598
+ }>;
2599
+ assistModelId: z.ZodOptional<z.ZodString>;
2600
+ assistScore: z.ZodOptional<z.ZodNumber>;
2601
+ exportedInBatch: z.ZodOptional<z.ZodString>;
2602
+ createdAt: z.ZodNumber;
2603
+ }, z.core.$strip>>>, "mutation">;
2604
+ /**
2605
+ * Finish with a track: `staging → trained`. **The only writer of that
2606
+ * state** — D81 shipped the column with it deliberately unreachable.
2607
+ *
2608
+ * Refuses a track the dataset holds no copies from. `trained` un-pins the
2609
+ * track's media, so completing without a copy is a delete order for material
2610
+ * nothing ever extracted anything from; that refusal IS the safety argument
2611
+ * of D81, expressed as a precondition.
2612
+ */
2613
+ readonly completeRetrainTrack: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2614
+ deviceId: z.ZodNumber;
2615
+ trackId: z.ZodString;
2616
+ }, z.core.$strip>, z.ZodObject<{
2617
+ trackId: z.ZodString;
2618
+ retrainStatus: z.ZodEnum<{
2619
+ none: "none";
2620
+ staging: "staging";
2621
+ trained: "trained";
2622
+ }>;
2623
+ changed: z.ZodBoolean;
2624
+ reason: z.ZodOptional<z.ZodEnum<{
2625
+ unchanged: "unchanged";
2626
+ "unknown-track": "unknown-track";
2627
+ "no-frames-copied": "no-frames-copied";
2628
+ "not-staging": "not-staging";
2629
+ "not-trained": "not-trained";
2630
+ }>>;
2631
+ }, z.core.$strip>, "mutation">;
2632
+ /**
2633
+ * The deliberate return: `trained → staging`, for the rare case.
2634
+ *
2635
+ * The generic `setTrackFlags` toggle refuses this in both directions by
2636
+ * design (D81) — re-staging from a checkbox is how the same material gets
2637
+ * annotated twice under two ground truths. Doing it here means the operator
2638
+ * is looking at the annotations that already exist while they decide, and
2639
+ * those annotations are LEFT ALONE: "put this back" must not be a
2640
+ * destructive act wearing a navigational name.
2641
+ */
2642
+ readonly restageRetrainTrack: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2643
+ deviceId: z.ZodNumber;
2644
+ trackId: z.ZodString;
2645
+ }, z.core.$strip>, z.ZodObject<{
2646
+ trackId: z.ZodString;
2647
+ retrainStatus: z.ZodEnum<{
2648
+ none: "none";
2649
+ staging: "staging";
2650
+ trained: "trained";
2651
+ }>;
2652
+ changed: z.ZodBoolean;
2653
+ reason: z.ZodOptional<z.ZodEnum<{
2654
+ unchanged: "unchanged";
2655
+ "unknown-track": "unknown-track";
2656
+ "no-frames-copied": "no-frames-copied";
2657
+ "not-staging": "not-staging";
2658
+ "not-trained": "not-trained";
2659
+ }>>;
2660
+ }, z.core.$strip>, "mutation">;
2661
+ /**
2662
+ * Where to download the ANNOTATED dataset.
2663
+ *
2664
+ * The sibling of `getTrainingExportUrl` and deliberately not the same
2665
+ * archive: that one streams a marked track's stored media verbatim, this one
2666
+ * streams the retrain COPIES plus an `annotations.json` carrying, for every
2667
+ * subject, the canonical full-frame box AND the geometry derived for each
2668
+ * model shape (letterboxed root / zone-cropped package / subject-cropped
2669
+ * classifier). Derived at export, never stored — one box in, three shapes
2670
+ * out, so two crops of the same subject can never end up in one feature
2671
+ * space (D52).
2672
+ */
2673
+ readonly getRetrainExportUrl: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2674
+ deviceIds: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
2675
+ }, z.core.$strip>, z.ZodObject<{
2676
+ url: z.ZodString;
2677
+ }, z.core.$strip>, "query">;
1573
2678
  readonly getEventMedia: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1574
2679
  eventId: z.ZodString;
1575
2680
  kind: z.ZodOptional<z.ZodEnum<{
@@ -1699,15 +2804,6 @@ export declare const pipelineAnalyticsCapability: {
1699
2804
  limit: z.ZodDefault<z.ZodNumber>;
1700
2805
  minScore: z.ZodDefault<z.ZodNumber>;
1701
2806
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1702
- kind: z.ZodLiteral<"object">;
1703
- source: z.ZodOptional<z.ZodEnum<{
1704
- pipeline: "pipeline";
1705
- onboard: "onboard";
1706
- }>>;
1707
- frameId: z.ZodOptional<z.ZodString>;
1708
- trackId: z.ZodOptional<z.ZodString>;
1709
- className: z.ZodString;
1710
- label: z.ZodOptional<z.ZodString>;
1711
2807
  confidence: z.ZodOptional<z.ZodNumber>;
1712
2808
  bbox: z.ZodOptional<z.ZodObject<{
1713
2809
  x: z.ZodNumber;
@@ -1737,6 +2833,28 @@ export declare const pipelineAnalyticsCapability: {
1737
2833
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
1738
2834
  mediaUrl: z.ZodOptional<z.ZodString>;
1739
2835
  importance: z.ZodOptional<z.ZodNumber>;
2836
+ label: z.ZodOptional<z.ZodString>;
2837
+ labelScore: z.ZodOptional<z.ZodNumber>;
2838
+ labelMeta: z.ZodOptional<z.ZodObject<{
2839
+ stepId: z.ZodString;
2840
+ modelId: z.ZodOptional<z.ZodString>;
2841
+ decidedAt: z.ZodNumber;
2842
+ }, z.core.$strip>>;
2843
+ subLabel: z.ZodOptional<z.ZodString>;
2844
+ subLabelScore: z.ZodOptional<z.ZodNumber>;
2845
+ subLabelMeta: z.ZodOptional<z.ZodObject<{
2846
+ stepId: z.ZodString;
2847
+ modelId: z.ZodOptional<z.ZodString>;
2848
+ decidedAt: z.ZodNumber;
2849
+ }, z.core.$strip>>;
2850
+ kind: z.ZodLiteral<"object">;
2851
+ source: z.ZodOptional<z.ZodEnum<{
2852
+ pipeline: "pipeline";
2853
+ onboard: "onboard";
2854
+ }>>;
2855
+ frameId: z.ZodOptional<z.ZodString>;
2856
+ trackId: z.ZodOptional<z.ZodString>;
2857
+ className: z.ZodString;
1740
2858
  id: z.ZodString;
1741
2859
  deviceId: z.ZodNumber;
1742
2860
  timestamp: z.ZodNumber;