@camstack/addon-remote-storage 1.2.97 → 1.2.99

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.
package/dist/s3.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DOPOfpNg.js");
5
+ const require_shared = require("./shared-C99NWjGN.js");
6
6
  let node_stream = require("node:stream");
7
7
  let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
8
8
  let _aws_sdk_lib_storage = require("@aws-sdk/lib-storage");
package/dist/s3.addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-DW9PrJ9O.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-wpNbUebc.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { Upload } from "@aws-sdk/lib-storage";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DOPOfpNg.js");
5
+ const require_shared = require("./shared-C99NWjGN.js");
6
6
  let ssh2 = require("ssh2");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DW9PrJ9O.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-wpNbUebc.mjs";
2
2
  import { Client } from "ssh2";
3
3
  import * as path from "node:path";
4
4
  //#region src/providers/sftp/sftp-config-schema.ts
@@ -23,7 +23,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  let node_crypto = require("node:crypto");
24
24
  let node_path = require("node:path");
25
25
  node_path = __toESM(node_path);
26
- //#region ../types/dist/event-category-DAXzJeTX.mjs
26
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
27
27
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
28
28
  EventCategory["SystemBoot"] = "system.boot";
29
29
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -584,7 +584,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
584
584
  * a package zone — a newly-appeared stationary object of a package class
585
585
  * that cleared the class / zone / dwell / size gates. Payload:
586
586
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
587
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
587
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
588
588
  * Telemetry (D8): the durable record is the `package-events` store row;
589
589
  * this bus topic drives notifier rules + live UI. See
