@camstack/addon-provider-wyze 0.2.103 → 0.2.104

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
@@ -31,7 +31,7 @@ let net = require("net");
31
31
  net = __toESM(net, 1);
32
32
  let node_child_process = require("node:child_process");
33
33
  let node_tls = require("node:tls");
34
- //#region ../types/dist/event-category-DAXzJeTX.mjs
34
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
35
35
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
36
36
  EventCategory["SystemBoot"] = "system.boot";
37
37
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -592,7 +592,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
592
592
  * a package zone — a newly-appeared stationary object of a package class
593
593
  * that cleared the class / zone / dwell / size gates. Payload:
594
594
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
595
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
595
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
596
596
  * Telemetry (D8): the durable record is the `package-events` store row;
597
597
  * this bus topic drives notifier rules + live UI. See
598
598
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5378,7 +5378,7 @@ var ZodIssueCode = {
5378
5378
  var ZodFirstPartyTypeKind;
5379
5379
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5380
5380
  //#endregion
5381
- //#region ../types/dist/sleep-BnujYGPe.mjs
5381
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5382
5382
  /**
5383
5383
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5384
5384
  * window to float samples (D455).
@@ -7345,13 +7345,30 @@ new Set([
7345
7345
  "scene",
7346
7346
  "motion",
7347
7347
  "object",
7348
- "audio"
7348
+ "audio",
7349
+ "mosaic"
7349
7350
  ]);
7350
- new Set([
7351
+ /**
7352
+ * The owner types that are event tables, in the order the event-media resolver
7353
+ * should consider them. Exported so a consumer asking "is this key an event?"
7354
+ * does not re-spell the list and drift from it.
7355
+ */
7356
+ var EVENT_OWNER_TYPES = [
7351
7357
  "motion",
7352
7358
  "object",
7353
7359
  "audio"
7354
- ]);
7360
+ ];
7361
+ /**
7362
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7363
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7364
+ * `(table, id)`).
7365
+ *
7366
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7367
+ * table would otherwise be accepted by the codec and refused at the door, with
7368
+ * nothing failing until a caller asked.
7369
+ */
7370
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7371
+ new Set(EVENT_OWNER_TYPES);
7355
7372
  var EncodeProfileSchema = object({
7356
7373
  video: object({
7357
7374
  codec: _enum([
@@ -12550,6 +12567,16 @@ method(object({
12550
12567
  filter: QueryFilterSchema.optional(),
12551
12568
  columns: array(string()).readonly().optional()
12552
12569
  }), array(SettingsRecordSchema).readonly()), method(object({
12570
+ namespace: string().optional(),
12571
+ collection: string(),
12572
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12573
+ * index on the collection. Never empty. */
12574
+ conflict: array(string()).readonly(),
12575
+ record: BulkRecordSchema
12576
+ }), object({
12577
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12578
+ * row's own id on an update. */
12579
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12553
12580
  namespace: string().optional(),
12554
12581
  collection: string(),
12555
12582
  record: object({
@@ -12684,6 +12711,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12684
12711
  id: union([string(), number()]) }), {
12685
12712
  kind: "mutation",
12686
12713
  auth: "admin"
12714
+ }), method(object({
12715
+ namespace: string().optional(),
12716
+ collection: string(),
12717
+ conflict: array(string()).readonly(),
12718
+ record: BulkRecordSchema
12719
+ }), object({ id: union([string(), number()]) }), {
12720
+ kind: "mutation",
12721
+ auth: "admin"
12687
12722
  }), method(object({
12688
12723
  namespace: string().optional(),
12689
12724
  collection: string(),
@@ -19183,8 +19218,8 @@ var TrackPositionSchema = object({
19183
19218
  var TrackSnapshotSchema = object({
19184
19219
  timestamp: number(),
19185
19220
  position: TrackPositionSchema,
19186
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19187
- mediaKey: string()
19221
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19222
+ mediaId: number().int()
19188
19223
  });
19189
19224
  /**
19190
19225
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19788,14 +19823,14 @@ var ObjectEventSchema = object({
19788
19823
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19789
19824
  frameWidth: number().optional(),
19790
19825
  frameHeight: number().optional(),
19791
- /** MediaStore key for the crop attached to this event (if any). */
19792
- mediaKey: string().optional(),
19793
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19826
+ /** Media row id of the crop attached to this event (if any) — D482. */
19827
+ mediaId: number().int().optional(),
19828
+ /** Design B: media row id of the track's native-resolution key frame (the
19794
19829
  * best-detection full frame). Resolve via the event-media data-plane
19795
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19830
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19796
19831
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19797
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19798
- keyFrameMediaKey: string().optional(),
19832
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19833
+ keyFrameMediaId: number().int().optional(),
19799
19834
  /** Populated by B5 (recording playback URL for this event). */
19800
19835
  mediaUrl: string().optional(),
19801
19836
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19845,7 +19880,7 @@ var MediaFileKindEnum = _enum([
19845
19880
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19846
19881
  *
19847
19882
  * `url` points at the `event-media` data plane
19848
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19883
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19849
19884
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19850
19885
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19851
19886
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19853,10 +19888,13 @@ var MediaFileKindEnum = _enum([
19853
19888
  * `data-plane-access.ts` for the rule and the one gap it does not close
19854
19889
  * (per-device scoping).
19855
19890
  *
19856
- * The URL is built from the row's **stored** key, which is not always its
19857
- * published `kind`: a track's face/plate crop is stored as `crop` under
19891
+ * The URL is built from the row's own id, which since D482 says nothing about
19892
+ * the row's owner or kind — and that is the point. The published `kind` is not
19893
+ * the stored one (a track's face/plate crop is stored as `crop` under
19858
19894
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19859
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19895
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19896
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19897
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19860
19898
  *
19861
19899
  * ## `base64` is TRANSITIONAL and is going away
19862
19900
  *
@@ -19869,7 +19907,19 @@ var MediaFileKindEnum = _enum([
19869
19907
  * `analytics-query-facade.ts`; nothing else reads it.
19870
19908
  */
19871
19909
  var MediaFileSchema = object({
19872
- key: string(),
19910
+ /**
19911
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19912
+ *
19913
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19914
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19915
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19916
+ * different rows that spell the same number, and a track whose
19917
+ * `bestEventId` was an object event was served a motion event's snapshot —
19918
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19919
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19920
+ * at all.
19921
+ */
19922
+ mediaId: number().int(),
19873
19923
  kind: MediaFileKindEnum,
19874
19924
  sizeBytes: number(),
19875
19925
  timestamp: number()
@@ -19977,7 +20027,7 @@ var RetrainTrackSchema = object({
19977
20027
  });
19978
20028
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19979
20029
  var RetrainFrameCandidateSchema = object({
19980
- mediaKey: string(),
20030
+ mediaId: number().int(),
19981
20031
  kind: MediaFileKindEnum,
19982
20032
  timestamp: number(),
19983
20033
  sizeBytes: number().int(),
@@ -19991,7 +20041,7 @@ var RetrainFrameSchema = object({
19991
20041
  deviceId: number(),
19992
20042
  trackId: string(),
19993
20043
  /** Provenance only. It may already point at nothing — that is expected. */
19994
- sourceMediaKey: string(),
20044
+ sourceMediaId: number().int(),
19995
20045
  sourceKind: MediaFileKindEnum,
19996
20046
  sizeBytes: number().int(),
19997
20047
  width: number().int(),
@@ -20007,7 +20057,7 @@ var RetrainCopyRefusalSchema = _enum([
20007
20057
  var RetrainFrameSelectionSchema = object({
20008
20058
  copied: array(RetrainFrameSchema).readonly(),
20009
20059
  refused: array(object({
20010
- sourceMediaKey: string(),
20060
+ sourceMediaId: number().int(),
20011
20061
  reason: RetrainCopyRefusalSchema
20012
20062
  })).readonly()
20013
20063
  });
@@ -20015,7 +20065,7 @@ var RetrainFrameListSchema = object({
20015
20065
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20016
20066
  copies: array(RetrainFrameSchema).readonly(),
20017
20067
  /** What the page pre-selects — the native key frame when one survives. */
20018
- autoPickMediaKey: string().optional()
20068
+ autoPickMediaId: number().int().optional()
20019
20069
  });
20020
20070
  /** What the operator asked the assist to look for. */
20021
20071
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20110,9 +20160,11 @@ var RecentTracksQueryInput = object({
20110
20160
  });
20111
20161
  /**
20112
20162
  * A Summary (D359): the per-camera session envelope that references tracks.
20113
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20114
- * served by the event-media plane by key), null until the first frame with a
20115
- * member visible has been materialised.
20163
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20164
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20165
+ * first frame with a member visible has been materialised (D482 — it was the
20166
+ * row's composite key, which embedded the owner and could name another table's
20167
+ * row once event ids became per-table rowids).
20116
20168
  */
20117
20169
  var SummarySchema = object({
20118
20170
  id: string(),
@@ -20121,7 +20173,7 @@ var SummarySchema = object({
20121
20173
  lastActiveAt: number(),
20122
20174
  sealedAt: number().nullable(),
20123
20175
  memberCount: number().int().nonnegative(),
20124
- groupShotKey: string().nullable()
20176
+ groupShotMediaId: number().int().nullable()
20125
20177
  });
20126
20178
  var SummariesQueryInput = object({
20127
20179
  deviceIds: array(number()).min(1),
@@ -20675,7 +20727,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20675
20727
  }), method(object({
20676
20728
  deviceId: number(),
20677
20729
  trackId: string(),
20678
- mediaKeys: array(string()).min(1)
20730
+ mediaIds: array(number().int()).min(1)
20679
20731
  }), RetrainFrameSelectionSchema, {
20680
20732
  kind: "mutation",
20681
20733
  auth: "admin"
@@ -20743,7 +20795,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20743
20795
  kind: "query",
20744
20796
  auth: "admin"
20745
20797
  }), method(object({
20746
- eventId: string(),
20798
+ /** Which of the three event tables owns the row. */
20799
+ ownerType: EventOwnerTypeSchema,
20800
+ /** The event's rowid in that table (D474: an event id is a number). */
20801
+ eventId: number().int(),
20747
20802
  kind: MediaFileKindEnum.optional(),
20748
20803
  deviceId: number()
20749
20804
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20754,7 +20809,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20754
20809
  trackId: string(),
20755
20810
  deviceId: number()
20756
20811
  }), array(MediaFileInfoSchema).readonly()), method(object({
20757
- eventId: string(),
20812
+ ownerType: EventOwnerTypeSchema,
20813
+ eventId: number().int(),
20758
20814
  deviceId: number()
20759
20815
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20760
20816
  kind: "mutation",
@@ -26059,8 +26115,8 @@ var IdentitySchema = object({
26059
26115
  id: string(),
26060
26116
  name: string(),
26061
26117
  sampleCount: number().int().nonnegative(),
26062
- coverMediaKey: string().optional(),
26063
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26118
+ coverMediaId: number().int().optional(),
26119
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26064
26120
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26065
26121
  coverBase64: string().optional()
26066
26122
  });
@@ -26086,8 +26142,8 @@ var IdentitySampleAuditRowSchema = object({
26086
26142
  enrolledAt: number().int(),
26087
26143
  deviceId: number().int().optional(),
26088
26144
  source: _enum(["detected", "photo"]),
26089
- /** The enrolled crop's media key, so the panel can show the evidence. */
26090
- mediaKey: string().optional(),
26145
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26146
+ mediaId: number().int().optional(),
26091
26147
  /**
26092
26148
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26093
26149
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26156,15 +26212,15 @@ var FaceInfoSchema = object({
26156
26212
  */
26157
26213
  cropUrl: string().optional(),
26158
26214
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26159
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26215
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26160
26216
  * legacy rows written before design B. */
26161
26217
  faceBbox: BoundingBoxSchema.optional(),
26162
26218
  /** Design B: MediaStore key of the track's native-resolution key frame.
26163
26219
  * Fetch the native JPEG via the event-media data-plane
26164
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26220
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26165
26221
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26166
26222
  * back to the inline `base64` face crop. */
26167
- keyFrameMediaKey: string().optional(),
26223
+ keyFrameMediaId: number().int().optional(),
26168
26224
  /** Winning identity-match cosine (0..1) for this face's track, when an
26169
26225
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26170
26226
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26233,11 +26289,14 @@ var FaceClusterSchema = object({
26233
26289
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26234
26290
  * dialog already rendering its key FRAME from the `event-media` plane.
26235
26291
  *
26236
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26237
- * media key directly, so this needed no new plane and no new access decision.
26292
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26293
+ * resolves a media row by its own id, so this needed no new plane and no new
26294
+ * access decision.
26238
26295
  */
26239
26296
  var MediaFileLiteSchema$1 = object({
26240
- key: string(),
26297
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26298
+ * (D482). It was the row's composite key, which embedded the owner. */
26299
+ mediaId: number().int(),
26241
26300
  kind: string(),
26242
26301
  url: string(),
26243
26302
  sizeBytes: number(),
@@ -26254,7 +26313,7 @@ method(object({
26254
26313
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26255
26314
  * four times and the viewer holds at `staleTime: 30_000`.
26256
26315
  *
26257
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26316
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26258
26317
  * the `event-media` plane serves that key `immutable` with an ETag.
26259
26318
  *
26260
26319
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29617,8 +29676,8 @@ var VehicleSchema = object({
29617
29676
  id: string(),
29618
29677
  name: string(),
29619
29678
  sampleCount: number().int().nonnegative(),
29620
- coverMediaKey: string().optional(),
29621
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29679
+ coverMediaId: number().int().optional(),
29680
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29622
29681
  coverBase64: string().optional()
29623
29682
  });
29624
29683
  var VehicleSampleInfoSchema = object({
@@ -29651,7 +29710,7 @@ var PlateInfoSchema = object({
29651
29710
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29652
29711
  plateBbox: BoundingBoxSchema.optional(),
29653
29712
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29654
- keyFrameMediaKey: string().optional(),
29713
+ keyFrameMediaId: number().int().optional(),
29655
29714
  base64: string().optional(),
29656
29715
  /**
29657
29716
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29672,11 +29731,14 @@ var PlateInfoSchema = object({
29672
29731
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29673
29732
  * dialog already rendering its key FRAME from the `event-media` plane.
29674
29733
  *
29675
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29676
- * media key directly, so this needed no new plane and no new access decision.
29734
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29735
+ * resolves a media row by its own id, so this needed no new plane and no new
29736
+ * access decision.
29677
29737
  */
29678
29738
  var MediaFileLiteSchema = object({
29679
- key: string(),
29739
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29740
+ * (D482). It was the row's composite key, which embedded the owner. */
29741
+ mediaId: number().int(),
29680
29742
  kind: string(),
29681
29743
  url: string(),
29682
29744
  sizeBytes: number(),
@@ -29735,7 +29797,7 @@ method(object({
29735
29797
  }), method(object({
29736
29798
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29737
29799
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29738
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29800
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29739
29801
  * INPUT field: stripped by the hub router until the train ships, which
29740
29802
  * resolves to `false` and is exactly the intended default. */
29741
29803
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31304,7 +31366,14 @@ var SceneReferenceSchema = object({
31304
31366
  modelId: string(),
31305
31367
  condition: SceneConditionSchema,
31306
31368
  capturedAt: number(),
31307
- thumbnailMediaId: string().optional(),
31369
+ /**
31370
+ * The reference thumbnail's media ROW id (D482).
31371
+ *
31372
+ * The name already said `mediaId` while the value was the row's composite
31373
+ * key — a leftover that read as done and was not. It is the row's own id
31374
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31375
+ */
31376
+ thumbnailMediaId: number().int().optional(),
31308
31377
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31309
31378
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31310
31379
  * normalized rect frame a different piece of world, and the scene would
@@ -33288,7 +33357,7 @@ var StationaryObjectSchema = object({
33288
33357
  /** Enrichment label carried from the source track (identity / plate). */
33289
33358
  label: string().optional(),
33290
33359
  /** Native-resolution key-frame media key for the parked object's best image. */
33291
- keyFrameMediaKey: string().optional()
33360
+ keyFrameMediaId: number().int().optional()
33292
33361
  });
33293
33362
  var CameraOccupancySnapshotSchema = object({
33294
33363
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36026,6 +36095,12 @@ Object.freeze({
36026
36095
  addonId: null,
36027
36096
  access: "create"
36028
36097
  },
36098
+ "dataStoreProvider.upsert": {
36099
+ capName: "data-store-provider",
36100
+ capScope: "system",
36101
+ addonId: null,
36102
+ access: "create"
36103
+ },
36029
36104
  "dayNight.getOptions": {
36030
36105
  capName: "day-night",
36031
36106
  capScope: "device",
@@ -39890,6 +39965,12 @@ Object.freeze({
39890
39965
  addonId: null,
39891
39966
  access: "create"
39892
39967
  },
39968
+ "settingsStore.upsert": {
39969
+ capName: "settings-store",
39970
+ capScope: "system",
39971
+ addonId: null,
39972
+ access: "create"
39973
+ },
39893
39974
  "smtpProvider.getStatus": {
39894
39975
  capName: "smtp-provider",
39895
39976
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -10,7 +10,7 @@ import { getCACertificates, setDefaultCACertificates } from "node:tls";
10
10
  //#region \0rolldown/runtime.js
11
11
  var __require$1 = /* @__PURE__ */ createRequire(import.meta.url);
12
12
  //#endregion
13
- //#region ../types/dist/event-category-DAXzJeTX.mjs
13
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
14
14
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
15
15
  EventCategory["SystemBoot"] = "system.boot";
16
16
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -571,7 +571,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
571
571
  * a package zone — a newly-appeared stationary object of a package class
572
572
  * that cleared the class / zone / dwell / size gates. Payload:
573
573
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
574
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
574
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
575
575
  * Telemetry (D8): the durable record is the `package-events` store row;
576
576
  * this bus topic drives notifier rules + live UI. See
577
577
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5357,7 +5357,7 @@ var ZodIssueCode = {
5357
5357
  var ZodFirstPartyTypeKind;
5358
5358
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5359
5359
  //#endregion
5360
- //#region ../types/dist/sleep-BnujYGPe.mjs
5360
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5361
5361
  /**
5362
5362
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5363
5363
  * window to float samples (D455).
@@ -7324,13 +7324,30 @@ new Set([
7324
7324
  "scene",
7325
7325
  "motion",
7326
7326
  "object",
7327
- "audio"
7327
+ "audio",
7328
+ "mosaic"
7328
7329
  ]);
7329
- new Set([
7330
+ /**
7331
+ * The owner types that are event tables, in the order the event-media resolver
7332
+ * should consider them. Exported so a consumer asking "is this key an event?"
7333
+ * does not re-spell the list and drift from it.
7334
+ */
7335
+ var EVENT_OWNER_TYPES = [
7330
7336
  "motion",
7331
7337
  "object",
7332
7338
  "audio"
7333
- ]);
7339
+ ];
7340
+ /**
7341
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7342
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7343
+ * `(table, id)`).
7344
+ *
7345
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7346
+ * table would otherwise be accepted by the codec and refused at the door, with
7347
+ * nothing failing until a caller asked.
7348
+ */
7349
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7350
+ new Set(EVENT_OWNER_TYPES);
7334
7351
  var EncodeProfileSchema = object({
7335
7352
  video: object({
7336
7353
  codec: _enum([
@@ -12529,6 +12546,16 @@ method(object({
12529
12546
  filter: QueryFilterSchema.optional(),
12530
12547
  columns: array(string()).readonly().optional()
12531
12548
  }), array(SettingsRecordSchema).readonly()), method(object({
12549
+ namespace: string().optional(),
12550
+ collection: string(),
12551
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12552
+ * index on the collection. Never empty. */
12553
+ conflict: array(string()).readonly(),
12554
+ record: BulkRecordSchema
12555
+ }), object({
12556
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12557
+ * row's own id on an update. */
12558
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12532
12559
  namespace: string().optional(),
12533
12560
  collection: string(),
12534
12561
  record: object({
@@ -12663,6 +12690,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12663
12690
  id: union([string(), number()]) }), {
12664
12691
  kind: "mutation",
12665
12692
  auth: "admin"
12693
+ }), method(object({
12694
+ namespace: string().optional(),
12695
+ collection: string(),
12696
+ conflict: array(string()).readonly(),
12697
+ record: BulkRecordSchema
12698
+ }), object({ id: union([string(), number()]) }), {
12699
+ kind: "mutation",
12700
+ auth: "admin"
12666
12701
  }), method(object({
12667
12702
  namespace: string().optional(),
12668
12703
  collection: string(),
@@ -19162,8 +19197,8 @@ var TrackPositionSchema = object({
19162
19197
  var TrackSnapshotSchema = object({
19163
19198
  timestamp: number(),
19164
19199
  position: TrackPositionSchema,
19165
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19166
- mediaKey: string()
19200
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19201
+ mediaId: number().int()
19167
19202
  });
19168
19203
  /**
19169
19204
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19767,14 +19802,14 @@ var ObjectEventSchema = object({
19767
19802
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19768
19803
  frameWidth: number().optional(),
19769
19804
  frameHeight: number().optional(),
19770
- /** MediaStore key for the crop attached to this event (if any). */
19771
- mediaKey: string().optional(),
19772
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19805
+ /** Media row id of the crop attached to this event (if any) — D482. */
19806
+ mediaId: number().int().optional(),
19807
+ /** Design B: media row id of the track's native-resolution key frame (the
19773
19808
  * best-detection full frame). Resolve via the event-media data-plane
19774
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19809
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19775
19810
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19776
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19777
- keyFrameMediaKey: string().optional(),
19811
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19812
+ keyFrameMediaId: number().int().optional(),
19778
19813
  /** Populated by B5 (recording playback URL for this event). */
19779
19814
  mediaUrl: string().optional(),
19780
19815
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19824,7 +19859,7 @@ var MediaFileKindEnum = _enum([
19824
19859
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19825
19860
  *
19826
19861
  * `url` points at the `event-media` data plane
19827
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19862
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19828
19863
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19829
19864
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19830
19865
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19832,10 +19867,13 @@ var MediaFileKindEnum = _enum([
19832
19867
  * `data-plane-access.ts` for the rule and the one gap it does not close
19833
19868
  * (per-device scoping).
19834
19869
  *
19835
- * The URL is built from the row's **stored** key, which is not always its
19836
- * published `kind`: a track's face/plate crop is stored as `crop` under
19870
+ * The URL is built from the row's own id, which since D482 says nothing about
19871
+ * the row's owner or kind — and that is the point. The published `kind` is not
19872
+ * the stored one (a track's face/plate crop is stored as `crop` under
19837
19873
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19838
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19874
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19875
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19876
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19839
19877
  *
19840
19878
  * ## `base64` is TRANSITIONAL and is going away
19841
19879
  *
@@ -19848,7 +19886,19 @@ var MediaFileKindEnum = _enum([
19848
19886
  * `analytics-query-facade.ts`; nothing else reads it.
19849
19887
  */
19850
19888
  var MediaFileSchema = object({
19851
- key: string(),
19889
+ /**
19890
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19891
+ *
19892
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19893
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19894
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19895
+ * different rows that spell the same number, and a track whose
19896
+ * `bestEventId` was an object event was served a motion event's snapshot —
19897
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19898
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19899
+ * at all.
19900
+ */
19901
+ mediaId: number().int(),
19852
19902
  kind: MediaFileKindEnum,
19853
19903
  sizeBytes: number(),
19854
19904
  timestamp: number()
@@ -19956,7 +20006,7 @@ var RetrainTrackSchema = object({
19956
20006
  });
19957
20007
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19958
20008
  var RetrainFrameCandidateSchema = object({
19959
- mediaKey: string(),
20009
+ mediaId: number().int(),
19960
20010
  kind: MediaFileKindEnum,
19961
20011
  timestamp: number(),
19962
20012
  sizeBytes: number().int(),
@@ -19970,7 +20020,7 @@ var RetrainFrameSchema = object({
19970
20020
  deviceId: number(),
19971
20021
  trackId: string(),
19972
20022
  /** Provenance only. It may already point at nothing — that is expected. */
19973
- sourceMediaKey: string(),
20023
+ sourceMediaId: number().int(),
19974
20024
  sourceKind: MediaFileKindEnum,
19975
20025
  sizeBytes: number().int(),
19976
20026
  width: number().int(),
@@ -19986,7 +20036,7 @@ var RetrainCopyRefusalSchema = _enum([
19986
20036
  var RetrainFrameSelectionSchema = object({
19987
20037
  copied: array(RetrainFrameSchema).readonly(),
19988
20038
  refused: array(object({
19989
- sourceMediaKey: string(),
20039
+ sourceMediaId: number().int(),
19990
20040
  reason: RetrainCopyRefusalSchema
19991
20041
  })).readonly()
19992
20042
  });
@@ -19994,7 +20044,7 @@ var RetrainFrameListSchema = object({
19994
20044
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19995
20045
  copies: array(RetrainFrameSchema).readonly(),
19996
20046
  /** What the page pre-selects — the native key frame when one survives. */
19997
- autoPickMediaKey: string().optional()
20047
+ autoPickMediaId: number().int().optional()
19998
20048
  });
19999
20049
  /** What the operator asked the assist to look for. */
20000
20050
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20089,9 +20139,11 @@ var RecentTracksQueryInput = object({
20089
20139
  });
20090
20140
  /**
20091
20141
  * A Summary (D359): the per-camera session envelope that references tracks.
20092
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20093
- * served by the event-media plane by key), null until the first frame with a
20094
- * member visible has been materialised.
20142
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20143
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20144
+ * first frame with a member visible has been materialised (D482 — it was the
20145
+ * row's composite key, which embedded the owner and could name another table's
20146
+ * row once event ids became per-table rowids).
20095
20147
  */
20096
20148
  var SummarySchema = object({
20097
20149
  id: string(),
@@ -20100,7 +20152,7 @@ var SummarySchema = object({
20100
20152
  lastActiveAt: number(),
20101
20153
  sealedAt: number().nullable(),
20102
20154
  memberCount: number().int().nonnegative(),
20103
- groupShotKey: string().nullable()
20155
+ groupShotMediaId: number().int().nullable()
20104
20156
  });
20105
20157
  var SummariesQueryInput = object({
20106
20158
  deviceIds: array(number()).min(1),
@@ -20654,7 +20706,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20654
20706
  }), method(object({
20655
20707
  deviceId: number(),
20656
20708
  trackId: string(),
20657
- mediaKeys: array(string()).min(1)
20709
+ mediaIds: array(number().int()).min(1)
20658
20710
  }), RetrainFrameSelectionSchema, {
20659
20711
  kind: "mutation",
20660
20712
  auth: "admin"
@@ -20722,7 +20774,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20722
20774
  kind: "query",
20723
20775
  auth: "admin"
20724
20776
  }), method(object({
20725
- eventId: string(),
20777
+ /** Which of the three event tables owns the row. */
20778
+ ownerType: EventOwnerTypeSchema,
20779
+ /** The event's rowid in that table (D474: an event id is a number). */
20780
+ eventId: number().int(),
20726
20781
  kind: MediaFileKindEnum.optional(),
20727
20782
  deviceId: number()
20728
20783
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20733,7 +20788,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20733
20788
  trackId: string(),
20734
20789
  deviceId: number()
20735
20790
  }), array(MediaFileInfoSchema).readonly()), method(object({
20736
- eventId: string(),
20791
+ ownerType: EventOwnerTypeSchema,
20792
+ eventId: number().int(),
20737
20793
  deviceId: number()
20738
20794
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20739
20795
  kind: "mutation",
@@ -26038,8 +26094,8 @@ var IdentitySchema = object({
26038
26094
  id: string(),
26039
26095
  name: string(),
26040
26096
  sampleCount: number().int().nonnegative(),
26041
- coverMediaKey: string().optional(),
26042
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26097
+ coverMediaId: number().int().optional(),
26098
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26043
26099
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26044
26100
  coverBase64: string().optional()
26045
26101
  });
@@ -26065,8 +26121,8 @@ var IdentitySampleAuditRowSchema = object({
26065
26121
  enrolledAt: number().int(),
26066
26122
  deviceId: number().int().optional(),
26067
26123
  source: _enum(["detected", "photo"]),
26068
- /** The enrolled crop's media key, so the panel can show the evidence. */
26069
- mediaKey: string().optional(),
26124
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26125
+ mediaId: number().int().optional(),
26070
26126
  /**
26071
26127
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26072
26128
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26135,15 +26191,15 @@ var FaceInfoSchema = object({
26135
26191
  */
26136
26192
  cropUrl: string().optional(),
26137
26193
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26138
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26194
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26139
26195
  * legacy rows written before design B. */
26140
26196
  faceBbox: BoundingBoxSchema.optional(),
26141
26197
  /** Design B: MediaStore key of the track's native-resolution key frame.
26142
26198
  * Fetch the native JPEG via the event-media data-plane
26143
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26199
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26144
26200
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26145
26201
  * back to the inline `base64` face crop. */
26146
- keyFrameMediaKey: string().optional(),
26202
+ keyFrameMediaId: number().int().optional(),
26147
26203
  /** Winning identity-match cosine (0..1) for this face's track, when an
26148
26204
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26149
26205
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26212,11 +26268,14 @@ var FaceClusterSchema = object({
26212
26268
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26213
26269
  * dialog already rendering its key FRAME from the `event-media` plane.
26214
26270
  *
26215
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26216
- * media key directly, so this needed no new plane and no new access decision.
26271
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26272
+ * resolves a media row by its own id, so this needed no new plane and no new
26273
+ * access decision.
26217
26274
  */
26218
26275
  var MediaFileLiteSchema$1 = object({
26219
- key: string(),
26276
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26277
+ * (D482). It was the row's composite key, which embedded the owner. */
26278
+ mediaId: number().int(),
26220
26279
  kind: string(),
26221
26280
  url: string(),
26222
26281
  sizeBytes: number(),
@@ -26233,7 +26292,7 @@ method(object({
26233
26292
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26234
26293
  * four times and the viewer holds at `staleTime: 30_000`.
26235
26294
  *
26236
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26295
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26237
26296
  * the `event-media` plane serves that key `immutable` with an ETag.
26238
26297
  *
26239
26298
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29596,8 +29655,8 @@ var VehicleSchema = object({
29596
29655
  id: string(),
29597
29656
  name: string(),
29598
29657
  sampleCount: number().int().nonnegative(),
29599
- coverMediaKey: string().optional(),
29600
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29658
+ coverMediaId: number().int().optional(),
29659
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29601
29660
  coverBase64: string().optional()
29602
29661
  });
29603
29662
  var VehicleSampleInfoSchema = object({
@@ -29630,7 +29689,7 @@ var PlateInfoSchema = object({
29630
29689
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29631
29690
  plateBbox: BoundingBoxSchema.optional(),
29632
29691
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29633
- keyFrameMediaKey: string().optional(),
29692
+ keyFrameMediaId: number().int().optional(),
29634
29693
  base64: string().optional(),
29635
29694
  /**
29636
29695
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29651,11 +29710,14 @@ var PlateInfoSchema = object({
29651
29710
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29652
29711
  * dialog already rendering its key FRAME from the `event-media` plane.
29653
29712
  *
29654
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29655
- * media key directly, so this needed no new plane and no new access decision.
29713
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29714
+ * resolves a media row by its own id, so this needed no new plane and no new
29715
+ * access decision.
29656
29716
  */
29657
29717
  var MediaFileLiteSchema = object({
29658
- key: string(),
29718
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29719
+ * (D482). It was the row's composite key, which embedded the owner. */
29720
+ mediaId: number().int(),
29659
29721
  kind: string(),
29660
29722
  url: string(),
29661
29723
  sizeBytes: number(),
@@ -29714,7 +29776,7 @@ method(object({
29714
29776
  }), method(object({
29715
29777
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29716
29778
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29717
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29779
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29718
29780
  * INPUT field: stripped by the hub router until the train ships, which
29719
29781
  * resolves to `false` and is exactly the intended default. */
29720
29782
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31283,7 +31345,14 @@ var SceneReferenceSchema = object({
31283
31345
  modelId: string(),
31284
31346
  condition: SceneConditionSchema,
31285
31347
  capturedAt: number(),
31286
- thumbnailMediaId: string().optional(),
31348
+ /**
31349
+ * The reference thumbnail's media ROW id (D482).
31350
+ *
31351
+ * The name already said `mediaId` while the value was the row's composite
31352
+ * key — a leftover that read as done and was not. It is the row's own id
31353
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31354
+ */
31355
+ thumbnailMediaId: number().int().optional(),
31287
31356
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31288
31357
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31289
31358
  * normalized rect frame a different piece of world, and the scene would
@@ -33267,7 +33336,7 @@ var StationaryObjectSchema = object({
33267
33336
  /** Enrichment label carried from the source track (identity / plate). */
33268
33337
  label: string().optional(),
33269
33338
  /** Native-resolution key-frame media key for the parked object's best image. */
33270
- keyFrameMediaKey: string().optional()
33339
+ keyFrameMediaId: number().int().optional()
33271
33340
  });
33272
33341
  var CameraOccupancySnapshotSchema = object({
33273
33342
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36005,6 +36074,12 @@ Object.freeze({
36005
36074
  addonId: null,
36006
36075
  access: "create"
36007
36076
  },
36077
+ "dataStoreProvider.upsert": {
36078
+ capName: "data-store-provider",
36079
+ capScope: "system",
36080
+ addonId: null,
36081
+ access: "create"
36082
+ },
36008
36083
  "dayNight.getOptions": {
36009
36084
  capName: "day-night",
36010
36085
  capScope: "device",
@@ -39869,6 +39944,12 @@ Object.freeze({
39869
39944
  addonId: null,
39870
39945
  access: "create"
39871
39946
  },
39947
+ "settingsStore.upsert": {
39948
+ capName: "settings-store",
39949
+ capScope: "system",
39950
+ addonId: null,
39951
+ access: "create"
39952
+ },
39872
39953
  "smtpProvider.getStatus": {
39873
39954
  capName: "smtp-provider",
39874
39955
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.103",
3
+ "version": "0.2.104",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",