@camstack/addon-provider-dreo 0.2.99 → 0.2.100

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
@@ -35,7 +35,7 @@ var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["modu
35
35
  //#endregion
36
36
  let crypto$1 = require("crypto");
37
37
  let events = require("events");
38
- //#region ../types/dist/event-category-DAXzJeTX.mjs
38
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
39
39
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
40
40
  EventCategory["SystemBoot"] = "system.boot";
41
41
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -596,7 +596,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
596
596
  * a package zone — a newly-appeared stationary object of a package class
597
597
  * that cleared the class / zone / dwell / size gates. Payload:
598
598
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
599
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
599
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
600
600
  * Telemetry (D8): the durable record is the `package-events` store row;
601
601
  * this bus topic drives notifier rules + live UI. See
602
602
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5382,7 +5382,7 @@ var ZodIssueCode = {
5382
5382
  var ZodFirstPartyTypeKind;
5383
5383
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5384
5384
  //#endregion
5385
- //#region ../types/dist/sleep-BnujYGPe.mjs
5385
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5386
5386
  /**
5387
5387
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5388
5388
  * window to float samples (D455).
@@ -7349,13 +7349,30 @@ new Set([
7349
7349
  "scene",
7350
7350
  "motion",
7351
7351
  "object",
7352
- "audio"
7352
+ "audio",
7353
+ "mosaic"
7353
7354
  ]);
7354
- new Set([
7355
+ /**
7356
+ * The owner types that are event tables, in the order the event-media resolver
7357
+ * should consider them. Exported so a consumer asking "is this key an event?"
7358
+ * does not re-spell the list and drift from it.
7359
+ */
7360
+ var EVENT_OWNER_TYPES = [
7355
7361
  "motion",
7356
7362
  "object",
7357
7363
  "audio"
7358
- ]);
7364
+ ];
7365
+ /**
7366
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7367
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7368
+ * `(table, id)`).
7369
+ *
7370
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7371
+ * table would otherwise be accepted by the codec and refused at the door, with
7372
+ * nothing failing until a caller asked.
7373
+ */
7374
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7375
+ new Set(EVENT_OWNER_TYPES);
7359
7376
  var EncodeProfileSchema = object({
7360
7377
  video: object({
7361
7378
  codec: _enum([
@@ -12554,6 +12571,16 @@ method(object({
12554
12571
  filter: QueryFilterSchema.optional(),
12555
12572
  columns: array(string()).readonly().optional()
12556
12573
  }), array(SettingsRecordSchema).readonly()), method(object({
12574
+ namespace: string().optional(),
12575
+ collection: string(),
12576
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12577
+ * index on the collection. Never empty. */
12578
+ conflict: array(string()).readonly(),
12579
+ record: BulkRecordSchema
12580
+ }), object({
12581
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12582
+ * row's own id on an update. */
12583
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12557
12584
  namespace: string().optional(),
12558
12585
  collection: string(),
12559
12586
  record: object({
@@ -12688,6 +12715,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12688
12715
  id: union([string(), number()]) }), {
12689
12716
  kind: "mutation",
12690
12717
  auth: "admin"
12718
+ }), method(object({
12719
+ namespace: string().optional(),
12720
+ collection: string(),
12721
+ conflict: array(string()).readonly(),
12722
+ record: BulkRecordSchema
12723
+ }), object({ id: union([string(), number()]) }), {
12724
+ kind: "mutation",
12725
+ auth: "admin"
12691
12726
  }), method(object({
12692
12727
  namespace: string().optional(),
12693
12728
  collection: string(),
@@ -19187,8 +19222,8 @@ var TrackPositionSchema = object({
19187
19222
  var TrackSnapshotSchema = object({
19188
19223
  timestamp: number(),
19189
19224
  position: TrackPositionSchema,
19190
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19191
- mediaKey: string()
19225
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19226
+ mediaId: number().int()
19192
19227
  });
19193
19228
  /**
19194
19229
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19792,14 +19827,14 @@ var ObjectEventSchema = object({
19792
19827
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19793
19828
  frameWidth: number().optional(),
19794
19829
  frameHeight: number().optional(),
19795
- /** MediaStore key for the crop attached to this event (if any). */
19796
- mediaKey: string().optional(),
19797
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19830
+ /** Media row id of the crop attached to this event (if any) — D482. */
19831
+ mediaId: number().int().optional(),
19832
+ /** Design B: media row id of the track's native-resolution key frame (the
19798
19833
  * best-detection full frame). Resolve via the event-media data-plane
19799
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19834
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19800
19835
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19801
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19802
- keyFrameMediaKey: string().optional(),
19836
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19837
+ keyFrameMediaId: number().int().optional(),
19803
19838
  /** Populated by B5 (recording playback URL for this event). */
19804
19839
  mediaUrl: string().optional(),
19805
19840
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19849,7 +19884,7 @@ var MediaFileKindEnum = _enum([
19849
19884
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19850
19885
  *
19851
19886
  * `url` points at the `event-media` data plane
19852
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19887
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19853
19888
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19854
19889
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19855
19890
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19857,10 +19892,13 @@ var MediaFileKindEnum = _enum([
19857
19892
  * `data-plane-access.ts` for the rule and the one gap it does not close
19858
19893
  * (per-device scoping).
19859
19894
  *
19860
- * The URL is built from the row's **stored** key, which is not always its
19861
- * published `kind`: a track's face/plate crop is stored as `crop` under
19895
+ * The URL is built from the row's own id, which since D482 says nothing about
19896
+ * the row's owner or kind — and that is the point. The published `kind` is not
19897
+ * the stored one (a track's face/plate crop is stored as `crop` under
19862
19898
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19863
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19899
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19900
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19901
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19864
19902
  *
19865
19903
  * ## `base64` is TRANSITIONAL and is going away
19866
19904
  *
@@ -19873,7 +19911,19 @@ var MediaFileKindEnum = _enum([
19873
19911
  * `analytics-query-facade.ts`; nothing else reads it.
19874
19912
  */
19875
19913
  var MediaFileSchema = object({
19876
- key: string(),
19914
+ /**
19915
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19916
+ *
19917
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19918
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19919
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19920
+ * different rows that spell the same number, and a track whose
19921
+ * `bestEventId` was an object event was served a motion event's snapshot —
19922
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19923
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19924
+ * at all.
19925
+ */
19926
+ mediaId: number().int(),
19877
19927
  kind: MediaFileKindEnum,
19878
19928
  sizeBytes: number(),
19879
19929
  timestamp: number()
@@ -19981,7 +20031,7 @@ var RetrainTrackSchema = object({
19981
20031
  });
19982
20032
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19983
20033
  var RetrainFrameCandidateSchema = object({
19984
- mediaKey: string(),
20034
+ mediaId: number().int(),
19985
20035
  kind: MediaFileKindEnum,
19986
20036
  timestamp: number(),
19987
20037
  sizeBytes: number().int(),
@@ -19995,7 +20045,7 @@ var RetrainFrameSchema = object({
19995
20045
  deviceId: number(),
19996
20046
  trackId: string(),
19997
20047
  /** Provenance only. It may already point at nothing — that is expected. */
19998
- sourceMediaKey: string(),
20048
+ sourceMediaId: number().int(),
19999
20049
  sourceKind: MediaFileKindEnum,
20000
20050
  sizeBytes: number().int(),
20001
20051
  width: number().int(),
@@ -20011,7 +20061,7 @@ var RetrainCopyRefusalSchema = _enum([
20011
20061
  var RetrainFrameSelectionSchema = object({
20012
20062
  copied: array(RetrainFrameSchema).readonly(),
20013
20063
  refused: array(object({
20014
- sourceMediaKey: string(),
20064
+ sourceMediaId: number().int(),
20015
20065
  reason: RetrainCopyRefusalSchema
20016
20066
  })).readonly()
20017
20067
  });
@@ -20019,7 +20069,7 @@ var RetrainFrameListSchema = object({
20019
20069
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20020
20070
  copies: array(RetrainFrameSchema).readonly(),
20021
20071
  /** What the page pre-selects — the native key frame when one survives. */
20022
- autoPickMediaKey: string().optional()
20072
+ autoPickMediaId: number().int().optional()
20023
20073
  });
20024
20074
  /** What the operator asked the assist to look for. */
20025
20075
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20114,9 +20164,11 @@ var RecentTracksQueryInput = object({
20114
20164
  });
20115
20165
  /**
20116
20166
  * A Summary (D359): the per-camera session envelope that references tracks.
20117
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20118
- * served by the event-media plane by key), null until the first frame with a
20119
- * member visible has been materialised.
20167
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20168
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20169
+ * first frame with a member visible has been materialised (D482 — it was the
20170
+ * row's composite key, which embedded the owner and could name another table's
20171
+ * row once event ids became per-table rowids).
20120
20172
  */
20121
20173
  var SummarySchema = object({
20122
20174
  id: string(),
@@ -20125,7 +20177,7 @@ var SummarySchema = object({
20125
20177
  lastActiveAt: number(),
20126
20178
  sealedAt: number().nullable(),
20127
20179
  memberCount: number().int().nonnegative(),
20128
- groupShotKey: string().nullable()
20180
+ groupShotMediaId: number().int().nullable()
20129
20181
  });
20130
20182
  var SummariesQueryInput = object({
20131
20183
  deviceIds: array(number()).min(1),
@@ -20679,7 +20731,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20679
20731
  }), method(object({
20680
20732
  deviceId: number(),
20681
20733
  trackId: string(),
20682
- mediaKeys: array(string()).min(1)
20734
+ mediaIds: array(number().int()).min(1)
20683
20735
  }), RetrainFrameSelectionSchema, {
20684
20736
  kind: "mutation",
20685
20737
  auth: "admin"
@@ -20747,7 +20799,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20747
20799
  kind: "query",
20748
20800
  auth: "admin"
20749
20801
  }), method(object({
20750
- eventId: string(),
20802
+ /** Which of the three event tables owns the row. */
20803
+ ownerType: EventOwnerTypeSchema,
20804
+ /** The event's rowid in that table (D474: an event id is a number). */
20805
+ eventId: number().int(),
20751
20806
  kind: MediaFileKindEnum.optional(),
20752
20807
  deviceId: number()
20753
20808
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20758,7 +20813,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20758
20813
  trackId: string(),
20759
20814
  deviceId: number()
20760
20815
  }), array(MediaFileInfoSchema).readonly()), method(object({
20761
- eventId: string(),
20816
+ ownerType: EventOwnerTypeSchema,
20817
+ eventId: number().int(),
20762
20818
  deviceId: number()
20763
20819
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20764
20820
  kind: "mutation",
@@ -25959,8 +26015,8 @@ var IdentitySchema = object({
25959
26015
  id: string(),
25960
26016
  name: string(),
25961
26017
  sampleCount: number().int().nonnegative(),
25962
- coverMediaKey: string().optional(),
25963
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26018
+ coverMediaId: number().int().optional(),
26019
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
25964
26020
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
25965
26021
  coverBase64: string().optional()
25966
26022
  });
@@ -25986,8 +26042,8 @@ var IdentitySampleAuditRowSchema = object({
25986
26042
  enrolledAt: number().int(),
25987
26043
  deviceId: number().int().optional(),
25988
26044
  source: _enum(["detected", "photo"]),
25989
- /** The enrolled crop's media key, so the panel can show the evidence. */
25990
- mediaKey: string().optional(),
26045
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26046
+ mediaId: number().int().optional(),
25991
26047
  /**
25992
26048
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
25993
26049
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26056,15 +26112,15 @@ var FaceInfoSchema = object({
26056
26112
  */
26057
26113
  cropUrl: string().optional(),
26058
26114
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26059
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26115
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26060
26116
  * legacy rows written before design B. */
26061
26117
  faceBbox: BoundingBoxSchema.optional(),
26062
26118
  /** Design B: MediaStore key of the track's native-resolution key frame.
26063
26119
  * Fetch the native JPEG via the event-media data-plane
26064
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26120
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26065
26121
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26066
26122
  * back to the inline `base64` face crop. */
26067
- keyFrameMediaKey: string().optional(),
26123
+ keyFrameMediaId: number().int().optional(),
26068
26124
  /** Winning identity-match cosine (0..1) for this face's track, when an
26069
26125
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26070
26126
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26133,11 +26189,14 @@ var FaceClusterSchema = object({
26133
26189
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26134
26190
  * dialog already rendering its key FRAME from the `event-media` plane.
26135
26191
  *
26136
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26137
- * media key directly, so this needed no new plane and no new access decision.
26192
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26193
+ * resolves a media row by its own id, so this needed no new plane and no new
26194
+ * access decision.
26138
26195
  */
26139
26196
  var MediaFileLiteSchema$1 = object({
26140
- key: string(),
26197
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26198
+ * (D482). It was the row's composite key, which embedded the owner. */
26199
+ mediaId: number().int(),
26141
26200
  kind: string(),
26142
26201
  url: string(),
26143
26202
  sizeBytes: number(),
@@ -26154,7 +26213,7 @@ method(object({
26154
26213
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26155
26214
  * four times and the viewer holds at `staleTime: 30_000`.
26156
26215
  *
26157
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26216
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26158
26217
  * the `event-media` plane serves that key `immutable` with an ETag.
26159
26218
  *
26160
26219
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29517,8 +29576,8 @@ var VehicleSchema = object({
29517
29576
  id: string(),
29518
29577
  name: string(),
29519
29578
  sampleCount: number().int().nonnegative(),
29520
- coverMediaKey: string().optional(),
29521
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29579
+ coverMediaId: number().int().optional(),
29580
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29522
29581
  coverBase64: string().optional()
29523
29582
  });
29524
29583
  var VehicleSampleInfoSchema = object({
@@ -29551,7 +29610,7 @@ var PlateInfoSchema = object({
29551
29610
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29552
29611
  plateBbox: BoundingBoxSchema.optional(),
29553
29612
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29554
- keyFrameMediaKey: string().optional(),
29613
+ keyFrameMediaId: number().int().optional(),
29555
29614
  base64: string().optional(),
29556
29615
  /**
29557
29616
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29572,11 +29631,14 @@ var PlateInfoSchema = object({
29572
29631
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29573
29632
  * dialog already rendering its key FRAME from the `event-media` plane.
29574
29633
  *
29575
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29576
- * media key directly, so this needed no new plane and no new access decision.
29634
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29635
+ * resolves a media row by its own id, so this needed no new plane and no new
29636
+ * access decision.
29577
29637
  */
29578
29638
  var MediaFileLiteSchema = object({
29579
- key: string(),
29639
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29640
+ * (D482). It was the row's composite key, which embedded the owner. */
29641
+ mediaId: number().int(),
29580
29642
  kind: string(),
29581
29643
  url: string(),
29582
29644
  sizeBytes: number(),
@@ -29635,7 +29697,7 @@ method(object({
29635
29697
  }), method(object({
29636
29698
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29637
29699
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29638
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29700
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29639
29701
  * INPUT field: stripped by the hub router until the train ships, which
29640
29702
  * resolves to `false` and is exactly the intended default. */
29641
29703
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31204,7 +31266,14 @@ var SceneReferenceSchema = object({
31204
31266
  modelId: string(),
31205
31267
  condition: SceneConditionSchema,
31206
31268
  capturedAt: number(),
31207
- thumbnailMediaId: string().optional(),
31269
+ /**
31270
+ * The reference thumbnail's media ROW id (D482).
31271
+ *
31272
+ * The name already said `mediaId` while the value was the row's composite
31273
+ * key — a leftover that read as done and was not. It is the row's own id
31274
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31275
+ */
31276
+ thumbnailMediaId: number().int().optional(),
31208
31277
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31209
31278
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31210
31279
  * normalized rect frame a different piece of world, and the scene would
@@ -33188,7 +33257,7 @@ var StationaryObjectSchema = object({
33188
33257
  /** Enrichment label carried from the source track (identity / plate). */
33189
33258
  label: string().optional(),
33190
33259
  /** Native-resolution key-frame media key for the parked object's best image. */
33191
- keyFrameMediaKey: string().optional()
33260
+ keyFrameMediaId: number().int().optional()
33192
33261
  });
33193
33262
  var CameraOccupancySnapshotSchema = object({
33194
33263
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -35926,6 +35995,12 @@ Object.freeze({
35926
35995
  addonId: null,
35927
35996
  access: "create"
35928
35997
  },
35998
+ "dataStoreProvider.upsert": {
35999
+ capName: "data-store-provider",
36000
+ capScope: "system",
36001
+ addonId: null,
36002
+ access: "create"
36003
+ },
35929
36004
  "dayNight.getOptions": {
35930
36005
  capName: "day-night",
35931
36006
  capScope: "device",
@@ -39790,6 +39865,12 @@ Object.freeze({
39790
39865
  addonId: null,
39791
39866
  access: "create"
39792
39867
  },
39868
+ "settingsStore.upsert": {
39869
+ capName: "settings-store",
39870
+ capScope: "system",
39871
+ addonId: null,
39872
+ access: "create"
39873
+ },
39793
39874
  "smtpProvider.getStatus": {
39794
39875
  capName: "smtp-provider",
39795
39876
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
37
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
38
38
  //#endregion
39
- //#region ../types/dist/event-category-DAXzJeTX.mjs
39
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
40
40
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
41
41
  EventCategory["SystemBoot"] = "system.boot";
42
42
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -597,7 +597,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
597
597
  * a package zone — a newly-appeared stationary object of a package class
598
598
  * that cleared the class / zone / dwell / size gates. Payload:
599
599
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
600
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
600
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
601
601
  * Telemetry (D8): the durable record is the `package-events` store row;
602
602
  * this bus topic drives notifier rules + live UI. See
603
603
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5383,7 +5383,7 @@ var ZodIssueCode = {
5383
5383
  var ZodFirstPartyTypeKind;
5384
5384
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5385
5385
  //#endregion
5386
- //#region ../types/dist/sleep-BnujYGPe.mjs
5386
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5387
5387
  /**
5388
5388
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5389
5389
  * window to float samples (D455).
@@ -7350,13 +7350,30 @@ new Set([
7350
7350
  "scene",
7351
7351
  "motion",
7352
7352
  "object",
7353
- "audio"
7353
+ "audio",
7354
+ "mosaic"
7354
7355
  ]);
7355
- new Set([
7356
+ /**
7357
+ * The owner types that are event tables, in the order the event-media resolver
7358
+ * should consider them. Exported so a consumer asking "is this key an event?"
7359
+ * does not re-spell the list and drift from it.
7360
+ */
7361
+ var EVENT_OWNER_TYPES = [
7356
7362
  "motion",
7357
7363
  "object",
7358
7364
  "audio"
7359
- ]);
7365
+ ];
7366
+ /**
7367
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7368
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7369
+ * `(table, id)`).
7370
+ *
7371
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7372
+ * table would otherwise be accepted by the codec and refused at the door, with
7373
+ * nothing failing until a caller asked.
7374
+ */
7375
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7376
+ new Set(EVENT_OWNER_TYPES);
7360
7377
  var EncodeProfileSchema = object({
7361
7378
  video: object({
7362
7379
  codec: _enum([
@@ -12555,6 +12572,16 @@ method(object({
12555
12572
  filter: QueryFilterSchema.optional(),
12556
12573
  columns: array(string()).readonly().optional()
12557
12574
  }), array(SettingsRecordSchema).readonly()), method(object({
12575
+ namespace: string().optional(),
12576
+ collection: string(),
12577
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12578
+ * index on the collection. Never empty. */
12579
+ conflict: array(string()).readonly(),
12580
+ record: BulkRecordSchema
12581
+ }), object({
12582
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12583
+ * row's own id on an update. */
12584
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12558
12585
  namespace: string().optional(),
12559
12586
  collection: string(),
12560
12587
  record: object({
@@ -12689,6 +12716,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12689
12716
  id: union([string(), number()]) }), {
12690
12717
  kind: "mutation",
12691
12718
  auth: "admin"
12719
+ }), method(object({
12720
+ namespace: string().optional(),
12721
+ collection: string(),
12722
+ conflict: array(string()).readonly(),
12723
+ record: BulkRecordSchema
12724
+ }), object({ id: union([string(), number()]) }), {
12725
+ kind: "mutation",
12726
+ auth: "admin"
12692
12727
  }), method(object({
12693
12728
  namespace: string().optional(),
12694
12729
  collection: string(),
@@ -19188,8 +19223,8 @@ var TrackPositionSchema = object({
19188
19223
  var TrackSnapshotSchema = object({
19189
19224
  timestamp: number(),
19190
19225
  position: TrackPositionSchema,
19191
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19192
- mediaKey: string()
19226
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19227
+ mediaId: number().int()
19193
19228
  });
19194
19229
  /**
19195
19230
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19793,14 +19828,14 @@ var ObjectEventSchema = object({
19793
19828
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19794
19829
  frameWidth: number().optional(),
19795
19830
  frameHeight: number().optional(),
19796
- /** MediaStore key for the crop attached to this event (if any). */
19797
- mediaKey: string().optional(),
19798
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19831
+ /** Media row id of the crop attached to this event (if any) — D482. */
19832
+ mediaId: number().int().optional(),
19833
+ /** Design B: media row id of the track's native-resolution key frame (the
19799
19834
  * best-detection full frame). Resolve via the event-media data-plane
19800
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19835
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19801
19836
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19802
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19803
- keyFrameMediaKey: string().optional(),
19837
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19838
+ keyFrameMediaId: number().int().optional(),
19804
19839
  /** Populated by B5 (recording playback URL for this event). */
19805
19840
  mediaUrl: string().optional(),
19806
19841
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19850,7 +19885,7 @@ var MediaFileKindEnum = _enum([
19850
19885
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19851
19886
  *
19852
19887
  * `url` points at the `event-media` data plane
19853
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19888
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19854
19889
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19855
19890
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19856
19891
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19858,10 +19893,13 @@ var MediaFileKindEnum = _enum([
19858
19893
  * `data-plane-access.ts` for the rule and the one gap it does not close
19859
19894
  * (per-device scoping).
19860
19895
  *
19861
- * The URL is built from the row's **stored** key, which is not always its
19862
- * published `kind`: a track's face/plate crop is stored as `crop` under
19896
+ * The URL is built from the row's own id, which since D482 says nothing about
19897
+ * the row's owner or kind — and that is the point. The published `kind` is not
19898
+ * the stored one (a track's face/plate crop is stored as `crop` under
19863
19899
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19864
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19900
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19901
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19902
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19865
19903
  *
19866
19904
  * ## `base64` is TRANSITIONAL and is going away
19867
19905
  *
@@ -19874,7 +19912,19 @@ var MediaFileKindEnum = _enum([
19874
19912
  * `analytics-query-facade.ts`; nothing else reads it.
19875
19913
  */
19876
19914
  var MediaFileSchema = object({
19877
- key: string(),
19915
+ /**
19916
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19917
+ *
19918
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19919
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19920
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19921
+ * different rows that spell the same number, and a track whose
19922
+ * `bestEventId` was an object event was served a motion event's snapshot —
19923
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19924
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19925
+ * at all.
19926
+ */
19927
+ mediaId: number().int(),
19878
19928
  kind: MediaFileKindEnum,
19879
19929
  sizeBytes: number(),
19880
19930
  timestamp: number()
@@ -19982,7 +20032,7 @@ var RetrainTrackSchema = object({
19982
20032
  });
19983
20033
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19984
20034
  var RetrainFrameCandidateSchema = object({
19985
- mediaKey: string(),
20035
+ mediaId: number().int(),
19986
20036
  kind: MediaFileKindEnum,
19987
20037
  timestamp: number(),
19988
20038
  sizeBytes: number().int(),
@@ -19996,7 +20046,7 @@ var RetrainFrameSchema = object({
19996
20046
  deviceId: number(),
19997
20047
  trackId: string(),
19998
20048
  /** Provenance only. It may already point at nothing — that is expected. */
19999
- sourceMediaKey: string(),
20049
+ sourceMediaId: number().int(),
20000
20050
  sourceKind: MediaFileKindEnum,
20001
20051
  sizeBytes: number().int(),
20002
20052
  width: number().int(),
@@ -20012,7 +20062,7 @@ var RetrainCopyRefusalSchema = _enum([
20012
20062
  var RetrainFrameSelectionSchema = object({
20013
20063
  copied: array(RetrainFrameSchema).readonly(),
20014
20064
  refused: array(object({
20015
- sourceMediaKey: string(),
20065
+ sourceMediaId: number().int(),
20016
20066
  reason: RetrainCopyRefusalSchema
20017
20067
  })).readonly()
20018
20068
  });
@@ -20020,7 +20070,7 @@ var RetrainFrameListSchema = object({
20020
20070
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20021
20071
  copies: array(RetrainFrameSchema).readonly(),
20022
20072
  /** What the page pre-selects — the native key frame when one survives. */
20023
- autoPickMediaKey: string().optional()
20073
+ autoPickMediaId: number().int().optional()
20024
20074
  });
20025
20075
  /** What the operator asked the assist to look for. */
20026
20076
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20115,9 +20165,11 @@ var RecentTracksQueryInput = object({
20115
20165
  });
20116
20166
  /**
20117
20167
  * A Summary (D359): the per-camera session envelope that references tracks.
20118
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20119
- * served by the event-media plane by key), null until the first frame with a
20120
- * member visible has been materialised.
20168
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20169
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20170
+ * first frame with a member visible has been materialised (D482 — it was the
20171
+ * row's composite key, which embedded the owner and could name another table's
20172
+ * row once event ids became per-table rowids).
20121
20173
  */
20122
20174
  var SummarySchema = object({
20123
20175
  id: string(),
@@ -20126,7 +20178,7 @@ var SummarySchema = object({
20126
20178
  lastActiveAt: number(),
20127
20179
  sealedAt: number().nullable(),
20128
20180
  memberCount: number().int().nonnegative(),
20129
- groupShotKey: string().nullable()
20181
+ groupShotMediaId: number().int().nullable()
20130
20182
  });
20131
20183
  var SummariesQueryInput = object({
20132
20184
  deviceIds: array(number()).min(1),
@@ -20680,7 +20732,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20680
20732
  }), method(object({
20681
20733
  deviceId: number(),
20682
20734
  trackId: string(),
20683
- mediaKeys: array(string()).min(1)
20735
+ mediaIds: array(number().int()).min(1)
20684
20736
  }), RetrainFrameSelectionSchema, {
20685
20737
  kind: "mutation",
20686
20738
  auth: "admin"
@@ -20748,7 +20800,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20748
20800
  kind: "query",
20749
20801
  auth: "admin"
20750
20802
  }), method(object({
20751
- eventId: string(),
20803
+ /** Which of the three event tables owns the row. */
20804
+ ownerType: EventOwnerTypeSchema,
20805
+ /** The event's rowid in that table (D474: an event id is a number). */
20806
+ eventId: number().int(),
20752
20807
  kind: MediaFileKindEnum.optional(),
20753
20808
  deviceId: number()
20754
20809
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20759,7 +20814,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20759
20814
  trackId: string(),
20760
20815
  deviceId: number()
20761
20816
  }), array(MediaFileInfoSchema).readonly()), method(object({
20762
- eventId: string(),
20817
+ ownerType: EventOwnerTypeSchema,
20818
+ eventId: number().int(),
20763
20819
  deviceId: number()
20764
20820
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20765
20821
  kind: "mutation",
@@ -25960,8 +26016,8 @@ var IdentitySchema = object({
25960
26016
  id: string(),
25961
26017
  name: string(),
25962
26018
  sampleCount: number().int().nonnegative(),
25963
- coverMediaKey: string().optional(),
25964
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26019
+ coverMediaId: number().int().optional(),
26020
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
25965
26021
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
25966
26022
  coverBase64: string().optional()
25967
26023
  });
@@ -25987,8 +26043,8 @@ var IdentitySampleAuditRowSchema = object({
25987
26043
  enrolledAt: number().int(),
25988
26044
  deviceId: number().int().optional(),
25989
26045
  source: _enum(["detected", "photo"]),
25990
- /** The enrolled crop's media key, so the panel can show the evidence. */
25991
- mediaKey: string().optional(),
26046
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26047
+ mediaId: number().int().optional(),
25992
26048
  /**
25993
26049
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
25994
26050
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26057,15 +26113,15 @@ var FaceInfoSchema = object({
26057
26113
  */
26058
26114
  cropUrl: string().optional(),
26059
26115
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26060
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26116
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26061
26117
  * legacy rows written before design B. */
26062
26118
  faceBbox: BoundingBoxSchema.optional(),
26063
26119
  /** Design B: MediaStore key of the track's native-resolution key frame.
26064
26120
  * Fetch the native JPEG via the event-media data-plane
26065
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26121
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26066
26122
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26067
26123
  * back to the inline `base64` face crop. */
26068
- keyFrameMediaKey: string().optional(),
26124
+ keyFrameMediaId: number().int().optional(),
26069
26125
  /** Winning identity-match cosine (0..1) for this face's track, when an
26070
26126
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26071
26127
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26134,11 +26190,14 @@ var FaceClusterSchema = object({
26134
26190
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26135
26191
  * dialog already rendering its key FRAME from the `event-media` plane.
26136
26192
  *
26137
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26138
- * media key directly, so this needed no new plane and no new access decision.
26193
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26194
+ * resolves a media row by its own id, so this needed no new plane and no new
26195
+ * access decision.
26139
26196
  */
26140
26197
  var MediaFileLiteSchema$1 = object({
26141
- key: string(),
26198
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26199
+ * (D482). It was the row's composite key, which embedded the owner. */
26200
+ mediaId: number().int(),
26142
26201
  kind: string(),
26143
26202
  url: string(),
26144
26203
  sizeBytes: number(),
@@ -26155,7 +26214,7 @@ method(object({
26155
26214
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26156
26215
  * four times and the viewer holds at `staleTime: 30_000`.
26157
26216
  *
26158
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26217
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26159
26218
  * the `event-media` plane serves that key `immutable` with an ETag.
26160
26219
  *
26161
26220
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29518,8 +29577,8 @@ var VehicleSchema = object({
29518
29577
  id: string(),
29519
29578
  name: string(),
29520
29579
  sampleCount: number().int().nonnegative(),
29521
- coverMediaKey: string().optional(),
29522
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29580
+ coverMediaId: number().int().optional(),
29581
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29523
29582
  coverBase64: string().optional()
29524
29583
  });
29525
29584
  var VehicleSampleInfoSchema = object({
@@ -29552,7 +29611,7 @@ var PlateInfoSchema = object({
29552
29611
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29553
29612
  plateBbox: BoundingBoxSchema.optional(),
29554
29613
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29555
- keyFrameMediaKey: string().optional(),
29614
+ keyFrameMediaId: number().int().optional(),
29556
29615
  base64: string().optional(),
29557
29616
  /**
29558
29617
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29573,11 +29632,14 @@ var PlateInfoSchema = object({
29573
29632
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29574
29633
  * dialog already rendering its key FRAME from the `event-media` plane.
29575
29634
  *
29576
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29577
- * media key directly, so this needed no new plane and no new access decision.
29635
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29636
+ * resolves a media row by its own id, so this needed no new plane and no new
29637
+ * access decision.
29578
29638
  */
29579
29639
  var MediaFileLiteSchema = object({
29580
- key: string(),
29640
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29641
+ * (D482). It was the row's composite key, which embedded the owner. */
29642
+ mediaId: number().int(),
29581
29643
  kind: string(),
29582
29644
  url: string(),
29583
29645
  sizeBytes: number(),
@@ -29636,7 +29698,7 @@ method(object({
29636
29698
  }), method(object({
29637
29699
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29638
29700
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29639
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29701
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29640
29702
  * INPUT field: stripped by the hub router until the train ships, which
29641
29703
  * resolves to `false` and is exactly the intended default. */
29642
29704
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31205,7 +31267,14 @@ var SceneReferenceSchema = object({
31205
31267
  modelId: string(),
31206
31268
  condition: SceneConditionSchema,
31207
31269
  capturedAt: number(),
31208
- thumbnailMediaId: string().optional(),
31270
+ /**
31271
+ * The reference thumbnail's media ROW id (D482).
31272
+ *
31273
+ * The name already said `mediaId` while the value was the row's composite
31274
+ * key — a leftover that read as done and was not. It is the row's own id
31275
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31276
+ */
31277
+ thumbnailMediaId: number().int().optional(),
31209
31278
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31210
31279
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31211
31280
  * normalized rect frame a different piece of world, and the scene would
@@ -33189,7 +33258,7 @@ var StationaryObjectSchema = object({
33189
33258
  /** Enrichment label carried from the source track (identity / plate). */
33190
33259
  label: string().optional(),
33191
33260
  /** Native-resolution key-frame media key for the parked object's best image. */
33192
- keyFrameMediaKey: string().optional()
33261
+ keyFrameMediaId: number().int().optional()
33193
33262
  });
33194
33263
  var CameraOccupancySnapshotSchema = object({
33195
33264
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -35927,6 +35996,12 @@ Object.freeze({
35927
35996
  addonId: null,
35928
35997
  access: "create"
35929
35998
  },
35999
+ "dataStoreProvider.upsert": {
36000
+ capName: "data-store-provider",
36001
+ capScope: "system",
36002
+ addonId: null,
36003
+ access: "create"
36004
+ },
35930
36005
  "dayNight.getOptions": {
35931
36006
  capName: "day-night",
35932
36007
  capScope: "device",
@@ -39791,6 +39866,12 @@ Object.freeze({
39791
39866
  addonId: null,
39792
39867
  access: "create"
39793
39868
  },
39869
+ "settingsStore.upsert": {
39870
+ capName: "settings-store",
39871
+ capScope: "system",
39872
+ addonId: null,
39873
+ access: "create"
39874
+ },
39794
39875
  "smtpProvider.getStatus": {
39795
39876
  capName: "smtp-provider",
39796
39877
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.99",
3
+ "version": "0.2.100",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",