@camstack/addon-provider-rtsp 1.2.99 → 1.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
@@ -23,7 +23,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  //#endregion
24
24
  let node_net = require("node:net");
25
25
  node_net = __toESM(node_net);
26
- //#region ../types/dist/event-category-DAXzJeTX.mjs
26
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
27
27
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
28
28
  EventCategory["SystemBoot"] = "system.boot";
29
29
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -584,7 +584,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
584
584
  * a package zone — a newly-appeared stationary object of a package class
585
585
  * that cleared the class / zone / dwell / size gates. Payload:
586
586
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
587
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
587
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
588
588
  * Telemetry (D8): the durable record is the `package-events` store row;
589
589
  * this bus topic drives notifier rules + live UI. See
590
590
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5370,7 +5370,7 @@ var ZodIssueCode = {
5370
5370
  var ZodFirstPartyTypeKind;
5371
5371
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5372
5372
  //#endregion
5373
- //#region ../types/dist/sleep-BnujYGPe.mjs
5373
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5374
5374
  /**
5375
5375
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5376
5376
  * window to float samples (D455).
@@ -7337,13 +7337,30 @@ new Set([
7337
7337
  "scene",
7338
7338
  "motion",
7339
7339
  "object",
7340
- "audio"
7340
+ "audio",
7341
+ "mosaic"
7341
7342
  ]);
7342
- new Set([
7343
+ /**
7344
+ * The owner types that are event tables, in the order the event-media resolver
7345
+ * should consider them. Exported so a consumer asking "is this key an event?"
7346
+ * does not re-spell the list and drift from it.
7347
+ */
7348
+ var EVENT_OWNER_TYPES = [
7343
7349
  "motion",
7344
7350
  "object",
7345
7351
  "audio"
7346
- ]);
7352
+ ];
7353
+ /**
7354
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7355
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7356
+ * `(table, id)`).
7357
+ *
7358
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7359
+ * table would otherwise be accepted by the codec and refused at the door, with
7360
+ * nothing failing until a caller asked.
7361
+ */
7362
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7363
+ new Set(EVENT_OWNER_TYPES);
7347
7364
  var EncodeProfileSchema = object({
7348
7365
  video: object({
7349
7366
  codec: _enum([
@@ -12574,6 +12591,16 @@ method(object({
12574
12591
  filter: QueryFilterSchema.optional(),
12575
12592
  columns: array(string()).readonly().optional()
12576
12593
  }), array(SettingsRecordSchema).readonly()), method(object({
12594
+ namespace: string().optional(),
12595
+ collection: string(),
12596
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12597
+ * index on the collection. Never empty. */
12598
+ conflict: array(string()).readonly(),
12599
+ record: BulkRecordSchema
12600
+ }), object({
12601
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12602
+ * row's own id on an update. */
12603
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12577
12604
  namespace: string().optional(),
12578
12605
  collection: string(),
12579
12606
  record: object({
@@ -12708,6 +12735,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12708
12735
  id: union([string(), number()]) }), {
12709
12736
  kind: "mutation",
12710
12737
  auth: "admin"
12738
+ }), method(object({
12739
+ namespace: string().optional(),
12740
+ collection: string(),
12741
+ conflict: array(string()).readonly(),
12742
+ record: BulkRecordSchema
12743
+ }), object({ id: union([string(), number()]) }), {
12744
+ kind: "mutation",
12745
+ auth: "admin"
12711
12746
  }), method(object({
12712
12747
  namespace: string().optional(),
12713
12748
  collection: string(),
@@ -19190,8 +19225,8 @@ var TrackPositionSchema = object({
19190
19225
  var TrackSnapshotSchema = object({
19191
19226
  timestamp: number(),
19192
19227
  position: TrackPositionSchema,
19193
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19194
- mediaKey: string()
19228
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19229
+ mediaId: number().int()
19195
19230
  });
19196
19231
  /**
19197
19232
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19795,14 +19830,14 @@ var ObjectEventSchema = object({
19795
19830
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19796
19831
  frameWidth: number().optional(),
19797
19832
  frameHeight: number().optional(),
19798
- /** MediaStore key for the crop attached to this event (if any). */
19799
- mediaKey: string().optional(),
19800
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19833
+ /** Media row id of the crop attached to this event (if any) — D482. */
19834
+ mediaId: number().int().optional(),
19835
+ /** Design B: media row id of the track's native-resolution key frame (the
19801
19836
  * best-detection full frame). Resolve via the event-media data-plane
19802
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19837
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19803
19838
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19804
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19805
- keyFrameMediaKey: string().optional(),
19839
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19840
+ keyFrameMediaId: number().int().optional(),
19806
19841
  /** Populated by B5 (recording playback URL for this event). */
19807
19842
  mediaUrl: string().optional(),
19808
19843
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19852,7 +19887,7 @@ var MediaFileKindEnum = _enum([
19852
19887
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19853
19888
  *
19854
19889
  * `url` points at the `event-media` data plane
19855
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19890
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19856
19891
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19857
19892
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19858
19893
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19860,10 +19895,13 @@ var MediaFileKindEnum = _enum([
19860
19895
  * `data-plane-access.ts` for the rule and the one gap it does not close
19861
19896
  * (per-device scoping).
19862
19897
  *
19863
- * The URL is built from the row's **stored** key, which is not always its
19864
- * published `kind`: a track's face/plate crop is stored as `crop` under
19898
+ * The URL is built from the row's own id, which since D482 says nothing about
19899
+ * the row's owner or kind and that is the point. The published `kind` is not
19900
+ * the stored one (a track's face/plate crop is stored as `crop` under
19865
19901
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19866
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19902
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19903
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19904
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19867
19905
  *
19868
19906
  * ## `base64` is TRANSITIONAL and is going away
19869
19907
  *
@@ -19876,7 +19914,19 @@ var MediaFileKindEnum = _enum([
19876
19914
  * `analytics-query-facade.ts`; nothing else reads it.
19877
19915
  */
19878
19916
  var MediaFileSchema = object({
19879
- key: string(),
19917
+ /**
19918
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19919
+ *
19920
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19921
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19922
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19923
+ * different rows that spell the same number, and a track whose
19924
+ * `bestEventId` was an object event was served a motion event's snapshot —
19925
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19926
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19927
+ * at all.
19928
+ */
19929
+ mediaId: number().int(),
19880
19930
  kind: MediaFileKindEnum,
19881
19931
  sizeBytes: number(),
19882
19932
  timestamp: number()
@@ -19984,7 +20034,7 @@ var RetrainTrackSchema = object({
19984
20034
  });
19985
20035
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19986
20036
  var RetrainFrameCandidateSchema = object({
19987
- mediaKey: string(),
20037
+ mediaId: number().int(),
19988
20038
  kind: MediaFileKindEnum,
19989
20039
  timestamp: number(),
19990
20040
  sizeBytes: number().int(),
@@ -19998,7 +20048,7 @@ var RetrainFrameSchema = object({
19998
20048
  deviceId: number(),
19999
20049
  trackId: string(),
20000
20050
  /** Provenance only. It may already point at nothing — that is expected. */
20001
- sourceMediaKey: string(),
20051
+ sourceMediaId: number().int(),
20002
20052
  sourceKind: MediaFileKindEnum,
20003
20053
  sizeBytes: number().int(),
20004
20054
  width: number().int(),
@@ -20014,7 +20064,7 @@ var RetrainCopyRefusalSchema = _enum([
20014
20064
  var RetrainFrameSelectionSchema = object({
20015
20065
  copied: array(RetrainFrameSchema).readonly(),
20016
20066
  refused: array(object({
20017
- sourceMediaKey: string(),
20067
+ sourceMediaId: number().int(),
20018
20068
  reason: RetrainCopyRefusalSchema
20019
20069
  })).readonly()
20020
20070
  });
@@ -20022,7 +20072,7 @@ var RetrainFrameListSchema = object({
20022
20072
  candidates: array(RetrainFrameCandidateSchema).readonly(),
20023
20073
  copies: array(RetrainFrameSchema).readonly(),
20024
20074
  /** What the page pre-selects — the native key frame when one survives. */
20025
- autoPickMediaKey: string().optional()
20075
+ autoPickMediaId: number().int().optional()
20026
20076
  });
20027
20077
  /** What the operator asked the assist to look for. */
20028
20078
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20117,9 +20167,11 @@ var RecentTracksQueryInput = object({
20117
20167
  });
20118
20168
  /**
20119
20169
  * A Summary (D359): the per-camera session envelope that references tracks.
20120
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20121
- * served by the event-media plane by key), null until the first frame with a
20122
- * member visible has been materialised.
20170
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20171
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20172
+ * first frame with a member visible has been materialised (D482 — it was the
20173
+ * row's composite key, which embedded the owner and could name another table's
20174
+ * row once event ids became per-table rowids).
20123
20175
  */
20124
20176
  var SummarySchema = object({
20125
20177
  id: string(),
@@ -20128,7 +20180,7 @@ var SummarySchema = object({
20128
20180
  lastActiveAt: number(),
20129
20181
  sealedAt: number().nullable(),
20130
20182
  memberCount: number().int().nonnegative(),
20131
- groupShotKey: string().nullable()
20183
+ groupShotMediaId: number().int().nullable()
20132
20184
  });
20133
20185
  var SummariesQueryInput = object({
20134
20186
  deviceIds: array(number()).min(1),
@@ -20682,7 +20734,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20682
20734
  }), method(object({
20683
20735
  deviceId: number(),
20684
20736
  trackId: string(),
20685
- mediaKeys: array(string()).min(1)
20737
+ mediaIds: array(number().int()).min(1)
20686
20738
  }), RetrainFrameSelectionSchema, {
20687
20739
  kind: "mutation",
20688
20740
  auth: "admin"
@@ -20750,7 +20802,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20750
20802
  kind: "query",
20751
20803
  auth: "admin"
20752
20804
  }), method(object({
20753
- eventId: string(),
20805
+ /** Which of the three event tables owns the row. */
20806
+ ownerType: EventOwnerTypeSchema,
20807
+ /** The event's rowid in that table (D474: an event id is a number). */
20808
+ eventId: number().int(),
20754
20809
  kind: MediaFileKindEnum.optional(),
20755
20810
  deviceId: number()
20756
20811
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20761,7 +20816,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20761
20816
  trackId: string(),
20762
20817
  deviceId: number()
20763
20818
  }), array(MediaFileInfoSchema).readonly()), method(object({
20764
- eventId: string(),
20819
+ ownerType: EventOwnerTypeSchema,
20820
+ eventId: number().int(),
20765
20821
  deviceId: number()
20766
20822
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20767
20823
  kind: "mutation",
@@ -26066,8 +26122,8 @@ var IdentitySchema = object({
26066
26122
  id: string(),
26067
26123
  name: string(),
26068
26124
  sampleCount: number().int().nonnegative(),
26069
- coverMediaKey: string().optional(),
26070
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26125
+ coverMediaId: number().int().optional(),
26126
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26071
26127
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26072
26128
  coverBase64: string().optional()
26073
26129
  });
@@ -26093,8 +26149,8 @@ var IdentitySampleAuditRowSchema = object({
26093
26149
  enrolledAt: number().int(),
26094
26150
  deviceId: number().int().optional(),
26095
26151
  source: _enum(["detected", "photo"]),
26096
- /** The enrolled crop's media key, so the panel can show the evidence. */
26097
- mediaKey: string().optional(),
26152
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26153
+ mediaId: number().int().optional(),
26098
26154
  /**
26099
26155
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26100
26156
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26163,15 +26219,15 @@ var FaceInfoSchema = object({
26163
26219
  */
26164
26220
  cropUrl: string().optional(),
26165
26221
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26166
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26222
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26167
26223
  * legacy rows written before design B. */
26168
26224
  faceBbox: BoundingBoxSchema.optional(),
26169
26225
  /** Design B: MediaStore key of the track's native-resolution key frame.
26170
26226
  * Fetch the native JPEG via the event-media data-plane
26171
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26227
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26172
26228
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26173
26229
  * back to the inline `base64` face crop. */
26174
- keyFrameMediaKey: string().optional(),
26230
+ keyFrameMediaId: number().int().optional(),
26175
26231
  /** Winning identity-match cosine (0..1) for this face's track, when an
26176
26232
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26177
26233
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26240,11 +26296,14 @@ var FaceClusterSchema = object({
26240
26296
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26241
26297
  * dialog already rendering its key FRAME from the `event-media` plane.
26242
26298
  *
26243
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26244
- * media key directly, so this needed no new plane and no new access decision.
26299
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26300
+ * resolves a media row by its own id, so this needed no new plane and no new
26301
+ * access decision.
26245
26302
  */
26246
26303
  var MediaFileLiteSchema$1 = object({
26247
- key: string(),
26304
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26305
+ * (D482). It was the row's composite key, which embedded the owner. */
26306
+ mediaId: number().int(),
26248
26307
  kind: string(),
26249
26308
  url: string(),
26250
26309
  sizeBytes: number(),
@@ -26261,7 +26320,7 @@ method(object({
26261
26320
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26262
26321
  * four times and the viewer holds at `staleTime: 30_000`.
26263
26322
  *
26264
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26323
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26265
26324
  * the `event-media` plane serves that key `immutable` with an ETag.
26266
26325
  *
26267
26326
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29624,8 +29683,8 @@ var VehicleSchema = object({
29624
29683
  id: string(),
29625
29684
  name: string(),
29626
29685
  sampleCount: number().int().nonnegative(),
29627
- coverMediaKey: string().optional(),
29628
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29686
+ coverMediaId: number().int().optional(),
29687
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29629
29688
  coverBase64: string().optional()
29630
29689
  });
29631
29690
  var VehicleSampleInfoSchema = object({
@@ -29658,7 +29717,7 @@ var PlateInfoSchema = object({
29658
29717
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29659
29718
  plateBbox: BoundingBoxSchema.optional(),
29660
29719
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29661
- keyFrameMediaKey: string().optional(),
29720
+ keyFrameMediaId: number().int().optional(),
29662
29721
  base64: string().optional(),
29663
29722
  /**
29664
29723
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29679,11 +29738,14 @@ var PlateInfoSchema = object({
29679
29738
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29680
29739
  * dialog already rendering its key FRAME from the `event-media` plane.
29681
29740
  *
29682
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29683
- * media key directly, so this needed no new plane and no new access decision.
29741
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29742
+ * resolves a media row by its own id, so this needed no new plane and no new
29743
+ * access decision.
29684
29744
  */
29685
29745
  var MediaFileLiteSchema = object({
29686
- key: string(),
29746
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29747
+ * (D482). It was the row's composite key, which embedded the owner. */
29748
+ mediaId: number().int(),
29687
29749
  kind: string(),
29688
29750
  url: string(),
29689
29751
  sizeBytes: number(),
@@ -29742,7 +29804,7 @@ method(object({
29742
29804
  }), method(object({
29743
29805
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29744
29806
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29745
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29807
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29746
29808
  * INPUT field: stripped by the hub router until the train ships, which
29747
29809
  * resolves to `false` and is exactly the intended default. */
29748
29810
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31311,7 +31373,14 @@ var SceneReferenceSchema = object({
31311
31373
  modelId: string(),
31312
31374
  condition: SceneConditionSchema,
31313
31375
  capturedAt: number(),
31314
- thumbnailMediaId: string().optional(),
31376
+ /**
31377
+ * The reference thumbnail's media ROW id (D482).
31378
+ *
31379
+ * The name already said `mediaId` while the value was the row's composite
31380
+ * key — a leftover that read as done and was not. It is the row's own id
31381
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31382
+ */
31383
+ thumbnailMediaId: number().int().optional(),
31315
31384
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31316
31385
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31317
31386
  * normalized rect frame a different piece of world, and the scene would
@@ -33295,7 +33364,7 @@ var StationaryObjectSchema = object({
33295
33364
  /** Enrichment label carried from the source track (identity / plate). */
33296
33365
  label: string().optional(),
33297
33366
  /** Native-resolution key-frame media key for the parked object's best image. */
33298
- keyFrameMediaKey: string().optional()
33367
+ keyFrameMediaId: number().int().optional()
33299
33368
  });
33300
33369
  var CameraOccupancySnapshotSchema = object({
33301
33370
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36099,6 +36168,12 @@ Object.freeze({
36099
36168
  addonId: null,
36100
36169
  access: "create"
36101
36170
  },
36171
+ "dataStoreProvider.upsert": {
36172
+ capName: "data-store-provider",
36173
+ capScope: "system",
36174
+ addonId: null,
36175
+ access: "create"
36176
+ },
36102
36177
  "dayNight.getOptions": {
36103
36178
  capName: "day-night",
36104
36179
  capScope: "device",
@@ -39963,6 +40038,12 @@ Object.freeze({
39963
40038
  addonId: null,
39964
40039
  access: "create"
39965
40040
  },
40041
+ "settingsStore.upsert": {
40042
+ capName: "settings-store",
40043
+ capScope: "system",
40044
+ addonId: null,
40045
+ access: "create"
40046
+ },
39966
40047
  "smtpProvider.getStatus": {
39967
40048
  capName: "smtp-provider",
39968
40049
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import net from "node:net";
2
- //#region ../types/dist/event-category-DAXzJeTX.mjs
2
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -560,7 +560,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
560
560
  * a package zone — a newly-appeared stationary object of a package class
561
561
  * that cleared the class / zone / dwell / size gates. Payload:
562
562
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
563
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
563
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
564
564
  * Telemetry (D8): the durable record is the `package-events` store row;
565
565
  * this bus topic drives notifier rules + live UI. See
566
566
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5346,7 +5346,7 @@ var ZodIssueCode = {
5346
5346
  var ZodFirstPartyTypeKind;
5347
5347
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5348
5348
  //#endregion
5349
- //#region ../types/dist/sleep-BnujYGPe.mjs
5349
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5350
5350
  /**
5351
5351
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5352
5352
  * window to float samples (D455).
@@ -7313,13 +7313,30 @@ new Set([
7313
7313
  "scene",
7314
7314
  "motion",
7315
7315
  "object",
7316
- "audio"
7316
+ "audio",
7317
+ "mosaic"
7317
7318
  ]);
7318
- new Set([
7319
+ /**
7320
+ * The owner types that are event tables, in the order the event-media resolver
7321
+ * should consider them. Exported so a consumer asking "is this key an event?"
7322
+ * does not re-spell the list and drift from it.
7323
+ */
7324
+ var EVENT_OWNER_TYPES = [
7319
7325
  "motion",
7320
7326
  "object",
7321
7327
  "audio"
7322
- ]);
7328
+ ];
7329
+ /**
7330
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7331
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7332
+ * `(table, id)`).
7333
+ *
7334
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7335
+ * table would otherwise be accepted by the codec and refused at the door, with
7336
+ * nothing failing until a caller asked.
7337
+ */
7338
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7339
+ new Set(EVENT_OWNER_TYPES);
7323
7340
  var EncodeProfileSchema = object({
7324
7341
  video: object({
7325
7342
  codec: _enum([
@@ -12550,6 +12567,16 @@ method(object({
12550
12567
  filter: QueryFilterSchema.optional(),
12551
12568
  columns: array(string()).readonly().optional()
12552
12569
  }), array(SettingsRecordSchema).readonly()), method(object({
12570
+ namespace: string().optional(),
12571
+ collection: string(),
12572
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12573
+ * index on the collection. Never empty. */
12574
+ conflict: array(string()).readonly(),
12575
+ record: BulkRecordSchema
12576
+ }), object({
12577
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12578
+ * row's own id on an update. */
12579
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12553
12580
  namespace: string().optional(),
12554
12581
  collection: string(),
12555
12582
  record: object({
@@ -12684,6 +12711,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12684
12711
  id: union([string(), number()]) }), {
12685
12712
  kind: "mutation",
12686
12713
  auth: "admin"
12714
+ }), method(object({
12715
+ namespace: string().optional(),
12716
+ collection: string(),
12717
+ conflict: array(string()).readonly(),
12718
+ record: BulkRecordSchema
12719
+ }), object({ id: union([string(), number()]) }), {
12720
+ kind: "mutation",
12721
+ auth: "admin"
12687
12722
  }), method(object({
12688
12723
  namespace: string().optional(),
12689
12724
  collection: string(),
@@ -19166,8 +19201,8 @@ var TrackPositionSchema = object({
19166
19201
  var TrackSnapshotSchema = object({
19167
19202
  timestamp: number(),
19168
19203
  position: TrackPositionSchema,
19169
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19170
- mediaKey: string()
19204
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19205
+ mediaId: number().int()
19171
19206
  });
19172
19207
  /**
19173
19208
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19771,14 +19806,14 @@ var ObjectEventSchema = object({
19771
19806
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19772
19807
  frameWidth: number().optional(),
19773
19808
  frameHeight: number().optional(),
19774
- /** MediaStore key for the crop attached to this event (if any). */
19775
- mediaKey: string().optional(),
19776
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19809
+ /** Media row id of the crop attached to this event (if any) — D482. */
19810
+ mediaId: number().int().optional(),
19811
+ /** Design B: media row id of the track's native-resolution key frame (the
19777
19812
  * best-detection full frame). Resolve via the event-media data-plane
19778
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19813
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19779
19814
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19780
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19781
- keyFrameMediaKey: string().optional(),
19815
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19816
+ keyFrameMediaId: number().int().optional(),
19782
19817
  /** Populated by B5 (recording playback URL for this event). */
19783
19818
  mediaUrl: string().optional(),
19784
19819
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19828,7 +19863,7 @@ var MediaFileKindEnum = _enum([
19828
19863
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19829
19864
  *
19830
19865
  * `url` points at the `event-media` data plane
19831
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19866
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19832
19867
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19833
19868
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19834
19869
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19836,10 +19871,13 @@ var MediaFileKindEnum = _enum([
19836
19871
  * `data-plane-access.ts` for the rule and the one gap it does not close
19837
19872
  * (per-device scoping).
19838
19873
  *
19839
- * The URL is built from the row's **stored** key, which is not always its
19840
- * published `kind`: a track's face/plate crop is stored as `crop` under
19874
+ * The URL is built from the row's own id, which since D482 says nothing about
19875
+ * the row's owner or kind and that is the point. The published `kind` is not
19876
+ * the stored one (a track's face/plate crop is stored as `crop` under
19841
19877
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19842
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19878
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19879
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19880
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19843
19881
  *
19844
19882
  * ## `base64` is TRANSITIONAL and is going away
19845
19883
  *
@@ -19852,7 +19890,19 @@ var MediaFileKindEnum = _enum([
19852
19890
  * `analytics-query-facade.ts`; nothing else reads it.
19853
19891
  */
19854
19892
  var MediaFileSchema = object({
19855
- key: string(),
19893
+ /**
19894
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19895
+ *
19896
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19897
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19898
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19899
+ * different rows that spell the same number, and a track whose
19900
+ * `bestEventId` was an object event was served a motion event's snapshot —
19901
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19902
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19903
+ * at all.
19904
+ */
19905
+ mediaId: number().int(),
19856
19906
  kind: MediaFileKindEnum,
19857
19907
  sizeBytes: number(),
19858
19908
  timestamp: number()
@@ -19960,7 +20010,7 @@ var RetrainTrackSchema = object({
19960
20010
  });
19961
20011
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19962
20012
  var RetrainFrameCandidateSchema = object({
19963
- mediaKey: string(),
20013
+ mediaId: number().int(),
19964
20014
  kind: MediaFileKindEnum,
19965
20015
  timestamp: number(),
19966
20016
  sizeBytes: number().int(),
@@ -19974,7 +20024,7 @@ var RetrainFrameSchema = object({
19974
20024
  deviceId: number(),
19975
20025
  trackId: string(),
19976
20026
  /** Provenance only. It may already point at nothing — that is expected. */
19977
- sourceMediaKey: string(),
20027
+ sourceMediaId: number().int(),
19978
20028
  sourceKind: MediaFileKindEnum,
19979
20029
  sizeBytes: number().int(),
19980
20030
  width: number().int(),
@@ -19990,7 +20040,7 @@ var RetrainCopyRefusalSchema = _enum([
19990
20040
  var RetrainFrameSelectionSchema = object({
19991
20041
  copied: array(RetrainFrameSchema).readonly(),
19992
20042
  refused: array(object({
19993
- sourceMediaKey: string(),
20043
+ sourceMediaId: number().int(),
19994
20044
  reason: RetrainCopyRefusalSchema
19995
20045
  })).readonly()
19996
20046
  });
@@ -19998,7 +20048,7 @@ var RetrainFrameListSchema = object({
19998
20048
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19999
20049
  copies: array(RetrainFrameSchema).readonly(),
20000
20050
  /** What the page pre-selects — the native key frame when one survives. */
20001
- autoPickMediaKey: string().optional()
20051
+ autoPickMediaId: number().int().optional()
20002
20052
  });
20003
20053
  /** What the operator asked the assist to look for. */
20004
20054
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20093,9 +20143,11 @@ var RecentTracksQueryInput = object({
20093
20143
  });
20094
20144
  /**
20095
20145
  * A Summary (D359): the per-camera session envelope that references tracks.
20096
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20097
- * served by the event-media plane by key), null until the first frame with a
20098
- * member visible has been materialised.
20146
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20147
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20148
+ * first frame with a member visible has been materialised (D482 — it was the
20149
+ * row's composite key, which embedded the owner and could name another table's
20150
+ * row once event ids became per-table rowids).
20099
20151
  */
20100
20152
  var SummarySchema = object({
20101
20153
  id: string(),
@@ -20104,7 +20156,7 @@ var SummarySchema = object({
20104
20156
  lastActiveAt: number(),
20105
20157
  sealedAt: number().nullable(),
20106
20158
  memberCount: number().int().nonnegative(),
20107
- groupShotKey: string().nullable()
20159
+ groupShotMediaId: number().int().nullable()
20108
20160
  });
20109
20161
  var SummariesQueryInput = object({
20110
20162
  deviceIds: array(number()).min(1),
@@ -20658,7 +20710,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20658
20710
  }), method(object({
20659
20711
  deviceId: number(),
20660
20712
  trackId: string(),
20661
- mediaKeys: array(string()).min(1)
20713
+ mediaIds: array(number().int()).min(1)
20662
20714
  }), RetrainFrameSelectionSchema, {
20663
20715
  kind: "mutation",
20664
20716
  auth: "admin"
@@ -20726,7 +20778,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20726
20778
  kind: "query",
20727
20779
  auth: "admin"
20728
20780
  }), method(object({
20729
- eventId: string(),
20781
+ /** Which of the three event tables owns the row. */
20782
+ ownerType: EventOwnerTypeSchema,
20783
+ /** The event's rowid in that table (D474: an event id is a number). */
20784
+ eventId: number().int(),
20730
20785
  kind: MediaFileKindEnum.optional(),
20731
20786
  deviceId: number()
20732
20787
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20737,7 +20792,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20737
20792
  trackId: string(),
20738
20793
  deviceId: number()
20739
20794
  }), array(MediaFileInfoSchema).readonly()), method(object({
20740
- eventId: string(),
20795
+ ownerType: EventOwnerTypeSchema,
20796
+ eventId: number().int(),
20741
20797
  deviceId: number()
20742
20798
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20743
20799
  kind: "mutation",
@@ -26042,8 +26098,8 @@ var IdentitySchema = object({
26042
26098
  id: string(),
26043
26099
  name: string(),
26044
26100
  sampleCount: number().int().nonnegative(),
26045
- coverMediaKey: string().optional(),
26046
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26101
+ coverMediaId: number().int().optional(),
26102
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26047
26103
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26048
26104
  coverBase64: string().optional()
26049
26105
  });
@@ -26069,8 +26125,8 @@ var IdentitySampleAuditRowSchema = object({
26069
26125
  enrolledAt: number().int(),
26070
26126
  deviceId: number().int().optional(),
26071
26127
  source: _enum(["detected", "photo"]),
26072
- /** The enrolled crop's media key, so the panel can show the evidence. */
26073
- mediaKey: string().optional(),
26128
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26129
+ mediaId: number().int().optional(),
26074
26130
  /**
26075
26131
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26076
26132
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26139,15 +26195,15 @@ var FaceInfoSchema = object({
26139
26195
  */
26140
26196
  cropUrl: string().optional(),
26141
26197
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26142
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26198
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26143
26199
  * legacy rows written before design B. */
26144
26200
  faceBbox: BoundingBoxSchema.optional(),
26145
26201
  /** Design B: MediaStore key of the track's native-resolution key frame.
26146
26202
  * Fetch the native JPEG via the event-media data-plane
26147
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26203
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26148
26204
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26149
26205
  * back to the inline `base64` face crop. */
26150
- keyFrameMediaKey: string().optional(),
26206
+ keyFrameMediaId: number().int().optional(),
26151
26207
  /** Winning identity-match cosine (0..1) for this face's track, when an
26152
26208
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26153
26209
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26216,11 +26272,14 @@ var FaceClusterSchema = object({
26216
26272
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26217
26273
  * dialog already rendering its key FRAME from the `event-media` plane.
26218
26274
  *
26219
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26220
- * media key directly, so this needed no new plane and no new access decision.
26275
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26276
+ * resolves a media row by its own id, so this needed no new plane and no new
26277
+ * access decision.
26221
26278
  */
26222
26279
  var MediaFileLiteSchema$1 = object({
26223
- key: string(),
26280
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26281
+ * (D482). It was the row's composite key, which embedded the owner. */
26282
+ mediaId: number().int(),
26224
26283
  kind: string(),
26225
26284
  url: string(),
26226
26285
  sizeBytes: number(),
@@ -26237,7 +26296,7 @@ method(object({
26237
26296
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26238
26297
  * four times and the viewer holds at `staleTime: 30_000`.
26239
26298
  *
26240
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26299
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26241
26300
  * the `event-media` plane serves that key `immutable` with an ETag.
26242
26301
  *
26243
26302
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29600,8 +29659,8 @@ var VehicleSchema = object({
29600
29659
  id: string(),
29601
29660
  name: string(),
29602
29661
  sampleCount: number().int().nonnegative(),
29603
- coverMediaKey: string().optional(),
29604
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29662
+ coverMediaId: number().int().optional(),
29663
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29605
29664
  coverBase64: string().optional()
29606
29665
  });
29607
29666
  var VehicleSampleInfoSchema = object({
@@ -29634,7 +29693,7 @@ var PlateInfoSchema = object({
29634
29693
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29635
29694
  plateBbox: BoundingBoxSchema.optional(),
29636
29695
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29637
- keyFrameMediaKey: string().optional(),
29696
+ keyFrameMediaId: number().int().optional(),
29638
29697
  base64: string().optional(),
29639
29698
  /**
29640
29699
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29655,11 +29714,14 @@ var PlateInfoSchema = object({
29655
29714
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29656
29715
  * dialog already rendering its key FRAME from the `event-media` plane.
29657
29716
  *
29658
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29659
- * media key directly, so this needed no new plane and no new access decision.
29717
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29718
+ * resolves a media row by its own id, so this needed no new plane and no new
29719
+ * access decision.
29660
29720
  */
29661
29721
  var MediaFileLiteSchema = object({
29662
- key: string(),
29722
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29723
+ * (D482). It was the row's composite key, which embedded the owner. */
29724
+ mediaId: number().int(),
29663
29725
  kind: string(),
29664
29726
  url: string(),
29665
29727
  sizeBytes: number(),
@@ -29718,7 +29780,7 @@ method(object({
29718
29780
  }), method(object({
29719
29781
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29720
29782
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29721
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29783
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29722
29784
  * INPUT field: stripped by the hub router until the train ships, which
29723
29785
  * resolves to `false` and is exactly the intended default. */
29724
29786
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31287,7 +31349,14 @@ var SceneReferenceSchema = object({
31287
31349
  modelId: string(),
31288
31350
  condition: SceneConditionSchema,
31289
31351
  capturedAt: number(),
31290
- thumbnailMediaId: string().optional(),
31352
+ /**
31353
+ * The reference thumbnail's media ROW id (D482).
31354
+ *
31355
+ * The name already said `mediaId` while the value was the row's composite
31356
+ * key — a leftover that read as done and was not. It is the row's own id
31357
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31358
+ */
31359
+ thumbnailMediaId: number().int().optional(),
31291
31360
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31292
31361
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31293
31362
  * normalized rect frame a different piece of world, and the scene would
@@ -33271,7 +33340,7 @@ var StationaryObjectSchema = object({
33271
33340
  /** Enrichment label carried from the source track (identity / plate). */
33272
33341
  label: string().optional(),
33273
33342
  /** Native-resolution key-frame media key for the parked object's best image. */
33274
- keyFrameMediaKey: string().optional()
33343
+ keyFrameMediaId: number().int().optional()
33275
33344
  });
33276
33345
  var CameraOccupancySnapshotSchema = object({
33277
33346
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -36075,6 +36144,12 @@ Object.freeze({
36075
36144
  addonId: null,
36076
36145
  access: "create"
36077
36146
  },
36147
+ "dataStoreProvider.upsert": {
36148
+ capName: "data-store-provider",
36149
+ capScope: "system",
36150
+ addonId: null,
36151
+ access: "create"
36152
+ },
36078
36153
  "dayNight.getOptions": {
36079
36154
  capName: "day-night",
36080
36155
  capScope: "device",
@@ -39939,6 +40014,12 @@ Object.freeze({
39939
40014
  addonId: null,
39940
40015
  access: "create"
39941
40016
  },
40017
+ "settingsStore.upsert": {
40018
+ capName: "settings-store",
40019
+ capScope: "system",
40020
+ addonId: null,
40021
+ access: "create"
40022
+ },
39942
40023
  "smtpProvider.getStatus": {
39943
40024
  capName: "smtp-provider",
39944
40025
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.99",
3
+ "version": "1.2.100",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",