@camstack/addon-admin-ui 1.1.49 → 1.1.51

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 (99) hide show
  1. package/dist/assets/{AddLocationWizard-Dz9GwK3X.js → AddLocationWizard-C5_TbCTT.js} +1 -1
  2. package/dist/assets/{AddonCollectionPage-CPIG1xIh.js → AddonCollectionPage-DdcqJdFw.js} +1 -1
  3. package/dist/assets/Addons-DENvhGXs.js +1 -0
  4. package/dist/assets/{AdminTabs-D5g4I7it.js → AdminTabs-rrSAZD3O.js} +1 -1
  5. package/dist/assets/AiProfiles-I6sx_kzO.js +1 -0
  6. package/dist/assets/{BrokerForm-BR4xZ9GV.js → BrokerForm-DL1TXr2B.js} +1 -1
  7. package/dist/assets/{Capabilities-CgH6yyV4.js → Capabilities-G9KINvPO.js} +1 -1
  8. package/dist/assets/CapabilityBadges-Q2qm_QNP.js +1 -0
  9. package/dist/assets/Cluster-D5fOIpSM.js +1 -0
  10. package/dist/assets/{Dashboard-BGWor0uh.js → Dashboard-B9Qq3GKN.js} +1 -1
  11. package/dist/assets/Data-F4Z7wulI.js +1 -0
  12. package/dist/assets/DetectionIntelligence-DysJUSVa.js +1 -0
  13. package/dist/assets/DeviceDetail-DnOzyoSG.js +2 -0
  14. package/dist/assets/{Devices-CQIttH5I.js → Devices-BbPVwY-D.js} +1 -1
  15. package/dist/assets/EmbedPlayerPage-DDKRlZMR.js +1 -0
  16. package/dist/assets/Events-CdArV4tl.js +1 -0
  17. package/dist/assets/{FormBuilder-CvDRhN0P.js → FormBuilder-vCzPEjPM.js} +1 -1
  18. package/dist/assets/Identity-Dmu7k7pC.js +1 -0
  19. package/dist/assets/IntegrationDetail-CXnSPpKp.js +1 -0
  20. package/dist/assets/{Integrations-CpvCTW8-.js → Integrations-AlnqolAL.js} +1 -1
  21. package/dist/assets/Integrations-BIx0NuFX.js +1 -0
  22. package/dist/assets/{Logs-BRxaQ_U_.js → Logs-CBDPfk6Z.js} +1 -1
  23. package/dist/assets/{MotionZonesSettings-rCwGI64Z.js → MotionZonesSettings-CFYI6s-_.js} +1 -1
  24. package/dist/assets/{MyAccess-CkYg7_Ir.js → MyAccess-6qmJkzue.js} +1 -1
  25. package/dist/assets/Network-CX6T3X7F.js +1 -0
  26. package/dist/assets/{NodeAddonsSettingsPanel-DLaqbqbL.js → NodeAddonsSettingsPanel-CynxbOEk.js} +1 -1
  27. package/dist/assets/NotificationTargets-DFmIRZfI.js +1 -0
  28. package/dist/assets/Pipeline-HtfEITUn.js +1 -0
  29. package/dist/assets/{PrivacyMaskSettings-DXSWRyvI.js → PrivacyMaskSettings-CbVO58Pz.js} +1 -1
  30. package/dist/assets/{ProviderIcon-CU_LjfQm.js → ProviderIcon-Bc8wWWqT.js} +1 -1
  31. package/dist/assets/{ScanNetworkModal-P7eJ4JF2.js → ScanNetworkModal-Bxjqv5aL.js} +1 -1
  32. package/dist/assets/{ServerManagement-Bu1zXR_P.js → ServerManagement-QTJJqUUL.js} +1 -1
  33. package/dist/assets/{Settings-CEmGDN3Y.js → Settings-DdHS4and.js} +1 -1
  34. package/dist/assets/{Showroom-nfSg2aKy.js → Showroom-BPudQyp1.js} +1 -1
  35. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-Dks9ZX4F.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DzuuqQDr.js} +1 -1
  36. package/dist/assets/authed-media-XfBD4Ma-.js +1 -0
  37. package/dist/assets/{build-cluster-graph-CeRMttjo.js → build-cluster-graph-C8acdV1N.js} +2 -2
  38. package/dist/assets/circle-check-big-Ci2qKS9O.js +1 -0
  39. package/dist/assets/clock-DvPVZaz2.js +1 -0
  40. package/dist/assets/{copy-CBUp-aR5.js → copy-jHaoig1Z.js} +1 -1
  41. package/dist/assets/debounced-invalidate-BtUOLpbU.js +1 -0
  42. package/dist/assets/dist-BpbjPYkI.js +7 -0
  43. package/dist/assets/{dist-buVqWnnL.js → dist-D9oUwgkq.js} +1 -1
  44. package/dist/assets/{download-CYT0fAUg.js → download-B8Uv2BOb.js} +1 -1
  45. package/dist/assets/film-CzfyiWOL.js +1 -0
  46. package/dist/assets/{hostInit-Bk1ezl81.js → hostInit-DY1mt8Vv.js} +1 -1
  47. package/dist/assets/index-CRBZZNxE.css +2 -0
  48. package/dist/assets/index-msAq9OfF.js +4 -0
  49. package/dist/assets/{key-round-BgzoboJl.js → key-round-B1u42XSy.js} +1 -1
  50. package/dist/assets/{mf-entry-bootstrap-0-9540ab68.js → mf-entry-bootstrap-0-3bf5f308.js} +2 -2
  51. package/dist/assets/{pencil-BQxsIcr8.js → pencil-BEjUgvtJ.js} +1 -1
  52. package/dist/assets/{player-overlays-DwbK2Bhn.js → player-overlays-DzoWZHnz.js} +1 -1
  53. package/dist/assets/plus-CDCmEkS2.js +1 -0
  54. package/dist/assets/{radio-BO71WGgk.js → radio-CvK77vEM.js} +1 -1
  55. package/dist/assets/{refresh-cw-wjVnPKQ-.js → refresh-cw-BoM3__QD.js} +1 -1
  56. package/dist/assets/remoteEntry-Bm4uDKFt.js +1 -0
  57. package/dist/assets/{rotate-ccw-08G_t-S-.js → rotate-ccw-CG8Dl-0A.js} +1 -1
  58. package/dist/assets/rotate-cw-BcZwqoT5.js +1 -0
  59. package/dist/assets/{schemas-CuE8EXQ7.js → schemas-DSTjX9zr.js} +4 -4
  60. package/dist/assets/search-Dh7U_-43.js +1 -0
  61. package/dist/assets/send-DdbXLRkn.js +1 -0
  62. package/dist/assets/square-Mc9QW6dp.js +1 -0
  63. package/dist/assets/{square-check-big-vHolvNm8.js → square-check-big-BIo_99Ss.js} +1 -1
  64. package/dist/assets/src-B_-PRq3y.js +67 -0
  65. package/dist/assets/src-DYmw2iAG.js +7 -0
  66. package/dist/assets/{upload-BzEvIjFG.js → upload-DUlWrtL9.js} +1 -1
  67. package/dist/assets/{useDevice-DsFNX4hK.js → useDevice-CDxSSKpG.js} +1 -1
  68. package/dist/assets/{useEventInvalidation-sogITDGH.js → useEventInvalidation-Bwynn5Fd.js} +1 -1
  69. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DaYJFh3Y.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CmeeGMkM.js} +2 -2
  70. package/dist/assets/{wifi-D2DUPSjR.js → wifi-CW0cSDNa.js} +1 -1
  71. package/dist/assets/{zap-DpaieZgs.js → zap-CPf6Bdf3.js} +1 -1
  72. package/dist/index.html +7 -7
  73. package/dist/server/addon.js +987 -41
  74. package/package.json +2 -1
  75. package/dist/assets/Addons-BVoEWQqv.js +0 -1
  76. package/dist/assets/CapabilityBadges-DTQZ0aly.js +0 -1
  77. package/dist/assets/Cluster-Dc8m2Nu_.js +0 -1
  78. package/dist/assets/Data-Cb4_Oaed.js +0 -1
  79. package/dist/assets/DetectionIntelligence-CfZ37xjp.js +0 -1
  80. package/dist/assets/DeviceDetail-BkHwKCpH.js +0 -2
  81. package/dist/assets/EmbedPlayerPage-C1yR1-sh.js +0 -1
  82. package/dist/assets/Identity-DGjKIPeq.js +0 -1
  83. package/dist/assets/IntegrationDetail-CrkNK-Hf.js +0 -1
  84. package/dist/assets/Integrations-D8q33Wah.js +0 -1
  85. package/dist/assets/Network-CFnhAtCA.js +0 -1
  86. package/dist/assets/NotificationTargets-D29cZR2T.js +0 -1
  87. package/dist/assets/Pipeline-V9nILBzv.js +0 -1
  88. package/dist/assets/circle-check-big-Dqebmb1c.js +0 -1
  89. package/dist/assets/dist-Drk1jDUF.js +0 -7
  90. package/dist/assets/index-BFJ6KO0x.css +0 -2
  91. package/dist/assets/index-DS1f1ju4.js +0 -4
  92. package/dist/assets/plus-CqKOQ1Hi.js +0 -1
  93. package/dist/assets/remoteEntry-8u5R_pK8.js +0 -1
  94. package/dist/assets/rotate-cw-bd1bkxca.js +0 -1
  95. package/dist/assets/search-Cuq_Otgb.js +0 -1
  96. package/dist/assets/sparkles-AJHBDXs0.js +0 -1
  97. package/dist/assets/square-B8TB8cnk.js +0 -1
  98. package/dist/assets/src-Bt1nDoRU.js +0 -7
  99. package/dist/assets/src-DdAjHIAX.js +0 -67
