@camstack/addon-provider-dreo 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
@@ -6666,7 +6666,7 @@ function method(input, output, options) {
6666
6666
  input,
6667
6667
  output,
6668
6668
  kind: options?.kind ?? "query",
6669
- auth: options?.auth ?? "protected",
6669
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6670
6670
  ...options?.access !== void 0 ? { access: options.access } : {},
6671
6671
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6672
6672
  timeoutMs: options?.timeoutMs
@@ -6690,7 +6690,7 @@ function event(data) {
6690
6690
  }
6691
6691
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6692
6692
  var VersionOutputSchema$1 = object({ version: string() });
6693
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6693
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6694
6694
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6695
6695
  DeviceType["Camera"] = "camera";
6696
6696
  DeviceType["Hub"] = "hub";
@@ -7011,7 +7011,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7011
7011
  }({});
7012
7012
  var StaticDirOutputSchema = object({ staticDir: string() });
7013
7013
  var VersionOutputSchema = object({ version: string() });
7014
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7014
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7015
7015
  /**
7016
7016
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7017
7017
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7637,24 +7637,6 @@ var RecordingRetentionSchema = object({
7637
7637
  maxSizeGb: number().min(0).optional()
7638
7638
  });
7639
7639
  /**
7640
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7641
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7642
- * previews at. Five graduated steps; absent on a config = `standard` (the
7643
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7644
- *
7645
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7646
- * Each window's index sidecar carries its own tile dims, so a camera whose
7647
- * preset changed over time renders every historical window at the dims it was
7648
- * written with.
7649
- */
7650
- var ScrubThumbnailPresetSchema = _enum([
7651
- "minimal",
7652
- "low",
7653
- "standard",
7654
- "high",
7655
- "max"
7656
- ]);
7657
- /**
7658
7640
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7659
7641
  *
7660
7642
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7662,7 +7644,11 @@ var ScrubThumbnailPresetSchema = _enum([
7662
7644
  * other field is a storage knob (profiles, segment length, retention, scrub).
7663
7645
  *
7664
7646
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7665
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7647
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7648
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7649
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7650
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7651
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7666
7652
  * A stale caller must fail loudly — silently stripping its legacy intent would
7667
7653
  * persist a band-less config, i.e. silently stop recording the camera.
7668
7654
  */
@@ -7685,14 +7671,7 @@ var RecordingConfigSchema = object({
7685
7671
  * "off" is the absence of a covering band, never a band value.
7686
7672
  */
7687
7673
  bands: array(RecordingBandSchema).default([]),
7688
- retention: RecordingRetentionSchema.optional(),
7689
- /**
7690
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7691
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7692
- * windows only — existing sheets are immutable, and each window's index
7693
- * carries its own tile dims so mixed-preset history renders correctly.
7694
- */
7695
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7674
+ retention: RecordingRetentionSchema.optional()
7696
7675
  }).strict();
