@camstack/addon-import-alexa 0.2.98 → 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
@@ -38,7 +38,7 @@ let node_os = require("node:os");
38
38
  let node_fs = require("node:fs");
39
39
  let node_path = require("node:path");
40
40
  node_path = __toESM(node_path);
41
- //#region ../types/dist/event-category-DAXzJeTX.mjs
41
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
42
42
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
43
43
  EventCategory["SystemBoot"] = "system.boot";
44
44
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -599,7 +599,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
599
599
  * a package zone — a newly-appeared stationary object of a package class
600
600
  * that cleared the class / zone / dwell / size gates. Payload:
601
601
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
602
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
602
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
603
603
  * Telemetry (D8): the durable record is the `package-events` store row;
604
604
  * this bus topic drives notifier rules + live UI. See
605
605
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5385,7 +5385,7 @@ var ZodIssueCode = {
5385
5385
  var ZodFirstPartyTypeKind;
5386
5386
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5387
5387
  //#endregion
5388
- //#region ../types/dist/sleep-BnujYGPe.mjs
5388
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5389
5389
  /**
5390
5390
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5391
5391
  * window to float samples (D455).
@@ -7352,13 +7352,30 @@ new Set([
7352
7352
  "scene",
7353
7353
  "motion",
7354
7354
  "object",
7355
- "audio"
7355
+ "audio",
7356
+ "mosaic"
7356
7357
  ]);
7357
- new Set([
7358
+ /**
7359
+ * The owner types that are event tables, in the order the event-media resolver
7360
+ * should consider them. Exported so a consumer asking "is this key an event?"
7361
+ * does not re-spell the list and drift from it.
7362
+ */
7363
+ var EVENT_OWNER_TYPES = [
7358
7364
  "motion",
7359
7365
  "object",
7360
7366
  "audio"
7361
- ]);
7367
+ ];
7368
+ /**
7369
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7370
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7371
+ * `(table, id)`).
7372
+ *
7373
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7374
+ * table would otherwise be accepted by the codec and refused at the door, with
7375
+ * nothing failing until a caller asked.
7376
+ */
7377
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7378
+ new Set(EVENT_OWNER_TYPES);
7362
7379
  /**
7363
7380
  * Build an `IAddonRouteProvider` from a list of routes. Implements
7364
7381
  * both the operator-facing `getRoutes` (returning route descriptors
@@ -12742,6 +12759,16 @@ method(object({
12742
12759
  filter: QueryFilterSchema.optional(),
12743
12760
  columns: array(string()).readonly().optional()
12744
12761
  }), array(SettingsRecordSchema).readonly()), method(object({
12762
+ namespace: string().optional(),
12763
+ collection: string(),
12764
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12765
+ * index on the collection. Never empty. */
12766
+ conflict: array(string()).readonly(),
12767
+ record: BulkRecordSchema
12768
+ }), object({
12769
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12770
+ * row's own id on an update. */
12771
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12745
12772
  namespace: string().optional(),
12746
12773
  collection: string(),
12747
12774
  record: object({
@@ -12876,6 +12903,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12876
12903
  id: union([string(), number()]) }), {
12877
12904
  kind: "mutation",
12878
12905
  auth: "admin"
12906
+ }), method(object({
12907
+ namespace: string().optional(),
12908
+ collection: string(),
12909
+ conflict: array(string()).readonly(),
12910
+ record: BulkRecordSchema
12911
+ }), object({ id: union([string(), number()]) }), {
12912
+ kind: "mutation",
12913
+ auth: "admin"
12879
12914
  }), method(object({
12880
12915
  namespace: string().optional(),
12881
12916
  collection: string(),
@@ -19375,8 +19410,8 @@ var TrackPositionSchema = object({
19375
19410
  var TrackSnapshotSchema = object({
19376
19411
  timestamp: number(),
19377
19412
  position: TrackPositionSchema,
19378
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19379
- mediaKey: string()
19413
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19414
+ mediaId: number().int()
19380
19415
  });
19381
19416
  /**
19382
19417
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19980,14 +20015,14 @@ var ObjectEventSchema = object({
19980
20015
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19981
20016
  frameWidth: number().optional(),
19982
20017
  frameHeight: number().optional(),
19983
- /** MediaStore key for the crop attached to this event (if any). */
19984
- mediaKey: string().optional(),
19985
- /** Design B: MediaStore key of the track's native-resolution key frame (the
20018
+ /** Media row id of the crop attached to this event (if any) — D482. */
20019
+ mediaId: number().int().optional(),
20020
+ /** Design B: media row id of the track's native-resolution key frame (the
19986
20021
  * best-detection full frame). Resolve via the event-media data-plane
19987
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
20022
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19988
20023
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19989
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19990
- keyFrameMediaKey: string().optional(),
20024
+ * sources — consumers fall back to `mediaId` (the tight crop). */
20025
+ keyFrameMediaId: number().int().optional(),
19991
20026
  /** Populated by B5 (recording playback URL for this event). */
19992
20027
  mediaUrl: string().optional(),
19993
20028
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -20037,7 +20072,7 @@ var MediaFileKindEnum = _enum([
20037
20072
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
20038
20073
  *
20039
20074
  * `url` points at the `event-media` data plane
20040
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
20075
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
20041
20076
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
20042
20077
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
20043
20078
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -20045,10 +20080,13 @@ var MediaFileKindEnum = _enum([
20045
20080
  * `data-plane-access.ts` for the rule and the one gap it does not close
20046
20081
  * (per-device scoping).
20047
20082
  *
20048
- * The URL is built from the row's **stored** key, which is not always its
20049
- * published `kind`: a track's face/plate crop is stored as `crop` under
20083
+ * The URL is built from the row's own id, which since D482 says nothing about
20084
+ * the row's owner or kind — and that is the point. The published `kind` is not
20085
+ * the stored one (a track's face/plate crop is stored as `crop` under
20050
20086
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
20051
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
20087
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
20088
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
20089
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
20052
20090
  *
20053
20091
  * ## `base64` is TRANSITIONAL and is going away
20054
20092
  *
@@ -20061,7 +20099,19 @@ var MediaFileKindEnum = _enum([
20061
20099
  * `analytics-query-facade.ts`; nothing else reads it.
20062
20100
  */
20063
20101
  var MediaFileSchema = object({
20064
- key: string(),
20102
+ /**
20103
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
20104
+ *
20105
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
20106
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
20107
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
20108
+ * different rows that spell the same number, and a track whose
20109
+ * `bestEventId` was an object event was served a motion event's snapshot —
20110
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
20111
+ * surrogate id cannot name the wrong row's owner, because it names no owner
20112
+ * at all.
20113
+ */
20114
+ mediaId: number().int(),
20065
20115
  kind: MediaFileKindEnum,
20066
20116
  sizeBytes: number(),
20067
20117
  timestamp: number()
@@ -20169,7 +20219,7 @@ var RetrainTrackSchema = object({
20169
20219
  });
20170
20220
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
20171
20221
  var RetrainFrameCandidateSchema = object({
20172
- mediaKey: string(),
20222
+ mediaId: number().int(),
20173
20223
  kind: MediaFileKindEnum,
20174
20224
  timestamp: number(),
20175
20225
  sizeBytes: number().int(),
@@ -20183,7 +20233,7 @@ var RetrainFrameSchema = object({
20183
20233
  deviceId: number(),
20184
20234
  trackId: string(),
20185
20235
  /** Provenance only. It may already point at nothing — that is expected. */
20186
- sourceMediaKey: string(),
20236
+ sourceMediaId: number().int(),
20187
20237
  sourceKind: MediaFileKindEnum,
20188
20238
  sizeBytes: number().int(),
20189
20239
  width: number().int(),
@@ -20199,7 +20249,7 @@ var RetrainCopyRefusalSchema = _enum([
20199
20249
  var RetrainFrameSelectionSchema = object({
20200
20250
  copied: array(RetrainFrameSchema).readonly(),
20201
20251
  refused: array(object({
20202
- sourceMediaKey: string(),
20252
+ sourceMediaId: number().int(),
20203
20253
  reason: RetrainCopyRefusalSchema
20204
20254
  })).readonly()
20205
20255
  });
@@ -20207,7 +20257,7 @@ var RetrainFrameListSchema = object({
20207
20257
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20208
20258
  copies: array(RetrainFrameSchema).readonly(),
20209
20259
  /** What the page pre-selects — the native key frame when one survives. */
20210
- autoPickMediaKey: string().optional()
20260
+ autoPickMediaId: number().int().optional()
20211
20261
  });
20212
20262
  /** What the operator asked the assist to look for. */
20213
20263
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20302,9 +20352,11 @@ var RecentTracksQueryInput = object({
20302
20352
  });
20303
20353
  /**
20304
20354
  * A Summary (D359): the per-camera session envelope that references tracks.
20305
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20306
- * served by the event-media plane by key), null until the first frame with a
20307
- * member visible has been materialised.
20355
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20356
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20357
+ * first frame with a member visible has been materialised (D482 — it was the
20358
+ * row's composite key, which embedded the owner and could name another table's
20359
+ * row once event ids became per-table rowids).
20308
20360
  */
20309
20361
  var SummarySchema = object({
20310
20362
  id: string(),
@@ -20313,7 +20365,7 @@ var SummarySchema = object({
20313
20365
  lastActiveAt: number(),
20314
20366
  sealedAt: number().nullable(),
20315
20367
  memberCount: number().int().nonnegative(),
20316
- groupShotKey: string().nullable()
20368
+ groupShotMediaId: number().int().nullable()
20317
20369
  });
20318
20370
  var SummariesQueryInput = object({
20319
20371
  deviceIds: array(number()).min(1),
@@ -20867,7 +20919,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20867
20919
  }), method(object({
20868
20920
  deviceId: number(),
20869
20921
  trackId: string(),
20870
- mediaKeys: array(string()).min(1)
20922
+ mediaIds: array(number().int()).min(1)
20871
20923
  }), RetrainFrameSelectionSchema, {
20872
20924
  kind: "mutation",
20873
20925
  auth: "admin"
@@ -20935,7 +20987,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20935
20987
  kind: "query",
20936
20988
  auth: "admin"
20937
20989
  }), method(object({
20938
- eventId: string(),
20990
+ /** Which of the three event tables owns the row. */
20991
+ ownerType: EventOwnerTypeSchema,
20992
+ /** The event's rowid in that table (D474: an event id is a number). */
20993
+ eventId: number().int(),
20939
20994
  kind: MediaFileKindEnum.optional(),
20940
20995
  deviceId: number()
20941
20996
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20946,7 +21001,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20946
21001
  trackId: string(),
20947
21002
  deviceId: number()
20948
21003
  }), array(MediaFileInfoSchema).readonly()), method(object({
20949
- eventId: string(),
21004
+ ownerType: EventOwnerTypeSchema,
21005
+ eventId: number().int(),
20950
21006
  deviceId: number()
20951
21007
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20952
21008
  kind: "mutation",
@@ -26156,8 +26212,8 @@ var IdentitySchema = object({
26156
26212
  id: string(),
26157
26213
  name: string(),
26158
26214
  sampleCount: number().int().nonnegative(),
26159
- coverMediaKey: string().optional(),
26160
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26215
+ coverMediaId: number().int().optional(),
26216
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26161
26217
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26162
26218
  coverBase64: string().optional()
26163
26219
  });
@@ -26183,8 +26239,8 @@ var IdentitySampleAuditRowSchema = object({
26183
26239
  enrolledAt: number().int(),
26184
26240
  deviceId: number().int().optional(),
26185
26241
  source: _enum(["detected", "photo"]),
26186
- /** The enrolled crop's media key, so the panel can show the evidence. */
26187
- mediaKey: string().optional(),
26242
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26243
+ mediaId: number().int().optional(),
26188
26244
  /**
26189
26245
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26190
26246
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26253,15 +26309,15 @@ var FaceInfoSchema = object({
26253
26309
  */
26254
26310
  cropUrl: string().optional(),
26255
26311
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26256
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26312
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26257
26313
  * legacy rows written before design B. */
26258
26314
  faceBbox: BoundingBoxSchema.optional(),
26259
26315
  /** Design B: MediaStore key of the track's native-resolution key frame.
26260
26316
  * Fetch the native JPEG via the event-media data-plane
26261
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26317
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26262
26318
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26263
26319
  * back to the inline `base64` face crop. */
26264
- keyFrameMediaKey: string().optional(),
26320
+ keyFrameMediaId: number().int().optional(),
26265
26321
  /** Winning identity-match cosine (0..1) for this face's track, when an
26266
26322
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26267
26323
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26330,11 +26386,14 @@ var FaceClusterSchema = object({
26330
26386
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26331
26387
  * dialog already rendering its key FRAME from the `event-media` plane.
26332
26388
  *
26333
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26334
- * media key directly, so this needed no new plane and no new access decision.
26389
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26390
+ * resolves a media row by its own id, so this needed no new plane and no new
26391
+ * access decision.
26335
26392
  */
26336
26393
  var MediaFileLiteSchema$1 = object({
26337
- key: string(),
26394
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26395
+ * (D482). It was the row's composite key, which embedded the owner. */
26396
+ mediaId: number().int(),
26338
26397
  kind: string(),
26339
26398
  url: string(),
26340
26399
  sizeBytes: number(),
@@ -26351,7 +26410,7 @@ method(object({
26351
26410
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26352
26411
  * four times and the viewer holds at `staleTime: 30_000`.
26353
26412
  *
26354
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26413
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26355
26414
  * the `event-media` plane serves that key `immutable` with an ETag.
26356
26415
  *
26357
26416
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29714,8 +29773,8 @@ var VehicleSchema = object({
29714
29773
  id: string(),
29715
29774
  name: string(),
29716
29775
  sampleCount: number().int().nonnegative(),
29717
- coverMediaKey: string().optional(),
29718
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29776
+ coverMediaId: number().int().optional(),
29777
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29719
29778
  coverBase64: string().optional()
29720
29779
  });
29721
29780
  var VehicleSampleInfoSchema = object({
@@ -29748,7 +29807,7 @@ var PlateInfoSchema = object({
29748
29807
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29749
29808
  plateBbox: BoundingBoxSchema.optional(),
29750
29809
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29751
- keyFrameMediaKey: string().optional(),
29810
+ keyFrameMediaId: number().int().optional(),
29752
29811
  base64: string().optional(),
29753
29812
  /**
29754
29813
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29769,11 +29828,14 @@ var PlateInfoSchema = object({
29769
29828
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29770
29829
  * dialog already rendering its key FRAME from the `event-media` plane.
29771
29830
  *
29772
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29773
- * media key directly, so this needed no new plane and no new access decision.
29831
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29832
+ * resolves a media row by its own id, so this needed no new plane and no new
29833
+ * access decision.
29774
29834
  */
29775
29835
  var MediaFileLiteSchema = object({
29776
- key: string(),
29836
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29837
+ * (D482). It was the row's composite key, which embedded the owner. */
29838
+ mediaId: number().int(),
29777
29839
  kind: string(),
29778
29840
  url: string(),
29779
29841
  sizeBytes: number(),
@@ -29832,7 +29894,7 @@ method(object({
29832
29894
  }), method(object({
29833
29895
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29834
29896
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29835
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29897
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29836
29898
  * INPUT field: stripped by the hub router until the train ships, which
29837
29899
  * resolves to `false` and is exactly the intended default. */
29838
29900
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31401,7 +31463,14 @@ var SceneReferenceSchema = object({
31401
31463
  modelId: string(),
31402
31464
  condition: SceneConditionSchema,
31403
31465
  capturedAt: number(),
31404
- thumbnailMediaId: string().optional(),
31466
+ /**
31467
+ * The reference thumbnail's media ROW id (D482).
31468
+ *
31469
+ * The name already said `mediaId` while the value was the row's composite
31470
+ * key — a leftover that read as done and was not. It is the row's own id
31471
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31472
+ */
31473
+ thumbnailMediaId: number().int().optional(),
31405
31474
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31406
31475
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31407
31476
  * normalized rect frame a different piece of world, and the scene would
@@ -33385,7 +33454,7 @@ var StationaryObjectSchema = object({
33385
33454
  /** Enrichment label carried from the source track (identity / plate). */
33386
33455
  label: string().optional(),
33387
33456
  /** Native-resolution key-frame media key for the parked object's best image. */
33388
- keyFrameMediaKey: string().optional()
33457
+ keyFrameMediaId: number().int().optional()
33389
33458
  });
33390
33459
  var CameraOccupancySnapshotSchema = object({
33391
33460
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36123,6 +36192,12 @@ Object.freeze({
36123
36192
  addonId: null,
36124
36193
  access: "create"
36125
36194
  },
36195
+ "dataStoreProvider.upsert": {
36196
+ capName: "data-store-provider",
36197
+ capScope: "system",
36198
+ addonId: null,
36199
+ access: "create"
36200
+ },
36126
36201
  "dayNight.getOptions": {
36127
36202
  capName: "day-night",
36128
36203
  capScope: "device",
@@ -39987,6 +40062,12 @@ Object.freeze({
39987
40062
  addonId: null,
39988
40063
  access: "create"
39989
40064
  },
40065
+ "settingsStore.upsert": {
40066
+ capName: "settings-store",
40067
+ capScope: "system",
40068
+ addonId: null,
40069
+ access: "create"
40070
+ },
39990
40071
  "smtpProvider.getStatus": {
39991
40072
  capName: "smtp-provider",
39992
40073
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -38,7 +38,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
38
38
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
39
39
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
40
40
  //#endregion
41
- //#region ../types/dist/event-category-DAXzJeTX.mjs
41
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
42
42
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
43
43
  EventCategory["SystemBoot"] = "system.boot";
44
44
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -599,7 +599,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
599
599
  * a package zone — a newly-appeared stationary object of a package class
600
600
  * that cleared the class / zone / dwell / size gates. Payload:
601
601
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
602
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
602
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
603
603
  * Telemetry (D8): the durable record is the `package-events` store row;
604
604
  * this bus topic drives notifier rules + live UI. See
605
605
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5385,7 +5385,7 @@ var ZodIssueCode = {
5385
5385
  var ZodFirstPartyTypeKind;
5386
5386
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5387
5387
  //#endregion
5388
- //#region ../types/dist/sleep-BnujYGPe.mjs
5388
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5389
5389
  /**
5390
5390
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5391
5391
  * window to float samples (D455).
@@ -7352,13 +7352,30 @@ new Set([
7352
7352
  "scene",
7353
7353
  "motion",
7354
7354
  "object",
7355
- "audio"
7355
+ "audio",
7356
+ "mosaic"
7356
7357
  ]);
7357
- new Set([
7358
+ /**
7359
+ * The owner types that are event tables, in the order the event-media resolver
7360
+ * should consider them. Exported so a consumer asking "is this key an event?"
7361
+ * does not re-spell the list and drift from it.
7362
+ */
7363
+ var EVENT_OWNER_TYPES = [
7358
7364
  "motion",
7359
7365
  "object",
7360
7366
  "audio"
7361
- ]);
7367
+ ];
7368
+ /**
7369
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7370
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7371
+ * `(table, id)`).
7372
+ *
7373
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7374
+ * table would otherwise be accepted by the codec and refused at the door, with
7375
+ * nothing failing until a caller asked.
7376
+ */
7377
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7378
+ new Set(EVENT_OWNER_TYPES);
7362
7379
  /**
7363
7380
  * Build an `IAddonRouteProvider` from a list of routes. Implements
7364
7381
  * both the operator-facing `getRoutes` (returning route descriptors
@@ -12742,6 +12759,16 @@ method(object({
12742
12759
  filter: QueryFilterSchema.optional(),
12743
12760
  columns: array(string()).readonly().optional()
12744
12761
  }), array(SettingsRecordSchema).readonly()), method(object({
12762
+ namespace: string().optional(),
12763
+ collection: string(),
12764
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12765
+ * index on the collection. Never empty. */
12766
+ conflict: array(string()).readonly(),
12767
+ record: BulkRecordSchema
12768
+ }), object({
12769
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12770
+ * row's own id on an update. */
12771
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12745
12772
  namespace: string().optional(),
12746
12773
  collection: string(),
12747
12774
  record: object({
@@ -12876,6 +12903,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12876
12903
  id: union([string(), number()]) }), {
12877
12904
  kind: "mutation",
12878
12905
  auth: "admin"
12906
+ }), method(object({
12907
+ namespace: string().optional(),
12908
+ collection: string(),
12909
+ conflict: array(string()).readonly(),
12910
+ record: BulkRecordSchema
12911
+ }), object({ id: union([string(), number()]) }), {
12912
+ kind: "mutation",
12913
+ auth: "admin"
12879
12914
  }), method(object({
12880
12915
  namespace: string().optional(),
12881
12916
  collection: string(),
@@ -19375,8 +19410,8 @@ var TrackPositionSchema = object({
19375
19410
  var TrackSnapshotSchema = object({
19376
19411
  timestamp: number(),
19377
19412
  position: TrackPositionSchema,
19378
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19379
- mediaKey: string()
19413
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19414
+ mediaId: number().int()
19380
19415
  });
19381
19416
  /**
19382
19417
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19980,14 +20015,14 @@ var ObjectEventSchema = object({
19980
20015
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19981
20016
  frameWidth: number().optional(),
19982
20017
  frameHeight: number().optional(),
19983
- /** MediaStore key for the crop attached to this event (if any). */
19984
- mediaKey: string().optional(),
19985
- /** Design B: MediaStore key of the track's native-resolution key frame (the
20018
+ /** Media row id of the crop attached to this event (if any) — D482. */
20019
+ mediaId: number().int().optional(),
20020
+ /** Design B: media row id of the track's native-resolution key frame (the
19986
20021
  * best-detection full frame). Resolve via the event-media data-plane
19987
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
20022
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19988
20023
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19989
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19990
- keyFrameMediaKey: string().optional(),
20024
+ * sources — consumers fall back to `mediaId` (the tight crop). */
20025
+ keyFrameMediaId: number().int().optional(),
19991
20026
  /** Populated by B5 (recording playback URL for this event). */
19992
20027
  mediaUrl: string().optional(),
19993
20028
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -20037,7 +20072,7 @@ var MediaFileKindEnum = _enum([
20037
20072
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
20038
20073
  *
20039
20074
  * `url` points at the `event-media` data plane
20040
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
20075
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
20041
20076
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
20042
20077
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
20043
20078
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -20045,10 +20080,13 @@ var MediaFileKindEnum = _enum([
20045
20080
  * `data-plane-access.ts` for the rule and the one gap it does not close
20046
20081
  * (per-device scoping).
20047
20082
  *
20048
- * The URL is built from the row's **stored** key, which is not always its
20049
- * published `kind`: a track's face/plate crop is stored as `crop` under
20083
+ * The URL is built from the row's own id, which since D482 says nothing about
20084
+ * the row's owner or kind — and that is the point. The published `kind` is not
20085
+ * the stored one (a track's face/plate crop is stored as `crop` under
20050
20086
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
20051
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
20087
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
20088
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
20089
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
20052
20090
  *
20053
20091
  * ## `base64` is TRANSITIONAL and is going away
20054
20092
  *
@@ -20061,7 +20099,19 @@ var MediaFileKindEnum = _enum([
20061
20099
  * `analytics-query-facade.ts`; nothing else reads it.
20062
20100
  */
20063
20101
  var MediaFileSchema = object({
20064
- key: string(),
20102
+ /**
20103
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
20104
+ *
20105
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
20106
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
20107
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
20108
+ * different rows that spell the same number, and a track whose
20109
+ * `bestEventId` was an object event was served a motion event's snapshot —
20110
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
20111
+ * surrogate id cannot name the wrong row's owner, because it names no owner
20112
+ * at all.
20113
+ */
20114
+ mediaId: number().int(),
20065
20115
  kind: MediaFileKindEnum,
20066
20116
  sizeBytes: number(),
20067
20117
  timestamp: number()
@@ -20169,7 +20219,7 @@ var RetrainTrackSchema = object({
20169
20219
  });
20170
20220
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
20171
20221
  var RetrainFrameCandidateSchema = object({
20172
- mediaKey: string(),
20222
+ mediaId: number().int(),
20173
20223
  kind: MediaFileKindEnum,
20174
20224
  timestamp: number(),
20175
20225
  sizeBytes: number().int(),
@@ -20183,7 +20233,7 @@ var RetrainFrameSchema = object({
20183
20233
  deviceId: number(),
20184
20234
  trackId: string(),
20185
20235
  /** Provenance only. It may already point at nothing — that is expected. */
20186
- sourceMediaKey: string(),
20236
+ sourceMediaId: number().int(),
20187
20237
  sourceKind: MediaFileKindEnum,
20188
20238
  sizeBytes: number().int(),
20189
20239
  width: number().int(),
@@ -20199,7 +20249,7 @@ var RetrainCopyRefusalSchema = _enum([
20199
20249
  var RetrainFrameSelectionSchema = object({
20200
20250
  copied: array(RetrainFrameSchema).readonly(),
20201
20251
  refused: array(object({
20202
- sourceMediaKey: string(),
20252
+ sourceMediaId: number().int(),
20203
20253
  reason: RetrainCopyRefusalSchema
20204
20254
  })).readonly()
20205
20255
  });
@@ -20207,7 +20257,7 @@ var RetrainFrameListSchema = object({
20207
20257
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20208
20258
  copies: array(RetrainFrameSchema).readonly(),
20209
20259
  /** What the page pre-selects — the native key frame when one survives. */
20210
- autoPickMediaKey: string().optional()
20260
+ autoPickMediaId: number().int().optional()
20211
20261
  });
20212
20262
  /** What the operator asked the assist to look for. */
20213
20263
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20302,9 +20352,11 @@ var RecentTracksQueryInput = object({
20302
20352
  });
20303
20353
  /**
20304
20354
  * A Summary (D359): the per-camera session envelope that references tracks.
20305
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20306
- * served by the event-media plane by key), null until the first frame with a
20307
- * member visible has been materialised.
20355
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20356
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20357
+ * first frame with a member visible has been materialised (D482 — it was the
20358
+ * row's composite key, which embedded the owner and could name another table's
20359
+ * row once event ids became per-table rowids).
20308
20360
  */
20309
20361
  var SummarySchema = object({
20310
20362
  id: string(),
@@ -20313,7 +20365,7 @@ var SummarySchema = object({
20313
20365
  lastActiveAt: number(),
20314
20366
  sealedAt: number().nullable(),
20315
20367
  memberCount: number().int().nonnegative(),
20316
- groupShotKey: string().nullable()
20368
+ groupShotMediaId: number().int().nullable()
20317
20369
  });
20318
20370
  var SummariesQueryInput = object({
20319
20371
  deviceIds: array(number()).min(1),
@@ -20867,7 +20919,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20867
20919
  }), method(object({
20868
20920
  deviceId: number(),
20869
20921
  trackId: string(),
20870
- mediaKeys: array(string()).min(1)
20922
+ mediaIds: array(number().int()).min(1)
20871
20923
  }), RetrainFrameSelectionSchema, {
20872
20924
  kind: "mutation",
20873
20925
  auth: "admin"
@@ -20935,7 +20987,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20935
20987
  kind: "query",
20936
20988
  auth: "admin"
20937
20989
  }), method(object({
20938
- eventId: string(),
20990
+ /** Which of the three event tables owns the row. */
20991
+ ownerType: EventOwnerTypeSchema,
20992
+ /** The event's rowid in that table (D474: an event id is a number). */
20993
+ eventId: number().int(),
20939
20994
  kind: MediaFileKindEnum.optional(),
20940
20995
  deviceId: number()
20941
20996
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20946,7 +21001,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20946
21001
  trackId: string(),
20947
21002
  deviceId: number()
20948
21003
  }), array(MediaFileInfoSchema).readonly()), method(object({
20949
- eventId: string(),
21004
+ ownerType: EventOwnerTypeSchema,
21005
+ eventId: number().int(),
20950
21006
  deviceId: number()
20951
21007
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20952
21008
  kind: "mutation",
@@ -26156,8 +26212,8 @@ var IdentitySchema = object({
26156
26212
  id: string(),
26157
26213
  name: string(),
26158
26214
  sampleCount: number().int().nonnegative(),
26159
- coverMediaKey: string().optional(),
26160
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26215
+ coverMediaId: number().int().optional(),
26216
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26161
26217
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26162
26218
  coverBase64: string().optional()
26163
26219
  });
@@ -26183,8 +26239,8 @@ var IdentitySampleAuditRowSchema = object({
26183
26239
  enrolledAt: number().int(),
26184
26240
  deviceId: number().int().optional(),
26185
26241
  source: _enum(["detected", "photo"]),
26186
- /** The enrolled crop's media key, so the panel can show the evidence. */
26187
- mediaKey: string().optional(),
26242
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26243
+ mediaId: number().int().optional(),
26188
26244
  /**
26189
26245
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26190
26246
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26253,15 +26309,15 @@ var FaceInfoSchema = object({
26253
26309
  */
26254
26310
  cropUrl: string().optional(),
26255
26311
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26256
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26312
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26257
26313
  * legacy rows written before design B. */
26258
26314
  faceBbox: BoundingBoxSchema.optional(),
26259
26315
  /** Design B: MediaStore key of the track's native-resolution key frame.
26260
26316
  * Fetch the native JPEG via the event-media data-plane
26261
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26317
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26262
26318
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26263
26319
  * back to the inline `base64` face crop. */
26264
- keyFrameMediaKey: string().optional(),
26320
+ keyFrameMediaId: number().int().optional(),
26265
26321
  /** Winning identity-match cosine (0..1) for this face's track, when an
26266
26322
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26267
26323
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26330,11 +26386,14 @@ var FaceClusterSchema = object({
26330
26386
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26331
26387
  * dialog already rendering its key FRAME from the `event-media` plane.
26332
26388
  *
26333
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26334
- * media key directly, so this needed no new plane and no new access decision.
26389
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26390
+ * resolves a media row by its own id, so this needed no new plane and no new
26391
+ * access decision.
26335
26392
  */
26336
26393
  var MediaFileLiteSchema$1 = object({
26337
- key: string(),
26394
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26395
+ * (D482). It was the row's composite key, which embedded the owner. */
26396
+ mediaId: number().int(),
26338
26397
  kind: string(),
26339
26398
  url: string(),
26340
26399
  sizeBytes: number(),
@@ -26351,7 +26410,7 @@ method(object({
26351
26410
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26352
26411
  * four times and the viewer holds at `staleTime: 30_000`.
26353
26412
  *
26354
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26413
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26355
26414
  * the `event-media` plane serves that key `immutable` with an ETag.
26356
26415
  *
26357
26416
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29714,8 +29773,8 @@ var VehicleSchema = object({
29714
29773
  id: string(),
29715
29774
  name: string(),
29716
29775
  sampleCount: number().int().nonnegative(),
29717
- coverMediaKey: string().optional(),
29718
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29776
+ coverMediaId: number().int().optional(),
29777
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29719
29778
  coverBase64: string().optional()
29720
29779
  });
29721
29780
  var VehicleSampleInfoSchema = object({
@@ -29748,7 +29807,7 @@ var PlateInfoSchema = object({
29748
29807
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29749
29808
  plateBbox: BoundingBoxSchema.optional(),
29750
29809
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29751
- keyFrameMediaKey: string().optional(),
29810
+ keyFrameMediaId: number().int().optional(),
29752
29811
  base64: string().optional(),
29753
29812
  /**
29754
29813
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29769,11 +29828,14 @@ var PlateInfoSchema = object({
29769
29828
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29770
29829
  * dialog already rendering its key FRAME from the `event-media` plane.
29771
29830
  *
29772
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29773
- * media key directly, so this needed no new plane and no new access decision.
29831
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29832
+ * resolves a media row by its own id, so this needed no new plane and no new
29833
+ * access decision.
29774
29834
  */
29775
29835
  var MediaFileLiteSchema = object({
29776
- key: string(),
29836
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29837
+ * (D482). It was the row's composite key, which embedded the owner. */
29838
+ mediaId: number().int(),
29777
29839
  kind: string(),
29778
29840
  url: string(),
29779
29841
  sizeBytes: number(),
@@ -29832,7 +29894,7 @@ method(object({
29832
29894
  }), method(object({
29833
29895
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29834
29896
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29835
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29897
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29836
29898
  * INPUT field: stripped by the hub router until the train ships, which
29837
29899
  * resolves to `false` and is exactly the intended default. */
29838
29900
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31401,7 +31463,14 @@ var SceneReferenceSchema = object({
31401
31463
  modelId: string(),
31402
31464
  condition: SceneConditionSchema,
31403
31465
  capturedAt: number(),
31404
- thumbnailMediaId: string().optional(),
31466
+ /**
31467
+ * The reference thumbnail's media ROW id (D482).
31468
+ *
31469
+ * The name already said `mediaId` while the value was the row's composite
31470
+ * key — a leftover that read as done and was not. It is the row's own id
31471
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31472
+ */
31473
+ thumbnailMediaId: number().int().optional(),
31405
31474
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31406
31475
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31407
31476
  * normalized rect frame a different piece of world, and the scene would
@@ -33385,7 +33454,7 @@ var StationaryObjectSchema = object({
33385
33454
  /** Enrichment label carried from the source track (identity / plate). */
33386
33455
  label: string().optional(),
33387
33456
  /** Native-resolution key-frame media key for the parked object's best image. */
33388
- keyFrameMediaKey: string().optional()
33457
+ keyFrameMediaId: number().int().optional()
33389
33458
  });
33390
33459
  var CameraOccupancySnapshotSchema = object({
33391
33460
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36123,6 +36192,12 @@ Object.freeze({
36123
36192
  addonId: null,
36124
36193
  access: "create"
36125
36194
  },
36195
+ "dataStoreProvider.upsert": {
36196
+ capName: "data-store-provider",
36197
+ capScope: "system",
36198
+ addonId: null,
36199
+ access: "create"
36200
+ },
36126
36201
  "dayNight.getOptions": {
36127
36202
  capName: "day-night",
36128
36203
  capScope: "device",
@@ -39987,6 +40062,12 @@ Object.freeze({
39987
40062
  addonId: null,
39988
40063
  access: "create"
39989
40064
  },
40065
+ "settingsStore.upsert": {
40066
+ capName: "settings-store",
40067
+ capScope: "system",
40068
+ addonId: null,
40069
+ access: "create"
40070
+ },
39990
40071
  "smtpProvider.getStatus": {
39991
40072
  capName: "smtp-provider",
39992
40073
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-import-alexa",
3
- "version": "0.2.98",
3
+ "version": "0.2.99",
4
4
  "description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
5
5
  "keywords": [
6
6
  "camstack",