@@ -4288,6 +4288,14 @@ function object(shape, params) {
4288
4288
  ...normalizeParams(params)
4289
4289
  });
4290
4290
  }
4291
+ function looseObject(shape, params) {
4292
+ return new ZodObject({
4293
+ type: "object",
4294
+ shape,
4295
+ catchall: unknown(),
4296
+ ...normalizeParams(params)
4297
+ });
4298
+ }
4291
4299
  var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
4292
4300
  $ZodUnion.init(inst, def);
4293
4301
  ZodType.init(inst, def);
@@ -4629,7 +4637,7 @@ function _instanceof(cls, params = {}) {
4629
4637
  return inst;
4630
4638
  }
4631
4639
  //#endregion
4632
- //#region ../types/dist/sleep-BC9Yqte7.mjs
4640
+ //#region ../types/dist/sleep-DkhOVOjW.mjs
4633
4641
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4634
4642
  EventCategory["SystemBoot"] = "system.boot";
4635
4643
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5039,10 +5047,43 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5039
5047
  EventCategory["EnrichmentEmbeddingStored"] = "enrichment.embedding.stored";
5040
5048
  EventCategory["EnrichmentSceneStateChanged"] = "enrichment.scene.state-changed";
5041
5049
  EventCategory["EnrichmentActivitySummary"] = "enrichment.activity.summary";
5050
+ /**
5051
+ * Unified track-lifecycle event: ONE category carrying `phase:
5052
+ * 'start' | 'update' | 'end'` with a rich, typed
5053
+ * `PipelineAnalyticsTrackLifecyclePayload`. Supersedes the thin
5054
+ * `PipelineAnalyticsTrackStarted` / `PipelineAnalyticsTrackEnded`
5055
+ * pair — a consumer subscribes once and branches on `phase`.
5056
+ */
5057
+ EventCategory["PipelineAnalyticsTrackLifecycle"] = "pipeline-analytics.track-lifecycle";
5058
+ /**
5059
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5060
+ * (`phase:'start'`). Kept as a soft alias — no known subscribers.
5061
+ */
5042
5062
  EventCategory["PipelineAnalyticsTrackStarted"] = "pipeline-analytics.track-started";
5063
+ /**
5064
+ * @deprecated Superseded by {@link PipelineAnalyticsTrackLifecycle}
5065
+ * (`phase:'end'`). Kept as a soft alias — no known subscribers.
5066
+ */
5043
5067
  EventCategory["PipelineAnalyticsTrackEnded"] = "pipeline-analytics.track-ended";
5044
5068
  EventCategory["PipelineAnalyticsDetectionEvent"] = "pipeline-analytics.detection-event";
5045
5069
  EventCategory["PipelineAnalyticsFrameTracked"] = "pipeline-analytics.frame-tracked";
5070
+ /**
5071
+ * Fired by `addon-post-analysis` whenever a gallery face row changes:
5072
+ * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
5073
+ * `'unassigned'` its identity link changed, `'deleted'` the row was
5074
+ * removed. Telemetry semantics (D8): a lost event only delays a refresh,
5075
+ * never a correctness issue. Payload `PipelineAnalyticsFaceGalleryChangedPayload`.
5076
+ */
5077
+ EventCategory["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
5078
+ /**
5079
+ * Fired by `addon-post-analysis` whenever a gallery plate row changes:
5080
+ * `kind:'buffered'` a new read was persisted (`PlateRecognizer.onTrackEnd`),
5081
+ * `'assigned'` / `'unassigned'` its vehicle link changed
5082
+ * (`PlateGalleryProvider`), `'deleted'` the row was removed. Telemetry
5083
+ * semantics (D8): a lost event only delays a refresh, never a correctness
5084
+ * issue. Payload `PipelineAnalyticsPlateGalleryChangedPayload`.
5085
+ */
5086
+ EventCategory["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
5046
5087
  EventCategory["FrigateLiveEvent"] = "frigate.live-event";
5047
5088
  EventCategory["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
5048
5089
  /**
@@ -6880,7 +6921,8 @@ var MODEL_FORMATS = [
6880
6921
  "coreml",
6881
6922
  "openvino",
6882
6923
  "tflite",
6883
- "pt"
6924
+ "pt",
6925
+ "gguf"
6884
6926
  ];
6885
6927
  /**
6886
6928
  * Multi-file format payload.
@@ -6924,7 +6966,8 @@ var ModelFormatsSchema = object({
6924
6966
  coreml: ModelFormatEntrySchema.optional(),
6925
6967
  openvino: ModelFormatEntrySchema.optional(),
6926
6968
  tflite: ModelFormatEntrySchema.optional(),
6927
- pt: ModelFormatEntrySchema.optional()
6969
+ pt: ModelFormatEntrySchema.optional(),
6970
+ gguf: ModelFormatEntrySchema.optional()
6928
6971
  });
6929
6972
  /**
6930
6973
  * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
@@ -10419,7 +10462,8 @@ var ModelFormatSchema$1 = _enum([
10419
10462
  "coreml",
10420
10463
  "openvino",
10421
10464
  "tflite",
10422
- "pt"
10465
+ "pt",
10466
+ "gguf"
10423
10467
  ]);
10424
10468
  var PipelineSlotSchema = _enum([
10425
10469
  "detector",
@@ -10674,7 +10718,15 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
10674
10718
  image: _instanceof(Uint8Array).optional(),
10675
10719
  referenceImage: string().optional(),
10676
10720
  deviceId: number().optional(),
10677
- sessionId: string().optional()
10721
+ sessionId: string().optional(),
10722
+ /**
10723
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
10724
+ * reference-image, and detail-subtree calls. 'frame' is the live
10725
+ * per-frame dispatch: ONLY root-plane steps run; crop children
10726
+ * (inputClasses ≠ null) are skipped and served per-track via
10727
+ * pipelineRunner.runDetailSubtree (two-plane design).
10728
+ */
10729
+ plane: _enum(["full", "frame"]).optional()
10678
10730
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
10679
10731
  engine: PipelineEngineChoiceSchema.optional(),
10680
10732
  steps: array(PipelineStepInputSchema).min(1),
@@ -10817,6 +10869,28 @@ var NativeCropResultSchema = object({
10817
10869
  width: number().int().positive(),
10818
10870
  height: number().int().positive()
10819
10871
  });
10872
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
10873
+ * originating detection, in FRAME-space coordinates. Reuses
10874
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
10875
+ * the coordinates are frame-space rather than getNativeCrop's
10876
+ * normalized [0,1] convention). */
10877
+ var DetailParentSchema = object({
10878
+ bbox: NativeCropBboxSchema,
10879
+ className: string()
10880
+ });
10881
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
10882
+ * or refined detection produced by running the crop-subtree on a
10883
+ * single tracked detection. */
10884
+ var DetailResultSchema = object({
10885
+ stepId: string(),
10886
+ className: string(),
10887
+ score: number(),
10888
+ /** FRAME-space bbox (already mapped back from crop space). */
10889
+ bbox: NativeCropBboxSchema.optional(),
10890
+ embedding: string().optional(),
10891
+ label: string().optional(),
10892
+ alignedCropJpeg: string().optional()
10893
+ });
10820
10894
  /**
10821
10895
  * Per-camera tunable ranges + defaults. Single source of truth used
10822
10896
  * by both the Zod data schema (validation + default fallback) and
@@ -11077,7 +11151,13 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
11077
11151
  handle: FrameHandleSchema,
11078
11152
  bbox: NativeCropBboxSchema,
11079
11153
  maxWidth: number().int().positive().optional()
11080
- }), NativeCropResultSchema.nullable());
11154
+ }), NativeCropResultSchema.nullable()), method(object({
11155
+ deviceId: number(),
11156
+ frameHandle: FrameHandleSchema.optional(),
11157
+ cropJpeg: string().optional(),
11158
+ parent: DetailParentSchema,
11159
+ steps: array(string()).optional()
11160
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" });
11081
11161
  object({
11082
11162
  detected: boolean(),
11083
11163
  /** Ms epoch of the last detected-true observation. Null if never detected. */
@@ -11689,6 +11769,140 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
11689
11769
  deviceId: number(),
11690
11770
  status: PtzAutotrackStatusSchema
11691
11771
  });
