@camstack/addon-provider-amcrest 0.2.100 → 0.2.102

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
@@ -6,7 +6,7 @@ let node_crypto = require("node:crypto");
6
6
  let node_http = require("node:http");
7
7
  let node_https = require("node:https");
8
8
  let node_os = require("node:os");
9
- //#region ../types/dist/event-category-DAXzJeTX.mjs
9
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
10
10
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
11
11
  EventCategory["SystemBoot"] = "system.boot";
12
12
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -567,7 +567,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
567
567
  * a package zone — a newly-appeared stationary object of a package class
568
568
  * that cleared the class / zone / dwell / size gates. Payload:
569
569
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
570
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
570
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
571
571
  * Telemetry (D8): the durable record is the `package-events` store row;
572
572
  * this bus topic drives notifier rules + live UI. See
573
573
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5353,7 +5353,7 @@ var ZodIssueCode = {
5353
5353
  var ZodFirstPartyTypeKind;
5354
5354
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5355
5355
  //#endregion
5356
- //#region ../types/dist/sleep-BnujYGPe.mjs
5356
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5357
5357
  /**
5358
5358
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5359
5359
  * window to float samples (D455).
@@ -7308,13 +7308,30 @@ new Set([
7308
7308
  "scene",
7309
7309
  "motion",
7310
7310
  "object",
7311
- "audio"
7311
+ "audio",
7312
+ "mosaic"
7312
7313
  ]);
7313
- new Set([
7314
+ /**
7315
+ * The owner types that are event tables, in the order the event-media resolver
7316
+ * should consider them. Exported so a consumer asking "is this key an event?"
7317
+ * does not re-spell the list and drift from it.
7318
+ */
7319
+ var EVENT_OWNER_TYPES = [
7314
7320
  "motion",
7315
7321
  "object",
7316
7322
  "audio"
7317
- ]);
7323
+ ];
7324
+ /**
7325
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7326
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7327
+ * `(table, id)`).
7328
+ *
7329
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7330
+ * table would otherwise be accepted by the codec and refused at the door, with
7331
+ * nothing failing until a caller asked.
7332
+ */
7333
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7334
+ new Set(EVENT_OWNER_TYPES);
7318
7335
  var EncodeProfileSchema = object({
7319
7336
  video: object({
7320
7337
  codec: _enum([
@@ -12513,6 +12530,16 @@ method(object({
12513
12530
  filter: QueryFilterSchema.optional(),
12514
12531
  columns: array(string()).readonly().optional()
12515
12532
  }), array(SettingsRecordSchema).readonly()), method(object({
12533
+ namespace: string().optional(),
12534
+ collection: string(),
12535
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12536
+ * index on the collection. Never empty. */
12537
+ conflict: array(string()).readonly(),
12538
+ record: BulkRecordSchema
12539
+ }), object({
12540
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12541
+ * row's own id on an update. */
12542
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12516
12543
  namespace: string().optional(),
12517
12544
  collection: string(),
12518
12545
  record: object({
@@ -12647,6 +12674,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12647
12674
  id: union([string(), number()]) }), {
12648
12675
  kind: "mutation",
12649
12676
  auth: "admin"
12677
+ }), method(object({
12678
+ namespace: string().optional(),
12679
+ collection: string(),
12680
+ conflict: array(string()).readonly(),
12681
+ record: BulkRecordSchema
12682
+ }), object({ id: union([string(), number()]) }), {
12683
+ kind: "mutation",
12684
+ auth: "admin"
12650
12685
  }), method(object({
12651
12686
  namespace: string().optional(),
12652
12687
  collection: string(),
@@ -19129,8 +19164,8 @@ var TrackPositionSchema = object({
19129
19164
  var TrackSnapshotSchema = object({
19130
19165
  timestamp: number(),
19131
19166
  position: TrackPositionSchema,
19132
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19133
- mediaKey: string()
19167
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19168
+ mediaId: number().int()
19134
19169
  });
19135
19170
  /**
19136
19171
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19734,14 +19769,14 @@ var ObjectEventSchema = object({
19734
19769
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19735
19770
  frameWidth: number().optional(),
19736
19771
  frameHeight: number().optional(),
19737
- /** MediaStore key for the crop attached to this event (if any). */
19738
- mediaKey: string().optional(),
19739
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19772
+ /** Media row id of the crop attached to this event (if any) — D482. */
19773
+ mediaId: number().int().optional(),
19774
+ /** Design B: media row id of the track's native-resolution key frame (the
19740
19775
  * best-detection full frame). Resolve via the event-media data-plane
19741
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19776
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19742
19777
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19743
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19744
- keyFrameMediaKey: string().optional(),
19778
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19779
+ keyFrameMediaId: number().int().optional(),
19745
19780
  /** Populated by B5 (recording playback URL for this event). */
19746
19781
  mediaUrl: string().optional(),
19747
19782
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19791,7 +19826,7 @@ var MediaFileKindEnum = _enum([
19791
19826
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19792
19827
  *
19793
19828
  * `url` points at the `event-media` data plane
19794
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19829
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19795
19830
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19796
19831
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19797
19832
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19799,10 +19834,13 @@ var MediaFileKindEnum = _enum([
19799
19834
  * `data-plane-access.ts` for the rule and the one gap it does not close
19800
19835
  * (per-device scoping).
19801
19836
  *
19802
- * The URL is built from the row's **stored** key, which is not always its
19803
- * published `kind`: a track's face/plate crop is stored as `crop` under
19837
+ * The URL is built from the row's own id, which since D482 says nothing about
19838
+ * the row's owner or kind — and that is the point. The published `kind` is not
19839
+ * the stored one (a track's face/plate crop is stored as `crop` under
19804
19840
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19805
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19841
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19842
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19843
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19806
19844
  *
19807
19845
  * ## `base64` is TRANSITIONAL and is going away
19808
19846
  *
@@ -19815,7 +19853,19 @@ var MediaFileKindEnum = _enum([
19815
19853
  * `analytics-query-facade.ts`; nothing else reads it.
19816
19854
  */
19817
19855
  var MediaFileSchema = object({
19818
- key: string(),
19856
+ /**
19857
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19858
+ *
19859
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19860
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19861
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19862
+ * different rows that spell the same number, and a track whose
19863
+ * `bestEventId` was an object event was served a motion event's snapshot —
19864
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19865
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19866
+ * at all.
19867
+ */
19868
+ mediaId: number().int(),
19819
19869
  kind: MediaFileKindEnum,
19820
19870
  sizeBytes: number(),
19821
19871
  timestamp: number()
@@ -19923,7 +19973,7 @@ var RetrainTrackSchema = object({
19923
19973
  });
19924
19974
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19925
19975
  var RetrainFrameCandidateSchema = object({
19926
- mediaKey: string(),
19976
+ mediaId: number().int(),
19927
19977
  kind: MediaFileKindEnum,
19928
19978
  timestamp: number(),
19929
19979
  sizeBytes: number().int(),
@@ -19937,7 +19987,7 @@ var RetrainFrameSchema = object({
19937
19987
  deviceId: number(),
19938
19988
  trackId: string(),
19939
19989
  /** Provenance only. It may already point at nothing — that is expected. */
19940
- sourceMediaKey: string(),
19990
+ sourceMediaId: number().int(),
19941
19991
  sourceKind: MediaFileKindEnum,
19942
19992
  sizeBytes: number().int(),
19943
19993
  width: number().int(),
@@ -19953,7 +20003,7 @@ var RetrainCopyRefusalSchema = _enum([
19953
20003
  var RetrainFrameSelectionSchema = object({
19954
20004
  copied: array(RetrainFrameSchema).readonly(),
19955
20005
  refused: array(object({
19956
- sourceMediaKey: string(),
20006
+ sourceMediaId: number().int(),
19957
20007
  reason: RetrainCopyRefusalSchema
19958
20008
  })).readonly()
19959
20009
  });
@@ -19961,7 +20011,7 @@ var RetrainFrameListSchema = object({
19961
20011
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19962
20012
  copies: array(RetrainFrameSchema).readonly(),
19963
20013
  /** What the page pre-selects — the native key frame when one survives. */
19964
- autoPickMediaKey: string().optional()
20014
+ autoPickMediaId: number().int().optional()
19965
20015
  });
19966
20016
  /** What the operator asked the assist to look for. */
19967
20017
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20056,9 +20106,11 @@ var RecentTracksQueryInput = object({
20056
20106
  });
20057
20107
  /**
20058
20108
  * A Summary (D359): the per-camera session envelope that references tracks.
20059
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20060
- * served by the event-media plane by key), null until the first frame with a
20061
- * member visible has been materialised.
20109
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20110
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20111
+ * first frame with a member visible has been materialised (D482 — it was the
20112
+ * row's composite key, which embedded the owner and could name another table's
20113
+ * row once event ids became per-table rowids).
20062
20114
  */
20063
20115
  var SummarySchema = object({
20064
20116
  id: string(),
@@ -20067,7 +20119,7 @@ var SummarySchema = object({
20067
20119
  lastActiveAt: number(),
20068
20120
  sealedAt: number().nullable(),
20069
20121
  memberCount: number().int().nonnegative(),
20070
- groupShotKey: string().nullable()
20122
+ groupShotMediaId: number().int().nullable()
20071
20123
  });
20072
20124
  var SummariesQueryInput = object({
20073
20125
  deviceIds: array(number()).min(1),
@@ -20621,7 +20673,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20621
20673
  }), method(object({
20622
20674
  deviceId: number(),
20623
20675
  trackId: string(),
20624
- mediaKeys: array(string()).min(1)
20676
+ mediaIds: array(number().int()).min(1)
20625
20677
  }), RetrainFrameSelectionSchema, {
20626
20678
  kind: "mutation",
20627
20679
  auth: "admin"
@@ -20689,7 +20741,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20689
20741
  kind: "query",
20690
20742
  auth: "admin"
20691
20743
  }), method(object({
20692
- eventId: string(),
20744
+ /** Which of the three event tables owns the row. */
20745
+ ownerType: EventOwnerTypeSchema,
20746
+ /** The event's rowid in that table (D474: an event id is a number). */
20747
+ eventId: number().int(),
20693
20748
  kind: MediaFileKindEnum.optional(),
20694
20749
  deviceId: number()
20695
20750
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20700,7 +20755,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20700
20755
  trackId: string(),
20701
20756
  deviceId: number()
20702
20757
  }), array(MediaFileInfoSchema).readonly()), method(object({
20703
- eventId: string(),
20758
+ ownerType: EventOwnerTypeSchema,
20759
+ eventId: number().int(),
20704
20760
  deviceId: number()
20705
20761
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20706
20762
  kind: "mutation",
@@ -25997,8 +26053,8 @@ var IdentitySchema = object({
25997
26053
  id: string(),
25998
26054
  name: string(),
25999
26055
  sampleCount: number().int().nonnegative(),
26000
- coverMediaKey: string().optional(),
26001
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26056
+ coverMediaId: number().int().optional(),
26057
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26002
26058
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26003
26059
  coverBase64: string().optional()
26004
26060
  });
@@ -26024,8 +26080,8 @@ var IdentitySampleAuditRowSchema = object({
26024
26080
  enrolledAt: number().int(),
26025
26081
  deviceId: number().int().optional(),
26026
26082
  source: _enum(["detected", "photo"]),
26027
- /** The enrolled crop's media key, so the panel can show the evidence. */
26028
- mediaKey: string().optional(),
26083
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26084
+ mediaId: number().int().optional(),
26029
26085
  /**
26030
26086
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26031
26087
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26094,15 +26150,15 @@ var FaceInfoSchema = object({
26094
26150
  */
26095
26151
  cropUrl: string().optional(),
26096
26152
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26097
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26153
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26098
26154
  * legacy rows written before design B. */
26099
26155
  faceBbox: BoundingBoxSchema.optional(),
26100
26156
  /** Design B: MediaStore key of the track's native-resolution key frame.
26101
26157
  * Fetch the native JPEG via the event-media data-plane
26102
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26158
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26103
26159
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26104
26160
  * back to the inline `base64` face crop. */
26105
- keyFrameMediaKey: string().optional(),
26161
+ keyFrameMediaId: number().int().optional(),
26106
26162
  /** Winning identity-match cosine (0..1) for this face's track, when an
26107
26163
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26108
26164
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26171,11 +26227,14 @@ var FaceClusterSchema = object({
26171
26227
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26172
26228
  * dialog already rendering its key FRAME from the `event-media` plane.
26173
26229
  *
26174
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26175
- * media key directly, so this needed no new plane and no new access decision.
26230
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26231
+ * resolves a media row by its own id, so this needed no new plane and no new
26232
+ * access decision.
26176
26233
  */
26177
26234
  var MediaFileLiteSchema$1 = object({
26178
- key: string(),
26235
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26236
+ * (D482). It was the row's composite key, which embedded the owner. */
26237
+ mediaId: number().int(),
26179
26238
  kind: string(),
26180
26239
  url: string(),
26181
26240
  sizeBytes: number(),
@@ -26192,7 +26251,7 @@ method(object({
26192
26251
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26193
26252
  * four times and the viewer holds at `staleTime: 30_000`.
26194
26253
  *
26195
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26254
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26196
26255
  * the `event-media` plane serves that key `immutable` with an ETag.
26197
26256
  *
26198
26257
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29626,8 +29685,8 @@ var VehicleSchema = object({
29626
29685
  id: string(),
29627
29686
  name: string(),
29628
29687
  sampleCount: number().int().nonnegative(),
29629
- coverMediaKey: string().optional(),
29630
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29688
+ coverMediaId: number().int().optional(),
29689
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29631
29690
  coverBase64: string().optional()
29632
29691
  });
29633
29692
  var VehicleSampleInfoSchema = object({
@@ -29660,7 +29719,7 @@ var PlateInfoSchema = object({
29660
29719
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29661
29720
  plateBbox: BoundingBoxSchema.optional(),
29662
29721
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29663
- keyFrameMediaKey: string().optional(),
29722
+ keyFrameMediaId: number().int().optional(),
29664
29723
  base64: string().optional(),
29665
29724
  /**
29666
29725
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29681,11 +29740,14 @@ var PlateInfoSchema = object({
29681
29740
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29682
29741
  * dialog already rendering its key FRAME from the `event-media` plane.
29683
29742
  *
29684
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29685
- * media key directly, so this needed no new plane and no new access decision.
29743
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29744
+ * resolves a media row by its own id, so this needed no new plane and no new
29745
+ * access decision.
29686
29746
  */
29687
29747
  var MediaFileLiteSchema = object({
29688
- key: string(),
29748
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29749
+ * (D482). It was the row's composite key, which embedded the owner. */
29750
+ mediaId: number().int(),
29689
29751
  kind: string(),
29690
29752
  url: string(),
29691
29753
  sizeBytes: number(),
@@ -29744,7 +29806,7 @@ method(object({
29744
29806
  }), method(object({
29745
29807
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29746
29808
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29747
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29809
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29748
29810
  * INPUT field: stripped by the hub router until the train ships, which
29749
29811
  * resolves to `false` and is exactly the intended default. */
29750
29812
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31375,7 +31437,14 @@ var SceneReferenceSchema = object({
31375
31437
  modelId: string(),
31376
31438
  condition: SceneConditionSchema,
31377
31439
  capturedAt: number(),
31378
- thumbnailMediaId: string().optional(),
31440
+ /**
31441
+ * The reference thumbnail's media ROW id (D482).
31442
+ *
31443
+ * The name already said `mediaId` while the value was the row's composite
31444
+ * key — a leftover that read as done and was not. It is the row's own id
31445
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31446
+ */
31447
+ thumbnailMediaId: number().int().optional(),
31379
31448
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31380
31449
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31381
31450
  * normalized rect frame a different piece of world, and the scene would
@@ -33557,7 +33626,7 @@ var StationaryObjectSchema = object({
33557
33626
  /** Enrichment label carried from the source track (identity / plate). */
33558
33627
  label: string().optional(),
33559
33628
  /** Native-resolution key-frame media key for the parked object's best image. */
33560
- keyFrameMediaKey: string().optional()
33629
+ keyFrameMediaId: number().int().optional()
33561
33630
  });
33562
33631
  var CameraOccupancySnapshotSchema = object({
33563
33632
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36501,6 +36570,12 @@ Object.freeze({
36501
36570
  addonId: null,
36502
36571
  access: "create"
36503
36572
  },
36573
+ "dataStoreProvider.upsert": {
36574
+ capName: "data-store-provider",
36575
+ capScope: "system",
36576
+ addonId: null,
36577
+ access: "create"
36578
+ },
36504
36579
  "dayNight.getOptions": {
36505
36580
  capName: "day-night",
36506
36581
  capScope: "device",
@@ -40365,6 +40440,12 @@ Object.freeze({
40365
40440
  addonId: null,
40366
40441
  access: "create"
40367
40442
  },
40443
+ "settingsStore.upsert": {
40444
+ capName: "settings-store",
40445
+ capScope: "system",
40446
+ addonId: null,
40447
+ access: "create"
40448
+ },
40368
40449
  "smtpProvider.getStatus": {
40369
40450
  capName: "smtp-provider",
40370
40451
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -7,7 +7,7 @@ import { networkInterfaces } from "node:os";
7
7
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
8
8
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
9
9
  //#endregion
10
- //#region ../types/dist/event-category-DAXzJeTX.mjs
10
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
11
11
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
12
12
  EventCategory["SystemBoot"] = "system.boot";
13
13
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -568,7 +568,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
568
568
  * a package zone — a newly-appeared stationary object of a package class
569
569
  * that cleared the class / zone / dwell / size gates. Payload:
570
570
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
571
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
571
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
572
572
  * Telemetry (D8): the durable record is the `package-events` store row;
573
573
  * this bus topic drives notifier rules + live UI. See
574
574
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5354,7 +5354,7 @@ var ZodIssueCode = {
5354
5354
  var ZodFirstPartyTypeKind;
5355
5355
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5356
5356
  //#endregion
5357
- //#region ../types/dist/sleep-BnujYGPe.mjs
5357
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5358
5358
  /**
5359
5359
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5360
5360
  * 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
  var EncodeProfileSchema = object({
7320
7337
  video: object({
7321
7338
  codec: _enum([
@@ -12514,6 +12531,16 @@ method(object({
12514
12531
  filter: QueryFilterSchema.optional(),
12515
12532
  columns: array(string()).readonly().optional()
12516
12533
  }), array(SettingsRecordSchema).readonly()), method(object({
12534
+ namespace: string().optional(),
12535
+ collection: string(),
12536
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12537
+ * index on the collection. Never empty. */
12538
+ conflict: array(string()).readonly(),
12539
+ record: BulkRecordSchema
12540
+ }), object({
12541
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12542
+ * row's own id on an update. */
12543
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12517
12544
  namespace: string().optional(),
12518
12545
  collection: string(),
12519
12546
  record: object({
@@ -12648,6 +12675,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12648
12675
  id: union([string(), number()]) }), {
12649
12676
  kind: "mutation",
12650
12677
  auth: "admin"
12678
+ }), method(object({
12679
+ namespace: string().optional(),
12680
+ collection: string(),
12681
+ conflict: array(string()).readonly(),
12682
+ record: BulkRecordSchema
12683
+ }), object({ id: union([string(), number()]) }), {
12684
+ kind: "mutation",
12685
+ auth: "admin"
12651
12686
  }), method(object({
12652
12687
  namespace: string().optional(),
12653
12688
  collection: string(),
@@ -19130,8 +19165,8 @@ var TrackPositionSchema = object({
19130
19165
  var TrackSnapshotSchema = object({
19131
19166
  timestamp: number(),
19132
19167
  position: TrackPositionSchema,
19133
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19134
- mediaKey: string()
19168
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19169
+ mediaId: number().int()
19135
19170
  });
19136
19171
  /**
19137
19172
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19735,14 +19770,14 @@ var ObjectEventSchema = object({
19735
19770
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19736
19771
  frameWidth: number().optional(),
19737
19772
  frameHeight: number().optional(),
19738
- /** MediaStore key for the crop attached to this event (if any). */
19739
- mediaKey: string().optional(),
19740
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19773
+ /** Media row id of the crop attached to this event (if any) — D482. */
19774
+ mediaId: number().int().optional(),
19775
+ /** Design B: media row id of the track's native-resolution key frame (the
19741
19776
  * best-detection full frame). Resolve via the event-media data-plane
19742
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19777
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19743
19778
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19744
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19745
- keyFrameMediaKey: string().optional(),
19779
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19780
+ keyFrameMediaId: number().int().optional(),
19746
19781
  /** Populated by B5 (recording playback URL for this event). */
19747
19782
  mediaUrl: string().optional(),
19748
19783
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19792,7 +19827,7 @@ var MediaFileKindEnum = _enum([
19792
19827
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19793
19828
  *
19794
19829
  * `url` points at the `event-media` data plane
19795
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19830
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19796
19831
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19797
19832
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19798
19833
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19800,10 +19835,13 @@ var MediaFileKindEnum = _enum([
19800
19835
  * `data-plane-access.ts` for the rule and the one gap it does not close
19801
19836
  * (per-device scoping).
19802
19837
  *
19803
- * The URL is built from the row's **stored** key, which is not always its
19804
- * published `kind`: a track's face/plate crop is stored as `crop` under
19838
+ * The URL is built from the row's own id, which since D482 says nothing about
19839
+ * the row's owner or kind — and that is the point. The published `kind` is not
19840
+ * the stored one (a track's face/plate crop is stored as `crop` under
19805
19841
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19806
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19842
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19843
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19844
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19807
19845
  *
19808
19846
  * ## `base64` is TRANSITIONAL and is going away
19809
19847
  *
@@ -19816,7 +19854,19 @@ var MediaFileKindEnum = _enum([
19816
19854
  * `analytics-query-facade.ts`; nothing else reads it.
19817
19855
  */
19818
19856
  var MediaFileSchema = object({
19819
- key: string(),
19857
+ /**
19858
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19859
+ *
19860
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19861
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19862
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19863
+ * different rows that spell the same number, and a track whose
19864
+ * `bestEventId` was an object event was served a motion event's snapshot —
19865
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19866
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19867
+ * at all.
19868
+ */
19869
+ mediaId: number().int(),
19820
19870
  kind: MediaFileKindEnum,
19821
19871
  sizeBytes: number(),
19822
19872
  timestamp: number()
@@ -19924,7 +19974,7 @@ var RetrainTrackSchema = object({
19924
19974
  });
19925
19975
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19926
19976
  var RetrainFrameCandidateSchema = object({
19927
- mediaKey: string(),
19977
+ mediaId: number().int(),
19928
19978
  kind: MediaFileKindEnum,
19929
19979
  timestamp: number(),
19930
19980
  sizeBytes: number().int(),
@@ -19938,7 +19988,7 @@ var RetrainFrameSchema = object({
19938
19988
  deviceId: number(),
19939
19989
  trackId: string(),
19940
19990
  /** Provenance only. It may already point at nothing — that is expected. */
19941
- sourceMediaKey: string(),
19991
+ sourceMediaId: number().int(),
19942
19992
  sourceKind: MediaFileKindEnum,
19943
19993
  sizeBytes: number().int(),
19944
19994
  width: number().int(),
@@ -19954,7 +20004,7 @@ var RetrainCopyRefusalSchema = _enum([
19954
20004
  var RetrainFrameSelectionSchema = object({
19955
20005
  copied: array(RetrainFrameSchema).readonly(),
19956
20006
  refused: array(object({
19957
- sourceMediaKey: string(),
20007
+ sourceMediaId: number().int(),
19958
20008
  reason: RetrainCopyRefusalSchema
19959
20009
  })).readonly()
19960
20010
  });
@@ -19962,7 +20012,7 @@ var RetrainFrameListSchema = object({
19962
20012
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19963
20013
  copies: array(RetrainFrameSchema).readonly(),
19964
20014
  /** What the page pre-selects — the native key frame when one survives. */
19965
- autoPickMediaKey: string().optional()
20015
+ autoPickMediaId: number().int().optional()
19966
20016
  });
19967
20017
  /** What the operator asked the assist to look for. */
19968
20018
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20057,9 +20107,11 @@ var RecentTracksQueryInput = object({
20057
20107
  });
20058
20108
  /**
20059
20109
  * A Summary (D359): the per-camera session envelope that references tracks.
20060
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20061
- * served by the event-media plane by key), null until the first frame with a
20062
- * member visible has been materialised.
20110
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20111
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20112
+ * first frame with a member visible has been materialised (D482 — it was the
20113
+ * row's composite key, which embedded the owner and could name another table's
20114
+ * row once event ids became per-table rowids).
20063
20115
  */
20064
20116
  var SummarySchema = object({
20065
20117
  id: string(),
@@ -20068,7 +20120,7 @@ var SummarySchema = object({
20068
20120
  lastActiveAt: number(),
20069
20121
  sealedAt: number().nullable(),
20070
20122
  memberCount: number().int().nonnegative(),
20071
- groupShotKey: string().nullable()
20123
+ groupShotMediaId: number().int().nullable()
20072
20124
  });
20073
20125
  var SummariesQueryInput = object({
20074
20126
  deviceIds: array(number()).min(1),
@@ -20622,7 +20674,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20622
20674
  }), method(object({
20623
20675
  deviceId: number(),
20624
20676
  trackId: string(),
20625
- mediaKeys: array(string()).min(1)
20677
+ mediaIds: array(number().int()).min(1)
20626
20678
  }), RetrainFrameSelectionSchema, {
20627
20679
  kind: "mutation",
20628
20680
  auth: "admin"
@@ -20690,7 +20742,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20690
20742
  kind: "query",
20691
20743
  auth: "admin"
20692
20744
  }), method(object({
20693
- eventId: string(),
20745
+ /** Which of the three event tables owns the row. */
20746
+ ownerType: EventOwnerTypeSchema,
20747
+ /** The event's rowid in that table (D474: an event id is a number). */
20748
+ eventId: number().int(),
20694
20749
  kind: MediaFileKindEnum.optional(),
20695
20750
  deviceId: number()
20696
20751
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20701,7 +20756,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20701
20756
  trackId: string(),
20702
20757
  deviceId: number()
20703
20758
  }), array(MediaFileInfoSchema).readonly()), method(object({
20704
- eventId: string(),
20759
+ ownerType: EventOwnerTypeSchema,
20760
+ eventId: number().int(),
20705
20761
  deviceId: number()
20706
20762
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20707
20763
  kind: "mutation",
@@ -25998,8 +26054,8 @@ var IdentitySchema = object({
25998
26054
  id: string(),
25999
26055
  name: string(),
26000
26056
  sampleCount: number().int().nonnegative(),
26001
- coverMediaKey: string().optional(),
26002
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26057
+ coverMediaId: number().int().optional(),
26058
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26003
26059
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26004
26060
  coverBase64: string().optional()
26005
26061
  });
@@ -26025,8 +26081,8 @@ var IdentitySampleAuditRowSchema = object({
26025
26081
  enrolledAt: number().int(),
26026
26082
  deviceId: number().int().optional(),
26027
26083
  source: _enum(["detected", "photo"]),
26028
- /** The enrolled crop's media key, so the panel can show the evidence. */
26029
- mediaKey: string().optional(),
26084
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26085
+ mediaId: number().int().optional(),
26030
26086
  /**
26031
26087
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26032
26088
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26095,15 +26151,15 @@ var FaceInfoSchema = object({
26095
26151
  */
26096
26152
  cropUrl: string().optional(),
26097
26153
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26098
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26154
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26099
26155
  * legacy rows written before design B. */
26100
26156
  faceBbox: BoundingBoxSchema.optional(),
26101
26157
  /** Design B: MediaStore key of the track's native-resolution key frame.
26102
26158
  * Fetch the native JPEG via the event-media data-plane
26103
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26159
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26104
26160
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26105
26161
  * back to the inline `base64` face crop. */
26106
- keyFrameMediaKey: string().optional(),
26162
+ keyFrameMediaId: number().int().optional(),
26107
26163
  /** Winning identity-match cosine (0..1) for this face's track, when an
26108
26164
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26109
26165
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26172,11 +26228,14 @@ var FaceClusterSchema = object({
26172
26228
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26173
26229
  * dialog already rendering its key FRAME from the `event-media` plane.
26174
26230
  *
26175
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26176
- * media key directly, so this needed no new plane and no new access decision.
26231
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26232
+ * resolves a media row by its own id, so this needed no new plane and no new
26233
+ * access decision.
26177
26234
  */
26178
26235
  var MediaFileLiteSchema$1 = object({
26179
- key: string(),
26236
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26237
+ * (D482). It was the row's composite key, which embedded the owner. */
26238
+ mediaId: number().int(),
26180
26239
  kind: string(),
26181
26240
  url: string(),
26182
26241
  sizeBytes: number(),
@@ -26193,7 +26252,7 @@ method(object({
26193
26252
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26194
26253
  * four times and the viewer holds at `staleTime: 30_000`.
26195
26254
  *
26196
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26255
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26197
26256
  * the `event-media` plane serves that key `immutable` with an ETag.
26198
26257
  *
26199
26258
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29627,8 +29686,8 @@ var VehicleSchema = object({
29627
29686
  id: string(),
29628
29687
  name: string(),
29629
29688
  sampleCount: number().int().nonnegative(),
29630
- coverMediaKey: string().optional(),
29631
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29689
+ coverMediaId: number().int().optional(),
29690
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29632
29691
  coverBase64: string().optional()
29633
29692
  });
29634
29693
  var VehicleSampleInfoSchema = object({
@@ -29661,7 +29720,7 @@ var PlateInfoSchema = object({
29661
29720
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29662
29721
  plateBbox: BoundingBoxSchema.optional(),
29663
29722
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29664
- keyFrameMediaKey: string().optional(),
29723
+ keyFrameMediaId: number().int().optional(),
29665
29724
  base64: string().optional(),
29666
29725
  /**
29667
29726
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29682,11 +29741,14 @@ var PlateInfoSchema = object({
29682
29741
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29683
29742
  * dialog already rendering its key FRAME from the `event-media` plane.
29684
29743
  *
29685
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29686
- * media key directly, so this needed no new plane and no new access decision.
29744
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29745
+ * resolves a media row by its own id, so this needed no new plane and no new
29746
+ * access decision.
29687
29747
  */
29688
29748
  var MediaFileLiteSchema = object({
29689
- key: string(),
29749
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29750
+ * (D482). It was the row's composite key, which embedded the owner. */
29751
+ mediaId: number().int(),
29690
29752
  kind: string(),
29691
29753
  url: string(),
29692
29754
  sizeBytes: number(),
@@ -29745,7 +29807,7 @@ method(object({
29745
29807
  }), method(object({
29746
29808
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29747
29809
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29748
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29810
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29749
29811
  * INPUT field: stripped by the hub router until the train ships, which
29750
29812
  * resolves to `false` and is exactly the intended default. */
29751
29813
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31376,7 +31438,14 @@ var SceneReferenceSchema = object({
31376
31438
  modelId: string(),
31377
31439
  condition: SceneConditionSchema,
31378
31440
  capturedAt: number(),
31379
- thumbnailMediaId: string().optional(),
31441
+ /**
31442
+ * The reference thumbnail's media ROW id (D482).
31443
+ *
31444
+ * The name already said `mediaId` while the value was the row's composite
31445
+ * key — a leftover that read as done and was not. It is the row's own id
31446
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31447
+ */
31448
+ thumbnailMediaId: number().int().optional(),
31380
31449
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31381
31450
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31382
31451
  * normalized rect frame a different piece of world, and the scene would
@@ -33558,7 +33627,7 @@ var StationaryObjectSchema = object({
33558
33627
  /** Enrichment label carried from the source track (identity / plate). */
33559
33628
  label: string().optional(),
33560
33629
  /** Native-resolution key-frame media key for the parked object's best image. */
33561
- keyFrameMediaKey: string().optional()
33630
+ keyFrameMediaId: number().int().optional()
33562
33631
  });
33563
33632
  var CameraOccupancySnapshotSchema = object({
33564
33633
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36502,6 +36571,12 @@ Object.freeze({
36502
36571
  addonId: null,
36503
36572
  access: "create"
36504
36573
  },
36574
+ "dataStoreProvider.upsert": {
36575
+ capName: "data-store-provider",
36576
+ capScope: "system",
36577
+ addonId: null,
36578
+ access: "create"
36579
+ },
36505
36580
  "dayNight.getOptions": {
36506
36581
  capName: "day-night",
36507
36582
  capScope: "device",
@@ -40366,6 +40441,12 @@ Object.freeze({
40366
40441
  addonId: null,
40367
40442
  access: "create"
40368
40443
  },
40444
+ "settingsStore.upsert": {
40445
+ capName: "settings-store",
40446
+ capScope: "system",
40447
+ addonId: null,
40448
+ access: "create"
40449
+ },
40369
40450
  "smtpProvider.getStatus": {
40370
40451
  capName: "smtp-provider",
40371
40452
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.100",
3
+ "version": "0.2.102",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",