@camstack/addon-provider-reolink 1.2.122 → 1.2.123

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 (3) hide show
  1. package/dist/addon.js +131 -50
  2. package/dist/addon.mjs +131 -50
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -25,7 +25,7 @@ let fs_promises = require("fs/promises");
25
25
  fs_promises = require_chunk.__toESM(fs_promises, 1);
26
26
  let node_os = require("node:os");
27
27
  node_os = require_chunk.__toESM(node_os);
28
- //#region ../types/dist/event-category-DAXzJeTX.mjs
28
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
29
29
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
30
30
  EventCategory["SystemBoot"] = "system.boot";
31
31
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -586,7 +586,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
586
586
  * a package zone — a newly-appeared stationary object of a package class
587
587
  * that cleared the class / zone / dwell / size gates. Payload:
588
588
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
589
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
589
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
590
590
  * Telemetry (D8): the durable record is the `package-events` store row;
591
591
  * this bus topic drives notifier rules + live UI. See
592
592
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5372,7 +5372,7 @@ var ZodIssueCode = {
5372
5372
  var ZodFirstPartyTypeKind;
5373
5373
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5374
5374
  //#endregion
5375
- //#region ../types/dist/sleep-BnujYGPe.mjs
5375
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5376
5376
  /**
5377
5377
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5378
5378
  * window to float samples (D455).
@@ -7351,13 +7351,30 @@ new Set([
7351
7351
  "scene",
7352
7352
  "motion",
7353
7353
  "object",
7354
- "audio"
7354
+ "audio",
7355
+ "mosaic"
7355
7356
  ]);
7356
- new Set([
7357
+ /**
7358
+ * The owner types that are event tables, in the order the event-media resolver
7359
+ * should consider them. Exported so a consumer asking "is this key an event?"
7360
+ * does not re-spell the list and drift from it.
7361
+ */
7362
+ var EVENT_OWNER_TYPES = [
7357
7363
  "motion",
7358
7364
  "object",
7359
7365
  "audio"
7360
- ]);
7366
+ ];
7367
+ /**
7368
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7369
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7370
+ * `(table, id)`).
7371
+ *
7372
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7373
+ * table would otherwise be accepted by the codec and refused at the door, with
7374
+ * nothing failing until a caller asked.
7375
+ */
7376
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7377
+ new Set(EVENT_OWNER_TYPES);
7361
7378
  var EncodeProfileSchema = object({
7362
7379
  video: object({
7363
7380
  codec: _enum([
@@ -13122,6 +13139,16 @@ method(object({
13122
13139
  filter: QueryFilterSchema.optional(),
13123
13140
  columns: array(string()).readonly().optional()
13124
13141
  }), array(SettingsRecordSchema).readonly()), method(object({
13142
+ namespace: string().optional(),
13143
+ collection: string(),
13144
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13145
+ * index on the collection. Never empty. */
13146
+ conflict: array(string()).readonly(),
13147
+ record: BulkRecordSchema
13148
+ }), object({
13149
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13150
+ * row's own id on an update. */
13151
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
13125
13152
  namespace: string().optional(),
13126
13153
  collection: string(),
13127
13154
  record: object({
@@ -13256,6 +13283,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
13256
13283
  id: union([string(), number()]) }), {
13257
13284
  kind: "mutation",
13258
13285
  auth: "admin"
13286
+ }), method(object({
13287
+ namespace: string().optional(),
13288
+ collection: string(),
13289
+ conflict: array(string()).readonly(),
13290
+ record: BulkRecordSchema
13291
+ }), object({ id: union([string(), number()]) }), {
13292
+ kind: "mutation",
13293
+ auth: "admin"
13259
13294
  }), method(object({
13260
13295
  namespace: string().optional(),
13261
13296
  collection: string(),
@@ -19778,8 +19813,8 @@ var TrackPositionSchema = object({
19778
19813
  var TrackSnapshotSchema = object({
19779
19814
  timestamp: number(),
19780
19815
  position: TrackPositionSchema,
19781
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19782
- mediaKey: string()
19816
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19817
+ mediaId: number().int()
19783
19818
  });
19784
19819
  /**
19785
19820
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -20383,14 +20418,14 @@ var ObjectEventSchema = object({
20383
20418
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
20384
20419
  frameWidth: number().optional(),
20385
20420
  frameHeight: number().optional(),
20386
- /** MediaStore key for the crop attached to this event (if any). */
20387
- mediaKey: string().optional(),
20388
- /** Design B: MediaStore key of the track's native-resolution key frame (the
20421
+ /** Media row id of the crop attached to this event (if any) — D482. */
20422
+ mediaId: number().int().optional(),
20423
+ /** Design B: media row id of the track's native-resolution key frame (the
20389
20424
  * best-detection full frame). Resolve via the event-media data-plane
20390
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
20425
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
20391
20426
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
20392
- * sources — consumers fall back to `mediaKey` (the tight crop). */
20393
- keyFrameMediaKey: string().optional(),
20427
+ * sources — consumers fall back to `mediaId` (the tight crop). */
20428
+ keyFrameMediaId: number().int().optional(),
20394
20429
  /** Populated by B5 (recording playback URL for this event). */
20395
20430
  mediaUrl: string().optional(),
20396
20431
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -20440,7 +20475,7 @@ var MediaFileKindEnum = _enum([
20440
20475
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
20441
20476
  *
20442
20477
  * `url` points at the `event-media` data plane
20443
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
20478
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
20444
20479
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
20445
20480
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
20446
20481
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -20448,10 +20483,13 @@ var MediaFileKindEnum = _enum([
20448
20483
  * `data-plane-access.ts` for the rule and the one gap it does not close
20449
20484
  * (per-device scoping).
20450
20485
  *
20451
- * The URL is built from the row's **stored** key, which is not always its
20452
- * published `kind`: a track's face/plate crop is stored as `crop` under
20486
+ * The URL is built from the row's own id, which since D482 says nothing about
20487
+ * the row's owner or kind and that is the point. The published `kind` is not
20488
+ * the stored one (a track's face/plate crop is stored as `crop` under
20453
20489
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
20454
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
20490
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
20491
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
20492
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
20455
20493
  *
20456
20494
  * ## `base64` is TRANSITIONAL and is going away
20457
20495
  *
@@ -20464,7 +20502,19 @@ var MediaFileKindEnum = _enum([
20464
20502
  * `analytics-query-facade.ts`; nothing else reads it.
20465
20503
  */
20466
20504
  var MediaFileSchema = object({
20467
- key: string(),
20505
+ /**
20506
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
20507
+ *
20508
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
20509
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
20510
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
20511
+ * different rows that spell the same number, and a track whose
20512
+ * `bestEventId` was an object event was served a motion event's snapshot —
20513
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
20514
+ * surrogate id cannot name the wrong row's owner, because it names no owner
20515
+ * at all.
20516
+ */
20517
+ mediaId: number().int(),
20468
20518
  kind: MediaFileKindEnum,
20469
20519
  sizeBytes: number(),
20470
20520
  timestamp: number()
@@ -20572,7 +20622,7 @@ var RetrainTrackSchema = object({
20572
20622
  });
20573
20623
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
20574
20624
  var RetrainFrameCandidateSchema = object({
20575
- mediaKey: string(),
20625
+ mediaId: number().int(),
20576
20626
  kind: MediaFileKindEnum,
20577
20627
  timestamp: number(),
20578
20628
  sizeBytes: number().int(),
@@ -20586,7 +20636,7 @@ var RetrainFrameSchema = object({
20586
20636
  deviceId: number(),
20587
20637
  trackId: string(),
20588
20638
  /** Provenance only. It may already point at nothing — that is expected. */
20589
- sourceMediaKey: string(),
20639
+ sourceMediaId: number().int(),
20590
20640
  sourceKind: MediaFileKindEnum,
20591
20641
  sizeBytes: number().int(),
20592
20642
  width: number().int(),
@@ -20602,7 +20652,7 @@ var RetrainCopyRefusalSchema = _enum([
20602
20652
  var RetrainFrameSelectionSchema = object({
20603
20653
  copied: array(RetrainFrameSchema).readonly(),
20604
20654
  refused: array(object({
20605
- sourceMediaKey: string(),
20655
+ sourceMediaId: number().int(),
20606
20656
  reason: RetrainCopyRefusalSchema
20607
20657
  })).readonly()
20608
20658
  });
@@ -20610,7 +20660,7 @@ var RetrainFrameListSchema = object({
20610
20660
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20611
20661
  copies: array(RetrainFrameSchema).readonly(),
20612
20662
  /** What the page pre-selects — the native key frame when one survives. */
20613
- autoPickMediaKey: string().optional()
20663
+ autoPickMediaId: number().int().optional()
20614
20664
  });
20615
20665
  /** What the operator asked the assist to look for. */
20616
20666
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20705,9 +20755,11 @@ var RecentTracksQueryInput = object({
20705
20755
  });
20706
20756
  /**
20707
20757
  * A Summary (D359): the per-camera session envelope that references tracks.
20708
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20709
- * served by the event-media plane by key), null until the first frame with a
20710
- * member visible has been materialised.
20758
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20759
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20760
+ * first frame with a member visible has been materialised (D482 — it was the
20761
+ * row's composite key, which embedded the owner and could name another table's
20762
+ * row once event ids became per-table rowids).
20711
20763
  */
20712
20764
  var SummarySchema = object({
20713
20765
  id: string(),
@@ -20716,7 +20768,7 @@ var SummarySchema = object({
20716
20768
  lastActiveAt: number(),
20717
20769
  sealedAt: number().nullable(),
20718
20770
  memberCount: number().int().nonnegative(),
20719
- groupShotKey: string().nullable()
20771
+ groupShotMediaId: number().int().nullable()
20720
20772
  });
20721
20773
  var SummariesQueryInput = object({
20722
20774
  deviceIds: array(number()).min(1),
@@ -21270,7 +21322,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21270
21322
  }), method(object({
21271
21323
  deviceId: number(),
21272
21324
  trackId: string(),
21273
- mediaKeys: array(string()).min(1)
21325
+ mediaIds: array(number().int()).min(1)
21274
21326
  }), RetrainFrameSelectionSchema, {
21275
21327
  kind: "mutation",
21276
21328
  auth: "admin"
@@ -21338,7 +21390,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21338
21390
  kind: "query",
21339
21391
  auth: "admin"
21340
21392
  }), method(object({
21341
- eventId: string(),
21393
+ /** Which of the three event tables owns the row. */
21394
+ ownerType: EventOwnerTypeSchema,
21395
+ /** The event's rowid in that table (D474: an event id is a number). */
21396
+ eventId: number().int(),
21342
21397
  kind: MediaFileKindEnum.optional(),
21343
21398
  deviceId: number()
21344
21399
  }), array(MediaFileSchema).readonly()), method(object({
@@ -21349,7 +21404,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21349
21404
  trackId: string(),
21350
21405
  deviceId: number()
21351
21406
  }), array(MediaFileInfoSchema).readonly()), method(object({
21352
- eventId: string(),
21407
+ ownerType: EventOwnerTypeSchema,
21408
+ eventId: number().int(),
21353
21409
  deviceId: number()
21354
21410
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
21355
21411
  kind: "mutation",
@@ -26646,8 +26702,8 @@ var IdentitySchema = object({
26646
26702
  id: string(),
26647
26703
  name: string(),
26648
26704
  sampleCount: number().int().nonnegative(),
26649
- coverMediaKey: string().optional(),
26650
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26705
+ coverMediaId: number().int().optional(),
26706
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26651
26707
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26652
26708
  coverBase64: string().optional()
26653
26709
  });
@@ -26673,8 +26729,8 @@ var IdentitySampleAuditRowSchema = object({
26673
26729
  enrolledAt: number().int(),
26674
26730
  deviceId: number().int().optional(),
26675
26731
  source: _enum(["detected", "photo"]),
26676
- /** The enrolled crop's media key, so the panel can show the evidence. */
26677
- mediaKey: string().optional(),
26732
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26733
+ mediaId: number().int().optional(),
26678
26734
  /**
26679
26735
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26680
26736
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26743,15 +26799,15 @@ var FaceInfoSchema = object({
26743
26799
  */
26744
26800
  cropUrl: string().optional(),
26745
26801
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26746
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26802
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26747
26803
  * legacy rows written before design B. */
26748
26804
  faceBbox: BoundingBoxSchema.optional(),
26749
26805
  /** Design B: MediaStore key of the track's native-resolution key frame.
26750
26806
  * Fetch the native JPEG via the event-media data-plane
26751
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26807
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26752
26808
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26753
26809
  * back to the inline `base64` face crop. */
26754
- keyFrameMediaKey: string().optional(),
26810
+ keyFrameMediaId: number().int().optional(),
26755
26811
  /** Winning identity-match cosine (0..1) for this face's track, when an
26756
26812
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26757
26813
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26820,11 +26876,14 @@ var FaceClusterSchema = object({
26820
26876
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26821
26877
  * dialog already rendering its key FRAME from the `event-media` plane.
26822
26878
  *
26823
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26824
- * media key directly, so this needed no new plane and no new access decision.
26879
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26880
+ * resolves a media row by its own id, so this needed no new plane and no new
26881
+ * access decision.
26825
26882
  */
26826
26883
  var MediaFileLiteSchema$1 = object({
26827
- key: string(),
26884
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26885
+ * (D482). It was the row's composite key, which embedded the owner. */
26886
+ mediaId: number().int(),
26828
26887
  kind: string(),
26829
26888
  url: string(),
26830
26889
  sizeBytes: number(),
@@ -26841,7 +26900,7 @@ method(object({
26841
26900
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26842
26901
  * four times and the viewer holds at `staleTime: 30_000`.
26843
26902
  *
26844
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26903
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26845
26904
  * the `event-media` plane serves that key `immutable` with an ETag.
26846
26905
  *
26847
26906
  * **This is an INPUT field, so it does not reach the addon until the
@@ -30224,8 +30283,8 @@ var VehicleSchema = object({
30224
30283
  id: string(),
30225
30284
  name: string(),
30226
30285
  sampleCount: number().int().nonnegative(),
30227
- coverMediaKey: string().optional(),
30228
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
30286
+ coverMediaId: number().int().optional(),
30287
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
30229
30288
  coverBase64: string().optional()
30230
30289
  });
30231
30290
  var VehicleSampleInfoSchema = object({
@@ -30258,7 +30317,7 @@ var PlateInfoSchema = object({
30258
30317
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
30259
30318
  plateBbox: BoundingBoxSchema.optional(),
30260
30319
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
30261
- keyFrameMediaKey: string().optional(),
30320
+ keyFrameMediaId: number().int().optional(),
30262
30321
  base64: string().optional(),
30263
30322
  /**
30264
30323
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -30279,11 +30338,14 @@ var PlateInfoSchema = object({
30279
30338
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
30280
30339
  * dialog already rendering its key FRAME from the `event-media` plane.
30281
30340
  *
30282
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
30283
- * media key directly, so this needed no new plane and no new access decision.
30341
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
30342
+ * resolves a media row by its own id, so this needed no new plane and no new
30343
+ * access decision.
30284
30344
  */
30285
30345
  var MediaFileLiteSchema = object({
30286
- key: string(),
30346
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
30347
+ * (D482). It was the row's composite key, which embedded the owner. */
30348
+ mediaId: number().int(),
30287
30349
  kind: string(),
30288
30350
  url: string(),
30289
30351
  sizeBytes: number(),
@@ -30342,7 +30404,7 @@ method(object({
30342
30404
  }), method(object({
30343
30405
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
30344
30406
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
30345
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
30407
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
30346
30408
  * INPUT field: stripped by the hub router until the train ships, which
30347
30409
  * resolves to `false` and is exactly the intended default. */
30348
30410
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31998,7 +32060,14 @@ var SceneReferenceSchema = object({
31998
32060
  modelId: string(),
31999
32061
  condition: SceneConditionSchema,
32000
32062
  capturedAt: number(),
32001
- thumbnailMediaId: string().optional(),
32063
+ /**
32064
+ * The reference thumbnail's media ROW id (D482).
32065
+ *
32066
+ * The name already said `mediaId` while the value was the row's composite
32067
+ * key — a leftover that read as done and was not. It is the row's own id
32068
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
32069
+ */
32070
+ thumbnailMediaId: number().int().optional(),
32002
32071
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
32003
32072
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
32004
32073
  * normalized rect frame a different piece of world, and the scene would
@@ -34180,7 +34249,7 @@ var StationaryObjectSchema = object({
34180
34249
  /** Enrichment label carried from the source track (identity / plate). */
34181
34250
  label: string().optional(),
34182
34251
  /** Native-resolution key-frame media key for the parked object's best image. */
34183
- keyFrameMediaKey: string().optional()
34252
+ keyFrameMediaId: number().int().optional()
34184
34253
  });
34185
34254
  var CameraOccupancySnapshotSchema = object({
34186
34255
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -37096,6 +37165,12 @@ Object.freeze({
37096
37165
  addonId: null,
37097
37166
  access: "create"
37098
37167
  },
37168
+ "dataStoreProvider.upsert": {
37169
+ capName: "data-store-provider",
37170
+ capScope: "system",
37171
+ addonId: null,
37172
+ access: "create"
37173
+ },
37099
37174
  "dayNight.getOptions": {
37100
37175
  capName: "day-night",
37101
37176
  capScope: "device",
@@ -40960,6 +41035,12 @@ Object.freeze({
40960
41035
  addonId: null,
40961
41036
  access: "create"
40962
41037
  },
41038
+ "settingsStore.upsert": {
41039
+ capName: "settings-store",
41040
+ capScope: "system",
41041
+ addonId: null,
41042
+ access: "create"
41043
+ },
40963
41044
  "smtpProvider.getStatus": {
40964
41045
  capName: "smtp-provider",
40965
41046
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -20,7 +20,7 @@ import * as net2 from "net";
20
20
  import netImpl from "net";
21
21
  import { mkdir } from "fs/promises";
22
22
  import os from "node:os";
23
- //#region ../types/dist/event-category-DAXzJeTX.mjs
23
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
24
24
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
25
25
  EventCategory["SystemBoot"] = "system.boot";
26
26
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -581,7 +581,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
581
581
  * a package zone — a newly-appeared stationary object of a package class
582
582
  * that cleared the class / zone / dwell / size gates. Payload:
583
583
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
584
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
584
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
585
585
  * Telemetry (D8): the durable record is the `package-events` store row;
586
586
  * this bus topic drives notifier rules + live UI. See
587
587
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5367,7 +5367,7 @@ var ZodIssueCode = {
5367
5367
  var ZodFirstPartyTypeKind;
5368
5368
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5369
5369
  //#endregion
5370
- //#region ../types/dist/sleep-BnujYGPe.mjs
5370
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5371
5371
  /**
5372
5372
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5373
5373
  * window to float samples (D455).
@@ -7346,13 +7346,30 @@ new Set([
7346
7346
  "scene",
7347
7347
  "motion",
7348
7348
  "object",
7349
- "audio"
7349
+ "audio",
7350
+ "mosaic"
7350
7351
  ]);
7351
- new Set([
7352
+ /**
7353
+ * The owner types that are event tables, in the order the event-media resolver
7354
+ * should consider them. Exported so a consumer asking "is this key an event?"
7355
+ * does not re-spell the list and drift from it.
7356
+ */
7357
+ var EVENT_OWNER_TYPES = [
7352
7358
  "motion",
7353
7359
  "object",
7354
7360
  "audio"
7355
- ]);
7361
+ ];
7362
+ /**
7363
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7364
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7365
+ * `(table, id)`).
7366
+ *
7367
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7368
+ * table would otherwise be accepted by the codec and refused at the door, with
7369
+ * nothing failing until a caller asked.
7370
+ */
7371
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7372
+ new Set(EVENT_OWNER_TYPES);
7356
7373
  var EncodeProfileSchema = object({
7357
7374
  video: object({
7358
7375
  codec: _enum([
@@ -13117,6 +13134,16 @@ method(object({
13117
13134
  filter: QueryFilterSchema.optional(),
13118
13135
  columns: array(string()).readonly().optional()
13119
13136
  }), array(SettingsRecordSchema).readonly()), method(object({
13137
+ namespace: string().optional(),
13138
+ collection: string(),
13139
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13140
+ * index on the collection. Never empty. */
13141
+ conflict: array(string()).readonly(),
13142
+ record: BulkRecordSchema
13143
+ }), object({
13144
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13145
+ * row's own id on an update. */
13146
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
13120
13147
  namespace: string().optional(),
13121
13148
  collection: string(),
13122
13149
  record: object({
@@ -13251,6 +13278,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
13251
13278
  id: union([string(), number()]) }), {
13252
13279
  kind: "mutation",
13253
13280
  auth: "admin"
13281
+ }), method(object({
13282
+ namespace: string().optional(),
13283
+ collection: string(),
13284
+ conflict: array(string()).readonly(),
13285
+ record: BulkRecordSchema
13286
+ }), object({ id: union([string(), number()]) }), {
13287
+ kind: "mutation",
13288
+ auth: "admin"
13254
13289
  }), method(object({
13255
13290
  namespace: string().optional(),
13256
13291
  collection: string(),
@@ -19773,8 +19808,8 @@ var TrackPositionSchema = object({
19773
19808
  var TrackSnapshotSchema = object({
19774
19809
  timestamp: number(),
19775
19810
  position: TrackPositionSchema,
19776
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19777
- mediaKey: string()
19811
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19812
+ mediaId: number().int()
19778
19813
  });
19779
19814
  /**
19780
19815
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -20378,14 +20413,14 @@ var ObjectEventSchema = object({
20378
20413
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
20379
20414
  frameWidth: number().optional(),
20380
20415
  frameHeight: number().optional(),
20381
- /** MediaStore key for the crop attached to this event (if any). */
20382
- mediaKey: string().optional(),
20383
- /** Design B: MediaStore key of the track's native-resolution key frame (the
20416
+ /** Media row id of the crop attached to this event (if any) — D482. */
20417
+ mediaId: number().int().optional(),
20418
+ /** Design B: media row id of the track's native-resolution key frame (the
20384
20419
  * best-detection full frame). Resolve via the event-media data-plane
20385
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
20420
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
20386
20421
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
20387
- * sources — consumers fall back to `mediaKey` (the tight crop). */
20388
- keyFrameMediaKey: string().optional(),
20422
+ * sources — consumers fall back to `mediaId` (the tight crop). */
20423
+ keyFrameMediaId: number().int().optional(),
20389
20424
  /** Populated by B5 (recording playback URL for this event). */
20390
20425
  mediaUrl: string().optional(),
20391
20426
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -20435,7 +20470,7 @@ var MediaFileKindEnum = _enum([
20435
20470
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
20436
20471
  *
20437
20472
  * `url` points at the `event-media` data plane
20438
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
20473
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
20439
20474
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
20440
20475
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
20441
20476
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -20443,10 +20478,13 @@ var MediaFileKindEnum = _enum([
20443
20478
  * `data-plane-access.ts` for the rule and the one gap it does not close
20444
20479
  * (per-device scoping).
20445
20480
  *
20446
- * The URL is built from the row's **stored** key, which is not always its
20447
- * published `kind`: a track's face/plate crop is stored as `crop` under
20481
+ * The URL is built from the row's own id, which since D482 says nothing about
20482
+ * the row's owner or kind and that is the point. The published `kind` is not
20483
+ * the stored one (a track's face/plate crop is stored as `crop` under
20448
20484
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
20449
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
20485
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
20486
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
20487
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
20450
20488
  *
20451
20489
  * ## `base64` is TRANSITIONAL and is going away
20452
20490
  *
@@ -20459,7 +20497,19 @@ var MediaFileKindEnum = _enum([
20459
20497
  * `analytics-query-facade.ts`; nothing else reads it.
20460
20498
  */
20461
20499
  var MediaFileSchema = object({
20462
- key: string(),
20500
+ /**
20501
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
20502
+ *
20503
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
20504
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
20505
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
20506
+ * different rows that spell the same number, and a track whose
20507
+ * `bestEventId` was an object event was served a motion event's snapshot —
20508
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
20509
+ * surrogate id cannot name the wrong row's owner, because it names no owner
20510
+ * at all.
20511
+ */
20512
+ mediaId: number().int(),
20463
20513
  kind: MediaFileKindEnum,
20464
20514
  sizeBytes: number(),
20465
20515
  timestamp: number()
@@ -20567,7 +20617,7 @@ var RetrainTrackSchema = object({
20567
20617
  });
20568
20618
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
20569
20619
  var RetrainFrameCandidateSchema = object({
20570
- mediaKey: string(),
20620
+ mediaId: number().int(),
20571
20621
  kind: MediaFileKindEnum,
20572
20622
  timestamp: number(),
20573
20623
  sizeBytes: number().int(),
@@ -20581,7 +20631,7 @@ var RetrainFrameSchema = object({
20581
20631
  deviceId: number(),
20582
20632
  trackId: string(),
20583
20633
  /** Provenance only. It may already point at nothing — that is expected. */
20584
- sourceMediaKey: string(),
20634
+ sourceMediaId: number().int(),
20585
20635
  sourceKind: MediaFileKindEnum,
20586
20636
  sizeBytes: number().int(),
20587
20637
  width: number().int(),
@@ -20597,7 +20647,7 @@ var RetrainCopyRefusalSchema = _enum([
20597
20647
  var RetrainFrameSelectionSchema = object({
20598
20648
  copied: array(RetrainFrameSchema).readonly(),
20599
20649
  refused: array(object({
20600
- sourceMediaKey: string(),
20650
+ sourceMediaId: number().int(),
20601
20651
  reason: RetrainCopyRefusalSchema
20602
20652
  })).readonly()
20603
20653
  });
@@ -20605,7 +20655,7 @@ var RetrainFrameListSchema = object({
20605
20655
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20606
20656
  copies: array(RetrainFrameSchema).readonly(),
20607
20657
  /** What the page pre-selects — the native key frame when one survives. */
20608
- autoPickMediaKey: string().optional()
20658
+ autoPickMediaId: number().int().optional()
20609
20659
  });
20610
20660
  /** What the operator asked the assist to look for. */
20611
20661
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20700,9 +20750,11 @@ var RecentTracksQueryInput = object({
20700
20750
  });
20701
20751
  /**
20702
20752
  * A Summary (D359): the per-camera session envelope that references tracks.
20703
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20704
- * served by the event-media plane by key), null until the first frame with a
20705
- * member visible has been materialised.
20753
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20754
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20755
+ * first frame with a member visible has been materialised (D482 — it was the
20756
+ * row's composite key, which embedded the owner and could name another table's
20757
+ * row once event ids became per-table rowids).
20706
20758
  */
20707
20759
  var SummarySchema = object({
20708
20760
  id: string(),
@@ -20711,7 +20763,7 @@ var SummarySchema = object({
20711
20763
  lastActiveAt: number(),
20712
20764
  sealedAt: number().nullable(),
20713
20765
  memberCount: number().int().nonnegative(),
20714
- groupShotKey: string().nullable()
20766
+ groupShotMediaId: number().int().nullable()
20715
20767
  });
20716
20768
  var SummariesQueryInput = object({
20717
20769
  deviceIds: array(number()).min(1),
@@ -21265,7 +21317,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21265
21317
  }), method(object({
21266
21318
  deviceId: number(),
21267
21319
  trackId: string(),
21268
- mediaKeys: array(string()).min(1)
21320
+ mediaIds: array(number().int()).min(1)
21269
21321
  }), RetrainFrameSelectionSchema, {
21270
21322
  kind: "mutation",
21271
21323
  auth: "admin"
@@ -21333,7 +21385,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21333
21385
  kind: "query",
21334
21386
  auth: "admin"
21335
21387
  }), method(object({
21336
- eventId: string(),
21388
+ /** Which of the three event tables owns the row. */
21389
+ ownerType: EventOwnerTypeSchema,
21390
+ /** The event's rowid in that table (D474: an event id is a number). */
21391
+ eventId: number().int(),
21337
21392
  kind: MediaFileKindEnum.optional(),
21338
21393
  deviceId: number()
21339
21394
  }), array(MediaFileSchema).readonly()), method(object({
@@ -21344,7 +21399,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21344
21399
  trackId: string(),
21345
21400
  deviceId: number()
21346
21401
  }), array(MediaFileInfoSchema).readonly()), method(object({
21347
- eventId: string(),
21402
+ ownerType: EventOwnerTypeSchema,
21403
+ eventId: number().int(),
21348
21404
  deviceId: number()
21349
21405
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
21350
21406
  kind: "mutation",
@@ -26641,8 +26697,8 @@ var IdentitySchema = object({
26641
26697
  id: string(),
26642
26698
  name: string(),
26643
26699
  sampleCount: number().int().nonnegative(),
26644
- coverMediaKey: string().optional(),
26645
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26700
+ coverMediaId: number().int().optional(),
26701
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26646
26702
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26647
26703
  coverBase64: string().optional()
26648
26704
  });
@@ -26668,8 +26724,8 @@ var IdentitySampleAuditRowSchema = object({
26668
26724
  enrolledAt: number().int(),
26669
26725
  deviceId: number().int().optional(),
26670
26726
  source: _enum(["detected", "photo"]),
26671
- /** The enrolled crop's media key, so the panel can show the evidence. */
26672
- mediaKey: string().optional(),
26727
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26728
+ mediaId: number().int().optional(),
26673
26729
  /**
26674
26730
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26675
26731
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26738,15 +26794,15 @@ var FaceInfoSchema = object({
26738
26794
  */
26739
26795
  cropUrl: string().optional(),
26740
26796
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26741
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26797
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26742
26798
  * legacy rows written before design B. */
26743
26799
  faceBbox: BoundingBoxSchema.optional(),
26744
26800
  /** Design B: MediaStore key of the track's native-resolution key frame.
26745
26801
  * Fetch the native JPEG via the event-media data-plane
26746
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26802
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26747
26803
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26748
26804
  * back to the inline `base64` face crop. */
26749
- keyFrameMediaKey: string().optional(),
26805
+ keyFrameMediaId: number().int().optional(),
26750
26806
  /** Winning identity-match cosine (0..1) for this face's track, when an
26751
26807
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26752
26808
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26815,11 +26871,14 @@ var FaceClusterSchema = object({
26815
26871
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26816
26872
  * dialog already rendering its key FRAME from the `event-media` plane.
26817
26873
  *
26818
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26819
- * media key directly, so this needed no new plane and no new access decision.
26874
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26875
+ * resolves a media row by its own id, so this needed no new plane and no new
26876
+ * access decision.
26820
26877
  */
26821
26878
  var MediaFileLiteSchema$1 = object({
26822
- key: string(),
26879
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26880
+ * (D482). It was the row's composite key, which embedded the owner. */
26881
+ mediaId: number().int(),
26823
26882
  kind: string(),
26824
26883
  url: string(),
26825
26884
  sizeBytes: number(),
@@ -26836,7 +26895,7 @@ method(object({
26836
26895
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26837
26896
  * four times and the viewer holds at `staleTime: 30_000`.
26838
26897
  *
26839
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26898
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26840
26899
  * the `event-media` plane serves that key `immutable` with an ETag.
26841
26900
  *
26842
26901
  * **This is an INPUT field, so it does not reach the addon until the
@@ -30219,8 +30278,8 @@ var VehicleSchema = object({
30219
30278
  id: string(),
30220
30279
  name: string(),
30221
30280
  sampleCount: number().int().nonnegative(),
30222
- coverMediaKey: string().optional(),
30223
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
30281
+ coverMediaId: number().int().optional(),
30282
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
30224
30283
  coverBase64: string().optional()
30225
30284
  });
30226
30285
  var VehicleSampleInfoSchema = object({
@@ -30253,7 +30312,7 @@ var PlateInfoSchema = object({
30253
30312
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
30254
30313
  plateBbox: BoundingBoxSchema.optional(),
30255
30314
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
30256
- keyFrameMediaKey: string().optional(),
30315
+ keyFrameMediaId: number().int().optional(),
30257
30316
  base64: string().optional(),
30258
30317
  /**
30259
30318
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -30274,11 +30333,14 @@ var PlateInfoSchema = object({
30274
30333
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
30275
30334
  * dialog already rendering its key FRAME from the `event-media` plane.
30276
30335
  *
30277
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
30278
- * media key directly, so this needed no new plane and no new access decision.
30336
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
30337
+ * resolves a media row by its own id, so this needed no new plane and no new
30338
+ * access decision.
30279
30339
  */
30280
30340
  var MediaFileLiteSchema = object({
30281
- key: string(),
30341
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
30342
+ * (D482). It was the row's composite key, which embedded the owner. */
30343
+ mediaId: number().int(),
30282
30344
  kind: string(),
30283
30345
  url: string(),
30284
30346
  sizeBytes: number(),
@@ -30337,7 +30399,7 @@ method(object({
30337
30399
  }), method(object({
30338
30400
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
30339
30401
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
30340
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
30402
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
30341
30403
  * INPUT field: stripped by the hub router until the train ships, which
30342
30404
  * resolves to `false` and is exactly the intended default. */
30343
30405
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31993,7 +32055,14 @@ var SceneReferenceSchema = object({
31993
32055
  modelId: string(),
31994
32056
  condition: SceneConditionSchema,
31995
32057
  capturedAt: number(),
31996
- thumbnailMediaId: string().optional(),
32058
+ /**
32059
+ * The reference thumbnail's media ROW id (D482).
32060
+ *
32061
+ * The name already said `mediaId` while the value was the row's composite
32062
+ * key — a leftover that read as done and was not. It is the row's own id
32063
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
32064
+ */
32065
+ thumbnailMediaId: number().int().optional(),
31997
32066
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31998
32067
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31999
32068
  * normalized rect frame a different piece of world, and the scene would
@@ -34175,7 +34244,7 @@ var StationaryObjectSchema = object({
34175
34244
  /** Enrichment label carried from the source track (identity / plate). */
34176
34245
  label: string().optional(),
34177
34246
  /** Native-resolution key-frame media key for the parked object's best image. */
34178
- keyFrameMediaKey: string().optional()
34247
+ keyFrameMediaId: number().int().optional()
34179
34248
  });
34180
34249
  var CameraOccupancySnapshotSchema = object({
34181
34250
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -37091,6 +37160,12 @@ Object.freeze({
37091
37160
  addonId: null,
37092
37161
  access: "create"
37093
37162
  },
37163
+ "dataStoreProvider.upsert": {
37164
+ capName: "data-store-provider",
37165
+ capScope: "system",
37166
+ addonId: null,
37167
+ access: "create"
37168
+ },
37094
37169
  "dayNight.getOptions": {
37095
37170
  capName: "day-night",
37096
37171
  capScope: "device",
@@ -40955,6 +41030,12 @@ Object.freeze({
40955
41030
  addonId: null,
40956
41031
  access: "create"
40957
41032
  },
41033
+ "settingsStore.upsert": {
41034
+ capName: "settings-store",
41035
+ capScope: "system",
41036
+ addonId: null,
41037
+ access: "create"
41038
+ },
40958
41039
  "smtpProvider.getStatus": {
40959
41040
  capName: "smtp-provider",
40960
41041
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.122",
3
+ "version": "1.2.123",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",