@camstack/addon-provider-homematic 1.2.29 → 1.2.30

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
@@ -6639,7 +6639,7 @@ function method(input, output, options) {
6639
6639
  input,
6640
6640
  output,
6641
6641
  kind: options?.kind ?? "query",
6642
- auth: options?.auth ?? "protected",
6642
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6643
6643
  ...options?.access !== void 0 ? { access: options.access } : {},
6644
6644
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6645
6645
  timeoutMs: options?.timeoutMs
@@ -6663,7 +6663,7 @@ function event(data) {
6663
6663
  }
6664
6664
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6665
6665
  var VersionOutputSchema$1 = object({ version: string() });
6666
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6666
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6667
6667
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6668
6668
  DeviceType["Camera"] = "camera";
6669
6669
  DeviceType["Hub"] = "hub";
@@ -6984,7 +6984,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6984
6984
  }({});
6985
6985
  var StaticDirOutputSchema = object({ staticDir: string() });
6986
6986
  var VersionOutputSchema = object({ version: string() });
6987
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6987
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6988
6988
  /**
6989
6989
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6990
6990
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7610,24 +7610,6 @@ var RecordingRetentionSchema = object({
7610
7610
  maxSizeGb: number().min(0).optional()
7611
7611
  });
7612
7612
  /**
7613
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7614
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7615
- * previews at. Five graduated steps; absent on a config = `standard` (the
7616
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7617
- *
7618
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7619
- * Each window's index sidecar carries its own tile dims, so a camera whose
7620
- * preset changed over time renders every historical window at the dims it was
7621
- * written with.
7622
- */
7623
- var ScrubThumbnailPresetSchema = _enum([
7624
- "minimal",
7625
- "low",
7626
- "standard",
7627
- "high",
7628
- "max"
7629
- ]);
7630
- /**
7631
7613
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7632
7614
  *
7633
7615
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7635,7 +7617,11 @@ var ScrubThumbnailPresetSchema = _enum([
7635
7617
  * other field is a storage knob (profiles, segment length, retention, scrub).
7636
7618
  *
7637
7619
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7638
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7620
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7621
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7622
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7623
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7624
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7639
7625
  * A stale caller must fail loudly — silently stripping its legacy intent would
7640
7626
  * persist a band-less config, i.e. silently stop recording the camera.
7641
7627
  */
@@ -7658,14 +7644,7 @@ var RecordingConfigSchema = object({
7658
7644
  * "off" is the absence of a covering band, never a band value.
7659
7645
  */
7660
7646
  bands: array(RecordingBandSchema).default([]),
7661
- retention: RecordingRetentionSchema.optional(),
7662
- /**
7663
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7664
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7665
- * windows only — existing sheets are immutable, and each window's index
7666
- * carries its own tile dims so mixed-preset history renders correctly.
7667
- */
7668
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7647
+ retention: RecordingRetentionSchema.optional()
7669
7648
  }).strict();
