@camstack/addon-provider-rademacher 0.2.27 → 0.2.28

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
@@ -7615,7 +7615,7 @@ function method(input, output, options) {
7615
7615
  input,
7616
7616
  output,
7617
7617
  kind: options?.kind ?? "query",
7618
- auth: options?.auth ?? "protected",
7618
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
7619
7619
  ...options?.access !== void 0 ? { access: options.access } : {},
7620
7620
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
7621
7621
  timeoutMs: options?.timeoutMs
@@ -7639,7 +7639,7 @@ function event(data) {
7639
7639
  }
7640
7640
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
7641
7641
  var VersionOutputSchema$1 = object({ version: string() });
7642
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
7642
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
7643
7643
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
7644
7644
  DeviceType["Camera"] = "camera";
7645
7645
  DeviceType["Hub"] = "hub";
@@ -7960,7 +7960,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7960
7960
  }({});
7961
7961
  var StaticDirOutputSchema = object({ staticDir: string() });
7962
7962
  var VersionOutputSchema = object({ version: string() });
7963
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7963
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7964
7964
  /**
7965
7965
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7966
7966
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -8586,24 +8586,6 @@ var RecordingRetentionSchema = object({
8586
8586
  maxSizeGb: number().min(0).optional()
8587
8587
  });
8588
8588
  /**
8589
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
8590
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
8591
- * previews at. Five graduated steps; absent on a config = `standard` (the
8592
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
8593
- *
8594
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
8595
- * Each window's index sidecar carries its own tile dims, so a camera whose
8596
- * preset changed over time renders every historical window at the dims it was
8597
- * written with.
8598
- */
8599
- var ScrubThumbnailPresetSchema = _enum([
8600
- "minimal",
8601
- "low",
8602
- "standard",
8603
- "high",
8604
- "max"
8605
- ]);
8606
- /**
8607
8589
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
8608
8590
  *
8609
8591
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -8611,7 +8593,11 @@ var ScrubThumbnailPresetSchema = _enum([
8611
8593
  * other field is a storage knob (profiles, segment length, retention, scrub).
8612
8594
  *
8613
8595
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
8614
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
8596
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
8597
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
8598
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
8599
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
8600
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
8615
8601
  * A stale caller must fail loudly — silently stripping its legacy intent would
8616
8602
  * persist a band-less config, i.e. silently stop recording the camera.
8617
8603
  */
@@ -8634,14 +8620,7 @@ var RecordingConfigSchema = object({
8634
8620
  * "off" is the absence of a covering band, never a band value.
8635
8621
  */
8636
8622
  bands: array(RecordingBandSchema).default([]),
8637
- retention: RecordingRetentionSchema.optional(),
8638
- /**
8639
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
8640
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
8641
- * windows only — existing sheets are immutable, and each window's index
8642
- * carries its own tile dims so mixed-preset history renders correctly.
8643
- */
8644
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
8623
+ retention: RecordingRetentionSchema.optional()
8645
8624
  }).strict();
8646
8625
  /**
8647
8626
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -8717,10 +8696,11 @@ var RelocateFootageInputSchema = object({
8717
8696
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8718
8697
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8719
8698
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8720
- var StorageMigrationMediaMoveInputSchema = object({
8699
+ var RelocateMediaInputSchema = object({
8721
8700
  toLocationId: string(),
8722
8701
  throttleMbps: number().min(1).max(1e3).optional()
8723
- }).extend({ leaseId: string().min(1) });
8702
+ });
8703
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8724
8704
  /** The independently selectable logical storage classes. `recordings`
8725
8705
  * encompasses the high and mid segment profiles; `recordingsLow` is low
8726
8706
  * segments; `eventMedia` is post-analysis blobs. */
@@ -9015,7 +8995,26 @@ var LabelDefinitionSchema = object({
9015
8995
  description: string().optional(),
9016
8996
  icon: string().optional()
9017
8997
  });
