@camstack/addon-pipeline 1.1.53 → 1.1.55

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 (35) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/detection-pipeline/index.js +289 -1469
  4. package/dist/detection-pipeline/index.mjs +269 -1449
  5. package/dist/{dist-DWb62H5U.js → dist-DI57FC8K.js} +167 -8
  6. package/dist/{dist-BalxNwOt.mjs → dist-RWGGPwVx.mjs} +167 -8
  7. package/dist/motion-wasm/index.js +1 -1
  8. package/dist/motion-wasm/index.mjs +1 -1
  9. package/dist/pipeline-runner/index.js +772 -21
  10. package/dist/pipeline-runner/index.mjs +772 -22
  11. package/dist/recorder/index.js +1 -1
  12. package/dist/recorder/index.mjs +1 -1
  13. package/dist/{remote-source-plane-CZpzIVro.js → remote-source-plane-CHgvzzA6.js} +1 -1
  14. package/dist/{remote-source-plane-BCJW5CvF.mjs → remote-source-plane-DU0aRSPv.mjs} +1 -1
  15. package/dist/session-decode/decode-worker-child.js +538 -35
  16. package/dist/session-decode/decode-worker-child.mjs +538 -35
  17. package/dist/step-definitions-CNBFKjZe.js +1514 -0
  18. package/dist/step-definitions-CP9kVSml.mjs +1479 -0
  19. package/dist/stream-broker/_stub.js +2 -2
  20. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DIN3CcRP.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-mDCPzmT3.mjs} +3 -3
  21. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B3gTdHEh.mjs +26 -0
  22. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C9fwKMfg.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Dn_pxzP-.mjs} +1 -1
  23. package/dist/stream-broker/{hostInit-CGUEq--X.mjs → hostInit-GM_CI22k.mjs} +3 -3
  24. package/dist/stream-broker/index.js +2 -2
  25. package/dist/stream-broker/index.mjs +2 -2
  26. package/dist/stream-broker/remoteEntry.js +1 -1
  27. package/dist/{worker-protocol-pk7qdYXt.mjs → worker-protocol-CyVJTZEO.mjs} +7 -0
  28. package/dist/{worker-protocol-BCfO8gUF.js → worker-protocol-PP4jKHHJ.js} +7 -0
  29. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-CqOe8eYa.js → MaskShapeCanvas-DI4BY7W2-BChW0ntM.js} +1 -1
  30. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-CZyLeUnd.js → MotionZonesSettings-NcxxQN8r-DDzqEbSe.js} +1 -1
  31. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-Cn0hGZnu.js → PrivacyMaskSettings-APgPLF7p-B879GXaf.js} +1 -1
  32. package/embed-dist/assets/{index-DRl4XYjA.js → index-CNjQ5rAE.js} +10 -10
  33. package/embed-dist/index.html +1 -1
  34. package/package.json +1 -1
  35. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-o4tu_xuc.mjs +0 -26
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-b4Jf2n33.mjs
4630
+ //#region ../types/dist/sleep-Baang_XW.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -11711,7 +11711,15 @@ var pipelineExecutorCapability = {
11711
11711
  image: _instanceof(Uint8Array).optional(),
11712
11712
  referenceImage: string().optional(),
11713
11713
  deviceId: number().optional(),
11714
- sessionId: string().optional()
11714
+ sessionId: string().optional(),
11715
+ /**
11716
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
11717
+ * reference-image, and detail-subtree calls. 'frame' is the live
11718
+ * per-frame dispatch: ONLY root-plane steps run; crop children
11719
+ * (inputClasses ≠ null) are skipped and served per-track via
11720
+ * pipelineRunner.runDetailSubtree (two-plane design).
11721
+ */
11722
+ plane: _enum(["full", "frame"]).optional()
11715
11723
  }), PipelineRunResultBridge, { kind: "mutation" }),