7670
7649
  /**
7671
7650
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7741,10 +7720,11 @@ var RelocateFootageInputSchema = object({
7741
7720
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7742
7721
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7743
7722
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7744
- var StorageMigrationMediaMoveInputSchema = object({
7723
+ var RelocateMediaInputSchema = object({
7745
7724
  toLocationId: string(),
7746
7725
  throttleMbps: number().min(1).max(1e3).optional()
7747
- }).extend({ leaseId: string().min(1) });
7726
+ });
7727
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7748
7728
  /** The independently selectable logical storage classes. `recordings`
7749
7729
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7750
7730
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8039,7 +8019,26 @@ var LabelDefinitionSchema = object({
8039
8019
  description: string().optional(),
8040
8020
  icon: string().optional()
8041
8021
  });
8042
- var ClassMapDefinitionSchema = object({
8022
+ /**
8023
+ * Wire schema for a per-model CATALOG classMap override
8024
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8025
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8026
+ * detection pipeline executor actually routes.
8027
+ *
8028
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8029
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8030
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8031
+ * enum) — the two used to share the name `ClassMapDefinition`/
8032
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8033
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8034
+ * are not: it is two different concepts colliding on a name. Keep this type
8035
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8036
+ * would either narrow every `ClassMapDefinition` consumer to the four
8037
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8038
+ * schema exists for (see the "rejects a classMap whose target is not a
8039
+ * detection macro" test in `model-catalog-schema.test.ts`).
8040
+ */
8041
+ var DetectionCatalogClassMapSchema = object({
8043
8042
  mapping: record(string(), _enum([
8044
8043
  "person",
8045
8044
  "vehicle",
@@ -8244,7 +8243,7 @@ var ModelCatalogEntrySchema = object({
8244
8243
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8245
8244
  * labels already ARE the CamStack macros (Scrypted identity map).
8246
8245
  */
8247
- classMap: ClassMapDefinitionSchema.optional()
8246
+ classMap: DetectionCatalogClassMapSchema.optional()
8248
8247
  });
8249
8248
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8250
8249
  format: literal("openvino"),
@@ -8274,7 +8273,7 @@ var ModelConvertMetadataSchema = object({
8274
8273
  "segmentation"
8275
8274
  ]),
8276
8275
  faceAlignment: boolean().optional(),
8277
- classMap: ClassMapDefinitionSchema.optional()
8276
+ classMap: DetectionCatalogClassMapSchema.optional()
8278
8277
  });
8279
8278
  var ConvertResultSchema = object({
8280
8279
  entry: ModelCatalogEntrySchema,
@@ -9137,7 +9136,7 @@ var AddonPageDeclarationSchema = object({
9137
9136
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9138
9137
  sectionLabel: string().optional()
9139
9138
  });
9140
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9139
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9141
9140
  var AddonHttpRouteSchema = object({
9142
9141
  method: _enum([
9143
9142
  "GET",
@@ -9372,7 +9371,7 @@ var WidgetMetadataSchema = object({
9372
9371
  defaultColumns: number().int().min(1).max(12).default(6),
9373
9372
  defaultRows: number().int().min(1).max(12).default(1)
9374
9373
  });
9375
- method(_void(), array(WidgetMetadataSchema).readonly());
9374
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9376
9375
  /**
9377
9376
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9378
9377
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11045,7 +11044,7 @@ var CustomModelDescriptorSchema = object({
11045
11044
  stepId: string(),
11046
11045
  entry: ModelCatalogEntrySchema
11047
11046
  });
11048
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11047
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11049
11048
  /**
11050
11049
  * Query filter for settings-store collections.
11051
11050
  */
@@ -11132,7 +11131,8 @@ method(object({
11132
11131
  }), _void(), { kind: "mutation" }), method(object({
11133
11132
  namespace: string().optional(),
11134
11133
  collection: string(),
11135
- filter: QueryFilterSchema.optional()
11134
+ filter: QueryFilterSchema.optional(),
11135
+ columns: array(string()).readonly().optional()
11136
11136
  }), array(SettingsRecordSchema).readonly()), method(object({
11137
11137
  namespace: string().optional(),
11138
11138
  collection: string(),
@@ -11195,46 +11195,87 @@ var EngineInfoSchema = object({
11195
11195
  kind: _enum(["relational", "vector"]),
11196
11196
  displayName: string()
11197
11197
  });
11198
- method(_void(), EngineInfoSchema), method(object({
11198
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11199
11199
  namespace: string().optional(),
11200
11200
  collection: string(),
11201
11201
  key: string()
11202
- }), unknown()), method(object({
11202
+ }), unknown(), { auth: "admin" }), method(object({
11203
11203
  namespace: string().optional(),
11204
11204
  collection: string(),
11205
11205
  key: string(),
11206
11206
  value: unknown()
11207
- }), _void(), { kind: "mutation" }), method(object({
11207
+ }), _void(), {
11208
+ kind: "mutation",
11209
+ auth: "admin"
11210
+ }), method(object({
11208
11211
  namespace: string().optional(),
11209
11212
  collection: string(),
11210
- filter: QueryFilterSchema.optional()
11211
- }), array(SettingsRecordSchema).readonly()), method(object({
11213
+ filter: QueryFilterSchema.optional(),
11214
+ /**
11215
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11216
+ *
11217
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11218
+ * was wrong — corrected 2026-08-26 after the hop map
11219
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11220
+ * There is **no Zod parse at all** between the door and the engine: the
11221
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11222
+ * field declared here reaches `SqliteSettingsBackend` either way.
11223
+ *
11224
+ * What actually lost `columns` was the THIRD declaration of this shape:
11225
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11226
+ * interface the engine destructures from. The field existed on both
11227
+ * schemas and the engine still never read it, because nothing checks a
11228
+ * registered provider against `InferProvider<cap>` —
11229
+ * `ProviderRegistration.provider` is typed `object`.
11230
+ *
11231
+ * It is declared here anyway, and must stay in step with
11232
+ * `settings-store.query`: a caller reading only the cap definitions has
11233
+ * to be able to see that this call carries a projection.
11234
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11235
+ */
11236
+ columns: array(string()).readonly().optional()
11237
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11212
11238
  namespace: string().optional(),
11213
11239
  collection: string(),
11214
11240
  record: SettingsRecordSchema
11215
- }), _void(), { kind: "mutation" }), method(object({
11241
+ }), _void(), {
11242
+ kind: "mutation",
11243
+ auth: "admin"
11244
+ }), method(object({
11216
11245
  namespace: string().optional(),
11217
11246
  collection: string(),
11218
11247
  id: string(),
11219
11248
  data: record(string(), unknown())
11220
- }), _void(), { kind: "mutation" }), method(object({
11249
+ }), _void(), {
11250
+ kind: "mutation",
11251
+ auth: "admin"
11252
+ }), method(object({
11221
11253
  namespace: string().optional(),
11222
11254
  collection: string(),
11223
11255
  key: string()
11224
- }), _void(), { kind: "mutation" }), method(object({
11256
+ }), _void(), {
11257
+ kind: "mutation",
11258
+ auth: "admin"
11259
+ }), method(object({
11225
11260
  namespace: string().optional(),
11226
11261
  collection: string(),
11227
11262
  filter: MutationFilterSchema
11228
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11263
+ }), object({ deleted: number().int() }), {
11264
+ kind: "mutation",
11265
+ auth: "admin"
11266
+ }), method(object({
11229
11267
  namespace: string().optional(),
11230
11268
  collection: string(),
11231
11269
  filter: MutationFilterSchema,
11232
11270
  data: record(string(), unknown())
11233
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11271
+ }), object({ updated: number().int() }), {
11272
+ kind: "mutation",
11273
+ auth: "admin"
11274
+ }), method(object({
11234
11275
  namespace: string().optional(),
11235
11276
  collection: string(),
11236
11277
  filter: QueryFilterSchema.optional()
11237
- }), number()), method(object({
11278
+ }), number(), { auth: "admin" }), method(object({
11238
11279
  namespace: string().optional(),
11239
11280
  collection: string(),
11240
11281
  field: string(),
@@ -11244,15 +11285,18 @@ method(_void(), EngineInfoSchema), method(object({
11244
11285
  }), array(object({
11245
11286
  bucket: number().int(),
11246
11287
  count: number().int()
11247
- })).readonly()), method(object({
11288
+ })).readonly(), { auth: "admin" }), method(object({
11248
11289
  namespace: string().optional(),
11249
11290
  collection: string()
11250
- }), boolean()), method(object({
11291
+ }), boolean(), { auth: "admin" }), method(object({
11251
11292
  namespace: string().optional(),
11252
11293
  collection: string(),
11253
11294
  columns: array(CollectionColumnSchema).readonly(),
11254
11295
  indexes: array(CollectionIndexSchema).readonly().optional()
11255
- }), _void(), { kind: "mutation" });
11296
+ }), _void(), {
11297
+ kind: "mutation",
11298
+ auth: "admin"
11299
+ });
11256
11300
  /**
11257
11301
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11258
11302
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12559,7 +12603,7 @@ method(object({
12559
12603
  crop: _instanceof(Uint8Array),
12560
12604
  width: number(),
12561
12605
  height: number()
12562
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12606
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12563
12607
  /**
12564
12608
  * filesystem-browse — per-node capability for browsing the node's local
12565
12609
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12852,19 +12896,22 @@ method(LlmGenerateBaseInputSchema.extend({
12852
12896
  runtime: ManagedRuntimeConfigSchema,
12853
12897
  /** The managed profile's timeout, threaded by the hub provider. */
12854
12898
  timeoutMs: number().int().positive().optional()
12855
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12899
+ }), LlmGenerateResultSchema, {
12900
+ kind: "mutation",
12901
+ auth: "admin"
12902
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12856
12903
  kind: "mutation",
12857
12904
  auth: "admin"
12858
12905
  }), method(object({}), _void(), {
12859
12906
  kind: "mutation",
12860
12907
  auth: "admin"
12861
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12908
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12862
12909
  kind: "mutation",
12863
12910
  auth: "admin"
12864
12911
  }), method(object({ file: string() }), _void(), {
12865
12912
  kind: "mutation",
12866
12913
  auth: "admin"
12867
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12914
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12868
12915
  /**
12869
12916
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12870
12917
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16375,7 +16422,7 @@ var OauthIntegrationDescriptorSchema = object({
16375
16422
  */
16376
16423
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16377
16424
  });
16378
- method(_void(), OauthIntegrationDescriptorSchema);
16425
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16379
16426
  /**
16380
16427
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16381
16428
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17570,6 +17617,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17570
17617
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17571
17618
  kind: "mutation",
17572
17619
  auth: "admin"
17620
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17621
+ kind: "mutation",
17622
+ auth: "admin"
17623
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17624
+ kind: "query",
17625
+ auth: "admin"
17626
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17627
+ kind: "mutation",
17628
+ auth: "admin"
17573
17629
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17574
17630
  kind: "query",
17575
17631
  auth: "admin"
@@ -17724,6 +17780,11 @@ object({
17724
17780
  "jpeg"
17725
17781
  ])
17726
17782
  });
17783
+ /**
17784
+ * Process-local frame identity. It is serializable so it can ride an in-process
17785
+ * capability call, but `registryId` deliberately prevents resolution in any
17786
+ * other process or execution group.
17787
+ */
17727
17788
  var FrameRefSchema = object({
17728
17789
  registryId: string().min(1),
17729
17790
  id: string().min(1),
@@ -19929,7 +19990,7 @@ method(object({
19929
19990
  * linking rather than produce an eternal token.
19930
19991
  */
19931
19992
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19932
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19993
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19933
19994
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19934
19995
  providerId: string().min(1),
19935
19996
  displayName: string().min(1),
@@ -20024,10 +20085,13 @@ var EvictResultSchema = object({
20024
20085
  /** True when the provider has nothing left it is willing to drop on this location. */
20025
20086
  exhausted: boolean()
20026
20087
  });
20027
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20088
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20028
20089
  locationId: string(),
20029
20090
  targetBytes: number().int().positive()
20030
- }), EvictResultSchema, { kind: "mutation" });
20091
+ }), EvictResultSchema, {
20092
+ kind: "mutation",
20093
+ auth: "admin"
20094
+ });
20031
20095
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20032
20096
  kind: "mutation",
20033
20097
  auth: "admin"
@@ -20087,26 +20151,50 @@ var ReadChunkInputSchema = object({
20087
20151
  length: number()
20088
20152
  });
20089
20153
  var EndDownloadInputSchema = object({ downloadId: string() });
20090
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20154
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20091
20155
  location: StorageLocationSchema,
20092
20156
  relativePath: string()
20093
- }), string()), method(object({
20157
+ }), string(), { auth: "admin" }), method(object({
20094
20158
  location: StorageLocationSchema,
20095
20159
  relativePath: string(),
20096
20160
  data: _instanceof(Uint8Array)
20097
- }), _void(), { kind: "mutation" }), method(object({
20161
+ }), _void(), {
20162
+ kind: "mutation",
20163
+ auth: "admin"
20164
+ }), method(object({
20098
20165
  location: StorageLocationSchema,
20099
20166
  relativePath: string()
20100
- }), _instanceof(Uint8Array)), method(object({
20167
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20101
20168
  location: StorageLocationSchema,
20102
20169
  relativePath: string()
20103
- }), boolean()), method(object({
20170
+ }), boolean(), { auth: "admin" }), method(object({
20104
20171
  location: StorageLocationSchema,
20105
20172
  prefix: string().optional()
20106
- }), array(string()).readonly()), method(object({
20173
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20107
20174
  location: StorageLocationSchema,
20108
20175
  relativePath: string()
20109
- }), _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" });
20176
+ }), _void(), {
20177
+ kind: "mutation",
20178
+ auth: "admin"
20179
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20180
+ kind: "mutation",
20181
+ auth: "admin"
20182
+ }), method(WriteChunkInputSchema, _void(), {
20183
+ kind: "mutation",
20184
+ auth: "admin"
20185
+ }), method(FinalizeUploadInputSchema, _void(), {
20186
+ kind: "mutation",
20187
+ auth: "admin"
20188
+ }), method(AbortUploadInputSchema, _void(), {
20189
+ kind: "mutation",
20190
+ auth: "admin"
20191
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20192
+ kind: "mutation",
20193
+ auth: "admin"
20194
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20195
+ kind: "mutation",
20196
+ auth: "admin"
20197
+ });
20110
20198
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20111
20199
  var ProfileSettingsSchemaBridge = unknown().nullable();
20112
20200
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20364,7 +20452,8 @@ method(object({
20364
20452
  access: "create"
20365
20453
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20366
20454
  kind: "mutation",
20367
- access: "view"
20455
+ access: "view",
20456
+ auth: "admin"
20368
20457
  }), method(object({
20369
20458
  /** Required — the user the assertion belongs to (verified). */
20370
20459
  userId: string(),
@@ -20372,10 +20461,12 @@ method(object({
20372
20461
  response: record(string(), unknown())
20373
20462
  }), object({ verified: boolean() }), {
20374
20463
  kind: "mutation",
20375
- access: "view"
20464
+ access: "view",
20465
+ auth: "admin"
20376
20466
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20377
20467
  kind: "mutation",
20378
- access: "view"
20468
+ access: "view",
20469
+ auth: "admin"
20379
20470
  }), method(object({
20380
20471
  /** AuthenticationResponseJSON from the browser. */
20381
20472
  response: record(string(), unknown()) }), object({
@@ -20383,7 +20474,8 @@ response: record(string(), unknown()) }), object({
20383
20474
  userId: string().nullable()
20384
20475
  }), {
20385
20476
  kind: "mutation",
20386
- access: "view"
20477
+ access: "view",
20478
+ auth: "admin"
20387
20479
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20388
20480
  userId: string(),
20389
20481
  credentialId: string()
@@ -20555,7 +20647,19 @@ var VectorStatsResultSchema = object({
20555
20647
  /** False when the backend ranks approximately. */
20556
20648
  exact: boolean()
20557
20649
  });
20558
- 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);
20650
+ method(VectorDeclareIndexInputSchema, _void(), {
20651
+ kind: "mutation",
20652
+ auth: "admin"
20653
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20654
+ kind: "mutation",
20655
+ auth: "admin"
20656
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20657
+ kind: "mutation",
20658
+ auth: "admin"
20659
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20660
+ kind: "mutation",
20661
+ auth: "admin"
20662
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20559
20663
  var ClipSchema = object({
20560
20664
  /** Opaque, provider-namespaced id. The default provider encodes the time
20561
20665
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23008,7 +23112,27 @@ var MediaFileLiteSchema$1 = object({
23008
23112
  sizeBytes: number(),
23009
23113
  timestamp: number()
23010
23114
  });
23011
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23115
+ method(object({
23116
+ /**
23117
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23118
+ *
23119
+ * Default `false`, the same inversion `listRecentFaces` and
23120
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23121
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23122
+ * on the live hub the same day: four identities cost 40,979 B with the
23123
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23124
+ * four times and the viewer holds at `staleTime: 30_000`.
23125
+ *
23126
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23127
+ * the `event-media` plane serves that key `immutable` with an ETag.
23128
+ *
23129
+ * **This is an INPUT field, so it does not reach the addon until the
23130
+ * next train** — the hub router validates cap inputs against its own
23131
+ * compiled Zod and strips a key it does not know. Until then the
23132
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23133
+ * is what ships, and the opt-in becomes reachable when the train lands.
23134
+ */
23135
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23012
23136
  kind: "mutation",
23013
23137
  auth: "admin"
23014
23138
  }), method(object({
@@ -25898,8 +26022,10 @@ var PlateInfoSchema = object({
25898
26022
  keyFrameMediaKey: string().optional(),
25899
26023
  base64: string().optional(),
25900
26024
  /**
25901
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25902
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26025
+ * Same crop as a data-plane URL, always present when the plate has a stored
26026
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26027
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26028
+ * left at its `true` default.
25903
26029
  */
25904
26030
  cropUrl: string().optional()
25905
26031
  });
@@ -25919,14 +26045,34 @@ var PlateClusterSchema = object({
25919
26045
  });
25920
26046
  method(object({
25921
26047
  deviceId: number().int().optional(),
25922
- limit: number().int().positive().optional()
26048
+ limit: number().int().positive().optional(),
26049
+ /**
26050
+ * Inline the base64 crop on every row. Default `true` — the existing
26051
+ * behaviour, kept so no caller breaks.
26052
+ *
26053
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26054
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26055
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26056
+ * metadata without them — and the browser then caches the images.
26057
+ *
26058
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26059
+ * plates were the one gallery list left without it.
26060
+ *
26061
+ * **This is an INPUT field, so it does not reach the addon until the
26062
+ * next train.** The hub router validates cap inputs against its own
26063
+ * compiled Zod and strips a key it does not know. Until the train
26064
+ * ships, sending `false` is harmless and keeps the crops inline.
26065
+ */
26066
+ includeCrops: boolean().optional()
25923
26067
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25924
26068
  deviceId: number().int(),
25925
26069
  trackId: string()
25926
26070
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25927
26071
  text: string().min(1),
25928
26072
  maxDistance: number().int().min(0).optional(),
25929
- limit: number().int().positive().optional()
26073
+ limit: number().int().positive().optional(),
26074
+ /** See `listPlates.includeCrops`. Default `true`. */
26075
+ includeCrops: boolean().optional()
25930
26076
  }), array(PlateInfoSchema).readonly()), method(object({
25931
26077
  maxDistance: number().int().min(0).optional(),
25932
26078
  minClusterSize: number().int().min(2).optional(),
@@ -25940,7 +26086,13 @@ method(object({
25940
26086
  }), method(object({ plateId: string() }), _void(), {
25941
26087
  kind: "mutation",
25942
26088
  auth: "admin"
25943
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26089
+ }), method(object({
26090
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26091
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26092
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26093
+ * INPUT field: stripped by the hub router until the train ships, which
26094
+ * resolves to `false` and is exactly the intended default. */
26095
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
25944
26096
  kind: "mutation",
25945
26097
  auth: "admin"
25946
26098
  }), method(object({
@@ -33201,6 +33353,12 @@ Object.freeze({
33201
33353
  addonId: null,
33202
33354
  access: "create"
33203
33355
  },
33356
+ "pipelineAnalytics.cancelRelocateMedia": {
33357
+ capName: "pipeline-analytics",
33358
+ capScope: "device",
33359
+ addonId: null,
33360
+ access: "create"
33361
+ },
33204
33362
  "pipelineAnalytics.cancelStorageMigrationMove": {
33205
33363
  capName: "pipeline-analytics",
33206
33364
  capScope: "device",
@@ -33375,6 +33533,12 @@ Object.freeze({
33375
33533
  addonId: null,
33376
33534
  access: "view"
33377
33535
  },
33536
+ "pipelineAnalytics.listRelocateMediaJobs": {
33537
+ capName: "pipeline-analytics",
33538
+ capScope: "device",
33539
+ addonId: null,
33540
+ access: "view"
33541
+ },
33378
33542
  "pipelineAnalytics.listRetrainAnnotations": {
33379
33543
  capName: "pipeline-analytics",
33380
33544
  capScope: "device",
@@ -33453,6 +33617,12 @@ Object.freeze({
33453
33617
  addonId: null,
33454
33618
  access: "create"
33455
33619
  },
33620
+ "pipelineAnalytics.relocateMedia": {
33621
+ capName: "pipeline-analytics",
33622
+ capScope: "device",
33623
+ addonId: null,
33624
+ access: "create"
33625
+ },
33456
33626
  "pipelineAnalytics.restageRetrainTrack": {
33457
33627
  capName: "pipeline-analytics",
33458
33628
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6640,7 +6640,7 @@ function method(input, output, options) {
6640
6640
  input,
6641
6641
  output,
6642
6642
  kind: options?.kind ?? "query",
6643
- auth: options?.auth ?? "protected",
6643
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6644
6644
  ...options?.access !== void 0 ? { access: options.access } : {},
6645
6645
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6646
6646
  timeoutMs: options?.timeoutMs
@@ -6664,7 +6664,7 @@ function event(data) {
6664
6664
  }
6665
6665
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6666
6666
  var VersionOutputSchema$1 = object({ version: string() });
6667
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6667
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6668
6668
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6669
6669
  DeviceType["Camera"] = "camera";
6670
6670
  DeviceType["Hub"] = "hub";
@@ -6985,7 +6985,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6985
6985
  }({});
6986
6986
  var StaticDirOutputSchema = object({ staticDir: string() });
6987
6987
  var VersionOutputSchema = object({ version: string() });
6988
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6988
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6989
6989
  /**
6990
6990
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6991
6991
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7611,24 +7611,6 @@ var RecordingRetentionSchema = object({
7611
7611
  maxSizeGb: number().min(0).optional()
7612
7612
  });
7613
7613
  /**
7614
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7615
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7616
- * previews at. Five graduated steps; absent on a config = `standard` (the
7617
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7618
- *
7619
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7620
- * Each window's index sidecar carries its own tile dims, so a camera whose
7621
- * preset changed over time renders every historical window at the dims it was
7622
- * written with.
7623
- */
7624
- var ScrubThumbnailPresetSchema = _enum([
7625
- "minimal",
7626
- "low",
7627
- "standard",
7628
- "high",
7629
- "max"
7630
- ]);
7631
- /**
7632
7614
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7633
7615
  *
7634
7616
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7636,7 +7618,11 @@ var ScrubThumbnailPresetSchema = _enum([
7636
7618
  * other field is a storage knob (profiles, segment length, retention, scrub).
7637
7619
  *
7638
7620
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7639
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7621
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7622
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7623
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7624
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7625
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7640
7626
  * A stale caller must fail loudly — silently stripping its legacy intent would
7641
7627
  * persist a band-less config, i.e. silently stop recording the camera.
7642
7628
  */
@@ -7659,14 +7645,7 @@ var RecordingConfigSchema = object({
7659
7645
  * "off" is the absence of a covering band, never a band value.
7660
7646
  */
7661
7647
  bands: array(RecordingBandSchema).default([]),
7662
- retention: RecordingRetentionSchema.optional(),
7663
- /**
7664
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7665
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7666
- * windows only — existing sheets are immutable, and each window's index
7667
- * carries its own tile dims so mixed-preset history renders correctly.
7668
- */
7669
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7648
+ retention: RecordingRetentionSchema.optional()
7670
7649
  }).strict();
7671
7650
  /**
7672
7651
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7742,10 +7721,11 @@ var RelocateFootageInputSchema = object({
7742
7721
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7743
7722
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7744
7723
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7745
- var StorageMigrationMediaMoveInputSchema = object({
7724
+ var RelocateMediaInputSchema = object({
7746
7725
  toLocationId: string(),
7747
7726
  throttleMbps: number().min(1).max(1e3).optional()
7748
- }).extend({ leaseId: string().min(1) });
7727
+ });
7728
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7749
7729
  /** The independently selectable logical storage classes. `recordings`
7750
7730
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7751
7731
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8040,7 +8020,26 @@ var LabelDefinitionSchema = object({
8040
8020
  description: string().optional(),
8041
8021
  icon: string().optional()
8042
8022
  });
8043
- var ClassMapDefinitionSchema = object({
8023
+ /**
8024
+ * Wire schema for a per-model CATALOG classMap override
8025
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8026
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8027
+ * detection pipeline executor actually routes.
8028
+ *
8029
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8030
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8031
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8032
+ * enum) — the two used to share the name `ClassMapDefinition`/
8033
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8034
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8035
+ * are not: it is two different concepts colliding on a name. Keep this type
8036
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8037
+ * would either narrow every `ClassMapDefinition` consumer to the four
8038
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8039
+ * schema exists for (see the "rejects a classMap whose target is not a
8040
+ * detection macro" test in `model-catalog-schema.test.ts`).
8041
+ */
8042
+ var DetectionCatalogClassMapSchema = object({
8044
8043
  mapping: record(string(), _enum([
8045
8044
  "person",
8046
8045
  "vehicle",
@@ -8245,7 +8244,7 @@ var ModelCatalogEntrySchema = object({
8245
8244
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8246
8245
  * labels already ARE the CamStack macros (Scrypted identity map).
8247
8246
  */
8248
- classMap: ClassMapDefinitionSchema.optional()
8247
+ classMap: DetectionCatalogClassMapSchema.optional()
8249
8248
  });
8250
8249
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8251
8250
  format: literal("openvino"),
@@ -8275,7 +8274,7 @@ var ModelConvertMetadataSchema = object({
8275
8274
  "segmentation"
8276
8275
  ]),
8277
8276
  faceAlignment: boolean().optional(),
8278
- classMap: ClassMapDefinitionSchema.optional()
8277
+ classMap: DetectionCatalogClassMapSchema.optional()
8279
8278
  });
8280
8279
  var ConvertResultSchema = object({
8281
8280
  entry: ModelCatalogEntrySchema,
@@ -9138,7 +9137,7 @@ var AddonPageDeclarationSchema = object({
9138
9137
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9139
9138
  sectionLabel: string().optional()
9140
9139
  });
9141
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9140
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9142
9141
  var AddonHttpRouteSchema = object({
9143
9142
  method: _enum([
9144
9143
  "GET",
@@ -9373,7 +9372,7 @@ var WidgetMetadataSchema = object({
9373
9372
  defaultColumns: number().int().min(1).max(12).default(6),
9374
9373
  defaultRows: number().int().min(1).max(12).default(1)
9375
9374
  });
9376
- method(_void(), array(WidgetMetadataSchema).readonly());
9375
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9377
9376
  /**
9378
9377
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9379
9378
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11046,7 +11045,7 @@ var CustomModelDescriptorSchema = object({
11046
11045
  stepId: string(),
11047
11046
  entry: ModelCatalogEntrySchema
11048
11047
  });
11049
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11048
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11050
11049
  /**
11051
11050
  * Query filter for settings-store collections.
11052
11051
  */
@@ -11133,7 +11132,8 @@ method(object({
11133
11132
  }), _void(), { kind: "mutation" }), method(object({
11134
11133
  namespace: string().optional(),
11135
11134
  collection: string(),
11136
- filter: QueryFilterSchema.optional()
11135
+ filter: QueryFilterSchema.optional(),
11136
+ columns: array(string()).readonly().optional()
11137
11137
  }), array(SettingsRecordSchema).readonly()), method(object({
11138
11138
  namespace: string().optional(),
11139
11139
  collection: string(),
@@ -11196,46 +11196,87 @@ var EngineInfoSchema = object({
11196
11196
  kind: _enum(["relational", "vector"]),
11197
11197
  displayName: string()
11198
11198
  });
11199
- method(_void(), EngineInfoSchema), method(object({
11199
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11200
11200
  namespace: string().optional(),
11201
11201
  collection: string(),
11202
11202
  key: string()
11203
- }), unknown()), method(object({
11203
+ }), unknown(), { auth: "admin" }), method(object({
11204
11204
  namespace: string().optional(),
11205
11205
  collection: string(),
11206
11206
  key: string(),
11207
11207
  value: unknown()
11208
- }), _void(), { kind: "mutation" }), method(object({
11208
+ }), _void(), {
11209
+ kind: "mutation",
11210
+ auth: "admin"
11211
+ }), method(object({
11209
11212
  namespace: string().optional(),
11210
11213
  collection: string(),
11211
- filter: QueryFilterSchema.optional()
11212
- }), array(SettingsRecordSchema).readonly()), method(object({
11214
+ filter: QueryFilterSchema.optional(),
11215
+ /**
11216
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11217
+ *
11218
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11219
+ * was wrong — corrected 2026-08-26 after the hop map
11220
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11221
+ * There is **no Zod parse at all** between the door and the engine: the
11222
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11223
+ * field declared here reaches `SqliteSettingsBackend` either way.
11224
+ *
11225
+ * What actually lost `columns` was the THIRD declaration of this shape:
11226
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11227
+ * interface the engine destructures from. The field existed on both
11228
+ * schemas and the engine still never read it, because nothing checks a
11229
+ * registered provider against `InferProvider<cap>` —
11230
+ * `ProviderRegistration.provider` is typed `object`.
11231
+ *
11232
+ * It is declared here anyway, and must stay in step with
11233
+ * `settings-store.query`: a caller reading only the cap definitions has
11234
+ * to be able to see that this call carries a projection.
11235
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11236
+ */
11237
+ columns: array(string()).readonly().optional()
11238
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11213
11239
  namespace: string().optional(),
11214
11240
  collection: string(),
11215
11241
  record: SettingsRecordSchema
11216
- }), _void(), { kind: "mutation" }), method(object({
11242
+ }), _void(), {
11243
+ kind: "mutation",
11244
+ auth: "admin"
11245
+ }), method(object({
11217
11246
  namespace: string().optional(),
11218
11247
  collection: string(),
11219
11248
  id: string(),
11220
11249
  data: record(string(), unknown())
11221
- }), _void(), { kind: "mutation" }), method(object({
11250
+ }), _void(), {
11251
+ kind: "mutation",
11252
+ auth: "admin"
11253
+ }), method(object({
11222
11254
  namespace: string().optional(),
11223
11255
  collection: string(),
11224
11256
  key: string()
11225
- }), _void(), { kind: "mutation" }), method(object({
11257
+ }), _void(), {
11258
+ kind: "mutation",
11259
+ auth: "admin"
11260
+ }), method(object({
11226
11261
  namespace: string().optional(),
11227
11262
  collection: string(),
11228
11263
  filter: MutationFilterSchema
11229
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11264
+ }), object({ deleted: number().int() }), {
11265
+ kind: "mutation",
11266
+ auth: "admin"
11267
+ }), method(object({
11230
11268
  namespace: string().optional(),
11231
11269
  collection: string(),
11232
11270
  filter: MutationFilterSchema,
11233
11271
  data: record(string(), unknown())
11234
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11272
+ }), object({ updated: number().int() }), {
11273
+ kind: "mutation",
11274
+ auth: "admin"
11275
+ }), method(object({
11235
11276
  namespace: string().optional(),
11236
11277
  collection: string(),
11237
11278
  filter: QueryFilterSchema.optional()
11238
- }), number()), method(object({
11279
+ }), number(), { auth: "admin" }), method(object({
11239
11280
  namespace: string().optional(),
11240
11281
  collection: string(),
11241
11282
  field: string(),
@@ -11245,15 +11286,18 @@ method(_void(), EngineInfoSchema), method(object({
11245
11286
  }), array(object({
11246
11287
  bucket: number().int(),
11247
11288
  count: number().int()
11248
- })).readonly()), method(object({
11289
+ })).readonly(), { auth: "admin" }), method(object({
11249
11290
  namespace: string().optional(),
11250
11291
  collection: string()
11251
- }), boolean()), method(object({
11292
+ }), boolean(), { auth: "admin" }), method(object({
11252
11293
  namespace: string().optional(),
11253
11294
  collection: string(),
11254
11295
  columns: array(CollectionColumnSchema).readonly(),
11255
11296
  indexes: array(CollectionIndexSchema).readonly().optional()
11256
- }), _void(), { kind: "mutation" });
11297
+ }), _void(), {
11298
+ kind: "mutation",
11299
+ auth: "admin"
11300
+ });
11257
11301
  /**
11258
11302
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11259
11303
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12560,7 +12604,7 @@ method(object({
12560
12604
  crop: _instanceof(Uint8Array),
12561
12605
  width: number(),
12562
12606
  height: number()
12563
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12607
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12564
12608
  /**
12565
12609
  * filesystem-browse — per-node capability for browsing the node's local
12566
12610
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12853,19 +12897,22 @@ method(LlmGenerateBaseInputSchema.extend({
12853
12897
  runtime: ManagedRuntimeConfigSchema,
12854
12898
  /** The managed profile's timeout, threaded by the hub provider. */
12855
12899
  timeoutMs: number().int().positive().optional()
12856
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12900
+ }), LlmGenerateResultSchema, {
12901
+ kind: "mutation",
12902
+ auth: "admin"
12903
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12857
12904
  kind: "mutation",
12858
12905
  auth: "admin"
12859
12906
  }), method(object({}), _void(), {
12860
12907
  kind: "mutation",
12861
12908
  auth: "admin"
12862
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12909
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12863
12910
  kind: "mutation",
12864
12911
  auth: "admin"
12865
12912
  }), method(object({ file: string() }), _void(), {
12866
12913
  kind: "mutation",
12867
12914
  auth: "admin"
12868
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12915
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12869
12916
  /**
12870
12917
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12871
12918
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16376,7 +16423,7 @@ var OauthIntegrationDescriptorSchema = object({
16376
16423
  */
16377
16424
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16378
16425
  });
16379
- method(_void(), OauthIntegrationDescriptorSchema);
16426
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16380
16427
  /**
16381
16428
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16382
16429
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17571,6 +17618,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17571
17618
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17572
17619
  kind: "mutation",
17573
17620
  auth: "admin"
17621
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17622
+ kind: "mutation",
17623
+ auth: "admin"
17624
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17625
+ kind: "query",
17626
+ auth: "admin"
17627
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17628
+ kind: "mutation",
17629
+ auth: "admin"
17574
17630
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17575
17631
  kind: "query",
17576
17632
  auth: "admin"
@@ -17725,6 +17781,11 @@ object({
17725
17781
  "jpeg"
17726
17782
  ])
17727
17783
  });
17784
+ /**
17785
+ * Process-local frame identity. It is serializable so it can ride an in-process
17786
+ * capability call, but `registryId` deliberately prevents resolution in any
17787
+ * other process or execution group.
17788
+ */
17728
17789
  var FrameRefSchema = object({
17729
17790
  registryId: string().min(1),
17730
17791
  id: string().min(1),
@@ -19930,7 +19991,7 @@ method(object({
19930
19991
  * linking rather than produce an eternal token.
19931
19992
  */
19932
19993
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19933
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19994
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19934
19995
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19935
19996
  providerId: string().min(1),
19936
19997
  displayName: string().min(1),
@@ -20025,10 +20086,13 @@ var EvictResultSchema = object({
20025
20086
  /** True when the provider has nothing left it is willing to drop on this location. */
20026
20087
  exhausted: boolean()
20027
20088
  });
20028
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20089
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20029
20090
  locationId: string(),
20030
20091
  targetBytes: number().int().positive()
20031
- }), EvictResultSchema, { kind: "mutation" });
20092
+ }), EvictResultSchema, {
20093
+ kind: "mutation",
20094
+ auth: "admin"
20095
+ });
20032
20096
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20033
20097
  kind: "mutation",
20034
20098
  auth: "admin"
@@ -20088,26 +20152,50 @@ var ReadChunkInputSchema = object({
20088
20152
  length: number()
20089
20153
  });
20090
20154
  var EndDownloadInputSchema = object({ downloadId: string() });
20091
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20155
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20092
20156
  location: StorageLocationSchema,
20093
20157
  relativePath: string()
20094
- }), string()), method(object({
20158
+ }), string(), { auth: "admin" }), method(object({
20095
20159
  location: StorageLocationSchema,
20096
20160
  relativePath: string(),
20097
20161
  data: _instanceof(Uint8Array)
20098
- }), _void(), { kind: "mutation" }), method(object({
20162
+ }), _void(), {
20163
+ kind: "mutation",
20164
+ auth: "admin"
20165
+ }), method(object({
20099
20166
  location: StorageLocationSchema,
20100
20167
  relativePath: string()
20101
- }), _instanceof(Uint8Array)), method(object({
20168
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20102
20169
  location: StorageLocationSchema,
20103
20170
  relativePath: string()
20104
- }), boolean()), method(object({
20171
+ }), boolean(), { auth: "admin" }), method(object({
20105
20172
  location: StorageLocationSchema,
20106
20173
  prefix: string().optional()
20107
- }), array(string()).readonly()), method(object({
20174
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20108
20175
  location: StorageLocationSchema,
20109
20176
  relativePath: string()
20110
- }), _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" });
20177
+ }), _void(), {
20178
+ kind: "mutation",
20179
+ auth: "admin"
20180
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20181
+ kind: "mutation",
20182
+ auth: "admin"
20183
+ }), method(WriteChunkInputSchema, _void(), {
20184
+ kind: "mutation",
20185
+ auth: "admin"
20186
+ }), method(FinalizeUploadInputSchema, _void(), {
20187
+ kind: "mutation",
20188
+ auth: "admin"
20189
+ }), method(AbortUploadInputSchema, _void(), {
20190
+ kind: "mutation",
20191
+ auth: "admin"
20192
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20193
+ kind: "mutation",
20194
+ auth: "admin"
20195
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20196
+ kind: "mutation",
20197
+ auth: "admin"
20198
+ });
20111
20199
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20112
20200
  var ProfileSettingsSchemaBridge = unknown().nullable();
20113
20201
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20365,7 +20453,8 @@ method(object({
20365
20453
  access: "create"
20366
20454
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20367
20455
  kind: "mutation",
20368
- access: "view"
20456
+ access: "view",
20457
+ auth: "admin"
20369
20458
  }), method(object({
20370
20459
  /** Required — the user the assertion belongs to (verified). */
20371
20460
  userId: string(),
@@ -20373,10 +20462,12 @@ method(object({
20373
20462
  response: record(string(), unknown())
20374
20463
  }), object({ verified: boolean() }), {
20375
20464
  kind: "mutation",
20376
- access: "view"
20465
+ access: "view",
20466
+ auth: "admin"
20377
20467
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20378
20468
  kind: "mutation",
20379
- access: "view"
20469
+ access: "view",
20470
+ auth: "admin"
20380
20471
  }), method(object({
20381
20472
  /** AuthenticationResponseJSON from the browser. */
20382
20473
  response: record(string(), unknown()) }), object({
@@ -20384,7 +20475,8 @@ response: record(string(), unknown()) }), object({
20384
20475
  userId: string().nullable()
20385
20476
  }), {
20386
20477
  kind: "mutation",
20387
- access: "view"
20478
+ access: "view",
20479
+ auth: "admin"
20388
20480
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20389
20481
  userId: string(),
20390
20482
  credentialId: string()
@@ -20556,7 +20648,19 @@ var VectorStatsResultSchema = object({
20556
20648
  /** False when the backend ranks approximately. */
20557
20649
  exact: boolean()
20558
20650
  });
20559
- 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);
20651
+ method(VectorDeclareIndexInputSchema, _void(), {
20652
+ kind: "mutation",
20653
+ auth: "admin"
20654
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20655
+ kind: "mutation",
20656
+ auth: "admin"
20657
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20658
+ kind: "mutation",
20659
+ auth: "admin"
20660
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20661
+ kind: "mutation",
20662
+ auth: "admin"
20663
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20560
20664
  var ClipSchema = object({
20561
20665
  /** Opaque, provider-namespaced id. The default provider encodes the time
20562
20666
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23009,7 +23113,27 @@ var MediaFileLiteSchema$1 = object({
23009
23113
  sizeBytes: number(),
23010
23114
  timestamp: number()
23011
23115
  });
23012
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23116
+ method(object({
23117
+ /**
23118
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23119
+ *
23120
+ * Default `false`, the same inversion `listRecentFaces` and
23121
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23122
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23123
+ * on the live hub the same day: four identities cost 40,979 B with the
23124
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23125
+ * four times and the viewer holds at `staleTime: 30_000`.
23126
+ *
23127
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23128
+ * the `event-media` plane serves that key `immutable` with an ETag.
23129
+ *
23130
+ * **This is an INPUT field, so it does not reach the addon until the
23131
+ * next train** — the hub router validates cap inputs against its own
23132
+ * compiled Zod and strips a key it does not know. Until then the
23133
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23134
+ * is what ships, and the opt-in becomes reachable when the train lands.
23135
+ */
23136
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23013
23137
  kind: "mutation",
23014
23138
  auth: "admin"
23015
23139
  }), method(object({
@@ -25899,8 +26023,10 @@ var PlateInfoSchema = object({
25899
26023
  keyFrameMediaKey: string().optional(),
25900
26024
  base64: string().optional(),
25901
26025
  /**
25902
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25903
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26026
+ * Same crop as a data-plane URL, always present when the plate has a stored
26027
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26028
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26029
+ * left at its `true` default.
25904
26030
  */
25905
26031
  cropUrl: string().optional()
25906
26032
  });
@@ -25920,14 +26046,34 @@ var PlateClusterSchema = object({
25920
26046
  });
25921
26047
  method(object({
25922
26048
  deviceId: number().int().optional(),
25923
- limit: number().int().positive().optional()
26049
+ limit: number().int().positive().optional(),
26050
+ /**
26051
+ * Inline the base64 crop on every row. Default `true` — the existing
26052
+ * behaviour, kept so no caller breaks.
26053
+ *
26054
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26055
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26056
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26057
+ * metadata without them — and the browser then caches the images.
26058
+ *
26059
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26060
+ * plates were the one gallery list left without it.
26061
+ *
26062
+ * **This is an INPUT field, so it does not reach the addon until the
26063
+ * next train.** The hub router validates cap inputs against its own
26064
+ * compiled Zod and strips a key it does not know. Until the train
26065
+ * ships, sending `false` is harmless and keeps the crops inline.
26066
+ */
26067
+ includeCrops: boolean().optional()
25924
26068
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25925
26069
  deviceId: number().int(),
25926
26070
  trackId: string()
25927
26071
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25928
26072
  text: string().min(1),
25929
26073
  maxDistance: number().int().min(0).optional(),
25930
- limit: number().int().positive().optional()
26074
+ limit: number().int().positive().optional(),
26075
+ /** See `listPlates.includeCrops`. Default `true`. */
26076
+ includeCrops: boolean().optional()
25931
26077
  }), array(PlateInfoSchema).readonly()), method(object({
25932
26078
  maxDistance: number().int().min(0).optional(),
25933
26079
  minClusterSize: number().int().min(2).optional(),
@@ -25941,7 +26087,13 @@ method(object({
25941
26087
  }), method(object({ plateId: string() }), _void(), {
25942
26088
  kind: "mutation",
25943
26089
  auth: "admin"
25944
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26090
+ }), method(object({
26091
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26092
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26093
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26094
+ * INPUT field: stripped by the hub router until the train ships, which
26095
+ * resolves to `false` and is exactly the intended default. */
26096
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
25945
26097
  kind: "mutation",
25946
26098
  auth: "admin"
25947
26099
  }), method(object({
@@ -33202,6 +33354,12 @@ Object.freeze({
33202
33354
  addonId: null,
33203
33355
  access: "create"
33204
33356
  },
33357
+ "pipelineAnalytics.cancelRelocateMedia": {
33358
+ capName: "pipeline-analytics",
33359
+ capScope: "device",
33360
+ addonId: null,
33361
+ access: "create"
33362
+ },
33205
33363
  "pipelineAnalytics.cancelStorageMigrationMove": {
33206
33364
  capName: "pipeline-analytics",
33207
33365
  capScope: "device",
@@ -33376,6 +33534,12 @@ Object.freeze({
33376
33534
  addonId: null,
33377
33535
  access: "view"
33378
33536
  },
33537
+ "pipelineAnalytics.listRelocateMediaJobs": {
33538
+ capName: "pipeline-analytics",
33539
+ capScope: "device",
33540
+ addonId: null,
33541
+ access: "view"
33542
+ },
33379
33543
  "pipelineAnalytics.listRetrainAnnotations": {
33380
33544
  capName: "pipeline-analytics",
33381
33545
  capScope: "device",
@@ -33454,6 +33618,12 @@ Object.freeze({
33454
33618
  addonId: null,
33455
33619
  access: "create"
33456
33620
  },
33621
+ "pipelineAnalytics.relocateMedia": {
33622
+ capName: "pipeline-analytics",
33623
+ capScope: "device",
33624
+ addonId: null,
33625
+ access: "create"
33626
+ },
33457
33627
  "pipelineAnalytics.restageRetrainTrack": {
33458
33628
  capName: "pipeline-analytics",
33459
33629
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.29",
3
+ "version": "1.2.30",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",