590
590
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5370,7 +5370,7 @@ var ZodIssueCode = {
5370
5370
  var ZodFirstPartyTypeKind;
5371
5371
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5372
5372
  //#endregion
5373
- //#region ../types/dist/sleep-BnujYGPe.mjs
5373
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5374
5374
  /**
5375
5375
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5376
5376
  * window to float samples (D455).
@@ -7321,13 +7321,30 @@ new Set([
7321
7321
  "scene",
7322
7322
  "motion",
7323
7323
  "object",
7324
- "audio"
7324
+ "audio",
7325
+ "mosaic"
7325
7326
  ]);
7326
- new Set([
7327
+ /**
7328
+ * The owner types that are event tables, in the order the event-media resolver
7329
+ * should consider them. Exported so a consumer asking "is this key an event?"
7330
+ * does not re-spell the list and drift from it.
7331
+ */
7332
+ var EVENT_OWNER_TYPES = [
7327
7333
  "motion",
7328
7334
  "object",
7329
7335
  "audio"
7330
- ]);
7336
+ ];
7337
+ /**
7338
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7339
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7340
+ * `(table, id)`).
7341
+ *
7342
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7343
+ * table would otherwise be accepted by the codec and refused at the door, with
7344
+ * nothing failing until a caller asked.
7345
+ */
7346
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7347
+ new Set(EVENT_OWNER_TYPES);
7331
7348
  var EncodeProfileSchema = object({
7332
7349
  video: object({
7333
7350
  codec: _enum([
@@ -12424,6 +12441,16 @@ method(object({
12424
12441
  filter: QueryFilterSchema.optional(),
12425
12442
  columns: array(string()).readonly().optional()
12426
12443
  }), array(SettingsRecordSchema).readonly()), method(object({
12444
+ namespace: string().optional(),
12445
+ collection: string(),
12446
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12447
+ * index on the collection. Never empty. */
12448
+ conflict: array(string()).readonly(),
12449
+ record: BulkRecordSchema
12450
+ }), object({
12451
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12452
+ * row's own id on an update. */
12453
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12427
12454
  namespace: string().optional(),
12428
12455
  collection: string(),
12429
12456
  record: object({
@@ -12558,6 +12585,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12558
12585
  id: union([string(), number()]) }), {
12559
12586
  kind: "mutation",
12560
12587
  auth: "admin"
12588
+ }), method(object({
12589
+ namespace: string().optional(),
12590
+ collection: string(),
12591
+ conflict: array(string()).readonly(),
12592
+ record: BulkRecordSchema
12593
+ }), object({ id: union([string(), number()]) }), {
12594
+ kind: "mutation",
12595
+ auth: "admin"
12561
12596
  }), method(object({
12562
12597
  namespace: string().optional(),
12563
12598
  collection: string(),
@@ -18774,8 +18809,8 @@ var TrackPositionSchema = object({
18774
18809
  var TrackSnapshotSchema = object({
18775
18810
  timestamp: number(),
18776
18811
  position: TrackPositionSchema,
18777
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
18778
- mediaKey: string()
18812
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
18813
+ mediaId: number().int()
18779
18814
  });
18780
18815
  /**
18781
18816
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19379,14 +19414,14 @@ var ObjectEventSchema = object({
19379
19414
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19380
19415
  frameWidth: number().optional(),
19381
19416
  frameHeight: number().optional(),
19382
- /** MediaStore key for the crop attached to this event (if any). */
19383
- mediaKey: string().optional(),
19384
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19417
+ /** Media row id of the crop attached to this event (if any) — D482. */
19418
+ mediaId: number().int().optional(),
19419
+ /** Design B: media row id of the track's native-resolution key frame (the
19385
19420
  * best-detection full frame). Resolve via the event-media data-plane
19386
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19421
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19387
19422
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19388
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19389
- keyFrameMediaKey: string().optional(),
19423
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19424
+ keyFrameMediaId: number().int().optional(),
19390
19425
  /** Populated by B5 (recording playback URL for this event). */
19391
19426
  mediaUrl: string().optional(),
19392
19427
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19436,7 +19471,7 @@ var MediaFileKindEnum = _enum([
19436
19471
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19437
19472
  *
19438
19473
  * `url` points at the `event-media` data plane
19439
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19474
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19440
19475
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19441
19476
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19442
19477
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19444,10 +19479,13 @@ var MediaFileKindEnum = _enum([
19444
19479
  * `data-plane-access.ts` for the rule and the one gap it does not close
19445
19480
  * (per-device scoping).
19446
19481
  *
19447
- * The URL is built from the row's **stored** key, which is not always its
19448
- * published `kind`: a track's face/plate crop is stored as `crop` under
19482
+ * The URL is built from the row's own id, which since D482 says nothing about
19483
+ * the row's owner or kind and that is the point. The published `kind` is not
19484
+ * the stored one (a track's face/plate crop is stored as `crop` under
19449
19485
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19450
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19486
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19487
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19488
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19451
19489
  *
19452
19490
  * ## `base64` is TRANSITIONAL and is going away
19453
19491
  *
@@ -19460,7 +19498,19 @@ var MediaFileKindEnum = _enum([
19460
19498
  * `analytics-query-facade.ts`; nothing else reads it.
19461
19499
  */
19462
19500
  var MediaFileSchema = object({
19463
- key: string(),
19501
+ /**
19502
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19503
+ *
19504
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19505
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19506
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19507
+ * different rows that spell the same number, and a track whose
19508
+ * `bestEventId` was an object event was served a motion event's snapshot —
19509
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19510
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19511
+ * at all.
19512
+ */
19513
+ mediaId: number().int(),
19464
19514
  kind: MediaFileKindEnum,
19465
19515
  sizeBytes: number(),
19466
19516
  timestamp: number()
@@ -19568,7 +19618,7 @@ var RetrainTrackSchema = object({
19568
19618
  });
19569
19619
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19570
19620
  var RetrainFrameCandidateSchema = object({
19571
- mediaKey: string(),
19621
+ mediaId: number().int(),
19572
19622
  kind: MediaFileKindEnum,
19573
19623
  timestamp: number(),
19574
19624
  sizeBytes: number().int(),
@@ -19582,7 +19632,7 @@ var RetrainFrameSchema = object({
19582
19632
  deviceId: number(),
19583
19633
  trackId: string(),
19584
19634
  /** Provenance only. It may already point at nothing — that is expected. */
19585
- sourceMediaKey: string(),
19635
+ sourceMediaId: number().int(),
19586
19636
  sourceKind: MediaFileKindEnum,
19587
19637
  sizeBytes: number().int(),
19588
19638
  width: number().int(),
@@ -19598,7 +19648,7 @@ var RetrainCopyRefusalSchema = _enum([
19598
19648
  var RetrainFrameSelectionSchema = object({
19599
19649
  copied: array(RetrainFrameSchema).readonly(),
19600
19650
  refused: array(object({
19601
- sourceMediaKey: string(),
19651
+ sourceMediaId: number().int(),
19602
19652
  reason: RetrainCopyRefusalSchema
19603
19653
  })).readonly()
19604
19654
  });
@@ -19606,7 +19656,7 @@ var RetrainFrameListSchema = object({
19606
19656
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19607
19657
  copies: array(RetrainFrameSchema).readonly(),
19608
19658
  /** What the page pre-selects — the native key frame when one survives. */
19609
- autoPickMediaKey: string().optional()
19659
+ autoPickMediaId: number().int().optional()
19610
19660
  });
19611
19661
  /** What the operator asked the assist to look for. */
19612
19662
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -19701,9 +19751,11 @@ var RecentTracksQueryInput = object({
19701
19751
  });
19702
19752
  /**
19703
19753
  * A Summary (D359): the per-camera session envelope that references tracks.
19704
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
19705
- * served by the event-media plane by key), null until the first frame with a
19706
- * member visible has been materialised.
19754
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
19755
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
19756
+ * first frame with a member visible has been materialised (D482 — it was the
19757
+ * row's composite key, which embedded the owner and could name another table's
19758
+ * row once event ids became per-table rowids).
19707
19759
  */
19708
19760
  var SummarySchema = object({
19709
19761
  id: string(),
@@ -19712,7 +19764,7 @@ var SummarySchema = object({
19712
19764
  lastActiveAt: number(),
19713
19765
  sealedAt: number().nullable(),
19714
19766
  memberCount: number().int().nonnegative(),
19715
- groupShotKey: string().nullable()
19767
+ groupShotMediaId: number().int().nullable()
19716
19768
  });
19717
19769
  var SummariesQueryInput = object({
19718
19770
  deviceIds: array(number()).min(1),
@@ -20266,7 +20318,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20266
20318
  }), method(object({
20267
20319
  deviceId: number(),
20268
20320
  trackId: string(),
20269
- mediaKeys: array(string()).min(1)
20321
+ mediaIds: array(number().int()).min(1)
20270
20322
  }), RetrainFrameSelectionSchema, {
20271
20323
  kind: "mutation",
20272
20324
  auth: "admin"
@@ -20334,7 +20386,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20334
20386
  kind: "query",
20335
20387
  auth: "admin"
20336
20388
  }), method(object({
20337
- eventId: string(),
20389
+ /** Which of the three event tables owns the row. */
20390
+ ownerType: EventOwnerTypeSchema,
20391
+ /** The event's rowid in that table (D474: an event id is a number). */
20392
+ eventId: number().int(),
20338
20393
  kind: MediaFileKindEnum.optional(),
20339
20394
  deviceId: number()
20340
20395
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20345,7 +20400,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20345
20400
  trackId: string(),
20346
20401
  deviceId: number()
20347
20402
  }), array(MediaFileInfoSchema).readonly()), method(object({
20348
- eventId: string(),
20403
+ ownerType: EventOwnerTypeSchema,
20404
+ eventId: number().int(),
20349
20405
  deviceId: number()
20350
20406
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20351
20407
  kind: "mutation",
@@ -24868,8 +24924,8 @@ var IdentitySchema = object({
24868
24924
  id: string(),
24869
24925
  name: string(),
24870
24926
  sampleCount: number().int().nonnegative(),
24871
- coverMediaKey: string().optional(),
24872
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
24927
+ coverMediaId: number().int().optional(),
24928
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
24873
24929
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
24874
24930
  coverBase64: string().optional()
24875
24931
  });
@@ -24895,8 +24951,8 @@ var IdentitySampleAuditRowSchema = object({
24895
24951
  enrolledAt: number().int(),
24896
24952
  deviceId: number().int().optional(),
24897
24953
  source: _enum(["detected", "photo"]),
24898
- /** The enrolled crop's media key, so the panel can show the evidence. */
24899
- mediaKey: string().optional(),
24954
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
24955
+ mediaId: number().int().optional(),
24900
24956
  /**
24901
24957
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
24902
24958
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -24965,15 +25021,15 @@ var FaceInfoSchema = object({
24965
25021
  */
24966
25022
  cropUrl: string().optional(),
24967
25023
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
24968
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
25024
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
24969
25025
  * legacy rows written before design B. */
24970
25026
  faceBbox: BoundingBoxSchema.optional(),
24971
25027
  /** Design B: MediaStore key of the track's native-resolution key frame.
24972
25028
  * Fetch the native JPEG via the event-media data-plane
24973
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
25029
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
24974
25030
  * track produced no key frame (e.g. native/onboard source) — the UI falls
24975
25031
  * back to the inline `base64` face crop. */
24976
- keyFrameMediaKey: string().optional(),
25032
+ keyFrameMediaId: number().int().optional(),
24977
25033
  /** Winning identity-match cosine (0..1) for this face's track, when an
24978
25034
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
24979
25035
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -25042,11 +25098,14 @@ var FaceClusterSchema = object({
25042
25098
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
25043
25099
  * dialog already rendering its key FRAME from the `event-media` plane.
25044
25100
  *
25045
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
25046
- * media key directly, so this needed no new plane and no new access decision.
25101
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
25102
+ * resolves a media row by its own id, so this needed no new plane and no new
25103
+ * access decision.
25047
25104
  */
25048
25105
  var MediaFileLiteSchema$1 = object({
25049
- key: string(),
25106
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
25107
+ * (D482). It was the row's composite key, which embedded the owner. */
25108
+ mediaId: number().int(),
25050
25109
  kind: string(),
25051
25110
  url: string(),
25052
25111
  sizeBytes: number(),
@@ -25063,7 +25122,7 @@ method(object({
25063
25122
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
25064
25123
  * four times and the viewer holds at `staleTime: 30_000`.
25065
25124
  *
25066
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
25125
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
25067
25126
  * the `event-media` plane serves that key `immutable` with an ETag.
25068
25127
  *
25069
25128
  * **This is an INPUT field, so it does not reach the addon until the
@@ -27531,8 +27590,8 @@ var VehicleSchema = object({
27531
27590
  id: string(),
27532
27591
  name: string(),
27533
27592
  sampleCount: number().int().nonnegative(),
27534
- coverMediaKey: string().optional(),
27535
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
27593
+ coverMediaId: number().int().optional(),
27594
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
27536
27595
  coverBase64: string().optional()
27537
27596
  });
27538
27597
  var VehicleSampleInfoSchema = object({
@@ -27565,7 +27624,7 @@ var PlateInfoSchema = object({
27565
27624
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
27566
27625
  plateBbox: BoundingBoxSchema.optional(),
27567
27626
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
27568
- keyFrameMediaKey: string().optional(),
27627
+ keyFrameMediaId: number().int().optional(),
27569
27628
  base64: string().optional(),
27570
27629
  /**
27571
27630
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -27586,11 +27645,14 @@ var PlateInfoSchema = object({
27586
27645
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
27587
27646
  * dialog already rendering its key FRAME from the `event-media` plane.
27588
27647
  *
27589
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
27590
- * media key directly, so this needed no new plane and no new access decision.
27648
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
27649
+ * resolves a media row by its own id, so this needed no new plane and no new
27650
+ * access decision.
27591
27651
  */
27592
27652
  var MediaFileLiteSchema = object({
27593
- key: string(),
27653
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
27654
+ * (D482). It was the row's composite key, which embedded the owner. */
27655
+ mediaId: number().int(),
27594
27656
  kind: string(),
27595
27657
  url: string(),
27596
27658
  sizeBytes: number(),
@@ -27649,7 +27711,7 @@ method(object({
27649
27711
  }), method(object({
27650
27712
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27651
27713
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27652
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
27714
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
27653
27715
  * INPUT field: stripped by the hub router until the train ships, which
27654
27716
  * resolves to `false` and is exactly the intended default. */
27655
27717
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -28973,7 +29035,14 @@ var SceneReferenceSchema = object({
28973
29035
  modelId: string(),
28974
29036
  condition: SceneConditionSchema,
28975
29037
  capturedAt: number(),
28976
- thumbnailMediaId: string().optional(),
29038
+ /**
29039
+ * The reference thumbnail's media ROW id (D482).
29040
+ *
29041
+ * The name already said `mediaId` while the value was the row's composite
29042
+ * key — a leftover that read as done and was not. It is the row's own id
29043
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
29044
+ */
29045
+ thumbnailMediaId: number().int().optional(),
28977
29046
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
28978
29047
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
28979
29048
  * normalized rect frame a different piece of world, and the scene would
@@ -30421,7 +30490,7 @@ var StationaryObjectSchema = object({
30421
30490
  /** Enrichment label carried from the source track (identity / plate). */
30422
30491
  label: string().optional(),
30423
30492
  /** Native-resolution key-frame media key for the parked object's best image. */
30424
- keyFrameMediaKey: string().optional()
30493
+ keyFrameMediaId: number().int().optional()
30425
30494
  });
30426
30495
  var CameraOccupancySnapshotSchema = object({
30427
30496
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -31577,6 +31646,12 @@ Object.freeze({
31577
31646
  addonId: null,
31578
31647
  access: "create"
31579
31648
  },
31649
+ "dataStoreProvider.upsert": {
31650
+ capName: "data-store-provider",
31651
+ capScope: "system",
31652
+ addonId: null,
31653
+ access: "create"
31654
+ },
31580
31655
  "dayNight.getOptions": {
31581
31656
  capName: "day-night",
31582
31657
  capScope: "device",
@@ -35441,6 +35516,12 @@ Object.freeze({
35441
35516
  addonId: null,
35442
35517
  access: "create"
35443
35518
  },
35519
+ "settingsStore.upsert": {
35520
+ capName: "settings-store",
35521
+ capScope: "system",
35522
+ addonId: null,
35523
+ access: "create"
35524
+ },
35444
35525
  "smtpProvider.getStatus": {
35445
35526
  capName: "smtp-provider",
35446
35527
  capScope: "system",
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import * as path from "node:path";
3
- //#region ../types/dist/event-category-DAXzJeTX.mjs
3
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
4
4
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
5
5
  EventCategory["SystemBoot"] = "system.boot";
6
6
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -561,7 +561,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
561
561
  * a package zone — a newly-appeared stationary object of a package class
562
562
  * that cleared the class / zone / dwell / size gates. Payload:
563
563
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
564
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
564
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
565
565
  * Telemetry (D8): the durable record is the `package-events` store row;
566
566
  * this bus topic drives notifier rules + live UI. See
567
567
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5347,7 +5347,7 @@ var ZodIssueCode = {
5347
5347
  var ZodFirstPartyTypeKind;
5348
5348
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5349
5349
  //#endregion
5350
- //#region ../types/dist/sleep-BnujYGPe.mjs
5350
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5351
5351
  /**
5352
5352
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5353
5353
  * window to float samples (D455).
@@ -7298,13 +7298,30 @@ new Set([
7298
7298
  "scene",
7299
7299
  "motion",
7300
7300
  "object",
7301
- "audio"
7301
+ "audio",
7302
+ "mosaic"
7302
7303
  ]);
7303
- new Set([
7304
+ /**
7305
+ * The owner types that are event tables, in the order the event-media resolver
7306
+ * should consider them. Exported so a consumer asking "is this key an event?"
7307
+ * does not re-spell the list and drift from it.
7308
+ */
7309
+ var EVENT_OWNER_TYPES = [
7304
7310
  "motion",
7305
7311
  "object",
7306
7312
  "audio"
7307
- ]);
7313
+ ];
7314
+ /**
7315
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7316
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7317
+ * `(table, id)`).
7318
+ *
7319
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7320
+ * table would otherwise be accepted by the codec and refused at the door, with
7321
+ * nothing failing until a caller asked.
7322
+ */
7323
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7324
+ new Set(EVENT_OWNER_TYPES);
7308
7325
  var EncodeProfileSchema = object({
7309
7326
  video: object({
7310
7327
  codec: _enum([
@@ -12401,6 +12418,16 @@ method(object({
12401
12418
  filter: QueryFilterSchema.optional(),
12402
12419
  columns: array(string()).readonly().optional()
12403
12420
  }), array(SettingsRecordSchema).readonly()), method(object({
12421
+ namespace: string().optional(),
12422
+ collection: string(),
12423
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12424
+ * index on the collection. Never empty. */
12425
+ conflict: array(string()).readonly(),
12426
+ record: BulkRecordSchema
12427
+ }), object({
12428
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12429
+ * row's own id on an update. */
12430
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12404
12431
  namespace: string().optional(),
12405
12432
  collection: string(),
12406
12433
  record: object({
@@ -12535,6 +12562,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12535
12562
  id: union([string(), number()]) }), {
12536
12563
  kind: "mutation",
12537
12564
  auth: "admin"
12565
+ }), method(object({
12566
+ namespace: string().optional(),
12567
+ collection: string(),
12568
+ conflict: array(string()).readonly(),
12569
+ record: BulkRecordSchema
12570
+ }), object({ id: union([string(), number()]) }), {
12571
+ kind: "mutation",
12572
+ auth: "admin"
12538
12573
  }), method(object({
12539
12574
  namespace: string().optional(),
12540
12575
  collection: string(),
@@ -18751,8 +18786,8 @@ var TrackPositionSchema = object({
18751
18786
  var TrackSnapshotSchema = object({
18752
18787
  timestamp: number(),
18753
18788
  position: TrackPositionSchema,
18754
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
18755
- mediaKey: string()
18789
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
18790
+ mediaId: number().int()
18756
18791
  });
18757
18792
  /**
18758
18793
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19356,14 +19391,14 @@ var ObjectEventSchema = object({
19356
19391
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19357
19392
  frameWidth: number().optional(),
19358
19393
  frameHeight: number().optional(),
19359
- /** MediaStore key for the crop attached to this event (if any). */
19360
- mediaKey: string().optional(),
19361
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19394
+ /** Media row id of the crop attached to this event (if any) — D482. */
19395
+ mediaId: number().int().optional(),
19396
+ /** Design B: media row id of the track's native-resolution key frame (the
19362
19397
  * best-detection full frame). Resolve via the event-media data-plane
19363
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19398
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19364
19399
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19365
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19366
- keyFrameMediaKey: string().optional(),
19400
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19401
+ keyFrameMediaId: number().int().optional(),
19367
19402
  /** Populated by B5 (recording playback URL for this event). */
19368
19403
  mediaUrl: string().optional(),
19369
19404
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19413,7 +19448,7 @@ var MediaFileKindEnum = _enum([
19413
19448
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19414
19449
  *
19415
19450
  * `url` points at the `event-media` data plane
19416
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19451
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19417
19452
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19418
19453
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19419
19454
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19421,10 +19456,13 @@ var MediaFileKindEnum = _enum([
19421
19456
  * `data-plane-access.ts` for the rule and the one gap it does not close
19422
19457
  * (per-device scoping).
19423
19458
  *
19424
- * The URL is built from the row's **stored** key, which is not always its
19425
- * published `kind`: a track's face/plate crop is stored as `crop` under
19459
+ * The URL is built from the row's own id, which since D482 says nothing about
19460
+ * the row's owner or kind and that is the point. The published `kind` is not
19461
+ * the stored one (a track's face/plate crop is stored as `crop` under
19426
19462
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19427
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19463
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19464
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19465
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19428
19466
  *
19429
19467
  * ## `base64` is TRANSITIONAL and is going away
19430
19468
  *
@@ -19437,7 +19475,19 @@ var MediaFileKindEnum = _enum([
19437
19475
  * `analytics-query-facade.ts`; nothing else reads it.
19438
19476
  */
19439
19477
  var MediaFileSchema = object({
19440
- key: string(),
19478
+ /**
19479
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19480
+ *
19481
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19482
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19483
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19484
+ * different rows that spell the same number, and a track whose
19485
+ * `bestEventId` was an object event was served a motion event's snapshot —
19486
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19487
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19488
+ * at all.
19489
+ */
19490
+ mediaId: number().int(),
19441
19491
  kind: MediaFileKindEnum,
19442
19492
  sizeBytes: number(),
19443
19493
  timestamp: number()
@@ -19545,7 +19595,7 @@ var RetrainTrackSchema = object({
19545
19595
  });
19546
19596
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19547
19597
  var RetrainFrameCandidateSchema = object({
19548
- mediaKey: string(),
19598
+ mediaId: number().int(),
19549
19599
  kind: MediaFileKindEnum,
19550
19600
  timestamp: number(),
19551
19601
  sizeBytes: number().int(),
@@ -19559,7 +19609,7 @@ var RetrainFrameSchema = object({
19559
19609
  deviceId: number(),
19560
19610
  trackId: string(),
19561
19611
  /** Provenance only. It may already point at nothing — that is expected. */
19562
- sourceMediaKey: string(),
19612
+ sourceMediaId: number().int(),
19563
19613
  sourceKind: MediaFileKindEnum,
19564
19614
  sizeBytes: number().int(),
19565
19615
  width: number().int(),
@@ -19575,7 +19625,7 @@ var RetrainCopyRefusalSchema = _enum([
19575
19625
  var RetrainFrameSelectionSchema = object({
19576
19626
  copied: array(RetrainFrameSchema).readonly(),
19577
19627
  refused: array(object({
19578
- sourceMediaKey: string(),
19628
+ sourceMediaId: number().int(),
19579
19629
  reason: RetrainCopyRefusalSchema
19580
19630
  })).readonly()
19581
19631
  });
@@ -19583,7 +19633,7 @@ var RetrainFrameListSchema = object({
19583
19633
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19584
19634
  copies: array(RetrainFrameSchema).readonly(),
19585
19635
  /** What the page pre-selects — the native key frame when one survives. */
19586
- autoPickMediaKey: string().optional()
19636
+ autoPickMediaId: number().int().optional()
19587
19637
  });
19588
19638
  /** What the operator asked the assist to look for. */
19589
19639
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -19678,9 +19728,11 @@ var RecentTracksQueryInput = object({
19678
19728
  });
19679
19729
  /**
19680
19730
  * A Summary (D359): the per-camera session envelope that references tracks.
19681
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
19682
- * served by the event-media plane by key), null until the first frame with a
19683
- * member visible has been materialised.
19731
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
19732
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
19733
+ * first frame with a member visible has been materialised (D482 — it was the
19734
+ * row's composite key, which embedded the owner and could name another table's
19735
+ * row once event ids became per-table rowids).
19684
19736
  */
19685
19737
  var SummarySchema = object({
19686
19738
  id: string(),
@@ -19689,7 +19741,7 @@ var SummarySchema = object({
19689
19741
  lastActiveAt: number(),
19690
19742
  sealedAt: number().nullable(),
19691
19743
  memberCount: number().int().nonnegative(),
19692
- groupShotKey: string().nullable()
19744
+ groupShotMediaId: number().int().nullable()
19693
19745
  });
19694
19746
  var SummariesQueryInput = object({
19695
19747
  deviceIds: array(number()).min(1),
@@ -20243,7 +20295,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20243
20295
  }), method(object({
20244
20296
  deviceId: number(),
20245
20297
  trackId: string(),
20246
- mediaKeys: array(string()).min(1)
20298
+ mediaIds: array(number().int()).min(1)
20247
20299
  }), RetrainFrameSelectionSchema, {
20248
20300
  kind: "mutation",
20249
20301
  auth: "admin"
@@ -20311,7 +20363,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20311
20363
  kind: "query",
20312
20364
  auth: "admin"
20313
20365
  }), method(object({
20314
- eventId: string(),
20366
+ /** Which of the three event tables owns the row. */
20367
+ ownerType: EventOwnerTypeSchema,
20368
+ /** The event's rowid in that table (D474: an event id is a number). */
20369
+ eventId: number().int(),
20315
20370
  kind: MediaFileKindEnum.optional(),
20316
20371
  deviceId: number()
20317
20372
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20322,7 +20377,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20322
20377
  trackId: string(),
20323
20378
  deviceId: number()
20324
20379
  }), array(MediaFileInfoSchema).readonly()), method(object({
20325
- eventId: string(),
20380
+ ownerType: EventOwnerTypeSchema,
20381
+ eventId: number().int(),
20326
20382
  deviceId: number()
20327
20383
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20328
20384
  kind: "mutation",
@@ -24845,8 +24901,8 @@ var IdentitySchema = object({
24845
24901
  id: string(),
24846
24902
  name: string(),
24847
24903
  sampleCount: number().int().nonnegative(),
24848
- coverMediaKey: string().optional(),
24849
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
24904
+ coverMediaId: number().int().optional(),
24905
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
24850
24906
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
24851
24907
  coverBase64: string().optional()
24852
24908
  });
@@ -24872,8 +24928,8 @@ var IdentitySampleAuditRowSchema = object({
24872
24928
  enrolledAt: number().int(),
24873
24929
  deviceId: number().int().optional(),
24874
24930
  source: _enum(["detected", "photo"]),
24875
- /** The enrolled crop's media key, so the panel can show the evidence. */
24876
- mediaKey: string().optional(),
24931
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
24932
+ mediaId: number().int().optional(),
24877
24933
  /**
24878
24934
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
24879
24935
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -24942,15 +24998,15 @@ var FaceInfoSchema = object({
24942
24998
  */
24943
24999
  cropUrl: string().optional(),
24944
25000
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
24945
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
25001
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
24946
25002
  * legacy rows written before design B. */
24947
25003
  faceBbox: BoundingBoxSchema.optional(),
24948
25004
  /** Design B: MediaStore key of the track's native-resolution key frame.
24949
25005
  * Fetch the native JPEG via the event-media data-plane
24950
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
25006
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
24951
25007
  * track produced no key frame (e.g. native/onboard source) — the UI falls
24952
25008
  * back to the inline `base64` face crop. */
24953
- keyFrameMediaKey: string().optional(),
25009
+ keyFrameMediaId: number().int().optional(),
24954
25010
  /** Winning identity-match cosine (0..1) for this face's track, when an
24955
25011
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
24956
25012
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -25019,11 +25075,14 @@ var FaceClusterSchema = object({
25019
25075
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
25020
25076
  * dialog already rendering its key FRAME from the `event-media` plane.
25021
25077
  *
25022
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
25023
- * media key directly, so this needed no new plane and no new access decision.
25078
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
25079
+ * resolves a media row by its own id, so this needed no new plane and no new
25080
+ * access decision.
25024
25081
  */
25025
25082
  var MediaFileLiteSchema$1 = object({
25026
- key: string(),
25083
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
25084
+ * (D482). It was the row's composite key, which embedded the owner. */
25085
+ mediaId: number().int(),
25027
25086
  kind: string(),
25028
25087
  url: string(),
25029
25088
  sizeBytes: number(),
@@ -25040,7 +25099,7 @@ method(object({
25040
25099
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
25041
25100
  * four times and the viewer holds at `staleTime: 30_000`.
25042
25101
  *
25043
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
25102
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
25044
25103
  * the `event-media` plane serves that key `immutable` with an ETag.
25045
25104
  *
25046
25105
  * **This is an INPUT field, so it does not reach the addon until the
@@ -27508,8 +27567,8 @@ var VehicleSchema = object({
27508
27567
  id: string(),
27509
27568
  name: string(),
27510
27569
  sampleCount: number().int().nonnegative(),
27511
- coverMediaKey: string().optional(),
27512
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
27570
+ coverMediaId: number().int().optional(),
27571
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
27513
27572
  coverBase64: string().optional()
27514
27573
  });
27515
27574
  var VehicleSampleInfoSchema = object({
@@ -27542,7 +27601,7 @@ var PlateInfoSchema = object({
27542
27601
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
27543
27602
  plateBbox: BoundingBoxSchema.optional(),
27544
27603
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
27545
- keyFrameMediaKey: string().optional(),
27604
+ keyFrameMediaId: number().int().optional(),
27546
27605
  base64: string().optional(),
27547
27606
  /**
27548
27607
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -27563,11 +27622,14 @@ var PlateInfoSchema = object({
27563
27622
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
27564
27623
  * dialog already rendering its key FRAME from the `event-media` plane.
27565
27624
  *
27566
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
27567
- * media key directly, so this needed no new plane and no new access decision.
27625
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
27626
+ * resolves a media row by its own id, so this needed no new plane and no new
27627
+ * access decision.
27568
27628
  */
27569
27629
  var MediaFileLiteSchema = object({
27570
- key: string(),
27630
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
27631
+ * (D482). It was the row's composite key, which embedded the owner. */
27632
+ mediaId: number().int(),
27571
27633
  kind: string(),
27572
27634
  url: string(),
27573
27635
  sizeBytes: number(),
@@ -27626,7 +27688,7 @@ method(object({
27626
27688
  }), method(object({
27627
27689
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27628
27690
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27629
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
27691
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
27630
27692
  * INPUT field: stripped by the hub router until the train ships, which
27631
27693
  * resolves to `false` and is exactly the intended default. */
27632
27694
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -28950,7 +29012,14 @@ var SceneReferenceSchema = object({
28950
29012
  modelId: string(),
28951
29013
  condition: SceneConditionSchema,
28952
29014
  capturedAt: number(),
28953
- thumbnailMediaId: string().optional(),
29015
+ /**
29016
+ * The reference thumbnail's media ROW id (D482).
29017
+ *
29018
+ * The name already said `mediaId` while the value was the row's composite
29019
+ * key — a leftover that read as done and was not. It is the row's own id
29020
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
29021
+ */
29022
+ thumbnailMediaId: number().int().optional(),
28954
29023
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
28955
29024
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
28956
29025
  * normalized rect frame a different piece of world, and the scene would
@@ -30398,7 +30467,7 @@ var StationaryObjectSchema = object({
30398
30467
  /** Enrichment label carried from the source track (identity / plate). */
30399
30468
  label: string().optional(),
30400
30469
  /** Native-resolution key-frame media key for the parked object's best image. */
30401
- keyFrameMediaKey: string().optional()
30470
+ keyFrameMediaId: number().int().optional()
30402
30471
  });
30403
30472
  var CameraOccupancySnapshotSchema = object({
30404
30473
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -31554,6 +31623,12 @@ Object.freeze({
31554
31623
  addonId: null,
31555
31624
  access: "create"
31556
31625
  },
31626
+ "dataStoreProvider.upsert": {
31627
+ capName: "data-store-provider",
31628
+ capScope: "system",
31629
+ addonId: null,
31630
+ access: "create"
31631
+ },
31557
31632
  "dayNight.getOptions": {
31558
31633
  capName: "day-night",
31559
31634
  capScope: "device",
@@ -35418,6 +35493,12 @@ Object.freeze({
35418
35493
  addonId: null,
35419
35494
  access: "create"
35420
35495
  },
35496
+ "settingsStore.upsert": {
35497
+ capName: "settings-store",
35498
+ capScope: "system",
35499
+ addonId: null,
35500
+ access: "create"
35501
+ },
35421
35502
  "smtpProvider.getStatus": {
35422
35503
  capName: "smtp-provider",
35423
35504
  capScope: "system",
package/dist/smb.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DOPOfpNg.js");
5
+ const require_shared = require("./shared-C99NWjGN.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-DW9PrJ9O.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-wpNbUebc.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as path from "node:path";
4
4
  import * as fsp from "node:fs/promises";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DOPOfpNg.js");
5
+ const require_shared = require("./shared-C99NWjGN.js");
6
6
  let node_stream = require("node:stream");
7
7
  let webdav = require("webdav");
8
8
  //#region src/providers/webdav/webdav-config-schema.ts
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DW9PrJ9O.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-wpNbUebc.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { AuthType, createClient } from "webdav";
4
4
  //#region src/providers/webdav/webdav-config-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-remote-storage",
3
- "version": "1.2.97",
3
+ "version": "1.2.99",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV, SMB) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",