@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.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- //#region ../types/dist/event-category-DAXzJeTX.mjs
5
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -563,7 +563,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
563
563
  * a package zone — a newly-appeared stationary object of a package class
564
564
  * that cleared the class / zone / dwell / size gates. Payload:
565
565
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
566
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
566
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
567
567
  * Telemetry (D8): the durable record is the `package-events` store row;
568
568
  * this bus topic drives notifier rules + live UI. See
569
569
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5349,7 +5349,7 @@ var ZodIssueCode = {
5349
5349
  var ZodFirstPartyTypeKind;
5350
5350
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5351
5351
  //#endregion
5352
- //#region ../types/dist/sleep-BnujYGPe.mjs
5352
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5353
5353
  /**
5354
5354
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5355
5355
  * window to float samples (D455).
@@ -7412,13 +7412,30 @@ new Set([
7412
7412
  "scene",
7413
7413
  "motion",
7414
7414
  "object",
7415
- "audio"
7415
+ "audio",
7416
+ "mosaic"
7416
7417
  ]);
7417
- new Set([
7418
+ /**
7419
+ * The owner types that are event tables, in the order the event-media resolver
7420
+ * should consider them. Exported so a consumer asking "is this key an event?"
7421
+ * does not re-spell the list and drift from it.
7422
+ */
7423
+ var EVENT_OWNER_TYPES = [
7418
7424
  "motion",
7419
7425
  "object",
7420
7426
  "audio"
7421
- ]);
7427
+ ];
7428
+ /**
7429
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7430
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7431
+ * `(table, id)`).
7432
+ *
7433
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7434
+ * table would otherwise be accepted by the codec and refused at the door, with
7435
+ * nothing failing until a caller asked.
7436
+ */
7437
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7438
+ new Set(EVENT_OWNER_TYPES);
7422
7439
  var EncodeProfileSchema = object({
7423
7440
  video: object({
7424
7441
  codec: _enum([
@@ -13383,6 +13400,59 @@ var settingsStoreCapability = {
13383
13400
  filter: QueryFilterSchema.optional(),
13384
13401
  columns: array(string()).readonly().optional()
13385
13402
  }), array(SettingsRecordSchema).readonly()),
13403
+ /**
13404
+ * Make a SLOT hold this row — insert it, or update whatever already
13405
+ * occupies the slot — and answer with the id the row HAS.
13406
+ *
13407
+ * ## Why the store needed this
13408
+ *
13409
+ * {@link set} is already an upsert, but its slot is the PRIMARY KEY: the
13410
+ * caller has to know the id to address the row. That is exactly what a
13411
+ * collection keyed by an `INTEGER` rowid alias cannot do — SQLite assigns
13412
+ * the id, so a writer whose uniqueness rule is "one row per
13413
+ * `(ownerKind, ownerId, kind, slot)`" has no id to name and no way to
13414
+ * express the rule. {@link insert} can express it (a UNIQUE index
13415
+ * arbitrates) but only by THROWING at the loser of a race, and the loser
13416
+ * here is a legitimate re-capture, not an error.
13417
+ *
13418
+ * Getting there without this method means read-then-write: query the slot,
13419
+ * then `insert` or `update`. Two statements instead of one, a race between
13420
+ * them, and a recovery path that has to recognise a UNIQUE violation by its
13421
+ * MESSAGE — across a process boundary, because the store lives behind an
13422
+ * RPC door. A string match would be the whole gate, and a store that
13423
+ * rephrased its error would lose the row silently. One statement has no
13424
+ * such gate (D482).
13425
+ *
13426
+ * ## The contract
13427
+ *
13428
+ * `conflict` names the DECLARED columns that identify the slot. They must
13429
+ * be covered by a UNIQUE index on the collection — SQLite resolves an
13430
+ * `ON CONFLICT` target against its indexes and REFUSES the statement when
13431
+ * none matches, so a wrong list is a loud error on the first write, never a
13432
+ * silently duplicated row. An empty list is refused rather than passed on:
13433
+ * `ON CONFLICT()` is not valid SQL, and the intent it would most likely
13434
+ * encode ("no slot, just insert") is {@link insert}.
13435
+ *
13436
+ * Row shape is {@link insert}'s: `record.id` is used when the collection
13437
+ * needs a supplied key and IGNORED when the primary key is an `INTEGER`
13438
+ * rowid alias — exactly as `insert` and `insertMany` already treat it.
13439
+ *
13440
+ * Returns the id either way: the one SQLite assigned on an insert, or the
13441
+ * one the row it updated already had. A caller cannot tell which happened,
13442
+ * and deliberately — every caller wants the slot's id, and one that needed
13443
+ * to distinguish creation from replacement would have to read first anyway.
13444
+ */
13445
+ upsert: method(object({
13446
+ namespace: string().optional(),
13447
+ collection: string(),
13448
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13449
+ * index on the collection. Never empty. */
13450
+ conflict: array(string()).readonly(),
13451
+ record: BulkRecordSchema
13452
+ }), object({
13453
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13454
+ * row's own id on an update. */
13455
+ id: union([string(), number()]) }), { kind: "mutation" }),
13386
13456
  /** Insert a new record. */
13387
13457
  insert: method(object({
13388
13458
  namespace: string().optional(),
@@ -13672,6 +13742,20 @@ id: union([string(), number()]) }), {
13672
13742
  kind: "mutation",
13673
13743
  auth: "admin"
13674
13744
  }),
13745
+ /**
13746
+ * Make a slot hold this row, and answer with the id the row HAS. The
13747
+ * engine half of `settings-store.upsert` — read that docblock for why the
13748
+ * store needed a slot that is not the primary key (D482).
13749
+ */
13750
+ upsert: method(object({
13751
+ namespace: string().optional(),
13752
+ collection: string(),
13753
+ conflict: array(string()).readonly(),
13754
+ record: BulkRecordSchema
13755
+ }), object({ id: union([string(), number()]) }), {
13756
+ kind: "mutation",
13757
+ auth: "admin"
13758
+ }),
13675
13759
  /** Insert many records in ONE transaction. All or nothing. */
13676
13760
  insertMany: method(object({
13677
13761
  namespace: string().optional(),
@@ -21856,8 +21940,8 @@ var TrackPositionSchema = object({
21856
21940
  var TrackSnapshotSchema = object({
21857
21941
  timestamp: number(),
21858
21942
  position: TrackPositionSchema,
21859
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
21860
- mediaKey: string()
21943
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
21944
+ mediaId: number().int()
21861
21945
  });
21862
21946
  /**
21863
21947
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -22461,14 +22545,14 @@ var ObjectEventSchema = object({
22461
22545
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
22462
22546
  frameWidth: number().optional(),
22463
22547
  frameHeight: number().optional(),
22464
- /** MediaStore key for the crop attached to this event (if any). */
22465
- mediaKey: string().optional(),
22466
- /** Design B: MediaStore key of the track's native-resolution key frame (the
22548
+ /** Media row id of the crop attached to this event (if any) — D482. */
22549
+ mediaId: number().int().optional(),
22550
+ /** Design B: media row id of the track's native-resolution key frame (the
22467
22551
  * best-detection full frame). Resolve via the event-media data-plane
22468
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
22552
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
22469
22553
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
22470
- * sources — consumers fall back to `mediaKey` (the tight crop). */
22471
- keyFrameMediaKey: string().optional(),
22554
+ * sources — consumers fall back to `mediaId` (the tight crop). */
22555
+ keyFrameMediaId: number().int().optional(),
22472
22556
  /** Populated by B5 (recording playback URL for this event). */
22473
22557
  mediaUrl: string().optional(),
22474
22558
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -22518,7 +22602,7 @@ var MediaFileKindEnum = _enum([
22518
22602
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
22519
22603
  *
22520
22604
  * `url` points at the `event-media` data plane
22521
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
22605
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
22522
22606
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
22523
22607
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
22524
22608
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -22526,10 +22610,13 @@ var MediaFileKindEnum = _enum([
22526
22610
  * `data-plane-access.ts` for the rule and the one gap it does not close
22527
22611
  * (per-device scoping).
22528
22612
  *
22529
- * The URL is built from the row's **stored** key, which is not always its
22530
- * published `kind`: a track's face/plate crop is stored as `crop` under
22613
+ * The URL is built from the row's own id, which since D482 says nothing about
22614
+ * the row's owner or kind — and that is the point. The published `kind` is not
22615
+ * the stored one (a track's face/plate crop is stored as `crop` under
22531
22616
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
22532
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
22617
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
22618
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
22619
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
22533
22620
  *
22534
22621
  * ## `base64` is TRANSITIONAL and is going away
22535
22622
  *
@@ -22542,7 +22629,19 @@ var MediaFileKindEnum = _enum([
22542
22629
  * `analytics-query-facade.ts`; nothing else reads it.
22543
22630
  */
22544
22631
  var MediaFileSchema = object({
22545
- key: string(),
22632
+ /**
22633
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
22634
+ *
22635
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
22636
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
22637
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
22638
+ * different rows that spell the same number, and a track whose
22639
+ * `bestEventId` was an object event was served a motion event's snapshot —
22640
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
22641
+ * surrogate id cannot name the wrong row's owner, because it names no owner
22642
+ * at all.
22643
+ */
22644
+ mediaId: number().int(),
22546
22645
  kind: MediaFileKindEnum,
22547
22646
  sizeBytes: number(),
22548
22647
  timestamp: number()
@@ -22650,7 +22749,7 @@ var RetrainTrackSchema = object({
22650
22749
  });
22651
22750
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
22652
22751
  var RetrainFrameCandidateSchema = object({
22653
- mediaKey: string(),
22752
+ mediaId: number().int(),
22654
22753
  kind: MediaFileKindEnum,
22655
22754
  timestamp: number(),
22656
22755
  sizeBytes: number().int(),
@@ -22664,7 +22763,7 @@ var RetrainFrameSchema = object({
22664
22763
  deviceId: number(),
22665
22764
  trackId: string(),
22666
22765
  /** Provenance only. It may already point at nothing — that is expected. */
22667
- sourceMediaKey: string(),
22766
+ sourceMediaId: number().int(),
22668
22767
  sourceKind: MediaFileKindEnum,
22669
22768
  sizeBytes: number().int(),
22670
22769
  width: number().int(),
@@ -22680,7 +22779,7 @@ var RetrainCopyRefusalSchema = _enum([
22680
22779
  var RetrainFrameSelectionSchema = object({
22681
22780
  copied: array(RetrainFrameSchema).readonly(),
22682
22781
  refused: array(object({
22683
- sourceMediaKey: string(),
22782
+ sourceMediaId: number().int(),
22684
22783
  reason: RetrainCopyRefusalSchema
22685
22784
  })).readonly()
22686
22785
  });
@@ -22688,7 +22787,7 @@ var RetrainFrameListSchema = object({
22688
22787
  candidates: array(RetrainFrameCandidateSchema).readonly(),
22689
22788
  copies: array(RetrainFrameSchema).readonly(),
22690
22789
  /** What the page pre-selects — the native key frame when one survives. */
22691
- autoPickMediaKey: string().optional()
22790
+ autoPickMediaId: number().int().optional()
22692
22791
  });
22693
22792
  /** What the operator asked the assist to look for. */
22694
22793
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -22783,9 +22882,11 @@ var RecentTracksQueryInput = object({
22783
22882
  });
22784
22883
  /**
22785
22884
  * A Summary (D359): the per-camera session envelope that references tracks.
22786
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
22787
- * served by the event-media plane by key), null until the first frame with a
22788
- * member visible has been materialised.
22885
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
22886
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
22887
+ * first frame with a member visible has been materialised (D482 — it was the
22888
+ * row's composite key, which embedded the owner and could name another table's
22889
+ * row once event ids became per-table rowids).
22789
22890
  */
22790
22891
  var SummarySchema = object({
22791
22892
  id: string(),
@@ -22794,7 +22895,7 @@ var SummarySchema = object({
22794
22895
  lastActiveAt: number(),
22795
22896
  sealedAt: number().nullable(),
22796
22897
  memberCount: number().int().nonnegative(),
22797
- groupShotKey: string().nullable()
22898
+ groupShotMediaId: number().int().nullable()
22798
22899
  });
22799
22900
  var SummariesQueryInput = object({
22800
22901
  deviceIds: array(number()).min(1),
@@ -23777,7 +23878,7 @@ var pipelineAnalyticsCapability = {
23777
23878
  selectRetrainFrames: method(object({
23778
23879
  deviceId: number(),
23779
23880
  trackId: string(),
23780
- mediaKeys: array(string()).min(1)
23881
+ mediaIds: array(number().int()).min(1)
23781
23882
  }), RetrainFrameSelectionSchema, {
23782
23883
  kind: "mutation",
23783
23884
  auth: "admin"
@@ -23941,8 +24042,29 @@ var pipelineAnalyticsCapability = {
23941
24042
  kind: "query",
23942
24043
  auth: "admin"
23943
24044
  }),
24045
+ /**
24046
+ * The media an EVENT owns.
24047
+ *
24048
+ * `ownerType` is REQUIRED, and that is the whole correction (D482). An
24049
+ * event is a row in ONE of three tables, and since D474 each numbers from
24050
+ * 1 independently: `motion:101314` and `object:101314` both exist. This
24051
+ * method took a bare `eventId` and the provider probed motion → object →
24052
+ * audio, stopping at the first hit — so on the live hub, where object
24053
+ * events own no media of their own and 299 883 of 300 559 media rows are
24054
+ * motion-owned, EVERY object event resolved to its motion namesake. A
24055
+ * track from 17:34 on camera 615 was served a snapshot from 22:35 eleven
24056
+ * days earlier, silently.
24057
+ *
24058
+ * D476 had already disambiguated the KEY (`motion:` vs `object:`); this is
24059
+ * the API catching up to it. Naming the table is not a "qualification" of
24060
+ * the ambiguity — a listing BY OWNER has no address to make surrogate: the
24061
+ * owner IS (table, id), and half of it is not a question.
24062
+ */
23944
24063
  getEventMedia: method(object({
23945
- eventId: string(),
24064
+ /** Which of the three event tables owns the row. */
24065
+ ownerType: EventOwnerTypeSchema,
24066
+ /** The event's rowid in that table (D474: an event id is a number). */
24067
+ eventId: number().int(),
23946
24068
  kind: MediaFileKindEnum.optional(),
23947
24069
  deviceId: number()
23948
24070
  }), array(MediaFileSchema).readonly()),
@@ -23987,11 +24109,14 @@ var pipelineAnalyticsCapability = {
23987
24109
  * the live hub: one event's `fullFrameBoxed` is 2 824 077 B, base64'd to
23988
24110
  * ~3.8 MB, allocated whole in hub-main's heap, for a list of keys.
23989
24111
  *
23990
- * Same `deviceId` authorization subject as `getEventMedia`, and the same
23991
- * rows — this is a projection of that method, never a different question.
24112
+ * Same `deviceId` authorization subject as `getEventMedia`, the same
24113
+ * REQUIRED `ownerType` (read that method's docblock for the night-time
24114
+ * thumbnail this closes — D482), and the same rows: this is a projection
24115
+ * of that method, never a different question.
23992
24116
  */
23993
24117
  listEventMedia: method(object({
23994
- eventId: string(),
24118
+ ownerType: EventOwnerTypeSchema,
24119
+ eventId: number().int(),
23995
24120
  deviceId: number()
23996
24121
  }), array(MediaFileInfoSchema).readonly()),
23997
24122
  /**
@@ -30618,8 +30743,8 @@ var IdentitySchema = object({
30618
30743
  id: string(),
30619
30744
  name: string(),
30620
30745
  sampleCount: number().int().nonnegative(),
30621
- coverMediaKey: string().optional(),
30622
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
30746
+ coverMediaId: number().int().optional(),
30747
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
30623
30748
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
30624
30749
  coverBase64: string().optional()
30625
30750
  });
@@ -30645,8 +30770,8 @@ var IdentitySampleAuditRowSchema = object({
30645
30770
  enrolledAt: number().int(),
30646
30771
  deviceId: number().int().optional(),
30647
30772
  source: _enum(["detected", "photo"]),
30648
- /** The enrolled crop's media key, so the panel can show the evidence. */
30649
- mediaKey: string().optional(),
30773
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
30774
+ mediaId: number().int().optional(),
30650
30775
  /**
30651
30776
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
30652
30777
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -30715,15 +30840,15 @@ var FaceInfoSchema = object({
30715
30840
  */
30716
30841
  cropUrl: string().optional(),
30717
30842
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
30718
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
30843
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
30719
30844
  * legacy rows written before design B. */
30720
30845
  faceBbox: BoundingBoxSchema.optional(),
30721
30846
  /** Design B: MediaStore key of the track's native-resolution key frame.
30722
30847
  * Fetch the native JPEG via the event-media data-plane
30723
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
30848
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
30724
30849
  * track produced no key frame (e.g. native/onboard source) — the UI falls
30725
30850
  * back to the inline `base64` face crop. */
30726
- keyFrameMediaKey: string().optional(),
30851
+ keyFrameMediaId: number().int().optional(),
30727
30852
  /** Winning identity-match cosine (0..1) for this face's track, when an
30728
30853
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
30729
30854
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -30792,11 +30917,14 @@ var FaceClusterSchema = object({
30792
30917
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
30793
30918
  * dialog already rendering its key FRAME from the `event-media` plane.
30794
30919
  *
30795
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
30796
- * media key directly, so this needed no new plane and no new access decision.
30920
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
30921
+ * resolves a media row by its own id, so this needed no new plane and no new
30922
+ * access decision.
30797
30923
  */
30798
30924
  var MediaFileLiteSchema$1 = object({
30799
- key: string(),
30925
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
30926
+ * (D482). It was the row's composite key, which embedded the owner. */
30927
+ mediaId: number().int(),
30800
30928
  kind: string(),
30801
30929
  url: string(),
30802
30930
  sizeBytes: number(),
@@ -30818,7 +30946,7 @@ var faceGalleryCapability = {
30818
30946
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
30819
30947
  * four times and the viewer holds at `staleTime: 30_000`.
30820
30948
  *
30821
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
30949
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
30822
30950
  * the `event-media` plane serves that key `immutable` with an ETag.
30823
30951
  *
30824
30952
  * **This is an INPUT field, so it does not reach the addon until the
@@ -34557,8 +34685,8 @@ var VehicleSchema = object({
34557
34685
  id: string(),
34558
34686
  name: string(),
34559
34687
  sampleCount: number().int().nonnegative(),
34560
- coverMediaKey: string().optional(),
34561
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
34688
+ coverMediaId: number().int().optional(),
34689
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
34562
34690
  coverBase64: string().optional()
34563
34691
  });
34564
34692
  var VehicleSampleInfoSchema = object({
@@ -34591,7 +34719,7 @@ var PlateInfoSchema = object({
34591
34719
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
34592
34720
  plateBbox: BoundingBoxSchema.optional(),
34593
34721
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
34594
- keyFrameMediaKey: string().optional(),
34722
+ keyFrameMediaId: number().int().optional(),
34595
34723
  base64: string().optional(),
34596
34724
  /**
34597
34725
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -34612,11 +34740,14 @@ var PlateInfoSchema = object({
34612
34740
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
34613
34741
  * dialog already rendering its key FRAME from the `event-media` plane.
34614
34742
  *
34615
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
34616
- * media key directly, so this needed no new plane and no new access decision.
34743
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
34744
+ * resolves a media row by its own id, so this needed no new plane and no new
34745
+ * access decision.
34617
34746
  */
34618
34747
  var MediaFileLiteSchema = object({
34619
- key: string(),
34748
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
34749
+ * (D482). It was the row's composite key, which embedded the owner. */
34750
+ mediaId: number().int(),
34620
34751
  kind: string(),
34621
34752
  url: string(),
34622
34753
  sizeBytes: number(),
@@ -34698,7 +34829,7 @@ var plateGalleryCapability = {
34698
34829
  listVehicles: method(object({
34699
34830
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
34700
34831
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
34701
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
34832
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
34702
34833
  * INPUT field: stripped by the hub router until the train ships, which
34703
34834
  * resolves to `false` and is exactly the intended default. */
34704
34835
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()),
@@ -36561,7 +36692,14 @@ var SceneReferenceSchema = object({
36561
36692
  modelId: string(),
36562
36693
  condition: SceneConditionSchema,
36563
36694
  capturedAt: number(),
36564
- thumbnailMediaId: string().optional(),
36695
+ /**
36696
+ * The reference thumbnail's media ROW id (D482).
36697
+ *
36698
+ * The name already said `mediaId` while the value was the row's composite
36699
+ * key — a leftover that read as done and was not. It is the row's own id
36700
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
36701
+ */
36702
+ thumbnailMediaId: number().int().optional(),
36565
36703
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
36566
36704
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
36567
36705
  * normalized rect frame a different piece of world, and the scene would
@@ -38696,7 +38834,7 @@ var StationaryObjectSchema = object({
38696
38834
  /** Enrichment label carried from the source track (identity / plate). */
38697
38835
  label: string().optional(),
38698
38836
  /** Native-resolution key-frame media key for the parked object's best image. */
38699
- keyFrameMediaKey: string().optional()
38837
+ keyFrameMediaId: number().int().optional()
38700
38838
  });
38701
38839
  var CameraOccupancySnapshotSchema = object({
38702
38840
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -40199,6 +40337,12 @@ Object.freeze({
40199
40337
  addonId: null,
40200
40338
  access: "create"
40201
40339
  },
40340
+ "dataStoreProvider.upsert": {
40341
+ capName: "data-store-provider",
40342
+ capScope: "system",
40343
+ addonId: null,
40344
+ access: "create"
40345
+ },
40202
40346
  "dayNight.getOptions": {
40203
40347
  capName: "day-night",
40204
40348
  capScope: "device",
@@ -44063,6 +44207,12 @@ Object.freeze({
44063
44207
  addonId: null,
44064
44208
  access: "create"
44065
44209
  },
44210
+ "settingsStore.upsert": {
44211
+ capName: "settings-store",
44212
+ capScope: "system",
44213
+ addonId: null,
44214
+ access: "create"
44215
+ },
44066
44216
  "smtpProvider.getStatus": {
44067
44217
  capName: "smtp-provider",
44068
44218
  capScope: "system",