@camstack/addon-osd-manager 0.1.95 → 0.1.97

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 (18) hide show
  1. package/dist/{MotionZonesSettings-DiPEp4sf.mjs → MotionZonesSettings-DpjulO5F.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-DtN4fpc6.mjs → PrivacyMaskSettings-DaxBEzfV.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-DYVrXZTY.mjs → SceneMonitorEditor-DoZLlL7g.mjs} +258 -255
  4. package/dist/_stub.js +301 -351
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-dNE4llqV.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C-0Xt8HG.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-0OJdCNRg.mjs +26 -0
  7. package/dist/{hostInit-BLtrqD3e.mjs → hostInit-DArYUUQ8.mjs} +3 -3
  8. package/dist/index.js +202 -52
  9. package/dist/index.mjs +202 -52
  10. package/dist/{player-overlays-CwrMj6Pr.mjs → player-overlays-CKl-z5dT.mjs} +2 -2
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-RmJIe_kG.mjs → responsive-Db-2LAhn.mjs} +3 -3
  13. package/dist/{square-CwZjiwHQ.mjs → square-D4bK2uSS.mjs} +1 -1
  14. package/dist/{trash-2-BTG6P2f3.mjs → trash-2-CkBUBr8-.mjs} +1 -1
  15. package/dist/{use-device-snapshot-Woc9fBcw.mjs → use-device-snapshot-VChilLVp.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-gtUTtVcw.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Dc06UWXO.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DZnyQitE.mjs +0 -26
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-DAXzJeTX.mjs
1
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -559,7 +559,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
559
559
  * a package zone — a newly-appeared stationary object of a package class
560
560
  * that cleared the class / zone / dwell / size gates. Payload:
561
561
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
562
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
562
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
563
563
  * Telemetry (D8): the durable record is the `package-events` store row;
564
564
  * this bus topic drives notifier rules + live UI. See
565
565
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5345,7 +5345,7 @@ var ZodIssueCode = {
5345
5345
  var ZodFirstPartyTypeKind;
5346
5346
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5347
5347
  //#endregion
5348
- //#region ../types/dist/sleep-BnujYGPe.mjs
5348
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5349
5349
  /**
5350
5350
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5351
5351
  * window to float samples (D455).
@@ -7408,13 +7408,30 @@ new Set([
7408
7408
  "scene",
7409
7409
  "motion",
7410
7410
  "object",
7411
- "audio"
7411
+ "audio",
7412
+ "mosaic"
7412
7413
  ]);
7413
- new Set([
7414
+ /**
7415
+ * The owner types that are event tables, in the order the event-media resolver
7416
+ * should consider them. Exported so a consumer asking "is this key an event?"
7417
+ * does not re-spell the list and drift from it.
7418
+ */
7419
+ var EVENT_OWNER_TYPES = [
7414
7420
  "motion",
7415
7421
  "object",
7416
7422
  "audio"
7417
- ]);
7423
+ ];
7424
+ /**
7425
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7426
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7427
+ * `(table, id)`).
7428
+ *
7429
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7430
+ * table would otherwise be accepted by the codec and refused at the door, with
7431
+ * nothing failing until a caller asked.
7432
+ */
7433
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7434
+ new Set(EVENT_OWNER_TYPES);
7418
7435
  var EncodeProfileSchema = object({
7419
7436
  video: object({
7420
7437
  codec: _enum([
@@ -13379,6 +13396,59 @@ var settingsStoreCapability = {
13379
13396
  filter: QueryFilterSchema.optional(),
13380
13397
  columns: array(string()).readonly().optional()
13381
13398
  }), array(SettingsRecordSchema).readonly()),
13399
+ /**
13400
+ * Make a SLOT hold this row — insert it, or update whatever already
13401
+ * occupies the slot — and answer with the id the row HAS.
13402
+ *
13403
+ * ## Why the store needed this
13404
+ *
13405
+ * {@link set} is already an upsert, but its slot is the PRIMARY KEY: the
13406
+ * caller has to know the id to address the row. That is exactly what a
13407
+ * collection keyed by an `INTEGER` rowid alias cannot do — SQLite assigns
13408
+ * the id, so a writer whose uniqueness rule is "one row per
13409
+ * `(ownerKind, ownerId, kind, slot)`" has no id to name and no way to
13410
+ * express the rule. {@link insert} can express it (a UNIQUE index
13411
+ * arbitrates) but only by THROWING at the loser of a race, and the loser
13412
+ * here is a legitimate re-capture, not an error.
13413
+ *
13414
+ * Getting there without this method means read-then-write: query the slot,
13415
+ * then `insert` or `update`. Two statements instead of one, a race between
13416
+ * them, and a recovery path that has to recognise a UNIQUE violation by its
13417
+ * MESSAGE — across a process boundary, because the store lives behind an
13418
+ * RPC door. A string match would be the whole gate, and a store that
13419
+ * rephrased its error would lose the row silently. One statement has no
13420
+ * such gate (D482).
13421
+ *
13422
+ * ## The contract
13423
+ *
13424
+ * `conflict` names the DECLARED columns that identify the slot. They must
13425
+ * be covered by a UNIQUE index on the collection — SQLite resolves an
13426
+ * `ON CONFLICT` target against its indexes and REFUSES the statement when
13427
+ * none matches, so a wrong list is a loud error on the first write, never a
13428
+ * silently duplicated row. An empty list is refused rather than passed on:
13429
+ * `ON CONFLICT()` is not valid SQL, and the intent it would most likely
13430
+ * encode ("no slot, just insert") is {@link insert}.
13431
+ *
13432
+ * Row shape is {@link insert}'s: `record.id` is used when the collection
13433
+ * needs a supplied key and IGNORED when the primary key is an `INTEGER`
13434
+ * rowid alias — exactly as `insert` and `insertMany` already treat it.
13435
+ *
13436
+ * Returns the id either way: the one SQLite assigned on an insert, or the
13437
+ * one the row it updated already had. A caller cannot tell which happened,
13438
+ * and deliberately — every caller wants the slot's id, and one that needed
13439
+ * to distinguish creation from replacement would have to read first anyway.
13440
+ */
13441
+ upsert: method(object({
13442
+ namespace: string().optional(),
13443
+ collection: string(),
13444
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13445
+ * index on the collection. Never empty. */
13446
+ conflict: array(string()).readonly(),
13447
+ record: BulkRecordSchema
13448
+ }), object({
13449
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13450
+ * row's own id on an update. */
13451
+ id: union([string(), number()]) }), { kind: "mutation" }),
13382
13452
  /** Insert a new record. */
13383
13453
  insert: method(object({
13384
13454
  namespace: string().optional(),
@@ -13668,6 +13738,20 @@ id: union([string(), number()]) }), {
13668
13738
  kind: "mutation",
13669
13739
  auth: "admin"
13670
13740
  }),
13741
+ /**
13742
+ * Make a slot hold this row, and answer with the id the row HAS. The
13743
+ * engine half of `settings-store.upsert` — read that docblock for why the
13744
+ * store needed a slot that is not the primary key (D482).
13745
+ */
13746
+ upsert: method(object({
13747
+ namespace: string().optional(),
13748
+ collection: string(),
13749
+ conflict: array(string()).readonly(),
13750
+ record: BulkRecordSchema
13751
+ }), object({ id: union([string(), number()]) }), {
13752
+ kind: "mutation",
13753
+ auth: "admin"
13754
+ }),
13671
13755
  /** Insert many records in ONE transaction. All or nothing. */
13672
13756
  insertMany: method(object({
13673
13757
  namespace: string().optional(),
@@ -21852,8 +21936,8 @@ var TrackPositionSchema = object({
21852
21936
  var TrackSnapshotSchema = object({
21853
21937
  timestamp: number(),
21854
21938
  position: TrackPositionSchema,
21855
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
21856
- mediaKey: string()
21939
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
21940
+ mediaId: number().int()
21857
21941
  });
21858
21942
  /**
21859
21943
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -22457,14 +22541,14 @@ var ObjectEventSchema = object({
22457
22541
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
22458
22542
  frameWidth: number().optional(),
22459
22543
  frameHeight: number().optional(),
22460
- /** MediaStore key for the crop attached to this event (if any). */
22461
- mediaKey: string().optional(),
22462
- /** Design B: MediaStore key of the track's native-resolution key frame (the
22544
+ /** Media row id of the crop attached to this event (if any) — D482. */
22545
+ mediaId: number().int().optional(),
22546
+ /** Design B: media row id of the track's native-resolution key frame (the
22463
22547
  * best-detection full frame). Resolve via the event-media data-plane
22464
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
22548
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
22465
22549
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
22466
- * sources — consumers fall back to `mediaKey` (the tight crop). */
22467
- keyFrameMediaKey: string().optional(),
22550
+ * sources — consumers fall back to `mediaId` (the tight crop). */
22551
+ keyFrameMediaId: number().int().optional(),
22468
22552
  /** Populated by B5 (recording playback URL for this event). */
22469
22553
  mediaUrl: string().optional(),
22470
22554
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -22514,7 +22598,7 @@ var MediaFileKindEnum = _enum([
22514
22598
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
22515
22599
  *
22516
22600
  * `url` points at the `event-media` data plane
22517
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
22601
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
22518
22602
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
22519
22603
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
22520
22604
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -22522,10 +22606,13 @@ var MediaFileKindEnum = _enum([
22522
22606
  * `data-plane-access.ts` for the rule and the one gap it does not close
22523
22607
  * (per-device scoping).
22524
22608
  *
22525
- * The URL is built from the row's **stored** key, which is not always its
22526
- * published `kind`: a track's face/plate crop is stored as `crop` under
22609
+ * The URL is built from the row's own id, which since D482 says nothing about
22610
+ * the row's owner or kind — and that is the point. The published `kind` is not
22611
+ * the stored one (a track's face/plate crop is stored as `crop` under
22527
22612
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
22528
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
22613
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
22614
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
22615
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
22529
22616
  *
22530
22617
  * ## `base64` is TRANSITIONAL and is going away
22531
22618
  *
@@ -22538,7 +22625,19 @@ var MediaFileKindEnum = _enum([
22538
22625
  * `analytics-query-facade.ts`; nothing else reads it.
22539
22626
  */
22540
22627
  var MediaFileSchema = object({
22541
- key: string(),
22628
+ /**
22629
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
22630
+ *
22631
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
22632
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
22633
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
22634
+ * different rows that spell the same number, and a track whose
22635
+ * `bestEventId` was an object event was served a motion event's snapshot —
22636
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
22637
+ * surrogate id cannot name the wrong row's owner, because it names no owner
22638
+ * at all.
22639
+ */
22640
+ mediaId: number().int(),
22542
22641
  kind: MediaFileKindEnum,
22543
22642
  sizeBytes: number(),
22544
22643
  timestamp: number()
@@ -22646,7 +22745,7 @@ var RetrainTrackSchema = object({
22646
22745
  });
22647
22746
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
22648
22747
  var RetrainFrameCandidateSchema = object({
22649
- mediaKey: string(),
22748
+ mediaId: number().int(),
22650
22749
  kind: MediaFileKindEnum,
22651
22750
  timestamp: number(),
22652
22751
  sizeBytes: number().int(),
@@ -22660,7 +22759,7 @@ var RetrainFrameSchema = object({
22660
22759
  deviceId: number(),
22661
22760
  trackId: string(),
22662
22761
  /** Provenance only. It may already point at nothing — that is expected. */
22663
- sourceMediaKey: string(),
22762
+ sourceMediaId: number().int(),
22664
22763
  sourceKind: MediaFileKindEnum,
22665
22764
  sizeBytes: number().int(),
22666
22765
  width: number().int(),
@@ -22676,7 +22775,7 @@ var RetrainCopyRefusalSchema = _enum([
22676
22775
  var RetrainFrameSelectionSchema = object({
22677
22776
  copied: array(RetrainFrameSchema).readonly(),
22678
22777
  refused: array(object({
22679
- sourceMediaKey: string(),
22778
+ sourceMediaId: number().int(),
22680
22779
  reason: RetrainCopyRefusalSchema
22681
22780
  })).readonly()
22682
22781
  });
@@ -22684,7 +22783,7 @@ var RetrainFrameListSchema = object({
22684
22783
  candidates: array(RetrainFrameCandidateSchema).readonly(),
22685
22784
  copies: array(RetrainFrameSchema).readonly(),
22686
22785
  /** What the page pre-selects — the native key frame when one survives. */
22687
- autoPickMediaKey: string().optional()
22786
+ autoPickMediaId: number().int().optional()
22688
22787
  });
22689
22788
  /** What the operator asked the assist to look for. */
22690
22789
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -22779,9 +22878,11 @@ var RecentTracksQueryInput = object({
22779
22878
  });
22780
22879
  /**
22781
22880
  * A Summary (D359): the per-camera session envelope that references tracks.
22782
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
22783
- * served by the event-media plane by key), null until the first frame with a
22784
- * member visible has been materialised.
22881
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
22882
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
22883
+ * first frame with a member visible has been materialised (D482 — it was the
22884
+ * row's composite key, which embedded the owner and could name another table's
22885
+ * row once event ids became per-table rowids).
22785
22886
  */
22786
22887
  var SummarySchema = object({
22787
22888
  id: string(),
@@ -22790,7 +22891,7 @@ var SummarySchema = object({
22790
22891
  lastActiveAt: number(),
22791
22892
  sealedAt: number().nullable(),
22792
22893
  memberCount: number().int().nonnegative(),
22793
- groupShotKey: string().nullable()
22894
+ groupShotMediaId: number().int().nullable()
22794
22895
  });
22795
22896
  var SummariesQueryInput = object({
22796
22897
  deviceIds: array(number()).min(1),
@@ -23773,7 +23874,7 @@ var pipelineAnalyticsCapability = {
23773
23874
  selectRetrainFrames: method(object({
23774
23875
  deviceId: number(),
23775
23876
  trackId: string(),
23776
- mediaKeys: array(string()).min(1)
23877
+ mediaIds: array(number().int()).min(1)
23777
23878
  }), RetrainFrameSelectionSchema, {
23778
23879
  kind: "mutation",
23779
23880
  auth: "admin"
@@ -23937,8 +24038,29 @@ var pipelineAnalyticsCapability = {
23937
24038
  kind: "query",
23938
24039
  auth: "admin"
23939
24040
  }),
24041
+ /**
24042
+ * The media an EVENT owns.
24043
+ *
24044
+ * `ownerType` is REQUIRED, and that is the whole correction (D482). An
24045
+ * event is a row in ONE of three tables, and since D474 each numbers from
24046
+ * 1 independently: `motion:101314` and `object:101314` both exist. This
24047
+ * method took a bare `eventId` and the provider probed motion → object →
24048
+ * audio, stopping at the first hit — so on the live hub, where object
24049
+ * events own no media of their own and 299 883 of 300 559 media rows are
24050
+ * motion-owned, EVERY object event resolved to its motion namesake. A
24051
+ * track from 17:34 on camera 615 was served a snapshot from 22:35 eleven
24052
+ * days earlier, silently.
24053
+ *
24054
+ * D476 had already disambiguated the KEY (`motion:` vs `object:`); this is
24055
+ * the API catching up to it. Naming the table is not a "qualification" of
24056
+ * the ambiguity — a listing BY OWNER has no address to make surrogate: the
24057
+ * owner IS (table, id), and half of it is not a question.
24058
+ */
23940
24059
  getEventMedia: method(object({
23941
- eventId: string(),
24060
+ /** Which of the three event tables owns the row. */
24061
+ ownerType: EventOwnerTypeSchema,
24062
+ /** The event's rowid in that table (D474: an event id is a number). */
24063
+ eventId: number().int(),
23942
24064
  kind: MediaFileKindEnum.optional(),
23943
24065
  deviceId: number()
23944
24066
  }), array(MediaFileSchema).readonly()),
@@ -23983,11 +24105,14 @@ var pipelineAnalyticsCapability = {
23983
24105
  * the live hub: one event's `fullFrameBoxed` is 2 824 077 B, base64'd to
23984
24106
  * ~3.8 MB, allocated whole in hub-main's heap, for a list of keys.
23985
24107
  *
23986
- * Same `deviceId` authorization subject as `getEventMedia`, and the same
23987
- * rows — this is a projection of that method, never a different question.
24108
+ * Same `deviceId` authorization subject as `getEventMedia`, the same
24109
+ * REQUIRED `ownerType` (read that method's docblock for the night-time
24110
+ * thumbnail this closes — D482), and the same rows: this is a projection
24111
+ * of that method, never a different question.
23988
24112
  */
23989
24113
  listEventMedia: method(object({
23990
- eventId: string(),
24114
+ ownerType: EventOwnerTypeSchema,
24115
+ eventId: number().int(),
23991
24116
  deviceId: number()
23992
24117
  }), array(MediaFileInfoSchema).readonly()),
23993
24118
  /**
@@ -30614,8 +30739,8 @@ var IdentitySchema = object({
30614
30739
  id: string(),
30615
30740
  name: string(),
30616
30741
  sampleCount: number().int().nonnegative(),
30617
- coverMediaKey: string().optional(),
30618
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
30742
+ coverMediaId: number().int().optional(),
30743
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
30619
30744
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
30620
30745
  coverBase64: string().optional()
30621
30746
  });
@@ -30641,8 +30766,8 @@ var IdentitySampleAuditRowSchema = object({
30641
30766
  enrolledAt: number().int(),
30642
30767
  deviceId: number().int().optional(),
30643
30768
  source: _enum(["detected", "photo"]),
30644
- /** The enrolled crop's media key, so the panel can show the evidence. */
30645
- mediaKey: string().optional(),
30769
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
30770
+ mediaId: number().int().optional(),
30646
30771
  /**
30647
30772
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
30648
30773
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -30711,15 +30836,15 @@ var FaceInfoSchema = object({
30711
30836
  */
30712
30837
  cropUrl: string().optional(),
30713
30838
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
30714
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
30839
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
30715
30840
  * legacy rows written before design B. */
30716
30841
  faceBbox: BoundingBoxSchema.optional(),
30717
30842
  /** Design B: MediaStore key of the track's native-resolution key frame.
30718
30843
  * Fetch the native JPEG via the event-media data-plane
30719
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
30844
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
30720
30845
  * track produced no key frame (e.g. native/onboard source) — the UI falls
30721
30846
  * back to the inline `base64` face crop. */
30722
- keyFrameMediaKey: string().optional(),
30847
+ keyFrameMediaId: number().int().optional(),
30723
30848
  /** Winning identity-match cosine (0..1) for this face's track, when an
30724
30849
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
30725
30850
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -30788,11 +30913,14 @@ var FaceClusterSchema = object({
30788
30913
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
30789
30914
  * dialog already rendering its key FRAME from the `event-media` plane.
30790
30915
  *
30791
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
30792
- * media key directly, so this needed no new plane and no new access decision.
30916
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
30917
+ * resolves a media row by its own id, so this needed no new plane and no new
30918
+ * access decision.
30793
30919
  */
30794
30920
  var MediaFileLiteSchema$1 = object({
30795
- key: string(),
30921
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
30922
+ * (D482). It was the row's composite key, which embedded the owner. */
30923
+ mediaId: number().int(),
30796
30924
  kind: string(),
30797
30925
  url: string(),
30798
30926
  sizeBytes: number(),
@@ -30814,7 +30942,7 @@ var faceGalleryCapability = {
30814
30942
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
30815
30943
  * four times and the viewer holds at `staleTime: 30_000`.
30816
30944
  *
30817
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
30945
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
30818
30946
  * the `event-media` plane serves that key `immutable` with an ETag.
30819
30947
  *
30820
30948
  * **This is an INPUT field, so it does not reach the addon until the
@@ -34553,8 +34681,8 @@ var VehicleSchema = object({
34553
34681
  id: string(),
34554
34682
  name: string(),
34555
34683
  sampleCount: number().int().nonnegative(),
34556
- coverMediaKey: string().optional(),
34557
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
34684
+ coverMediaId: number().int().optional(),
34685
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
34558
34686
  coverBase64: string().optional()
34559
34687
  });
34560
34688
  var VehicleSampleInfoSchema = object({
@@ -34587,7 +34715,7 @@ var PlateInfoSchema = object({
34587
34715
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
34588
34716
  plateBbox: BoundingBoxSchema.optional(),
34589
34717
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
34590
- keyFrameMediaKey: string().optional(),
34718
+ keyFrameMediaId: number().int().optional(),
34591
34719
  base64: string().optional(),
34592
34720
  /**
34593
34721
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -34608,11 +34736,14 @@ var PlateInfoSchema = object({
34608
34736
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
34609
34737
  * dialog already rendering its key FRAME from the `event-media` plane.
34610
34738
  *
34611
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
34612
- * media key directly, so this needed no new plane and no new access decision.
34739
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
34740
+ * resolves a media row by its own id, so this needed no new plane and no new
34741
+ * access decision.
34613
34742
  */
34614
34743
  var MediaFileLiteSchema = object({
34615
- key: string(),
34744
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
34745
+ * (D482). It was the row's composite key, which embedded the owner. */
34746
+ mediaId: number().int(),
34616
34747
  kind: string(),
34617
34748
  url: string(),
34618
34749
  sizeBytes: number(),
@@ -34694,7 +34825,7 @@ var plateGalleryCapability = {
34694
34825
  listVehicles: method(object({
34695
34826
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
34696
34827
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
34697
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
34828
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
34698
34829
  * INPUT field: stripped by the hub router until the train ships, which
34699
34830
  * resolves to `false` and is exactly the intended default. */
34700
34831
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()),
@@ -36557,7 +36688,14 @@ var SceneReferenceSchema = object({
36557
36688
  modelId: string(),
36558
36689
  condition: SceneConditionSchema,
36559
36690
  capturedAt: number(),
36560
- thumbnailMediaId: string().optional(),
36691
+ /**
36692
+ * The reference thumbnail's media ROW id (D482).
36693
+ *
36694
+ * The name already said `mediaId` while the value was the row's composite
36695
+ * key — a leftover that read as done and was not. It is the row's own id
36696
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
36697
+ */
36698
+ thumbnailMediaId: number().int().optional(),
36561
36699
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
36562
36700
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
36563
36701
  * normalized rect frame a different piece of world, and the scene would
@@ -38692,7 +38830,7 @@ var StationaryObjectSchema = object({
38692
38830
  /** Enrichment label carried from the source track (identity / plate). */
38693
38831
  label: string().optional(),
38694
38832
  /** Native-resolution key-frame media key for the parked object's best image. */
38695
- keyFrameMediaKey: string().optional()
38833
+ keyFrameMediaId: number().int().optional()
38696
38834
  });
38697
38835
  var CameraOccupancySnapshotSchema = object({
38698
38836
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -40195,6 +40333,12 @@ Object.freeze({
40195
40333
  addonId: null,
40196
40334
  access: "create"
40197
40335
  },
40336
+ "dataStoreProvider.upsert": {
40337
+ capName: "data-store-provider",
40338
+ capScope: "system",
40339
+ addonId: null,
40340
+ access: "create"
40341
+ },
40198
40342
  "dayNight.getOptions": {
40199
40343
  capName: "day-night",
40200
40344
  capScope: "device",
@@ -44059,6 +44203,12 @@ Object.freeze({
44059
44203
  addonId: null,
44060
44204
  access: "create"
44061
44205
  },
44206
+ "settingsStore.upsert": {
44207
+ capName: "settings-store",
44208
+ capScope: "system",
44209
+ addonId: null,
44210
+ access: "create"
44211
+ },
44062
44212
  "smtpProvider.getStatus": {
44063
44213
  capName: "smtp-provider",
44064
44214
  capScope: "system",
@@ -1,5 +1,5 @@
1
1
  import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
- import { o as i, s as a } from "./responsive-RmJIe_kG.mjs";
2
+ import { o as i, s as a } from "./responsive-Db-2LAhn.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
4
4
  var l = a("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
@@ -41,4 +41,4 @@ function p(e) {
41
41
  }, [r, e]);
42
42
  }
43
43
  //#endregion
44
- export { d as n, l as r, p as t };
44
+ export { l as i, d as n, u as r, p as t };
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-gtUTtVcw.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Dc06UWXO.mjs";
2
2
  export { t as get, e as init };
@@ -1,7 +1,7 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
3
- import { n as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DZnyQitE.mjs";
4
- //#region ../ui-library/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
3
+ import { n as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-0OJdCNRg.mjs";
4
+ //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  l();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
7
7
  let t = p(e);
@@ -31,7 +31,7 @@ var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) =
31
31
  ...c
32
32
  }, [...s.map(([e, t]) => i(e, t)), ...Array.isArray(o) ? o : [o]]));
33
33
  //#endregion
34
- //#region ../ui-library/node_modules/lucide-react/dist/esm/createLucideIcon.js
34
+ //#region ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
35
35
  l();
36
36
  var v = (e, t) => {
37
37
  let n = o(({ className: n, ...r }, a) => i(_, {
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-RmJIe_kG.mjs";
1
+ import { s as e } from "./responsive-Db-2LAhn.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-RmJIe_kG.mjs";
1
+ import { s as e } from "./responsive-Db-2LAhn.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -1,5 +1,5 @@
1
1
  import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
- import { s as i } from "./responsive-RmJIe_kG.mjs";
2
+ import { s as i } from "./responsive-Db-2LAhn.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-dNE4llqV.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C-0Xt8HG.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-osd-manager",
3
- "version": "0.1.95",
3
+ "version": "0.1.97",
4
4
  "description": "Binds camera on-screen-display slots to live state and recognitions",
5
5
  "keywords": [
6
6
  "camstack",