7697
7676
  /**
7698
7677
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7768,10 +7747,11 @@ var RelocateFootageInputSchema = object({
7768
7747
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7769
7748
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7770
7749
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7771
- var StorageMigrationMediaMoveInputSchema = object({
7750
+ var RelocateMediaInputSchema = object({
7772
7751
  toLocationId: string(),
7773
7752
  throttleMbps: number().min(1).max(1e3).optional()
7774
- }).extend({ leaseId: string().min(1) });
7753
+ });
7754
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7775
7755
  /** The independently selectable logical storage classes. `recordings`
7776
7756
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7777
7757
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8066,7 +8046,26 @@ var LabelDefinitionSchema = object({
8066
8046
  description: string().optional(),
8067
8047
  icon: string().optional()
8068
8048
  });
8069
- var ClassMapDefinitionSchema = object({
8049
+ /**
8050
+ * Wire schema for a per-model CATALOG classMap override
8051
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8052
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8053
+ * detection pipeline executor actually routes.
8054
+ *
8055
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8056
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8057
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8058
+ * enum) — the two used to share the name `ClassMapDefinition`/
8059
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8060
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8061
+ * are not: it is two different concepts colliding on a name. Keep this type
8062
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8063
+ * would either narrow every `ClassMapDefinition` consumer to the four
8064
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8065
+ * schema exists for (see the "rejects a classMap whose target is not a
8066
+ * detection macro" test in `model-catalog-schema.test.ts`).
8067
+ */
8068
+ var DetectionCatalogClassMapSchema = object({
8070
8069
  mapping: record(string(), _enum([
8071
8070
  "person",
8072
8071
  "vehicle",
@@ -8271,7 +8270,7 @@ var ModelCatalogEntrySchema = object({
8271
8270
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8272
8271
  * labels already ARE the CamStack macros (Scrypted identity map).
8273
8272
  */
8274
- classMap: ClassMapDefinitionSchema.optional()
8273
+ classMap: DetectionCatalogClassMapSchema.optional()
8275
8274
  });
8276
8275
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8277
8276
  format: literal("openvino"),
@@ -8301,7 +8300,7 @@ var ModelConvertMetadataSchema = object({
8301
8300
  "segmentation"
8302
8301
  ]),
8303
8302
  faceAlignment: boolean().optional(),
8304
- classMap: ClassMapDefinitionSchema.optional()
8303
+ classMap: DetectionCatalogClassMapSchema.optional()
8305
8304
  });
8306
8305
  var ConvertResultSchema = object({
8307
8306
  entry: ModelCatalogEntrySchema,
@@ -9164,7 +9163,7 @@ var AddonPageDeclarationSchema = object({
9164
9163
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9165
9164
  sectionLabel: string().optional()
9166
9165
  });
9167
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9166
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9168
9167
  var AddonHttpRouteSchema = object({
9169
9168
  method: _enum([
9170
9169
  "GET",
@@ -9399,7 +9398,7 @@ var WidgetMetadataSchema = object({
9399
9398
  defaultColumns: number().int().min(1).max(12).default(6),
9400
9399
  defaultRows: number().int().min(1).max(12).default(1)
9401
9400
  });
9402
- method(_void(), array(WidgetMetadataSchema).readonly());
9401
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9403
9402
  /**
9404
9403
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9405
9404
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11023,7 +11022,7 @@ var CustomModelDescriptorSchema = object({
11023
11022
  stepId: string(),
11024
11023
  entry: ModelCatalogEntrySchema
11025
11024
  });
11026
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11025
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11027
11026
  /**
11028
11027
  * Query filter for settings-store collections.
11029
11028
  */
@@ -11110,7 +11109,8 @@ method(object({
11110
11109
  }), _void(), { kind: "mutation" }), method(object({
11111
11110
  namespace: string().optional(),
11112
11111
  collection: string(),
11113
- filter: QueryFilterSchema.optional()
11112
+ filter: QueryFilterSchema.optional(),
11113
+ columns: array(string()).readonly().optional()
11114
11114
  }), array(SettingsRecordSchema).readonly()), method(object({
11115
11115
  namespace: string().optional(),
11116
11116
  collection: string(),
@@ -11173,46 +11173,87 @@ var EngineInfoSchema = object({
11173
11173
  kind: _enum(["relational", "vector"]),
11174
11174
  displayName: string()
11175
11175
  });
11176
- method(_void(), EngineInfoSchema), method(object({
11176
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11177
11177
  namespace: string().optional(),
11178
11178
  collection: string(),
11179
11179
  key: string()
11180
- }), unknown()), method(object({
11180
+ }), unknown(), { auth: "admin" }), method(object({
11181
11181
  namespace: string().optional(),
11182
11182
  collection: string(),
11183
11183
  key: string(),
11184
11184
  value: unknown()
11185
- }), _void(), { kind: "mutation" }), method(object({
11185
+ }), _void(), {
11186
+ kind: "mutation",
11187
+ auth: "admin"
11188
+ }), method(object({
11186
11189
  namespace: string().optional(),
11187
11190
  collection: string(),
11188
- filter: QueryFilterSchema.optional()
11189
- }), array(SettingsRecordSchema).readonly()), method(object({
11191
+ filter: QueryFilterSchema.optional(),
11192
+ /**
11193
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11194
+ *
11195
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11196
+ * was wrong — corrected 2026-08-26 after the hop map
11197
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11198
+ * There is **no Zod parse at all** between the door and the engine: the
11199
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11200
+ * field declared here reaches `SqliteSettingsBackend` either way.
11201
+ *
11202
+ * What actually lost `columns` was the THIRD declaration of this shape:
11203
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11204
+ * interface the engine destructures from. The field existed on both
11205
+ * schemas and the engine still never read it, because nothing checks a
11206
+ * registered provider against `InferProvider<cap>` —
11207
+ * `ProviderRegistration.provider` is typed `object`.
11208
+ *
11209
+ * It is declared here anyway, and must stay in step with
11210
+ * `settings-store.query`: a caller reading only the cap definitions has
11211
+ * to be able to see that this call carries a projection.
11212
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11213
+ */
11214
+ columns: array(string()).readonly().optional()
11215
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11190
11216
  namespace: string().optional(),
11191
11217
  collection: string(),
11192
11218
  record: SettingsRecordSchema
11193
- }), _void(), { kind: "mutation" }), method(object({
11219
+ }), _void(), {
11220
+ kind: "mutation",
11221
+ auth: "admin"
11222
+ }), method(object({
11194
11223
  namespace: string().optional(),
11195
11224
  collection: string(),
11196
11225
  id: string(),
11197
11226
  data: record(string(), unknown())
11198
- }), _void(), { kind: "mutation" }), method(object({
11227
+ }), _void(), {
11228
+ kind: "mutation",
11229
+ auth: "admin"
11230
+ }), method(object({
11199
11231
  namespace: string().optional(),
11200
11232
  collection: string(),
11201
11233
  key: string()
11202
- }), _void(), { kind: "mutation" }), method(object({
11234
+ }), _void(), {
11235
+ kind: "mutation",
11236
+ auth: "admin"
11237
+ }), method(object({
11203
11238
  namespace: string().optional(),
11204
11239
  collection: string(),
11205
11240
  filter: MutationFilterSchema
11206
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11241
+ }), object({ deleted: number().int() }), {
11242
+ kind: "mutation",
11243
+ auth: "admin"
11244
+ }), method(object({
11207
11245
  namespace: string().optional(),
11208
11246
  collection: string(),
11209
11247
  filter: MutationFilterSchema,
11210
11248
  data: record(string(), unknown())
11211
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11249
+ }), object({ updated: number().int() }), {
11250
+ kind: "mutation",
11251
+ auth: "admin"
11252
+ }), method(object({
11212
11253
  namespace: string().optional(),
11213
11254
  collection: string(),
11214
11255
  filter: QueryFilterSchema.optional()
11215
- }), number()), method(object({
11256
+ }), number(), { auth: "admin" }), method(object({
11216
11257
  namespace: string().optional(),
11217
11258
  collection: string(),
11218
11259
  field: string(),
@@ -11222,15 +11263,18 @@ method(_void(), EngineInfoSchema), method(object({
11222
11263
  }), array(object({
11223
11264
  bucket: number().int(),
11224
11265
  count: number().int()
11225
- })).readonly()), method(object({
11266
+ })).readonly(), { auth: "admin" }), method(object({
11226
11267
  namespace: string().optional(),
11227
11268
  collection: string()
11228
- }), boolean()), method(object({
11269
+ }), boolean(), { auth: "admin" }), method(object({
11229
11270
  namespace: string().optional(),
11230
11271
  collection: string(),
11231
11272
  columns: array(CollectionColumnSchema).readonly(),
11232
11273
  indexes: array(CollectionIndexSchema).readonly().optional()
11233
- }), _void(), { kind: "mutation" });
11274
+ }), _void(), {
11275
+ kind: "mutation",
11276
+ auth: "admin"
11277
+ });
11234
11278
  /**
11235
11279
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11236
11280
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12537,7 +12581,7 @@ method(object({
12537
12581
  crop: _instanceof(Uint8Array),
12538
12582
  width: number(),
12539
12583
  height: number()
12540
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12584
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12541
12585
  /**
12542
12586
  * filesystem-browse — per-node capability for browsing the node's local
12543
12587
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12830,19 +12874,22 @@ method(LlmGenerateBaseInputSchema.extend({
12830
12874
  runtime: ManagedRuntimeConfigSchema,
12831
12875
  /** The managed profile's timeout, threaded by the hub provider. */
12832
12876
  timeoutMs: number().int().positive().optional()
12833
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12877
+ }), LlmGenerateResultSchema, {
12878
+ kind: "mutation",
12879
+ auth: "admin"
12880
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12834
12881
  kind: "mutation",
12835
12882
  auth: "admin"
12836
12883
  }), method(object({}), _void(), {
12837
12884
  kind: "mutation",
12838
12885
  auth: "admin"
12839
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12886
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12840
12887
  kind: "mutation",
12841
12888
  auth: "admin"
12842
12889
  }), method(object({ file: string() }), _void(), {
12843
12890
  kind: "mutation",
12844
12891
  auth: "admin"
12845
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12892
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12846
12893
  /**
12847
12894
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12848
12895
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16353,7 +16400,7 @@ var OauthIntegrationDescriptorSchema = object({
16353
16400
  */
16354
16401
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16355
16402
  });
16356
- method(_void(), OauthIntegrationDescriptorSchema);
16403
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16357
16404
  /**
16358
16405
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16359
16406
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17548,6 +17595,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17548
17595
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17549
17596
  kind: "mutation",
17550
17597
  auth: "admin"
17598
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17599
+ kind: "mutation",
17600
+ auth: "admin"
17601
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17602
+ kind: "query",
17603
+ auth: "admin"
17604
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17605
+ kind: "mutation",
17606
+ auth: "admin"
17551
17607
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17552
17608
  kind: "query",
17553
17609
  auth: "admin"
@@ -17702,6 +17758,11 @@ object({
17702
17758
  "jpeg"
17703
17759
  ])
17704
17760
  });
17761
+ /**
17762
+ * Process-local frame identity. It is serializable so it can ride an in-process
17763
+ * capability call, but `registryId` deliberately prevents resolution in any
17764
+ * other process or execution group.
17765
+ */
17705
17766
  var FrameRefSchema = object({
17706
17767
  registryId: string().min(1),
17707
17768
  id: string().min(1),
@@ -19907,7 +19968,7 @@ method(object({
19907
19968
  * linking rather than produce an eternal token.
19908
19969
  */
19909
19970
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19910
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19971
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19911
19972
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19912
19973
  providerId: string().min(1),
19913
19974
  displayName: string().min(1),
@@ -20002,10 +20063,13 @@ var EvictResultSchema = object({
20002
20063
  /** True when the provider has nothing left it is willing to drop on this location. */
20003
20064
  exhausted: boolean()
20004
20065
  });
20005
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20066
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20006
20067
  locationId: string(),
20007
20068
  targetBytes: number().int().positive()
20008
- }), EvictResultSchema, { kind: "mutation" });
20069
+ }), EvictResultSchema, {
20070
+ kind: "mutation",
20071
+ auth: "admin"
20072
+ });
20009
20073
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20010
20074
  kind: "mutation",
20011
20075
  auth: "admin"
@@ -20065,26 +20129,50 @@ var ReadChunkInputSchema = object({
20065
20129
  length: number()
20066
20130
  });
20067
20131
  var EndDownloadInputSchema = object({ downloadId: string() });
20068
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20132
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20069
20133
  location: StorageLocationSchema,
20070
20134
  relativePath: string()
20071
- }), string()), method(object({
20135
+ }), string(), { auth: "admin" }), method(object({
20072
20136
  location: StorageLocationSchema,
20073
20137
  relativePath: string(),
20074
20138
  data: _instanceof(Uint8Array)
20075
- }), _void(), { kind: "mutation" }), method(object({
20139
+ }), _void(), {
20140
+ kind: "mutation",
20141
+ auth: "admin"
20142
+ }), method(object({
20076
20143
  location: StorageLocationSchema,
20077
20144
  relativePath: string()
20078
- }), _instanceof(Uint8Array)), method(object({
20145
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20079
20146
  location: StorageLocationSchema,
20080
20147
  relativePath: string()
20081
- }), boolean()), method(object({
20148
+ }), boolean(), { auth: "admin" }), method(object({
20082
20149
  location: StorageLocationSchema,
20083
20150
  prefix: string().optional()
20084
- }), array(string()).readonly()), method(object({
20151
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20085
20152
  location: StorageLocationSchema,
20086
20153
  relativePath: string()
20087
- }), _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" });
20154
+ }), _void(), {
20155
+ kind: "mutation",
20156
+ auth: "admin"
20157
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20158
+ kind: "mutation",
20159
+ auth: "admin"
20160
+ }), method(WriteChunkInputSchema, _void(), {
20161
+ kind: "mutation",
20162
+ auth: "admin"
20163
+ }), method(FinalizeUploadInputSchema, _void(), {
20164
+ kind: "mutation",
20165
+ auth: "admin"
20166
+ }), method(AbortUploadInputSchema, _void(), {
20167
+ kind: "mutation",
20168
+ auth: "admin"
20169
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20170
+ kind: "mutation",
20171
+ auth: "admin"
20172
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20173
+ kind: "mutation",
20174
+ auth: "admin"
20175
+ });
20088
20176
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20089
20177
  var ProfileSettingsSchemaBridge = unknown().nullable();
20090
20178
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20342,7 +20430,8 @@ method(object({
20342
20430
  access: "create"
20343
20431
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20344
20432
  kind: "mutation",
20345
- access: "view"
20433
+ access: "view",
20434
+ auth: "admin"
20346
20435
  }), method(object({
20347
20436
  /** Required — the user the assertion belongs to (verified). */
20348
20437
  userId: string(),
@@ -20350,10 +20439,12 @@ method(object({
20350
20439
  response: record(string(), unknown())
20351
20440
  }), object({ verified: boolean() }), {
20352
20441
  kind: "mutation",
20353
- access: "view"
20442
+ access: "view",
20443
+ auth: "admin"
20354
20444
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20355
20445
  kind: "mutation",
20356
- access: "view"
20446
+ access: "view",
20447
+ auth: "admin"
20357
20448
  }), method(object({
20358
20449
  /** AuthenticationResponseJSON from the browser. */
20359
20450
  response: record(string(), unknown()) }), object({
@@ -20361,7 +20452,8 @@ response: record(string(), unknown()) }), object({
20361
20452
  userId: string().nullable()
20362
20453
  }), {
20363
20454
  kind: "mutation",
20364
- access: "view"
20455
+ access: "view",
20456
+ auth: "admin"
20365
20457
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20366
20458
  userId: string(),
20367
20459
  credentialId: string()
@@ -20533,7 +20625,19 @@ var VectorStatsResultSchema = object({
20533
20625
  /** False when the backend ranks approximately. */
20534
20626
  exact: boolean()
20535
20627
  });
20536
- 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);
20628
+ method(VectorDeclareIndexInputSchema, _void(), {
20629
+ kind: "mutation",
20630
+ auth: "admin"
20631
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20632
+ kind: "mutation",
20633
+ auth: "admin"
20634
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20635
+ kind: "mutation",
20636
+ auth: "admin"
20637
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20638
+ kind: "mutation",
20639
+ auth: "admin"
20640
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20537
20641
  var ClipSchema = object({
20538
20642
  /** Opaque, provider-namespaced id. The default provider encodes the time
20539
20643
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22994,7 +23098,27 @@ var MediaFileLiteSchema$1 = object({
22994
23098
  sizeBytes: number(),
22995
23099
  timestamp: number()
22996
23100
  });
22997
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23101
+ method(object({
23102
+ /**
23103
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23104
+ *
23105
+ * Default `false`, the same inversion `listRecentFaces` and
23106
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23107
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23108
+ * on the live hub the same day: four identities cost 40,979 B with the
23109
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23110
+ * four times and the viewer holds at `staleTime: 30_000`.
23111
+ *
23112
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23113
+ * the `event-media` plane serves that key `immutable` with an ETag.
23114
+ *
23115
+ * **This is an INPUT field, so it does not reach the addon until the
23116
+ * next train** — the hub router validates cap inputs against its own
23117
+ * compiled Zod and strips a key it does not know. Until then the
23118
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23119
+ * is what ships, and the opt-in becomes reachable when the train lands.
23120
+ */
23121
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22998
23122
  kind: "mutation",
22999
23123
  auth: "admin"
23000
23124
  }), method(object({
@@ -25884,8 +26008,10 @@ var PlateInfoSchema = object({
25884
26008
  keyFrameMediaKey: string().optional(),
25885
26009
  base64: string().optional(),
25886
26010
  /**
25887
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25888
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26011
+ * Same crop as a data-plane URL, always present when the plate has a stored
26012
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26013
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26014
+ * left at its `true` default.
25889
26015
  */
25890
26016
  cropUrl: string().optional()
25891
26017
  });
@@ -25905,14 +26031,34 @@ var PlateClusterSchema = object({
25905
26031
  });
25906
26032
  method(object({
25907
26033
  deviceId: number().int().optional(),
25908
- limit: number().int().positive().optional()
26034
+ limit: number().int().positive().optional(),
26035
+ /**
26036
+ * Inline the base64 crop on every row. Default `true` — the existing
26037
+ * behaviour, kept so no caller breaks.
26038
+ *
26039
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26040
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26041
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26042
+ * metadata without them — and the browser then caches the images.
26043
+ *
26044
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26045
+ * plates were the one gallery list left without it.
26046
+ *
26047
+ * **This is an INPUT field, so it does not reach the addon until the
26048
+ * next train.** The hub router validates cap inputs against its own
26049
+ * compiled Zod and strips a key it does not know. Until the train
26050
+ * ships, sending `false` is harmless and keeps the crops inline.
26051
+ */
26052
+ includeCrops: boolean().optional()
25909
26053
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25910
26054
  deviceId: number().int(),
25911
26055
  trackId: string()
25912
26056
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25913
26057
  text: string().min(1),
25914
26058
  maxDistance: number().int().min(0).optional(),
25915
- limit: number().int().positive().optional()
26059
+ limit: number().int().positive().optional(),
26060
+ /** See `listPlates.includeCrops`. Default `true`. */
26061
+ includeCrops: boolean().optional()
25916
26062
  }), array(PlateInfoSchema).readonly()), method(object({
25917
26063
  maxDistance: number().int().min(0).optional(),
25918
26064
  minClusterSize: number().int().min(2).optional(),
@@ -25926,7 +26072,13 @@ method(object({
25926
26072
  }), method(object({ plateId: string() }), _void(), {
25927
26073
  kind: "mutation",
25928
26074
  auth: "admin"
25929
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26075
+ }), method(object({
26076
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26077
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26078
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26079
+ * INPUT field: stripped by the hub router until the train ships, which
26080
+ * resolves to `false` and is exactly the intended default. */
26081
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
25930
26082
  kind: "mutation",
25931
26083
  auth: "admin"
25932
26084
  }), method(object({
@@ -33187,6 +33339,12 @@ Object.freeze({
33187
33339
  addonId: null,
33188
33340
  access: "create"
33189
33341
  },
33342
+ "pipelineAnalytics.cancelRelocateMedia": {
33343
+ capName: "pipeline-analytics",
33344
+ capScope: "device",
33345
+ addonId: null,
33346
+ access: "create"
33347
+ },
33190
33348
  "pipelineAnalytics.cancelStorageMigrationMove": {
33191
33349
  capName: "pipeline-analytics",
33192
33350
  capScope: "device",
@@ -33361,6 +33519,12 @@ Object.freeze({
33361
33519
  addonId: null,
33362
33520
  access: "view"
33363
33521
  },
33522
+ "pipelineAnalytics.listRelocateMediaJobs": {
33523
+ capName: "pipeline-analytics",
33524
+ capScope: "device",
33525
+ addonId: null,
33526
+ access: "view"
33527
+ },
33364
33528
  "pipelineAnalytics.listRetrainAnnotations": {
33365
33529
  capName: "pipeline-analytics",
33366
33530
  capScope: "device",
@@ -33439,6 +33603,12 @@ Object.freeze({
33439
33603
  addonId: null,
33440
33604
  access: "create"
33441
33605
  },
33606
+ "pipelineAnalytics.relocateMedia": {
33607
+ capName: "pipeline-analytics",
33608
+ capScope: "device",
33609
+ addonId: null,
33610
+ access: "create"
33611
+ },
33442
33612
  "pipelineAnalytics.restageRetrainTrack": {
33443
33613
  capName: "pipeline-analytics",
33444
33614
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6667,7 +6667,7 @@ function method(input, output, options) {
6667
6667
  input,
6668
6668
  output,
6669
6669
  kind: options?.kind ?? "query",
6670
- auth: options?.auth ?? "protected",
6670
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6671
6671
  ...options?.access !== void 0 ? { access: options.access } : {},
6672
6672
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6673
6673
  timeoutMs: options?.timeoutMs
@@ -6691,7 +6691,7 @@ function event(data) {
6691
6691
  }
6692
6692
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6693
6693
  var VersionOutputSchema$1 = object({ version: string() });
6694
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6694
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6695
6695
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6696
6696
  DeviceType["Camera"] = "camera";
6697
6697
  DeviceType["Hub"] = "hub";
@@ -7012,7 +7012,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7012
7012
  }({});
7013
7013
  var StaticDirOutputSchema = object({ staticDir: string() });
7014
7014
  var VersionOutputSchema = object({ version: string() });
7015
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7015
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7016
7016
  /**
7017
7017
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7018
7018
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7638,24 +7638,6 @@ var RecordingRetentionSchema = object({
7638
7638
  maxSizeGb: number().min(0).optional()
7639
7639
  });
7640
7640
  /**
7641
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7642
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7643
- * previews at. Five graduated steps; absent on a config = `standard` (the
7644
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7645
- *
7646
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7647
- * Each window's index sidecar carries its own tile dims, so a camera whose
7648
- * preset changed over time renders every historical window at the dims it was
7649
- * written with.
7650
- */
7651
- var ScrubThumbnailPresetSchema = _enum([
7652
- "minimal",
7653
- "low",
7654
- "standard",
7655
- "high",
7656
- "max"
7657
- ]);
7658
- /**
7659
7641
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7660
7642
  *
7661
7643
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7663,7 +7645,11 @@ var ScrubThumbnailPresetSchema = _enum([
7663
7645
  * other field is a storage knob (profiles, segment length, retention, scrub).
7664
7646
  *
7665
7647
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7666
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7648
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7649
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7650
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7651
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7652
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7667
7653
  * A stale caller must fail loudly — silently stripping its legacy intent would
7668
7654
  * persist a band-less config, i.e. silently stop recording the camera.
7669
7655
  */
@@ -7686,14 +7672,7 @@ var RecordingConfigSchema = object({
7686
7672
  * "off" is the absence of a covering band, never a band value.
7687
7673
  */
7688
7674
  bands: array(RecordingBandSchema).default([]),
7689
- retention: RecordingRetentionSchema.optional(),
7690
- /**
7691
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7692
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7693
- * windows only — existing sheets are immutable, and each window's index
7694
- * carries its own tile dims so mixed-preset history renders correctly.
7695
- */
7696
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7675
+ retention: RecordingRetentionSchema.optional()
7697
7676
  }).strict();
7698
7677
  /**
7699
7678
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7769,10 +7748,11 @@ var RelocateFootageInputSchema = object({
7769
7748
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7770
7749
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7771
7750
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7772
- var StorageMigrationMediaMoveInputSchema = object({
7751
+ var RelocateMediaInputSchema = object({
7773
7752
  toLocationId: string(),
7774
7753
  throttleMbps: number().min(1).max(1e3).optional()
7775
- }).extend({ leaseId: string().min(1) });
7754
+ });
7755
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7776
7756
  /** The independently selectable logical storage classes. `recordings`
7777
7757
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7778
7758
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8067,7 +8047,26 @@ var LabelDefinitionSchema = object({
8067
8047
  description: string().optional(),
8068
8048
  icon: string().optional()
8069
8049
  });
8070
- var ClassMapDefinitionSchema = object({
8050
+ /**
8051
+ * Wire schema for a per-model CATALOG classMap override
8052
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8053
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8054
+ * detection pipeline executor actually routes.
8055
+ *
8056
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8057
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8058
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8059
+ * enum) — the two used to share the name `ClassMapDefinition`/
8060
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8061
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8062
+ * are not: it is two different concepts colliding on a name. Keep this type
8063
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8064
+ * would either narrow every `ClassMapDefinition` consumer to the four
8065
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8066
+ * schema exists for (see the "rejects a classMap whose target is not a
8067
+ * detection macro" test in `model-catalog-schema.test.ts`).
8068
+ */
8069
+ var DetectionCatalogClassMapSchema = object({
8071
8070
  mapping: record(string(), _enum([
8072
8071
  "person",
8073
8072
  "vehicle",
@@ -8272,7 +8271,7 @@ var ModelCatalogEntrySchema = object({
8272
8271
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8273
8272
  * labels already ARE the CamStack macros (Scrypted identity map).
8274
8273
  */
8275
- classMap: ClassMapDefinitionSchema.optional()
8274
+ classMap: DetectionCatalogClassMapSchema.optional()
8276
8275
  });
8277
8276
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8278
8277
  format: literal("openvino"),
@@ -8302,7 +8301,7 @@ var ModelConvertMetadataSchema = object({
8302
8301
  "segmentation"
8303
8302
  ]),
8304
8303
  faceAlignment: boolean().optional(),
8305
- classMap: ClassMapDefinitionSchema.optional()
8304
+ classMap: DetectionCatalogClassMapSchema.optional()
8306
8305
  });
8307
8306
  var ConvertResultSchema = object({
8308
8307
  entry: ModelCatalogEntrySchema,
@@ -9165,7 +9164,7 @@ var AddonPageDeclarationSchema = object({
9165
9164
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9166
9165
  sectionLabel: string().optional()
9167
9166
  });
9168
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9167
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9169
9168
  var AddonHttpRouteSchema = object({
9170
9169
  method: _enum([
9171
9170
  "GET",
@@ -9400,7 +9399,7 @@ var WidgetMetadataSchema = object({
9400
9399
  defaultColumns: number().int().min(1).max(12).default(6),
9401
9400
  defaultRows: number().int().min(1).max(12).default(1)
9402
9401
  });
9403
- method(_void(), array(WidgetMetadataSchema).readonly());
9402
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9404
9403
  /**
9405
9404
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9406
9405
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11024,7 +11023,7 @@ var CustomModelDescriptorSchema = object({
11024
11023
  stepId: string(),
11025
11024
  entry: ModelCatalogEntrySchema
11026
11025
  });
11027
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11026
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11028
11027
  /**
11029
11028
  * Query filter for settings-store collections.
11030
11029
  */
@@ -11111,7 +11110,8 @@ method(object({
11111
11110
  }), _void(), { kind: "mutation" }), method(object({
11112
11111
  namespace: string().optional(),
11113
11112
  collection: string(),
11114
- filter: QueryFilterSchema.optional()
11113
+ filter: QueryFilterSchema.optional(),
11114
+ columns: array(string()).readonly().optional()
11115
11115
  }), array(SettingsRecordSchema).readonly()), method(object({
11116
11116
  namespace: string().optional(),
11117
11117
  collection: string(),
@@ -11174,46 +11174,87 @@ var EngineInfoSchema = object({
11174
11174
  kind: _enum(["relational", "vector"]),
11175
11175
  displayName: string()
11176
11176
  });
11177
- method(_void(), EngineInfoSchema), method(object({
11177
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11178
11178
  namespace: string().optional(),
11179
11179
  collection: string(),
11180
11180
  key: string()
11181
- }), unknown()), method(object({
11181
+ }), unknown(), { auth: "admin" }), method(object({
11182
11182
  namespace: string().optional(),
11183
11183
  collection: string(),
11184
11184
  key: string(),
11185
11185
  value: unknown()
11186
- }), _void(), { kind: "mutation" }), method(object({
11186
+ }), _void(), {
11187
+ kind: "mutation",
11188
+ auth: "admin"
11189
+ }), method(object({
11187
11190
  namespace: string().optional(),
11188
11191
  collection: string(),
11189
- filter: QueryFilterSchema.optional()
11190
- }), array(SettingsRecordSchema).readonly()), method(object({
11192
+ filter: QueryFilterSchema.optional(),
11193
+ /**
11194
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11195
+ *
11196
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11197
+ * was wrong — corrected 2026-08-26 after the hop map
11198
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11199
+ * There is **no Zod parse at all** between the door and the engine: the
11200
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11201
+ * field declared here reaches `SqliteSettingsBackend` either way.
11202
+ *
11203
+ * What actually lost `columns` was the THIRD declaration of this shape:
11204
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11205
+ * interface the engine destructures from. The field existed on both
11206
+ * schemas and the engine still never read it, because nothing checks a
11207
+ * registered provider against `InferProvider<cap>` —
11208
+ * `ProviderRegistration.provider` is typed `object`.
11209
+ *
11210
+ * It is declared here anyway, and must stay in step with
11211
+ * `settings-store.query`: a caller reading only the cap definitions has
11212
+ * to be able to see that this call carries a projection.
11213
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11214
+ */
11215
+ columns: array(string()).readonly().optional()
11216
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11191
11217
  namespace: string().optional(),
11192
11218
  collection: string(),
11193
11219
  record: SettingsRecordSchema
11194
- }), _void(), { kind: "mutation" }), method(object({
11220
+ }), _void(), {
11221
+ kind: "mutation",
11222
+ auth: "admin"
11223
+ }), method(object({
11195
11224
  namespace: string().optional(),
11196
11225
  collection: string(),
11197
11226
  id: string(),
11198
11227
  data: record(string(), unknown())
11199
- }), _void(), { kind: "mutation" }), method(object({
11228
+ }), _void(), {
11229
+ kind: "mutation",
11230
+ auth: "admin"
11231
+ }), method(object({
11200
11232
  namespace: string().optional(),
11201
11233
  collection: string(),
11202
11234
  key: string()
11203
- }), _void(), { kind: "mutation" }), method(object({
11235
+ }), _void(), {
11236
+ kind: "mutation",
11237
+ auth: "admin"
11238
+ }), method(object({
11204
11239
  namespace: string().optional(),
11205
11240
  collection: string(),
11206
11241
  filter: MutationFilterSchema
11207
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11242
+ }), object({ deleted: number().int() }), {
11243
+ kind: "mutation",
11244
+ auth: "admin"
11245
+ }), method(object({
11208
11246
  namespace: string().optional(),
11209
11247
  collection: string(),
11210
11248
  filter: MutationFilterSchema,
11211
11249
  data: record(string(), unknown())
11212
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11250
+ }), object({ updated: number().int() }), {
11251
+ kind: "mutation",
11252
+ auth: "admin"
11253
+ }), method(object({
11213
11254
  namespace: string().optional(),
11214
11255
  collection: string(),
11215
11256
  filter: QueryFilterSchema.optional()
11216
- }), number()), method(object({
11257
+ }), number(), { auth: "admin" }), method(object({
11217
11258
  namespace: string().optional(),
11218
11259
  collection: string(),
11219
11260
  field: string(),
@@ -11223,15 +11264,18 @@ method(_void(), EngineInfoSchema), method(object({
11223
11264
  }), array(object({
11224
11265
  bucket: number().int(),
11225
11266
  count: number().int()
11226
- })).readonly()), method(object({
11267
+ })).readonly(), { auth: "admin" }), method(object({
11227
11268
  namespace: string().optional(),
11228
11269
  collection: string()
11229
- }), boolean()), method(object({
11270
+ }), boolean(), { auth: "admin" }), method(object({
11230
11271
  namespace: string().optional(),
11231
11272
  collection: string(),
11232
11273
  columns: array(CollectionColumnSchema).readonly(),
11233
11274
  indexes: array(CollectionIndexSchema).readonly().optional()
11234
- }), _void(), { kind: "mutation" });
11275
+ }), _void(), {
11276
+ kind: "mutation",
11277
+ auth: "admin"
11278
+ });
11235
11279
  /**
11236
11280
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11237
11281
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12538,7 +12582,7 @@ method(object({
12538
12582
  crop: _instanceof(Uint8Array),
12539
12583
  width: number(),
12540
12584
  height: number()
12541
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12585
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12542
12586
  /**
12543
12587
  * filesystem-browse — per-node capability for browsing the node's local
12544
12588
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12831,19 +12875,22 @@ method(LlmGenerateBaseInputSchema.extend({
12831
12875
  runtime: ManagedRuntimeConfigSchema,
12832
12876
  /** The managed profile's timeout, threaded by the hub provider. */
12833
12877
  timeoutMs: number().int().positive().optional()
12834
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12878
+ }), LlmGenerateResultSchema, {
12879
+ kind: "mutation",
12880
+ auth: "admin"
12881
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12835
12882
  kind: "mutation",
12836
12883
  auth: "admin"
12837
12884
  }), method(object({}), _void(), {
12838
12885
  kind: "mutation",
12839
12886
  auth: "admin"
12840
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12887
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12841
12888
  kind: "mutation",
12842
12889
  auth: "admin"
12843
12890
  }), method(object({ file: string() }), _void(), {
12844
12891
  kind: "mutation",
12845
12892
  auth: "admin"
12846
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12893
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12847
12894
  /**
12848
12895
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12849
12896
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16354,7 +16401,7 @@ var OauthIntegrationDescriptorSchema = object({
16354
16401
  */
16355
16402
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16356
16403
  });
16357
- method(_void(), OauthIntegrationDescriptorSchema);
16404
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16358
16405
  /**
16359
16406
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16360
16407
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17549,6 +17596,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17549
17596
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17550
17597
  kind: "mutation",
17551
17598
  auth: "admin"
17599
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17600
+ kind: "mutation",
17601
+ auth: "admin"
17602
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17603
+ kind: "query",
17604
+ auth: "admin"
17605
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17606
+ kind: "mutation",
17607
+ auth: "admin"
17552
17608
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17553
17609
  kind: "query",
17554
17610
  auth: "admin"
@@ -17703,6 +17759,11 @@ object({
17703
17759
  "jpeg"
17704
17760
  ])
17705
17761
  });
17762
+ /**
17763
+ * Process-local frame identity. It is serializable so it can ride an in-process
17764
+ * capability call, but `registryId` deliberately prevents resolution in any
17765
+ * other process or execution group.
17766
+ */
17706
17767
  var FrameRefSchema = object({
17707
17768
  registryId: string().min(1),
17708
17769
  id: string().min(1),
@@ -19908,7 +19969,7 @@ method(object({
19908
19969
  * linking rather than produce an eternal token.
19909
19970
  */
19910
19971
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19911
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19972
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19912
19973
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19913
19974
  providerId: string().min(1),
19914
19975
  displayName: string().min(1),
@@ -20003,10 +20064,13 @@ var EvictResultSchema = object({
20003
20064
  /** True when the provider has nothing left it is willing to drop on this location. */
20004
20065
  exhausted: boolean()
20005
20066
  });
20006
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20067
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20007
20068
  locationId: string(),
20008
20069
  targetBytes: number().int().positive()
20009
- }), EvictResultSchema, { kind: "mutation" });
20070
+ }), EvictResultSchema, {
20071
+ kind: "mutation",
20072
+ auth: "admin"
20073
+ });
20010
20074
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20011
20075
  kind: "mutation",
20012
20076
  auth: "admin"
@@ -20066,26 +20130,50 @@ var ReadChunkInputSchema = object({
20066
20130
  length: number()
20067
20131
  });
20068
20132
  var EndDownloadInputSchema = object({ downloadId: string() });
20069
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20133
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20070
20134
  location: StorageLocationSchema,
20071
20135
  relativePath: string()
20072
- }), string()), method(object({
20136
+ }), string(), { auth: "admin" }), method(object({
20073
20137
  location: StorageLocationSchema,
20074
20138
  relativePath: string(),
20075
20139
  data: _instanceof(Uint8Array)
20076
- }), _void(), { kind: "mutation" }), method(object({
20140
+ }), _void(), {
20141
+ kind: "mutation",
20142
+ auth: "admin"
20143
+ }), method(object({
20077
20144
  location: StorageLocationSchema,
20078
20145
  relativePath: string()
20079
- }), _instanceof(Uint8Array)), method(object({
20146
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20080
20147
  location: StorageLocationSchema,
20081
20148
  relativePath: string()
20082
- }), boolean()), method(object({
20149
+ }), boolean(), { auth: "admin" }), method(object({
20083
20150
  location: StorageLocationSchema,
20084
20151
  prefix: string().optional()
20085
- }), array(string()).readonly()), method(object({
20152
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20086
20153
  location: StorageLocationSchema,
20087
20154
  relativePath: string()
20088
- }), _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" });
20155
+ }), _void(), {
20156
+ kind: "mutation",
20157
+ auth: "admin"
20158
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20159
+ kind: "mutation",
20160
+ auth: "admin"
20161
+ }), method(WriteChunkInputSchema, _void(), {
20162
+ kind: "mutation",
20163
+ auth: "admin"
20164
+ }), method(FinalizeUploadInputSchema, _void(), {
20165
+ kind: "mutation",
20166
+ auth: "admin"
20167
+ }), method(AbortUploadInputSchema, _void(), {
20168
+ kind: "mutation",
20169
+ auth: "admin"
20170
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20171
+ kind: "mutation",
20172
+ auth: "admin"
20173
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20174
+ kind: "mutation",
20175
+ auth: "admin"
20176
+ });
20089
20177
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20090
20178
  var ProfileSettingsSchemaBridge = unknown().nullable();
20091
20179
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20343,7 +20431,8 @@ method(object({
20343
20431
  access: "create"
20344
20432
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20345
20433
  kind: "mutation",
20346
- access: "view"
20434
+ access: "view",
20435
+ auth: "admin"
20347
20436
  }), method(object({
20348
20437
  /** Required — the user the assertion belongs to (verified). */
20349
20438
  userId: string(),
@@ -20351,10 +20440,12 @@ method(object({
20351
20440
  response: record(string(), unknown())
20352
20441
  }), object({ verified: boolean() }), {
20353
20442
  kind: "mutation",
20354
- access: "view"
20443
+ access: "view",
20444
+ auth: "admin"
20355
20445
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20356
20446
  kind: "mutation",
20357
- access: "view"
20447
+ access: "view",
20448
+ auth: "admin"
20358
20449
  }), method(object({
20359
20450
  /** AuthenticationResponseJSON from the browser. */
20360
20451
  response: record(string(), unknown()) }), object({
@@ -20362,7 +20453,8 @@ response: record(string(), unknown()) }), object({
20362
20453
  userId: string().nullable()
20363
20454
  }), {
20364
20455
  kind: "mutation",
20365
- access: "view"
20456
+ access: "view",
20457
+ auth: "admin"
20366
20458
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20367
20459
  userId: string(),
20368
20460
  credentialId: string()
@@ -20534,7 +20626,19 @@ var VectorStatsResultSchema = object({
20534
20626
  /** False when the backend ranks approximately. */
20535
20627
  exact: boolean()
20536
20628
  });
20537
- 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);
20629
+ method(VectorDeclareIndexInputSchema, _void(), {
20630
+ kind: "mutation",
20631
+ auth: "admin"
20632
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20633
+ kind: "mutation",
20634
+ auth: "admin"
20635
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20636
+ kind: "mutation",
20637
+ auth: "admin"
20638
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20639
+ kind: "mutation",
20640
+ auth: "admin"
20641
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20538
20642
  var ClipSchema = object({
20539
20643
  /** Opaque, provider-namespaced id. The default provider encodes the time
20540
20644
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22995,7 +23099,27 @@ var MediaFileLiteSchema$1 = object({
22995
23099
  sizeBytes: number(),
22996
23100
  timestamp: number()
22997
23101
  });
22998
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23102
+ method(object({
23103
+ /**
23104
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23105
+ *
23106
+ * Default `false`, the same inversion `listRecentFaces` and
23107
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23108
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23109
+ * on the live hub the same day: four identities cost 40,979 B with the
23110
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23111
+ * four times and the viewer holds at `staleTime: 30_000`.
23112
+ *
23113
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23114
+ * the `event-media` plane serves that key `immutable` with an ETag.
23115
+ *
23116
+ * **This is an INPUT field, so it does not reach the addon until the
23117
+ * next train** — the hub router validates cap inputs against its own
23118
+ * compiled Zod and strips a key it does not know. Until then the
23119
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23120
+ * is what ships, and the opt-in becomes reachable when the train lands.
23121
+ */
23122
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22999
23123
  kind: "mutation",
23000
23124
  auth: "admin"
23001
23125
  }), method(object({
@@ -25885,8 +26009,10 @@ var PlateInfoSchema = object({
25885
26009
  keyFrameMediaKey: string().optional(),
25886
26010
  base64: string().optional(),
25887
26011
  /**
25888
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25889
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26012
+ * Same crop as a data-plane URL, always present when the plate has a stored
26013
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26014
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26015
+ * left at its `true` default.
25890
26016
  */
25891
26017
  cropUrl: string().optional()
25892
26018
  });
@@ -25906,14 +26032,34 @@ var PlateClusterSchema = object({
25906
26032
  });
25907
26033
  method(object({
25908
26034
  deviceId: number().int().optional(),
25909
- limit: number().int().positive().optional()
26035
+ limit: number().int().positive().optional(),
26036
+ /**
26037
+ * Inline the base64 crop on every row. Default `true` — the existing
26038
+ * behaviour, kept so no caller breaks.
26039
+ *
26040
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26041
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26042
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26043
+ * metadata without them — and the browser then caches the images.
26044
+ *
26045
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26046
+ * plates were the one gallery list left without it.
26047
+ *
26048
+ * **This is an INPUT field, so it does not reach the addon until the
26049
+ * next train.** The hub router validates cap inputs against its own
26050
+ * compiled Zod and strips a key it does not know. Until the train
26051
+ * ships, sending `false` is harmless and keeps the crops inline.
26052
+ */
26053
+ includeCrops: boolean().optional()
25910
26054
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25911
26055
  deviceId: number().int(),
25912
26056
  trackId: string()
25913
26057
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25914
26058
  text: string().min(1),
25915
26059
  maxDistance: number().int().min(0).optional(),
25916
- limit: number().int().positive().optional()
26060
+ limit: number().int().positive().optional(),
26061
+ /** See `listPlates.includeCrops`. Default `true`. */
26062
+ includeCrops: boolean().optional()
25917
26063
  }), array(PlateInfoSchema).readonly()), method(object({
25918
26064
  maxDistance: number().int().min(0).optional(),
25919
26065
  minClusterSize: number().int().min(2).optional(),
@@ -25927,7 +26073,13 @@ method(object({
25927
26073
  }), method(object({ plateId: string() }), _void(), {
25928
26074
  kind: "mutation",
25929
26075
  auth: "admin"
25930
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26076
+ }), method(object({
26077
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26078
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26079
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26080
+ * INPUT field: stripped by the hub router until the train ships, which
26081
+ * resolves to `false` and is exactly the intended default. */
26082
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
25931
26083
  kind: "mutation",
25932
26084
  auth: "admin"
25933
26085
  }), method(object({
@@ -33188,6 +33340,12 @@ Object.freeze({
33188
33340
  addonId: null,
33189
33341
  access: "create"
33190
33342
  },
33343
+ "pipelineAnalytics.cancelRelocateMedia": {
33344
+ capName: "pipeline-analytics",
33345
+ capScope: "device",
33346
+ addonId: null,
33347
+ access: "create"
33348
+ },
33191
33349
  "pipelineAnalytics.cancelStorageMigrationMove": {
33192
33350
  capName: "pipeline-analytics",
33193
33351
  capScope: "device",
@@ -33362,6 +33520,12 @@ Object.freeze({
33362
33520
  addonId: null,
33363
33521
  access: "view"
33364
33522
  },
33523
+ "pipelineAnalytics.listRelocateMediaJobs": {
33524
+ capName: "pipeline-analytics",
33525
+ capScope: "device",
33526
+ addonId: null,
33527
+ access: "view"
33528
+ },
33365
33529
  "pipelineAnalytics.listRetrainAnnotations": {
33366
33530
  capName: "pipeline-analytics",
33367
33531
  capScope: "device",
@@ -33440,6 +33604,12 @@ Object.freeze({
33440
33604
  addonId: null,
33441
33605
  access: "create"
33442
33606
  },
33607
+ "pipelineAnalytics.relocateMedia": {
33608
+ capName: "pipeline-analytics",
33609
+ capScope: "device",
33610
+ addonId: null,
33611
+ access: "create"
33612
+ },
33443
33613
  "pipelineAnalytics.restageRetrainTrack": {
33444
33614
  capName: "pipeline-analytics",
33445
33615
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.28",
3
+ "version": "0.2.29",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",