11772
+ /**
11773
+ * scene-monitor — device-scoped reference-region state cap. An operator marks
11774
+ * a rect ROI on a camera frame and names one or more states; the engine
11775
+ * (pipeline-analytics, designated post-processing node) reports which state is
11776
+ * active on an ongoing basis. Two operator-selectable check modes share every-
11777
+ * thing except the comparator: `similarity` (CLIP cosine at the same ROI coords
11778
+ * vs condition-tagged references) and `llm` (vision-LLM judgment over the crop).
11779
+ *
11780
+ * D14 device-config archetype (`deviceConfig.ui.kind:'widget'`) — the framework
11781
+ * derives the device-detail contribution; the provider carries NO hand-written
11782
+ * settings-contribution methods. `status.kind:'push'` — the engine pushes on
11783
+ * every hysteresis flip / availability change; consumers never poll.
11784
+ */
11785
+ /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
11786
+ * be added without a wire break (matching falls back to any-condition refs). */
11787
+ var SceneConditionSchema = string();
11788
+ /** One captured reference — condition-tagged, model-version-gated. `embedding`
11789
+ * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
11790
+ var SceneReferenceSchema = object({
11791
+ embedding: array(number()),
11792
+ modelId: string(),
11793
+ condition: SceneConditionSchema,
11794
+ capturedAt: number(),
11795
+ thumbnailMediaId: string().optional()
11796
+ });
11797
+ var SceneMonitorStateSchema = object({
11798
+ id: string(),
11799
+ label: string(),
11800
+ references: array(SceneReferenceSchema),
11801
+ textPrompts: array(string()).optional(),
11802
+ referenceCount: number(),
11803
+ currentlyMatched: boolean()
11804
+ });
11805
+ /** Per-mode comparator params in a discriminated union so an `llm` scene never
11806
+ * carries similarity knobs and vice-versa. */
11807
+ var SceneCheckSchema = discriminatedUnion("mode", [object({
11808
+ mode: literal("similarity"),
11809
+ threshold: number().min(0).max(1),
11810
+ hysteresisCount: number().int().positive()
11811
+ }), object({
11812
+ mode: literal("llm"),
11813
+ prompt: string(),
11814
+ profileId: string().optional(),
11815
+ hysteresisCount: number().int().positive()
11816
+ })]);
11817
+ var SceneMonitorSchema = object({
11818
+ id: string(),
11819
+ label: string(),
11820
+ roi: MaskRectShapeSchema,
11821
+ enabled: boolean(),
11822
+ triggerMode: _enum([
11823
+ "periodic",
11824
+ "on-motion",
11825
+ "both"
11826
+ ]),
11827
+ checkIntervalSec: number().optional(),
11828
+ check: SceneCheckSchema,
11829
+ states: array(SceneMonitorStateSchema),
11830
+ currentStateId: string().nullable(),
11831
+ lastCheckedAt: number().nullable(),
11832
+ lastConfidence: number().nullable(),
11833
+ currentCondition: SceneConditionSchema.nullable(),
11834
+ availability: _enum(["ok", "unavailable"]),
11835
+ unavailableReason: string().nullable()
11836
+ });
11837
+ var SceneMonitorStatusSchema = object({
11838
+ monitors: array(SceneMonitorSchema),
11839
+ lastFetchedAt: number()
11840
+ });
11841
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
11842
+ deviceId: number(),
11843
+ label: string(),
11844
+ roi: MaskRectShapeSchema,
11845
+ check: SceneCheckSchema,
11846
+ triggerMode: _enum([
11847
+ "periodic",
11848
+ "on-motion",
11849
+ "both"
11850
+ ]).optional(),
11851
+ checkIntervalSec: number().optional()
11852
+ }), SceneMonitorSchema, {
11853
+ kind: "mutation",
11854
+ auth: "admin"
11855
+ }), method(object({
11856
+ deviceId: number(),
11857
+ monitorId: string(),
11858
+ patch: object({
11859
+ label: string().optional(),
11860
+ roi: MaskRectShapeSchema.optional(),
11861
+ enabled: boolean().optional(),
11862
+ triggerMode: _enum([
11863
+ "periodic",
11864
+ "on-motion",
11865
+ "both"
11866
+ ]).optional(),
11867
+ checkIntervalSec: number().optional(),
11868
+ check: SceneCheckSchema.optional()
11869
+ })
11870
+ }), _void(), {
11871
+ kind: "mutation",
11872
+ auth: "admin"
11873
+ }), method(object({
11874
+ deviceId: number(),
11875
+ monitorId: string()
11876
+ }), _void(), {
11877
+ kind: "mutation",
11878
+ auth: "admin"
11879
+ }), method(object({
11880
+ deviceId: number(),
11881
+ monitorId: string(),
11882
+ stateId: string().optional(),
11883
+ label: string().optional(),
11884
+ condition: SceneConditionSchema.optional()
11885
+ }), object({
11886
+ stateId: string(),
11887
+ referenceCount: number()
11888
+ }), {
11889
+ kind: "mutation",
11890
+ auth: "admin"
11891
+ }), method(object({
11892
+ deviceId: number(),
11893
+ monitorId: string(),
11894
+ stateId: string(),
11895
+ index: number()
11896
+ }), _void(), {
11897
+ kind: "mutation",
11898
+ auth: "admin"
11899
+ }), method(object({
11900
+ deviceId: number(),
11901
+ monitorId: string()
11902
+ }), _void(), {
11903
+ kind: "mutation",
11904
+ auth: "admin"
11905
+ });
11692
11906
  object({
11693
11907
  /** Whether the script is currently executing. */
11694
11908
  isRunning: boolean(),
@@ -12710,7 +12924,12 @@ var NotificationRuleConditionsSchema = object({
12710
12924
  clipDescription: object({
12711
12925
  text: string().min(1),
12712
12926
  minSimilarity: number().min(0).max(1)
12713
- }).optional()
12927
+ }).optional(),
12928
+ /** Match events whose recognized-entity label (face identity name or plate
12929
+ * vehicle name, propagated onto `event.data.label`) is one of these values.
12930
+ * Empty/absent → unaffected (back-compat). Enables "notify me when <named
12931
+ * vehicle/person> is seen". */
12932
+ labels: array(string()).readonly().optional()
12714
12933
  });
