@camstack/addon-terminal 0.1.103 → 0.1.105

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
@@ -31,7 +31,7 @@ let node_module = require("node:module");
31
31
  let sharp = require("sharp");
32
32
  sharp = __toESM(sharp);
33
33
  let node_http = require("node:http");
34
- //#region ../types/dist/event-category-DAXzJeTX.mjs
34
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
35
35
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
36
36
  EventCategory["SystemBoot"] = "system.boot";
37
37
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -592,7 +592,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
592
592
  * a package zone — a newly-appeared stationary object of a package class
593
593
  * that cleared the class / zone / dwell / size gates. Payload:
594
594
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
595
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
595
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
596
596
  * Telemetry (D8): the durable record is the `package-events` store row;
597
597
  * this bus topic drives notifier rules + live UI. See
598
598
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5378,7 +5378,7 @@ var ZodIssueCode = {
5378
5378
  var ZodFirstPartyTypeKind;
5379
5379
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5380
5380
  //#endregion
5381
- //#region ../types/dist/sleep-BnujYGPe.mjs
5381
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5382
5382
  /**
5383
5383
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5384
5384
  * window to float samples (D455).
@@ -7404,13 +7404,30 @@ new Set([
7404
7404
  "scene",
7405
7405
  "motion",
7406
7406
  "object",
7407
- "audio"
7407
+ "audio",
7408
+ "mosaic"
7408
7409
  ]);
7409
- new Set([
7410
+ /**
7411
+ * The owner types that are event tables, in the order the event-media resolver
7412
+ * should consider them. Exported so a consumer asking "is this key an event?"
7413
+ * does not re-spell the list and drift from it.
7414
+ */
7415
+ var EVENT_OWNER_TYPES = [
7410
7416
  "motion",
7411
7417
  "object",
7412
7418
  "audio"
7413
- ]);
7419
+ ];
7420
+ /**
7421
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7422
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7423
+ * `(table, id)`).
7424
+ *
7425
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7426
+ * table would otherwise be accepted by the codec and refused at the door, with
7427
+ * nothing failing until a caller asked.
7428
+ */
7429
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7430
+ new Set(EVENT_OWNER_TYPES);
7414
7431
  var EncodeProfileSchema = object({
7415
7432
  video: object({
7416
7433
  codec: _enum([
@@ -12617,6 +12634,16 @@ method(object({
12617
12634
  filter: QueryFilterSchema.optional(),
12618
12635
  columns: array(string()).readonly().optional()
12619
12636
  }), array(SettingsRecordSchema).readonly()), method(object({
12637
+ namespace: string().optional(),
12638
+ collection: string(),
12639
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12640
+ * index on the collection. Never empty. */
12641
+ conflict: array(string()).readonly(),
12642
+ record: BulkRecordSchema
12643
+ }), object({
12644
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12645
+ * row's own id on an update. */
12646
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12620
12647
  namespace: string().optional(),
12621
12648
  collection: string(),
12622
12649
  record: object({
@@ -12751,6 +12778,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12751
12778
  id: union([string(), number()]) }), {
12752
12779
  kind: "mutation",
12753
12780
  auth: "admin"
12781
+ }), method(object({
12782
+ namespace: string().optional(),
12783
+ collection: string(),
12784
+ conflict: array(string()).readonly(),
12785
+ record: BulkRecordSchema
12786
+ }), object({ id: union([string(), number()]) }), {
12787
+ kind: "mutation",
12788
+ auth: "admin"
12754
12789
  }), method(object({
12755
12790
  namespace: string().optional(),
12756
12791
  collection: string(),
@@ -19152,8 +19187,8 @@ var TrackPositionSchema = object({
19152
19187
  var TrackSnapshotSchema = object({
19153
19188
  timestamp: number(),
19154
19189
  position: TrackPositionSchema,
19155
- /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */
19156
- mediaKey: string()
19190
+ /** The snapshot's media row id (D482); resolve via `listTrackMedia({ trackId })`. */
19191
+ mediaId: number().int()
19157
19192
  });
19158
19193
  /**
19159
19194
  * Normalized 0..1 trajectory envelope (min/max over every position bbox,
@@ -19757,14 +19792,14 @@ var ObjectEventSchema = object({
19757
19792
  * pixel-space `bbox` onto a displayed image. Omitted in slim projection. */
19758
19793
  frameWidth: number().optional(),
19759
19794
  frameHeight: number().optional(),
19760
- /** MediaStore key for the crop attached to this event (if any). */
19761
- mediaKey: string().optional(),
19762
- /** Design B: MediaStore key of the track's native-resolution key frame (the
19795
+ /** Media row id of the crop attached to this event (if any) — D482. */
19796
+ mediaId: number().int().optional(),
19797
+ /** Design B: media row id of the track's native-resolution key frame (the
19763
19798
  * best-detection full frame). Resolve via the event-media data-plane
19764
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
19799
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`) for a detail view that
19765
19800
  * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
19766
- * sources — consumers fall back to `mediaKey` (the tight crop). */
19767
- keyFrameMediaKey: string().optional(),
19801
+ * sources — consumers fall back to `mediaId` (the tight crop). */
19802
+ keyFrameMediaId: number().int().optional(),
19768
19803
  /** Populated by B5 (recording playback URL for this event). */
19769
19804
  mediaUrl: string().optional(),
19770
19805
  /** The parent track's key-event importance [0,1], propagated to every object
@@ -19814,7 +19849,7 @@ var MediaFileKindEnum = _enum([
19814
19849
  * hub-main's heap on the way past — for an `<img>` that would have cached it.
19815
19850
  *
19816
19851
  * `url` points at the `event-media` data plane
19817
- * (`/addon/<addonId>/event-media/<storedKey>`), which serves the same blob
19852
+ * (`/addon/<addonId>/event-media/m/<mediaId>` — D482), which serves the same blob
19818
19853
  * with an ETag and `Cache-Control: immutable`, honours conditional GETs, can
19819
19854
  * render a `?variant=thumb`, and streams. The hub gate in front of it requires
19820
19855
  * a bearer or the session cookie (`access: 'authenticated'`), so the bytes are
@@ -19822,10 +19857,13 @@ var MediaFileKindEnum = _enum([
19822
19857
  * `data-plane-access.ts` for the rule and the one gap it does not close
19823
19858
  * (per-device scoping).
19824
19859
  *
19825
- * The URL is built from the row's **stored** key, which is not always its
19826
- * published `kind`: a track's face/plate crop is stored as `crop` under
19860
+ * The URL is built from the row's own id, which since D482 says nothing about
19861
+ * the row's owner or kind and that is the point. The published `kind` is not
19862
+ * the stored one (a track's face/plate crop is stored as `crop` under
19827
19863
  * `('face'|'plate', '<prefix>-<trackId>')` and published as
19828
- * `faceCrop`/`plateCrop`. `MediaStore.getByKey` knows only the stored key.
19864
+ * `faceCrop`/`plateCrop`), and under the old composite key the URL had to be
19865
+ * taken from `row.key` verbatim or it 404'd exactly those two rows. An id
19866
+ * cannot be mis-reconstructed, because there is nothing in it to reconstruct.
19829
19867
  *
19830
19868
  * ## `base64` is TRANSITIONAL and is going away
19831
19869
  *
@@ -19838,7 +19876,19 @@ var MediaFileKindEnum = _enum([
19838
19876
  * `analytics-query-facade.ts`; nothing else reads it.
19839
19877
  */
19840
19878
  var MediaFileSchema = object({
19841
- key: string(),
19879
+ /**
19880
+ * The media row's OWN id — the rowid SQLite assigned it (D482).
19881
+ *
19882
+ * It used to be the row's composite key, `<ownerType>:<ownerId>:<fileKind>
19883
+ * [:<timestampMs>]`, which embedded a FOREIGN id. D474 made event ids
19884
+ * per-table rowid aliases, so `object:101314` and `motion:101314` are two
19885
+ * different rows that spell the same number, and a track whose
19886
+ * `bestEventId` was an object event was served a motion event's snapshot —
19887
+ * a night-time thumbnail on an afternoon track, with no error anywhere. A
19888
+ * surrogate id cannot name the wrong row's owner, because it names no owner
19889
+ * at all.
19890
+ */
19891
+ mediaId: number().int(),
19842
19892
  kind: MediaFileKindEnum,
19843
19893
  sizeBytes: number(),
19844
19894
  timestamp: number()
@@ -19946,7 +19996,7 @@ var RetrainTrackSchema = object({
19946
19996
  });
19947
19997
  /** A frame the picker may offer — an index row, no blob was read to produce it. */
19948
19998
  var RetrainFrameCandidateSchema = object({
19949
- mediaKey: string(),
19999
+ mediaId: number().int(),
19950
20000
  kind: MediaFileKindEnum,
19951
20001
  timestamp: number(),
19952
20002
  sizeBytes: number().int(),
@@ -19960,7 +20010,7 @@ var RetrainFrameSchema = object({
19960
20010
  deviceId: number(),
19961
20011
  trackId: string(),
19962
20012
  /** Provenance only. It may already point at nothing — that is expected. */
19963
- sourceMediaKey: string(),
20013
+ sourceMediaId: number().int(),
19964
20014
  sourceKind: MediaFileKindEnum,
19965
20015
  sizeBytes: number().int(),
19966
20016
  width: number().int(),
@@ -19976,7 +20026,7 @@ var RetrainCopyRefusalSchema = _enum([
19976
20026
  var RetrainFrameSelectionSchema = object({
19977
20027
  copied: array(RetrainFrameSchema).readonly(),
19978
20028
  refused: array(object({
19979
- sourceMediaKey: string(),
20029
+ sourceMediaId: number().int(),
19980
20030
  reason: RetrainCopyRefusalSchema
19981
20031
  })).readonly()
19982
20032
  });
@@ -19984,7 +20034,7 @@ var RetrainFrameListSchema = object({
19984
20034
  candidates: array(RetrainFrameCandidateSchema).readonly(),
19985
20035
  copies: array(RetrainFrameSchema).readonly(),
19986
20036
  /** What the page pre-selects — the native key frame when one survives. */
19987
- autoPickMediaKey: string().optional()
20037
+ autoPickMediaId: number().int().optional()
19988
20038
  });
19989
20039
  /** What the operator asked the assist to look for. */
19990
20040
  var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
@@ -20079,9 +20129,11 @@ var RecentTracksQueryInput = object({
20079
20129
  });
20080
20130
  /**
20081
20131
  * A Summary (D359): the per-camera session envelope that references tracks.
20082
- * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20083
- * served by the event-media plane by key), null until the first frame with a
20084
- * member visible has been materialised.
20132
+ * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
20133
+ * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
20134
+ * first frame with a member visible has been materialised (D482 — it was the
20135
+ * row's composite key, which embedded the owner and could name another table's
20136
+ * row once event ids became per-table rowids).
20085
20137
  */
20086
20138
  var SummarySchema = object({
20087
20139
  id: string(),
@@ -20090,7 +20142,7 @@ var SummarySchema = object({
20090
20142
  lastActiveAt: number(),
20091
20143
  sealedAt: number().nullable(),
20092
20144
  memberCount: number().int().nonnegative(),
20093
- groupShotKey: string().nullable()
20145
+ groupShotMediaId: number().int().nullable()
20094
20146
  });
20095
20147
  var SummariesQueryInput = object({
20096
20148
  deviceIds: array(number()).min(1),
@@ -20644,7 +20696,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20644
20696
  }), method(object({
20645
20697
  deviceId: number(),
20646
20698
  trackId: string(),
20647
- mediaKeys: array(string()).min(1)
20699
+ mediaIds: array(number().int()).min(1)
20648
20700
  }), RetrainFrameSelectionSchema, {
20649
20701
  kind: "mutation",
20650
20702
  auth: "admin"
@@ -20712,7 +20764,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20712
20764
  kind: "query",
20713
20765
  auth: "admin"
20714
20766
  }), method(object({
20715
- eventId: string(),
20767
+ /** Which of the three event tables owns the row. */
20768
+ ownerType: EventOwnerTypeSchema,
20769
+ /** The event's rowid in that table (D474: an event id is a number). */
20770
+ eventId: number().int(),
20716
20771
  kind: MediaFileKindEnum.optional(),
20717
20772
  deviceId: number()
20718
20773
  }), array(MediaFileSchema).readonly()), method(object({
@@ -20723,7 +20778,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20723
20778
  trackId: string(),
20724
20779
  deviceId: number()
20725
20780
  }), array(MediaFileInfoSchema).readonly()), method(object({
20726
- eventId: string(),
20781
+ ownerType: EventOwnerTypeSchema,
20782
+ eventId: number().int(),
20727
20783
  deviceId: number()
20728
20784
  }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
20729
20785
  kind: "mutation",
@@ -26064,8 +26120,8 @@ var IdentitySchema = object({
26064
26120
  id: string(),
26065
26121
  name: string(),
26066
26122
  sampleCount: number().int().nonnegative(),
26067
- coverMediaKey: string().optional(),
26068
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26123
+ coverMediaId: number().int().optional(),
26124
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26069
26125
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26070
26126
  coverBase64: string().optional()
26071
26127
  });
@@ -26091,8 +26147,8 @@ var IdentitySampleAuditRowSchema = object({
26091
26147
  enrolledAt: number().int(),
26092
26148
  deviceId: number().int().optional(),
26093
26149
  source: _enum(["detected", "photo"]),
26094
- /** The enrolled crop's media key, so the panel can show the evidence. */
26095
- mediaKey: string().optional(),
26150
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26151
+ mediaId: number().int().optional(),
26096
26152
  /**
26097
26153
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26098
26154
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26161,15 +26217,15 @@ var FaceInfoSchema = object({
26161
26217
  */
26162
26218
  cropUrl: string().optional(),
26163
26219
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26164
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26220
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26165
26221
  * legacy rows written before design B. */
26166
26222
  faceBbox: BoundingBoxSchema.optional(),
26167
26223
  /** Design B: MediaStore key of the track's native-resolution key frame.
26168
26224
  * Fetch the native JPEG via the event-media data-plane
26169
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26225
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26170
26226
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26171
26227
  * back to the inline `base64` face crop. */
26172
- keyFrameMediaKey: string().optional(),
26228
+ keyFrameMediaId: number().int().optional(),
26173
26229
  /** Winning identity-match cosine (0..1) for this face's track, when an
26174
26230
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26175
26231
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26238,11 +26294,14 @@ var FaceClusterSchema = object({
26238
26294
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26239
26295
  * dialog already rendering its key FRAME from the `event-media` plane.
26240
26296
  *
26241
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26242
- * media key directly, so this needed no new plane and no new access decision.
26297
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26298
+ * resolves a media row by its own id, so this needed no new plane and no new
26299
+ * access decision.
26243
26300
  */
26244
26301
  var MediaFileLiteSchema$1 = object({
26245
- key: string(),
26302
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26303
+ * (D482). It was the row's composite key, which embedded the owner. */
26304
+ mediaId: number().int(),
26246
26305
  kind: string(),
26247
26306
  url: string(),
26248
26307
  sizeBytes: number(),
@@ -26259,7 +26318,7 @@ method(object({
26259
26318
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26260
26319
  * four times and the viewer holds at `staleTime: 30_000`.
26261
26320
  *
26262
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26321
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26263
26322
  * the `event-media` plane serves that key `immutable` with an ETag.
26264
26323
  *
26265
26324
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29622,8 +29681,8 @@ var VehicleSchema = object({
29622
29681
  id: string(),
29623
29682
  name: string(),
29624
29683
  sampleCount: number().int().nonnegative(),
29625
- coverMediaKey: string().optional(),
29626
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29684
+ coverMediaId: number().int().optional(),
29685
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29627
29686
  coverBase64: string().optional()
29628
29687
  });
29629
29688
  var VehicleSampleInfoSchema = object({
@@ -29656,7 +29715,7 @@ var PlateInfoSchema = object({
29656
29715
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29657
29716
  plateBbox: BoundingBoxSchema.optional(),
29658
29717
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29659
- keyFrameMediaKey: string().optional(),
29718
+ keyFrameMediaId: number().int().optional(),
29660
29719
  base64: string().optional(),
29661
29720
  /**
29662
29721
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29677,11 +29736,14 @@ var PlateInfoSchema = object({
29677
29736
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29678
29737
  * dialog already rendering its key FRAME from the `event-media` plane.
29679
29738
  *
29680
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29681
- * media key directly, so this needed no new plane and no new access decision.
29739
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29740
+ * resolves a media row by its own id, so this needed no new plane and no new
29741
+ * access decision.
29682
29742
  */
29683
29743
  var MediaFileLiteSchema = object({
29684
- key: string(),
29744
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29745
+ * (D482). It was the row's composite key, which embedded the owner. */
29746
+ mediaId: number().int(),
29685
29747
  kind: string(),
29686
29748
  url: string(),
29687
29749
  sizeBytes: number(),
@@ -29740,7 +29802,7 @@ method(object({
29740
29802
  }), method(object({
29741
29803
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29742
29804
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29743
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29805
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29744
29806
  * INPUT field: stripped by the hub router until the train ships, which
29745
29807
  * resolves to `false` and is exactly the intended default. */
29746
29808
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31309,7 +31371,14 @@ var SceneReferenceSchema = object({
31309
31371
  modelId: string(),
31310
31372
  condition: SceneConditionSchema,
31311
31373
  capturedAt: number(),
31312
- thumbnailMediaId: string().optional(),
31374
+ /**
31375
+ * The reference thumbnail's media ROW id (D482).
31376
+ *
31377
+ * The name already said `mediaId` while the value was the row's composite
31378
+ * key — a leftover that read as done and was not. It is the row's own id
31379
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31380
+ */
31381
+ thumbnailMediaId: number().int().optional(),
31313
31382
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31314
31383
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31315
31384
  * normalized rect frame a different piece of world, and the scene would
@@ -33293,7 +33362,7 @@ var StationaryObjectSchema = object({
33293
33362
  /** Enrichment label carried from the source track (identity / plate). */
33294
33363
  label: string().optional(),
33295
33364
  /** Native-resolution key-frame media key for the parked object's best image. */
33296
- keyFrameMediaKey: string().optional()
33365
+ keyFrameMediaId: number().int().optional()
33297
33366
  });
33298
33367
  var CameraOccupancySnapshotSchema = object({
33299
33368
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -35613,6 +35682,12 @@ Object.freeze({
35613
35682
  addonId: null,
35614
35683
  access: "create"
35615
35684
  },
35685
+ "dataStoreProvider.upsert": {
35686
+ capName: "data-store-provider",
35687
+ capScope: "system",
35688
+ addonId: null,
35689
+ access: "create"
35690
+ },
35616
35691
  "dayNight.getOptions": {
35617
35692
  capName: "day-night",
35618
35693
  capScope: "device",
@@ -39477,6 +39552,12 @@ Object.freeze({
39477
39552
  addonId: null,
39478
39553
  access: "create"
39479
39554
  },
39555
+ "settingsStore.upsert": {
39556
+ capName: "settings-store",
39557
+ capScope: "system",
39558
+ addonId: null,
39559
+ access: "create"
39560
+ },
39480
39561
  "smtpProvider.getStatus": {
39481
39562
  capName: "smtp-provider",
39482
39563
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -8,7 +8,7 @@ import { createServer } from "node:http";
8
8
  //#region \0rolldown/runtime.js
9
9
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
10
10
  //#endregion
11
- //#region ../types/dist/event-category-DAXzJeTX.mjs
11
+ //#region ../types/dist/event-category-ZyX6jcse.mjs
12
12
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
13
13
  EventCategory["SystemBoot"] = "system.boot";
14
14
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -569,7 +569,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
569
569
  * a package zone — a newly-appeared stationary object of a package class
570
570
  * that cleared the class / zone / dwell / size gates. Payload:
571
571
  * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
572
- * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
572
+ * entryId, className, zoneIds, keyFrameMediaId?, bbox, timestamp }`.
573
573
  * Telemetry (D8): the durable record is the `package-events` store row;
574
574
  * this bus topic drives notifier rules + live UI. See
575
575
  * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
@@ -5355,7 +5355,7 @@ var ZodIssueCode = {
5355
5355
  var ZodFirstPartyTypeKind;
5356
5356
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5357
5357
  //#endregion
5358
- //#region ../types/dist/sleep-BnujYGPe.mjs
5358
+ //#region ../types/dist/sleep-CnLyvg3w.mjs
5359
5359
  /**
5360
5360
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5361
5361
  * window to float samples (D455).
@@ -7381,13 +7381,30 @@ new Set([
7381
7381
  "scene",
7382
7382
  "motion",
7383
7383
  "object",
7384
- "audio"
7384
+ "audio",
7385
+ "mosaic"
7385
7386
  ]);
7386
- new Set([
7387
+ /**
7388
+ * The owner types that are event tables, in the order the event-media resolver
7389
+ * should consider them. Exported so a consumer asking "is this key an event?"
7390
+ * does not re-spell the list and drift from it.
7391
+ */
7392
+ var EVENT_OWNER_TYPES = [
7387
7393
  "motion",
7388
7394
  "object",
7389
7395
  "audio"
7390
- ]);
7396
+ ];
7397
+ /**
7398
+ * The same list as a Zod enum, for the cap inputs that must NAME the table
7399
+ * (D482: `getEventMedia` / `listEventMedia` take an owner, and an owner is
7400
+ * `(table, id)`).
7401
+ *
7402
+ * Built FROM {@link EVENT_OWNER_TYPES} rather than re-spelled: a fourth event
7403
+ * table would otherwise be accepted by the codec and refused at the door, with
7404
+ * nothing failing until a caller asked.
7405
+ */
7406
+ var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7407
+ new Set(EVENT_OWNER_TYPES);
7391
7408
  var EncodeProfileSchema = object({
7392
7409
  video: object({
7393
7410
  codec: _enum([
@@ -12594,6 +12611,16 @@ method(object({
12594
12611
  filter: QueryFilterSchema.optional(),
12595
12612
  columns: array(string()).readonly().optional()
12596
12613
  }), array(SettingsRecordSchema).readonly()), method(object({
12614
+ namespace: string().optional(),
12615
+ collection: string(),
12616
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
12617
+ * index on the collection. Never empty. */
12618
+ conflict: array(string()).readonly(),
12619
+ record: BulkRecordSchema
12620
+ }), object({
12621
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
12622
+ * row's own id on an update. */
12623
+ id: union([string(), number()]) }), { kind: "mutation" }), method(object({
12597
12624
  namespace: string().optional(),
12598
12625
  collection: string(),
12599
12626
  record: object({
@@ -12728,6 +12755,14 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12728
12755
  id: union([string(), number()]) }), {
12729
12756
  kind: "mutation",
12730
12757
  auth: "admin"
12758
+ }), method(object({
12759
+ namespace: string().optional(),
12760
+ collection: string(),
12761
+ conflict: array(string()).readonly(),
12762
+ record: BulkRecordSchema
12763
+ }), object({ id: union([string(), number()]) }), {
12764
+ kind: "mutation",
12765
+ auth: "admin"
12731
12766
  }), method(object({
12732
12767
  namespace: string().optional(),
12733
12768
  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",
@@ -26041,8 +26097,8 @@ var IdentitySchema = object({
26041
26097
  id: string(),
26042
26098
  name: string(),
26043
26099
  sampleCount: number().int().nonnegative(),
26044
- coverMediaKey: string().optional(),
26045
- /** Inline base64 of the cover sample's crop, resolved from `coverMediaKey`.
26100
+ coverMediaId: number().int().optional(),
26101
+ /** Inline base64 of the cover sample's crop, resolved from `coverMediaId`.
26046
26102
  * Lets the UI render the person's face avatar instead of a placeholder icon. */
26047
26103
  coverBase64: string().optional()
26048
26104
  });
@@ -26068,8 +26124,8 @@ var IdentitySampleAuditRowSchema = object({
26068
26124
  enrolledAt: number().int(),
26069
26125
  deviceId: number().int().optional(),
26070
26126
  source: _enum(["detected", "photo"]),
26071
- /** The enrolled crop's media key, so the panel can show the evidence. */
26072
- mediaKey: string().optional(),
26127
+ /** The enrolled crop's media row id, so the panel can show the evidence. */
26128
+ mediaId: number().int().optional(),
26073
26129
  /**
26074
26130
  * False = the sample is stamped with a DIFFERENT face model, and a cosine
26075
26131
  * across feature spaces is a well-formed float with no meaning. Every number
@@ -26138,15 +26194,15 @@ var FaceInfoSchema = object({
26138
26194
  */
26139
26195
  cropUrl: string().optional(),
26140
26196
  /** Design B: the face bbox (pixel space) on the key frame — lets a detail
26141
- * view draw the box over the native `keyFrameMediaKey` frame. Absent on
26197
+ * view draw the box over the native `keyFrameMediaId` frame. Absent on
26142
26198
  * legacy rows written before design B. */
26143
26199
  faceBbox: BoundingBoxSchema.optional(),
26144
26200
  /** Design B: MediaStore key of the track's native-resolution key frame.
26145
26201
  * Fetch the native JPEG via the event-media data-plane
26146
- * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
26202
+ * (`/addon/<addonId>/event-media/m/<keyFrameMediaId>`). Absent when the
26147
26203
  * track produced no key frame (e.g. native/onboard source) — the UI falls
26148
26204
  * back to the inline `base64` face crop. */
26149
- keyFrameMediaKey: string().optional(),
26205
+ keyFrameMediaId: number().int().optional(),
26150
26206
  /** Winning identity-match cosine (0..1) for this face's track, when an
26151
26207
  * identity was auto-confirmed. Lets the UI surface WHY a face was assigned
26152
26208
  * (confidence badge / low-confidence audit). Absent on legacy rows and on
@@ -26215,11 +26271,14 @@ var FaceClusterSchema = object({
26215
26271
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
26216
26272
  * dialog already rendering its key FRAME from the `event-media` plane.
26217
26273
  *
26218
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
26219
- * media key directly, so this needed no new plane and no new access decision.
26274
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
26275
+ * resolves a media row by its own id, so this needed no new plane and no new
26276
+ * access decision.
26220
26277
  */
26221
26278
  var MediaFileLiteSchema$1 = object({
26222
- key: string(),
26279
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
26280
+ * (D482). It was the row's composite key, which embedded the owner. */
26281
+ mediaId: number().int(),
26223
26282
  kind: string(),
26224
26283
  url: string(),
26225
26284
  sizeBytes: number(),
@@ -26236,7 +26295,7 @@ method(object({
26236
26295
  * covers inline, ~10 KB of base64 per row, on a query this UI mounts
26237
26296
  * four times and the viewer holds at `staleTime: 30_000`.
26238
26297
  *
26239
- * Nothing loses its avatar: `coverMediaKey` is already on every row and
26298
+ * Nothing loses its avatar: `coverMediaId` is already on every row and
26240
26299
  * the `event-media` plane serves that key `immutable` with an ETag.
26241
26300
  *
26242
26301
  * **This is an INPUT field, so it does not reach the addon until the
@@ -29599,8 +29658,8 @@ var VehicleSchema = object({
29599
29658
  id: string(),
29600
29659
  name: string(),
29601
29660
  sampleCount: number().int().nonnegative(),
29602
- coverMediaKey: string().optional(),
29603
- /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaKey`. */
29661
+ coverMediaId: number().int().optional(),
29662
+ /** Inline base64 of the cover sample's plate crop, resolved from `coverMediaId`. */
29604
29663
  coverBase64: string().optional()
29605
29664
  });
29606
29665
  var VehicleSampleInfoSchema = object({
@@ -29633,7 +29692,7 @@ var PlateInfoSchema = object({
29633
29692
  /** keyFrame parity: the plate bbox (pixel space) on the native key frame. */
29634
29693
  plateBbox: BoundingBoxSchema.optional(),
29635
29694
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
29636
- keyFrameMediaKey: string().optional(),
29695
+ keyFrameMediaId: number().int().optional(),
29637
29696
  base64: string().optional(),
29638
29697
  /**
29639
29698
  * Same crop as a data-plane URL, always present when the plate has a stored
@@ -29654,11 +29713,14 @@ var PlateInfoSchema = object({
29654
29713
  * `data:image/jpeg;base64,…` from a row whose `key` sat right beside it, in a
29655
29714
  * dialog already rendering its key FRAME from the `event-media` plane.
29656
29715
  *
29657
- * `url` is `/addon/<addonId>/event-media/<encoded key>`. The plane resolves a
29658
- * media key directly, so this needed no new plane and no new access decision.
29716
+ * `url` is `/addon/<addonId>/event-media/m/<mediaId>` (D482). The plane
29717
+ * resolves a media row by its own id, so this needed no new plane and no new
29718
+ * access decision.
29659
29719
  */
29660
29720
  var MediaFileLiteSchema = object({
29661
- key: string(),
29721
+ /** The media row's own id — the same address `MediaFileRef.mediaId` carries
29722
+ * (D482). It was the row's composite key, which embedded the owner. */
29723
+ mediaId: number().int(),
29662
29724
  kind: string(),
29663
29725
  url: string(),
29664
29726
  sizeBytes: number(),
@@ -29717,7 +29779,7 @@ method(object({
29717
29779
  }), method(object({
29718
29780
  /** Inline {@link VehicleSchema.coverBase64} on every row. Default
29719
29781
  * `false` — the vehicle twin of `faceGallery.listIdentities`'s
29720
- * option; `coverMediaKey` + the `event-media` plane carry the picture.
29782
+ * option; `coverMediaId` + the `event-media` plane carry the picture.
29721
29783
  * INPUT field: stripped by the hub router until the train ships, which
29722
29784
  * resolves to `false` and is exactly the intended default. */
29723
29785
  includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
@@ -31286,7 +31348,14 @@ var SceneReferenceSchema = object({
31286
31348
  modelId: string(),
31287
31349
  condition: SceneConditionSchema,
31288
31350
  capturedAt: number(),
31289
- thumbnailMediaId: string().optional(),
31351
+ /**
31352
+ * The reference thumbnail's media ROW id (D482).
31353
+ *
31354
+ * The name already said `mediaId` while the value was the row's composite
31355
+ * key — a leftover that read as done and was not. It is the row's own id
31356
+ * now, addressed at `/addon/<addonId>/event-media/m/<id>`.
31357
+ */
31358
+ thumbnailMediaId: number().int().optional(),
31290
31359
  /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
31291
31360
  * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
31292
31361
  * normalized rect frame a different piece of world, and the scene would
@@ -33270,7 +33339,7 @@ var StationaryObjectSchema = object({
33270
33339
  /** Enrichment label carried from the source track (identity / plate). */
33271
33340
  label: string().optional(),
33272
33341
  /** Native-resolution key-frame media key for the parked object's best image. */
33273
- keyFrameMediaKey: string().optional()
33342
+ keyFrameMediaId: number().int().optional()
33274
33343
  });
33275
33344
  var CameraOccupancySnapshotSchema = object({
33276
33345
  /** Frame timestamp of the inference result that produced this snapshot. */
@@ -35590,6 +35659,12 @@ Object.freeze({
35590
35659
  addonId: null,
35591
35660
  access: "create"
35592
35661
  },
35662
+ "dataStoreProvider.upsert": {
35663
+ capName: "data-store-provider",
35664
+ capScope: "system",
35665
+ addonId: null,
35666
+ access: "create"
35667
+ },
35593
35668
  "dayNight.getOptions": {
35594
35669
  capName: "day-night",
35595
35670
  capScope: "device",
@@ -39454,6 +39529,12 @@ Object.freeze({
39454
39529
  addonId: null,
39455
39530
  access: "create"
39456
39531
  },
39532
+ "settingsStore.upsert": {
39533
+ capName: "settings-store",
39534
+ capScope: "system",
39535
+ addonId: null,
39536
+ access: "create"
39537
+ },
39457
39538
  "smtpProvider.getStatus": {
39458
39539
  capName: "smtp-provider",
39459
39540
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.103",
3
+ "version": "0.1.105",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",