@camstack/types 1.2.44 → 1.2.46

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.
@@ -298,6 +298,42 @@ export declare const TrackFlagsSchema: z.ZodObject<{
298
298
  }>;
299
299
  }, z.core.$strip>;
300
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>;
301
337
  /** Per-camera slice of a training-export estimate. */
302
338
  export declare const TrainingExportDeviceTotalsSchema: z.ZodObject<{
303
339
  deviceId: z.ZodNumber;
@@ -332,10 +368,6 @@ declare const TrackSchema: z.ZodObject<{
332
368
  }>>;
333
369
  markForTrain: z.ZodOptional<z.ZodBoolean>;
334
370
  debug: z.ZodOptional<z.ZodBoolean>;
335
- trackId: z.ZodString;
336
- deviceId: z.ZodNumber;
337
- className: z.ZodString;
338
- label: z.ZodOptional<z.ZodString>;
339
371
  producingDeviceName: z.ZodOptional<z.ZodString>;
340
372
  source: z.ZodOptional<z.ZodEnum<{
341
373
  sensor: "sensor";
@@ -397,6 +429,23 @@ declare const TrackSchema: z.ZodObject<{
397
429
  maxX: z.ZodNumber;
398
430
  maxY: z.ZodNumber;
399
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;
400
449
  }, z.core.$strip>;
401
450
  export type Track = z.infer<typeof TrackSchema>;
402
451
  declare const MotionEventSchema: z.ZodObject<{
@@ -471,15 +520,6 @@ export declare const ZoneCrossingSchema: z.ZodObject<{
471
520
  }, z.core.$strip>;
472
521
  export type ZoneCrossing = z.infer<typeof ZoneCrossingSchema>;
473
522
  declare const ObjectEventSchema: z.ZodObject<{
474
- kind: z.ZodLiteral<"object">;
475
- source: z.ZodOptional<z.ZodEnum<{
476
- pipeline: "pipeline";
477
- onboard: "onboard";
478
- }>>;
479
- frameId: z.ZodOptional<z.ZodString>;
480
- trackId: z.ZodOptional<z.ZodString>;
481
- className: z.ZodString;
482
- label: z.ZodOptional<z.ZodString>;
483
523
  confidence: z.ZodOptional<z.ZodNumber>;
484
524
  bbox: z.ZodOptional<z.ZodObject<{
485
525
  x: z.ZodNumber;
@@ -509,6 +549,28 @@ declare const ObjectEventSchema: z.ZodObject<{
509
549
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
510
550
  mediaUrl: z.ZodOptional<z.ZodString>;
511
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;
512
574
  id: z.ZodString;
513
575
  deviceId: z.ZodNumber;
514
576
  timestamp: z.ZodNumber;
@@ -597,6 +659,337 @@ declare const MediaFileInfoSchema: z.ZodObject<{
597
659
  sizeBytes: z.ZodNumber;
598
660
  }, z.core.$strip>;
599
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>;
600
993
  declare const RecentTracksQueryInput: z.ZodObject<{
601
994
  deviceIds: z.ZodArray<z.ZodNumber>;
602
995
  since: z.ZodOptional<z.ZodNumber>;
@@ -618,10 +1011,6 @@ declare const RecentTracksPageSchema: z.ZodObject<{
618
1011
  }>>;
619
1012
  markForTrain: z.ZodOptional<z.ZodBoolean>;
620
1013
  debug: z.ZodOptional<z.ZodBoolean>;
621
- trackId: z.ZodString;
622
- deviceId: z.ZodNumber;
623
- className: z.ZodString;
624
- label: z.ZodOptional<z.ZodString>;
625
1014
  producingDeviceName: z.ZodOptional<z.ZodString>;
626
1015
  source: z.ZodOptional<z.ZodEnum<{
627
1016
  sensor: "sensor";
@@ -683,6 +1072,23 @@ declare const RecentTracksPageSchema: z.ZodObject<{
683
1072
  maxX: z.ZodNumber;
684
1073
  maxY: z.ZodNumber;
685
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;
686
1092
  }, z.core.$strip>>>;
687
1093
  nextCursor: z.ZodNullable<z.ZodString>;
688
1094
  }, z.core.$strip>;
@@ -695,14 +1101,27 @@ declare const KeyEventSchema: z.ZodObject<{
695
1101
  }>>;
696
1102
  markForTrain: z.ZodOptional<z.ZodBoolean>;
697
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>>;
698
1121
  id: z.ZodString;
699
1122
  trackId: z.ZodString;
700
1123
  timestamp: z.ZodNumber;
701
1124
  className: z.ZodString;
702
- label: z.ZodOptional<z.ZodString>;
703
- importance: z.ZodNumber;
704
- bestEventId: z.ZodString;
705
- windowMs: z.ZodOptional<z.ZodNumber>;
706
1125
  }, z.core.$strip>;
707
1126
  export type KeyEvent = z.infer<typeof KeyEventSchema>;
708
1127
  declare const TrackedDetectionSchema: z.ZodObject<{
@@ -725,15 +1144,6 @@ declare const TrackedDetectionSchema: z.ZodObject<{
725
1144
  }>;
726
1145
  }, z.core.$strip>;
727
1146
  export declare const ScoredObjectEventSchema: z.ZodObject<{
728
- kind: z.ZodLiteral<"object">;
729
- source: z.ZodOptional<z.ZodEnum<{
730
- pipeline: "pipeline";
731
- onboard: "onboard";
732
- }>>;
733
- frameId: z.ZodOptional<z.ZodString>;
734
- trackId: z.ZodOptional<z.ZodString>;
735
- className: z.ZodString;
736
- label: z.ZodOptional<z.ZodString>;
737
1147
  confidence: z.ZodOptional<z.ZodNumber>;
738
1148
  bbox: z.ZodOptional<z.ZodObject<{
739
1149
  x: z.ZodNumber;
@@ -763,6 +1173,28 @@ export declare const ScoredObjectEventSchema: z.ZodObject<{
763
1173
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
764
1174
  mediaUrl: z.ZodOptional<z.ZodString>;
765
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;
766
1198
  id: z.ZodString;
767
1199
  deviceId: z.ZodNumber;
768
1200
  timestamp: z.ZodNumber;
@@ -822,10 +1254,6 @@ export declare const pipelineAnalyticsCapability: {
822
1254
  }>>;
823
1255
  markForTrain: z.ZodOptional<z.ZodBoolean>;
824
1256
  debug: z.ZodOptional<z.ZodBoolean>;
825
- trackId: z.ZodString;
826
- deviceId: z.ZodNumber;
827
- className: z.ZodString;
828
- label: z.ZodOptional<z.ZodString>;
829
1257
  producingDeviceName: z.ZodOptional<z.ZodString>;
830
1258
  source: z.ZodOptional<z.ZodEnum<{
831
1259
  sensor: "sensor";
@@ -887,6 +1315,23 @@ export declare const pipelineAnalyticsCapability: {
887
1315
  maxX: z.ZodNumber;
888
1316
  maxY: z.ZodNumber;
889
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;
890
1335
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
891
1336
  readonly getTrack: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
892
1337
  deviceId: z.ZodNumber;
@@ -899,10 +1344,6 @@ export declare const pipelineAnalyticsCapability: {
899
1344
  }>>;
900
1345
  markForTrain: z.ZodOptional<z.ZodBoolean>;
901
1346
  debug: z.ZodOptional<z.ZodBoolean>;
902
- trackId: z.ZodString;
903
- deviceId: z.ZodNumber;
904
- className: z.ZodString;
905
- label: z.ZodOptional<z.ZodString>;
906
1347
  producingDeviceName: z.ZodOptional<z.ZodString>;
907
1348
  source: z.ZodOptional<z.ZodEnum<{
908
1349
  sensor: "sensor";
@@ -964,6 +1405,23 @@ export declare const pipelineAnalyticsCapability: {
964
1405
  maxX: z.ZodNumber;
965
1406
  maxY: z.ZodNumber;
966
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;
967
1425
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
968
1426
  /** Historical completed tracks for a device. Queried from the
969
1427
  * persisted `pipeline-analytics:tracks` collection; active tracks
@@ -998,10 +1456,6 @@ export declare const pipelineAnalyticsCapability: {
998
1456
  }>>;
999
1457
  markForTrain: z.ZodOptional<z.ZodBoolean>;
1000
1458
  debug: z.ZodOptional<z.ZodBoolean>;
1001
- trackId: z.ZodString;
1002
- deviceId: z.ZodNumber;
1003
- className: z.ZodString;
1004
- label: z.ZodOptional<z.ZodString>;
1005
1459
  producingDeviceName: z.ZodOptional<z.ZodString>;
1006
1460
  source: z.ZodOptional<z.ZodEnum<{
1007
1461
  sensor: "sensor";
@@ -1063,6 +1517,23 @@ export declare const pipelineAnalyticsCapability: {
1063
1517
  maxX: z.ZodNumber;
1064
1518
  maxY: z.ZodNumber;
1065
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;
1066
1537
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
1067
1538
  /**
1068
1539
  * Batched cluster-wide track listing — ONE call for the events page /
@@ -1093,10 +1564,6 @@ export declare const pipelineAnalyticsCapability: {
1093
1564
  }>>;
1094
1565
  markForTrain: z.ZodOptional<z.ZodBoolean>;
1095
1566
  debug: z.ZodOptional<z.ZodBoolean>;
1096
- trackId: z.ZodString;
1097
- deviceId: z.ZodNumber;
1098
- className: z.ZodString;
1099
- label: z.ZodOptional<z.ZodString>;
1100
1567
  producingDeviceName: z.ZodOptional<z.ZodString>;
1101
1568
  source: z.ZodOptional<z.ZodEnum<{
1102
1569
  sensor: "sensor";
@@ -1158,6 +1625,23 @@ export declare const pipelineAnalyticsCapability: {
1158
1625
  maxX: z.ZodNumber;
1159
1626
  maxY: z.ZodNumber;
1160
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;
1161
1645
  }, z.core.$strip>>>;
1162
1646
  nextCursor: z.ZodNullable<z.ZodString>;
1163
1647
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
@@ -1204,15 +1688,6 @@ export declare const pipelineAnalyticsCapability: {
1204
1688
  }>>;
1205
1689
  classFilter: z.ZodOptional<z.ZodString>;
1206
1690
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1207
- kind: z.ZodLiteral<"object">;
1208
- source: z.ZodOptional<z.ZodEnum<{
1209
- pipeline: "pipeline";
1210
- onboard: "onboard";
1211
- }>>;
1212
- frameId: z.ZodOptional<z.ZodString>;
1213
- trackId: z.ZodOptional<z.ZodString>;
1214
- className: z.ZodString;
1215
- label: z.ZodOptional<z.ZodString>;
1216
1691
  confidence: z.ZodOptional<z.ZodNumber>;
1217
1692
  bbox: z.ZodOptional<z.ZodObject<{
1218
1693
  x: z.ZodNumber;
@@ -1242,6 +1717,28 @@ export declare const pipelineAnalyticsCapability: {
1242
1717
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
1243
1718
  mediaUrl: z.ZodOptional<z.ZodString>;
1244
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;
1245
1742
  id: z.ZodString;
1246
1743
  deviceId: z.ZodNumber;
1247
1744
  timestamp: z.ZodNumber;
@@ -1421,14 +1918,27 @@ export declare const pipelineAnalyticsCapability: {
1421
1918
  }>>;
1422
1919
  markForTrain: z.ZodOptional<z.ZodBoolean>;
1423
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>>;
1424
1938
  id: z.ZodString;
1425
1939
  trackId: z.ZodString;
1426
1940
  timestamp: z.ZodNumber;
1427
1941
  className: z.ZodString;
1428
- label: z.ZodOptional<z.ZodString>;
1429
- importance: z.ZodNumber;
1430
- bestEventId: z.ZodString;
1431
- windowMs: z.ZodOptional<z.ZodNumber>;
1432
1942
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
1433
1943
  /** Server-side bucketed event counts for the 24-hour timeline.
1434
1944
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
@@ -1737,6 +2247,434 @@ export declare const pipelineAnalyticsCapability: {
1737
2247
  }, z.core.$strip>, z.ZodObject<{
1738
2248
  url: z.ZodString;
1739
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">;
1740
2678
  readonly getEventMedia: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1741
2679
  eventId: z.ZodString;
1742
2680
  kind: z.ZodOptional<z.ZodEnum<{
@@ -1866,15 +2804,6 @@ export declare const pipelineAnalyticsCapability: {
1866
2804
  limit: z.ZodDefault<z.ZodNumber>;
1867
2805
  minScore: z.ZodDefault<z.ZodNumber>;
1868
2806
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1869
- kind: z.ZodLiteral<"object">;
1870
- source: z.ZodOptional<z.ZodEnum<{
1871
- pipeline: "pipeline";
1872
- onboard: "onboard";
1873
- }>>;
1874
- frameId: z.ZodOptional<z.ZodString>;
1875
- trackId: z.ZodOptional<z.ZodString>;
1876
- className: z.ZodString;
1877
- label: z.ZodOptional<z.ZodString>;
1878
2807
  confidence: z.ZodOptional<z.ZodNumber>;
1879
2808
  bbox: z.ZodOptional<z.ZodObject<{
1880
2809
  x: z.ZodNumber;
@@ -1904,6 +2833,28 @@ export declare const pipelineAnalyticsCapability: {
1904
2833
  keyFrameMediaKey: z.ZodOptional<z.ZodString>;
1905
2834
  mediaUrl: z.ZodOptional<z.ZodString>;
1906
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;
1907
2858
  id: z.ZodString;
1908
2859
  deviceId: z.ZodNumber;
1909
2860
  timestamp: z.ZodNumber;