@camstack/addon-provider-petkit 0.2.99 → 0.2.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +131 -50
  2. package/dist/addon.mjs +131 -50
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -1101,7 +1101,7 @@ var Nodepetkit = class {
1101
1101
  }
1102
1102
  };
1103
1103
  //#endregion
1104
- //#region ../types/dist/event-category-DAXzJeTX.mjs
1104
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
1105
1105
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
1106
1106
  EventCategory["SystemBoot"] = "system.boot";
1107
1107
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -1662,7 +1662,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1662
1662
  * a package zone — a newly-appeared stationary object of a package class
1663
1663
  * that cleared the class / zone / dwell / size gates. Payload:
1664
1664
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
1665
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
1665
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
1666
1666
  * Telemetry (D8): the durable record is the `package-events` store row;
1667
1667
  * this bus topic drives notifier rules + live UI. See
1668
1668
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -6448,7 +6448,7 @@ var ZodIssueCode = {
6448
6448
  var ZodFirstPartyTypeKind;
6449
6449
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6450
6450
  //#endregion
6451
- //#region ../types/dist/sleep-BnujYGPe.mjs
6451
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
6452
6452
  /**
6453
6453
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6454
6454
  * window to float samples (D455).
@@ -8415,13 +8415,30 @@ new Set([
8415
8415
  "scene",
8416
8416
  "motion",
8417
8417
  "object",
8418
- "audio"
8418
+ "audio",
8419
+ "mosaic"
8419
8420
  ]);
8420
- new Set([
8421
+ /**
8422
+ * The owner types that are event tables, in the order the event-media resolver
8423
+ * should consider them. Exported so a consumer asking "is this key an event?"
8424
+ * does not re-spell the list and drift from it.
8425
+ */
8426
+ var EVENT_OWNER_TYPES = [
8421
8427
  "motion",
8422
8428
  "object",
8423
8429
  "audio"
8424
- ]);
8430
+ ];
8431
+ /**
8432
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
8433
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
8434
+ * `(table, id)`).
8435
+ *
8436
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
8437
+ * table would otherwise be accepted by the codec and refused at the door, with
8438
+ * nothing failing until a caller asked.
8439
+ */
8440
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
8441
+ new Set(EVENT_OWNER_TYPES);
8425
8442
  var EncodeProfileSchema = object({
8426
8443
  video: object({
8427
8444
  codec: _enum([
@@ -13620,6 +13637,16 @@ method(object({
13620
13637
  filter: QueryFilterSchema.optional(),
13621
13638
  columns: array(string()).readonly().optional()
13622
13639
  }), array(SettingsRecordSchema).readonly()), method(object({
13640
+ namespace: string().optional(),
13641
+ collection: string(),
13642
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13643
+ * index on the collection. Never empty. */
13644
+ conflict: array(string()).readonly(),
13645
+ record: BulkRecordSchema
13646
+ }), object({
13647
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13648
+ * row's own id on an update. */
13649
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
13623
13650
  namespace: string().optional(),
13624
13651
  collection: string(),
13625
13652
  record: object({
@@ -13754,6 +13781,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
13754
13781
  id: union([string(), number()]) }), {
13755
13782
  kind: "mutation",
13756
13783
  auth: "admin"
13784
+ }), method(object({
13785
+ namespace: string().optional(),
13786
+ collection: string(),
13787
+ conflict: array(string()).readonly(),
13788
+ record: BulkRecordSchema
13789
+ }), object({ id: union([string(), number()]) }), {
13790
+ kind: "mutation",
13791
+ auth: "admin"
13757
13792
  }), method(object({
13758
13793
  namespace: string().optional(),
13759
13794
  collection: string(),
@@ -20253,8 +20288,8 @@ var TrackPositionSchema = object({
20253
20288
  var TrackSnapshotSchema = object({
20254
20289
  timestamp: number(),
20255
20290
  position: TrackPositionSchema,
20256
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
20257
- mediaKey: string()
20291
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
20292
+ mediaId: number().int()
20258
20293
  });
20259
20294
  /**
20260
20295
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -20858,14 +20893,14 @@ var ObjectEventSchema = object({
20858
20893
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
20859
20894
  frameWidth: number().optional(),
20860
20895
  frameHeight: number().optional(),
20861
- /** MediaStore key for the crop attached to this event (if any). */
20862
- mediaKey: string().optional(),
20863
- /** Design B: MediaStore key of the track's native-resolution key frame (the
20896
+ /** Media row id of the crop attached to this event (if any) — D482. */
20897
+ mediaId: number().int().optional(),
20898
+ /** Design B: media row id of the track's native-resolution key frame (the
20864
20899
  * best-detection full frame). Resolve via the event-media data-plane
20865
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
20900
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
20866
20901
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
20867
- * sources — consumers fall back to `mediaKey` (the tight crop). */
20868
- keyFrameMediaKey: string().optional(),
20902
+ * sources — consumers fall back to `mediaId` (the tight crop). */
20903
+ keyFrameMediaId: number().int().optional(),
20869
20904
  /** Populated by B5 (recording playback URL for this event). */
20870
20905
  mediaUrl: string().optional(),
20871
20906
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -20915,7 +20950,7 @@ var MediaFileKindEnum = _enum([
20915
20950
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
20916
20951
  *
20917
20952
  * `url` points at the `event-media` data plane
20918
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
20953
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
20919
20954
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
20920
20955
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
20921
20956
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -20923,10 +20958,13 @@ var MediaFileKindEnum = _enum([
20923
20958
  * `data-plane-access.ts` for the rule and the one gap it does not close
20924
20959
  * (per-device scoping).
20925
20960
  *
20926
- * The URL is built from the row's **stored** key, which is not always its
20927
- * published `kind`: a track's face/plate crop is stored as `crop` under
20961
+ * The URL is built from the row's own id, which since D482 says nothing about
20962
+ * the row's owner or kind — and that is the point. The published `kind` is not
20963
+ * the stored one (a track's face/plate crop is stored as `crop` under
20928
20964
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
20929
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
20965
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
20966
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
20967
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
20930
20968
  *
20931
20969
  * ## `base64` is TRANSITIONAL and is going away
20932
20970
  *
@@ -20939,7 +20977,19 @@ var MediaFileKindEnum = _enum([
20939
20977
  * `analytics-query-facade.ts`; nothing else reads it.
20940
20978
  */
20941
20979
  var MediaFileSchema = object({
20942
- key: string(),
20980
+ /**
20981
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
20982
+ *
20983
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
20984
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
20985
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
20986
+ * different rows that spell the same number, and a track whose
20987
+ * `bestEventId` was an object event was served a motion event's snapshot —
20988
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
20989
+ * surrogate id cannot name the wrong row's owner, because it names no owner
20990
+ * at all.
20991
+ */
20992
+ mediaId: number().int(),
20943
20993
  kind: MediaFileKindEnum,
20944
20994
  sizeBytes: number(),
20945
20995
  timestamp: number()
@@ -21047,7 +21097,7 @@ var RetrainTrackSchema = object({
21047
21097
  });
21048
21098
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
21049
21099
  var RetrainFrameCandidateSchema = object({
21050
- mediaKey: string(),
21100
+ mediaId: number().int(),
21051
21101
  kind: MediaFileKindEnum,
21052
21102
  timestamp: number(),
21053
21103
  sizeBytes: number().int(),
@@ -21061,7 +21111,7 @@ var RetrainFrameSchema = object({
21061
21111
  deviceId: number(),
21062
21112
  trackId: string(),
21063
21113
  /** Provenance only. It may already point at nothing — that is expected. */
21064
- sourceMediaKey: string(),
21114
+ sourceMediaId: number().int(),
21065
21115
  sourceKind: MediaFileKindEnum,
21066
21116
  sizeBytes: number().int(),
21067
21117
  width: number().int(),
@@ -21077,7 +21127,7 @@ var RetrainCopyRefusalSchema = _enum([
21077
21127
  var RetrainFrameSelectionSchema = object({
21078
21128
  copied: array(RetrainFrameSchema).readonly(),
21079
21129
  refused: array(object({
21080
- sourceMediaKey: string(),
21130
+ sourceMediaId: number().int(),
21081
21131
  reason: RetrainCopyRefusalSchema
21082
21132
  })).readonly()
21083
21133
  });
@@ -21085,7 +21135,7 @@ var RetrainFrameListSchema = object({
21085
21135
  candidates: array(RetrainFrameCandidateSchema).readonly(),
21086
21136
  copies: array(RetrainFrameSchema).readonly(),
21087
21137
  /** What the page pre-selects — the native key frame when one survives. */
21088
- autoPickMediaKey: string().optional()
21138
+ autoPickMediaId: number().int().optional()
21089
21139
  });
21090
21140
  /** What the operator asked the assist to look for. */
21091
21141
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -21180,9 +21230,11 @@ var RecentTracksQueryInput = object({
21180
21230
  });
21181
21231
  /**
21182
21232
  * A Summary (D359): the per-camera session envelope that references tracks.
21183
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
21184
- * served by the event-media plane by key), null until the first frame with a
21185
- * member visible has been materialised.
21233
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
21234
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
21235
+ * first frame with a member visible has been materialised (D482 — it was the
21236
+ * row's composite key, which embedded the owner and could name another table's
21237
+ * row once event ids became per-table rowids).
21186
21238
  */
21187
21239
  var SummarySchema = object({
21188
21240
  id: string(),
@@ -21191,7 +21243,7 @@ var SummarySchema = object({
21191
21243
  lastActiveAt: number(),
21192
21244
  sealedAt: number().nullable(),
21193
21245
  memberCount: number().int().nonnegative(),
21194
- groupShotKey: string().nullable()
21246
+ groupShotMediaId: number().int().nullable()
21195
21247
  });
21196
21248
  var SummariesQueryInput = object({
21197
21249
  deviceIds: array(number()).min(1),
@@ -21745,7 +21797,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21745
21797
  }), method(object({
21746
21798
  deviceId: number(),
21747
21799
  trackId: string(),
21748
- mediaKeys: array(string()).min(1)
21800
+ mediaIds: array(number().int()).min(1)
21749
21801
  }), RetrainFrameSelectionSchema, {
21750
21802
  kind: "mutation",
21751
21803
  auth: "admin"
@@ -21813,7 +21865,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21813
21865
  kind: "query",
21814
21866
  auth: "admin"
21815
21867
  }), method(object({
21816
- eventId: string(),
21868
+ /** Which of the three event tables owns the row. */
21869
+ ownerType: EventOwnerTypeSchema,
21870
+ /** The event's rowid in that table (D474: an event id is a number). */
21871
+ eventId: number().int(),
21817
21872
  kind: MediaFileKindEnum.optional(),
21818
21873
  deviceId: number()
21819
21874
  }), array(MediaFileSchema).readonly()), method(object({
@@ -21824,7 +21879,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21824
21879
  trackId: string(),
21825
21880
  deviceId: number()
21826
21881
  }), array(MediaFileInfoSchema).readonly()), method(object({
21827
- eventId: string(),
21882
+ ownerType: EventOwnerTypeSchema,
21883
+ eventId: number().int(),
21828
21884
  deviceId: number()
21829
21885
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
21830
21886
  kind: "mutation",
@@ -27025,8 +27081,8 @@ var IdentitySchema = object({
27025
27081
  id: string(),
27026
27082
  name: string(),
27027
27083
  sampleCount: number().int().nonnegative(),
27028
- coverMediaKey: string().optional(),
27029
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
27084
+ coverMediaId: number().int().optional(),
27085
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
27030
27086
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
27031
27087
  coverBase64: string().optional()
27032
27088
  });
@@ -27052,8 +27108,8 @@ var IdentitySampleAuditRowSchema = object({
27052
27108
  enrolledAt: number().int(),
27053
27109
  deviceId: number().int().optional(),
27054
27110
  source: _enum(["detected", "photo"]),
27055
- /** The enrolled crop's media key, so the panel can show the evidence. */
27056
- mediaKey: string().optional(),
27111
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
27112
+ mediaId: number().int().optional(),
27057
27113
  /**
27058
27114
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
27059
27115
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -27122,15 +27178,15 @@ var FaceInfoSchema = object({
27122
27178
  */
27123
27179
  cropUrl: string().optional(),
27124
27180
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
27125
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
27181
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
27126
27182
  * legacy rows written before design B. */
27127
27183
  faceBbox: BoundingBoxSchema.optional(),
27128
27184
  /** Design B: MediaStore key of the track's native-resolution key frame.
27129
27185
  * Fetch the native JPEG via the event-media data-plane
27130
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
27186
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
27131
27187
  * track produced no key frame (e.g. native/onboard source) — the UI falls
27132
27188
  * back to the inline `base64` face crop. */
27133
- keyFrameMediaKey: string().optional(),
27189
+ keyFrameMediaId: number().int().optional(),
27134
27190
  /** Winning identity-match cosine (0..1) for this face's track, when an
27135
27191
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
27136
27192
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -27199,11 +27255,14 @@ var FaceClusterSchema = object({
27199
27255
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
27200
27256
  * dialog already rendering its key FRAME from the `event-media` plane.
27201
27257
  *
27202
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
27203
- * media key directly, so this needed no new plane and no new access decision.
27258
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
27259
+ * resolves a media row by its own id, so this needed no new plane and no new
27260
+ * access decision.
27204
27261
  */
27205
27262
  var MediaFileLiteSchema$1 = object({
27206
- key: string(),
27263
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
27264
+ * (D482). It was the row's composite key, which embedded the owner. */
27265
+ mediaId: number().int(),
27207
27266
  kind: string(),
27208
27267
  url: string(),
27209
27268
  sizeBytes: number(),
@@ -27220,7 +27279,7 @@ method(object({
27220
27279
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
27221
27280
  * four times and the viewer holds at `staleTime: 30_000`.
27222
27281
  *
27223
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
27282
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
27224
27283
  * the `event-media` plane serves that key `immutable` with an ETag.
27225
27284
  *
27226
27285
  * **This is an INPUT field, so it does not reach the addon until the
@@ -30583,8 +30642,8 @@ var VehicleSchema = object({
30583
30642
  id: string(),
30584
30643
  name: string(),
30585
30644
  sampleCount: number().int().nonnegative(),
30586
- coverMediaKey: string().optional(),
30587
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
30645
+ coverMediaId: number().int().optional(),
30646
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
30588
30647
  coverBase64: string().optional()
30589
30648
  });
30590
30649
  var VehicleSampleInfoSchema = object({
@@ -30617,7 +30676,7 @@ var PlateInfoSchema = object({
30617
30676
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
30618
30677
  plateBbox: BoundingBoxSchema.optional(),
30619
30678
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
30620
- keyFrameMediaKey: string().optional(),
30679
+ keyFrameMediaId: number().int().optional(),
30621
30680
  base64: string().optional(),
30622
30681
  /**
30623
30682
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -30638,11 +30697,14 @@ var PlateInfoSchema = object({
30638
30697
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
30639
30698
  * dialog already rendering its key FRAME from the `event-media` plane.
30640
30699
  *
30641
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
30642
- * media key directly, so this needed no new plane and no new access decision.
30700
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
30701
+ * resolves a media row by its own id, so this needed no new plane and no new
30702
+ * access decision.
30643
30703
  */
30644
30704
  var MediaFileLiteSchema = object({
30645
- key: string(),
30705
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
30706
+ * (D482). It was the row's composite key, which embedded the owner. */
30707
+ mediaId: number().int(),
30646
30708
  kind: string(),
30647
30709
  url: string(),
30648
30710
  sizeBytes: number(),
@@ -30701,7 +30763,7 @@ method(object({
30701
30763
  }), method(object({
30702
30764
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
30703
30765
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
30704
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
30766
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
30705
30767
  * INPUT field: stripped by the hub router until the train ships, which
30706
30768
  * resolves to `false` and is exactly the intended default. */
30707
30769
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -32270,7 +32332,14 @@ var SceneReferenceSchema = object({
32270
32332
  modelId: string(),
32271
32333
  condition: SceneConditionSchema,
32272
32334
  capturedAt: number(),
32273
- thumbnailMediaId: string().optional(),
32335
+ /**
32336
+ * The reference thumbnail's media ROW id (D482).
32337
+ *
32338
+ * The name already said `mediaId` while the value was the row's composite
32339
+ * key — a leftover that read as done and was not. It is the row's own id
32340
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
32341
+ */
32342
+ thumbnailMediaId: number().int().optional(),
32274
32343
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
32275
32344
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
32276
32345
  * normalized rect frame a different piece of world, and the scene would
@@ -34254,7 +34323,7 @@ var StationaryObjectSchema = object({
34254
34323
  /** Enrichment label carried from the source track (identity / plate). */
34255
34324
  label: string().optional(),
34256
34325
  /** Native-resolution key-frame media key for the parked object's best image. */
34257
- keyFrameMediaKey: string().optional()
34326
+ keyFrameMediaId: number().int().optional()
34258
34327
  });
34259
34328
  var CameraOccupancySnapshotSchema = object({
34260
34329
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36992,6 +37061,12 @@ Object.freeze({
36992
37061
  addonId: null,
36993
37062
  access: "create"
36994
37063
  },
37064
+ "dataStoreProvider.upsert": {
37065
+ capName: "data-store-provider",
37066
+ capScope: "system",
37067
+ addonId: null,
37068
+ access: "create"
37069
+ },
36995
37070
  "dayNight.getOptions": {
36996
37071
  capName: "day-night",
36997
37072
  capScope: "device",
@@ -40856,6 +40931,12 @@ Object.freeze({
40856
40931
  addonId: null,
40857
40932
  access: "create"
40858
40933
  },
40934
+ "settingsStore.upsert": {
40935
+ capName: "settings-store",
40936
+ capScope: "system",
40937
+ addonId: null,
40938
+ access: "create"
40939
+ },
40859
40940
  "smtpProvider.getStatus": {
40860
40941
  capName: "smtp-provider",
40861
40942
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -1100,7 +1100,7 @@ var Nodepetkit = class {
1100
1100
  }
1101
1101
  };
1102
1102
  //#endregion
1103
- //#region ../types/dist/event-category-DAXzJeTX.mjs
1103
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
1104
1104
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
1105
1105
  EventCategory["SystemBoot"] = "system.boot";
1106
1106
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -1661,7 +1661,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1661
1661
  * a package zone — a newly-appeared stationary object of a package class
1662
1662
  * that cleared the class / zone / dwell / size gates. Payload:
1663
1663
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
1664
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
1664
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
1665
1665
  * Telemetry (D8): the durable record is the `package-events` store row;
1666
1666
  * this bus topic drives notifier rules + live UI. See
1667
1667
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -6447,7 +6447,7 @@ var ZodIssueCode = {
6447
6447
  var ZodFirstPartyTypeKind;
6448
6448
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6449
6449
  //#endregion
6450
- //#region ../types/dist/sleep-BnujYGPe.mjs
6450
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
6451
6451
  /**
6452
6452
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6453
6453
  * window to float samples (D455).
@@ -8414,13 +8414,30 @@ new Set([
8414
8414
  "scene",
8415
8415
  "motion",
8416
8416
  "object",
8417
- "audio"
8417
+ "audio",
8418
+ "mosaic"
8418
8419
  ]);
8419
- new Set([
8420
+ /**
8421
+ * The owner types that are event tables, in the order the event-media resolver
8422
+ * should consider them. Exported so a consumer asking "is this key an event?"
8423
+ * does not re-spell the list and drift from it.
8424
+ */
8425
+ var EVENT_OWNER_TYPES = [
8420
8426
  "motion",
8421
8427
  "object",
8422
8428
  "audio"
8423
- ]);
8429
+ ];
8430
+ /**
8431
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
8432
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
8433
+ * `(table, id)`).
8434
+ *
8435
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
8436
+ * table would otherwise be accepted by the codec and refused at the door, with
8437
+ * nothing failing until a caller asked.
8438
+ */
8439
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
8440
+ new Set(EVENT_OWNER_TYPES);
8424
8441
  var EncodeProfileSchema = object({
8425
8442
  video: object({
8426
8443
  codec: _enum([
@@ -13619,6 +13636,16 @@ method(object({
13619
13636
  filter: QueryFilterSchema.optional(),
13620
13637
  columns: array(string()).readonly().optional()
13621
13638
  }), array(SettingsRecordSchema).readonly()), method(object({
13639
+ namespace: string().optional(),
13640
+ collection: string(),
13641
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13642
+ * index on the collection. Never empty. */
13643
+ conflict: array(string()).readonly(),
13644
+ record: BulkRecordSchema
13645
+ }), object({
13646
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13647
+ * row's own id on an update. */
13648
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
13622
13649
  namespace: string().optional(),
13623
13650
  collection: string(),
13624
13651
  record: object({
@@ -13753,6 +13780,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
13753
13780
  id: union([string(), number()]) }), {
13754
13781
  kind: "mutation",
13755
13782
  auth: "admin"
13783
+ }), method(object({
13784
+ namespace: string().optional(),
13785
+ collection: string(),
13786
+ conflict: array(string()).readonly(),
13787
+ record: BulkRecordSchema
13788
+ }), object({ id: union([string(), number()]) }), {
13789
+ kind: "mutation",
13790
+ auth: "admin"
13756
13791
  }), method(object({
13757
13792
  namespace: string().optional(),
13758
13793
  collection: string(),
@@ -20252,8 +20287,8 @@ var TrackPositionSchema = object({
20252
20287
  var TrackSnapshotSchema = object({
20253
20288
  timestamp: number(),
20254
20289
  position: TrackPositionSchema,
20255
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
20256
- mediaKey: string()
20290
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
20291
+ mediaId: number().int()
20257
20292
  });
20258
20293
  /**
20259
20294
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -20857,14 +20892,14 @@ var ObjectEventSchema = object({
20857
20892
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
20858
20893
  frameWidth: number().optional(),
20859
20894
  frameHeight: number().optional(),
20860
- /** MediaStore key for the crop attached to this event (if any). */
20861
- mediaKey: string().optional(),
20862
- /** Design B: MediaStore key of the track's native-resolution key frame (the
20895
+ /** Media row id of the crop attached to this event (if any) — D482. */
20896
+ mediaId: number().int().optional(),
20897
+ /** Design B: media row id of the track's native-resolution key frame (the
20863
20898
  * best-detection full frame). Resolve via the event-media data-plane
20864
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
20899
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
20865
20900
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
20866
- * sources — consumers fall back to `mediaKey` (the tight crop). */
20867
- keyFrameMediaKey: string().optional(),
20901
+ * sources — consumers fall back to `mediaId` (the tight crop). */
20902
+ keyFrameMediaId: number().int().optional(),
20868
20903
  /** Populated by B5 (recording playback URL for this event). */
20869
20904
  mediaUrl: string().optional(),
20870
20905
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -20914,7 +20949,7 @@ var MediaFileKindEnum = _enum([
20914
20949
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
20915
20950
  *
20916
20951
  * `url` points at the `event-media` data plane
20917
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
20952
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
20918
20953
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
20919
20954
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
20920
20955
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -20922,10 +20957,13 @@ var MediaFileKindEnum = _enum([
20922
20957
  * `data-plane-access.ts` for the rule and the one gap it does not close
20923
20958
  * (per-device scoping).
20924
20959
  *
20925
- * The URL is built from the row's **stored** key, which is not always its
20926
- * published `kind`: a track's face/plate crop is stored as `crop` under
20960
+ * The URL is built from the row's own id, which since D482 says nothing about
20961
+ * the row's owner or kind — and that is the point. The published `kind` is not
20962
+ * the stored one (a track's face/plate crop is stored as `crop` under
20927
20963
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
20928
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
20964
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
20965
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
20966
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
20929
20967
  *
20930
20968
  * ## `base64` is TRANSITIONAL and is going away
20931
20969
  *
@@ -20938,7 +20976,19 @@ var MediaFileKindEnum = _enum([
20938
20976
  * `analytics-query-facade.ts`; nothing else reads it.
20939
20977
  */
20940
20978
  var MediaFileSchema = object({
20941
- key: string(),
20979
+ /**
20980
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
20981
+ *
20982
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
20983
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
20984
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
20985
+ * different rows that spell the same number, and a track whose
20986
+ * `bestEventId` was an object event was served a motion event's snapshot —
20987
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
20988
+ * surrogate id cannot name the wrong row's owner, because it names no owner
20989
+ * at all.
20990
+ */
20991
+ mediaId: number().int(),
20942
20992
  kind: MediaFileKindEnum,
20943
20993
  sizeBytes: number(),
20944
20994
  timestamp: number()
@@ -21046,7 +21096,7 @@ var RetrainTrackSchema = object({
21046
21096
  });
21047
21097
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
21048
21098
  var RetrainFrameCandidateSchema = object({
21049
- mediaKey: string(),
21099
+ mediaId: number().int(),
21050
21100
  kind: MediaFileKindEnum,
21051
21101
  timestamp: number(),
21052
21102
  sizeBytes: number().int(),
@@ -21060,7 +21110,7 @@ var RetrainFrameSchema = object({
21060
21110
  deviceId: number(),
21061
21111
  trackId: string(),
21062
21112
  /** Provenance only. It may already point at nothing — that is expected. */
21063
- sourceMediaKey: string(),
21113
+ sourceMediaId: number().int(),
21064
21114
  sourceKind: MediaFileKindEnum,
21065
21115
  sizeBytes: number().int(),
21066
21116
  width: number().int(),
@@ -21076,7 +21126,7 @@ var RetrainCopyRefusalSchema = _enum([
21076
21126
  var RetrainFrameSelectionSchema = object({
21077
21127
  copied: array(RetrainFrameSchema).readonly(),
21078
21128
  refused: array(object({
21079
- sourceMediaKey: string(),
21129
+ sourceMediaId: number().int(),
21080
21130
  reason: RetrainCopyRefusalSchema
21081
21131
  })).readonly()
21082
21132
  });
@@ -21084,7 +21134,7 @@ var RetrainFrameListSchema = object({
21084
21134
  candidates: array(RetrainFrameCandidateSchema).readonly(),
21085
21135
  copies: array(RetrainFrameSchema).readonly(),
21086
21136
  /** What the page pre-selects — the native key frame when one survives. */
21087
- autoPickMediaKey: string().optional()
21137
+ autoPickMediaId: number().int().optional()
21088
21138
  });
21089
21139
  /** What the operator asked the assist to look for. */
21090
21140
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -21179,9 +21229,11 @@ var RecentTracksQueryInput = object({
21179
21229
  });
21180
21230
  /**
21181
21231
  * A Summary (D359): the per-camera session envelope that references tracks.
21182
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
21183
- * served by the event-media plane by key), null until the first frame with a
21184
- * member visible has been materialised.
21232
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
21233
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
21234
+ * first frame with a member visible has been materialised (D482 — it was the
21235
+ * row's composite key, which embedded the owner and could name another table's
21236
+ * row once event ids became per-table rowids).
21185
21237
  */
21186
21238
  var SummarySchema = object({
21187
21239
  id: string(),
@@ -21190,7 +21242,7 @@ var SummarySchema = object({
21190
21242
  lastActiveAt: number(),
21191
21243
  sealedAt: number().nullable(),
21192
21244
  memberCount: number().int().nonnegative(),
21193
- groupShotKey: string().nullable()
21245
+ groupShotMediaId: number().int().nullable()
21194
21246
  });
21195
21247
  var SummariesQueryInput = object({
21196
21248
  deviceIds: array(number()).min(1),
@@ -21744,7 +21796,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21744
21796
  }), method(object({
21745
21797
  deviceId: number(),
21746
21798
  trackId: string(),
21747
- mediaKeys: array(string()).min(1)
21799
+ mediaIds: array(number().int()).min(1)
21748
21800
  }), RetrainFrameSelectionSchema, {
21749
21801
  kind: "mutation",
21750
21802
  auth: "admin"
@@ -21812,7 +21864,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21812
21864
  kind: "query",
21813
21865
  auth: "admin"
21814
21866
  }), method(object({
21815
- eventId: string(),
21867
+ /** Which of the three event tables owns the row. */
21868
+ ownerType: EventOwnerTypeSchema,
21869
+ /** The event's rowid in that table (D474: an event id is a number). */
21870
+ eventId: number().int(),
21816
21871
  kind: MediaFileKindEnum.optional(),
21817
21872
  deviceId: number()
21818
21873
  }), array(MediaFileSchema).readonly()), method(object({
@@ -21823,7 +21878,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21823
21878
  trackId: string(),
21824
21879
  deviceId: number()
21825
21880
  }), array(MediaFileInfoSchema).readonly()), method(object({
21826
- eventId: string(),
21881
+ ownerType: EventOwnerTypeSchema,
21882
+ eventId: number().int(),
21827
21883
  deviceId: number()
21828
21884
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
21829
21885
  kind: "mutation",
@@ -27024,8 +27080,8 @@ var IdentitySchema = object({
27024
27080
  id: string(),
27025
27081
  name: string(),
27026
27082
  sampleCount: number().int().nonnegative(),
27027
- coverMediaKey: string().optional(),
27028
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
27083
+ coverMediaId: number().int().optional(),
27084
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
27029
27085
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
27030
27086
  coverBase64: string().optional()
27031
27087
  });
@@ -27051,8 +27107,8 @@ var IdentitySampleAuditRowSchema = object({
27051
27107
  enrolledAt: number().int(),
27052
27108
  deviceId: number().int().optional(),
27053
27109
  source: _enum(["detected", "photo"]),
27054
- /** The enrolled crop's media key, so the panel can show the evidence. */
27055
- mediaKey: string().optional(),
27110
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
27111
+ mediaId: number().int().optional(),
27056
27112
  /**
27057
27113
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
27058
27114
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -27121,15 +27177,15 @@ var FaceInfoSchema = object({
27121
27177
  */
27122
27178
  cropUrl: string().optional(),
27123
27179
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
27124
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
27180
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
27125
27181
  * legacy rows written before design B. */
27126
27182
  faceBbox: BoundingBoxSchema.optional(),
27127
27183
  /** Design B: MediaStore key of the track's native-resolution key frame.
27128
27184
  * Fetch the native JPEG via the event-media data-plane
27129
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
27185
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
27130
27186
  * track produced no key frame (e.g. native/onboard source) — the UI falls
27131
27187
  * back to the inline `base64` face crop. */
27132
- keyFrameMediaKey: string().optional(),
27188
+ keyFrameMediaId: number().int().optional(),
27133
27189
  /** Winning identity-match cosine (0..1) for this face's track, when an
27134
27190
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
27135
27191
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -27198,11 +27254,14 @@ var FaceClusterSchema = object({
27198
27254
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
27199
27255
  * dialog already rendering its key FRAME from the `event-media` plane.
27200
27256
  *
27201
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
27202
- * media key directly, so this needed no new plane and no new access decision.
27257
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
27258
+ * resolves a media row by its own id, so this needed no new plane and no new
27259
+ * access decision.
27203
27260
  */
27204
27261
  var MediaFileLiteSchema$1 = object({
27205
- key: string(),
27262
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
27263
+ * (D482). It was the row's composite key, which embedded the owner. */
27264
+ mediaId: number().int(),
27206
27265
  kind: string(),
27207
27266
  url: string(),
27208
27267
  sizeBytes: number(),
@@ -27219,7 +27278,7 @@ method(object({
27219
27278
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
27220
27279
  * four times and the viewer holds at `staleTime: 30_000`.
27221
27280
  *
27222
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
27281
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
27223
27282
  * the `event-media` plane serves that key `immutable` with an ETag.
27224
27283
  *
27225
27284
  * **This is an INPUT field, so it does not reach the addon until the
@@ -30582,8 +30641,8 @@ var VehicleSchema = object({
30582
30641
  id: string(),
30583
30642
  name: string(),
30584
30643
  sampleCount: number().int().nonnegative(),
30585
- coverMediaKey: string().optional(),
30586
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
30644
+ coverMediaId: number().int().optional(),
30645
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
30587
30646
  coverBase64: string().optional()
30588
30647
  });
30589
30648
  var VehicleSampleInfoSchema = object({
@@ -30616,7 +30675,7 @@ var PlateInfoSchema = object({
30616
30675
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
30617
30676
  plateBbox: BoundingBoxSchema.optional(),
30618
30677
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
30619
- keyFrameMediaKey: string().optional(),
30678
+ keyFrameMediaId: number().int().optional(),
30620
30679
  base64: string().optional(),
30621
30680
  /**
30622
30681
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -30637,11 +30696,14 @@ var PlateInfoSchema = object({
30637
30696
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
30638
30697
  * dialog already rendering its key FRAME from the `event-media` plane.
30639
30698
  *
30640
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
30641
- * media key directly, so this needed no new plane and no new access decision.
30699
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
30700
+ * resolves a media row by its own id, so this needed no new plane and no new
30701
+ * access decision.
30642
30702
  */
30643
30703
  var MediaFileLiteSchema = object({
30644
- key: string(),
30704
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
30705
+ * (D482). It was the row's composite key, which embedded the owner. */
30706
+ mediaId: number().int(),
30645
30707
  kind: string(),
30646
30708
  url: string(),
30647
30709
  sizeBytes: number(),
@@ -30700,7 +30762,7 @@ method(object({
30700
30762
  }), method(object({
30701
30763
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
30702
30764
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
30703
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
30765
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
30704
30766
  * INPUT field: stripped by the hub router until the train ships, which
30705
30767
  * resolves to `false` and is exactly the intended default. */
30706
30768
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -32269,7 +32331,14 @@ var SceneReferenceSchema = object({
32269
32331
  modelId: string(),
32270
32332
  condition: SceneConditionSchema,
32271
32333
  capturedAt: number(),
32272
- thumbnailMediaId: string().optional(),
32334
+ /**
32335
+ * The reference thumbnail's media ROW id (D482).
32336
+ *
32337
+ * The name already said `mediaId` while the value was the row's composite
32338
+ * key — a leftover that read as done and was not. It is the row's own id
32339
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
32340
+ */
32341
+ thumbnailMediaId: number().int().optional(),
32273
32342
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
32274
32343
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
32275
32344
  * normalized rect frame a different piece of world, and the scene would
@@ -34253,7 +34322,7 @@ var StationaryObjectSchema = object({
34253
34322
  /** Enrichment label carried from the source track (identity / plate). */
34254
34323
  label: string().optional(),
34255
34324
  /** Native-resolution key-frame media key for the parked object's best image. */
34256
- keyFrameMediaKey: string().optional()
34325
+ keyFrameMediaId: number().int().optional()
34257
34326
  });
34258
34327
  var CameraOccupancySnapshotSchema = object({
34259
34328
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36991,6 +37060,12 @@ Object.freeze({
36991
37060
  addonId: null,
36992
37061
  access: "create"
36993
37062
  },
37063
+ "dataStoreProvider.upsert": {
37064
+ capName: "data-store-provider",
37065
+ capScope: "system",
37066
+ addonId: null,
37067
+ access: "create"
37068
+ },
36994
37069
  "dayNight.getOptions": {
36995
37070
  capName: "day-night",
36996
37071
  capScope: "device",
@@ -40855,6 +40930,12 @@ Object.freeze({
40855
40930
  addonId: null,
40856
40931
  access: "create"
40857
40932
  },
40933
+ "settingsStore.upsert": {
40934
+ capName: "settings-store",
40935
+ capScope: "system",
40936
+ addonId: null,
40937
+ access: "create"
40938
+ },
40858
40939
  "smtpProvider.getStatus": {
40859
40940
  capName: "smtp-provider",
40860
40941
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-petkit",
3
- "version": "0.2.99",
3
+ "version": "0.2.100",
4
4
  "description": "PetKit smart-feeder device-provider addon for CamStack — wraps the @apocaliss92/nodepetkit PetKit cloud client",
5
5
  "keywords": [
6
6
  "camstack",