@camstack/addon-matter-broker 0.2.97 → 0.2.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -13,7 +13,7 @@ let node_stream_promises = require("node:stream/promises");
13
13
  let node_net = require("node:net");
14
14
  let node_dgram = require("node:dgram");
15
15
  node_dgram = require_esm.__toESM(node_dgram, 1);
16
- //#region ../types/dist/event-category-DAXzJeTX.mjs
16
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
17
17
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
18
18
  EventCategory["SystemBoot"] = "system.boot";
19
19
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -574,7 +574,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
574
574
  * a package zone — a newly-appeared stationary object of a package class
575
575
  * that cleared the class / zone / dwell / size gates. Payload:
576
576
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
577
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
577
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
578
578
  * Telemetry (D8): the durable record is the `package-events` store row;
579
579
  * this bus topic drives notifier rules + live UI. See
580
580
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-BnujYGPe.mjs
5363
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -7327,13 +7327,30 @@ new Set([
7327
7327
  "scene",
7328
7328
  "motion",
7329
7329
  "object",
7330
- "audio"
7330
+ "audio",
7331
+ "mosaic"
7331
7332
  ]);
7332
- new Set([
7333
+ /**
7334
+ * The owner types that are event tables, in the order the event-media resolver
7335
+ * should consider them. Exported so a consumer asking "is this key an event?"
7336
+ * does not re-spell the list and drift from it.
7337
+ */
7338
+ var EVENT_OWNER_TYPES = [
7333
7339
  "motion",
7334
7340
  "object",
7335
7341
  "audio"
7336
- ]);
7342
+ ];
7343
+ /**
7344
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7345
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7346
+ * `(table, id)`).
7347
+ *
7348
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7349
+ * table would otherwise be accepted by the codec and refused at the door, with
7350
+ * nothing failing until a caller asked.
7351
+ */
7352
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7353
+ new Set(EVENT_OWNER_TYPES);
7337
7354
  var EncodeProfileSchema = object({
7338
7355
  video: object({
7339
7356
  codec: _enum([
@@ -12581,6 +12598,16 @@ method(object({
12581
12598
  filter: QueryFilterSchema.optional(),
12582
12599
  columns: array(string$2()).readonly().optional()
12583
12600
  }), array(SettingsRecordSchema).readonly()), method(object({
12601
+ namespace: string$2().optional(),
12602
+ collection: string$2(),
12603
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12604
+ * index on the collection. Never empty. */
12605
+ conflict: array(string$2()).readonly(),
12606
+ record: BulkRecordSchema
12607
+ }), object({
12608
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12609
+ * row's own id on an update. */
12610
+ id: union([string$2(), number()]) }), { kind: "mutation" }), method(object({
12584
12611
  namespace: string$2().optional(),
12585
12612
  collection: string$2(),
12586
12613
  record: object({
@@ -12715,6 +12742,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12715
12742
  id: union([string$2(), number()]) }), {
12716
12743
  kind: "mutation",
12717
12744
  auth: "admin"
12745
+ }), method(object({
12746
+ namespace: string$2().optional(),
12747
+ collection: string$2(),
12748
+ conflict: array(string$2()).readonly(),
12749
+ record: BulkRecordSchema
12750
+ }), object({ id: union([string$2(), number()]) }), {
12751
+ kind: "mutation",
12752
+ auth: "admin"
12718
12753
  }), method(object({
12719
12754
  namespace: string$2().optional(),
12720
12755
  collection: string$2(),
@@ -19214,8 +19249,8 @@ var TrackPositionSchema = object({
19214
19249
  var TrackSnapshotSchema = object({
19215
19250
  timestamp: number(),
19216
19251
  position: TrackPositionSchema,
19217
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19218
- mediaKey: string$2()
19252
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19253
+ mediaId: number().int()
19219
19254
  });
19220
19255
  /**
19221
19256
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19819,14 +19854,14 @@ var ObjectEventSchema = object({
19819
19854
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19820
19855
  frameWidth: number().optional(),
19821
19856
  frameHeight: number().optional(),
19822
- /** MediaStore key for the crop attached to this event (if any). */
19823
- mediaKey: string$2().optional(),
19824
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19857
+ /** Media row id of the crop attached to this event (if any) — D482. */
19858
+ mediaId: number().int().optional(),
19859
+ /** Design B: media row id of the track's native-resolution key frame (the
19825
19860
  * best-detection full frame). Resolve via the event-media data-plane
19826
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19861
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19827
19862
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19828
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19829
- keyFrameMediaKey: string$2().optional(),
19863
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19864
+ keyFrameMediaId: number().int().optional(),
19830
19865
  /** Populated by B5 (recording playback URL for this event). */
19831
19866
  mediaUrl: string$2().optional(),
19832
19867
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19876,7 +19911,7 @@ var MediaFileKindEnum = _enum([
19876
19911
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19877
19912
  *
19878
19913
  * `url` points at the `event-media` data plane
19879
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19914
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19880
19915
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19881
19916
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19882
19917
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19884,10 +19919,13 @@ var MediaFileKindEnum = _enum([
19884
19919
  * `data-plane-access.ts` for the rule and the one gap it does not close
19885
19920
  * (per-device scoping).
19886
19921
  *
19887
- * The URL is built from the row's **stored** key, which is not always its
19888
- * published `kind`: a track's face/plate crop is stored as `crop` under
19922
+ * The URL is built from the row's own id, which since D482 says nothing about
19923
+ * the row's owner or kind — and that is the point. The published `kind` is not
19924
+ * the stored one (a track's face/plate crop is stored as `crop` under
19889
19925
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19890
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19926
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19927
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19928
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19891
19929
  *
19892
19930
  * ## `base64` is TRANSITIONAL and is going away
19893
19931
  *
@@ -19900,7 +19938,19 @@ var MediaFileKindEnum = _enum([
19900
19938
  * `analytics-query-facade.ts`; nothing else reads it.
19901
19939
  */
19902
19940
  var MediaFileSchema = object({
19903
- key: string$2(),
19941
+ /**
19942
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19943
+ *
19944
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19945
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19946
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19947
+ * different rows that spell the same number, and a track whose
19948
+ * `bestEventId` was an object event was served a motion event's snapshot —
19949
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19950
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19951
+ * at all.
19952
+ */
19953
+ mediaId: number().int(),
19904
19954
  kind: MediaFileKindEnum,
19905
19955
  sizeBytes: number(),
19906
19956
  timestamp: number()
@@ -20008,7 +20058,7 @@ var RetrainTrackSchema = object({
20008
20058
  });
20009
20059
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
20010
20060
  var RetrainFrameCandidateSchema = object({
20011
- mediaKey: string$2(),
20061
+ mediaId: number().int(),
20012
20062
  kind: MediaFileKindEnum,
20013
20063
  timestamp: number(),
20014
20064
  sizeBytes: number().int(),
@@ -20022,7 +20072,7 @@ var RetrainFrameSchema = object({
20022
20072
  deviceId: number(),
20023
20073
  trackId: string$2(),
20024
20074
  /** Provenance only. It may already point at nothing — that is expected. */
20025
- sourceMediaKey: string$2(),
20075
+ sourceMediaId: number().int(),
20026
20076
  sourceKind: MediaFileKindEnum,
20027
20077
  sizeBytes: number().int(),
20028
20078
  width: number().int(),
@@ -20038,7 +20088,7 @@ var RetrainCopyRefusalSchema = _enum([
20038
20088
  var RetrainFrameSelectionSchema = object({
20039
20089
  copied: array(RetrainFrameSchema).readonly(),
20040
20090
  refused: array(object({
20041
- sourceMediaKey: string$2(),
20091
+ sourceMediaId: number().int(),
20042
20092
  reason: RetrainCopyRefusalSchema
20043
20093
  })).readonly()
20044
20094
  });
@@ -20046,7 +20096,7 @@ var RetrainFrameListSchema = object({
20046
20096
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20047
20097
  copies: array(RetrainFrameSchema).readonly(),
20048
20098
  /** What the page pre-selects — the native key frame when one survives. */
20049
- autoPickMediaKey: string$2().optional()
20099
+ autoPickMediaId: number().int().optional()
20050
20100
  });
20051
20101
  /** What the operator asked the assist to look for. */
20052
20102
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20141,9 +20191,11 @@ var RecentTracksQueryInput = object({
20141
20191
  });
20142
20192
  /**
20143
20193
  * A Summary (D359): the per-camera session envelope that references tracks.
20144
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20145
- * served by the event-media plane by key), null until the first frame with a
20146
- * member visible has been materialised.
20194
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20195
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20196
+ * first frame with a member visible has been materialised (D482 — it was the
20197
+ * row's composite key, which embedded the owner and could name another table's
20198
+ * row once event ids became per-table rowids).
20147
20199
  */
20148
20200
  var SummarySchema = object({
20149
20201
  id: string$2(),
@@ -20152,7 +20204,7 @@ var SummarySchema = object({
20152
20204
  lastActiveAt: number(),
20153
20205
  sealedAt: number().nullable(),
20154
20206
  memberCount: number().int().nonnegative(),
20155
- groupShotKey: string$2().nullable()
20207
+ groupShotMediaId: number().int().nullable()
20156
20208
  });
20157
20209
  var SummariesQueryInput = object({
20158
20210
  deviceIds: array(number()).min(1),
@@ -20706,7 +20758,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20706
20758
  }), method(object({
20707
20759
  deviceId: number(),
20708
20760
  trackId: string$2(),
20709
- mediaKeys: array(string$2()).min(1)
20761
+ mediaIds: array(number().int()).min(1)
20710
20762
  }), RetrainFrameSelectionSchema, {
20711
20763
  kind: "mutation",
20712
20764
  auth: "admin"
@@ -20774,7 +20826,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20774
20826
  kind: "query",
20775
20827
  auth: "admin"
20776
20828
  }), method(object({
20777
- eventId: string$2(),
20829
+ /** Which of the three event tables owns the row. */
20830
+ ownerType: EventOwnerTypeSchema,
20831
+ /** The event's rowid in that table (D474: an event id is a number). */
20832
+ eventId: number().int(),
20778
20833
  kind: MediaFileKindEnum.optional(),
20779
20834
  deviceId: number()
20780
20835
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20785,7 +20840,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20785
20840
  trackId: string$2(),
20786
20841
  deviceId: number()
20787
20842
  }), array(MediaFileInfoSchema).readonly()), method(object({
20788
- eventId: string$2(),
20843
+ ownerType: EventOwnerTypeSchema,
20844
+ eventId: number().int(),
20789
20845
  deviceId: number()
20790
20846
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20791
20847
  kind: "mutation",
@@ -25995,8 +26051,8 @@ var IdentitySchema = object({
25995
26051
  id: string$2(),
25996
26052
  name: string$2(),
25997
26053
  sampleCount: number().int().nonnegative(),
25998
- coverMediaKey: string$2().optional(),
25999
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26054
+ coverMediaId: number().int().optional(),
26055
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26000
26056
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26001
26057
  coverBase64: string$2().optional()
26002
26058
  });
@@ -26022,8 +26078,8 @@ var IdentitySampleAuditRowSchema = object({
26022
26078
  enrolledAt: number().int(),
26023
26079
  deviceId: number().int().optional(),
26024
26080
  source: _enum(["detected", "photo"]),
26025
- /** The enrolled crop's media key, so the panel can show the evidence. */
26026
- mediaKey: string$2().optional(),
26081
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26082
+ mediaId: number().int().optional(),
26027
26083
  /**
26028
26084
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26029
26085
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26092,15 +26148,15 @@ var FaceInfoSchema = object({
26092
26148
  */
26093
26149
  cropUrl: string$2().optional(),
26094
26150
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26095
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26151
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26096
26152
  * legacy rows written before design B. */
26097
26153
  faceBbox: BoundingBoxSchema.optional(),
26098
26154
  /** Design B: MediaStore key of the track's native-resolution key frame.
26099
26155
  * Fetch the native JPEG via the event-media data-plane
26100
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26156
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26101
26157
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26102
26158
  * back to the inline `base64` face crop. */
26103
- keyFrameMediaKey: string$2().optional(),
26159
+ keyFrameMediaId: number().int().optional(),
26104
26160
  /** Winning identity-match cosine (0..1) for this face's track, when an
26105
26161
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26106
26162
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26169,11 +26225,14 @@ var FaceClusterSchema = object({
26169
26225
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26170
26226
  * dialog already rendering its key FRAME from the `event-media` plane.
26171
26227
  *
26172
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26173
- * media key directly, so this needed no new plane and no new access decision.
26228
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26229
+ * resolves a media row by its own id, so this needed no new plane and no new
26230
+ * access decision.
26174
26231
  */
26175
26232
  var MediaFileLiteSchema$1 = object({
26176
- key: string$2(),
26233
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26234
+ * (D482). It was the row's composite key, which embedded the owner. */
26235
+ mediaId: number().int(),
26177
26236
  kind: string$2(),
26178
26237
  url: string$2(),
26179
26238
  sizeBytes: number(),
@@ -26190,7 +26249,7 @@ method(object({
26190
26249
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26191
26250
  * four times and the viewer holds at `staleTime: 30_000`.
26192
26251
  *
26193
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26252
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26194
26253
  * the `event-media` plane serves that key `immutable` with an ETag.
26195
26254
  *
26196
26255
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29553,8 +29612,8 @@ var VehicleSchema = object({
29553
29612
  id: string$2(),
29554
29613
  name: string$2(),
29555
29614
  sampleCount: number().int().nonnegative(),
29556
- coverMediaKey: string$2().optional(),
29557
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29615
+ coverMediaId: number().int().optional(),
29616
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29558
29617
  coverBase64: string$2().optional()
29559
29618
  });
29560
29619
  var VehicleSampleInfoSchema = object({
@@ -29587,7 +29646,7 @@ var PlateInfoSchema = object({
29587
29646
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29588
29647
  plateBbox: BoundingBoxSchema.optional(),
29589
29648
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29590
- keyFrameMediaKey: string$2().optional(),
29649
+ keyFrameMediaId: number().int().optional(),
29591
29650
  base64: string$2().optional(),
29592
29651
  /**
29593
29652
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29608,11 +29667,14 @@ var PlateInfoSchema = object({
29608
29667
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29609
29668
  * dialog already rendering its key FRAME from the `event-media` plane.
29610
29669
  *
29611
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29612
- * media key directly, so this needed no new plane and no new access decision.
29670
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29671
+ * resolves a media row by its own id, so this needed no new plane and no new
29672
+ * access decision.
29613
29673
  */
29614
29674
  var MediaFileLiteSchema = object({
29615
- key: string$2(),
29675
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29676
+ * (D482). It was the row's composite key, which embedded the owner. */
29677
+ mediaId: number().int(),
29616
29678
  kind: string$2(),
29617
29679
  url: string$2(),
29618
29680
  sizeBytes: number(),
@@ -29671,7 +29733,7 @@ method(object({
29671
29733
  }), method(object({
29672
29734
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29673
29735
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29674
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29736
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29675
29737
  * INPUT field: stripped by the hub router until the train ships, which
29676
29738
  * resolves to `false` and is exactly the intended default. */
29677
29739
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string$2().min(1) }), VehicleSchema, {
@@ -31240,7 +31302,14 @@ var SceneReferenceSchema = object({
31240
31302
  modelId: string$2(),
31241
31303
  condition: SceneConditionSchema,
31242
31304
  capturedAt: number(),
31243
- thumbnailMediaId: string$2().optional(),
31305
+ /**
31306
+ * The reference thumbnail's media ROW id (D482).
31307
+ *
31308
+ * The name already said `mediaId` while the value was the row's composite
31309
+ * key — a leftover that read as done and was not. It is the row's own id
31310
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31311
+ */
31312
+ thumbnailMediaId: number().int().optional(),
31244
31313
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31245
31314
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31246
31315
  * normalized rect frame a different piece of world, and the scene would
@@ -33224,7 +33293,7 @@ var StationaryObjectSchema = object({
33224
33293
  /** Enrichment label carried from the source track (identity / plate). */
33225
33294
  label: string$2().optional(),
33226
33295
  /** Native-resolution key-frame media key for the parked object's best image. */
33227
- keyFrameMediaKey: string$2().optional()
33296
+ keyFrameMediaId: number().int().optional()
33228
33297
  });
33229
33298
  var CameraOccupancySnapshotSchema = object({
33230
33299
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -35962,6 +36031,12 @@ Object.freeze({
35962
36031
  addonId: null,
35963
36032
  access: "create"
35964
36033
  },
36034
+ "dataStoreProvider.upsert": {
36035
+ capName: "data-store-provider",
36036
+ capScope: "system",
36037
+ addonId: null,
36038
+ access: "create"
36039
+ },
35965
36040
  "dayNight.getOptions": {
35966
36041
  capName: "day-night",
35967
36042
  capScope: "device",
@@ -39826,6 +39901,12 @@ Object.freeze({
39826
39901
  addonId: null,
39827
39902
  access: "create"
39828
39903
  },
39904
+ "settingsStore.upsert": {
39905
+ capName: "settings-store",
39906
+ capScope: "system",
39907
+ addonId: null,
39908
+ access: "create"
39909
+ },
39829
39910
  "smtpProvider.getStatus": {
39830
39911
  capName: "smtp-provider",
39831
39912
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -11,7 +11,7 @@ import { networkInterfaces, tmpdir, uptime } from "node:os";
11
11
  import { finished } from "node:stream/promises";
12
12
  import { createConnection, createServer as createServer$2 } from "node:net";
13
13
  import * as dgram from "node:dgram";
14
- //#region ../types/dist/event-category-DAXzJeTX.mjs
14
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
15
15
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
16
16
  EventCategory["SystemBoot"] = "system.boot";
17
17
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -572,7 +572,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
572
572
  * a package zone — a newly-appeared stationary object of a package class
573
573
  * that cleared the class / zone / dwell / size gates. Payload:
574
574
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
575
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
575
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
576
576
  * Telemetry (D8): the durable record is the `package-events` store row;
577
577
  * this bus topic drives notifier rules + live UI. See
578
578
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5358,7 +5358,7 @@ var ZodIssueCode = {
5358
5358
  var ZodFirstPartyTypeKind;
5359
5359
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5360
5360
  //#endregion
5361
- //#region ../types/dist/sleep-BnujYGPe.mjs
5361
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5362
5362
  /**
5363
5363
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5364
5364
  * window to float samples (D455).
@@ -7325,13 +7325,30 @@ new Set([
7325
7325
  "scene",
7326
7326
  "motion",
7327
7327
  "object",
7328
- "audio"
7328
+ "audio",
7329
+ "mosaic"
7329
7330
  ]);
7330
- new Set([
7331
+ /**
7332
+ * The owner types that are event tables, in the order the event-media resolver
7333
+ * should consider them. Exported so a consumer asking "is this key an event?"
7334
+ * does not re-spell the list and drift from it.
7335
+ */
7336
+ var EVENT_OWNER_TYPES = [
7331
7337
  "motion",
7332
7338
  "object",
7333
7339
  "audio"
7334
- ]);
7340
+ ];
7341
+ /**
7342
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7343
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7344
+ * `(table, id)`).
7345
+ *
7346
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7347
+ * table would otherwise be accepted by the codec and refused at the door, with
7348
+ * nothing failing until a caller asked.
7349
+ */
7350
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7351
+ new Set(EVENT_OWNER_TYPES);
7335
7352
  var EncodeProfileSchema = object({
7336
7353
  video: object({
7337
7354
  codec: _enum([
@@ -12579,6 +12596,16 @@ method(object({
12579
12596
  filter: QueryFilterSchema.optional(),
12580
12597
  columns: array(string$2()).readonly().optional()
12581
12598
  }), array(SettingsRecordSchema).readonly()), method(object({
12599
+ namespace: string$2().optional(),
12600
+ collection: string$2(),
12601
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12602
+ * index on the collection. Never empty. */
12603
+ conflict: array(string$2()).readonly(),
12604
+ record: BulkRecordSchema
12605
+ }), object({
12606
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12607
+ * row's own id on an update. */
12608
+ id: union([string$2(), number()]) }), { kind: "mutation" }), method(object({
12582
12609
  namespace: string$2().optional(),
12583
12610
  collection: string$2(),
12584
12611
  record: object({
@@ -12713,6 +12740,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12713
12740
  id: union([string$2(), number()]) }), {
12714
12741
  kind: "mutation",
12715
12742
  auth: "admin"
12743
+ }), method(object({
12744
+ namespace: string$2().optional(),
12745
+ collection: string$2(),
12746
+ conflict: array(string$2()).readonly(),
12747
+ record: BulkRecordSchema
12748
+ }), object({ id: union([string$2(), number()]) }), {
12749
+ kind: "mutation",
12750
+ auth: "admin"
12716
12751
  }), method(object({
12717
12752
  namespace: string$2().optional(),
12718
12753
  collection: string$2(),
@@ -19212,8 +19247,8 @@ var TrackPositionSchema = object({
19212
19247
  var TrackSnapshotSchema = object({
19213
19248
  timestamp: number(),
19214
19249
  position: TrackPositionSchema,
19215
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19216
- mediaKey: string$2()
19250
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19251
+ mediaId: number().int()
19217
19252
  });
19218
19253
  /**
19219
19254
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19817,14 +19852,14 @@ var ObjectEventSchema = object({
19817
19852
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19818
19853
  frameWidth: number().optional(),
19819
19854
  frameHeight: number().optional(),
19820
- /** MediaStore key for the crop attached to this event (if any). */
19821
- mediaKey: string$2().optional(),
19822
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19855
+ /** Media row id of the crop attached to this event (if any) — D482. */
19856
+ mediaId: number().int().optional(),
19857
+ /** Design B: media row id of the track's native-resolution key frame (the
19823
19858
  * best-detection full frame). Resolve via the event-media data-plane
19824
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19859
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19825
19860
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19826
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19827
- keyFrameMediaKey: string$2().optional(),
19861
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19862
+ keyFrameMediaId: number().int().optional(),
19828
19863
  /** Populated by B5 (recording playback URL for this event). */
19829
19864
  mediaUrl: string$2().optional(),
19830
19865
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19874,7 +19909,7 @@ var MediaFileKindEnum = _enum([
19874
19909
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19875
19910
  *
19876
19911
  * `url` points at the `event-media` data plane
19877
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19912
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19878
19913
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19879
19914
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19880
19915
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19882,10 +19917,13 @@ var MediaFileKindEnum = _enum([
19882
19917
  * `data-plane-access.ts` for the rule and the one gap it does not close
19883
19918
  * (per-device scoping).
19884
19919
  *
19885
- * The URL is built from the row's **stored** key, which is not always its
19886
- * published `kind`: a track's face/plate crop is stored as `crop` under
19920
+ * The URL is built from the row's own id, which since D482 says nothing about
19921
+ * the row's owner or kind — and that is the point. The published `kind` is not
19922
+ * the stored one (a track's face/plate crop is stored as `crop` under
19887
19923
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19888
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19924
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19925
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19926
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19889
19927
  *
19890
19928
  * ## `base64` is TRANSITIONAL and is going away
19891
19929
  *
@@ -19898,7 +19936,19 @@ var MediaFileKindEnum = _enum([
19898
19936
  * `analytics-query-facade.ts`; nothing else reads it.
19899
19937
  */
19900
19938
  var MediaFileSchema = object({
19901
- key: string$2(),
19939
+ /**
19940
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19941
+ *
19942
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19943
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19944
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19945
+ * different rows that spell the same number, and a track whose
19946
+ * `bestEventId` was an object event was served a motion event's snapshot —
19947
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19948
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19949
+ * at all.
19950
+ */
19951
+ mediaId: number().int(),
19902
19952
  kind: MediaFileKindEnum,
19903
19953
  sizeBytes: number(),
19904
19954
  timestamp: number()
@@ -20006,7 +20056,7 @@ var RetrainTrackSchema = object({
20006
20056
  });
20007
20057
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
20008
20058
  var RetrainFrameCandidateSchema = object({
20009
- mediaKey: string$2(),
20059
+ mediaId: number().int(),
20010
20060
  kind: MediaFileKindEnum,
20011
20061
  timestamp: number(),
20012
20062
  sizeBytes: number().int(),
@@ -20020,7 +20070,7 @@ var RetrainFrameSchema = object({
20020
20070
  deviceId: number(),
20021
20071
  trackId: string$2(),
20022
20072
  /** Provenance only. It may already point at nothing — that is expected. */
20023
- sourceMediaKey: string$2(),
20073
+ sourceMediaId: number().int(),
20024
20074
  sourceKind: MediaFileKindEnum,
20025
20075
  sizeBytes: number().int(),
20026
20076
  width: number().int(),
@@ -20036,7 +20086,7 @@ var RetrainCopyRefusalSchema = _enum([
20036
20086
  var RetrainFrameSelectionSchema = object({
20037
20087
  copied: array(RetrainFrameSchema).readonly(),
20038
20088
  refused: array(object({
20039
- sourceMediaKey: string$2(),
20089
+ sourceMediaId: number().int(),
20040
20090
  reason: RetrainCopyRefusalSchema
20041
20091
  })).readonly()
20042
20092
  });
@@ -20044,7 +20094,7 @@ var RetrainFrameListSchema = object({
20044
20094
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20045
20095
  copies: array(RetrainFrameSchema).readonly(),
20046
20096
  /** What the page pre-selects — the native key frame when one survives. */
20047
- autoPickMediaKey: string$2().optional()
20097
+ autoPickMediaId: number().int().optional()
20048
20098
  });
20049
20099
  /** What the operator asked the assist to look for. */
20050
20100
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20139,9 +20189,11 @@ var RecentTracksQueryInput = object({
20139
20189
  });
20140
20190
  /**
20141
20191
  * A Summary (D359): the per-camera session envelope that references tracks.
20142
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20143
- * served by the event-media plane by key), null until the first frame with a
20144
- * member visible has been materialised.
20192
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20193
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20194
+ * first frame with a member visible has been materialised (D482 — it was the
20195
+ * row's composite key, which embedded the owner and could name another table's
20196
+ * row once event ids became per-table rowids).
20145
20197
  */
20146
20198
  var SummarySchema = object({
20147
20199
  id: string$2(),
@@ -20150,7 +20202,7 @@ var SummarySchema = object({
20150
20202
  lastActiveAt: number(),
20151
20203
  sealedAt: number().nullable(),
20152
20204
  memberCount: number().int().nonnegative(),
20153
- groupShotKey: string$2().nullable()
20205
+ groupShotMediaId: number().int().nullable()
20154
20206
  });
20155
20207
  var SummariesQueryInput = object({
20156
20208
  deviceIds: array(number()).min(1),
@@ -20704,7 +20756,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20704
20756
  }), method(object({
20705
20757
  deviceId: number(),
20706
20758
  trackId: string$2(),
20707
- mediaKeys: array(string$2()).min(1)
20759
+ mediaIds: array(number().int()).min(1)
20708
20760
  }), RetrainFrameSelectionSchema, {
20709
20761
  kind: "mutation",
20710
20762
  auth: "admin"
@@ -20772,7 +20824,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20772
20824
  kind: "query",
20773
20825
  auth: "admin"
20774
20826
  }), method(object({
20775
- eventId: string$2(),
20827
+ /** Which of the three event tables owns the row. */
20828
+ ownerType: EventOwnerTypeSchema,
20829
+ /** The event's rowid in that table (D474: an event id is a number). */
20830
+ eventId: number().int(),
20776
20831
  kind: MediaFileKindEnum.optional(),
20777
20832
  deviceId: number()
20778
20833
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20783,7 +20838,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20783
20838
  trackId: string$2(),
20784
20839
  deviceId: number()
20785
20840
  }), array(MediaFileInfoSchema).readonly()), method(object({
20786
- eventId: string$2(),
20841
+ ownerType: EventOwnerTypeSchema,
20842
+ eventId: number().int(),
20787
20843
  deviceId: number()
20788
20844
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20789
20845
  kind: "mutation",
@@ -25993,8 +26049,8 @@ var IdentitySchema = object({
25993
26049
  id: string$2(),
25994
26050
  name: string$2(),
25995
26051
  sampleCount: number().int().nonnegative(),
25996
- coverMediaKey: string$2().optional(),
25997
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26052
+ coverMediaId: number().int().optional(),
26053
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
25998
26054
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
25999
26055
  coverBase64: string$2().optional()
26000
26056
  });
@@ -26020,8 +26076,8 @@ var IdentitySampleAuditRowSchema = object({
26020
26076
  enrolledAt: number().int(),
26021
26077
  deviceId: number().int().optional(),
26022
26078
  source: _enum(["detected", "photo"]),
26023
- /** The enrolled crop's media key, so the panel can show the evidence. */
26024
- mediaKey: string$2().optional(),
26079
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26080
+ mediaId: number().int().optional(),
26025
26081
  /**
26026
26082
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26027
26083
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26090,15 +26146,15 @@ var FaceInfoSchema = object({
26090
26146
  */
26091
26147
  cropUrl: string$2().optional(),
26092
26148
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26093
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26149
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26094
26150
  * legacy rows written before design B. */
26095
26151
  faceBbox: BoundingBoxSchema.optional(),
26096
26152
  /** Design B: MediaStore key of the track's native-resolution key frame.
26097
26153
  * Fetch the native JPEG via the event-media data-plane
26098
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26154
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26099
26155
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26100
26156
  * back to the inline `base64` face crop. */
26101
- keyFrameMediaKey: string$2().optional(),
26157
+ keyFrameMediaId: number().int().optional(),
26102
26158
  /** Winning identity-match cosine (0..1) for this face's track, when an
26103
26159
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26104
26160
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26167,11 +26223,14 @@ var FaceClusterSchema = object({
26167
26223
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26168
26224
  * dialog already rendering its key FRAME from the `event-media` plane.
26169
26225
  *
26170
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26171
- * media key directly, so this needed no new plane and no new access decision.
26226
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26227
+ * resolves a media row by its own id, so this needed no new plane and no new
26228
+ * access decision.
26172
26229
  */
26173
26230
  var MediaFileLiteSchema$1 = object({
26174
- key: string$2(),
26231
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26232
+ * (D482). It was the row's composite key, which embedded the owner. */
26233
+ mediaId: number().int(),
26175
26234
  kind: string$2(),
26176
26235
  url: string$2(),
26177
26236
  sizeBytes: number(),
@@ -26188,7 +26247,7 @@ method(object({
26188
26247
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26189
26248
  * four times and the viewer holds at `staleTime: 30_000`.
26190
26249
  *
26191
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26250
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26192
26251
  * the `event-media` plane serves that key `immutable` with an ETag.
26193
26252
  *
26194
26253
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29551,8 +29610,8 @@ var VehicleSchema = object({
29551
29610
  id: string$2(),
29552
29611
  name: string$2(),
29553
29612
  sampleCount: number().int().nonnegative(),
29554
- coverMediaKey: string$2().optional(),
29555
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29613
+ coverMediaId: number().int().optional(),
29614
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29556
29615
  coverBase64: string$2().optional()
29557
29616
  });
29558
29617
  var VehicleSampleInfoSchema = object({
@@ -29585,7 +29644,7 @@ var PlateInfoSchema = object({
29585
29644
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29586
29645
  plateBbox: BoundingBoxSchema.optional(),
29587
29646
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29588
- keyFrameMediaKey: string$2().optional(),
29647
+ keyFrameMediaId: number().int().optional(),
29589
29648
  base64: string$2().optional(),
29590
29649
  /**
29591
29650
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29606,11 +29665,14 @@ var PlateInfoSchema = object({
29606
29665
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29607
29666
  * dialog already rendering its key FRAME from the `event-media` plane.
29608
29667
  *
29609
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29610
- * media key directly, so this needed no new plane and no new access decision.
29668
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29669
+ * resolves a media row by its own id, so this needed no new plane and no new
29670
+ * access decision.
29611
29671
  */
29612
29672
  var MediaFileLiteSchema = object({
29613
- key: string$2(),
29673
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29674
+ * (D482). It was the row's composite key, which embedded the owner. */
29675
+ mediaId: number().int(),
29614
29676
  kind: string$2(),
29615
29677
  url: string$2(),
29616
29678
  sizeBytes: number(),
@@ -29669,7 +29731,7 @@ method(object({
29669
29731
  }), method(object({
29670
29732
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29671
29733
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29672
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29734
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29673
29735
  * INPUT field: stripped by the hub router until the train ships, which
29674
29736
  * resolves to `false` and is exactly the intended default. */
29675
29737
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string$2().min(1) }), VehicleSchema, {
@@ -31238,7 +31300,14 @@ var SceneReferenceSchema = object({
31238
31300
  modelId: string$2(),
31239
31301
  condition: SceneConditionSchema,
31240
31302
  capturedAt: number(),
31241
- thumbnailMediaId: string$2().optional(),
31303
+ /**
31304
+ * The reference thumbnail's media ROW id (D482).
31305
+ *
31306
+ * The name already said `mediaId` while the value was the row's composite
31307
+ * key — a leftover that read as done and was not. It is the row's own id
31308
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31309
+ */
31310
+ thumbnailMediaId: number().int().optional(),
31242
31311
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31243
31312
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31244
31313
  * normalized rect frame a different piece of world, and the scene would
@@ -33222,7 +33291,7 @@ var StationaryObjectSchema = object({
33222
33291
  /** Enrichment label carried from the source track (identity / plate). */
33223
33292
  label: string$2().optional(),
33224
33293
  /** Native-resolution key-frame media key for the parked object's best image. */
33225
- keyFrameMediaKey: string$2().optional()
33294
+ keyFrameMediaId: number().int().optional()
33226
33295
  });
33227
33296
  var CameraOccupancySnapshotSchema = object({
33228
33297
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -35960,6 +36029,12 @@ Object.freeze({
35960
36029
  addonId: null,
35961
36030
  access: "create"
35962
36031
  },
36032
+ "dataStoreProvider.upsert": {
36033
+ capName: "data-store-provider",
36034
+ capScope: "system",
36035
+ addonId: null,
36036
+ access: "create"
36037
+ },
35963
36038
  "dayNight.getOptions": {
35964
36039
  capName: "day-night",
35965
36040
  capScope: "device",
@@ -39824,6 +39899,12 @@ Object.freeze({
39824
39899
  addonId: null,
39825
39900
  access: "create"
39826
39901
  },
39902
+ "settingsStore.upsert": {
39903
+ capName: "settings-store",
39904
+ capScope: "system",
39905
+ addonId: null,
39906
+ access: "create"
39907
+ },
39827
39908
  "smtpProvider.getStatus": {
39828
39909
  capName: "smtp-provider",
39829
39910
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.97",
3
+ "version": "0.2.99",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",