11716
11724
  /**
11717
11725
  * Batched run — N raw frames packed into one cap call. The provider
@@ -11890,6 +11898,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
11890
11898
  auth: "admin"
11891
11899
  }), object({ zones: array(ZoneSchema).readonly() });
11892
11900
  /**
11901
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
11902
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
11903
+ * so the caller supplies only the detection-res bbox divided by the detection
11904
+ * dims — no native resolution to plumb.
11905
+ */
11906
+ var NativeCropBboxSchema = object({
11907
+ x: number(),
11908
+ y: number(),
11909
+ w: number(),
11910
+ h: number()
11911
+ });
11912
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
11913
+ var NativeCropResultSchema = object({
11914
+ /** Packed rgb (24-bit) pixels of the crop. */
11915
+ bytes: _instanceof(Uint8Array),
11916
+ width: number().int().positive(),
11917
+ height: number().int().positive()
11918
+ });
11919
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
11920
+ * originating detection, in FRAME-space coordinates. Reuses
11921
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
11922
+ * the coordinates are frame-space rather than getNativeCrop's
11923
+ * normalized [0,1] convention). */
11924
+ var DetailParentSchema = object({
11925
+ bbox: NativeCropBboxSchema,
11926
+ className: string()
11927
+ });
11928
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
11929
+ * or refined detection produced by running the crop-subtree on a
11930
+ * single tracked detection. */
11931
+ var DetailResultSchema = object({
11932
+ stepId: string(),
11933
+ className: string(),
11934
+ score: number(),
11935
+ /** FRAME-space bbox (already mapped back from crop space). */
11936
+ bbox: NativeCropBboxSchema.optional(),
11937
+ embedding: string().optional(),
11938
+ label: string().optional(),
11939
+ alignedCropJpeg: string().optional()
11940
+ });
11941
+ /**
11893
11942
  * Per-camera tunable ranges + defaults. Single source of truth used
11894
11943
  * by both the Zod data schema (validation + default fallback) and
11895
11944
  * the device settings UI (slider min/max/step). Touch one place and
@@ -12193,7 +12242,42 @@ var pipelineRunnerCapability = {
12193
12242
  /** All per-camera metrics in one round-trip. */
12194
12243
  getAllCameraMetrics: method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()),
12195
12244
  /** List the deviceIds currently attached to this runner. */