12715
12934
  var NotificationRuleTemplateSchema = object({
12716
12935
  title: string(),
@@ -12968,11 +13187,19 @@ method(object({
12968
13187
  * login page needs NO change.
12969
13188
  *
12970
13189
  * - `widget` — a Module-Federation widget the login page mounts (via
12971
- * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
12972
- * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
12973
- * addon bundle. The referenced widget also declares `preAuth: true` in
12974
- * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
12975
- * stamps a public `bundleUrl` from `addonId` + `bundle`.
13190
+ * `loadRemoteBundle`) for an in-page ceremony. `auth.listLoginMethods`
13191
+ * stamps a public `bundleUrl` from `addonId` + `bundle`. Generic
13192
+ * mechanism kept for future use; no shipped addon uses it on the login
13193
+ * page (the passkey ceremony below runs natively in the shell instead).
13194
+ *
13195
+ * - `passkey` — a declarative WebAuthn ceremony the shell renders
13196
+ * natively (`@simplewebauthn/browser` lives in `addon-admin-ui`, not in
13197
+ * a remotely-loaded bundle). Carries the addon's effective `rpId` /
13198
+ * `origin` (from its `resolveRpID()` / `resolveOrigin()`) so the shell
13199
+ * can gate visibility (IP-literal origin, hostname/rpId mismatch) WITHOUT
13200
+ * fetching any remote code pre-auth. Contribution stays unconditional —
13201
+ * enrollment state is never leaked pre-auth; visibility is a shell
13202
+ * decision.
12976
13203
  *
12977
13204
  * Every contribution carries a `stage`:
12978
13205
  * - `primary` — shown on the first credentials screen (OIDC /
@@ -12986,30 +13213,45 @@ method(object({
12986
13213
  */
12987
13214
  /** When a login method renders in the two-phase login flow. */
12988
13215
  var LoginStageEnum = _enum(["primary", "second-factor"]);
12989
- /** One login-method contribution — redirect button OR pre-auth widget. */
12990
- var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
12991
- kind: literal("redirect"),
12992
- /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
12993
- id: string(),
12994
- /** Operator-facing button label. */
12995
- label: string(),
12996
- /** lucide-react icon name. */
12997
- icon: string().optional(),
12998
- /** Addon-owned HTTP route the button navigates to (GET). */
12999
- startUrl: string(),
13000
- stage: LoginStageEnum
13001
- }), object({
13002
- kind: literal("widget"),
13003
- /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13004
- id: string(),
13005
- /** Owning addon id drives the public bundle URL + the MF namespace. */
13006
- addonId: string(),
13007
- /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13008
- bundle: string(),
13009
- /** MF remote descriptor `{ remoteName, exposedModule, componentKey }`. */
13010
- remote: WidgetRemoteSchema,
13011
- stage: LoginStageEnum
13012
- })]);
13216
+ /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
13217
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [
13218
+ object({
13219
+ kind: literal("redirect"),
13220
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
13221
+ id: string(),
13222
+ /** Operator-facing button label. */
13223
+ label: string(),
13224
+ /** lucide-react icon name. */
13225
+ icon: string().optional(),
13226
+ /** Addon-owned HTTP route the button navigates to (GET). */
13227
+ startUrl: string(),
13228
+ stage: LoginStageEnum
13229
+ }),
13230
+ object({
13231
+ kind: literal("widget"),
13232
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
13233
+ id: string(),
13234
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
13235
+ addonId: string(),
13236
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
13237
+ bundle: string(),
13238
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
13239
+ remote: WidgetRemoteSchema,
13240
+ stage: LoginStageEnum
13241
+ }),
13242
+ object({
13243
+ kind: literal("passkey"),
13244
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-direct-login`). */
13245
+ id: string(),
13246
+ /** Operator-facing button label. */
13247
+ label: string(),
13248
+ stage: LoginStageEnum,
13249
+ /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
13250
+ rpId: string(),
13251
+ /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
13252
+ origin: string().nullable()
13253
+ })
13254
+ ]);
13013
13255
  method(_void(), array(LoginMethodContributionSchema).readonly());
13014
13256
  /**
13015
13257
  * Orchestrator-side destination metadata. The orchestrator computes
@@ -14837,14 +15079,14 @@ var TargetKindCapsSchema = object({
14837
15079
  * the union is large and not meant for runtime validation here; the exported
14838
15080
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14839
15081
  */
14840
- var ConfigSchemaPassthrough = unknown();
15082
+ var ConfigSchemaPassthrough$1 = unknown();
14841
15083
  var TargetKindSchema = object({
14842
15084
  kind: string(),
14843
15085
  label: string(),
14844
15086
  icon: string(),
14845
15087
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
14846
15088
  addonId: string(),
14847
- configSchema: ConfigSchemaPassthrough,
15089
+ configSchema: ConfigSchemaPassthrough$1,
14848
15090
  supportsDiscovery: boolean(),
14849
15091
  caps: TargetKindCapsSchema
14850
15092
  });
@@ -14897,6 +15139,298 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
14897
15139
  enabled: boolean()
14898
15140
  }), _void(), { kind: "mutation" });
14899
15141
  /**
15142
+ * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
15143
+ * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
15144
+ * caps stay wire-compatible without a circular cap→cap import.
15145
+ *
15146
+ * Errors are a discriminated-union RESULT, never thrown: the shape survives
15147
+ * every transport tier structurally, and failed calls still write usage rows.
15148
+ * Token counts only in v1 — no costUsd (operator decision, 2026-07-15).
15149
+ */
15150
+ var LlmUsageSchema = object({
15151
+ inputTokens: number(),
15152
+ outputTokens: number()
15153
+ });
15154
+ var LlmErrorCodeSchema = _enum([
15155
+ "timeout",
15156
+ "rate-limited",
15157
+ "auth",
15158
+ "refusal",
15159
+ "bad-request",
15160
+ "unavailable",
15161
+ "no-profile",
15162
+ "budget-exceeded",
15163
+ "adapter-error"
15164
+ ]);
15165
+ var LlmGenerateResultSchema = discriminatedUnion("ok", [object({
15166
+ ok: literal(true),
15167
+ text: string(),
15168
+ model: string(),
15169
+ usage: LlmUsageSchema,
15170
+ truncated: boolean(),
15171
+ latencyMs: number()
15172
+ }), object({
15173
+ ok: literal(false),
15174
+ code: LlmErrorCodeSchema,
15175
+ message: string(),
15176
+ retryAfterMs: number().optional()
15177
+ })]);
15178
+ /**
15179
+ * `Uint8Array` is the sanctioned binary convention — superjson + the UDS
15180
+ * MsgPack channel round-trip typed arrays (embedding-encoder.cap.ts:29,
15181
+ * notification-output.cap.ts:27-31 precedents).
15182
+ */
15183
+ var LlmImageSchema = object({
15184
+ bytes: _instanceof(Uint8Array),
15185
+ mimeType: string()
15186
+ });
15187
+ var LlmGenerateBaseInputSchema = object({
15188
+ /** Collection routing (the notification-output posture). */
15189
+ addonId: string().optional(),
15190
+ /** Explicit profile; else the resolution chain (spec §3). */
15191
+ profileId: string().optional(),
15192
+ /** MANDATORY usage tag: 'ai-summary', 'notifier-rules', 'adhoc-ui', … */
15193
+ consumer: string(),
15194
+ system: string().optional(),
15195
+ /** v1: single-turn. `messages[]` is a v2 additive field. */
15196
+ prompt: string(),
15197
+ /** Structured output — adapter-mapped (response_format / forced tool / responseSchema). */
15198
+ jsonSchema: record(string(), unknown()).optional(),
15199
+ /** Per-call override of the profile default. */
15200
+ maxTokens: number().int().positive().optional(),
15201
+ temperature: number().optional()
15202
+ });
15203
+ /**
15204
+ * `llm-runtime` — node-side managed llama.cpp executor (spec §4). Registered
15205
+ * on EVERY node where `addon-ai` is installed; the hub `llm` provider reaches
15206
+ * a specific node's runtime with `nodePin(profile.runtime.nodeId)` — normal
15207
+ * cap routing, zero bespoke plumbing. `internal: true`: the operator reaches
15208
+ * this only through the `llm` cap's methods.
15209
+ *
15210
+ * One running llama-server child per node in v1 (models are RAM-heavy).
15211
+ * Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
15212
+ * watchdog — operator decision #3).
15213
+ */
15214
+ var ManagedModelRefSchema = discriminatedUnion("kind", [
15215
+ object({
15216
+ kind: literal("catalog"),
15217
+ catalogId: string()
15218
+ }),
15219
+ object({
15220
+ kind: literal("url"),
15221
+ url: string(),
15222
+ sha256: string().optional()
15223
+ }),
15224
+ object({
15225
+ kind: literal("path"),
15226
+ path: string()
15227
+ })
15228
+ ]);
15229
+ var ManagedRuntimeConfigSchema = object({
15230
+ /** WHERE the runtime lives — hub or any agent. */
15231
+ nodeId: string(),
15232
+ /** Closed for v1; 'ollama' is a v2 candidate. */
15233
+ engine: _enum(["llama-cpp"]),
15234
+ model: ManagedModelRefSchema,
15235
+ contextSize: number().int().default(4096),
15236
+ /** 0 = CPU-only. */
15237
+ gpuLayers: number().int().default(0),
15238
+ /** Default: cpus-2, clamped ≥1 (resolved node-side). */
15239
+ threads: number().int().optional(),
15240
+ /** Concurrent slots. */
15241
+ parallel: number().int().default(1),
15242
+ /** Else lazy: first generate boots it. */
15243
+ autoStart: boolean().default(false),
15244
+ /** 0 = never; frees RAM after quiet periods. */
15245
+ idleStopMinutes: number().int().default(30)
15246
+ });
15247
+ var LlmRuntimeStatusSchema = object({
15248
+ /** Status is ALWAYS node-qualified. */
15249
+ nodeId: string(),
15250
+ state: _enum([
15251
+ "stopped",
15252
+ "downloading",
15253
+ "starting",
15254
+ "ready",
15255
+ "crashed",
15256
+ "failed"
15257
+ ]),
15258
+ pid: number().optional(),
15259
+ port: number().optional(),
15260
+ modelPath: string().optional(),
15261
+ modelId: string().optional(),
15262
+ downloadProgress: number().min(0).max(1).optional(),
15263
+ lastError: string().optional(),
15264
+ crashesInWindow: number(),
15265
+ /** Child RSS (sampled best-effort). */
15266
+ memoryBytes: number().optional(),
15267
+ vramBytes: number().optional()
15268
+ });
15269
+ var LlmNodeModelSchema = object({
15270
+ file: string(),
15271
+ sizeBytes: number(),
15272
+ catalogId: string().optional(),
15273
+ installedAt: number().optional()
15274
+ });
15275
+ var LlmRuntimeDiskUsageSchema = object({
15276
+ nodeId: string(),
15277
+ modelsBytes: number(),
15278
+ freeBytes: number().optional()
15279
+ });
15280
+ method(LlmGenerateBaseInputSchema.extend({
15281
+ images: array(LlmImageSchema).optional(),
15282
+ runtime: ManagedRuntimeConfigSchema,
15283
+ /** The managed profile's timeout, threaded by the hub provider. */
15284
+ timeoutMs: number().int().positive().optional()
15285
+ }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
15286
+ kind: "mutation",
15287
+ auth: "admin"
15288
+ }), method(object({}), _void(), {
15289
+ kind: "mutation",
15290
+ auth: "admin"
15291
+ }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
15292
+ kind: "mutation",
15293
+ auth: "admin"
15294
+ }), method(object({ file: string() }), _void(), {
15295
+ kind: "mutation",
15296
+ auth: "admin"
15297
+ }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
15298
+ /**
15299
+ * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
15300
+ * methods concat-fan across providers; single-row methods route to ONE
15301
+ * provider by the `addonId` in the call input (the notification-output
15302
+ * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
15303
+ * (hub-placed); the cap stays open for future providers.
15304
+ *
15305
+ * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
15306
+ * `apiKey` is a password field — providers REDACT it on read and merge on
15307
+ * write; a stored key NEVER round-trips to a client.
15308
+ */
15309
+ var LlmProfileKindSchema = _enum([
15310
+ "openai-compatible",
15311
+ "openai",
15312
+ "anthropic",
15313
+ "google",
15314
+ "managed-local"
15315
+ ]);
15316
+ var LlmProfileSchema = object({
15317
+ id: string(),
15318
+ name: string(),
15319
+ kind: LlmProfileKindSchema,
15320
+ /** Stamped by the provider — keeps the fanned catalog routable. */
15321
+ addonId: string(),
15322
+ enabled: boolean(),
15323
+ /** Vendor model id, or the managed runtime's loaded model. */
15324
+ model: string(),
15325
+ /** Required for openai-compatible; override for cloud kinds. */
15326
+ baseUrl: string().optional(),
15327
+ /** ConfigUISchema type:'password' — never round-trips (spec §5). */
15328
+ apiKey: string().optional(),
15329
+ supportsVision: boolean(),
15330
+ temperature: number().min(0).max(2).optional(),
15331
+ maxTokens: number().int().positive().optional(),
15332
+ timeoutMs: number().int().positive().default(6e4),
15333
+ extraHeaders: record(string(), string()).optional(),
15334
+ /** kind === 'managed-local' only (spec §4). */
15335
+ runtime: ManagedRuntimeConfigSchema.optional()
15336
+ });
15337
+ /** ConfigUISchema tree passed through untyped on the wire (the
15338
+ * notification-output `ConfigSchemaPassthrough` precedent at
15339
+ * notification-output.cap.ts:151); the exported TS type re-tightens it. */
15340
+ var ConfigSchemaPassthrough = unknown();
15341
+ var LlmProfileKindDescriptorSchema = object({
15342
+ kind: LlmProfileKindSchema,
15343
+ label: string(),
15344
+ icon: string(),
15345
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
15346
+ addonId: string(),
15347
+ configSchema: ConfigSchemaPassthrough
15348
+ });
15349
+ var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
15350
+ var LlmDefaultSchema = object({
15351
+ selector: LlmDefaultSelectorSchema,
15352
+ profileId: string()
15353
+ });
15354
+ /** Server-side rollup row — getUsage never dumps raw call rows (spec §6). */
15355
+ var LlmUsageRollupSchema = object({
15356
+ day: string(),
15357
+ consumer: string(),
15358
+ profileId: string(),
15359
+ calls: number(),
15360
+ okCalls: number(),
15361
+ errorCalls: number(),
15362
+ inputTokens: number(),
15363
+ outputTokens: number(),
15364
+ avgLatencyMs: number()
15365
+ });
15366
+ /** LLM-facing view over the reused ModelCatalogEntry mechanism (spec §4.2). */
15367
+ var ManagedModelCatalogEntrySchema = object({
15368
+ id: string(),
15369
+ label: string(),
15370
+ family: string(),
15371
+ purpose: _enum(["text", "vision"]),
15372
+ url: string(),
15373
+ sha256: string(),
15374
+ sizeBytes: number(),
15375
+ quantization: string(),
15376
+ /** Load-time guidance shown in the picker. */
15377
+ minRamBytes: number(),
15378
+ contextSizeDefault: number().int(),
15379
+ /** Vision models: companion projector file. */
15380
+ mmprojUrl: string().optional()
15381
+ });
15382
+ var LlmRuntimeNodeSchema = object({
15383
+ nodeId: string(),
15384
+ reachable: boolean(),
15385
+ status: LlmRuntimeStatusSchema.optional(),
15386
+ disk: LlmRuntimeDiskUsageSchema.optional(),
15387
+ error: string().optional()
15388
+ });
15389
+ var GenerateVisionInputSchema = LlmGenerateBaseInputSchema.extend({ images: array(LlmImageSchema).min(1) });
15390
+ var ProfileRefInputSchema = object({
15391
+ addonId: string(),
15392
+ profileId: string()
15393
+ });
15394
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
15395
+ kind: "mutation",
15396
+ auth: "admin"
15397
+ }), method(ProfileRefInputSchema, _void(), {
15398
+ kind: "mutation",
15399
+ auth: "admin"
15400
+ }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
15401
+ kind: "mutation",
15402
+ auth: "admin"
15403
+ }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
15404
+ selector: LlmDefaultSelectorSchema,
15405
+ profileId: string().nullable()
15406
+ }), _void(), {
15407
+ kind: "mutation",
15408
+ auth: "admin"
15409
+ }), method(object({
15410
+ since: number().optional(),
15411
+ until: number().optional(),
15412
+ consumer: string().optional(),
15413
+ profileId: string().optional()
15414
+ }), array(LlmUsageRollupSchema)), method(object({}), array(ManagedModelCatalogEntrySchema)), method(object({}), array(LlmRuntimeNodeSchema)), method(object({ nodeId: string() }), array(LlmNodeModelSchema)), method(object({
15415
+ nodeId: string(),
15416
+ model: ManagedModelRefSchema
15417
+ }), _void(), {
15418
+ kind: "mutation",
15419
+ auth: "admin"
15420
+ }), method(object({
15421
+ nodeId: string(),
15422
+ file: string()
15423
+ }), _void(), {
15424
+ kind: "mutation",
15425
+ auth: "admin"
15426
+ }), method(ProfileRefInputSchema, LlmRuntimeStatusSchema), method(ProfileRefInputSchema, LlmRuntimeStatusSchema, {
15427
+ kind: "mutation",
15428
+ auth: "admin"
15429
+ }), method(ProfileRefInputSchema, _void(), {
15430
+ kind: "mutation",
15431
+ auth: "admin"
15432
+ });
15433
+ /**
14900
15434
  * Zod schemas for persisted record types.
14901
15435
  *
14902
15436
  * These schemas serve as the single source of truth for types that are
@@ -15112,6 +15646,10 @@ var TrackSchema = object({
15112
15646
  snapshots: array(TrackSnapshotSchema).readonly(),
15113
15647
  /** Deduplicated zones the track has entered at least once. */
15114
15648
  zonesVisited: array(string()).readonly(),
15649
+ /** Deduplicated set of detector classes observed for this track over its
15650
+ * life (a track may be reclassified, e.g. person→vehicle). Absent on
15651
+ * legacy rows written before class accumulation shipped. */
15652
+ classes: array(string()).readonly().optional(),
15115
15653
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
15116
15654
  totalDistance: number(),
15117
15655
  state: TrackStateSchema,
@@ -15273,7 +15811,7 @@ var KeyEventSchema = object({
15273
15811
  /** Track lifetime in ms (lastSeen - firstSeen). */
15274
15812
  windowMs: number().optional()
15275
15813
  });
15276
- var TrackedDetectionSchema = object({
15814
+ object({
15277
15815
  trackId: string(),
15278
15816
  className: string(),
15279
15817
  confidence: number(),
@@ -15281,6 +15819,23 @@ var TrackedDetectionSchema = object({
15281
15819
  zones: array(string()).readonly(),
15282
15820
  state: TrackStateSchema
15283
15821
  });
15822
+ var OverlayDetectionSchema = looseObject({
15823
+ id: string(),
15824
+ kind: _enum(["first-level", "detail"]),
15825
+ macroClass: string(),
15826
+ score: number(),
15827
+ bbox: object({
15828
+ x: number(),
15829
+ y: number(),
15830
+ width: number(),
15831
+ height: number()
15832
+ }),
15833
+ labels: array(looseObject({
15834
+ label: string(),
15835
+ score: number()
15836
+ })).readonly(),
15837
+ parentId: string().optional()
15838
+ });
15284
15839
  var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
15285
15840
  var SearchObjectEventsInput = object({
15286
15841
  text: string(),
@@ -15291,6 +15846,20 @@ var SearchObjectEventsInput = object({
15291
15846
  limit: number().default(50),
15292
15847
  minScore: number().min(0).max(1).default(.2)
15293
15848
  });
15849
+ var TrackCascadeCountsSchema = object({
15850
+ /** Persisted track roots deleted (authoritative). */
15851
+ tracks: number().int(),
15852
+ /** Object events removed with their tracks (best-effort; see note above). */
15853
+ events: number().int(),
15854
+ /** Track/face/plate-owned media removed (best-effort). Never identity media. */
15855
+ media: number().int(),
15856
+ /** Unassigned (non-enrolled) face reads removed (best-effort). */
15857
+ faces: number().int(),
15858
+ /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
15859
+ plates: number().int(),
15860
+ /** Per-track CLIP search vectors removed (best-effort). */
15861
+ embeddings: number().int()
15862
+ });
15294
15863
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
15295
15864
  deviceId: number(),
15296
15865
  trackId: string()
@@ -15322,6 +15891,24 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15322
15891
  }), {
15323
15892
  kind: "mutation",
15324
15893
  auth: "admin"
15894
+ }), method(object({
15895
+ deviceId: number(),
15896
+ cutoffMs: number()
15897
+ }), TrackCascadeCountsSchema, {
15898
+ kind: "mutation",
15899
+ auth: "admin"
15900
+ }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
15901
+ kind: "mutation",
15902
+ auth: "admin"
15903
+ }), method(object({
15904
+ deviceId: number(),
15905
+ trackIds: array(string()).min(1)
15906
+ }), object({
15907
+ deleted: number().int(),
15908
+ failed: array(string()).readonly()
15909
+ }), {
15910
+ kind: "mutation",
15911
+ auth: "admin"
15325
15912
  }), method(object({
15326
15913
  eventId: string(),
15327
15914
  kind: MediaFileKindEnum.optional()
@@ -15330,7 +15917,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
15330
15917
  timestamp: number(),
15331
15918
  frameWidth: number(),
15332
15919
  frameHeight: number(),
15333
- detections: array(TrackedDetectionSchema).readonly()
15920
+ detections: array(OverlayDetectionSchema).readonly()
15334
15921
  }), object({
15335
15922
  deviceId: number(),
15336
15923
  trackId: string(),
@@ -18099,6 +18686,24 @@ DeviceType.Camera, method(object({
18099
18686
  deviceId: number(),
18100
18687
  status: OsdStatusSchema
18101
18688
  });
18689
+ var VehicleSchema = object({
18690
+ id: string(),
18691
+ name: string(),
18692
+ sampleCount: number().int().nonnegative(),
18693
+ coverMediaKey: string().optional(),
18694
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
18695
+ coverBase64: string().optional()
18696
+ });
18697
+ var VehicleSampleInfoSchema = object({
18698
+ id: string(),
18699
+ /** The plate text this sample enrolled (self-labeling — no embedding). */
18700
+ text: string(),
18701
+ /** OCR confidence of the enrolled read (0..1). */
18702
+ score: number(),
18703
+ addedAt: number().int(),
18704
+ deviceId: number().int().optional(),
18705
+ base64: string().optional()
18706
+ });
18102
18707
  var PlateInfoSchema = object({
18103
18708
  plateId: string(),
18104
18709
  deviceId: number().int(),
@@ -18110,6 +18715,16 @@ var PlateInfoSchema = object({
18110
18715
  score: number(),
18111
18716
  /** True when the text was manually corrected (exempt from retention). */
18112
18717
  corrected: boolean(),
18718
+ /** Recognized vehicle id when a matcher lookup named this read (SQL NULL → absent). */
18719
+ recognizedVehicleId: string().optional(),
18720
+ /** Resolved vehicle name for `recognizedVehicleId` (UI convenience). */
18721
+ vehicleName: string().optional(),
18722
+ /** True once the read was assigned to a vehicle (enrolled as a sample). */
18723
+ assigned: boolean(),
18724
+ /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
18725
+ plateBbox: BoundingBoxSchema.optional(),
18726
+ /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
18727
+ keyFrameMediaKey: string().optional(),
18113
18728
  base64: string().optional()
18114
18729
  });
18115
18730
  var MediaFileLiteSchema = object({
@@ -18149,6 +18764,48 @@ method(object({
18149
18764
  }), method(object({ plateId: string() }), _void(), {
18150
18765
  kind: "mutation",
18151
18766
  auth: "admin"
18767
+ }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
18768
+ kind: "mutation",
18769
+ auth: "admin"
18770
+ }), method(object({
18771
+ id: string(),
18772
+ name: string().min(1)
18773
+ }), _void(), {
18774
+ kind: "mutation",
18775
+ auth: "admin"
18776
+ }), method(object({ id: string() }), _void(), {
18777
+ kind: "mutation",
18778
+ auth: "admin"
18779
+ }), method(object({ vehicleId: string() }), array(VehicleSampleInfoSchema).readonly()), method(object({
18780
+ vehicleId: string(),
18781
+ sampleId: string()
18782
+ }), _void(), {
18783
+ kind: "mutation",
18784
+ auth: "admin"
18785
+ }), method(object({
18786
+ plateId: string(),
18787
+ vehicleId: string()
18788
+ }), _void(), {
18789
+ kind: "mutation",
18790
+ auth: "admin"
18791
+ }), method(object({ plateId: string() }), _void(), {
18792
+ kind: "mutation",
18793
+ auth: "admin"
18794
+ }), method(object({
18795
+ plateIds: array(string()).min(1),
18796
+ vehicleId: string()
18797
+ }), object({
18798
+ assigned: number().int(),
18799
+ failed: array(string()).readonly()
18800
+ }), {
18801
+ kind: "mutation",
18802
+ auth: "admin"
18803
+ }), method(object({ plateIds: array(string()).min(1) }), object({
18804
+ unassigned: number().int(),
18805
+ failed: array(string()).readonly()
18806
+ }), {
18807
+ kind: "mutation",
18808
+ auth: "admin"
18152
18809
  });
18153
18810
  var ModelFormatSchema = _enum(MODEL_FORMATS);
18154
18811
  var HwAccelBackendInputSchema = _enum([
@@ -20694,6 +21351,168 @@ Object.freeze({
20694
21351
  addonId: null,
20695
21352
  access: "create"
20696
21353
  },
21354
+ "llm.deleteModel": {
21355
+ capName: "llm",
21356
+ capScope: "system",
21357
+ addonId: null,
21358
+ access: "delete"
21359
+ },
21360
+ "llm.deleteProfile": {
21361
+ capName: "llm",
21362
+ capScope: "system",
21363
+ addonId: null,
21364
+ access: "delete"
21365
+ },
21366
+ "llm.generate": {
21367
+ capName: "llm",
21368
+ capScope: "system",
21369
+ addonId: null,
21370
+ access: "create"
21371
+ },
21372
+ "llm.generateVision": {
21373
+ capName: "llm",
21374
+ capScope: "system",
21375
+ addonId: null,
21376
+ access: "create"
21377
+ },
21378
+ "llm.getDefaults": {
21379
+ capName: "llm",
21380
+ capScope: "system",
21381
+ addonId: null,
21382
+ access: "view"
21383
+ },
21384
+ "llm.getRuntimeStatus": {
21385
+ capName: "llm",
21386
+ capScope: "system",
21387
+ addonId: null,
21388
+ access: "view"
21389
+ },
21390
+ "llm.getUsage": {
21391
+ capName: "llm",
21392
+ capScope: "system",
21393
+ addonId: null,
21394
+ access: "view"
21395
+ },
21396
+ "llm.installModel": {
21397
+ capName: "llm",
21398
+ capScope: "system",
21399
+ addonId: null,
21400
+ access: "create"
21401
+ },
21402
+ "llm.listModelCatalog": {
21403
+ capName: "llm",
21404
+ capScope: "system",
21405
+ addonId: null,
21406
+ access: "view"
21407
+ },
21408
+ "llm.listModels": {
21409
+ capName: "llm",
21410
+ capScope: "system",
21411
+ addonId: null,
21412
+ access: "view"
21413
+ },
21414
+ "llm.listNodeModels": {
21415
+ capName: "llm",
21416
+ capScope: "system",
21417
+ addonId: null,
21418
+ access: "view"
21419
+ },
21420
+ "llm.listProfileKinds": {
21421
+ capName: "llm",
21422
+ capScope: "system",
21423
+ addonId: null,
21424
+ access: "view"
21425
+ },
21426
+ "llm.listProfiles": {
21427
+ capName: "llm",
21428
+ capScope: "system",
21429
+ addonId: null,
21430
+ access: "view"
21431
+ },
21432
+ "llm.listRuntimeNodes": {
21433
+ capName: "llm",
21434
+ capScope: "system",
21435
+ addonId: null,
21436
+ access: "view"
21437
+ },
21438
+ "llm.setDefault": {
21439
+ capName: "llm",
21440
+ capScope: "system",
21441
+ addonId: null,
21442
+ access: "create"
21443
+ },
21444
+ "llm.startRuntime": {
21445
+ capName: "llm",
21446
+ capScope: "system",
21447
+ addonId: null,
21448
+ access: "create"
21449
+ },
21450
+ "llm.stopRuntime": {
21451
+ capName: "llm",
21452
+ capScope: "system",
21453
+ addonId: null,
21454
+ access: "create"
21455
+ },
21456
+ "llm.testProfile": {
21457
+ capName: "llm",
21458
+ capScope: "system",
21459
+ addonId: null,
21460
+ access: "create"
21461
+ },
21462
+ "llm.upsertProfile": {
21463
+ capName: "llm",
21464
+ capScope: "system",
21465
+ addonId: null,
21466
+ access: "create"
21467
+ },
21468
+ "llmRuntime.complete": {
21469
+ capName: "llm-runtime",
21470
+ capScope: "system",
21471
+ addonId: null,
21472
+ access: "create"
21473
+ },
21474
+ "llmRuntime.deleteModel": {
21475
+ capName: "llm-runtime",
21476
+ capScope: "system",
21477
+ addonId: null,
21478
+ access: "delete"
21479
+ },
21480
+ "llmRuntime.ensureStarted": {
21481
+ capName: "llm-runtime",
21482
+ capScope: "system",
21483
+ addonId: null,
21484
+ access: "create"
21485
+ },
21486
+ "llmRuntime.getDiskUsage": {
21487
+ capName: "llm-runtime",
21488
+ capScope: "system",
21489
+ addonId: null,
21490
+ access: "view"
21491
+ },
21492
+ "llmRuntime.installModel": {
21493
+ capName: "llm-runtime",
21494
+ capScope: "system",
21495
+ addonId: null,
21496
+ access: "create"
21497
+ },
21498
+ "llmRuntime.listLocalModels": {
21499
+ capName: "llm-runtime",
21500
+ capScope: "system",
21501
+ addonId: null,
21502
+ access: "view"
21503
+ },
21504
+ "llmRuntime.status": {
21505
+ capName: "llm-runtime",
21506
+ capScope: "system",
21507
+ addonId: null,
21508
+ access: "view"
21509
+ },
21510
+ "llmRuntime.stop": {
21511
+ capName: "llm-runtime",
21512
+ capScope: "system",
21513
+ addonId: null,
21514
+ access: "create"
21515
+ },
20697
21516
  "localNetwork.getAllowedAddresses": {
20698
21517
  capName: "local-network",
20699
21518
  capScope: "system",
@@ -21324,6 +22143,12 @@ Object.freeze({
21324
22143
  addonId: null,
21325
22144
  access: "delete"
21326
22145
  },
22146
+ "pipelineAnalytics.deleteTracks": {
22147
+ capName: "pipeline-analytics",
22148
+ capScope: "device",
22149
+ addonId: null,
22150
+ access: "delete"
22151
+ },
21327
22152
  "pipelineAnalytics.getActiveTracks": {
21328
22153
  capName: "pipeline-analytics",
21329
22154
  capScope: "device",
@@ -21390,12 +22215,24 @@ Object.freeze({
21390
22215
  addonId: null,
21391
22216
  access: "create"
21392
22217
  },
22218
+ "pipelineAnalytics.pruneTracksBefore": {
22219
+ capName: "pipeline-analytics",
22220
+ capScope: "device",
22221
+ addonId: null,
22222
+ access: "create"
22223
+ },
21393
22224
  "pipelineAnalytics.searchObjectEvents": {
21394
22225
  capName: "pipeline-analytics",
21395
22226
  capScope: "device",
21396
22227
  addonId: null,
21397
22228
  access: "view"
21398
22229
  },
22230
+ "pipelineAnalytics.wipeAllAnalytics": {
22231
+ capName: "pipeline-analytics",
22232
+ capScope: "device",
22233
+ addonId: null,
22234
+ access: "delete"
22235
+ },
21399
22236
  "pipelineExecutor.cacheFrameInPool": {
21400
22237
  capName: "pipeline-executor",
21401
22238
  capScope: "system",
@@ -21894,18 +22731,48 @@ Object.freeze({
21894
22731
  addonId: null,
21895
22732
  access: "create"
21896
22733
  },
22734
+ "pipelineRunner.runDetailSubtree": {
22735
+ capName: "pipeline-runner",
22736
+ capScope: "system",
22737
+ addonId: null,
22738
+ access: "create"
22739
+ },
22740
+ "plateGallery.assignPlate": {
22741
+ capName: "plate-gallery",
22742
+ capScope: "system",
22743
+ addonId: null,
22744
+ access: "create"
22745
+ },
22746
+ "plateGallery.assignPlates": {
22747
+ capName: "plate-gallery",
22748
+ capScope: "system",
22749
+ addonId: null,
22750
+ access: "create"
22751
+ },
21897
22752
  "plateGallery.correctPlateText": {
21898
22753
  capName: "plate-gallery",
21899
22754
  capScope: "system",
21900
22755
  addonId: null,
21901
22756
  access: "create"
21902
22757
  },
22758
+ "plateGallery.createVehicle": {
22759
+ capName: "plate-gallery",
22760
+ capScope: "system",
22761
+ addonId: null,
22762
+ access: "create"
22763
+ },
21903
22764
  "plateGallery.deletePlate": {
21904
22765
  capName: "plate-gallery",
21905
22766
  capScope: "system",
21906
22767
  addonId: null,
21907
22768
  access: "delete"
21908
22769
  },
22770
+ "plateGallery.deleteVehicle": {
22771
+ capName: "plate-gallery",
22772
+ capScope: "system",
22773
+ addonId: null,
22774
+ access: "delete"
22775
+ },
21909
22776
  "plateGallery.getPlateByTrack": {
21910
22777
  capName: "plate-gallery",
21911
22778
  capScope: "system",
@@ -21924,6 +22791,30 @@ Object.freeze({
21924
22791
  addonId: null,
21925
22792
  access: "view"
21926
22793
  },
22794
+ "plateGallery.listVehicles": {
22795
+ capName: "plate-gallery",
22796
+ capScope: "system",
22797
+ addonId: null,
22798
+ access: "view"
22799
+ },
22800
+ "plateGallery.listVehicleSamples": {
22801
+ capName: "plate-gallery",
22802
+ capScope: "system",
22803
+ addonId: null,
22804
+ access: "view"
22805
+ },
22806
+ "plateGallery.removeVehicleSample": {
22807
+ capName: "plate-gallery",
22808
+ capScope: "system",
22809
+ addonId: null,
22810
+ access: "delete"
22811
+ },
22812
+ "plateGallery.renameVehicle": {
22813
+ capName: "plate-gallery",
22814
+ capScope: "system",
22815
+ addonId: null,
22816
+ access: "create"
22817
+ },
21927
22818
  "plateGallery.searchPlates": {
21928
22819
  capName: "plate-gallery",
21929
22820
  capScope: "system",
@@ -21936,6 +22827,18 @@ Object.freeze({
21936
22827
  addonId: null,
21937
22828
  access: "view"
21938
22829
  },
22830
+ "plateGallery.unassignPlate": {
22831
+ capName: "plate-gallery",
22832
+ capScope: "system",
22833
+ addonId: null,
22834
+ access: "create"
22835
+ },
22836
+ "plateGallery.unassignPlates": {
22837
+ capName: "plate-gallery",
22838
+ capScope: "system",
22839
+ addonId: null,
22840
+ access: "create"
22841
+ },
21939
22842
  "platformProbe.getCapabilities": {
21940
22843
  capName: "platform-probe",
21941
22844
  capScope: "system",
@@ -22128,6 +23031,48 @@ Object.freeze({
22128
23031
  addonId: null,
22129
23032
  access: "create"
22130
23033
  },
23034
+ "sceneMonitor.captureReference": {
23035
+ capName: "scene-monitor",
23036
+ capScope: "device",
23037
+ addonId: null,
23038
+ access: "create"
23039
+ },
23040
+ "sceneMonitor.createScene": {
23041
+ capName: "scene-monitor",
23042
+ capScope: "device",
23043
+ addonId: null,
23044
+ access: "create"
23045
+ },
23046
+ "sceneMonitor.deleteReference": {
23047
+ capName: "scene-monitor",
23048
+ capScope: "device",
23049
+ addonId: null,
23050
+ access: "delete"
23051
+ },
23052
+ "sceneMonitor.deleteScene": {
23053
+ capName: "scene-monitor",
23054
+ capScope: "device",
23055
+ addonId: null,
23056
+ access: "delete"
23057
+ },
23058
+ "sceneMonitor.listScenes": {
23059
+ capName: "scene-monitor",
23060
+ capScope: "device",
23061
+ addonId: null,
23062
+ access: "view"
23063
+ },
23064
+ "sceneMonitor.recheckNow": {
23065
+ capName: "scene-monitor",
23066
+ capScope: "device",
23067
+ addonId: null,
23068
+ access: "create"
23069
+ },
23070
+ "sceneMonitor.updateScene": {
23071
+ capName: "scene-monitor",
23072
+ capScope: "device",
23073
+ addonId: null,
23074
+ access: "create"
23075
+ },
22131
23076
  "scriptRunner.run": {
22132
23077
  capName: "script-runner",
22133
23078
  capScope: "device",
@@ -23212,6 +24157,7 @@ Object.freeze({
23212
24157
  Object.freeze({
23213
24158
  "broker": "broker",
23214
24159
  "device-export": "device-export",
24160
+ "llm": "ai",
23215
24161
  "mesh-network": "mesh",
23216
24162
  "mqtt-broker": "broker",
23217
24163
  "network-access": "ingress",
@@ -23262,7 +24208,7 @@ var AdminUIAddon = class extends BaseAddon {
23262
24208
  capability: adminUiCapability,
23263
24209
  provider: {
23264
24210
  getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
23265
- getVersion: async () => ({ version: "1.1.49" })
24211
+ getVersion: async () => ({ version: "1.1.51" })
23266
24212
  }
23267
24213
  }];
23268
24214
  }