@camstack/addon-export-alexa 1.2.105 → 1.2.106

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.
@@ -26,7 +26,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  //#endregion
27
27
  let node_crypto = require("node:crypto");
28
28
  node_crypto = __toESM(node_crypto);
29
- //#region ../types/dist/event-category-DAXzJeTX.mjs
29
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
30
30
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
31
31
  EventCategory["SystemBoot"] = "system.boot";
32
32
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -587,7 +587,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
587
587
  * a package zone — a newly-appeared stationary object of a package class
588
588
  * that cleared the class / zone / dwell / size gates. Payload:
589
589
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
590
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
590
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
591
591
  * Telemetry (D8): the durable record is the `package-events` store row;
592
592
  * this bus topic drives notifier rules + live UI. See
593
593
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5373,7 +5373,7 @@ var ZodIssueCode = {
5373
5373
  var ZodFirstPartyTypeKind;
5374
5374
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5375
5375
  //#endregion
5376
- //#region ../types/dist/sleep-BnujYGPe.mjs
5376
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5377
5377
  /**
5378
5378
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5379
5379
  * window to float samples (D455).
@@ -7336,13 +7336,30 @@ new Set([
7336
7336
  "scene",
7337
7337
  "motion",
7338
7338
  "object",
7339
- "audio"
7339
+ "audio",
7340
+ "mosaic"
7340
7341
  ]);
7341
- new Set([
7342
+ /**
7343
+ * The owner types that are event tables, in the order the event-media resolver
7344
+ * should consider them. Exported so a consumer asking "is this key an event?"
7345
+ * does not re-spell the list and drift from it.
7346
+ */
7347
+ var EVENT_OWNER_TYPES = [
7342
7348
  "motion",
7343
7349
  "object",
7344
7350
  "audio"
7345
- ]);
7351
+ ];
7352
+ /**
7353
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7354
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7355
+ * `(table, id)`).
7356
+ *
7357
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7358
+ * table would otherwise be accepted by the codec and refused at the door, with
7359
+ * nothing failing until a caller asked.
7360
+ */
7361
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7362
+ new Set(EVENT_OWNER_TYPES);
7346
7363
  /**
7347
7364
  * Build an `IAddonRouteProvider` from a list of routes. Implements
7348
7365
  * both the operator-facing `getRoutes` (returning route descriptors
@@ -12684,6 +12701,16 @@ method(object({
12684
12701
  filter: QueryFilterSchema.optional(),
12685
12702
  columns: array(string()).readonly().optional()
12686
12703
  }), array(SettingsRecordSchema).readonly()), method(object({
12704
+ namespace: string().optional(),
12705
+ collection: string(),
12706
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12707
+ * index on the collection. Never empty. */
12708
+ conflict: array(string()).readonly(),
12709
+ record: BulkRecordSchema
12710
+ }), object({
12711
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12712
+ * row's own id on an update. */
12713
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12687
12714
  namespace: string().optional(),
12688
12715
  collection: string(),
12689
12716
  record: object({
@@ -12818,6 +12845,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12818
12845
  id: union([string(), number()]) }), {
12819
12846
  kind: "mutation",
12820
12847
  auth: "admin"
12848
+ }), method(object({
12849
+ namespace: string().optional(),
12850
+ collection: string(),
12851
+ conflict: array(string()).readonly(),
12852
+ record: BulkRecordSchema
12853
+ }), object({ id: union([string(), number()]) }), {
12854
+ kind: "mutation",
12855
+ auth: "admin"
12821
12856
  }), method(object({
12822
12857
  namespace: string().optional(),
12823
12858
  collection: string(),
@@ -19075,8 +19110,8 @@ var TrackPositionSchema = object({
19075
19110
  var TrackSnapshotSchema = object({
19076
19111
  timestamp: number(),
19077
19112
  position: TrackPositionSchema,
19078
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19079
- mediaKey: string()
19113
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19114
+ mediaId: number().int()
19080
19115
  });
19081
19116
  /**
19082
19117
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19680,14 +19715,14 @@ var ObjectEventSchema = object({
19680
19715
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19681
19716
  frameWidth: number().optional(),
19682
19717
  frameHeight: number().optional(),
19683
- /** MediaStore key for the crop attached to this event (if any). */
19684
- mediaKey: string().optional(),
19685
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19718
+ /** Media row id of the crop attached to this event (if any) — D482. */
19719
+ mediaId: number().int().optional(),
19720
+ /** Design B: media row id of the track's native-resolution key frame (the
19686
19721
  * best-detection full frame). Resolve via the event-media data-plane
19687
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19722
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19688
19723
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19689
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19690
- keyFrameMediaKey: string().optional(),
19724
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19725
+ keyFrameMediaId: number().int().optional(),
19691
19726
  /** Populated by B5 (recording playback URL for this event). */
19692
19727
  mediaUrl: string().optional(),
19693
19728
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19737,7 +19772,7 @@ var MediaFileKindEnum = _enum([
19737
19772
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19738
19773
  *
19739
19774
  * `url` points at the `event-media` data plane
19740
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19775
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19741
19776
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19742
19777
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19743
19778
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19745,10 +19780,13 @@ var MediaFileKindEnum = _enum([
19745
19780
  * `data-plane-access.ts` for the rule and the one gap it does not close
19746
19781
  * (per-device scoping).
19747
19782
  *
19748
- * The URL is built from the row's **stored** key, which is not always its
19749
- * published `kind`: a track's face/plate crop is stored as `crop` under
19783
+ * The URL is built from the row's own id, which since D482 says nothing about
19784
+ * the row's owner or kind — and that is the point. The published `kind` is not
19785
+ * the stored one (a track's face/plate crop is stored as `crop` under
19750
19786
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19751
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19787
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19788
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19789
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19752
19790
  *
19753
19791
  * ## `base64` is TRANSITIONAL and is going away
19754
19792
  *
@@ -19761,7 +19799,19 @@ var MediaFileKindEnum = _enum([
19761
19799
  * `analytics-query-facade.ts`; nothing else reads it.
19762
19800
  */
19763
19801
  var MediaFileSchema = object({
19764
- key: string(),
19802
+ /**
19803
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19804
+ *
19805
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19806
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19807
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19808
+ * different rows that spell the same number, and a track whose
19809
+ * `bestEventId` was an object event was served a motion event's snapshot —
19810
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19811
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19812
+ * at all.
19813
+ */
19814
+ mediaId: number().int(),
19765
19815
  kind: MediaFileKindEnum,
19766
19816
  sizeBytes: number(),
19767
19817
  timestamp: number()
@@ -19869,7 +19919,7 @@ var RetrainTrackSchema = object({
19869
19919
  });
19870
19920
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19871
19921
  var RetrainFrameCandidateSchema = object({
19872
- mediaKey: string(),
19922
+ mediaId: number().int(),
19873
19923
  kind: MediaFileKindEnum,
19874
19924
  timestamp: number(),
19875
19925
  sizeBytes: number().int(),
@@ -19883,7 +19933,7 @@ var RetrainFrameSchema = object({
19883
19933
  deviceId: number(),
19884
19934
  trackId: string(),
19885
19935
  /** Provenance only. It may already point at nothing — that is expected. */
19886
- sourceMediaKey: string(),
19936
+ sourceMediaId: number().int(),
19887
19937
  sourceKind: MediaFileKindEnum,
19888
19938
  sizeBytes: number().int(),
19889
19939
  width: number().int(),
@@ -19899,7 +19949,7 @@ var RetrainCopyRefusalSchema = _enum([
19899
19949
  var RetrainFrameSelectionSchema = object({
19900
19950
  copied: array(RetrainFrameSchema).readonly(),
19901
19951
  refused: array(object({
19902
- sourceMediaKey: string(),
19952
+ sourceMediaId: number().int(),
19903
19953
  reason: RetrainCopyRefusalSchema
19904
19954
  })).readonly()
19905
19955
  });
@@ -19907,7 +19957,7 @@ var RetrainFrameListSchema = object({
19907
19957
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19908
19958
  copies: array(RetrainFrameSchema).readonly(),
19909
19959
  /** What the page pre-selects — the native key frame when one survives. */
19910
- autoPickMediaKey: string().optional()
19960
+ autoPickMediaId: number().int().optional()
19911
19961
  });
19912
19962
  /** What the operator asked the assist to look for. */
19913
19963
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20002,9 +20052,11 @@ var RecentTracksQueryInput = object({
20002
20052
  });
20003
20053
  /**
20004
20054
  * A Summary (D359): the per-camera session envelope that references tracks.
20005
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20006
- * served by the event-media plane by key), null until the first frame with a
20007
- * member visible has been materialised.
20055
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20056
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20057
+ * first frame with a member visible has been materialised (D482 — it was the
20058
+ * row's composite key, which embedded the owner and could name another table's
20059
+ * row once event ids became per-table rowids).
20008
20060
  */
20009
20061
  var SummarySchema = object({
20010
20062
  id: string(),
@@ -20013,7 +20065,7 @@ var SummarySchema = object({
20013
20065
  lastActiveAt: number(),
20014
20066
  sealedAt: number().nullable(),
20015
20067
  memberCount: number().int().nonnegative(),
20016
- groupShotKey: string().nullable()
20068
+ groupShotMediaId: number().int().nullable()
20017
20069
  });
20018
20070
  var SummariesQueryInput = object({
20019
20071
  deviceIds: array(number()).min(1),
@@ -20567,7 +20619,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20567
20619
  }), method(object({
20568
20620
  deviceId: number(),
20569
20621
  trackId: string(),
20570
- mediaKeys: array(string()).min(1)
20622
+ mediaIds: array(number().int()).min(1)
20571
20623
  }), RetrainFrameSelectionSchema, {
20572
20624
  kind: "mutation",
20573
20625
  auth: "admin"
@@ -20635,7 +20687,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20635
20687
  kind: "query",
20636
20688
  auth: "admin"
20637
20689
  }), method(object({
20638
- eventId: string(),
20690
+ /** Which of the three event tables owns the row. */
20691
+ ownerType: EventOwnerTypeSchema,
20692
+ /** The event's rowid in that table (D474: an event id is a number). */
20693
+ eventId: number().int(),
20639
20694
  kind: MediaFileKindEnum.optional(),
20640
20695
  deviceId: number()
20641
20696
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20646,7 +20701,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20646
20701
  trackId: string(),
20647
20702
  deviceId: number()
20648
20703
  }), array(MediaFileInfoSchema).readonly()), method(object({
20649
- eventId: string(),
20704
+ ownerType: EventOwnerTypeSchema,
20705
+ eventId: number().int(),
20650
20706
  deviceId: number()
20651
20707
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20652
20708
  kind: "mutation",
@@ -25109,8 +25165,8 @@ var IdentitySchema = object({
25109
25165
  id: string(),
25110
25166
  name: string(),
25111
25167
  sampleCount: number().int().nonnegative(),
25112
- coverMediaKey: string().optional(),
25113
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
25168
+ coverMediaId: number().int().optional(),
25169
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
25114
25170
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
25115
25171
  coverBase64: string().optional()
25116
25172
  });
@@ -25136,8 +25192,8 @@ var IdentitySampleAuditRowSchema = object({
25136
25192
  enrolledAt: number().int(),
25137
25193
  deviceId: number().int().optional(),
25138
25194
  source: _enum(["detected", "photo"]),
25139
- /** The enrolled crop's media key, so the panel can show the evidence. */
25140
- mediaKey: string().optional(),
25195
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
25196
+ mediaId: number().int().optional(),
25141
25197
  /**
25142
25198
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
25143
25199
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -25206,15 +25262,15 @@ var FaceInfoSchema = object({
25206
25262
  */
25207
25263
  cropUrl: string().optional(),
25208
25264
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
25209
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
25265
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
25210
25266
  * legacy rows written before design B. */
25211
25267
  faceBbox: BoundingBoxSchema.optional(),
25212
25268
  /** Design B: MediaStore key of the track's native-resolution key frame.
25213
25269
  * Fetch the native JPEG via the event-media data-plane
25214
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
25270
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
25215
25271
  * track produced no key frame (e.g. native/onboard source) — the UI falls
25216
25272
  * back to the inline `base64` face crop. */
25217
- keyFrameMediaKey: string().optional(),
25273
+ keyFrameMediaId: number().int().optional(),
25218
25274
  /** Winning identity-match cosine (0..1) for this face's track, when an
25219
25275
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
25220
25276
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -25283,11 +25339,14 @@ var FaceClusterSchema = object({
25283
25339
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
25284
25340
  * dialog already rendering its key FRAME from the `event-media` plane.
25285
25341
  *
25286
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
25287
- * media key directly, so this needed no new plane and no new access decision.
25342
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
25343
+ * resolves a media row by its own id, so this needed no new plane and no new
25344
+ * access decision.
25288
25345
  */
25289
25346
  var MediaFileLiteSchema$1 = object({
25290
- key: string(),
25347
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
25348
+ * (D482). It was the row's composite key, which embedded the owner. */
25349
+ mediaId: number().int(),
25291
25350
  kind: string(),
25292
25351
  url: string(),
25293
25352
  sizeBytes: number(),
@@ -25304,7 +25363,7 @@ method(object({
25304
25363
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
25305
25364
  * four times and the viewer holds at `staleTime: 30_000`.
25306
25365
  *
25307
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
25366
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
25308
25367
  * the `event-media` plane serves that key `immutable` with an ETag.
25309
25368
  *
25310
25369
  * **This is an INPUT field, so it does not reach the addon until the
@@ -27772,8 +27831,8 @@ var VehicleSchema = object({
27772
27831
  id: string(),
27773
27832
  name: string(),
27774
27833
  sampleCount: number().int().nonnegative(),
27775
- coverMediaKey: string().optional(),
27776
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
27834
+ coverMediaId: number().int().optional(),
27835
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
27777
27836
  coverBase64: string().optional()
27778
27837
  });
27779
27838
  var VehicleSampleInfoSchema = object({
@@ -27806,7 +27865,7 @@ var PlateInfoSchema = object({
27806
27865
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
27807
27866
  plateBbox: BoundingBoxSchema.optional(),
27808
27867
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
27809
- keyFrameMediaKey: string().optional(),
27868
+ keyFrameMediaId: number().int().optional(),
27810
27869
  base64: string().optional(),
27811
27870
  /**
27812
27871
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -27827,11 +27886,14 @@ var PlateInfoSchema = object({
27827
27886
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
27828
27887
  * dialog already rendering its key FRAME from the `event-media` plane.
27829
27888
  *
27830
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
27831
- * media key directly, so this needed no new plane and no new access decision.
27889
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
27890
+ * resolves a media row by its own id, so this needed no new plane and no new
27891
+ * access decision.
27832
27892
  */
27833
27893
  var MediaFileLiteSchema = object({
27834
- key: string(),
27894
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
27895
+ * (D482). It was the row's composite key, which embedded the owner. */
27896
+ mediaId: number().int(),
27835
27897
  kind: string(),
27836
27898
  url: string(),
27837
27899
  sizeBytes: number(),
@@ -27890,7 +27952,7 @@ method(object({
27890
27952
  }), method(object({
27891
27953
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27892
27954
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27893
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
27955
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
27894
27956
  * INPUT field: stripped by the hub router until the train ships, which
27895
27957
  * resolves to `false` and is exactly the intended default. */
27896
27958
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -29214,7 +29276,14 @@ var SceneReferenceSchema = object({
29214
29276
  modelId: string(),
29215
29277
  condition: SceneConditionSchema,
29216
29278
  capturedAt: number(),
29217
- thumbnailMediaId: string().optional(),
29279
+ /**
29280
+ * The reference thumbnail's media ROW id (D482).
29281
+ *
29282
+ * The name already said `mediaId` while the value was the row's composite
29283
+ * key — a leftover that read as done and was not. It is the row's own id
29284
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
29285
+ */
29286
+ thumbnailMediaId: number().int().optional(),
29218
29287
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
29219
29288
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
29220
29289
  * normalized rect frame a different piece of world, and the scene would
@@ -30662,7 +30731,7 @@ var StationaryObjectSchema = object({
30662
30731
  /** Enrichment label carried from the source track (identity / plate). */
30663
30732
  label: string().optional(),
30664
30733
  /** Native-resolution key-frame media key for the parked object's best image. */
30665
- keyFrameMediaKey: string().optional()
30734
+ keyFrameMediaId: number().int().optional()
30666
30735
  });
30667
30736
  var CameraOccupancySnapshotSchema = object({
30668
30737
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -31818,6 +31887,12 @@ Object.freeze({
31818
31887
  addonId: null,
31819
31888
  access: "create"
31820
31889
  },
31890
+ "dataStoreProvider.upsert": {
31891
+ capName: "data-store-provider",
31892
+ capScope: "system",
31893
+ addonId: null,
31894
+ access: "create"
31895
+ },
31821
31896
  "dayNight.getOptions": {
31822
31897
  capName: "day-night",
31823
31898
  capScope: "device",
@@ -35682,6 +35757,12 @@ Object.freeze({
35682
35757
  addonId: null,
35683
35758
  access: "create"
35684
35759
  },
35760
+ "settingsStore.upsert": {
35761
+ capName: "settings-store",
35762
+ capScope: "system",
35763
+ addonId: null,
35764
+ access: "create"
35765
+ },
35685
35766
  "smtpProvider.getStatus": {
35686
35767
  capName: "smtp-provider",
35687
35768
  capScope: "system",
@@ -1,5 +1,5 @@
1
1
  import * as crypto$1 from "node:crypto";
2
- //#region ../types/dist/event-category-DAXzJeTX.mjs
2
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -560,7 +560,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
560
560
  * a package zone — a newly-appeared stationary object of a package class
561
561
  * that cleared the class / zone / dwell / size gates. Payload:
562
562
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
563
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
563
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
564
564
  * Telemetry (D8): the durable record is the `package-events` store row;
565
565
  * this bus topic drives notifier rules + live UI. See
566
566
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5346,7 +5346,7 @@ var ZodIssueCode = {
5346
5346
  var ZodFirstPartyTypeKind;
5347
5347
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5348
5348
  //#endregion
5349
- //#region ../types/dist/sleep-BnujYGPe.mjs
5349
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5350
5350
  /**
5351
5351
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5352
5352
  * window to float samples (D455).
@@ -7309,13 +7309,30 @@ new Set([
7309
7309
  "scene",
7310
7310
  "motion",
7311
7311
  "object",
7312
- "audio"
7312
+ "audio",
7313
+ "mosaic"
7313
7314
  ]);
7314
- new Set([
7315
+ /**
7316
+ * The owner types that are event tables, in the order the event-media resolver
7317
+ * should consider them. Exported so a consumer asking "is this key an event?"
7318
+ * does not re-spell the list and drift from it.
7319
+ */
7320
+ var EVENT_OWNER_TYPES = [
7315
7321
  "motion",
7316
7322
  "object",
7317
7323
  "audio"
7318
- ]);
7324
+ ];
7325
+ /**
7326
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7327
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7328
+ * `(table, id)`).
7329
+ *
7330
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7331
+ * table would otherwise be accepted by the codec and refused at the door, with
7332
+ * nothing failing until a caller asked.
7333
+ */
7334
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7335
+ new Set(EVENT_OWNER_TYPES);
7319
7336
  /**
7320
7337
  * Build an `IAddonRouteProvider` from a list of routes. Implements
7321
7338
  * both the operator-facing `getRoutes` (returning route descriptors
@@ -12657,6 +12674,16 @@ method(object({
12657
12674
  filter: QueryFilterSchema.optional(),
12658
12675
  columns: array(string()).readonly().optional()
12659
12676
  }), array(SettingsRecordSchema).readonly()), method(object({
12677
+ namespace: string().optional(),
12678
+ collection: string(),
12679
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12680
+ * index on the collection. Never empty. */
12681
+ conflict: array(string()).readonly(),
12682
+ record: BulkRecordSchema
12683
+ }), object({
12684
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12685
+ * row's own id on an update. */
12686
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12660
12687
  namespace: string().optional(),
12661
12688
  collection: string(),
12662
12689
  record: object({
@@ -12791,6 +12818,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12791
12818
  id: union([string(), number()]) }), {
12792
12819
  kind: "mutation",
12793
12820
  auth: "admin"
12821
+ }), method(object({
12822
+ namespace: string().optional(),
12823
+ collection: string(),
12824
+ conflict: array(string()).readonly(),
12825
+ record: BulkRecordSchema
12826
+ }), object({ id: union([string(), number()]) }), {
12827
+ kind: "mutation",
12828
+ auth: "admin"
12794
12829
  }), method(object({
12795
12830
  namespace: string().optional(),
12796
12831
  collection: string(),
@@ -19048,8 +19083,8 @@ var TrackPositionSchema = object({
19048
19083
  var TrackSnapshotSchema = object({
19049
19084
  timestamp: number(),
19050
19085
  position: TrackPositionSchema,
19051
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19052
- mediaKey: string()
19086
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19087
+ mediaId: number().int()
19053
19088
  });
19054
19089
  /**
19055
19090
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19653,14 +19688,14 @@ var ObjectEventSchema = object({
19653
19688
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19654
19689
  frameWidth: number().optional(),
19655
19690
  frameHeight: number().optional(),
19656
- /** MediaStore key for the crop attached to this event (if any). */
19657
- mediaKey: string().optional(),
19658
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19691
+ /** Media row id of the crop attached to this event (if any) — D482. */
19692
+ mediaId: number().int().optional(),
19693
+ /** Design B: media row id of the track's native-resolution key frame (the
19659
19694
  * best-detection full frame). Resolve via the event-media data-plane
19660
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19695
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19661
19696
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19662
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19663
- keyFrameMediaKey: string().optional(),
19697
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19698
+ keyFrameMediaId: number().int().optional(),
19664
19699
  /** Populated by B5 (recording playback URL for this event). */
19665
19700
  mediaUrl: string().optional(),
19666
19701
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19710,7 +19745,7 @@ var MediaFileKindEnum = _enum([
19710
19745
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19711
19746
  *
19712
19747
  * `url` points at the `event-media` data plane
19713
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19748
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19714
19749
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19715
19750
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19716
19751
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19718,10 +19753,13 @@ var MediaFileKindEnum = _enum([
19718
19753
  * `data-plane-access.ts` for the rule and the one gap it does not close
19719
19754
  * (per-device scoping).
19720
19755
  *
19721
- * The URL is built from the row's **stored** key, which is not always its
19722
- * published `kind`: a track's face/plate crop is stored as `crop` under
19756
+ * The URL is built from the row's own id, which since D482 says nothing about
19757
+ * the row's owner or kind — and that is the point. The published `kind` is not
19758
+ * the stored one (a track's face/plate crop is stored as `crop` under
19723
19759
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19724
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19760
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19761
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19762
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19725
19763
  *
19726
19764
  * ## `base64` is TRANSITIONAL and is going away
19727
19765
  *
@@ -19734,7 +19772,19 @@ var MediaFileKindEnum = _enum([
19734
19772
  * `analytics-query-facade.ts`; nothing else reads it.
19735
19773
  */
19736
19774
  var MediaFileSchema = object({
19737
- key: string(),
19775
+ /**
19776
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19777
+ *
19778
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19779
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19780
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19781
+ * different rows that spell the same number, and a track whose
19782
+ * `bestEventId` was an object event was served a motion event's snapshot —
19783
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19784
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19785
+ * at all.
19786
+ */
19787
+ mediaId: number().int(),
19738
19788
  kind: MediaFileKindEnum,
19739
19789
  sizeBytes: number(),
19740
19790
  timestamp: number()
@@ -19842,7 +19892,7 @@ var RetrainTrackSchema = object({
19842
19892
  });
19843
19893
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19844
19894
  var RetrainFrameCandidateSchema = object({
19845
- mediaKey: string(),
19895
+ mediaId: number().int(),
19846
19896
  kind: MediaFileKindEnum,
19847
19897
  timestamp: number(),
19848
19898
  sizeBytes: number().int(),
@@ -19856,7 +19906,7 @@ var RetrainFrameSchema = object({
19856
19906
  deviceId: number(),
19857
19907
  trackId: string(),
19858
19908
  /** Provenance only. It may already point at nothing — that is expected. */
19859
- sourceMediaKey: string(),
19909
+ sourceMediaId: number().int(),
19860
19910
  sourceKind: MediaFileKindEnum,
19861
19911
  sizeBytes: number().int(),
19862
19912
  width: number().int(),
@@ -19872,7 +19922,7 @@ var RetrainCopyRefusalSchema = _enum([
19872
19922
  var RetrainFrameSelectionSchema = object({
19873
19923
  copied: array(RetrainFrameSchema).readonly(),
19874
19924
  refused: array(object({
19875
- sourceMediaKey: string(),
19925
+ sourceMediaId: number().int(),
19876
19926
  reason: RetrainCopyRefusalSchema
19877
19927
  })).readonly()
19878
19928
  });
@@ -19880,7 +19930,7 @@ var RetrainFrameListSchema = object({
19880
19930
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19881
19931
  copies: array(RetrainFrameSchema).readonly(),
19882
19932
  /** What the page pre-selects — the native key frame when one survives. */
19883
- autoPickMediaKey: string().optional()
19933
+ autoPickMediaId: number().int().optional()
19884
19934
  });
19885
19935
  /** What the operator asked the assist to look for. */
19886
19936
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -19975,9 +20025,11 @@ var RecentTracksQueryInput = object({
19975
20025
  });
19976
20026
  /**
19977
20027
  * A Summary (D359): the per-camera session envelope that references tracks.
19978
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
19979
- * served by the event-media plane by key), null until the first frame with a
19980
- * member visible has been materialised.
20028
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20029
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20030
+ * first frame with a member visible has been materialised (D482 — it was the
20031
+ * row's composite key, which embedded the owner and could name another table's
20032
+ * row once event ids became per-table rowids).
19981
20033
  */
19982
20034
  var SummarySchema = object({
19983
20035
  id: string(),
@@ -19986,7 +20038,7 @@ var SummarySchema = object({
19986
20038
  lastActiveAt: number(),
19987
20039
  sealedAt: number().nullable(),
19988
20040
  memberCount: number().int().nonnegative(),
19989
- groupShotKey: string().nullable()
20041
+ groupShotMediaId: number().int().nullable()
19990
20042
  });
19991
20043
  var SummariesQueryInput = object({
19992
20044
  deviceIds: array(number()).min(1),
@@ -20540,7 +20592,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20540
20592
  }), method(object({
20541
20593
  deviceId: number(),
20542
20594
  trackId: string(),
20543
- mediaKeys: array(string()).min(1)
20595
+ mediaIds: array(number().int()).min(1)
20544
20596
  }), RetrainFrameSelectionSchema, {
20545
20597
  kind: "mutation",
20546
20598
  auth: "admin"
@@ -20608,7 +20660,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20608
20660
  kind: "query",
20609
20661
  auth: "admin"
20610
20662
  }), method(object({
20611
- eventId: string(),
20663
+ /** Which of the three event tables owns the row. */
20664
+ ownerType: EventOwnerTypeSchema,
20665
+ /** The event's rowid in that table (D474: an event id is a number). */
20666
+ eventId: number().int(),
20612
20667
  kind: MediaFileKindEnum.optional(),
20613
20668
  deviceId: number()
20614
20669
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20619,7 +20674,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20619
20674
  trackId: string(),
20620
20675
  deviceId: number()
20621
20676
  }), array(MediaFileInfoSchema).readonly()), method(object({
20622
- eventId: string(),
20677
+ ownerType: EventOwnerTypeSchema,
20678
+ eventId: number().int(),
20623
20679
  deviceId: number()
20624
20680
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20625
20681
  kind: "mutation",
@@ -25082,8 +25138,8 @@ var IdentitySchema = object({
25082
25138
  id: string(),
25083
25139
  name: string(),
25084
25140
  sampleCount: number().int().nonnegative(),
25085
- coverMediaKey: string().optional(),
25086
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
25141
+ coverMediaId: number().int().optional(),
25142
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
25087
25143
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
25088
25144
  coverBase64: string().optional()
25089
25145
  });
@@ -25109,8 +25165,8 @@ var IdentitySampleAuditRowSchema = object({
25109
25165
  enrolledAt: number().int(),
25110
25166
  deviceId: number().int().optional(),
25111
25167
  source: _enum(["detected", "photo"]),
25112
- /** The enrolled crop's media key, so the panel can show the evidence. */
25113
- mediaKey: string().optional(),
25168
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
25169
+ mediaId: number().int().optional(),
25114
25170
  /**
25115
25171
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
25116
25172
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -25179,15 +25235,15 @@ var FaceInfoSchema = object({
25179
25235
  */
25180
25236
  cropUrl: string().optional(),
25181
25237
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
25182
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
25238
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
25183
25239
  * legacy rows written before design B. */
25184
25240
  faceBbox: BoundingBoxSchema.optional(),
25185
25241
  /** Design B: MediaStore key of the track's native-resolution key frame.
25186
25242
  * Fetch the native JPEG via the event-media data-plane
25187
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
25243
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
25188
25244
  * track produced no key frame (e.g. native/onboard source) — the UI falls
25189
25245
  * back to the inline `base64` face crop. */
25190
- keyFrameMediaKey: string().optional(),
25246
+ keyFrameMediaId: number().int().optional(),
25191
25247
  /** Winning identity-match cosine (0..1) for this face's track, when an
25192
25248
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
25193
25249
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -25256,11 +25312,14 @@ var FaceClusterSchema = object({
25256
25312
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
25257
25313
  * dialog already rendering its key FRAME from the `event-media` plane.
25258
25314
  *
25259
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
25260
- * media key directly, so this needed no new plane and no new access decision.
25315
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
25316
+ * resolves a media row by its own id, so this needed no new plane and no new
25317
+ * access decision.
25261
25318
  */
25262
25319
  var MediaFileLiteSchema$1 = object({
25263
- key: string(),
25320
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
25321
+ * (D482). It was the row's composite key, which embedded the owner. */
25322
+ mediaId: number().int(),
25264
25323
  kind: string(),
25265
25324
  url: string(),
25266
25325
  sizeBytes: number(),
@@ -25277,7 +25336,7 @@ method(object({
25277
25336
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
25278
25337
  * four times and the viewer holds at `staleTime: 30_000`.
25279
25338
  *
25280
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
25339
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
25281
25340
  * the `event-media` plane serves that key `immutable` with an ETag.
25282
25341
  *
25283
25342
  * **This is an INPUT field, so it does not reach the addon until the
@@ -27745,8 +27804,8 @@ var VehicleSchema = object({
27745
27804
  id: string(),
27746
27805
  name: string(),
27747
27806
  sampleCount: number().int().nonnegative(),
27748
- coverMediaKey: string().optional(),
27749
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
27807
+ coverMediaId: number().int().optional(),
27808
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
27750
27809
  coverBase64: string().optional()
27751
27810
  });
27752
27811
  var VehicleSampleInfoSchema = object({
@@ -27779,7 +27838,7 @@ var PlateInfoSchema = object({
27779
27838
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
27780
27839
  plateBbox: BoundingBoxSchema.optional(),
27781
27840
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
27782
- keyFrameMediaKey: string().optional(),
27841
+ keyFrameMediaId: number().int().optional(),
27783
27842
  base64: string().optional(),
27784
27843
  /**
27785
27844
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -27800,11 +27859,14 @@ var PlateInfoSchema = object({
27800
27859
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
27801
27860
  * dialog already rendering its key FRAME from the `event-media` plane.
27802
27861
  *
27803
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
27804
- * media key directly, so this needed no new plane and no new access decision.
27862
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
27863
+ * resolves a media row by its own id, so this needed no new plane and no new
27864
+ * access decision.
27805
27865
  */
27806
27866
  var MediaFileLiteSchema = object({
27807
- key: string(),
27867
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
27868
+ * (D482). It was the row's composite key, which embedded the owner. */
27869
+ mediaId: number().int(),
27808
27870
  kind: string(),
27809
27871
  url: string(),
27810
27872
  sizeBytes: number(),
@@ -27863,7 +27925,7 @@ method(object({
27863
27925
  }), method(object({
27864
27926
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27865
27927
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27866
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
27928
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
27867
27929
  * INPUT field: stripped by the hub router until the train ships, which
27868
27930
  * resolves to `false` and is exactly the intended default. */
27869
27931
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -29187,7 +29249,14 @@ var SceneReferenceSchema = object({
29187
29249
  modelId: string(),
29188
29250
  condition: SceneConditionSchema,
29189
29251
  capturedAt: number(),
29190
- thumbnailMediaId: string().optional(),
29252
+ /**
29253
+ * The reference thumbnail's media ROW id (D482).
29254
+ *
29255
+ * The name already said `mediaId` while the value was the row's composite
29256
+ * key — a leftover that read as done and was not. It is the row's own id
29257
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
29258
+ */
29259
+ thumbnailMediaId: number().int().optional(),
29191
29260
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
29192
29261
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
29193
29262
  * normalized rect frame a different piece of world, and the scene would
@@ -30635,7 +30704,7 @@ var StationaryObjectSchema = object({
30635
30704
  /** Enrichment label carried from the source track (identity / plate). */
30636
30705
  label: string().optional(),
30637
30706
  /** Native-resolution key-frame media key for the parked object's best image. */
30638
- keyFrameMediaKey: string().optional()
30707
+ keyFrameMediaId: number().int().optional()
30639
30708
  });
30640
30709
  var CameraOccupancySnapshotSchema = object({
30641
30710
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -31791,6 +31860,12 @@ Object.freeze({
31791
31860
  addonId: null,
31792
31861
  access: "create"
31793
31862
  },
31863
+ "dataStoreProvider.upsert": {
31864
+ capName: "data-store-provider",
31865
+ capScope: "system",
31866
+ addonId: null,
31867
+ access: "create"
31868
+ },
31794
31869
  "dayNight.getOptions": {
31795
31870
  capName: "day-night",
31796
31871
  capScope: "device",
@@ -35655,6 +35730,12 @@ Object.freeze({
35655
35730
  addonId: null,
35656
35731
  access: "create"
35657
35732
  },
35733
+ "settingsStore.upsert": {
35734
+ capName: "settings-store",
35735
+ capScope: "system",
35736
+ addonId: null,
35737
+ access: "create"
35738
+ },
35658
35739
  "smtpProvider.getStatus": {
35659
35740
  capName: "smtp-provider",
35660
35741
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.105",
3
+ "version": "1.2.106",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",