12196
- getLocalCameras: method(_void(), array(number()).readonly())
12245
+ getLocalCameras: method(_void(), array(number()).readonly()),
12246
+ /**
12247
+ * Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
12248
+ * `FrameHandle` that rode an inference-result event and a normalized `bbox`,
12249
+ * the runner asks the decode worker still holding that frame's NATIVE
12250
+ * surface to GPU/CPU-crop ONLY the ROI at native res and download just the
12251
+ * crop. Returns `null` on a miss (handle not registered, or the worker's
12252
+ * tiny native-retention ring already evicted the frame) — the caller falls
12253
+ * back to a detection-frame crop. Routed to the frame's owning node by
12254
+ * `handle.nodeId`; NEVER ships a full native frame.
12255
+ */
12256
+ getNativeCrop: method(object({
12257
+ handle: FrameHandleSchema,
12258
+ bbox: NativeCropBboxSchema,
12259
+ maxWidth: number().int().positive().optional()
12260
+ }), NativeCropResultSchema.nullable()),
12261
+ /**
12262
+ * Two-plane design: run the DETAIL subtree (crop children —
12263
+ * embedding, classifier, refiner steps whose `inputClasses ≠ null`)
12264
+ * for a single tracked detection. The per-frame plane (`runPipeline`
12265
+ * with `plane: 'frame'`) skips crop children entirely; a track-level
12266
+ * caller invokes this per-track, on its own cadence, instead of on
12267
+ * every frame. Takes either a `frameHandle` (shm lease/session —
12268
+ * preferred, zero-copy) or a `cropJpeg` fallback when the lease/
12269
+ * session backing the frame is already gone. `steps` narrows which
12270
+ * configured children to run (default: all configured children for
12271
+ * `parent.className`). Returns `null` when neither frame source is
12272
+ * resolvable (handle evicted and no cropJpeg fallback supplied).
12273
+ */
12274
+ runDetailSubtree: method(object({
12275
+ deviceId: number(),
12276
+ frameHandle: FrameHandleSchema.optional(),
12277
+ cropJpeg: string().optional(),
12278
+ parent: DetailParentSchema,
12279
+ steps: array(string()).optional()
12280
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" })
12197
12281
  }
12198
12282
  };
12199
12283
  object({
@@ -16443,7 +16527,17 @@ var TrackSchema = object({
16443
16527
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
16444
16528
  totalDistance: number(),
16445
16529
  state: TrackStateSchema,
16446
- active: boolean()
16530
+ active: boolean(),
16531
+ /** Deterministic key-event importance score in [0,1] (server-computed at
16532
+ * track expiry, recomputed on late label). Absent on legacy rows written
16533
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
16534
+ importance: number().optional(),
16535
+ /** Id of the track's highest-confidence ObjectEvent (its representative
16536
+ * "best" frame). Absent when the track produced no object events. */
16537
+ bestEventId: string().optional(),
16538
+ /** Tag of the importance sub-signal that dominated the score
16539
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
16540
+ importanceReason: string().optional()
16447
16541
  });
16448
16542
  var BaseEventFields = {
16449
16543
  id: string(),
@@ -16508,8 +16602,18 @@ var ObjectEventSchema = object({
16508
16602
  frameHeight: number().optional(),
16509
16603
  /** MediaStore key for the crop attached to this event (if any). */
16510
16604
  mediaKey: string().optional(),
16605
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
16606
+ * best-detection full frame). Resolve via the event-media data-plane
16607
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
16608
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
16609
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
16610
+ keyFrameMediaKey: string().optional(),
16511
16611
  /** Populated by B5 (recording playback URL for this event). */
16512
- mediaUrl: string().optional()
16612
+ mediaUrl: string().optional(),
16613
+ /** The parent track's key-event importance [0,1], propagated to every object
16614
+ * event of the track (so an event row can be sorted by importance without a
16615
+ * track join). Absent on legacy rows / before the track was scored. */
16616
+ importance: number().optional()
16513
16617
  });
16514
16618
  var AudioEventSchema = object({
16515
16619
  ...BaseEventFields,
@@ -16533,7 +16637,8 @@ var MediaFileKindEnum = _enum([
16533
16637
  "fullFrame",
16534
16638
  "fullFrameBoxed",
16535
16639
  "faceCrop",
16536
- "plateCrop"
16640
+ "plateCrop",
16641
+ "keyFrame"
16537
16642
  ]);
16538
16643
  var MediaFileSchema = object({
16539
16644
  key: string(),
@@ -16554,6 +16659,32 @@ var DeviceEventQueryInput = object({
16554
16659
  projection: _enum(["full", "slim"]).optional()
16555
16660
  });
16556
16661
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
16662
+ var KeyEventQueryInput = object({
16663
+ deviceId: number(),
16664
+ /** Window lower bound (track firstSeen ≥ since). */
16665
+ since: number(),
16666
+ /** Window upper bound (track firstSeen ≤ until). */
16667
+ until: number(),
16668
+ limit: number().int().min(1).max(200).default(50),
16669
+ /** Drop tracks scoring below this importance. */
16670
+ minImportance: number().min(0).max(1).optional(),
16671
+ /** Restrict to a single class (e.g. 'person'). */
16672
+ classFilter: string().optional()
16673
+ });
16674
+ var KeyEventSchema = object({
16675
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
16676
+ id: string(),
16677
+ trackId: string(),
16678
+ /** Track start time (firstSeen). */
16679
+ timestamp: number(),
16680
+ className: string(),
16681
+ label: string().optional(),
16682
+ importance: number(),
16683
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
16684
+ bestEventId: string(),
16685
+ /** Track lifetime in ms (lastSeen - firstSeen). */
16686
+ windowMs: number().optional()
16687
+ });
16557
16688
  var TrackedDetectionSchema = object({
16558
16689
  trackId: string(),
16559
16690
  className: string(),
@@ -16583,7 +16714,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16583
16714
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
16584
16715
  kind: "mutation",
16585
16716
  auth: "admin"
16586
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
16717
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
16587
16718
  deviceId: number(),
16588
16719
  since: number(),
16589
16720
  until: number(),
@@ -18595,7 +18726,17 @@ var FaceInfoSchema = object({
18595
18726
  recognizedIdentityId: string().optional(),
18596
18727
  identityName: string().optional(),
18597
18728
  assigned: boolean(),
18598
- base64: string().optional()
18729
+ base64: string().optional(),
18730
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
18731
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
18732
+ * legacy rows written before design B. */
18733
+ faceBbox: BoundingBoxSchema.optional(),
18734
+ /** Design B: MediaStore key of the track's native-resolution key frame.
18735
+ * Fetch the native JPEG via the event-media data-plane
18736
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
18737
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
18738
+ * back to the inline `base64` face crop. */
18739
+ keyFrameMediaKey: string().optional()
18599
18740
  });
18600
18741
  var FaceFilterEnum = _enum([
18601
18742
  "unassigned",
@@ -22747,6 +22888,12 @@ Object.freeze({
22747
22888
  addonId: null,
22748
22889
  access: "view"
22749
22890
  },
22891
+ "pipelineAnalytics.getKeyEvents": {
22892
+ capName: "pipeline-analytics",
22893
+ capScope: "device",
22894
+ addonId: null,
22895
+ access: "view"
22896
+ },
22750
22897
  "pipelineAnalytics.getMotionEvents": {
22751
22898
  capName: "pipeline-analytics",
22752
22899
  capScope: "device",
@@ -23275,12 +23422,24 @@ Object.freeze({
23275
23422
  addonId: null,
23276
23423
  access: "view"
23277
23424
  },
23425
+ "pipelineRunner.getNativeCrop": {
23426
+ capName: "pipeline-runner",
23427
+ capScope: "system",
23428
+ addonId: null,
23429
+ access: "view"
23430
+ },
23278
23431
  "pipelineRunner.reportMotion": {
23279
23432
  capName: "pipeline-runner",
23280
23433
  capScope: "system",
23281
23434
  addonId: null,
23282
23435
  access: "create"
23283
23436
  },
23437
+ "pipelineRunner.runDetailSubtree": {
23438
+ capName: "pipeline-runner",
23439
+ capScope: "system",
23440
+ addonId: null,
23441
+ access: "create"
23442
+ },
23284
23443
  "plateGallery.correctPlateText": {
23285
23444
  capName: "plate-gallery",
23286
23445
  capScope: "system",
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-b4Jf2n33.mjs
4630
+ //#region ../types/dist/sleep-Baang_XW.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -11711,7 +11711,15 @@ var pipelineExecutorCapability = {
11711
11711
  image: _instanceof(Uint8Array).optional(),
11712
11712
  referenceImage: string().optional(),
11713
11713
  deviceId: number().optional(),
11714
- sessionId: string().optional()
11714
+ sessionId: string().optional(),
11715
+ /**
11716
+ * Execution plane. 'full' (default) runs the whole tree — benchmark,
11717
+ * reference-image, and detail-subtree calls. 'frame' is the live
11718
+ * per-frame dispatch: ONLY root-plane steps run; crop children
11719
+ * (inputClasses ≠ null) are skipped and served per-track via
11720
+ * pipelineRunner.runDetailSubtree (two-plane design).
11721
+ */
11722
+ plane: _enum(["full", "frame"]).optional()
11715
11723
  }), PipelineRunResultBridge, { kind: "mutation" }),
11716
11724
  /**
11717
11725
  * Batched run — N raw frames packed into one cap call. The provider
@@ -11890,6 +11898,47 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(ZoneSchema).read
11890
11898
  auth: "admin"
11891
11899
  }), object({ zones: array(ZoneSchema).readonly() });
11892
11900
  /**
11901
+ * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
11902
+ * decode worker resolves it against the RETAINED native frame's real pixel dims,
11903
+ * so the caller supplies only the detection-res bbox divided by the detection
11904
+ * dims — no native resolution to plumb.
11905
+ */
11906
+ var NativeCropBboxSchema = object({
11907
+ x: number(),
11908
+ y: number(),
11909
+ w: number(),
11910
+ h: number()
11911
+ });
11912
+ /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
11913
+ var NativeCropResultSchema = object({
11914
+ /** Packed rgb (24-bit) pixels of the crop. */
11915
+ bytes: _instanceof(Uint8Array),
11916
+ width: number().int().positive(),
11917
+ height: number().int().positive()
11918
+ });
11919
+ /** Parent detection context passed to `runDetailSubtree` — the crop's
11920
+ * originating detection, in FRAME-space coordinates. Reuses
11921
+ * `NativeCropBboxSchema`'s `{x,y,w,h}` shape (same numeric fields; here
11922
+ * the coordinates are frame-space rather than getNativeCrop's
11923
+ * normalized [0,1] convention). */
11924
+ var DetailParentSchema = object({
11925
+ bbox: NativeCropBboxSchema,
11926
+ className: string()
11927
+ });
11928
+ /** One child-step result from `runDetailSubtree` — an embedding, label,
11929
+ * or refined detection produced by running the crop-subtree on a
11930
+ * single tracked detection. */
11931
+ var DetailResultSchema = object({
11932
+ stepId: string(),
11933
+ className: string(),
11934
+ score: number(),
11935
+ /** FRAME-space bbox (already mapped back from crop space). */
11936
+ bbox: NativeCropBboxSchema.optional(),
11937
+ embedding: string().optional(),
11938
+ label: string().optional(),
11939
+ alignedCropJpeg: string().optional()
11940
+ });
11941
+ /**
11893
11942
  * Per-camera tunable ranges + defaults. Single source of truth used
11894
11943
  * by both the Zod data schema (validation + default fallback) and
11895
11944
  * the device settings UI (slider min/max/step). Touch one place and
@@ -12193,7 +12242,42 @@ var pipelineRunnerCapability = {
12193
12242
  /** All per-camera metrics in one round-trip. */
12194
12243
  getAllCameraMetrics: method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()),
12195
12244
  /** List the deviceIds currently attached to this runner. */
12196
- getLocalCameras: method(_void(), array(number()).readonly())
12245
+ getLocalCameras: method(_void(), array(number()).readonly()),
12246
+ /**
12247
+ * Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
12248
+ * `FrameHandle` that rode an inference-result event and a normalized `bbox`,
12249
+ * the runner asks the decode worker still holding that frame's NATIVE
12250
+ * surface to GPU/CPU-crop ONLY the ROI at native res and download just the
12251
+ * crop. Returns `null` on a miss (handle not registered, or the worker's
12252
+ * tiny native-retention ring already evicted the frame) — the caller falls
12253
+ * back to a detection-frame crop. Routed to the frame's owning node by
12254
+ * `handle.nodeId`; NEVER ships a full native frame.
12255
+ */
12256
+ getNativeCrop: method(object({
12257
+ handle: FrameHandleSchema,
12258
+ bbox: NativeCropBboxSchema,
12259
+ maxWidth: number().int().positive().optional()
12260
+ }), NativeCropResultSchema.nullable()),
12261
+ /**
12262
+ * Two-plane design: run the DETAIL subtree (crop children —
12263
+ * embedding, classifier, refiner steps whose `inputClasses ≠ null`)
12264
+ * for a single tracked detection. The per-frame plane (`runPipeline`
12265
+ * with `plane: 'frame'`) skips crop children entirely; a track-level
12266
+ * caller invokes this per-track, on its own cadence, instead of on
12267
+ * every frame. Takes either a `frameHandle` (shm lease/session —
12268
+ * preferred, zero-copy) or a `cropJpeg` fallback when the lease/
12269
+ * session backing the frame is already gone. `steps` narrows which
12270
+ * configured children to run (default: all configured children for
12271
+ * `parent.className`). Returns `null` when neither frame source is
12272
+ * resolvable (handle evicted and no cropJpeg fallback supplied).
12273
+ */
12274
+ runDetailSubtree: method(object({
12275
+ deviceId: number(),
12276
+ frameHandle: FrameHandleSchema.optional(),
12277
+ cropJpeg: string().optional(),
12278
+ parent: DetailParentSchema,
12279
+ steps: array(string()).optional()
12280
+ }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" })
12197
12281
  }
12198
12282
  };
12199
12283
  object({
@@ -16443,7 +16527,17 @@ var TrackSchema = object({
16443
16527
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
16444
16528
  totalDistance: number(),
16445
16529
  state: TrackStateSchema,
16446
- active: boolean()
16530
+ active: boolean(),
16531
+ /** Deterministic key-event importance score in [0,1] (server-computed at
16532
+ * track expiry, recomputed on late label). Absent on legacy rows written
16533
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
16534
+ importance: number().optional(),
16535
+ /** Id of the track's highest-confidence ObjectEvent (its representative
16536
+ * "best" frame). Absent when the track produced no object events. */
16537
+ bestEventId: string().optional(),
16538
+ /** Tag of the importance sub-signal that dominated the score
16539
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
16540
+ importanceReason: string().optional()
16447
16541
  });
16448
16542
  var BaseEventFields = {
16449
16543
  id: string(),
@@ -16508,8 +16602,18 @@ var ObjectEventSchema = object({
16508
16602
  frameHeight: number().optional(),
16509
16603
  /** MediaStore key for the crop attached to this event (if any). */
16510
16604
  mediaKey: string().optional(),
16605
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
16606
+ * best-detection full frame). Resolve via the event-media data-plane
16607
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
16608
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
16609
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
16610
+ keyFrameMediaKey: string().optional(),
16511
16611
  /** Populated by B5 (recording playback URL for this event). */
16512
- mediaUrl: string().optional()
16612
+ mediaUrl: string().optional(),
16613
+ /** The parent track's key-event importance [0,1], propagated to every object
16614
+ * event of the track (so an event row can be sorted by importance without a
16615
+ * track join). Absent on legacy rows / before the track was scored. */
16616
+ importance: number().optional()
16513
16617
  });
16514
16618
  var AudioEventSchema = object({
16515
16619
  ...BaseEventFields,
@@ -16533,7 +16637,8 @@ var MediaFileKindEnum = _enum([
16533
16637
  "fullFrame",
16534
16638
  "fullFrameBoxed",
16535
16639
  "faceCrop",
16536
- "plateCrop"
16640
+ "plateCrop",
16641
+ "keyFrame"
16537
16642
  ]);
16538
16643
  var MediaFileSchema = object({
16539
16644
  key: string(),
@@ -16554,6 +16659,32 @@ var DeviceEventQueryInput = object({
16554
16659
  projection: _enum(["full", "slim"]).optional()
16555
16660
  });
16556
16661
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
16662
+ var KeyEventQueryInput = object({
16663
+ deviceId: number(),
16664
+ /** Window lower bound (track firstSeen ≥ since). */
16665
+ since: number(),
16666
+ /** Window upper bound (track firstSeen ≤ until). */
16667
+ until: number(),
16668
+ limit: number().int().min(1).max(200).default(50),
16669
+ /** Drop tracks scoring below this importance. */
16670
+ minImportance: number().min(0).max(1).optional(),
16671
+ /** Restrict to a single class (e.g. 'person'). */
16672
+ classFilter: string().optional()
16673
+ });
16674
+ var KeyEventSchema = object({
16675
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
16676
+ id: string(),
16677
+ trackId: string(),
16678
+ /** Track start time (firstSeen). */
16679
+ timestamp: number(),
16680
+ className: string(),
16681
+ label: string().optional(),
16682
+ importance: number(),
16683
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
16684
+ bestEventId: string(),
16685
+ /** Track lifetime in ms (lastSeen - firstSeen). */
16686
+ windowMs: number().optional()
16687
+ });
16557
16688
  var TrackedDetectionSchema = object({
16558
16689
  trackId: string(),
16559
16690
  className: string(),
@@ -16583,7 +16714,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16583
16714
  }), array(TrackSchema).readonly()), method(object({ deviceId: number() }), _void(), {
16584
16715
  kind: "mutation",
16585
16716
  auth: "admin"
16586
- }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({
16717
+ }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
16587
16718
  deviceId: number(),
16588
16719
  since: number(),
16589
16720
  until: number(),
@@ -18595,7 +18726,17 @@ var FaceInfoSchema = object({
18595
18726
  recognizedIdentityId: string().optional(),
18596
18727
  identityName: string().optional(),
18597
18728
  assigned: boolean(),
18598
- base64: string().optional()
18729
+ base64: string().optional(),
18730
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
18731
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
18732
+ * legacy rows written before design B. */
18733
+ faceBbox: BoundingBoxSchema.optional(),
18734
+ /** Design B: MediaStore key of the track's native-resolution key frame.
18735
+ * Fetch the native JPEG via the event-media data-plane
18736
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
18737
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
18738
+ * back to the inline `base64` face crop. */
18739
+ keyFrameMediaKey: string().optional()
18599
18740
  });
18600
18741
  var FaceFilterEnum = _enum([
18601
18742
  "unassigned",
@@ -22747,6 +22888,12 @@ Object.freeze({
22747
22888
  addonId: null,
22748
22889
  access: "view"
22749
22890
  },
22891
+ "pipelineAnalytics.getKeyEvents": {
22892
+ capName: "pipeline-analytics",
22893
+ capScope: "device",
22894
+ addonId: null,
22895
+ access: "view"
22896
+ },
22750
22897
  "pipelineAnalytics.getMotionEvents": {
22751
22898
  capName: "pipeline-analytics",
22752
22899
  capScope: "device",
@@ -23275,12 +23422,24 @@ Object.freeze({
23275
23422
  addonId: null,
23276
23423
  access: "view"
23277
23424
  },
23425
+ "pipelineRunner.getNativeCrop": {
23426
+ capName: "pipeline-runner",
23427
+ capScope: "system",
23428
+ addonId: null,
23429
+ access: "view"
23430
+ },
23278
23431
  "pipelineRunner.reportMotion": {
23279
23432
  capName: "pipeline-runner",
23280
23433
  capScope: "system",
23281
23434
  addonId: null,
23282
23435
  access: "create"
23283
23436
  },
23437
+ "pipelineRunner.runDetailSubtree": {
23438
+ capName: "pipeline-runner",
23439
+ capScope: "system",
23440
+ addonId: null,
23441
+ access: "create"
23442
+ },
23284
23443
  "plateGallery.correctPlateText": {
23285
23444
  capName: "plate-gallery",
23286
23445
  capScope: "system",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DWb62H5U.js");
5
+ const require_dist = require("../dist-DI57FC8K.js");
6
6
  let _camstack_shm_ring = require("@camstack/shm-ring");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { B as DeviceType, E as motionDetectionCapability, L as BaseAddon, U as hydrateSchema, x as evaluateZoneRules } from "../dist-BalxNwOt.mjs";
1
+ import { B as DeviceType, E as motionDetectionCapability, L as BaseAddon, U as hydrateSchema, x as evaluateZoneRules } from "../dist-RWGGPwVx.mjs";
2
2
  import { FrameRingReaderCache } from "@camstack/shm-ring";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";