@camstack/addon-provider-petkit 0.2.28 → 0.2.29

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 +249 -79
  2. package/dist/addon.mjs +249 -79
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -7732,7 +7732,7 @@ function method(input, output, options) {
7732
7732
  input,
7733
7733
  output,
7734
7734
  kind: options?.kind ?? "query",
7735
- auth: options?.auth ?? "protected",
7735
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
7736
7736
  ...options?.access !== void 0 ? { access: options.access } : {},
7737
7737
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
7738
7738
  timeoutMs: options?.timeoutMs
@@ -7756,7 +7756,7 @@ function event(data) {
7756
7756
  }
7757
7757
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
7758
7758
  var VersionOutputSchema$1 = object({ version: string() });
7759
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
7759
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
7760
7760
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
7761
7761
  DeviceType["Camera"] = "camera";
7762
7762
  DeviceType["Hub"] = "hub";
@@ -8077,7 +8077,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8077
8077
  }({});
8078
8078
  var StaticDirOutputSchema = object({ staticDir: string() });
8079
8079
  var VersionOutputSchema = object({ version: string() });
8080
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
8080
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
8081
8081
  /**
8082
8082
  * device-ops — device-scoped cap that unifies the per-IDevice operations
8083
8083
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -8703,24 +8703,6 @@ var RecordingRetentionSchema = object({
8703
8703
  maxSizeGb: number().min(0).optional()
8704
8704
  });
8705
8705
  /**
8706
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
8707
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
8708
- * previews at. Five graduated steps; absent on a config = `standard` (the
8709
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
8710
- *
8711
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
8712
- * Each window's index sidecar carries its own tile dims, so a camera whose
8713
- * preset changed over time renders every historical window at the dims it was
8714
- * written with.
8715
- */
8716
- var ScrubThumbnailPresetSchema = _enum([
8717
- "minimal",
8718
- "low",
8719
- "standard",
8720
- "high",
8721
- "max"
8722
- ]);
8723
- /**
8724
8706
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
8725
8707
  *
8726
8708
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -8728,7 +8710,11 @@ var ScrubThumbnailPresetSchema = _enum([
8728
8710
  * other field is a storage knob (profiles, segment length, retention, scrub).
8729
8711
  *
8730
8712
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
8731
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
8713
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
8714
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
8715
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
8716
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
8717
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
8732
8718
  * A stale caller must fail loudly — silently stripping its legacy intent would
8733
8719
  * persist a band-less config, i.e. silently stop recording the camera.
8734
8720
  */
@@ -8751,14 +8737,7 @@ var RecordingConfigSchema = object({
8751
8737
  * "off" is the absence of a covering band, never a band value.
8752
8738
  */
8753
8739
  bands: array(RecordingBandSchema).default([]),
8754
- retention: RecordingRetentionSchema.optional(),
8755
- /**
8756
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
8757
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
8758
- * windows only — existing sheets are immutable, and each window's index
8759
- * carries its own tile dims so mixed-preset history renders correctly.
8760
- */
8761
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
8740
+ retention: RecordingRetentionSchema.optional()
8762
8741
  }).strict();
8763
8742
  /**
8764
8743
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -8834,10 +8813,11 @@ var RelocateFootageInputSchema = object({
8834
8813
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8835
8814
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8836
8815
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8837
- var StorageMigrationMediaMoveInputSchema = object({
8816
+ var RelocateMediaInputSchema = object({
8838
8817
  toLocationId: string(),
8839
8818
  throttleMbps: number().min(1).max(1e3).optional()
8840
- }).extend({ leaseId: string().min(1) });
8819
+ });
8820
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8841
8821
  /** The independently selectable logical storage classes. `recordings`
8842
8822
  * encompasses the high and mid segment profiles; `recordingsLow` is low
8843
8823
  * segments; `eventMedia` is post-analysis blobs. */
@@ -9132,7 +9112,26 @@ var LabelDefinitionSchema = object({
9132
9112
  description: string().optional(),
9133
9113
  icon: string().optional()
9134
9114
  });
