@camstack/addon-provider-reolink 1.2.50 → 1.2.51

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
@@ -6657,7 +6657,7 @@ function method(input, output, options) {
6657
6657
  input,
6658
6658
  output,
6659
6659
  kind: options?.kind ?? "query",
6660
- auth: options?.auth ?? "protected",
6660
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6661
6661
  ...options?.access !== void 0 ? { access: options.access } : {},
6662
6662
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6663
6663
  timeoutMs: options?.timeoutMs
@@ -6681,7 +6681,7 @@ function event(data) {
6681
6681
  }
6682
6682
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6683
6683
  var VersionOutputSchema$1 = object({ version: string() });
6684
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6684
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6685
6685
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6686
6686
  DeviceType["Camera"] = "camera";
6687
6687
  DeviceType["Hub"] = "hub";
@@ -7002,7 +7002,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7002
7002
  }({});
7003
7003
  var StaticDirOutputSchema = object({ staticDir: string() });
7004
7004
  var VersionOutputSchema = object({ version: string() });
7005
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7005
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7006
7006
  /**
7007
7007
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7008
7008
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7640,24 +7640,6 @@ var RecordingRetentionSchema = object({
7640
7640
  maxSizeGb: number().min(0).optional()
7641
7641
  });
7642
7642
  /**
7643
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7644
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7645
- * previews at. Five graduated steps; absent on a config = `standard` (the
7646
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7647
- *
7648
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7649
- * Each window's index sidecar carries its own tile dims, so a camera whose
7650
- * preset changed over time renders every historical window at the dims it was
7651
- * written with.
7652
- */
7653
- var ScrubThumbnailPresetSchema = _enum([
7654
- "minimal",
7655
- "low",
7656
- "standard",
7657
- "high",
7658
- "max"
7659
- ]);
7660
- /**
7661
7643
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7662
7644
  *
7663
7645
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7665,7 +7647,11 @@ var ScrubThumbnailPresetSchema = _enum([
7665
7647
  * other field is a storage knob (profiles, segment length, retention, scrub).
7666
7648
  *
7667
7649
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7668
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7650
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7651
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7652
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7653
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7654
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7669
7655
  * A stale caller must fail loudly — silently stripping its legacy intent would
7670
7656
  * persist a band-less config, i.e. silently stop recording the camera.
7671
7657
  */
@@ -7688,14 +7674,7 @@ var RecordingConfigSchema = object({
7688
7674
  * "off" is the absence of a covering band, never a band value.
7689
7675
  */
7690
7676
  bands: array(RecordingBandSchema).default([]),
7691
- retention: RecordingRetentionSchema.optional(),
7692
- /**
7693
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7694
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7695
- * windows only — existing sheets are immutable, and each window's index
7696
- * carries its own tile dims so mixed-preset history renders correctly.
7697
- */
7698
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7677
+ retention: RecordingRetentionSchema.optional()
7699
7678
  }).strict();