9018
- var ClassMapDefinitionSchema = object({
8998
+ /**
8999
+ * Wire schema for a per-model CATALOG classMap override
9000
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
9001
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
9002
+ * detection pipeline executor actually routes.
9003
+ *
9004
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
9005
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
9006
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
9007
+ * enum) — the two used to share the name `ClassMapDefinition`/
9008
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
9009
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
9010
+ * are not: it is two different concepts colliding on a name. Keep this type
9011
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
9012
+ * would either narrow every `ClassMapDefinition` consumer to the four
9013
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
9014
+ * schema exists for (see the "rejects a classMap whose target is not a
9015
+ * detection macro" test in `model-catalog-schema.test.ts`).
9016
+ */
9017
+ var DetectionCatalogClassMapSchema = object({
9019
9018
  mapping: record(string(), _enum([
9020
9019
  "person",
9021
9020
  "vehicle",
@@ -9220,7 +9219,7 @@ var ModelCatalogEntrySchema = object({
9220
9219
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
9221
9220
  * labels already ARE the CamStack macros (Scrypted identity map).
9222
9221
  */
9223
- classMap: ClassMapDefinitionSchema.optional()
9222
+ classMap: DetectionCatalogClassMapSchema.optional()
9224
9223
  });
9225
9224
  var ConvertTargetSchema = discriminatedUnion("format", [object({
9226
9225
  format: literal("openvino"),
@@ -9250,7 +9249,7 @@ var ModelConvertMetadataSchema = object({
9250
9249
  "segmentation"
9251
9250
  ]),
9252
9251
  faceAlignment: boolean().optional(),
9253
- classMap: ClassMapDefinitionSchema.optional()
9252
+ classMap: DetectionCatalogClassMapSchema.optional()
9254
9253
  });
9255
9254
  var ConvertResultSchema = object({
9256
9255
  entry: ModelCatalogEntrySchema,
@@ -10113,7 +10112,7 @@ var AddonPageDeclarationSchema = object({
10113
10112
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
10114
10113
  sectionLabel: string().optional()
10115
10114
  });
10116
- method(_void(), array(AddonPageDeclarationSchema).readonly());
10115
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
10117
10116
  var AddonHttpRouteSchema = object({
10118
10117
  method: _enum([
10119
10118
  "GET",
@@ -10348,7 +10347,7 @@ var WidgetMetadataSchema = object({
10348
10347
  defaultColumns: number().int().min(1).max(12).default(6),
10349
10348
  defaultRows: number().int().min(1).max(12).default(1)
10350
10349
  });
10351
- method(_void(), array(WidgetMetadataSchema).readonly());
10350
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
10352
10351
  /**
10353
10352
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
10354
10353
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11972,7 +11971,7 @@ var CustomModelDescriptorSchema = object({
11972
11971
  stepId: string(),
11973
11972
  entry: ModelCatalogEntrySchema
11974
11973
  });
11975
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11974
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11976
11975
  /**
11977
11976
  * Query filter for settings-store collections.
11978
11977
  */
@@ -12059,7 +12058,8 @@ method(object({
12059
12058
  }), _void(), { kind: "mutation" }), method(object({
12060
12059
  namespace: string().optional(),
12061
12060
  collection: string(),
12062
- filter: QueryFilterSchema.optional()
12061
+ filter: QueryFilterSchema.optional(),
12062
+ columns: array(string()).readonly().optional()
12063
12063
  }), array(SettingsRecordSchema).readonly()), method(object({
12064
12064
  namespace: string().optional(),
12065
12065
  collection: string(),
@@ -12122,46 +12122,87 @@ var EngineInfoSchema = object({
12122
12122
  kind: _enum(["relational", "vector"]),
12123
12123
  displayName: string()
12124
12124
  });
12125
- method(_void(), EngineInfoSchema), method(object({
12125
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12126
12126
  namespace: string().optional(),
12127
12127
  collection: string(),
12128
12128
  key: string()
12129
- }), unknown()), method(object({
12129
+ }), unknown(), { auth: "admin" }), method(object({
12130
12130
  namespace: string().optional(),
12131
12131
  collection: string(),
12132
12132
  key: string(),
12133
12133
  value: unknown()
12134
- }), _void(), { kind: "mutation" }), method(object({
12134
+ }), _void(), {
12135
+ kind: "mutation",
12136
+ auth: "admin"
12137
+ }), method(object({
12135
12138
  namespace: string().optional(),
12136
12139
  collection: string(),
12137
- filter: QueryFilterSchema.optional()
12138
- }), array(SettingsRecordSchema).readonly()), method(object({
12140
+ filter: QueryFilterSchema.optional(),
12141
+ /**
12142
+ * SQL-level column projection — MUST mirror `settings-store.query`.
12143
+ *
12144
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
12145
+ * was wrong — corrected 2026-08-26 after the hop map
12146
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
12147
+ * There is **no Zod parse at all** between the door and the engine: the
12148
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
12149
+ * field declared here reaches `SqliteSettingsBackend` either way.
12150
+ *
12151
+ * What actually lost `columns` was the THIRD declaration of this shape:
12152
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
12153
+ * interface the engine destructures from. The field existed on both
12154
+ * schemas and the engine still never read it, because nothing checks a
12155
+ * registered provider against `InferProvider<cap>` —
12156
+ * `ProviderRegistration.provider` is typed `object`.
12157
+ *
12158
+ * It is declared here anyway, and must stay in step with
12159
+ * `settings-store.query`: a caller reading only the cap definitions has
12160
+ * to be able to see that this call carries a projection.
12161
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
12162
+ */
12163
+ columns: array(string()).readonly().optional()
12164
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
12139
12165
  namespace: string().optional(),
12140
12166
  collection: string(),
12141
12167
  record: SettingsRecordSchema
12142
- }), _void(), { kind: "mutation" }), method(object({
12168
+ }), _void(), {
12169
+ kind: "mutation",
12170
+ auth: "admin"
12171
+ }), method(object({
12143
12172
  namespace: string().optional(),
12144
12173
  collection: string(),
12145
12174
  id: string(),
12146
12175
  data: record(string(), unknown())
12147
- }), _void(), { kind: "mutation" }), method(object({
12176
+ }), _void(), {
12177
+ kind: "mutation",
12178
+ auth: "admin"
12179
+ }), method(object({
12148
12180
  namespace: string().optional(),
12149
12181
  collection: string(),
12150
12182
  key: string()
12151
- }), _void(), { kind: "mutation" }), method(object({
12183
+ }), _void(), {
12184
+ kind: "mutation",
12185
+ auth: "admin"
12186
+ }), method(object({
12152
12187
  namespace: string().optional(),
12153
12188
  collection: string(),
12154
12189
  filter: MutationFilterSchema
12155
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
12190
+ }), object({ deleted: number().int() }), {
12191
+ kind: "mutation",
12192
+ auth: "admin"
12193
+ }), method(object({
12156
12194
  namespace: string().optional(),
12157
12195
  collection: string(),
12158
12196
  filter: MutationFilterSchema,
12159
12197
  data: record(string(), unknown())
12160
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
12198
+ }), object({ updated: number().int() }), {
12199
+ kind: "mutation",
12200
+ auth: "admin"
12201
+ }), method(object({
12161
12202
  namespace: string().optional(),
12162
12203
  collection: string(),
12163
12204
  filter: QueryFilterSchema.optional()
12164
- }), number()), method(object({
12205
+ }), number(), { auth: "admin" }), method(object({
12165
12206
  namespace: string().optional(),
12166
12207
  collection: string(),
12167
12208
  field: string(),
@@ -12171,15 +12212,18 @@ method(_void(), EngineInfoSchema), method(object({
12171
12212
  }), array(object({
12172
12213
  bucket: number().int(),
12173
12214
  count: number().int()
12174
- })).readonly()), method(object({
12215
+ })).readonly(), { auth: "admin" }), method(object({
12175
12216
  namespace: string().optional(),
12176
12217
  collection: string()
12177
- }), boolean()), method(object({
12218
+ }), boolean(), { auth: "admin" }), method(object({
12178
12219
  namespace: string().optional(),
12179
12220
  collection: string(),
12180
12221
  columns: array(CollectionColumnSchema).readonly(),
12181
12222
  indexes: array(CollectionIndexSchema).readonly().optional()
12182
- }), _void(), { kind: "mutation" });
12223
+ }), _void(), {
12224
+ kind: "mutation",
12225
+ auth: "admin"
12226
+ });
12183
12227
  /**
12184
12228
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
12185
12229
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -13469,7 +13513,7 @@ method(object({
13469
13513
  crop: _instanceof(Uint8Array),
13470
13514
  width: number(),
13471
13515
  height: number()
13472
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
13516
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
13473
13517
  /**
13474
13518
  * filesystem-browse — per-node capability for browsing the node's local
13475
13519
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13762,19 +13806,22 @@ method(LlmGenerateBaseInputSchema.extend({
13762
13806
  runtime: ManagedRuntimeConfigSchema,
13763
13807
  /** The managed profile's timeout, threaded by the hub provider. */
13764
13808
  timeoutMs: number().int().positive().optional()
13765
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13809
+ }), LlmGenerateResultSchema, {
13810
+ kind: "mutation",
13811
+ auth: "admin"
13812
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13766
13813
  kind: "mutation",
13767
13814
  auth: "admin"
13768
13815
  }), method(object({}), _void(), {
13769
13816
  kind: "mutation",
13770
13817
  auth: "admin"
13771
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13818
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13772
13819
  kind: "mutation",
13773
13820
  auth: "admin"
13774
13821
  }), method(object({ file: string() }), _void(), {
13775
13822
  kind: "mutation",
13776
13823
  auth: "admin"
13777
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13824
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13778
13825
  /**
13779
13826
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13780
13827
  * methods concat-fan across providers; single-row methods route to ONE
@@ -17285,7 +17332,7 @@ var OauthIntegrationDescriptorSchema = object({
17285
17332
  */
17286
17333
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
17287
17334
  });
17288
- method(_void(), OauthIntegrationDescriptorSchema);
17335
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
17289
17336
  /**
17290
17337
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
17291
17338
  * per-frame detections emitted by the pipeline runner into tracked
@@ -18480,6 +18527,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18480
18527
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18481
18528
  kind: "mutation",
18482
18529
  auth: "admin"
18530
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18531
+ kind: "mutation",
18532
+ auth: "admin"
18533
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
18534
+ kind: "query",
18535
+ auth: "admin"
18536
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18537
+ kind: "mutation",
18538
+ auth: "admin"
18483
18539
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
18484
18540
  kind: "query",
18485
18541
  auth: "admin"
@@ -18634,6 +18690,11 @@ object({
18634
18690
  "jpeg"
18635
18691
  ])
18636
18692
  });
18693
+ /**
18694
+ * Process-local frame identity. It is serializable so it can ride an in-process
18695
+ * capability call, but `registryId` deliberately prevents resolution in any
18696
+ * other process or execution group.
18697
+ */
18637
18698
  var FrameRefSchema = object({
18638
18699
  registryId: string().min(1),
18639
18700
  id: string().min(1),
@@ -20839,7 +20900,7 @@ method(object({
20839
20900
  * linking rather than produce an eternal token.
20840
20901
  */
20841
20902
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20842
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20903
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20843
20904
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20844
20905
  providerId: string().min(1),
20845
20906
  displayName: string().min(1),
@@ -20934,10 +20995,13 @@ var EvictResultSchema = object({
20934
20995
  /** True when the provider has nothing left it is willing to drop on this location. */
20935
20996
  exhausted: boolean()
20936
20997
  });
20937
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20998
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20938
20999
  locationId: string(),
20939
21000
  targetBytes: number().int().positive()
20940
- }), EvictResultSchema, { kind: "mutation" });
21001
+ }), EvictResultSchema, {
21002
+ kind: "mutation",
21003
+ auth: "admin"
21004
+ });
20941
21005
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20942
21006
  kind: "mutation",
20943
21007
  auth: "admin"
@@ -20997,26 +21061,50 @@ var ReadChunkInputSchema = object({
20997
21061
  length: number()
20998
21062
  });
20999
21063
  var EndDownloadInputSchema = object({ downloadId: string() });
21000
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21064
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21001
21065
  location: StorageLocationSchema,
21002
21066
  relativePath: string()
21003
- }), string()), method(object({
21067
+ }), string(), { auth: "admin" }), method(object({
21004
21068
  location: StorageLocationSchema,
21005
21069
  relativePath: string(),
21006
21070
  data: _instanceof(Uint8Array)
21007
- }), _void(), { kind: "mutation" }), method(object({
21071
+ }), _void(), {
21072
+ kind: "mutation",
21073
+ auth: "admin"
21074
+ }), method(object({
21008
21075
  location: StorageLocationSchema,
21009
21076
  relativePath: string()
21010
- }), _instanceof(Uint8Array)), method(object({
21077
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
21011
21078
  location: StorageLocationSchema,
21012
21079
  relativePath: string()
21013
- }), boolean()), method(object({
21080
+ }), boolean(), { auth: "admin" }), method(object({
21014
21081
  location: StorageLocationSchema,
21015
21082
  prefix: string().optional()
21016
- }), array(string()).readonly()), method(object({
21083
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
21017
21084
  location: StorageLocationSchema,
21018
21085
  relativePath: string()
21019
- }), _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" });
21086
+ }), _void(), {
21087
+ kind: "mutation",
21088
+ auth: "admin"
21089
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
21090
+ kind: "mutation",
21091
+ auth: "admin"
21092
+ }), method(WriteChunkInputSchema, _void(), {
21093
+ kind: "mutation",
21094
+ auth: "admin"
21095
+ }), method(FinalizeUploadInputSchema, _void(), {
21096
+ kind: "mutation",
21097
+ auth: "admin"
21098
+ }), method(AbortUploadInputSchema, _void(), {
21099
+ kind: "mutation",
21100
+ auth: "admin"
21101
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
21102
+ kind: "mutation",
21103
+ auth: "admin"
21104
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
21105
+ kind: "mutation",
21106
+ auth: "admin"
21107
+ });
21020
21108
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21021
21109
  var ProfileSettingsSchemaBridge = unknown().nullable();
21022
21110
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -21274,7 +21362,8 @@ method(object({
21274
21362
  access: "create"
21275
21363
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
21276
21364
  kind: "mutation",
21277
- access: "view"
21365
+ access: "view",
21366
+ auth: "admin"
21278
21367
  }), method(object({
21279
21368
  /** Required — the user the assertion belongs to (verified). */
21280
21369
  userId: string(),
@@ -21282,10 +21371,12 @@ method(object({
21282
21371
  response: record(string(), unknown())
21283
21372
  }), object({ verified: boolean() }), {
21284
21373
  kind: "mutation",
21285
- access: "view"
21374
+ access: "view",
21375
+ auth: "admin"
21286
21376
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
21287
21377
  kind: "mutation",
21288
- access: "view"
21378
+ access: "view",
21379
+ auth: "admin"
21289
21380
  }), method(object({
21290
21381
  /** AuthenticationResponseJSON from the browser. */
21291
21382
  response: record(string(), unknown()) }), object({
@@ -21293,7 +21384,8 @@ response: record(string(), unknown()) }), object({
21293
21384
  userId: string().nullable()
21294
21385
  }), {
21295
21386
  kind: "mutation",
21296
- access: "view"
21387
+ access: "view",
21388
+ auth: "admin"
21297
21389
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
21298
21390
  userId: string(),
21299
21391
  credentialId: string()
@@ -21465,7 +21557,19 @@ var VectorStatsResultSchema = object({
21465
21557
  /** False when the backend ranks approximately. */
21466
21558
  exact: boolean()
21467
21559
  });
21468
- 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);
21560
+ method(VectorDeclareIndexInputSchema, _void(), {
21561
+ kind: "mutation",
21562
+ auth: "admin"
21563
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
21564
+ kind: "mutation",
21565
+ auth: "admin"
21566
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
21567
+ kind: "mutation",
21568
+ auth: "admin"
21569
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
21570
+ kind: "mutation",
21571
+ auth: "admin"
21572
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
21469
21573
  var ClipSchema = object({
21470
21574
  /** Opaque, provider-namespaced id. The default provider encodes the time
21471
21575
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23918,7 +24022,27 @@ var MediaFileLiteSchema$1 = object({
23918
24022
  sizeBytes: number(),
23919
24023
  timestamp: number()
23920
24024
  });
23921
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
24025
+ method(object({
24026
+ /**
24027
+ * Inline {@link IdentitySchema.coverBase64} on every row.
24028
+ *
24029
+ * Default `false`, the same inversion `listRecentFaces` and
24030
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
24031
+ * why the burden belongs on the caller that WANTS the bytes). Measured
24032
+ * on the live hub the same day: four identities cost 40,979 B with the
24033
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
24034
+ * four times and the viewer holds at `staleTime: 30_000`.
24035
+ *
24036
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
24037
+ * the `event-media` plane serves that key `immutable` with an ETag.
24038
+ *
24039
+ * **This is an INPUT field, so it does not reach the addon until the
24040
+ * next train** — the hub router validates cap inputs against its own
24041
+ * compiled Zod and strips a key it does not know. Until then the
24042
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
24043
+ * is what ships, and the opt-in becomes reachable when the train lands.
24044
+ */
24045
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23922
24046
  kind: "mutation",
23923
24047
  auth: "admin"
23924
24048
  }), method(object({
@@ -26808,8 +26932,10 @@ var PlateInfoSchema = object({
26808
26932
  keyFrameMediaKey: string().optional(),
26809
26933
  base64: string().optional(),
26810
26934
  /**
26811
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26812
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26935
+ * Same crop as a data-plane URL, always present when the plate has a stored
26936
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26937
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26938
+ * left at its `true` default.
26813
26939
  */
26814
26940
  cropUrl: string().optional()
26815
26941
  });
@@ -26829,14 +26955,34 @@ var PlateClusterSchema = object({
26829
26955
  });
26830
26956
  method(object({
26831
26957
  deviceId: number().int().optional(),
26832
- limit: number().int().positive().optional()
26958
+ limit: number().int().positive().optional(),
26959
+ /**
26960
+ * Inline the base64 crop on every row. Default `true` — the existing
26961
+ * behaviour, kept so no caller breaks.
26962
+ *
26963
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26964
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26965
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26966
+ * metadata without them — and the browser then caches the images.
26967
+ *
26968
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26969
+ * plates were the one gallery list left without it.
26970
+ *
26971
+ * **This is an INPUT field, so it does not reach the addon until the
26972
+ * next train.** The hub router validates cap inputs against its own
26973
+ * compiled Zod and strips a key it does not know. Until the train
26974
+ * ships, sending `false` is harmless and keeps the crops inline.
26975
+ */
26976
+ includeCrops: boolean().optional()
26833
26977
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26834
26978
  deviceId: number().int(),
26835
26979
  trackId: string()
26836
26980
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26837
26981
  text: string().min(1),
26838
26982
  maxDistance: number().int().min(0).optional(),
26839
- limit: number().int().positive().optional()
26983
+ limit: number().int().positive().optional(),
26984
+ /** See `listPlates.includeCrops`. Default `true`. */
26985
+ includeCrops: boolean().optional()
26840
26986
  }), array(PlateInfoSchema).readonly()), method(object({
26841
26987
  maxDistance: number().int().min(0).optional(),
26842
26988
  minClusterSize: number().int().min(2).optional(),
@@ -26850,7 +26996,13 @@ method(object({
26850
26996
  }), method(object({ plateId: string() }), _void(), {
26851
26997
  kind: "mutation",
26852
26998
  auth: "admin"
26853
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26999
+ }), method(object({
27000
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27001
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27002
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
27003
+ * INPUT field: stripped by the hub router until the train ships, which
27004
+ * resolves to `false` and is exactly the intended default. */
27005
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26854
27006
  kind: "mutation",
26855
27007
  auth: "admin"
26856
27008
  }), method(object({
@@ -34111,6 +34263,12 @@ Object.freeze({
34111
34263
  addonId: null,
34112
34264
  access: "create"
34113
34265
  },
34266
+ "pipelineAnalytics.cancelRelocateMedia": {
34267
+ capName: "pipeline-analytics",
34268
+ capScope: "device",
34269
+ addonId: null,
34270
+ access: "create"
34271
+ },
34114
34272
  "pipelineAnalytics.cancelStorageMigrationMove": {
34115
34273
  capName: "pipeline-analytics",
34116
34274
  capScope: "device",
@@ -34285,6 +34443,12 @@ Object.freeze({
34285
34443
  addonId: null,
34286
34444
  access: "view"
34287
34445
  },
34446
+ "pipelineAnalytics.listRelocateMediaJobs": {
34447
+ capName: "pipeline-analytics",
34448
+ capScope: "device",
34449
+ addonId: null,
34450
+ access: "view"
34451
+ },
34288
34452
  "pipelineAnalytics.listRetrainAnnotations": {
34289
34453
  capName: "pipeline-analytics",
34290
34454
  capScope: "device",
@@ -34363,6 +34527,12 @@ Object.freeze({
34363
34527
  addonId: null,
34364
34528
  access: "create"
34365
34529
  },
34530
+ "pipelineAnalytics.relocateMedia": {
34531
+ capName: "pipeline-analytics",
34532
+ capScope: "device",
34533
+ addonId: null,
34534
+ access: "create"
34535
+ },
34366
34536
  "pipelineAnalytics.restageRetrainTrack": {
34367
34537
  capName: "pipeline-analytics",
34368
34538
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -7614,7 +7614,7 @@ function method(input, output, options) {
7614
7614
  input,
7615
7615
  output,
7616
7616
  kind: options?.kind ?? "query",
7617
- auth: options?.auth ?? "protected",
7617
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
7618
7618
  ...options?.access !== void 0 ? { access: options.access } : {},
7619
7619
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
7620
7620
  timeoutMs: options?.timeoutMs
@@ -7638,7 +7638,7 @@ function event(data) {
7638
7638
  }
7639
7639
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
7640
7640
  var VersionOutputSchema$1 = object({ version: string() });
7641
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
7641
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
7642
7642
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
7643
7643
  DeviceType["Camera"] = "camera";
7644
7644
  DeviceType["Hub"] = "hub";
@@ -7959,7 +7959,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7959
7959
  }({});
7960
7960
  var StaticDirOutputSchema = object({ staticDir: string() });
7961
7961
  var VersionOutputSchema = object({ version: string() });
7962
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7962
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7963
7963
  /**
7964
7964
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7965
7965
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -8585,24 +8585,6 @@ var RecordingRetentionSchema = object({
8585
8585
  maxSizeGb: number().min(0).optional()
8586
8586
  });
8587
8587
  /**
8588
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
8589
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
8590
- * previews at. Five graduated steps; absent on a config = `standard` (the
8591
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
8592
- *
8593
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
8594
- * Each window's index sidecar carries its own tile dims, so a camera whose
8595
- * preset changed over time renders every historical window at the dims it was
8596
- * written with.
8597
- */
8598
- var ScrubThumbnailPresetSchema = _enum([
8599
- "minimal",
8600
- "low",
8601
- "standard",
8602
- "high",
8603
- "max"
8604
- ]);
8605
- /**
8606
8588
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
8607
8589
  *
8608
8590
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -8610,7 +8592,11 @@ var ScrubThumbnailPresetSchema = _enum([
8610
8592
  * other field is a storage knob (profiles, segment length, retention, scrub).
8611
8593
  *
8612
8594
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
8613
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
8595
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
8596
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
8597
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
8598
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
8599
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
8614
8600
  * A stale caller must fail loudly — silently stripping its legacy intent would
8615
8601
  * persist a band-less config, i.e. silently stop recording the camera.
8616
8602
  */
@@ -8633,14 +8619,7 @@ var RecordingConfigSchema = object({
8633
8619
  * "off" is the absence of a covering band, never a band value.
8634
8620
  */
8635
8621
  bands: array(RecordingBandSchema).default([]),
8636
- retention: RecordingRetentionSchema.optional(),
8637
- /**
8638
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
8639
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
8640
- * windows only — existing sheets are immutable, and each window's index
8641
- * carries its own tile dims so mixed-preset history renders correctly.
8642
- */
8643
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
8622
+ retention: RecordingRetentionSchema.optional()
8644
8623
  }).strict();
8645
8624
  /**
8646
8625
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -8716,10 +8695,11 @@ var RelocateFootageInputSchema = object({
8716
8695
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8717
8696
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8718
8697
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8719
- var StorageMigrationMediaMoveInputSchema = object({
8698
+ var RelocateMediaInputSchema = object({
8720
8699
  toLocationId: string(),
8721
8700
  throttleMbps: number().min(1).max(1e3).optional()
8722
- }).extend({ leaseId: string().min(1) });
8701
+ });
8702
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8723
8703
  /** The independently selectable logical storage classes. `recordings`
8724
8704
  * encompasses the high and mid segment profiles; `recordingsLow` is low
8725
8705
  * segments; `eventMedia` is post-analysis blobs. */
@@ -9014,7 +8994,26 @@ var LabelDefinitionSchema = object({
9014
8994
  description: string().optional(),
9015
8995
  icon: string().optional()
9016
8996
  });
9017
- var ClassMapDefinitionSchema = object({
8997
+ /**
8998
+ * Wire schema for a per-model CATALOG classMap override
8999
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
9000
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
9001
+ * detection pipeline executor actually routes.
9002
+ *
9003
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
9004
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
9005
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
9006
+ * enum) — the two used to share the name `ClassMapDefinition`/
9007
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
9008
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
9009
+ * are not: it is two different concepts colliding on a name. Keep this type
9010
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
9011
+ * would either narrow every `ClassMapDefinition` consumer to the four
9012
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
9013
+ * schema exists for (see the "rejects a classMap whose target is not a
9014
+ * detection macro" test in `model-catalog-schema.test.ts`).
9015
+ */
9016
+ var DetectionCatalogClassMapSchema = object({
9018
9017
  mapping: record(string(), _enum([
9019
9018
  "person",
9020
9019
  "vehicle",
@@ -9219,7 +9218,7 @@ var ModelCatalogEntrySchema = object({
9219
9218
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
9220
9219
  * labels already ARE the CamStack macros (Scrypted identity map).
9221
9220
  */
9222
- classMap: ClassMapDefinitionSchema.optional()
9221
+ classMap: DetectionCatalogClassMapSchema.optional()
9223
9222
  });
9224
9223
  var ConvertTargetSchema = discriminatedUnion("format", [object({
9225
9224
  format: literal("openvino"),
@@ -9249,7 +9248,7 @@ var ModelConvertMetadataSchema = object({
9249
9248
  "segmentation"
9250
9249
  ]),
9251
9250
  faceAlignment: boolean().optional(),
9252
- classMap: ClassMapDefinitionSchema.optional()
9251
+ classMap: DetectionCatalogClassMapSchema.optional()
9253
9252
  });
9254
9253
  var ConvertResultSchema = object({
9255
9254
  entry: ModelCatalogEntrySchema,
@@ -10112,7 +10111,7 @@ var AddonPageDeclarationSchema = object({
10112
10111
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
10113
10112
  sectionLabel: string().optional()
10114
10113
  });
10115
- method(_void(), array(AddonPageDeclarationSchema).readonly());
10114
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
10116
10115
  var AddonHttpRouteSchema = object({
10117
10116
  method: _enum([
10118
10117
  "GET",
@@ -10347,7 +10346,7 @@ var WidgetMetadataSchema = object({
10347
10346
  defaultColumns: number().int().min(1).max(12).default(6),
10348
10347
  defaultRows: number().int().min(1).max(12).default(1)
10349
10348
  });
10350
- method(_void(), array(WidgetMetadataSchema).readonly());
10349
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
10351
10350
  /**
10352
10351
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
10353
10352
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11971,7 +11970,7 @@ var CustomModelDescriptorSchema = object({
11971
11970
  stepId: string(),
11972
11971
  entry: ModelCatalogEntrySchema
11973
11972
  });
11974
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11973
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11975
11974
  /**
11976
11975
  * Query filter for settings-store collections.
11977
11976
  */
@@ -12058,7 +12057,8 @@ method(object({
12058
12057
  }), _void(), { kind: "mutation" }), method(object({
12059
12058
  namespace: string().optional(),
12060
12059
  collection: string(),
12061
- filter: QueryFilterSchema.optional()
12060
+ filter: QueryFilterSchema.optional(),
12061
+ columns: array(string()).readonly().optional()
12062
12062
  }), array(SettingsRecordSchema).readonly()), method(object({
12063
12063
  namespace: string().optional(),
12064
12064
  collection: string(),
@@ -12121,46 +12121,87 @@ var EngineInfoSchema = object({
12121
12121
  kind: _enum(["relational", "vector"]),
12122
12122
  displayName: string()
12123
12123
  });
12124
- method(_void(), EngineInfoSchema), method(object({
12124
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
12125
12125
  namespace: string().optional(),
12126
12126
  collection: string(),
12127
12127
  key: string()
12128
- }), unknown()), method(object({
12128
+ }), unknown(), { auth: "admin" }), method(object({
12129
12129
  namespace: string().optional(),
12130
12130
  collection: string(),
12131
12131
  key: string(),
12132
12132
  value: unknown()
12133
- }), _void(), { kind: "mutation" }), method(object({
12133
+ }), _void(), {
12134
+ kind: "mutation",
12135
+ auth: "admin"
12136
+ }), method(object({
12134
12137
  namespace: string().optional(),
12135
12138
  collection: string(),
12136
- filter: QueryFilterSchema.optional()
12137
- }), array(SettingsRecordSchema).readonly()), method(object({
12139
+ filter: QueryFilterSchema.optional(),
12140
+ /**
12141
+ * SQL-level column projection — MUST mirror `settings-store.query`.
12142
+ *
12143
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
12144
+ * was wrong — corrected 2026-08-26 after the hop map
12145
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
12146
+ * There is **no Zod parse at all** between the door and the engine: the
12147
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
12148
+ * field declared here reaches `SqliteSettingsBackend` either way.
12149
+ *
12150
+ * What actually lost `columns` was the THIRD declaration of this shape:
12151
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
12152
+ * interface the engine destructures from. The field existed on both
12153
+ * schemas and the engine still never read it, because nothing checks a
12154
+ * registered provider against `InferProvider<cap>` —
12155
+ * `ProviderRegistration.provider` is typed `object`.
12156
+ *
12157
+ * It is declared here anyway, and must stay in step with
12158
+ * `settings-store.query`: a caller reading only the cap definitions has
12159
+ * to be able to see that this call carries a projection.
12160
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
12161
+ */
12162
+ columns: array(string()).readonly().optional()
12163
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
12138
12164
  namespace: string().optional(),
12139
12165
  collection: string(),
12140
12166
  record: SettingsRecordSchema
12141
- }), _void(), { kind: "mutation" }), method(object({
12167
+ }), _void(), {
12168
+ kind: "mutation",
12169
+ auth: "admin"
12170
+ }), method(object({
12142
12171
  namespace: string().optional(),
12143
12172
  collection: string(),
12144
12173
  id: string(),
12145
12174
  data: record(string(), unknown())
12146
- }), _void(), { kind: "mutation" }), method(object({
12175
+ }), _void(), {
12176
+ kind: "mutation",
12177
+ auth: "admin"
12178
+ }), method(object({
12147
12179
  namespace: string().optional(),
12148
12180
  collection: string(),
12149
12181
  key: string()
12150
- }), _void(), { kind: "mutation" }), method(object({
12182
+ }), _void(), {
12183
+ kind: "mutation",
12184
+ auth: "admin"
12185
+ }), method(object({
12151
12186
  namespace: string().optional(),
12152
12187
  collection: string(),
12153
12188
  filter: MutationFilterSchema
12154
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
12189
+ }), object({ deleted: number().int() }), {
12190
+ kind: "mutation",
12191
+ auth: "admin"
12192
+ }), method(object({
12155
12193
  namespace: string().optional(),
12156
12194
  collection: string(),
12157
12195
  filter: MutationFilterSchema,
12158
12196
  data: record(string(), unknown())
12159
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
12197
+ }), object({ updated: number().int() }), {
12198
+ kind: "mutation",
12199
+ auth: "admin"
12200
+ }), method(object({
12160
12201
  namespace: string().optional(),
12161
12202
  collection: string(),
12162
12203
  filter: QueryFilterSchema.optional()
12163
- }), number()), method(object({
12204
+ }), number(), { auth: "admin" }), method(object({
12164
12205
  namespace: string().optional(),
12165
12206
  collection: string(),
12166
12207
  field: string(),
@@ -12170,15 +12211,18 @@ method(_void(), EngineInfoSchema), method(object({
12170
12211
  }), array(object({
12171
12212
  bucket: number().int(),
12172
12213
  count: number().int()
12173
- })).readonly()), method(object({
12214
+ })).readonly(), { auth: "admin" }), method(object({
12174
12215
  namespace: string().optional(),
12175
12216
  collection: string()
12176
- }), boolean()), method(object({
12217
+ }), boolean(), { auth: "admin" }), method(object({
12177
12218
  namespace: string().optional(),
12178
12219
  collection: string(),
12179
12220
  columns: array(CollectionColumnSchema).readonly(),
12180
12221
  indexes: array(CollectionIndexSchema).readonly().optional()
12181
- }), _void(), { kind: "mutation" });
12222
+ }), _void(), {
12223
+ kind: "mutation",
12224
+ auth: "admin"
12225
+ });
12182
12226
  /**
12183
12227
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
12184
12228
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -13468,7 +13512,7 @@ method(object({
13468
13512
  crop: _instanceof(Uint8Array),
13469
13513
  width: number(),
13470
13514
  height: number()
13471
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
13515
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
13472
13516
  /**
13473
13517
  * filesystem-browse — per-node capability for browsing the node's local
13474
13518
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13761,19 +13805,22 @@ method(LlmGenerateBaseInputSchema.extend({
13761
13805
  runtime: ManagedRuntimeConfigSchema,
13762
13806
  /** The managed profile's timeout, threaded by the hub provider. */
13763
13807
  timeoutMs: number().int().positive().optional()
13764
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13808
+ }), LlmGenerateResultSchema, {
13809
+ kind: "mutation",
13810
+ auth: "admin"
13811
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13765
13812
  kind: "mutation",
13766
13813
  auth: "admin"
13767
13814
  }), method(object({}), _void(), {
13768
13815
  kind: "mutation",
13769
13816
  auth: "admin"
13770
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13817
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13771
13818
  kind: "mutation",
13772
13819
  auth: "admin"
13773
13820
  }), method(object({ file: string() }), _void(), {
13774
13821
  kind: "mutation",
13775
13822
  auth: "admin"
13776
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13823
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13777
13824
  /**
13778
13825
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13779
13826
  * methods concat-fan across providers; single-row methods route to ONE
@@ -17284,7 +17331,7 @@ var OauthIntegrationDescriptorSchema = object({
17284
17331
  */
17285
17332
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
17286
17333
  });
17287
- method(_void(), OauthIntegrationDescriptorSchema);
17334
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
17288
17335
  /**
17289
17336
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
17290
17337
  * per-frame detections emitted by the pipeline runner into tracked
@@ -18479,6 +18526,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18479
18526
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18480
18527
  kind: "mutation",
18481
18528
  auth: "admin"
18529
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18530
+ kind: "mutation",
18531
+ auth: "admin"
18532
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
18533
+ kind: "query",
18534
+ auth: "admin"
18535
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
18536
+ kind: "mutation",
18537
+ auth: "admin"
18482
18538
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
18483
18539
  kind: "query",
18484
18540
  auth: "admin"
@@ -18633,6 +18689,11 @@ object({
18633
18689
  "jpeg"
18634
18690
  ])
18635
18691
  });
18692
+ /**
18693
+ * Process-local frame identity. It is serializable so it can ride an in-process
18694
+ * capability call, but `registryId` deliberately prevents resolution in any
18695
+ * other process or execution group.
18696
+ */
18636
18697
  var FrameRefSchema = object({
18637
18698
  registryId: string().min(1),
18638
18699
  id: string().min(1),
@@ -20838,7 +20899,7 @@ method(object({
20838
20899
  * linking rather than produce an eternal token.
20839
20900
  */
20840
20901
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20841
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20902
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20842
20903
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20843
20904
  providerId: string().min(1),
20844
20905
  displayName: string().min(1),
@@ -20933,10 +20994,13 @@ var EvictResultSchema = object({
20933
20994
  /** True when the provider has nothing left it is willing to drop on this location. */
20934
20995
  exhausted: boolean()
20935
20996
  });
20936
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20997
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20937
20998
  locationId: string(),
20938
20999
  targetBytes: number().int().positive()
20939
- }), EvictResultSchema, { kind: "mutation" });
21000
+ }), EvictResultSchema, {
21001
+ kind: "mutation",
21002
+ auth: "admin"
21003
+ });
20940
21004
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20941
21005
  kind: "mutation",
20942
21006
  auth: "admin"
@@ -20996,26 +21060,50 @@ var ReadChunkInputSchema = object({
20996
21060
  length: number()
20997
21061
  });
20998
21062
  var EndDownloadInputSchema = object({ downloadId: string() });
20999
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21063
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
21000
21064
  location: StorageLocationSchema,
21001
21065
  relativePath: string()
21002
- }), string()), method(object({
21066
+ }), string(), { auth: "admin" }), method(object({
21003
21067
  location: StorageLocationSchema,
21004
21068
  relativePath: string(),
21005
21069
  data: _instanceof(Uint8Array)
21006
- }), _void(), { kind: "mutation" }), method(object({
21070
+ }), _void(), {
21071
+ kind: "mutation",
21072
+ auth: "admin"
21073
+ }), method(object({
21007
21074
  location: StorageLocationSchema,
21008
21075
  relativePath: string()
21009
- }), _instanceof(Uint8Array)), method(object({
21076
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
21010
21077
  location: StorageLocationSchema,
21011
21078
  relativePath: string()
21012
- }), boolean()), method(object({
21079
+ }), boolean(), { auth: "admin" }), method(object({
21013
21080
  location: StorageLocationSchema,
21014
21081
  prefix: string().optional()
21015
- }), array(string()).readonly()), method(object({
21082
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
21016
21083
  location: StorageLocationSchema,
21017
21084
  relativePath: string()
21018
- }), _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" });
21085
+ }), _void(), {
21086
+ kind: "mutation",
21087
+ auth: "admin"
21088
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
21089
+ kind: "mutation",
21090
+ auth: "admin"
21091
+ }), method(WriteChunkInputSchema, _void(), {
21092
+ kind: "mutation",
21093
+ auth: "admin"
21094
+ }), method(FinalizeUploadInputSchema, _void(), {
21095
+ kind: "mutation",
21096
+ auth: "admin"
21097
+ }), method(AbortUploadInputSchema, _void(), {
21098
+ kind: "mutation",
21099
+ auth: "admin"
21100
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
21101
+ kind: "mutation",
21102
+ auth: "admin"
21103
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
21104
+ kind: "mutation",
21105
+ auth: "admin"
21106
+ });
21019
21107
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21020
21108
  var ProfileSettingsSchemaBridge = unknown().nullable();
21021
21109
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -21273,7 +21361,8 @@ method(object({
21273
21361
  access: "create"
21274
21362
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
21275
21363
  kind: "mutation",
21276
- access: "view"
21364
+ access: "view",
21365
+ auth: "admin"
21277
21366
  }), method(object({
21278
21367
  /** Required — the user the assertion belongs to (verified). */
21279
21368
  userId: string(),
@@ -21281,10 +21370,12 @@ method(object({
21281
21370
  response: record(string(), unknown())
21282
21371
  }), object({ verified: boolean() }), {
21283
21372
  kind: "mutation",
21284
- access: "view"
21373
+ access: "view",
21374
+ auth: "admin"
21285
21375
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
21286
21376
  kind: "mutation",
21287
- access: "view"
21377
+ access: "view",
21378
+ auth: "admin"
21288
21379
  }), method(object({
21289
21380
  /** AuthenticationResponseJSON from the browser. */
21290
21381
  response: record(string(), unknown()) }), object({
@@ -21292,7 +21383,8 @@ response: record(string(), unknown()) }), object({
21292
21383
  userId: string().nullable()
21293
21384
  }), {
21294
21385
  kind: "mutation",
21295
- access: "view"
21386
+ access: "view",
21387
+ auth: "admin"
21296
21388
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
21297
21389
  userId: string(),
21298
21390
  credentialId: string()
@@ -21464,7 +21556,19 @@ var VectorStatsResultSchema = object({
21464
21556
  /** False when the backend ranks approximately. */
21465
21557
  exact: boolean()
21466
21558
  });
21467
- 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);
21559
+ method(VectorDeclareIndexInputSchema, _void(), {
21560
+ kind: "mutation",
21561
+ auth: "admin"
21562
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
21563
+ kind: "mutation",
21564
+ auth: "admin"
21565
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
21566
+ kind: "mutation",
21567
+ auth: "admin"
21568
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
21569
+ kind: "mutation",
21570
+ auth: "admin"
21571
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
21468
21572
  var ClipSchema = object({
21469
21573
  /** Opaque, provider-namespaced id. The default provider encodes the time
21470
21574
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23917,7 +24021,27 @@ var MediaFileLiteSchema$1 = object({
23917
24021
  sizeBytes: number(),
23918
24022
  timestamp: number()
23919
24023
  });
23920
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
24024
+ method(object({
24025
+ /**
24026
+ * Inline {@link IdentitySchema.coverBase64} on every row.
24027
+ *
24028
+ * Default `false`, the same inversion `listRecentFaces` and
24029
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
24030
+ * why the burden belongs on the caller that WANTS the bytes). Measured
24031
+ * on the live hub the same day: four identities cost 40,979 B with the
24032
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
24033
+ * four times and the viewer holds at `staleTime: 30_000`.
24034
+ *
24035
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
24036
+ * the `event-media` plane serves that key `immutable` with an ETag.
24037
+ *
24038
+ * **This is an INPUT field, so it does not reach the addon until the
24039
+ * next train** — the hub router validates cap inputs against its own
24040
+ * compiled Zod and strips a key it does not know. Until then the
24041
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
24042
+ * is what ships, and the opt-in becomes reachable when the train lands.
24043
+ */
24044
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23921
24045
  kind: "mutation",
23922
24046
  auth: "admin"
23923
24047
  }), method(object({
@@ -26807,8 +26931,10 @@ var PlateInfoSchema = object({
26807
26931
  keyFrameMediaKey: string().optional(),
26808
26932
  base64: string().optional(),
26809
26933
  /**
26810
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26811
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26934
+ * Same crop as a data-plane URL, always present when the plate has a stored
26935
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26936
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26937
+ * left at its `true` default.
26812
26938
  */
26813
26939
  cropUrl: string().optional()
26814
26940
  });
@@ -26828,14 +26954,34 @@ var PlateClusterSchema = object({
26828
26954
  });
26829
26955
  method(object({
26830
26956
  deviceId: number().int().optional(),
26831
- limit: number().int().positive().optional()
26957
+ limit: number().int().positive().optional(),
26958
+ /**
26959
+ * Inline the base64 crop on every row. Default `true` — the existing
26960
+ * behaviour, kept so no caller breaks.
26961
+ *
26962
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26963
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26964
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26965
+ * metadata without them — and the browser then caches the images.
26966
+ *
26967
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26968
+ * plates were the one gallery list left without it.
26969
+ *
26970
+ * **This is an INPUT field, so it does not reach the addon until the
26971
+ * next train.** The hub router validates cap inputs against its own
26972
+ * compiled Zod and strips a key it does not know. Until the train
26973
+ * ships, sending `false` is harmless and keeps the crops inline.
26974
+ */
26975
+ includeCrops: boolean().optional()
26832
26976
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26833
26977
  deviceId: number().int(),
26834
26978
  trackId: string()
26835
26979
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26836
26980
  text: string().min(1),
26837
26981
  maxDistance: number().int().min(0).optional(),
26838
- limit: number().int().positive().optional()
26982
+ limit: number().int().positive().optional(),
26983
+ /** See `listPlates.includeCrops`. Default `true`. */
26984
+ includeCrops: boolean().optional()
26839
26985
  }), array(PlateInfoSchema).readonly()), method(object({
26840
26986
  maxDistance: number().int().min(0).optional(),
26841
26987
  minClusterSize: number().int().min(2).optional(),
@@ -26849,7 +26995,13 @@ method(object({
26849
26995
  }), method(object({ plateId: string() }), _void(), {
26850
26996
  kind: "mutation",
26851
26997
  auth: "admin"
26852
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26998
+ }), method(object({
26999
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
27000
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
27001
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
27002
+ * INPUT field: stripped by the hub router until the train ships, which
27003
+ * resolves to `false` and is exactly the intended default. */
27004
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26853
27005
  kind: "mutation",
26854
27006
  auth: "admin"
26855
27007
  }), method(object({
@@ -34110,6 +34262,12 @@ Object.freeze({
34110
34262
  addonId: null,
34111
34263
  access: "create"
34112
34264
  },
34265
+ "pipelineAnalytics.cancelRelocateMedia": {
34266
+ capName: "pipeline-analytics",
34267
+ capScope: "device",
34268
+ addonId: null,
34269
+ access: "create"
34270
+ },
34113
34271
  "pipelineAnalytics.cancelStorageMigrationMove": {
34114
34272
  capName: "pipeline-analytics",
34115
34273
  capScope: "device",
@@ -34284,6 +34442,12 @@ Object.freeze({
34284
34442
  addonId: null,
34285
34443
  access: "view"
34286
34444
  },
34445
+ "pipelineAnalytics.listRelocateMediaJobs": {
34446
+ capName: "pipeline-analytics",
34447
+ capScope: "device",
34448
+ addonId: null,
34449
+ access: "view"
34450
+ },
34287
34451
  "pipelineAnalytics.listRetrainAnnotations": {
34288
34452
  capName: "pipeline-analytics",
34289
34453
  capScope: "device",
@@ -34362,6 +34526,12 @@ Object.freeze({
34362
34526
  addonId: null,
34363
34527
  access: "create"
34364
34528
  },
34529
+ "pipelineAnalytics.relocateMedia": {
34530
+ capName: "pipeline-analytics",
34531
+ capScope: "device",
34532
+ addonId: null,
34533
+ access: "create"
34534
+ },
34365
34535
  "pipelineAnalytics.restageRetrainTrack": {
34366
34536
  capName: "pipeline-analytics",
34367
34537
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.27",
3
+ "version": "0.2.28",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",