9135
- var ClassMapDefinitionSchema = object({
9115
+ /**
9116
+ * Wire schema for a per-model CATALOG classMap override
9117
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
9118
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
9119
+ * detection pipeline executor actually routes.
9120
+ *
9121
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
9122
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
9123
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
9124
+ * enum) — the two used to share the name `ClassMapDefinition`/
9125
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
9126
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
9127
+ * are not: it is two different concepts colliding on a name. Keep this type
9128
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
9129
+ * would either narrow every `ClassMapDefinition` consumer to the four
9130
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
9131
+ * schema exists for (see the "rejects a classMap whose target is not a
9132
+ * detection macro" test in `model-catalog-schema.test.ts`).
9133
+ */
9134
+ var DetectionCatalogClassMapSchema = object({
9136
9135
  mapping: record(string(), _enum([
9137
9136
  "person",
9138
9137
  "vehicle",
@@ -9337,7 +9336,7 @@ var ModelCatalogEntrySchema = object({
9337
9336
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
9338
9337
  * labels already ARE the CamStack macros (Scrypted identity map).
9339
9338
  */
9340
- classMap: ClassMapDefinitionSchema.optional()
9339
+ classMap: DetectionCatalogClassMapSchema.optional()
9341
9340
  });
9342
9341
  var ConvertTargetSchema = discriminatedUnion("format", [object({
9343
9342
  format: literal("openvino"),
@@ -9367,7 +9366,7 @@ var ModelConvertMetadataSchema = object({
9367
9366
  "segmentation"
9368
9367
  ]),
9369
9368
  faceAlignment: boolean().optional(),
9370
- classMap: ClassMapDefinitionSchema.optional()
9369
+ classMap: DetectionCatalogClassMapSchema.optional()
9371
9370
  });
9372
9371
  var ConvertResultSchema = object({
9373
9372
  entry: ModelCatalogEntrySchema,
@@ -10230,7 +10229,7 @@ var AddonPageDeclarationSchema = object({
10230
10229
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
10231
10230
  sectionLabel: string().optional()
10232
10231
  });
10233
- method(_void(), array(AddonPageDeclarationSchema).readonly());
10232
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
10234
10233
  var AddonHttpRouteSchema = object({
10235
10234
  method: _enum([
10236
10235
  "GET",
@@ -10465,7 +10464,7 @@ var WidgetMetadataSchema = object({
10465
10464
  defaultColumns: number().int().min(1).max(12).default(6),
10466
10465
  defaultRows: number().int().min(1).max(12).default(1)
10467
10466
  });
10468
- method(_void(), array(WidgetMetadataSchema).readonly());
10467
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
10469
10468
  /**
10470
10469
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
10471
10470
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -12089,7 +12088,7 @@ var CustomModelDescriptorSchema = object({
12089
12088
  stepId: string(),
12090
12089
  entry: ModelCatalogEntrySchema
12091
12090
  });
12092
- method(_void(), array(CustomModelDescriptorSchema).readonly());
12091
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
12093
12092
  /**
12094
12093
  * Query filter for settings-store collections.
12095
12094
  */
@@ -12176,7 +12175,8 @@ method(object({
12176
12175
  }), _void(), { kind: "mutation" }), method(object({
12177
12176
  namespace: string().optional(),
12178
12177
  collection: string(),
12179
- filter: QueryFilterSchema.optional()
12178
+ filter: QueryFilterSchema.optional(),
12179
+ columns: array(string()).readonly().optional()
12180
12180
  }), array(SettingsRecordSchema).readonly()), method(object({
12181
12181
  namespace: string().optional(),
12182
12182
  collection: string(),
@@ -12239,46 +12239,87 @@ var EngineInfoSchema = object({
12239
12239
  kind: _enum(["relational", "vector"]),
12240
12240
  displayName: string()
12241
12241
  });
12242
- method(_void(), EngineInfoSchema), method(object({
12242
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12243
12243
  namespace: string().optional(),
12244
12244
  collection: string(),
12245
12245
  key: string()
12246
- }), unknown()), method(object({
12246
+ }), unknown(), { auth: "admin" }), method(object({
12247
12247
  namespace: string().optional(),
12248
12248
  collection: string(),
12249
12249
  key: string(),
12250
12250
  value: unknown()
12251
- }), _void(), { kind: "mutation" }), method(object({
12251
+ }), _void(), {
12252
+ kind: "mutation",
12253
+ auth: "admin"
12254
+ }), method(object({
12252
12255
  namespace: string().optional(),
12253
12256
  collection: string(),
12254
- filter: QueryFilterSchema.optional()
12255
- }), array(SettingsRecordSchema).readonly()), method(object({
12257
+ filter: QueryFilterSchema.optional(),
12258
+ /**
12259
+ * SQL-level column projection — MUST mirror `settings-store.query`.
12260
+ *
12261
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
12262
+ * was wrong — corrected 2026-08-26 after the hop map
12263
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
12264
+ * There is **no Zod parse at all** between the door and the engine: the
12265
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
12266
+ * field declared here reaches `SqliteSettingsBackend` either way.
12267
+ *
12268
+ * What actually lost `columns` was the THIRD declaration of this shape:
12269
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
12270
+ * interface the engine destructures from. The field existed on both
12271
+ * schemas and the engine still never read it, because nothing checks a
12272
+ * registered provider against `InferProvider<cap>` —
12273
+ * `ProviderRegistration.provider` is typed `object`.
12274
+ *
12275
+ * It is declared here anyway, and must stay in step with
12276
+ * `settings-store.query`: a caller reading only the cap definitions has
12277
+ * to be able to see that this call carries a projection.
12278
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
12279
+ */
12280
+ columns: array(string()).readonly().optional()
12281
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
12256
12282
  namespace: string().optional(),
12257
12283
  collection: string(),
12258
12284
  record: SettingsRecordSchema
12259
- }), _void(), { kind: "mutation" }), method(object({
12285
+ }), _void(), {
12286
+ kind: "mutation",
12287
+ auth: "admin"
12288
+ }), method(object({
12260
12289
  namespace: string().optional(),
12261
12290
  collection: string(),
12262
12291
  id: string(),
12263
12292
  data: record(string(), unknown())
12264
- }), _void(), { kind: "mutation" }), method(object({
12293
+ }), _void(), {
12294
+ kind: "mutation",
12295
+ auth: "admin"
12296
+ }), method(object({
12265
12297
  namespace: string().optional(),
12266
12298
  collection: string(),
12267
12299
  key: string()
12268
- }), _void(), { kind: "mutation" }), method(object({
12300
+ }), _void(), {
12301
+ kind: "mutation",
12302
+ auth: "admin"
12303
+ }), method(object({
12269
12304
  namespace: string().optional(),
12270
12305
  collection: string(),
12271
12306
  filter: MutationFilterSchema
12272
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
12307
+ }), object({ deleted: number().int() }), {
12308
+ kind: "mutation",
12309
+ auth: "admin"
12310
+ }), method(object({
12273
12311
  namespace: string().optional(),
12274
12312
  collection: string(),
12275
12313
  filter: MutationFilterSchema,
12276
12314
  data: record(string(), unknown())
12277
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
12315
+ }), object({ updated: number().int() }), {
12316
+ kind: "mutation",
12317
+ auth: "admin"
12318
+ }), method(object({
12278
12319
  namespace: string().optional(),
12279
12320
  collection: string(),
12280
12321
  filter: QueryFilterSchema.optional()
12281
- }), number()), method(object({
12322
+ }), number(), { auth: "admin" }), method(object({
12282
12323
  namespace: string().optional(),
12283
12324
  collection: string(),
12284
12325
  field: string(),
@@ -12288,15 +12329,18 @@ method(_void(), EngineInfoSchema), method(object({
12288
12329
  }), array(object({
12289
12330
  bucket: number().int(),
12290
12331
  count: number().int()
12291
- })).readonly()), method(object({
12332
+ })).readonly(), { auth: "admin" }), method(object({
12292
12333
  namespace: string().optional(),
12293
12334
  collection: string()
12294
- }), boolean()), method(object({
12335
+ }), boolean(), { auth: "admin" }), method(object({
12295
12336
  namespace: string().optional(),
12296
12337
  collection: string(),
12297
12338
  columns: array(CollectionColumnSchema).readonly(),
12298
12339
  indexes: array(CollectionIndexSchema).readonly().optional()
12299
- }), _void(), { kind: "mutation" });
12340
+ }), _void(), {
12341
+ kind: "mutation",
12342
+ auth: "admin"
12343
+ });
12300
12344
  /**
12301
12345
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
12302
12346
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -13603,7 +13647,7 @@ method(object({
13603
13647
  crop: _instanceof(Uint8Array),
13604
13648
  width: number(),
13605
13649
  height: number()
13606
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
13650
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
13607
13651
  /**
13608
13652
  * filesystem-browse — per-node capability for browsing the node's local
13609
13653
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13896,19 +13940,22 @@ method(LlmGenerateBaseInputSchema.extend({
13896
13940
  runtime: ManagedRuntimeConfigSchema,
13897
13941
  /** The managed profile's timeout, threaded by the hub provider. */
13898
13942
  timeoutMs: number().int().positive().optional()
13899
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13943
+ }), LlmGenerateResultSchema, {
13944
+ kind: "mutation",
13945
+ auth: "admin"
13946
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13900
13947
  kind: "mutation",
13901
13948
  auth: "admin"
13902
13949
  }), method(object({}), _void(), {
13903
13950
  kind: "mutation",
13904
13951
  auth: "admin"
13905
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13952
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13906
13953
  kind: "mutation",
13907
13954
  auth: "admin"
13908
13955
  }), method(object({ file: string() }), _void(), {
13909
13956
  kind: "mutation",
13910
13957
  auth: "admin"
13911
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13958
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13912
13959
  /**
13913
13960
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13914
13961
  * methods concat-fan across providers; single-row methods route to ONE
@@ -17419,7 +17466,7 @@ var OauthIntegrationDescriptorSchema = object({
17419
17466
  */
17420
17467
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
17421
17468
  });
17422
- method(_void(), OauthIntegrationDescriptorSchema);
17469
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
17423
17470
  /**
17424
17471
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
17425
17472
  * per-frame detections emitted by the pipeline runner into tracked
@@ -18614,6 +18661,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18614
18661
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18615
18662
  kind: "mutation",
18616
18663
  auth: "admin"
18664
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18665
+ kind: "mutation",
18666
+ auth: "admin"
18667
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
18668
+ kind: "query",
18669
+ auth: "admin"
18670
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18671
+ kind: "mutation",
18672
+ auth: "admin"
18617
18673
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
18618
18674
  kind: "query",
18619
18675
  auth: "admin"
@@ -18768,6 +18824,11 @@ object({
18768
18824
  "jpeg"
18769
18825
  ])
18770
18826
  });
18827
+ /**
18828
+ * Process-local frame identity. It is serializable so it can ride an in-process
18829
+ * capability call, but `registryId` deliberately prevents resolution in any
18830
+ * other process or execution group.
18831
+ */
18771
18832
  var FrameRefSchema = object({
18772
18833
  registryId: string().min(1),
18773
18834
  id: string().min(1),
@@ -20973,7 +21034,7 @@ method(object({
20973
21034
  * linking rather than produce an eternal token.
20974
21035
  */
20975
21036
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20976
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
21037
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20977
21038
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20978
21039
  providerId: string().min(1),
20979
21040
  displayName: string().min(1),
@@ -21068,10 +21129,13 @@ var EvictResultSchema = object({
21068
21129
  /** True when the provider has nothing left it is willing to drop on this location. */
21069
21130
  exhausted: boolean()
21070
21131
  });
21071
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
21132
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
21072
21133
  locationId: string(),
21073
21134
  targetBytes: number().int().positive()
21074
- }), EvictResultSchema, { kind: "mutation" });
21135
+ }), EvictResultSchema, {
21136
+ kind: "mutation",
21137
+ auth: "admin"
21138
+ });
21075
21139
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
21076
21140
  kind: "mutation",
21077
21141
  auth: "admin"
@@ -21131,26 +21195,50 @@ var ReadChunkInputSchema = object({
21131
21195
  length: number()
21132
21196
  });
21133
21197
  var EndDownloadInputSchema = object({ downloadId: string() });
21134
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21198
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21135
21199
  location: StorageLocationSchema,
21136
21200
  relativePath: string()
21137
- }), string()), method(object({
21201
+ }), string(), { auth: "admin" }), method(object({
21138
21202
  location: StorageLocationSchema,
21139
21203
  relativePath: string(),
21140
21204
  data: _instanceof(Uint8Array)
21141
- }), _void(), { kind: "mutation" }), method(object({
21205
+ }), _void(), {
21206
+ kind: "mutation",
21207
+ auth: "admin"
21208
+ }), method(object({
21142
21209
  location: StorageLocationSchema,
21143
21210
  relativePath: string()
21144
- }), _instanceof(Uint8Array)), method(object({
21211
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
21145
21212
  location: StorageLocationSchema,
21146
21213
  relativePath: string()
21147
- }), boolean()), method(object({
21214
+ }), boolean(), { auth: "admin" }), method(object({
21148
21215
  location: StorageLocationSchema,
21149
21216
  prefix: string().optional()
21150
- }), array(string()).readonly()), method(object({
21217
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
21151
21218
  location: StorageLocationSchema,
21152
21219
  relativePath: string()
21153
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
21220
+ }), _void(), {
21221
+ kind: "mutation",
21222
+ auth: "admin"
21223
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
21224
+ kind: "mutation",
21225
+ auth: "admin"
21226
+ }), method(WriteChunkInputSchema, _void(), {
21227
+ kind: "mutation",
21228
+ auth: "admin"
21229
+ }), method(FinalizeUploadInputSchema, _void(), {
21230
+ kind: "mutation",
21231
+ auth: "admin"
21232
+ }), method(AbortUploadInputSchema, _void(), {
21233
+ kind: "mutation",
21234
+ auth: "admin"
21235
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
21236
+ kind: "mutation",
21237
+ auth: "admin"
21238
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
21239
+ kind: "mutation",
21240
+ auth: "admin"
21241
+ });
21154
21242
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21155
21243
  var ProfileSettingsSchemaBridge = unknown().nullable();
21156
21244
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -21408,7 +21496,8 @@ method(object({
21408
21496
  access: "create"
21409
21497
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
21410
21498
  kind: "mutation",
21411
- access: "view"
21499
+ access: "view",
21500
+ auth: "admin"
21412
21501
  }), method(object({
21413
21502
  /** Required — the user the assertion belongs to (verified). */
21414
21503
  userId: string(),
@@ -21416,10 +21505,12 @@ method(object({
21416
21505
  response: record(string(), unknown())
21417
21506
  }), object({ verified: boolean() }), {
21418
21507
  kind: "mutation",
21419
- access: "view"
21508
+ access: "view",
21509
+ auth: "admin"
21420
21510
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
21421
21511
  kind: "mutation",
21422
- access: "view"
21512
+ access: "view",
21513
+ auth: "admin"
21423
21514
  }), method(object({
21424
21515
  /** AuthenticationResponseJSON from the browser. */
21425
21516
  response: record(string(), unknown()) }), object({
@@ -21427,7 +21518,8 @@ response: record(string(), unknown()) }), object({
21427
21518
  userId: string().nullable()
21428
21519
  }), {
21429
21520
  kind: "mutation",
21430
- access: "view"
21521
+ access: "view",
21522
+ auth: "admin"
21431
21523
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
21432
21524
  userId: string(),
21433
21525
  credentialId: string()
@@ -21599,7 +21691,19 @@ var VectorStatsResultSchema = object({
21599
21691
  /** False when the backend ranks approximately. */
21600
21692
  exact: boolean()
21601
21693
  });
21602
- method(VectorDeclareIndexInputSchema, _void(), { kind: "mutation" }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, { kind: "mutation" }), method(VectorQueryInputSchema, VectorQueryResultSchema), method(VectorGetInputSchema, VectorGetResultSchema), method(VectorDeleteInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorStatsInputSchema, VectorStatsResultSchema);
21694
+ method(VectorDeclareIndexInputSchema, _void(), {
21695
+ kind: "mutation",
21696
+ auth: "admin"
21697
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
21698
+ kind: "mutation",
21699
+ auth: "admin"
21700
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
21701
+ kind: "mutation",
21702
+ auth: "admin"
21703
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
21704
+ kind: "mutation",
21705
+ auth: "admin"
21706
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
21603
21707
  var ClipSchema = object({
21604
21708
  /** Opaque, provider-namespaced id. The default provider encodes the time
21605
21709
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -24060,7 +24164,27 @@ var MediaFileLiteSchema$1 = object({
24060
24164
  sizeBytes: number(),
24061
24165
  timestamp: number()
24062
24166
  });
24063
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
24167
+ method(object({
24168
+ /**
24169
+ * Inline {@link IdentitySchema.coverBase64} on every row.
24170
+ *
24171
+ * Default `false`, the same inversion `listRecentFaces` and
24172
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
24173
+ * why the burden belongs on the caller that WANTS the bytes). Measured
24174
+ * on the live hub the same day: four identities cost 40,979 B with the
24175
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
24176
+ * four times and the viewer holds at `staleTime: 30_000`.
24177
+ *
24178
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
24179
+ * the `event-media` plane serves that key `immutable` with an ETag.
24180
+ *
24181
+ * **This is an INPUT field, so it does not reach the addon until the
24182
+ * next train** — the hub router validates cap inputs against its own
24183
+ * compiled Zod and strips a key it does not know. Until then the
24184
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
24185
+ * is what ships, and the opt-in becomes reachable when the train lands.
24186
+ */
24187
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
24064
24188
  kind: "mutation",
24065
24189
  auth: "admin"
24066
24190
  }), method(object({
@@ -26950,8 +27074,10 @@ var PlateInfoSchema = object({
26950
27074
  keyFrameMediaKey: string().optional(),
26951
27075
  base64: string().optional(),
26952
27076
  /**
26953
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26954
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
27077
+ * Same crop as a data-plane URL, always present when the plate has a stored
27078
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
27079
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
27080
+ * left at its `true` default.
26955
27081
  */
26956
27082
  cropUrl: string().optional()
26957
27083
  });
@@ -26971,14 +27097,34 @@ var PlateClusterSchema = object({
26971
27097
  });
26972
27098
  method(object({
26973
27099
  deviceId: number().int().optional(),
26974
- limit: number().int().positive().optional()
27100
+ limit: number().int().positive().optional(),
27101
+ /**
27102
+ * Inline the base64 crop on every row. Default `true` — the existing
27103
+ * behaviour, kept so no caller breaks.
27104
+ *
27105
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
27106
+ * Measured on the live hub at the 500 rows the Plates view asks for:
27107
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
27108
+ * metadata without them — and the browser then caches the images.
27109
+ *
27110
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
27111
+ * plates were the one gallery list left without it.
27112
+ *
27113
+ * **This is an INPUT field, so it does not reach the addon until the
27114
+ * next train.** The hub router validates cap inputs against its own
27115
+ * compiled Zod and strips a key it does not know. Until the train
27116
+ * ships, sending `false` is harmless and keeps the crops inline.
27117
+ */
27118
+ includeCrops: boolean().optional()
26975
27119
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26976
27120
  deviceId: number().int(),
26977
27121
  trackId: string()
26978
27122
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26979
27123
  text: string().min(1),
26980
27124
  maxDistance: number().int().min(0).optional(),
26981
- limit: number().int().positive().optional()
27125
+ limit: number().int().positive().optional(),
27126
+ /** See `listPlates.includeCrops`. Default `true`. */
27127
+ includeCrops: boolean().optional()
26982
27128
  }), array(PlateInfoSchema).readonly()), method(object({
26983
27129
  maxDistance: number().int().min(0).optional(),
26984
27130
  minClusterSize: number().int().min(2).optional(),
@@ -26992,7 +27138,13 @@ method(object({
26992
27138
  }), method(object({ plateId: string() }), _void(), {
26993
27139
  kind: "mutation",
26994
27140
  auth: "admin"
26995
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
27141
+ }), method(object({
27142
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27143
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27144
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
27145
+ * INPUT field: stripped by the hub router until the train ships, which
27146
+ * resolves to `false` and is exactly the intended default. */
27147
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26996
27148
  kind: "mutation",
26997
27149
  auth: "admin"
26998
27150
  }), method(object({
@@ -34253,6 +34405,12 @@ Object.freeze({
34253
34405
  addonId: null,
34254
34406
  access: "create"
34255
34407
  },
34408
+ "pipelineAnalytics.cancelRelocateMedia": {
34409
+ capName: "pipeline-analytics",
34410
+ capScope: "device",
34411
+ addonId: null,
34412
+ access: "create"
34413
+ },
34256
34414
  "pipelineAnalytics.cancelStorageMigrationMove": {
34257
34415
  capName: "pipeline-analytics",
34258
34416
  capScope: "device",
@@ -34427,6 +34585,12 @@ Object.freeze({
34427
34585
  addonId: null,
34428
34586
  access: "view"
34429
34587
  },
34588
+ "pipelineAnalytics.listRelocateMediaJobs": {
34589
+ capName: "pipeline-analytics",
34590
+ capScope: "device",
34591
+ addonId: null,
34592
+ access: "view"
34593
+ },
34430
34594
  "pipelineAnalytics.listRetrainAnnotations": {
34431
34595
  capName: "pipeline-analytics",
34432
34596
  capScope: "device",
@@ -34505,6 +34669,12 @@ Object.freeze({
34505
34669
  addonId: null,
34506
34670
  access: "create"
34507
34671
  },
34672
+ "pipelineAnalytics.relocateMedia": {
34673
+ capName: "pipeline-analytics",
34674
+ capScope: "device",
34675
+ addonId: null,
34676
+ access: "create"
34677
+ },
34508
34678
  "pipelineAnalytics.restageRetrainTrack": {
34509
34679
  capName: "pipeline-analytics",
34510
34680
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -7731,7 +7731,7 @@ function method(input, output, options) {
7731
7731
  input,
7732
7732
  output,
7733
7733
  kind: options?.kind ?? "query",
7734
- auth: options?.auth ?? "protected",
7734
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
7735
7735
  ...options?.access !== void 0 ? { access: options.access } : {},
7736
7736
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
7737
7737
  timeoutMs: options?.timeoutMs
@@ -7755,7 +7755,7 @@ function event(data) {
7755
7755
  }
7756
7756
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
7757
7757
  var VersionOutputSchema$1 = object({ version: string() });
7758
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
7758
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
7759
7759
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
7760
7760
  DeviceType["Camera"] = "camera";
7761
7761
  DeviceType["Hub"] = "hub";
@@ -8076,7 +8076,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8076
8076
  }({});
8077
8077
  var StaticDirOutputSchema = object({ staticDir: string() });
8078
8078
  var VersionOutputSchema = object({ version: string() });
8079
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
8079
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
8080
8080
  /**
8081
8081
  * device-ops — device-scoped cap that unifies the per-IDevice operations
8082
8082
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -8702,24 +8702,6 @@ var RecordingRetentionSchema = object({
8702
8702
  maxSizeGb: number().min(0).optional()
8703
8703
  });
8704
8704
  /**
8705
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
8706
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
8707
- * previews at. Five graduated steps; absent on a config = `standard` (the
8708
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
8709
- *
8710
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
8711
- * Each window's index sidecar carries its own tile dims, so a camera whose
8712
- * preset changed over time renders every historical window at the dims it was
8713
- * written with.
8714
- */
8715
- var ScrubThumbnailPresetSchema = _enum([
8716
- "minimal",
8717
- "low",
8718
- "standard",
8719
- "high",
8720
- "max"
8721
- ]);
8722
- /**
8723
8705
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
8724
8706
  *
8725
8707
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -8727,7 +8709,11 @@ var ScrubThumbnailPresetSchema = _enum([
8727
8709
  * other field is a storage knob (profiles, segment length, retention, scrub).
8728
8710
  *
8729
8711
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
8730
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
8712
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
8713
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
8714
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
8715
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
8716
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
8731
8717
  * A stale caller must fail loudly — silently stripping its legacy intent would
8732
8718
  * persist a band-less config, i.e. silently stop recording the camera.
8733
8719
  */
@@ -8750,14 +8736,7 @@ var RecordingConfigSchema = object({
8750
8736
  * "off" is the absence of a covering band, never a band value.
8751
8737
  */
8752
8738
  bands: array(RecordingBandSchema).default([]),
8753
- retention: RecordingRetentionSchema.optional(),
8754
- /**
8755
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
8756
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
8757
- * windows only — existing sheets are immutable, and each window's index
8758
- * carries its own tile dims so mixed-preset history renders correctly.
8759
- */
8760
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
8739
+ retention: RecordingRetentionSchema.optional()
8761
8740
  }).strict();
8762
8741
  /**
8763
8742
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -8833,10 +8812,11 @@ var RelocateFootageInputSchema = object({
8833
8812
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8834
8813
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8835
8814
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8836
- var StorageMigrationMediaMoveInputSchema = object({
8815
+ var RelocateMediaInputSchema = object({
8837
8816
  toLocationId: string(),
8838
8817
  throttleMbps: number().min(1).max(1e3).optional()
8839
- }).extend({ leaseId: string().min(1) });
8818
+ });
8819
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8840
8820
  /** The independently selectable logical storage classes. `recordings`
8841
8821
  * encompasses the high and mid segment profiles; `recordingsLow` is low
8842
8822
  * segments; `eventMedia` is post-analysis blobs. */
@@ -9131,7 +9111,26 @@ var LabelDefinitionSchema = object({
9131
9111
  description: string().optional(),
9132
9112
  icon: string().optional()
9133
9113
  });
9134
- var ClassMapDefinitionSchema = object({
9114
+ /**
9115
+ * Wire schema for a per-model CATALOG classMap override
9116
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
9117
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
9118
+ * detection pipeline executor actually routes.
9119
+ *
9120
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
9121
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
9122
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
9123
+ * enum) — the two used to share the name `ClassMapDefinition`/
9124
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
9125
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
9126
+ * are not: it is two different concepts colliding on a name. Keep this type
9127
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
9128
+ * would either narrow every `ClassMapDefinition` consumer to the four
9129
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
9130
+ * schema exists for (see the "rejects a classMap whose target is not a
9131
+ * detection macro" test in `model-catalog-schema.test.ts`).
9132
+ */
9133
+ var DetectionCatalogClassMapSchema = object({
9135
9134
  mapping: record(string(), _enum([
9136
9135
  "person",
9137
9136
  "vehicle",
@@ -9336,7 +9335,7 @@ var ModelCatalogEntrySchema = object({
9336
9335
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
9337
9336
  * labels already ARE the CamStack macros (Scrypted identity map).
9338
9337
  */
9339
- classMap: ClassMapDefinitionSchema.optional()
9338
+ classMap: DetectionCatalogClassMapSchema.optional()
9340
9339
  });
9341
9340
  var ConvertTargetSchema = discriminatedUnion("format", [object({
9342
9341
  format: literal("openvino"),
@@ -9366,7 +9365,7 @@ var ModelConvertMetadataSchema = object({
9366
9365
  "segmentation"
9367
9366
  ]),
9368
9367
  faceAlignment: boolean().optional(),
9369
- classMap: ClassMapDefinitionSchema.optional()
9368
+ classMap: DetectionCatalogClassMapSchema.optional()
9370
9369
  });
9371
9370
  var ConvertResultSchema = object({
9372
9371
  entry: ModelCatalogEntrySchema,
@@ -10229,7 +10228,7 @@ var AddonPageDeclarationSchema = object({
10229
10228
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
10230
10229
  sectionLabel: string().optional()
10231
10230
  });
10232
- method(_void(), array(AddonPageDeclarationSchema).readonly());
10231
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
10233
10232
  var AddonHttpRouteSchema = object({
10234
10233
  method: _enum([
10235
10234
  "GET",
@@ -10464,7 +10463,7 @@ var WidgetMetadataSchema = object({
10464
10463
  defaultColumns: number().int().min(1).max(12).default(6),
10465
10464
  defaultRows: number().int().min(1).max(12).default(1)
10466
10465
  });
10467
- method(_void(), array(WidgetMetadataSchema).readonly());
10466
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
10468
10467
  /**
10469
10468
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
10470
10469
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -12088,7 +12087,7 @@ var CustomModelDescriptorSchema = object({
12088
12087
  stepId: string(),
12089
12088
  entry: ModelCatalogEntrySchema
12090
12089
  });
12091
- method(_void(), array(CustomModelDescriptorSchema).readonly());
12090
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
12092
12091
  /**
12093
12092
  * Query filter for settings-store collections.
12094
12093
  */
@@ -12175,7 +12174,8 @@ method(object({
12175
12174
  }), _void(), { kind: "mutation" }), method(object({
12176
12175
  namespace: string().optional(),
12177
12176
  collection: string(),
12178
- filter: QueryFilterSchema.optional()
12177
+ filter: QueryFilterSchema.optional(),
12178
+ columns: array(string()).readonly().optional()
12179
12179
  }), array(SettingsRecordSchema).readonly()), method(object({
12180
12180
  namespace: string().optional(),
12181
12181
  collection: string(),
@@ -12238,46 +12238,87 @@ var EngineInfoSchema = object({
12238
12238
  kind: _enum(["relational", "vector"]),
12239
12239
  displayName: string()
12240
12240
  });
12241
- method(_void(), EngineInfoSchema), method(object({
12241
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12242
12242
  namespace: string().optional(),
12243
12243
  collection: string(),
12244
12244
  key: string()
12245
- }), unknown()), method(object({
12245
+ }), unknown(), { auth: "admin" }), method(object({
12246
12246
  namespace: string().optional(),
12247
12247
  collection: string(),
12248
12248
  key: string(),
12249
12249
  value: unknown()
12250
- }), _void(), { kind: "mutation" }), method(object({
12250
+ }), _void(), {
12251
+ kind: "mutation",
12252
+ auth: "admin"
12253
+ }), method(object({
12251
12254
  namespace: string().optional(),
12252
12255
  collection: string(),
12253
- filter: QueryFilterSchema.optional()
12254
- }), array(SettingsRecordSchema).readonly()), method(object({
12256
+ filter: QueryFilterSchema.optional(),
12257
+ /**
12258
+ * SQL-level column projection — MUST mirror `settings-store.query`.
12259
+ *
12260
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
12261
+ * was wrong — corrected 2026-08-26 after the hop map
12262
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
12263
+ * There is **no Zod parse at all** between the door and the engine: the
12264
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
12265
+ * field declared here reaches `SqliteSettingsBackend` either way.
12266
+ *
12267
+ * What actually lost `columns` was the THIRD declaration of this shape:
12268
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
12269
+ * interface the engine destructures from. The field existed on both
12270
+ * schemas and the engine still never read it, because nothing checks a
12271
+ * registered provider against `InferProvider<cap>` —
12272
+ * `ProviderRegistration.provider` is typed `object`.
12273
+ *
12274
+ * It is declared here anyway, and must stay in step with
12275
+ * `settings-store.query`: a caller reading only the cap definitions has
12276
+ * to be able to see that this call carries a projection.
12277
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
12278
+ */
12279
+ columns: array(string()).readonly().optional()
12280
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
12255
12281
  namespace: string().optional(),
12256
12282
  collection: string(),
12257
12283
  record: SettingsRecordSchema
12258
- }), _void(), { kind: "mutation" }), method(object({
12284
+ }), _void(), {
12285
+ kind: "mutation",
12286
+ auth: "admin"
12287
+ }), method(object({
12259
12288
  namespace: string().optional(),
12260
12289
  collection: string(),
12261
12290
  id: string(),
12262
12291
  data: record(string(), unknown())
12263
- }), _void(), { kind: "mutation" }), method(object({
12292
+ }), _void(), {
12293
+ kind: "mutation",
12294
+ auth: "admin"
12295
+ }), method(object({
12264
12296
  namespace: string().optional(),
12265
12297
  collection: string(),
12266
12298
  key: string()
12267
- }), _void(), { kind: "mutation" }), method(object({
12299
+ }), _void(), {
12300
+ kind: "mutation",
12301
+ auth: "admin"
12302
+ }), method(object({
12268
12303
  namespace: string().optional(),
12269
12304
  collection: string(),
12270
12305
  filter: MutationFilterSchema
12271
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
12306
+ }), object({ deleted: number().int() }), {
12307
+ kind: "mutation",
12308
+ auth: "admin"
12309
+ }), method(object({
12272
12310
  namespace: string().optional(),
12273
12311
  collection: string(),
12274
12312
  filter: MutationFilterSchema,
12275
12313
  data: record(string(), unknown())
12276
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
12314
+ }), object({ updated: number().int() }), {
12315
+ kind: "mutation",
12316
+ auth: "admin"
12317
+ }), method(object({
12277
12318
  namespace: string().optional(),
12278
12319
  collection: string(),
12279
12320
  filter: QueryFilterSchema.optional()
12280
- }), number()), method(object({
12321
+ }), number(), { auth: "admin" }), method(object({
12281
12322
  namespace: string().optional(),
12282
12323
  collection: string(),
12283
12324
  field: string(),
@@ -12287,15 +12328,18 @@ method(_void(), EngineInfoSchema), method(object({
12287
12328
  }), array(object({
12288
12329
  bucket: number().int(),
12289
12330
  count: number().int()
12290
- })).readonly()), method(object({
12331
+ })).readonly(), { auth: "admin" }), method(object({
12291
12332
  namespace: string().optional(),
12292
12333
  collection: string()
12293
- }), boolean()), method(object({
12334
+ }), boolean(), { auth: "admin" }), method(object({
12294
12335
  namespace: string().optional(),
12295
12336
  collection: string(),
12296
12337
  columns: array(CollectionColumnSchema).readonly(),
12297
12338
  indexes: array(CollectionIndexSchema).readonly().optional()
12298
- }), _void(), { kind: "mutation" });
12339
+ }), _void(), {
12340
+ kind: "mutation",
12341
+ auth: "admin"
12342
+ });
12299
12343
  /**
12300
12344
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
12301
12345
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -13602,7 +13646,7 @@ method(object({
13602
13646
  crop: _instanceof(Uint8Array),
13603
13647
  width: number(),
13604
13648
  height: number()
13605
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
13649
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
13606
13650
  /**
13607
13651
  * filesystem-browse — per-node capability for browsing the node's local
13608
13652
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13895,19 +13939,22 @@ method(LlmGenerateBaseInputSchema.extend({
13895
13939
  runtime: ManagedRuntimeConfigSchema,
13896
13940
  /** The managed profile's timeout, threaded by the hub provider. */
13897
13941
  timeoutMs: number().int().positive().optional()
13898
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13942
+ }), LlmGenerateResultSchema, {
13943
+ kind: "mutation",
13944
+ auth: "admin"
13945
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13899
13946
  kind: "mutation",
13900
13947
  auth: "admin"
13901
13948
  }), method(object({}), _void(), {
13902
13949
  kind: "mutation",
13903
13950
  auth: "admin"
13904
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13951
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13905
13952
  kind: "mutation",
13906
13953
  auth: "admin"
13907
13954
  }), method(object({ file: string() }), _void(), {
13908
13955
  kind: "mutation",
13909
13956
  auth: "admin"
13910
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13957
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13911
13958
  /**
13912
13959
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13913
13960
  * methods concat-fan across providers; single-row methods route to ONE
@@ -17418,7 +17465,7 @@ var OauthIntegrationDescriptorSchema = object({
17418
17465
  */
17419
17466
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
17420
17467
  });
17421
- method(_void(), OauthIntegrationDescriptorSchema);
17468
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
17422
17469
  /**
17423
17470
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
17424
17471
  * per-frame detections emitted by the pipeline runner into tracked
@@ -18613,6 +18660,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18613
18660
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18614
18661
  kind: "mutation",
18615
18662
  auth: "admin"
18663
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18664
+ kind: "mutation",
18665
+ auth: "admin"
18666
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
18667
+ kind: "query",
18668
+ auth: "admin"
18669
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18670
+ kind: "mutation",
18671
+ auth: "admin"
18616
18672
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
18617
18673
  kind: "query",
18618
18674
  auth: "admin"
@@ -18767,6 +18823,11 @@ object({
18767
18823
  "jpeg"
18768
18824
  ])
18769
18825
  });
18826
+ /**
18827
+ * Process-local frame identity. It is serializable so it can ride an in-process
18828
+ * capability call, but `registryId` deliberately prevents resolution in any
18829
+ * other process or execution group.
18830
+ */
18770
18831
  var FrameRefSchema = object({
18771
18832
  registryId: string().min(1),
18772
18833
  id: string().min(1),
@@ -20972,7 +21033,7 @@ method(object({
20972
21033
  * linking rather than produce an eternal token.
20973
21034
  */
20974
21035
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20975
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
21036
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20976
21037
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20977
21038
  providerId: string().min(1),
20978
21039
  displayName: string().min(1),
@@ -21067,10 +21128,13 @@ var EvictResultSchema = object({
21067
21128
  /** True when the provider has nothing left it is willing to drop on this location. */
21068
21129
  exhausted: boolean()
21069
21130
  });
21070
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
21131
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
21071
21132
  locationId: string(),
21072
21133
  targetBytes: number().int().positive()
21073
- }), EvictResultSchema, { kind: "mutation" });
21134
+ }), EvictResultSchema, {
21135
+ kind: "mutation",
21136
+ auth: "admin"
21137
+ });
21074
21138
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
21075
21139
  kind: "mutation",
21076
21140
  auth: "admin"
@@ -21130,26 +21194,50 @@ var ReadChunkInputSchema = object({
21130
21194
  length: number()
21131
21195
  });
21132
21196
  var EndDownloadInputSchema = object({ downloadId: string() });
21133
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21197
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21134
21198
  location: StorageLocationSchema,
21135
21199
  relativePath: string()
21136
- }), string()), method(object({
21200
+ }), string(), { auth: "admin" }), method(object({
21137
21201
  location: StorageLocationSchema,
21138
21202
  relativePath: string(),
21139
21203
  data: _instanceof(Uint8Array)
21140
- }), _void(), { kind: "mutation" }), method(object({
21204
+ }), _void(), {
21205
+ kind: "mutation",
21206
+ auth: "admin"
21207
+ }), method(object({
21141
21208
  location: StorageLocationSchema,
21142
21209
  relativePath: string()
21143
- }), _instanceof(Uint8Array)), method(object({
21210
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
21144
21211
  location: StorageLocationSchema,
21145
21212
  relativePath: string()
21146
- }), boolean()), method(object({
21213
+ }), boolean(), { auth: "admin" }), method(object({
21147
21214
  location: StorageLocationSchema,
21148
21215
  prefix: string().optional()
21149
- }), array(string()).readonly()), method(object({
21216
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
21150
21217
  location: StorageLocationSchema,
21151
21218
  relativePath: string()
21152
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
21219
+ }), _void(), {
21220
+ kind: "mutation",
21221
+ auth: "admin"
21222
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
21223
+ kind: "mutation",
21224
+ auth: "admin"
21225
+ }), method(WriteChunkInputSchema, _void(), {
21226
+ kind: "mutation",
21227
+ auth: "admin"
21228
+ }), method(FinalizeUploadInputSchema, _void(), {
21229
+ kind: "mutation",
21230
+ auth: "admin"
21231
+ }), method(AbortUploadInputSchema, _void(), {
21232
+ kind: "mutation",
21233
+ auth: "admin"
21234
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
21235
+ kind: "mutation",
21236
+ auth: "admin"
21237
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
21238
+ kind: "mutation",
21239
+ auth: "admin"
21240
+ });
21153
21241
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21154
21242
  var ProfileSettingsSchemaBridge = unknown().nullable();
21155
21243
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -21407,7 +21495,8 @@ method(object({
21407
21495
  access: "create"
21408
21496
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
21409
21497
  kind: "mutation",
21410
- access: "view"
21498
+ access: "view",
21499
+ auth: "admin"
21411
21500
  }), method(object({
21412
21501
  /** Required — the user the assertion belongs to (verified). */
21413
21502
  userId: string(),
@@ -21415,10 +21504,12 @@ method(object({
21415
21504
  response: record(string(), unknown())
21416
21505
  }), object({ verified: boolean() }), {
21417
21506
  kind: "mutation",
21418
- access: "view"
21507
+ access: "view",
21508
+ auth: "admin"
21419
21509
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
21420
21510
  kind: "mutation",
21421
- access: "view"
21511
+ access: "view",
21512
+ auth: "admin"
21422
21513
  }), method(object({
21423
21514
  /** AuthenticationResponseJSON from the browser. */
21424
21515
  response: record(string(), unknown()) }), object({
@@ -21426,7 +21517,8 @@ response: record(string(), unknown()) }), object({
21426
21517
  userId: string().nullable()
21427
21518
  }), {
21428
21519
  kind: "mutation",
21429
- access: "view"
21520
+ access: "view",
21521
+ auth: "admin"
21430
21522
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
21431
21523
  userId: string(),
21432
21524
  credentialId: string()
@@ -21598,7 +21690,19 @@ var VectorStatsResultSchema = object({
21598
21690
  /** False when the backend ranks approximately. */
21599
21691
  exact: boolean()
21600
21692
  });
21601
- method(VectorDeclareIndexInputSchema, _void(), { kind: "mutation" }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, { kind: "mutation" }), method(VectorQueryInputSchema, VectorQueryResultSchema), method(VectorGetInputSchema, VectorGetResultSchema), method(VectorDeleteInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorStatsInputSchema, VectorStatsResultSchema);
21693
+ method(VectorDeclareIndexInputSchema, _void(), {
21694
+ kind: "mutation",
21695
+ auth: "admin"
21696
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
21697
+ kind: "mutation",
21698
+ auth: "admin"
21699
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
21700
+ kind: "mutation",
21701
+ auth: "admin"
21702
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
21703
+ kind: "mutation",
21704
+ auth: "admin"
21705
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
21602
21706
  var ClipSchema = object({
21603
21707
  /** Opaque, provider-namespaced id. The default provider encodes the time
21604
21708
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -24059,7 +24163,27 @@ var MediaFileLiteSchema$1 = object({
24059
24163
  sizeBytes: number(),
24060
24164
  timestamp: number()
24061
24165
  });
24062
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
24166
+ method(object({
24167
+ /**
24168
+ * Inline {@link IdentitySchema.coverBase64} on every row.
24169
+ *
24170
+ * Default `false`, the same inversion `listRecentFaces` and
24171
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
24172
+ * why the burden belongs on the caller that WANTS the bytes). Measured
24173
+ * on the live hub the same day: four identities cost 40,979 B with the
24174
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
24175
+ * four times and the viewer holds at `staleTime: 30_000`.
24176
+ *
24177
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
24178
+ * the `event-media` plane serves that key `immutable` with an ETag.
24179
+ *
24180
+ * **This is an INPUT field, so it does not reach the addon until the
24181
+ * next train** — the hub router validates cap inputs against its own
24182
+ * compiled Zod and strips a key it does not know. Until then the
24183
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
24184
+ * is what ships, and the opt-in becomes reachable when the train lands.
24185
+ */
24186
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
24063
24187
  kind: "mutation",
24064
24188
  auth: "admin"
24065
24189
  }), method(object({
@@ -26949,8 +27073,10 @@ var PlateInfoSchema = object({
26949
27073
  keyFrameMediaKey: string().optional(),
26950
27074
  base64: string().optional(),
26951
27075
  /**
26952
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26953
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
27076
+ * Same crop as a data-plane URL, always present when the plate has a stored
27077
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
27078
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
27079
+ * left at its `true` default.
26954
27080
  */
26955
27081
  cropUrl: string().optional()
26956
27082
  });
@@ -26970,14 +27096,34 @@ var PlateClusterSchema = object({
26970
27096
  });
26971
27097
  method(object({
26972
27098
  deviceId: number().int().optional(),
26973
- limit: number().int().positive().optional()
27099
+ limit: number().int().positive().optional(),
27100
+ /**
27101
+ * Inline the base64 crop on every row. Default `true` — the existing
27102
+ * behaviour, kept so no caller breaks.
27103
+ *
27104
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
27105
+ * Measured on the live hub at the 500 rows the Plates view asks for:
27106
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
27107
+ * metadata without them — and the browser then caches the images.
27108
+ *
27109
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
27110
+ * plates were the one gallery list left without it.
27111
+ *
27112
+ * **This is an INPUT field, so it does not reach the addon until the
27113
+ * next train.** The hub router validates cap inputs against its own
27114
+ * compiled Zod and strips a key it does not know. Until the train
27115
+ * ships, sending `false` is harmless and keeps the crops inline.
27116
+ */
27117
+ includeCrops: boolean().optional()
26974
27118
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26975
27119
  deviceId: number().int(),
26976
27120
  trackId: string()
26977
27121
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26978
27122
  text: string().min(1),
26979
27123
  maxDistance: number().int().min(0).optional(),
26980
- limit: number().int().positive().optional()
27124
+ limit: number().int().positive().optional(),
27125
+ /** See `listPlates.includeCrops`. Default `true`. */
27126
+ includeCrops: boolean().optional()
26981
27127
  }), array(PlateInfoSchema).readonly()), method(object({
26982
27128
  maxDistance: number().int().min(0).optional(),
26983
27129
  minClusterSize: number().int().min(2).optional(),
@@ -26991,7 +27137,13 @@ method(object({
26991
27137
  }), method(object({ plateId: string() }), _void(), {
26992
27138
  kind: "mutation",
26993
27139
  auth: "admin"
26994
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
27140
+ }), method(object({
27141
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27142
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27143
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
27144
+ * INPUT field: stripped by the hub router until the train ships, which
27145
+ * resolves to `false` and is exactly the intended default. */
27146
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26995
27147
  kind: "mutation",
26996
27148
  auth: "admin"
26997
27149
  }), method(object({
@@ -34252,6 +34404,12 @@ Object.freeze({
34252
34404
  addonId: null,
34253
34405
  access: "create"
34254
34406
  },
34407
+ "pipelineAnalytics.cancelRelocateMedia": {
34408
+ capName: "pipeline-analytics",
34409
+ capScope: "device",
34410
+ addonId: null,
34411
+ access: "create"
34412
+ },
34255
34413
  "pipelineAnalytics.cancelStorageMigrationMove": {
34256
34414
  capName: "pipeline-analytics",
34257
34415
  capScope: "device",
@@ -34426,6 +34584,12 @@ Object.freeze({
34426
34584
  addonId: null,
34427
34585
  access: "view"
34428
34586
  },
34587
+ "pipelineAnalytics.listRelocateMediaJobs": {
34588
+ capName: "pipeline-analytics",
34589
+ capScope: "device",
34590
+ addonId: null,
34591
+ access: "view"
34592
+ },
34429
34593
  "pipelineAnalytics.listRetrainAnnotations": {
34430
34594
  capName: "pipeline-analytics",
34431
34595
  capScope: "device",
@@ -34504,6 +34668,12 @@ Object.freeze({
34504
34668
  addonId: null,
34505
34669
  access: "create"
34506
34670
  },
34671
+ "pipelineAnalytics.relocateMedia": {
34672
+ capName: "pipeline-analytics",
34673
+ capScope: "device",
34674
+ addonId: null,
34675
+ access: "create"
34676
+ },
34507
34677
  "pipelineAnalytics.restageRetrainTrack": {
34508
34678
  capName: "pipeline-analytics",
34509
34679
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-petkit",
3
- "version": "0.2.28",
3
+ "version": "0.2.29",
4
4
  "description": "PetKit smart-feeder device-provider addon for CamStack — wraps the @apocaliss92/nodepetkit PetKit cloud client",
5
5
  "keywords": [
6
6
  "camstack",