7700
7679
  /**
7701
7680
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7771,10 +7750,11 @@ var RelocateFootageInputSchema = object({
7771
7750
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7772
7751
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7773
7752
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7774
- var StorageMigrationMediaMoveInputSchema = object({
7753
+ var RelocateMediaInputSchema = object({
7775
7754
  toLocationId: string(),
7776
7755
  throttleMbps: number().min(1).max(1e3).optional()
7777
- }).extend({ leaseId: string().min(1) });
7756
+ });
7757
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7778
7758
  /** The independently selectable logical storage classes. `recordings`
7779
7759
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7780
7760
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8244,7 +8224,26 @@ var LabelDefinitionSchema = object({
8244
8224
  description: string().optional(),
8245
8225
  icon: string().optional()
8246
8226
  });
8247
- var ClassMapDefinitionSchema = object({
8227
+ /**
8228
+ * Wire schema for a per-model CATALOG classMap override
8229
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8230
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8231
+ * detection pipeline executor actually routes.
8232
+ *
8233
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8234
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8235
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8236
+ * enum) — the two used to share the name `ClassMapDefinition`/
8237
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8238
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8239
+ * are not: it is two different concepts colliding on a name. Keep this type
8240
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8241
+ * would either narrow every `ClassMapDefinition` consumer to the four
8242
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8243
+ * schema exists for (see the "rejects a classMap whose target is not a
8244
+ * detection macro" test in `model-catalog-schema.test.ts`).
8245
+ */
8246
+ var DetectionCatalogClassMapSchema = object({
8248
8247
  mapping: record(string(), _enum([
8249
8248
  "person",
8250
8249
  "vehicle",
@@ -8449,7 +8448,7 @@ var ModelCatalogEntrySchema = object({
8449
8448
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8450
8449
  * labels already ARE the CamStack macros (Scrypted identity map).
8451
8450
  */
8452
- classMap: ClassMapDefinitionSchema.optional()
8451
+ classMap: DetectionCatalogClassMapSchema.optional()
8453
8452
  });
8454
8453
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8455
8454
  format: literal("openvino"),
@@ -8479,7 +8478,7 @@ var ModelConvertMetadataSchema = object({
8479
8478
  "segmentation"
8480
8479
  ]),
8481
8480
  faceAlignment: boolean().optional(),
8482
- classMap: ClassMapDefinitionSchema.optional()
8481
+ classMap: DetectionCatalogClassMapSchema.optional()
8483
8482
  });
8484
8483
  var ConvertResultSchema = object({
8485
8484
  entry: ModelCatalogEntrySchema,
@@ -9342,7 +9341,7 @@ var AddonPageDeclarationSchema = object({
9342
9341
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9343
9342
  sectionLabel: string().optional()
9344
9343
  });
9345
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9344
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9346
9345
  var AddonHttpRouteSchema = object({
9347
9346
  method: _enum([
9348
9347
  "GET",
@@ -9577,7 +9576,7 @@ var WidgetMetadataSchema = object({
9577
9576
  defaultColumns: number().int().min(1).max(12).default(6),
9578
9577
  defaultRows: number().int().min(1).max(12).default(1)
9579
9578
  });
9580
- method(_void(), array(WidgetMetadataSchema).readonly());
9579
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9581
9580
  /**
9582
9581
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9583
9582
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11213,7 +11212,7 @@ var CustomModelDescriptorSchema = object({
11213
11212
  stepId: string(),
11214
11213
  entry: ModelCatalogEntrySchema
11215
11214
  });
11216
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11215
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11217
11216
  /**
11218
11217
  * Query filter for settings-store collections.
11219
11218
  */
@@ -11300,7 +11299,8 @@ method(object({
11300
11299
  }), _void(), { kind: "mutation" }), method(object({
11301
11300
  namespace: string().optional(),
11302
11301
  collection: string(),
11303
- filter: QueryFilterSchema.optional()
11302
+ filter: QueryFilterSchema.optional(),
11303
+ columns: array(string()).readonly().optional()
11304
11304
  }), array(SettingsRecordSchema).readonly()), method(object({
11305
11305
  namespace: string().optional(),
11306
11306
  collection: string(),
@@ -11363,46 +11363,87 @@ var EngineInfoSchema = object({
11363
11363
  kind: _enum(["relational", "vector"]),
11364
11364
  displayName: string()
11365
11365
  });
11366
- method(_void(), EngineInfoSchema), method(object({
11366
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11367
11367
  namespace: string().optional(),
11368
11368
  collection: string(),
11369
11369
  key: string()
11370
- }), unknown()), method(object({
11370
+ }), unknown(), { auth: "admin" }), method(object({
11371
11371
  namespace: string().optional(),
11372
11372
  collection: string(),
11373
11373
  key: string(),
11374
11374
  value: unknown()
11375
- }), _void(), { kind: "mutation" }), method(object({
11375
+ }), _void(), {
11376
+ kind: "mutation",
11377
+ auth: "admin"
11378
+ }), method(object({
11376
11379
  namespace: string().optional(),
11377
11380
  collection: string(),
11378
- filter: QueryFilterSchema.optional()
11379
- }), array(SettingsRecordSchema).readonly()), method(object({
11381
+ filter: QueryFilterSchema.optional(),
11382
+ /**
11383
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11384
+ *
11385
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11386
+ * was wrong — corrected 2026-08-26 after the hop map
11387
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11388
+ * There is **no Zod parse at all** between the door and the engine: the
11389
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11390
+ * field declared here reaches `SqliteSettingsBackend` either way.
11391
+ *
11392
+ * What actually lost `columns` was the THIRD declaration of this shape:
11393
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11394
+ * interface the engine destructures from. The field existed on both
11395
+ * schemas and the engine still never read it, because nothing checks a
11396
+ * registered provider against `InferProvider<cap>` —
11397
+ * `ProviderRegistration.provider` is typed `object`.
11398
+ *
11399
+ * It is declared here anyway, and must stay in step with
11400
+ * `settings-store.query`: a caller reading only the cap definitions has
11401
+ * to be able to see that this call carries a projection.
11402
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11403
+ */
11404
+ columns: array(string()).readonly().optional()
11405
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11380
11406
  namespace: string().optional(),
11381
11407
  collection: string(),
11382
11408
  record: SettingsRecordSchema
11383
- }), _void(), { kind: "mutation" }), method(object({
11409
+ }), _void(), {
11410
+ kind: "mutation",
11411
+ auth: "admin"
11412
+ }), method(object({
11384
11413
  namespace: string().optional(),
11385
11414
  collection: string(),
11386
11415
  id: string(),
11387
11416
  data: record(string(), unknown())
11388
- }), _void(), { kind: "mutation" }), method(object({
11417
+ }), _void(), {
11418
+ kind: "mutation",
11419
+ auth: "admin"
11420
+ }), method(object({
11389
11421
  namespace: string().optional(),
11390
11422
  collection: string(),
11391
11423
  key: string()
11392
- }), _void(), { kind: "mutation" }), method(object({
11424
+ }), _void(), {
11425
+ kind: "mutation",
11426
+ auth: "admin"
11427
+ }), method(object({
11393
11428
  namespace: string().optional(),
11394
11429
  collection: string(),
11395
11430
  filter: MutationFilterSchema
11396
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11431
+ }), object({ deleted: number().int() }), {
11432
+ kind: "mutation",
11433
+ auth: "admin"
11434
+ }), method(object({
11397
11435
  namespace: string().optional(),
11398
11436
  collection: string(),
11399
11437
  filter: MutationFilterSchema,
11400
11438
  data: record(string(), unknown())
11401
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11439
+ }), object({ updated: number().int() }), {
11440
+ kind: "mutation",
11441
+ auth: "admin"
11442
+ }), method(object({
11402
11443
  namespace: string().optional(),
11403
11444
  collection: string(),
11404
11445
  filter: QueryFilterSchema.optional()
11405
- }), number()), method(object({
11446
+ }), number(), { auth: "admin" }), method(object({
11406
11447
  namespace: string().optional(),
11407
11448
  collection: string(),
11408
11449
  field: string(),
@@ -11412,15 +11453,18 @@ method(_void(), EngineInfoSchema), method(object({
11412
11453
  }), array(object({
11413
11454
  bucket: number().int(),
11414
11455
  count: number().int()
11415
- })).readonly()), method(object({
11456
+ })).readonly(), { auth: "admin" }), method(object({
11416
11457
  namespace: string().optional(),
11417
11458
  collection: string()
11418
- }), boolean()), method(object({
11459
+ }), boolean(), { auth: "admin" }), method(object({
11419
11460
  namespace: string().optional(),
11420
11461
  collection: string(),
11421
11462
  columns: array(CollectionColumnSchema).readonly(),
11422
11463
  indexes: array(CollectionIndexSchema).readonly().optional()
11423
- }), _void(), { kind: "mutation" });
11464
+ }), _void(), {
11465
+ kind: "mutation",
11466
+ auth: "admin"
11467
+ });
11424
11468
  /**
11425
11469
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11426
11470
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12710,7 +12754,7 @@ method(object({
12710
12754
  crop: _instanceof(Uint8Array),
12711
12755
  width: number(),
12712
12756
  height: number()
12713
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12757
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12714
12758
  /**
12715
12759
  * filesystem-browse — per-node capability for browsing the node's local
12716
12760
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13003,19 +13047,22 @@ method(LlmGenerateBaseInputSchema.extend({
13003
13047
  runtime: ManagedRuntimeConfigSchema,
13004
13048
  /** The managed profile's timeout, threaded by the hub provider. */
13005
13049
  timeoutMs: number().int().positive().optional()
13006
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13050
+ }), LlmGenerateResultSchema, {
13051
+ kind: "mutation",
13052
+ auth: "admin"
13053
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13007
13054
  kind: "mutation",
13008
13055
  auth: "admin"
13009
13056
  }), method(object({}), _void(), {
13010
13057
  kind: "mutation",
13011
13058
  auth: "admin"
13012
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13059
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13013
13060
  kind: "mutation",
13014
13061
  auth: "admin"
13015
13062
  }), method(object({ file: string() }), _void(), {
13016
13063
  kind: "mutation",
13017
13064
  auth: "admin"
13018
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13065
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13019
13066
  /**
13020
13067
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13021
13068
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16526,7 +16573,7 @@ var OauthIntegrationDescriptorSchema = object({
16526
16573
  */
16527
16574
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16528
16575
  });
16529
- method(_void(), OauthIntegrationDescriptorSchema);
16576
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16530
16577
  /**
16531
16578
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16532
16579
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17721,6 +17768,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17721
17768
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17722
17769
  kind: "mutation",
17723
17770
  auth: "admin"
17771
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17772
+ kind: "mutation",
17773
+ auth: "admin"
17774
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17775
+ kind: "query",
17776
+ auth: "admin"
17777
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17778
+ kind: "mutation",
17779
+ auth: "admin"
17724
17780
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17725
17781
  kind: "query",
17726
17782
  auth: "admin"
@@ -17875,6 +17931,11 @@ object({
17875
17931
  "jpeg"
17876
17932
  ])
17877
17933
  });
17934
+ /**
17935
+ * Process-local frame identity. It is serializable so it can ride an in-process
17936
+ * capability call, but `registryId` deliberately prevents resolution in any
17937
+ * other process or execution group.
17938
+ */
17878
17939
  var FrameRefSchema = object({
17879
17940
  registryId: string().min(1),
17880
17941
  id: string().min(1),
@@ -20184,7 +20245,7 @@ method(object({
20184
20245
  * linking rather than produce an eternal token.
20185
20246
  */
20186
20247
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20187
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20248
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20188
20249
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20189
20250
  providerId: string().min(1),
20190
20251
  displayName: string().min(1),
@@ -20279,10 +20340,13 @@ var EvictResultSchema = object({
20279
20340
  /** True when the provider has nothing left it is willing to drop on this location. */
20280
20341
  exhausted: boolean()
20281
20342
  });
20282
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20343
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20283
20344
  locationId: string(),
20284
20345
  targetBytes: number().int().positive()
20285
- }), EvictResultSchema, { kind: "mutation" });
20346
+ }), EvictResultSchema, {
20347
+ kind: "mutation",
20348
+ auth: "admin"
20349
+ });
20286
20350
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20287
20351
  kind: "mutation",
20288
20352
  auth: "admin"
@@ -20342,26 +20406,50 @@ var ReadChunkInputSchema = object({
20342
20406
  length: number()
20343
20407
  });
20344
20408
  var EndDownloadInputSchema = object({ downloadId: string() });
20345
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20409
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20346
20410
  location: StorageLocationSchema,
20347
20411
  relativePath: string()
20348
- }), string()), method(object({
20412
+ }), string(), { auth: "admin" }), method(object({
20349
20413
  location: StorageLocationSchema,
20350
20414
  relativePath: string(),
20351
20415
  data: _instanceof(Uint8Array)
20352
- }), _void(), { kind: "mutation" }), method(object({
20416
+ }), _void(), {
20417
+ kind: "mutation",
20418
+ auth: "admin"
20419
+ }), method(object({
20353
20420
  location: StorageLocationSchema,
20354
20421
  relativePath: string()
20355
- }), _instanceof(Uint8Array)), method(object({
20422
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20356
20423
  location: StorageLocationSchema,
20357
20424
  relativePath: string()
20358
- }), boolean()), method(object({
20425
+ }), boolean(), { auth: "admin" }), method(object({
20359
20426
  location: StorageLocationSchema,
20360
20427
  prefix: string().optional()
20361
- }), array(string()).readonly()), method(object({
20428
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20362
20429
  location: StorageLocationSchema,
20363
20430
  relativePath: string()
20364
- }), _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" });
20431
+ }), _void(), {
20432
+ kind: "mutation",
20433
+ auth: "admin"
20434
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20435
+ kind: "mutation",
20436
+ auth: "admin"
20437
+ }), method(WriteChunkInputSchema, _void(), {
20438
+ kind: "mutation",
20439
+ auth: "admin"
20440
+ }), method(FinalizeUploadInputSchema, _void(), {
20441
+ kind: "mutation",
20442
+ auth: "admin"
20443
+ }), method(AbortUploadInputSchema, _void(), {
20444
+ kind: "mutation",
20445
+ auth: "admin"
20446
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20447
+ kind: "mutation",
20448
+ auth: "admin"
20449
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20450
+ kind: "mutation",
20451
+ auth: "admin"
20452
+ });
20365
20453
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20366
20454
  var ProfileSettingsSchemaBridge = unknown().nullable();
20367
20455
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20619,7 +20707,8 @@ method(object({
20619
20707
  access: "create"
20620
20708
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20621
20709
  kind: "mutation",
20622
- access: "view"
20710
+ access: "view",
20711
+ auth: "admin"
20623
20712
  }), method(object({
20624
20713
  /** Required — the user the assertion belongs to (verified). */
20625
20714
  userId: string(),
@@ -20627,10 +20716,12 @@ method(object({
20627
20716
  response: record(string(), unknown())
20628
20717
  }), object({ verified: boolean() }), {
20629
20718
  kind: "mutation",
20630
- access: "view"
20719
+ access: "view",
20720
+ auth: "admin"
20631
20721
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20632
20722
  kind: "mutation",
20633
- access: "view"
20723
+ access: "view",
20724
+ auth: "admin"
20634
20725
  }), method(object({
20635
20726
  /** AuthenticationResponseJSON from the browser. */
20636
20727
  response: record(string(), unknown()) }), object({
@@ -20638,7 +20729,8 @@ response: record(string(), unknown()) }), object({
20638
20729
  userId: string().nullable()
20639
20730
  }), {
20640
20731
  kind: "mutation",
20641
- access: "view"
20732
+ access: "view",
20733
+ auth: "admin"
20642
20734
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20643
20735
  userId: string(),
20644
20736
  credentialId: string()
@@ -20810,7 +20902,19 @@ var VectorStatsResultSchema = object({
20810
20902
  /** False when the backend ranks approximately. */
20811
20903
  exact: boolean()
20812
20904
  });
20813
- 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);
20905
+ method(VectorDeclareIndexInputSchema, _void(), {
20906
+ kind: "mutation",
20907
+ auth: "admin"
20908
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20909
+ kind: "mutation",
20910
+ auth: "admin"
20911
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20912
+ kind: "mutation",
20913
+ auth: "admin"
20914
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20915
+ kind: "mutation",
20916
+ auth: "admin"
20917
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20814
20918
  var ClipSchema = object({
20815
20919
  /** Opaque, provider-namespaced id. The default provider encodes the time
20816
20920
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23263,7 +23367,27 @@ var MediaFileLiteSchema$1 = object({
23263
23367
  sizeBytes: number(),
23264
23368
  timestamp: number()
23265
23369
  });
23266
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23370
+ method(object({
23371
+ /**
23372
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23373
+ *
23374
+ * Default `false`, the same inversion `listRecentFaces` and
23375
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23376
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23377
+ * on the live hub the same day: four identities cost 40,979 B with the
23378
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23379
+ * four times and the viewer holds at `staleTime: 30_000`.
23380
+ *
23381
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23382
+ * the `event-media` plane serves that key `immutable` with an ETag.
23383
+ *
23384
+ * **This is an INPUT field, so it does not reach the addon until the
23385
+ * next train** — the hub router validates cap inputs against its own
23386
+ * compiled Zod and strips a key it does not know. Until then the
23387
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23388
+ * is what ships, and the opt-in becomes reachable when the train lands.
23389
+ */
23390
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23267
23391
  kind: "mutation",
23268
23392
  auth: "admin"
23269
23393
  }), method(object({
@@ -26153,8 +26277,10 @@ var PlateInfoSchema = object({
26153
26277
  keyFrameMediaKey: string().optional(),
26154
26278
  base64: string().optional(),
26155
26279
  /**
26156
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26157
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26280
+ * Same crop as a data-plane URL, always present when the plate has a stored
26281
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26282
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26283
+ * left at its `true` default.
26158
26284
  */
26159
26285
  cropUrl: string().optional()
26160
26286
  });
@@ -26174,14 +26300,34 @@ var PlateClusterSchema = object({
26174
26300
  });
26175
26301
  method(object({
26176
26302
  deviceId: number().int().optional(),
26177
- limit: number().int().positive().optional()
26303
+ limit: number().int().positive().optional(),
26304
+ /**
26305
+ * Inline the base64 crop on every row. Default `true` — the existing
26306
+ * behaviour, kept so no caller breaks.
26307
+ *
26308
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26309
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26310
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26311
+ * metadata without them — and the browser then caches the images.
26312
+ *
26313
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26314
+ * plates were the one gallery list left without it.
26315
+ *
26316
+ * **This is an INPUT field, so it does not reach the addon until the
26317
+ * next train.** The hub router validates cap inputs against its own
26318
+ * compiled Zod and strips a key it does not know. Until the train
26319
+ * ships, sending `false` is harmless and keeps the crops inline.
26320
+ */
26321
+ includeCrops: boolean().optional()
26178
26322
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26179
26323
  deviceId: number().int(),
26180
26324
  trackId: string()
26181
26325
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26182
26326
  text: string().min(1),
26183
26327
  maxDistance: number().int().min(0).optional(),
26184
- limit: number().int().positive().optional()
26328
+ limit: number().int().positive().optional(),
26329
+ /** See `listPlates.includeCrops`. Default `true`. */
26330
+ includeCrops: boolean().optional()
26185
26331
  }), array(PlateInfoSchema).readonly()), method(object({
26186
26332
  maxDistance: number().int().min(0).optional(),
26187
26333
  minClusterSize: number().int().min(2).optional(),
@@ -26195,7 +26341,13 @@ method(object({
26195
26341
  }), method(object({ plateId: string() }), _void(), {
26196
26342
  kind: "mutation",
26197
26343
  auth: "admin"
26198
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26344
+ }), method(object({
26345
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26346
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26347
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26348
+ * INPUT field: stripped by the hub router until the train ships, which
26349
+ * resolves to `false` and is exactly the intended default. */
26350
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26199
26351
  kind: "mutation",
26200
26352
  auth: "admin"
26201
26353
  }), method(object({
@@ -33908,6 +34060,12 @@ Object.freeze({
33908
34060
  addonId: null,
33909
34061
  access: "create"
33910
34062
  },
34063
+ "pipelineAnalytics.cancelRelocateMedia": {
34064
+ capName: "pipeline-analytics",
34065
+ capScope: "device",
34066
+ addonId: null,
34067
+ access: "create"
34068
+ },
33911
34069
  "pipelineAnalytics.cancelStorageMigrationMove": {
33912
34070
  capName: "pipeline-analytics",
33913
34071
  capScope: "device",
@@ -34082,6 +34240,12 @@ Object.freeze({
34082
34240
  addonId: null,
34083
34241
  access: "view"
34084
34242
  },
34243
+ "pipelineAnalytics.listRelocateMediaJobs": {
34244
+ capName: "pipeline-analytics",
34245
+ capScope: "device",
34246
+ addonId: null,
34247
+ access: "view"
34248
+ },
34085
34249
  "pipelineAnalytics.listRetrainAnnotations": {
34086
34250
  capName: "pipeline-analytics",
34087
34251
  capScope: "device",
@@ -34160,6 +34324,12 @@ Object.freeze({
34160
34324
  addonId: null,
34161
34325
  access: "create"
34162
34326
  },
34327
+ "pipelineAnalytics.relocateMedia": {
34328
+ capName: "pipeline-analytics",
34329
+ capScope: "device",
34330
+ addonId: null,
34331
+ access: "create"
34332
+ },
34163
34333
  "pipelineAnalytics.restageRetrainTrack": {
34164
34334
  capName: "pipeline-analytics",
34165
34335
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6652,7 +6652,7 @@ function method(input, output, options) {
6652
6652
  input,
6653
6653
  output,
6654
6654
  kind: options?.kind ?? "query",
6655
- auth: options?.auth ?? "protected",
6655
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6656
6656
  ...options?.access !== void 0 ? { access: options.access } : {},
6657
6657
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6658
6658
  timeoutMs: options?.timeoutMs
@@ -6676,7 +6676,7 @@ function event(data) {
6676
6676
  }
6677
6677
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6678
6678
  var VersionOutputSchema$1 = object({ version: string() });
6679
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6679
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6680
6680
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6681
6681
  DeviceType["Camera"] = "camera";
6682
6682
  DeviceType["Hub"] = "hub";
@@ -6997,7 +6997,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6997
6997
  }({});
6998
6998
  var StaticDirOutputSchema = object({ staticDir: string() });
6999
6999
  var VersionOutputSchema = object({ version: string() });
7000
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7000
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7001
7001
  /**
7002
7002
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7003
7003
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7635,24 +7635,6 @@ var RecordingRetentionSchema = object({
7635
7635
  maxSizeGb: number().min(0).optional()
7636
7636
  });
7637
7637
  /**
7638
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7639
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7640
- * previews at. Five graduated steps; absent on a config = `standard` (the
7641
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7642
- *
7643
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7644
- * Each window's index sidecar carries its own tile dims, so a camera whose
7645
- * preset changed over time renders every historical window at the dims it was
7646
- * written with.
7647
- */
7648
- var ScrubThumbnailPresetSchema = _enum([
7649
- "minimal",
7650
- "low",
7651
- "standard",
7652
- "high",
7653
- "max"
7654
- ]);
7655
- /**
7656
7638
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7657
7639
  *
7658
7640
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7660,7 +7642,11 @@ var ScrubThumbnailPresetSchema = _enum([
7660
7642
  * other field is a storage knob (profiles, segment length, retention, scrub).
7661
7643
  *
7662
7644
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7663
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7645
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7646
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7647
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7648
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7649
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7664
7650
  * A stale caller must fail loudly — silently stripping its legacy intent would
7665
7651
  * persist a band-less config, i.e. silently stop recording the camera.
7666
7652
  */
@@ -7683,14 +7669,7 @@ var RecordingConfigSchema = object({
7683
7669
  * "off" is the absence of a covering band, never a band value.
7684
7670
  */
7685
7671
  bands: array(RecordingBandSchema).default([]),
7686
- retention: RecordingRetentionSchema.optional(),
7687
- /**
7688
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7689
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7690
- * windows only — existing sheets are immutable, and each window's index
7691
- * carries its own tile dims so mixed-preset history renders correctly.
7692
- */
7693
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7672
+ retention: RecordingRetentionSchema.optional()
7694
7673
  }).strict();
7695
7674
  /**
7696
7675
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7766,10 +7745,11 @@ var RelocateFootageInputSchema = object({
7766
7745
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7767
7746
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7768
7747
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7769
- var StorageMigrationMediaMoveInputSchema = object({
7748
+ var RelocateMediaInputSchema = object({
7770
7749
  toLocationId: string(),
7771
7750
  throttleMbps: number().min(1).max(1e3).optional()
7772
- }).extend({ leaseId: string().min(1) });
7751
+ });
7752
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7773
7753
  /** The independently selectable logical storage classes. `recordings`
7774
7754
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7775
7755
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8239,7 +8219,26 @@ var LabelDefinitionSchema = object({
8239
8219
  description: string().optional(),
8240
8220
  icon: string().optional()
8241
8221
  });
8242
- var ClassMapDefinitionSchema = object({
8222
+ /**
8223
+ * Wire schema for a per-model CATALOG classMap override
8224
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8225
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8226
+ * detection pipeline executor actually routes.
8227
+ *
8228
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8229
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8230
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8231
+ * enum) — the two used to share the name `ClassMapDefinition`/
8232
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8233
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8234
+ * are not: it is two different concepts colliding on a name. Keep this type
8235
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8236
+ * would either narrow every `ClassMapDefinition` consumer to the four
8237
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8238
+ * schema exists for (see the "rejects a classMap whose target is not a
8239
+ * detection macro" test in `model-catalog-schema.test.ts`).
8240
+ */
8241
+ var DetectionCatalogClassMapSchema = object({
8243
8242
  mapping: record(string(), _enum([
8244
8243
  "person",
8245
8244
  "vehicle",
@@ -8444,7 +8443,7 @@ var ModelCatalogEntrySchema = object({
8444
8443
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8445
8444
  * labels already ARE the CamStack macros (Scrypted identity map).
8446
8445
  */
8447
- classMap: ClassMapDefinitionSchema.optional()
8446
+ classMap: DetectionCatalogClassMapSchema.optional()
8448
8447
  });
8449
8448
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8450
8449
  format: literal("openvino"),
@@ -8474,7 +8473,7 @@ var ModelConvertMetadataSchema = object({
8474
8473
  "segmentation"
8475
8474
  ]),
8476
8475
  faceAlignment: boolean().optional(),
8477
- classMap: ClassMapDefinitionSchema.optional()
8476
+ classMap: DetectionCatalogClassMapSchema.optional()
8478
8477
  });
8479
8478
  var ConvertResultSchema = object({
8480
8479
  entry: ModelCatalogEntrySchema,
@@ -9337,7 +9336,7 @@ var AddonPageDeclarationSchema = object({
9337
9336
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9338
9337
  sectionLabel: string().optional()
9339
9338
  });
9340
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9339
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9341
9340
  var AddonHttpRouteSchema = object({
9342
9341
  method: _enum([
9343
9342
  "GET",
@@ -9572,7 +9571,7 @@ var WidgetMetadataSchema = object({
9572
9571
  defaultColumns: number().int().min(1).max(12).default(6),
9573
9572
  defaultRows: number().int().min(1).max(12).default(1)
9574
9573
  });
9575
- method(_void(), array(WidgetMetadataSchema).readonly());
9574
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9576
9575
  /**
9577
9576
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9578
9577
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11208,7 +11207,7 @@ var CustomModelDescriptorSchema = object({
11208
11207
  stepId: string(),
11209
11208
  entry: ModelCatalogEntrySchema
11210
11209
  });
11211
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11210
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11212
11211
  /**
11213
11212
  * Query filter for settings-store collections.
11214
11213
  */
@@ -11295,7 +11294,8 @@ method(object({
11295
11294
  }), _void(), { kind: "mutation" }), method(object({
11296
11295
  namespace: string().optional(),
11297
11296
  collection: string(),
11298
- filter: QueryFilterSchema.optional()
11297
+ filter: QueryFilterSchema.optional(),
11298
+ columns: array(string()).readonly().optional()
11299
11299
  }), array(SettingsRecordSchema).readonly()), method(object({
11300
11300
  namespace: string().optional(),
11301
11301
  collection: string(),
@@ -11358,46 +11358,87 @@ var EngineInfoSchema = object({
11358
11358
  kind: _enum(["relational", "vector"]),
11359
11359
  displayName: string()
11360
11360
  });
11361
- method(_void(), EngineInfoSchema), method(object({
11361
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11362
11362
  namespace: string().optional(),
11363
11363
  collection: string(),
11364
11364
  key: string()
11365
- }), unknown()), method(object({
11365
+ }), unknown(), { auth: "admin" }), method(object({
11366
11366
  namespace: string().optional(),
11367
11367
  collection: string(),
11368
11368
  key: string(),
11369
11369
  value: unknown()
11370
- }), _void(), { kind: "mutation" }), method(object({
11370
+ }), _void(), {
11371
+ kind: "mutation",
11372
+ auth: "admin"
11373
+ }), method(object({
11371
11374
  namespace: string().optional(),
11372
11375
  collection: string(),
11373
- filter: QueryFilterSchema.optional()
11374
- }), array(SettingsRecordSchema).readonly()), method(object({
11376
+ filter: QueryFilterSchema.optional(),
11377
+ /**
11378
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11379
+ *
11380
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11381
+ * was wrong — corrected 2026-08-26 after the hop map
11382
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11383
+ * There is **no Zod parse at all** between the door and the engine: the
11384
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11385
+ * field declared here reaches `SqliteSettingsBackend` either way.
11386
+ *
11387
+ * What actually lost `columns` was the THIRD declaration of this shape:
11388
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11389
+ * interface the engine destructures from. The field existed on both
11390
+ * schemas and the engine still never read it, because nothing checks a
11391
+ * registered provider against `InferProvider<cap>` —
11392
+ * `ProviderRegistration.provider` is typed `object`.
11393
+ *
11394
+ * It is declared here anyway, and must stay in step with
11395
+ * `settings-store.query`: a caller reading only the cap definitions has
11396
+ * to be able to see that this call carries a projection.
11397
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11398
+ */
11399
+ columns: array(string()).readonly().optional()
11400
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11375
11401
  namespace: string().optional(),
11376
11402
  collection: string(),
11377
11403
  record: SettingsRecordSchema
11378
- }), _void(), { kind: "mutation" }), method(object({
11404
+ }), _void(), {
11405
+ kind: "mutation",
11406
+ auth: "admin"
11407
+ }), method(object({
11379
11408
  namespace: string().optional(),
11380
11409
  collection: string(),
11381
11410
  id: string(),
11382
11411
  data: record(string(), unknown())
11383
- }), _void(), { kind: "mutation" }), method(object({
11412
+ }), _void(), {
11413
+ kind: "mutation",
11414
+ auth: "admin"
11415
+ }), method(object({
11384
11416
  namespace: string().optional(),
11385
11417
  collection: string(),
11386
11418
  key: string()
11387
- }), _void(), { kind: "mutation" }), method(object({
11419
+ }), _void(), {
11420
+ kind: "mutation",
11421
+ auth: "admin"
11422
+ }), method(object({
11388
11423
  namespace: string().optional(),
11389
11424
  collection: string(),
11390
11425
  filter: MutationFilterSchema
11391
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11426
+ }), object({ deleted: number().int() }), {
11427
+ kind: "mutation",
11428
+ auth: "admin"
11429
+ }), method(object({
11392
11430
  namespace: string().optional(),
11393
11431
  collection: string(),
11394
11432
  filter: MutationFilterSchema,
11395
11433
  data: record(string(), unknown())
11396
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11434
+ }), object({ updated: number().int() }), {
11435
+ kind: "mutation",
11436
+ auth: "admin"
11437
+ }), method(object({
11397
11438
  namespace: string().optional(),
11398
11439
  collection: string(),
11399
11440
  filter: QueryFilterSchema.optional()
11400
- }), number()), method(object({
11441
+ }), number(), { auth: "admin" }), method(object({
11401
11442
  namespace: string().optional(),
11402
11443
  collection: string(),
11403
11444
  field: string(),
@@ -11407,15 +11448,18 @@ method(_void(), EngineInfoSchema), method(object({
11407
11448
  }), array(object({
11408
11449
  bucket: number().int(),
11409
11450
  count: number().int()
11410
- })).readonly()), method(object({
11451
+ })).readonly(), { auth: "admin" }), method(object({
11411
11452
  namespace: string().optional(),
11412
11453
  collection: string()
11413
- }), boolean()), method(object({
11454
+ }), boolean(), { auth: "admin" }), method(object({
11414
11455
  namespace: string().optional(),
11415
11456
  collection: string(),
11416
11457
  columns: array(CollectionColumnSchema).readonly(),
11417
11458
  indexes: array(CollectionIndexSchema).readonly().optional()
11418
- }), _void(), { kind: "mutation" });
11459
+ }), _void(), {
11460
+ kind: "mutation",
11461
+ auth: "admin"
11462
+ });
11419
11463
  /**
11420
11464
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11421
11465
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12705,7 +12749,7 @@ method(object({
12705
12749
  crop: _instanceof(Uint8Array),
12706
12750
  width: number(),
12707
12751
  height: number()
12708
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12752
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12709
12753
  /**
12710
12754
  * filesystem-browse — per-node capability for browsing the node's local
12711
12755
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12998,19 +13042,22 @@ method(LlmGenerateBaseInputSchema.extend({
12998
13042
  runtime: ManagedRuntimeConfigSchema,
12999
13043
  /** The managed profile's timeout, threaded by the hub provider. */
13000
13044
  timeoutMs: number().int().positive().optional()
13001
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13045
+ }), LlmGenerateResultSchema, {
13046
+ kind: "mutation",
13047
+ auth: "admin"
13048
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13002
13049
  kind: "mutation",
13003
13050
  auth: "admin"
13004
13051
  }), method(object({}), _void(), {
13005
13052
  kind: "mutation",
13006
13053
  auth: "admin"
13007
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13054
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13008
13055
  kind: "mutation",
13009
13056
  auth: "admin"
13010
13057
  }), method(object({ file: string() }), _void(), {
13011
13058
  kind: "mutation",
13012
13059
  auth: "admin"
13013
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13060
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13014
13061
  /**
13015
13062
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13016
13063
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16521,7 +16568,7 @@ var OauthIntegrationDescriptorSchema = object({
16521
16568
  */
16522
16569
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16523
16570
  });
16524
- method(_void(), OauthIntegrationDescriptorSchema);
16571
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16525
16572
  /**
16526
16573
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16527
16574
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17716,6 +17763,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17716
17763
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17717
17764
  kind: "mutation",
17718
17765
  auth: "admin"
17766
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17767
+ kind: "mutation",
17768
+ auth: "admin"
17769
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17770
+ kind: "query",
17771
+ auth: "admin"
17772
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17773
+ kind: "mutation",
17774
+ auth: "admin"
17719
17775
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17720
17776
  kind: "query",
17721
17777
  auth: "admin"
@@ -17870,6 +17926,11 @@ object({
17870
17926
  "jpeg"
17871
17927
  ])
17872
17928
  });
17929
+ /**
17930
+ * Process-local frame identity. It is serializable so it can ride an in-process
17931
+ * capability call, but `registryId` deliberately prevents resolution in any
17932
+ * other process or execution group.
17933
+ */
17873
17934
  var FrameRefSchema = object({
17874
17935
  registryId: string().min(1),
17875
17936
  id: string().min(1),
@@ -20179,7 +20240,7 @@ method(object({
20179
20240
  * linking rather than produce an eternal token.
20180
20241
  */
20181
20242
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20182
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20243
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20183
20244
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20184
20245
  providerId: string().min(1),
20185
20246
  displayName: string().min(1),
@@ -20274,10 +20335,13 @@ var EvictResultSchema = object({
20274
20335
  /** True when the provider has nothing left it is willing to drop on this location. */
20275
20336
  exhausted: boolean()
20276
20337
  });
20277
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20338
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20278
20339
  locationId: string(),
20279
20340
  targetBytes: number().int().positive()
20280
- }), EvictResultSchema, { kind: "mutation" });
20341
+ }), EvictResultSchema, {
20342
+ kind: "mutation",
20343
+ auth: "admin"
20344
+ });
20281
20345
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20282
20346
  kind: "mutation",
20283
20347
  auth: "admin"
@@ -20337,26 +20401,50 @@ var ReadChunkInputSchema = object({
20337
20401
  length: number()
20338
20402
  });
20339
20403
  var EndDownloadInputSchema = object({ downloadId: string() });
20340
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20404
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20341
20405
  location: StorageLocationSchema,
20342
20406
  relativePath: string()
20343
- }), string()), method(object({
20407
+ }), string(), { auth: "admin" }), method(object({
20344
20408
  location: StorageLocationSchema,
20345
20409
  relativePath: string(),
20346
20410
  data: _instanceof(Uint8Array)
20347
- }), _void(), { kind: "mutation" }), method(object({
20411
+ }), _void(), {
20412
+ kind: "mutation",
20413
+ auth: "admin"
20414
+ }), method(object({
20348
20415
  location: StorageLocationSchema,
20349
20416
  relativePath: string()
20350
- }), _instanceof(Uint8Array)), method(object({
20417
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20351
20418
  location: StorageLocationSchema,
20352
20419
  relativePath: string()
20353
- }), boolean()), method(object({
20420
+ }), boolean(), { auth: "admin" }), method(object({
20354
20421
  location: StorageLocationSchema,
20355
20422
  prefix: string().optional()
20356
- }), array(string()).readonly()), method(object({
20423
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20357
20424
  location: StorageLocationSchema,
20358
20425
  relativePath: string()
20359
- }), _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" });
20426
+ }), _void(), {
20427
+ kind: "mutation",
20428
+ auth: "admin"
20429
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20430
+ kind: "mutation",
20431
+ auth: "admin"
20432
+ }), method(WriteChunkInputSchema, _void(), {
20433
+ kind: "mutation",
20434
+ auth: "admin"
20435
+ }), method(FinalizeUploadInputSchema, _void(), {
20436
+ kind: "mutation",
20437
+ auth: "admin"
20438
+ }), method(AbortUploadInputSchema, _void(), {
20439
+ kind: "mutation",
20440
+ auth: "admin"
20441
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20442
+ kind: "mutation",
20443
+ auth: "admin"
20444
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20445
+ kind: "mutation",
20446
+ auth: "admin"
20447
+ });
20360
20448
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20361
20449
  var ProfileSettingsSchemaBridge = unknown().nullable();
20362
20450
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20614,7 +20702,8 @@ method(object({
20614
20702
  access: "create"
20615
20703
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20616
20704
  kind: "mutation",
20617
- access: "view"
20705
+ access: "view",
20706
+ auth: "admin"
20618
20707
  }), method(object({
20619
20708
  /** Required — the user the assertion belongs to (verified). */
20620
20709
  userId: string(),
@@ -20622,10 +20711,12 @@ method(object({
20622
20711
  response: record(string(), unknown())
20623
20712
  }), object({ verified: boolean() }), {
20624
20713
  kind: "mutation",
20625
- access: "view"
20714
+ access: "view",
20715
+ auth: "admin"
20626
20716
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20627
20717
  kind: "mutation",
20628
- access: "view"
20718
+ access: "view",
20719
+ auth: "admin"
20629
20720
  }), method(object({
20630
20721
  /** AuthenticationResponseJSON from the browser. */
20631
20722
  response: record(string(), unknown()) }), object({
@@ -20633,7 +20724,8 @@ response: record(string(), unknown()) }), object({
20633
20724
  userId: string().nullable()
20634
20725
  }), {
20635
20726
  kind: "mutation",
20636
- access: "view"
20727
+ access: "view",
20728
+ auth: "admin"
20637
20729
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20638
20730
  userId: string(),
20639
20731
  credentialId: string()
@@ -20805,7 +20897,19 @@ var VectorStatsResultSchema = object({
20805
20897
  /** False when the backend ranks approximately. */
20806
20898
  exact: boolean()
20807
20899
  });
20808
- 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);
20900
+ method(VectorDeclareIndexInputSchema, _void(), {
20901
+ kind: "mutation",
20902
+ auth: "admin"
20903
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20904
+ kind: "mutation",
20905
+ auth: "admin"
20906
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20907
+ kind: "mutation",
20908
+ auth: "admin"
20909
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20910
+ kind: "mutation",
20911
+ auth: "admin"
20912
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20809
20913
  var ClipSchema = object({
20810
20914
  /** Opaque, provider-namespaced id. The default provider encodes the time
20811
20915
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23258,7 +23362,27 @@ var MediaFileLiteSchema$1 = object({
23258
23362
  sizeBytes: number(),
23259
23363
  timestamp: number()
23260
23364
  });
23261
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23365
+ method(object({
23366
+ /**
23367
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23368
+ *
23369
+ * Default `false`, the same inversion `listRecentFaces` and
23370
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23371
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23372
+ * on the live hub the same day: four identities cost 40,979 B with the
23373
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23374
+ * four times and the viewer holds at `staleTime: 30_000`.
23375
+ *
23376
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23377
+ * the `event-media` plane serves that key `immutable` with an ETag.
23378
+ *
23379
+ * **This is an INPUT field, so it does not reach the addon until the
23380
+ * next train** — the hub router validates cap inputs against its own
23381
+ * compiled Zod and strips a key it does not know. Until then the
23382
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23383
+ * is what ships, and the opt-in becomes reachable when the train lands.
23384
+ */
23385
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23262
23386
  kind: "mutation",
23263
23387
  auth: "admin"
23264
23388
  }), method(object({
@@ -26148,8 +26272,10 @@ var PlateInfoSchema = object({
26148
26272
  keyFrameMediaKey: string().optional(),
26149
26273
  base64: string().optional(),
26150
26274
  /**
26151
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26152
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26275
+ * Same crop as a data-plane URL, always present when the plate has a stored
26276
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26277
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26278
+ * left at its `true` default.
26153
26279
  */
26154
26280
  cropUrl: string().optional()
26155
26281
  });
@@ -26169,14 +26295,34 @@ var PlateClusterSchema = object({
26169
26295
  });
26170
26296
  method(object({
26171
26297
  deviceId: number().int().optional(),
26172
- limit: number().int().positive().optional()
26298
+ limit: number().int().positive().optional(),
26299
+ /**
26300
+ * Inline the base64 crop on every row. Default `true` — the existing
26301
+ * behaviour, kept so no caller breaks.
26302
+ *
26303
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26304
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26305
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26306
+ * metadata without them — and the browser then caches the images.
26307
+ *
26308
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26309
+ * plates were the one gallery list left without it.
26310
+ *
26311
+ * **This is an INPUT field, so it does not reach the addon until the
26312
+ * next train.** The hub router validates cap inputs against its own
26313
+ * compiled Zod and strips a key it does not know. Until the train
26314
+ * ships, sending `false` is harmless and keeps the crops inline.
26315
+ */
26316
+ includeCrops: boolean().optional()
26173
26317
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26174
26318
  deviceId: number().int(),
26175
26319
  trackId: string()
26176
26320
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26177
26321
  text: string().min(1),
26178
26322
  maxDistance: number().int().min(0).optional(),
26179
- limit: number().int().positive().optional()
26323
+ limit: number().int().positive().optional(),
26324
+ /** See `listPlates.includeCrops`. Default `true`. */
26325
+ includeCrops: boolean().optional()
26180
26326
  }), array(PlateInfoSchema).readonly()), method(object({
26181
26327
  maxDistance: number().int().min(0).optional(),
26182
26328
  minClusterSize: number().int().min(2).optional(),
@@ -26190,7 +26336,13 @@ method(object({
26190
26336
  }), method(object({ plateId: string() }), _void(), {
26191
26337
  kind: "mutation",
26192
26338
  auth: "admin"
26193
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26339
+ }), method(object({
26340
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26341
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26342
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26343
+ * INPUT field: stripped by the hub router until the train ships, which
26344
+ * resolves to `false` and is exactly the intended default. */
26345
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26194
26346
  kind: "mutation",
26195
26347
  auth: "admin"
26196
26348
  }), method(object({
@@ -33903,6 +34055,12 @@ Object.freeze({
33903
34055
  addonId: null,
33904
34056
  access: "create"
33905
34057
  },
34058
+ "pipelineAnalytics.cancelRelocateMedia": {
34059
+ capName: "pipeline-analytics",
34060
+ capScope: "device",
34061
+ addonId: null,
34062
+ access: "create"
34063
+ },
33906
34064
  "pipelineAnalytics.cancelStorageMigrationMove": {
33907
34065
  capName: "pipeline-analytics",
33908
34066
  capScope: "device",
@@ -34077,6 +34235,12 @@ Object.freeze({
34077
34235
  addonId: null,
34078
34236
  access: "view"
34079
34237
  },
34238
+ "pipelineAnalytics.listRelocateMediaJobs": {
34239
+ capName: "pipeline-analytics",
34240
+ capScope: "device",
34241
+ addonId: null,
34242
+ access: "view"
34243
+ },
34080
34244
  "pipelineAnalytics.listRetrainAnnotations": {
34081
34245
  capName: "pipeline-analytics",
34082
34246
  capScope: "device",
@@ -34155,6 +34319,12 @@ Object.freeze({
34155
34319
  addonId: null,
34156
34320
  access: "create"
34157
34321
  },
34322
+ "pipelineAnalytics.relocateMedia": {
34323
+ capName: "pipeline-analytics",
34324
+ capScope: "device",
34325
+ addonId: null,
34326
+ access: "create"
34327
+ },
34158
34328
  "pipelineAnalytics.restageRetrainTrack": {
34159
34329
  capName: "pipeline-analytics",
34160
34330
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.50",
3
+ "version": "1.2.51",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",