@camstack/addon-provider-dreame 0.2.28 → 0.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +249 -79
  2. package/dist/addon.mjs +249 -79
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -57135,7 +57135,7 @@ function method(input, output, options) {
57135
57135
  input,
57136
57136
  output,
57137
57137
  kind: options?.kind ?? "query",
57138
- auth: options?.auth ?? "protected",
57138
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
57139
57139
  ...options?.access !== void 0 ? { access: options.access } : {},
57140
57140
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
57141
57141
  timeoutMs: options?.timeoutMs
@@ -57159,7 +57159,7 @@ function event(data) {
57159
57159
  }
57160
57160
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
57161
57161
  var VersionOutputSchema$1 = object({ version: string() });
57162
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
57162
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
57163
57163
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
57164
57164
  DeviceType["Camera"] = "camera";
57165
57165
  DeviceType["Hub"] = "hub";
@@ -57480,7 +57480,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
57480
57480
  }({});
57481
57481
  var StaticDirOutputSchema = object({ staticDir: string() });
57482
57482
  var VersionOutputSchema = object({ version: string() });
57483
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
57483
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
57484
57484
  /**
57485
57485
  * device-ops — device-scoped cap that unifies the per-IDevice operations
57486
57486
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -58106,24 +58106,6 @@ var RecordingRetentionSchema = object({
58106
58106
  maxSizeGb: number().min(0).optional()
58107
58107
  });
58108
58108
  /**
58109
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
58110
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
58111
- * previews at. Five graduated steps; absent on a config = `standard` (the
58112
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
58113
- *
58114
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
58115
- * Each window's index sidecar carries its own tile dims, so a camera whose
58116
- * preset changed over time renders every historical window at the dims it was
58117
- * written with.
58118
- */
58119
- var ScrubThumbnailPresetSchema = _enum([
58120
- "minimal",
58121
- "low",
58122
- "standard",
58123
- "high",
58124
- "max"
58125
- ]);
58126
- /**
58127
58109
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
58128
58110
  *
58129
58111
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -58131,7 +58113,11 @@ var ScrubThumbnailPresetSchema = _enum([
58131
58113
  * other field is a storage knob (profiles, segment length, retention, scrub).
58132
58114
  *
58133
58115
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
58134
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
58116
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
58117
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
58118
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
58119
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
58120
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
58135
58121
  * A stale caller must fail loudly — silently stripping its legacy intent would
58136
58122
  * persist a band-less config, i.e. silently stop recording the camera.
58137
58123
  */
@@ -58154,14 +58140,7 @@ var RecordingConfigSchema = object({
58154
58140
  * "off" is the absence of a covering band, never a band value.
58155
58141
  */
58156
58142
  bands: array(RecordingBandSchema).default([]),
58157
- retention: RecordingRetentionSchema.optional(),
58158
- /**
58159
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
58160
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
58161
- * windows only — existing sheets are immutable, and each window's index
58162
- * carries its own tile dims so mixed-preset history renders correctly.
58163
- */
58164
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
58143
+ retention: RecordingRetentionSchema.optional()
58165
58144
  }).strict();
58166
58145
  /**
58167
58146
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -58237,10 +58216,11 @@ var RelocateFootageInputSchema = object({
58237
58216
  * `RecordingConfig.enabled` or camera wrapper bindings. */
58238
58217
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
58239
58218
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
58240
- var StorageMigrationMediaMoveInputSchema = object({
58219
+ var RelocateMediaInputSchema = object({
58241
58220
  toLocationId: string(),
58242
58221
  throttleMbps: number().min(1).max(1e3).optional()
58243
- }).extend({ leaseId: string().min(1) });
58222
+ });
58223
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
58244
58224
  /** The independently selectable logical storage classes. `recordings`
58245
58225
  * encompasses the high and mid segment profiles; `recordingsLow` is low
58246
58226
  * segments; `eventMedia` is post-analysis blobs. */
@@ -58535,7 +58515,26 @@ var LabelDefinitionSchema = object({
58535
58515
  description: string().optional(),
58536
58516
  icon: string().optional()
58537
58517
  });
58538
- var ClassMapDefinitionSchema = object({
58518
+ /**
58519
+ * Wire schema for a per-model CATALOG classMap override
58520
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
58521
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
58522
+ * detection pipeline executor actually routes.
58523
+ *
58524
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
58525
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
58526
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
58527
+ * enum) — the two used to share the name `ClassMapDefinition`/
58528
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
58529
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
58530
+ * are not: it is two different concepts colliding on a name. Keep this type
58531
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
58532
+ * would either narrow every `ClassMapDefinition` consumer to the four
58533
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
58534
+ * schema exists for (see the "rejects a classMap whose target is not a
58535
+ * detection macro" test in `model-catalog-schema.test.ts`).
58536
+ */
58537
+ var DetectionCatalogClassMapSchema = object({
58539
58538
  mapping: record(string(), _enum([
58540
58539
  "person",
58541
58540
  "vehicle",
@@ -58740,7 +58739,7 @@ var ModelCatalogEntrySchema = object({
58740
58739
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
58741
58740
  * labels already ARE the CamStack macros (Scrypted identity map).
58742
58741
  */
58743
- classMap: ClassMapDefinitionSchema.optional()
58742
+ classMap: DetectionCatalogClassMapSchema.optional()
58744
58743
  });
58745
58744
  var ConvertTargetSchema = discriminatedUnion("format", [object({
58746
58745
  format: literal("openvino"),
@@ -58770,7 +58769,7 @@ var ModelConvertMetadataSchema = object({
58770
58769
  "segmentation"
58771
58770
  ]),
58772
58771
  faceAlignment: boolean().optional(),
58773
- classMap: ClassMapDefinitionSchema.optional()
58772
+ classMap: DetectionCatalogClassMapSchema.optional()
58774
58773
  });
58775
58774
  var ConvertResultSchema = object({
58776
58775
  entry: ModelCatalogEntrySchema,
@@ -59633,7 +59632,7 @@ var AddonPageDeclarationSchema = object({
59633
59632
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
59634
59633
  sectionLabel: string().optional()
59635
59634
  });
59636
- method(_void(), array(AddonPageDeclarationSchema).readonly());
59635
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
59637
59636
  var AddonHttpRouteSchema = object({
59638
59637
  method: _enum([
59639
59638
  "GET",
@@ -59868,7 +59867,7 @@ var WidgetMetadataSchema = object({
59868
59867
  defaultColumns: number().int().min(1).max(12).default(6),
59869
59868
  defaultRows: number().int().min(1).max(12).default(1)
59870
59869
  });
59871
- method(_void(), array(WidgetMetadataSchema).readonly());
59870
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
59872
59871
  /**
59873
59872
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
59874
59873
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -61492,7 +61491,7 @@ var CustomModelDescriptorSchema = object({
61492
61491
  stepId: string(),
61493
61492
  entry: ModelCatalogEntrySchema
61494
61493
  });
61495
- method(_void(), array(CustomModelDescriptorSchema).readonly());
61494
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
61496
61495
  /**
61497
61496
  * Query filter for settings-store collections.
61498
61497
  */
@@ -61579,7 +61578,8 @@ method(object({
61579
61578
  }), _void(), { kind: "mutation" }), method(object({
61580
61579
  namespace: string().optional(),
61581
61580
  collection: string(),
61582
- filter: QueryFilterSchema.optional()
61581
+ filter: QueryFilterSchema.optional(),
61582
+ columns: array(string()).readonly().optional()
61583
61583
  }), array(SettingsRecordSchema).readonly()), method(object({
61584
61584
  namespace: string().optional(),
61585
61585
  collection: string(),
@@ -61642,46 +61642,87 @@ var EngineInfoSchema = object({
61642
61642
  kind: _enum(["relational", "vector"]),
61643
61643
  displayName: string()
61644
61644
  });
61645
- method(_void(), EngineInfoSchema), method(object({
61645
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
61646
61646
  namespace: string().optional(),
61647
61647
  collection: string(),
61648
61648
  key: string()
61649
- }), unknown()), method(object({
61649
+ }), unknown(), { auth: "admin" }), method(object({
61650
61650
  namespace: string().optional(),
61651
61651
  collection: string(),
61652
61652
  key: string(),
61653
61653
  value: unknown()
61654
- }), _void(), { kind: "mutation" }), method(object({
61654
+ }), _void(), {
61655
+ kind: "mutation",
61656
+ auth: "admin"
61657
+ }), method(object({
61655
61658
  namespace: string().optional(),
61656
61659
  collection: string(),
61657
- filter: QueryFilterSchema.optional()
61658
- }), array(SettingsRecordSchema).readonly()), method(object({
61660
+ filter: QueryFilterSchema.optional(),
61661
+ /**
61662
+ * SQL-level column projection — MUST mirror `settings-store.query`.
61663
+ *
61664
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
61665
+ * was wrong — corrected 2026-08-26 after the hop map
61666
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
61667
+ * There is **no Zod parse at all** between the door and the engine: the
61668
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
61669
+ * field declared here reaches `SqliteSettingsBackend` either way.
61670
+ *
61671
+ * What actually lost `columns` was the THIRD declaration of this shape:
61672
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
61673
+ * interface the engine destructures from. The field existed on both
61674
+ * schemas and the engine still never read it, because nothing checks a
61675
+ * registered provider against `InferProvider<cap>` —
61676
+ * `ProviderRegistration.provider` is typed `object`.
61677
+ *
61678
+ * It is declared here anyway, and must stay in step with
61679
+ * `settings-store.query`: a caller reading only the cap definitions has
61680
+ * to be able to see that this call carries a projection.
61681
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
61682
+ */
61683
+ columns: array(string()).readonly().optional()
61684
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
61659
61685
  namespace: string().optional(),
61660
61686
  collection: string(),
61661
61687
  record: SettingsRecordSchema
61662
- }), _void(), { kind: "mutation" }), method(object({
61688
+ }), _void(), {
61689
+ kind: "mutation",
61690
+ auth: "admin"
61691
+ }), method(object({
61663
61692
  namespace: string().optional(),
61664
61693
  collection: string(),
61665
61694
  id: string(),
61666
61695
  data: record(string(), unknown())
61667
- }), _void(), { kind: "mutation" }), method(object({
61696
+ }), _void(), {
61697
+ kind: "mutation",
61698
+ auth: "admin"
61699
+ }), method(object({
61668
61700
  namespace: string().optional(),
61669
61701
  collection: string(),
61670
61702
  key: string()
61671
- }), _void(), { kind: "mutation" }), method(object({
61703
+ }), _void(), {
61704
+ kind: "mutation",
61705
+ auth: "admin"
61706
+ }), method(object({
61672
61707
  namespace: string().optional(),
61673
61708
  collection: string(),
61674
61709
  filter: MutationFilterSchema
61675
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
61710
+ }), object({ deleted: number().int() }), {
61711
+ kind: "mutation",
61712
+ auth: "admin"
61713
+ }), method(object({
61676
61714
  namespace: string().optional(),
61677
61715
  collection: string(),
61678
61716
  filter: MutationFilterSchema,
61679
61717
  data: record(string(), unknown())
61680
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
61718
+ }), object({ updated: number().int() }), {
61719
+ kind: "mutation",
61720
+ auth: "admin"
61721
+ }), method(object({
61681
61722
  namespace: string().optional(),
61682
61723
  collection: string(),
61683
61724
  filter: QueryFilterSchema.optional()
61684
- }), number()), method(object({
61725
+ }), number(), { auth: "admin" }), method(object({
61685
61726
  namespace: string().optional(),
61686
61727
  collection: string(),
61687
61728
  field: string(),
@@ -61691,15 +61732,18 @@ method(_void(), EngineInfoSchema), method(object({
61691
61732
  }), array(object({
61692
61733
  bucket: number().int(),
61693
61734
  count: number().int()
61694
- })).readonly()), method(object({
61735
+ })).readonly(), { auth: "admin" }), method(object({
61695
61736
  namespace: string().optional(),
61696
61737
  collection: string()
61697
- }), boolean()), method(object({
61738
+ }), boolean(), { auth: "admin" }), method(object({
61698
61739
  namespace: string().optional(),
61699
61740
  collection: string(),
61700
61741
  columns: array(CollectionColumnSchema).readonly(),
61701
61742
  indexes: array(CollectionIndexSchema).readonly().optional()
61702
- }), _void(), { kind: "mutation" });
61743
+ }), _void(), {
61744
+ kind: "mutation",
61745
+ auth: "admin"
61746
+ });
61703
61747
  /**
61704
61748
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
61705
61749
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -63006,7 +63050,7 @@ method(object({
63006
63050
  crop: _instanceof(Uint8Array),
63007
63051
  width: number(),
63008
63052
  height: number()
63009
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
63053
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
63010
63054
  /**
63011
63055
  * filesystem-browse — per-node capability for browsing the node's local
63012
63056
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -63299,19 +63343,22 @@ method(LlmGenerateBaseInputSchema.extend({
63299
63343
  runtime: ManagedRuntimeConfigSchema,
63300
63344
  /** The managed profile's timeout, threaded by the hub provider. */
63301
63345
  timeoutMs: number().int().positive().optional()
63302
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
63346
+ }), LlmGenerateResultSchema, {
63347
+ kind: "mutation",
63348
+ auth: "admin"
63349
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
63303
63350
  kind: "mutation",
63304
63351
  auth: "admin"
63305
63352
  }), method(object({}), _void(), {
63306
63353
  kind: "mutation",
63307
63354
  auth: "admin"
63308
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
63355
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
63309
63356
  kind: "mutation",
63310
63357
  auth: "admin"
63311
63358
  }), method(object({ file: string() }), _void(), {
63312
63359
  kind: "mutation",
63313
63360
  auth: "admin"
63314
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
63361
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
63315
63362
  /**
63316
63363
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
63317
63364
  * methods concat-fan across providers; single-row methods route to ONE
@@ -66822,7 +66869,7 @@ var OauthIntegrationDescriptorSchema = object({
66822
66869
  */
66823
66870
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
66824
66871
  });
66825
- method(_void(), OauthIntegrationDescriptorSchema);
66872
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
66826
66873
  /**
66827
66874
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
66828
66875
  * per-frame detections emitted by the pipeline runner into tracked
@@ -68017,6 +68064,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
68017
68064
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
68018
68065
  kind: "mutation",
68019
68066
  auth: "admin"
68067
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
68068
+ kind: "mutation",
68069
+ auth: "admin"
68070
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
68071
+ kind: "query",
68072
+ auth: "admin"
68073
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
68074
+ kind: "mutation",
68075
+ auth: "admin"
68020
68076
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
68021
68077
  kind: "query",
68022
68078
  auth: "admin"
@@ -68171,6 +68227,11 @@ object({
68171
68227
  "jpeg"
68172
68228
  ])
68173
68229
  });
68230
+ /**
68231
+ * Process-local frame identity. It is serializable so it can ride an in-process
68232
+ * capability call, but `registryId` deliberately prevents resolution in any
68233
+ * other process or execution group.
68234
+ */
68174
68235
  var FrameRefSchema = object({
68175
68236
  registryId: string().min(1),
68176
68237
  id: string().min(1),
@@ -70376,7 +70437,7 @@ method(object({
70376
70437
  * linking rather than produce an eternal token.
70377
70438
  */
70378
70439
  ttlSec: union([number().int().positive(), literal("never")]).optional()
70379
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
70440
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
70380
70441
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
70381
70442
  providerId: string().min(1),
70382
70443
  displayName: string().min(1),
@@ -70471,10 +70532,13 @@ var EvictResultSchema = object({
70471
70532
  /** True when the provider has nothing left it is willing to drop on this location. */
70472
70533
  exhausted: boolean()
70473
70534
  });
70474
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
70535
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
70475
70536
  locationId: string(),
70476
70537
  targetBytes: number().int().positive()
70477
- }), EvictResultSchema, { kind: "mutation" });
70538
+ }), EvictResultSchema, {
70539
+ kind: "mutation",
70540
+ auth: "admin"
70541
+ });
70478
70542
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
70479
70543
  kind: "mutation",
70480
70544
  auth: "admin"
@@ -70534,26 +70598,50 @@ var ReadChunkInputSchema = object({
70534
70598
  length: number()
70535
70599
  });
70536
70600
  var EndDownloadInputSchema = object({ downloadId: string() });
70537
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
70601
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
70538
70602
  location: StorageLocationSchema,
70539
70603
  relativePath: string()
70540
- }), string()), method(object({
70604
+ }), string(), { auth: "admin" }), method(object({
70541
70605
  location: StorageLocationSchema,
70542
70606
  relativePath: string(),
70543
70607
  data: _instanceof(Uint8Array)
70544
- }), _void(), { kind: "mutation" }), method(object({
70608
+ }), _void(), {
70609
+ kind: "mutation",
70610
+ auth: "admin"
70611
+ }), method(object({
70545
70612
  location: StorageLocationSchema,
70546
70613
  relativePath: string()
70547
- }), _instanceof(Uint8Array)), method(object({
70614
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
70548
70615
  location: StorageLocationSchema,
70549
70616
  relativePath: string()
70550
- }), boolean()), method(object({
70617
+ }), boolean(), { auth: "admin" }), method(object({
70551
70618
  location: StorageLocationSchema,
70552
70619
  prefix: string().optional()
70553
- }), array(string()).readonly()), method(object({
70620
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
70554
70621
  location: StorageLocationSchema,
70555
70622
  relativePath: string()
70556
- }), _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" });
70623
+ }), _void(), {
70624
+ kind: "mutation",
70625
+ auth: "admin"
70626
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
70627
+ kind: "mutation",
70628
+ auth: "admin"
70629
+ }), method(WriteChunkInputSchema, _void(), {
70630
+ kind: "mutation",
70631
+ auth: "admin"
70632
+ }), method(FinalizeUploadInputSchema, _void(), {
70633
+ kind: "mutation",
70634
+ auth: "admin"
70635
+ }), method(AbortUploadInputSchema, _void(), {
70636
+ kind: "mutation",
70637
+ auth: "admin"
70638
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
70639
+ kind: "mutation",
70640
+ auth: "admin"
70641
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
70642
+ kind: "mutation",
70643
+ auth: "admin"
70644
+ });
70557
70645
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
70558
70646
  var ProfileSettingsSchemaBridge = unknown().nullable();
70559
70647
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -70811,7 +70899,8 @@ method(object({
70811
70899
  access: "create"
70812
70900
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
70813
70901
  kind: "mutation",
70814
- access: "view"
70902
+ access: "view",
70903
+ auth: "admin"
70815
70904
  }), method(object({
70816
70905
  /** Required — the user the assertion belongs to (verified). */
70817
70906
  userId: string(),
@@ -70819,10 +70908,12 @@ method(object({
70819
70908
  response: record(string(), unknown())
70820
70909
  }), object({ verified: boolean() }), {
70821
70910
  kind: "mutation",
70822
- access: "view"
70911
+ access: "view",
70912
+ auth: "admin"
70823
70913
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
70824
70914
  kind: "mutation",
70825
- access: "view"
70915
+ access: "view",
70916
+ auth: "admin"
70826
70917
  }), method(object({
70827
70918
  /** AuthenticationResponseJSON from the browser. */
70828
70919
  response: record(string(), unknown()) }), object({
@@ -70830,7 +70921,8 @@ response: record(string(), unknown()) }), object({
70830
70921
  userId: string().nullable()
70831
70922
  }), {
70832
70923
  kind: "mutation",
70833
- access: "view"
70924
+ access: "view",
70925
+ auth: "admin"
70834
70926
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
70835
70927
  userId: string(),
70836
70928
  credentialId: string()
@@ -71002,7 +71094,19 @@ var VectorStatsResultSchema = object({
71002
71094
  /** False when the backend ranks approximately. */
71003
71095
  exact: boolean()
71004
71096
  });
71005
- 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);
71097
+ method(VectorDeclareIndexInputSchema, _void(), {
71098
+ kind: "mutation",
71099
+ auth: "admin"
71100
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
71101
+ kind: "mutation",
71102
+ auth: "admin"
71103
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
71104
+ kind: "mutation",
71105
+ auth: "admin"
71106
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
71107
+ kind: "mutation",
71108
+ auth: "admin"
71109
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
71006
71110
  var ClipSchema = object({
71007
71111
  /** Opaque, provider-namespaced id. The default provider encodes the time
71008
71112
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -73480,7 +73584,27 @@ var MediaFileLiteSchema$1 = object({
73480
73584
  sizeBytes: number(),
73481
73585
  timestamp: number()
73482
73586
  });
73483
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
73587
+ method(object({
73588
+ /**
73589
+ * Inline {@link IdentitySchema.coverBase64} on every row.
73590
+ *
73591
+ * Default `false`, the same inversion `listRecentFaces` and
73592
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
73593
+ * why the burden belongs on the caller that WANTS the bytes). Measured
73594
+ * on the live hub the same day: four identities cost 40,979 B with the
73595
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
73596
+ * four times and the viewer holds at `staleTime: 30_000`.
73597
+ *
73598
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
73599
+ * the `event-media` plane serves that key `immutable` with an ETag.
73600
+ *
73601
+ * **This is an INPUT field, so it does not reach the addon until the
73602
+ * next train** — the hub router validates cap inputs against its own
73603
+ * compiled Zod and strips a key it does not know. Until then the
73604
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
73605
+ * is what ships, and the opt-in becomes reachable when the train lands.
73606
+ */
73607
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
73484
73608
  kind: "mutation",
73485
73609
  auth: "admin"
73486
73610
  }), method(object({
@@ -76370,8 +76494,10 @@ var PlateInfoSchema = object({
76370
76494
  keyFrameMediaKey: string().optional(),
76371
76495
  base64: string().optional(),
76372
76496
  /**
76373
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
76374
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
76497
+ * Same crop as a data-plane URL, always present when the plate has a stored
76498
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
76499
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
76500
+ * left at its `true` default.
76375
76501
  */
76376
76502
  cropUrl: string().optional()
76377
76503
  });
@@ -76391,14 +76517,34 @@ var PlateClusterSchema = object({
76391
76517
  });
76392
76518
  method(object({
76393
76519
  deviceId: number().int().optional(),
76394
- limit: number().int().positive().optional()
76520
+ limit: number().int().positive().optional(),
76521
+ /**
76522
+ * Inline the base64 crop on every row. Default `true` — the existing
76523
+ * behaviour, kept so no caller breaks.
76524
+ *
76525
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
76526
+ * Measured on the live hub at the 500 rows the Plates view asks for:
76527
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
76528
+ * metadata without them — and the browser then caches the images.
76529
+ *
76530
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
76531
+ * plates were the one gallery list left without it.
76532
+ *
76533
+ * **This is an INPUT field, so it does not reach the addon until the
76534
+ * next train.** The hub router validates cap inputs against its own
76535
+ * compiled Zod and strips a key it does not know. Until the train
76536
+ * ships, sending `false` is harmless and keeps the crops inline.
76537
+ */
76538
+ includeCrops: boolean().optional()
76395
76539
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
76396
76540
  deviceId: number().int(),
76397
76541
  trackId: string()
76398
76542
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
76399
76543
  text: string().min(1),
76400
76544
  maxDistance: number().int().min(0).optional(),
76401
- limit: number().int().positive().optional()
76545
+ limit: number().int().positive().optional(),
76546
+ /** See `listPlates.includeCrops`. Default `true`. */
76547
+ includeCrops: boolean().optional()
76402
76548
  }), array(PlateInfoSchema).readonly()), method(object({
76403
76549
  maxDistance: number().int().min(0).optional(),
76404
76550
  minClusterSize: number().int().min(2).optional(),
@@ -76412,7 +76558,13 @@ method(object({
76412
76558
  }), method(object({ plateId: string() }), _void(), {
76413
76559
  kind: "mutation",
76414
76560
  auth: "admin"
76415
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
76561
+ }), method(object({
76562
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
76563
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
76564
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
76565
+ * INPUT field: stripped by the hub router until the train ships, which
76566
+ * resolves to `false` and is exactly the intended default. */
76567
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
76416
76568
  kind: "mutation",
76417
76569
  auth: "admin"
76418
76570
  }), method(object({
@@ -83673,6 +83825,12 @@ Object.freeze({
83673
83825
  addonId: null,
83674
83826
  access: "create"
83675
83827
  },
83828
+ "pipelineAnalytics.cancelRelocateMedia": {
83829
+ capName: "pipeline-analytics",
83830
+ capScope: "device",
83831
+ addonId: null,
83832
+ access: "create"
83833
+ },
83676
83834
  "pipelineAnalytics.cancelStorageMigrationMove": {
83677
83835
  capName: "pipeline-analytics",
83678
83836
  capScope: "device",
@@ -83847,6 +84005,12 @@ Object.freeze({
83847
84005
  addonId: null,
83848
84006
  access: "view"
83849
84007
  },
84008
+ "pipelineAnalytics.listRelocateMediaJobs": {
84009
+ capName: "pipeline-analytics",
84010
+ capScope: "device",
84011
+ addonId: null,
84012
+ access: "view"
84013
+ },
83850
84014
  "pipelineAnalytics.listRetrainAnnotations": {
83851
84015
  capName: "pipeline-analytics",
83852
84016
  capScope: "device",
@@ -83925,6 +84089,12 @@ Object.freeze({
83925
84089
  addonId: null,
83926
84090
  access: "create"
83927
84091
  },
84092
+ "pipelineAnalytics.relocateMedia": {
84093
+ capName: "pipeline-analytics",
84094
+ capScope: "device",
84095
+ addonId: null,
84096
+ access: "create"
84097
+ },
83928
84098
  "pipelineAnalytics.restageRetrainTrack": {
83929
84099
  capName: "pipeline-analytics",
83930
84100
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -57135,7 +57135,7 @@ function method(input, output, options) {
57135
57135
  input,
57136
57136
  output,
57137
57137
  kind: options?.kind ?? "query",
57138
- auth: options?.auth ?? "protected",
57138
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
57139
57139
  ...options?.access !== void 0 ? { access: options.access } : {},
57140
57140
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
57141
57141
  timeoutMs: options?.timeoutMs
@@ -57159,7 +57159,7 @@ function event(data) {
57159
57159
  }
57160
57160
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
57161
57161
  var VersionOutputSchema$1 = object({ version: string() });
57162
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
57162
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
57163
57163
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
57164
57164
  DeviceType["Camera"] = "camera";
57165
57165
  DeviceType["Hub"] = "hub";
@@ -57480,7 +57480,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
57480
57480
  }({});
57481
57481
  var StaticDirOutputSchema = object({ staticDir: string() });
57482
57482
  var VersionOutputSchema = object({ version: string() });
57483
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
57483
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
57484
57484
  /**
57485
57485
  * device-ops — device-scoped cap that unifies the per-IDevice operations
57486
57486
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -58106,24 +58106,6 @@ var RecordingRetentionSchema = object({
58106
58106
  maxSizeGb: number().min(0).optional()
58107
58107
  });
58108
58108
  /**
58109
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
58110
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
58111
- * previews at. Five graduated steps; absent on a config = `standard` (the
58112
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
58113
- *
58114
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
58115
- * Each window's index sidecar carries its own tile dims, so a camera whose
58116
- * preset changed over time renders every historical window at the dims it was
58117
- * written with.
58118
- */
58119
- var ScrubThumbnailPresetSchema = _enum([
58120
- "minimal",
58121
- "low",
58122
- "standard",
58123
- "high",
58124
- "max"
58125
- ]);
58126
- /**
58127
58109
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
58128
58110
  *
58129
58111
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -58131,7 +58113,11 @@ var ScrubThumbnailPresetSchema = _enum([
58131
58113
  * other field is a storage knob (profiles, segment length, retention, scrub).
58132
58114
  *
58133
58115
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
58134
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
58116
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
58117
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
58118
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
58119
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
58120
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
58135
58121
  * A stale caller must fail loudly — silently stripping its legacy intent would
58136
58122
  * persist a band-less config, i.e. silently stop recording the camera.
58137
58123
  */
@@ -58154,14 +58140,7 @@ var RecordingConfigSchema = object({
58154
58140
  * "off" is the absence of a covering band, never a band value.
58155
58141
  */
58156
58142
  bands: array(RecordingBandSchema).default([]),
58157
- retention: RecordingRetentionSchema.optional(),
58158
- /**
58159
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
58160
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
58161
- * windows only — existing sheets are immutable, and each window's index
58162
- * carries its own tile dims so mixed-preset history renders correctly.
58163
- */
58164
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
58143
+ retention: RecordingRetentionSchema.optional()
58165
58144
  }).strict();
58166
58145
  /**
58167
58146
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -58237,10 +58216,11 @@ var RelocateFootageInputSchema = object({
58237
58216
  * `RecordingConfig.enabled` or camera wrapper bindings. */
58238
58217
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
58239
58218
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
58240
- var StorageMigrationMediaMoveInputSchema = object({
58219
+ var RelocateMediaInputSchema = object({
58241
58220
  toLocationId: string(),
58242
58221
  throttleMbps: number().min(1).max(1e3).optional()
58243
- }).extend({ leaseId: string().min(1) });
58222
+ });
58223
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
58244
58224
  /** The independently selectable logical storage classes. `recordings`
58245
58225
  * encompasses the high and mid segment profiles; `recordingsLow` is low
58246
58226
  * segments; `eventMedia` is post-analysis blobs. */
@@ -58535,7 +58515,26 @@ var LabelDefinitionSchema = object({
58535
58515
  description: string().optional(),
58536
58516
  icon: string().optional()
58537
58517
  });
58538
- var ClassMapDefinitionSchema = object({
58518
+ /**
58519
+ * Wire schema for a per-model CATALOG classMap override
58520
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
58521
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
58522
+ * detection pipeline executor actually routes.
58523
+ *
58524
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
58525
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
58526
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
58527
+ * enum) — the two used to share the name `ClassMapDefinition`/
58528
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
58529
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
58530
+ * are not: it is two different concepts colliding on a name. Keep this type
58531
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
58532
+ * would either narrow every `ClassMapDefinition` consumer to the four
58533
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
58534
+ * schema exists for (see the "rejects a classMap whose target is not a
58535
+ * detection macro" test in `model-catalog-schema.test.ts`).
58536
+ */
58537
+ var DetectionCatalogClassMapSchema = object({
58539
58538
  mapping: record(string(), _enum([
58540
58539
  "person",
58541
58540
  "vehicle",
@@ -58740,7 +58739,7 @@ var ModelCatalogEntrySchema = object({
58740
58739
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
58741
58740
  * labels already ARE the CamStack macros (Scrypted identity map).
58742
58741
  */
58743
- classMap: ClassMapDefinitionSchema.optional()
58742
+ classMap: DetectionCatalogClassMapSchema.optional()
58744
58743
  });
58745
58744
  var ConvertTargetSchema = discriminatedUnion("format", [object({
58746
58745
  format: literal("openvino"),
@@ -58770,7 +58769,7 @@ var ModelConvertMetadataSchema = object({
58770
58769
  "segmentation"
58771
58770
  ]),
58772
58771
  faceAlignment: boolean().optional(),
58773
- classMap: ClassMapDefinitionSchema.optional()
58772
+ classMap: DetectionCatalogClassMapSchema.optional()
58774
58773
  });
58775
58774
  var ConvertResultSchema = object({
58776
58775
  entry: ModelCatalogEntrySchema,
@@ -59633,7 +59632,7 @@ var AddonPageDeclarationSchema = object({
59633
59632
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
59634
59633
  sectionLabel: string().optional()
59635
59634
  });
59636
- method(_void(), array(AddonPageDeclarationSchema).readonly());
59635
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
59637
59636
  var AddonHttpRouteSchema = object({
59638
59637
  method: _enum([
59639
59638
  "GET",
@@ -59868,7 +59867,7 @@ var WidgetMetadataSchema = object({
59868
59867
  defaultColumns: number().int().min(1).max(12).default(6),
59869
59868
  defaultRows: number().int().min(1).max(12).default(1)
59870
59869
  });
59871
- method(_void(), array(WidgetMetadataSchema).readonly());
59870
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
59872
59871
  /**
59873
59872
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
59874
59873
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -61492,7 +61491,7 @@ var CustomModelDescriptorSchema = object({
61492
61491
  stepId: string(),
61493
61492
  entry: ModelCatalogEntrySchema
61494
61493
  });
61495
- method(_void(), array(CustomModelDescriptorSchema).readonly());
61494
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
61496
61495
  /**
61497
61496
  * Query filter for settings-store collections.
61498
61497
  */
@@ -61579,7 +61578,8 @@ method(object({
61579
61578
  }), _void(), { kind: "mutation" }), method(object({
61580
61579
  namespace: string().optional(),
61581
61580
  collection: string(),
61582
- filter: QueryFilterSchema.optional()
61581
+ filter: QueryFilterSchema.optional(),
61582
+ columns: array(string()).readonly().optional()
61583
61583
  }), array(SettingsRecordSchema).readonly()), method(object({
61584
61584
  namespace: string().optional(),
61585
61585
  collection: string(),
@@ -61642,46 +61642,87 @@ var EngineInfoSchema = object({
61642
61642
  kind: _enum(["relational", "vector"]),
61643
61643
  displayName: string()
61644
61644
  });
61645
- method(_void(), EngineInfoSchema), method(object({
61645
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
61646
61646
  namespace: string().optional(),
61647
61647
  collection: string(),
61648
61648
  key: string()
61649
- }), unknown()), method(object({
61649
+ }), unknown(), { auth: "admin" }), method(object({
61650
61650
  namespace: string().optional(),
61651
61651
  collection: string(),
61652
61652
  key: string(),
61653
61653
  value: unknown()
61654
- }), _void(), { kind: "mutation" }), method(object({
61654
+ }), _void(), {
61655
+ kind: "mutation",
61656
+ auth: "admin"
61657
+ }), method(object({
61655
61658
  namespace: string().optional(),
61656
61659
  collection: string(),
61657
- filter: QueryFilterSchema.optional()
61658
- }), array(SettingsRecordSchema).readonly()), method(object({
61660
+ filter: QueryFilterSchema.optional(),
61661
+ /**
61662
+ * SQL-level column projection — MUST mirror `settings-store.query`.
61663
+ *
61664
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
61665
+ * was wrong — corrected 2026-08-26 after the hop map
61666
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
61667
+ * There is **no Zod parse at all** between the door and the engine: the
61668
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
61669
+ * field declared here reaches `SqliteSettingsBackend` either way.
61670
+ *
61671
+ * What actually lost `columns` was the THIRD declaration of this shape:
61672
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
61673
+ * interface the engine destructures from. The field existed on both
61674
+ * schemas and the engine still never read it, because nothing checks a
61675
+ * registered provider against `InferProvider<cap>` —
61676
+ * `ProviderRegistration.provider` is typed `object`.
61677
+ *
61678
+ * It is declared here anyway, and must stay in step with
61679
+ * `settings-store.query`: a caller reading only the cap definitions has
61680
+ * to be able to see that this call carries a projection.
61681
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
61682
+ */
61683
+ columns: array(string()).readonly().optional()
61684
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
61659
61685
  namespace: string().optional(),
61660
61686
  collection: string(),
61661
61687
  record: SettingsRecordSchema
61662
- }), _void(), { kind: "mutation" }), method(object({
61688
+ }), _void(), {
61689
+ kind: "mutation",
61690
+ auth: "admin"
61691
+ }), method(object({
61663
61692
  namespace: string().optional(),
61664
61693
  collection: string(),
61665
61694
  id: string(),
61666
61695
  data: record(string(), unknown())
61667
- }), _void(), { kind: "mutation" }), method(object({
61696
+ }), _void(), {
61697
+ kind: "mutation",
61698
+ auth: "admin"
61699
+ }), method(object({
61668
61700
  namespace: string().optional(),
61669
61701
  collection: string(),
61670
61702
  key: string()
61671
- }), _void(), { kind: "mutation" }), method(object({
61703
+ }), _void(), {
61704
+ kind: "mutation",
61705
+ auth: "admin"
61706
+ }), method(object({
61672
61707
  namespace: string().optional(),
61673
61708
  collection: string(),
61674
61709
  filter: MutationFilterSchema
61675
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
61710
+ }), object({ deleted: number().int() }), {
61711
+ kind: "mutation",
61712
+ auth: "admin"
61713
+ }), method(object({
61676
61714
  namespace: string().optional(),
61677
61715
  collection: string(),
61678
61716
  filter: MutationFilterSchema,
61679
61717
  data: record(string(), unknown())
61680
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
61718
+ }), object({ updated: number().int() }), {
61719
+ kind: "mutation",
61720
+ auth: "admin"
61721
+ }), method(object({
61681
61722
  namespace: string().optional(),
61682
61723
  collection: string(),
61683
61724
  filter: QueryFilterSchema.optional()
61684
- }), number()), method(object({
61725
+ }), number(), { auth: "admin" }), method(object({
61685
61726
  namespace: string().optional(),
61686
61727
  collection: string(),
61687
61728
  field: string(),
@@ -61691,15 +61732,18 @@ method(_void(), EngineInfoSchema), method(object({
61691
61732
  }), array(object({
61692
61733
  bucket: number().int(),
61693
61734
  count: number().int()
61694
- })).readonly()), method(object({
61735
+ })).readonly(), { auth: "admin" }), method(object({
61695
61736
  namespace: string().optional(),
61696
61737
  collection: string()
61697
- }), boolean()), method(object({
61738
+ }), boolean(), { auth: "admin" }), method(object({
61698
61739
  namespace: string().optional(),
61699
61740
  collection: string(),
61700
61741
  columns: array(CollectionColumnSchema).readonly(),
61701
61742
  indexes: array(CollectionIndexSchema).readonly().optional()
61702
- }), _void(), { kind: "mutation" });
61743
+ }), _void(), {
61744
+ kind: "mutation",
61745
+ auth: "admin"
61746
+ });
61703
61747
  /**
61704
61748
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
61705
61749
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -63006,7 +63050,7 @@ method(object({
63006
63050
  crop: _instanceof(Uint8Array),
63007
63051
  width: number(),
63008
63052
  height: number()
63009
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
63053
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
63010
63054
  /**
63011
63055
  * filesystem-browse — per-node capability for browsing the node's local
63012
63056
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -63299,19 +63343,22 @@ method(LlmGenerateBaseInputSchema.extend({
63299
63343
  runtime: ManagedRuntimeConfigSchema,
63300
63344
  /** The managed profile's timeout, threaded by the hub provider. */
63301
63345
  timeoutMs: number().int().positive().optional()
63302
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
63346
+ }), LlmGenerateResultSchema, {
63347
+ kind: "mutation",
63348
+ auth: "admin"
63349
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
63303
63350
  kind: "mutation",
63304
63351
  auth: "admin"
63305
63352
  }), method(object({}), _void(), {
63306
63353
  kind: "mutation",
63307
63354
  auth: "admin"
63308
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
63355
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
63309
63356
  kind: "mutation",
63310
63357
  auth: "admin"
63311
63358
  }), method(object({ file: string() }), _void(), {
63312
63359
  kind: "mutation",
63313
63360
  auth: "admin"
63314
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
63361
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
63315
63362
  /**
63316
63363
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
63317
63364
  * methods concat-fan across providers; single-row methods route to ONE
@@ -66822,7 +66869,7 @@ var OauthIntegrationDescriptorSchema = object({
66822
66869
  */
66823
66870
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
66824
66871
  });
66825
- method(_void(), OauthIntegrationDescriptorSchema);
66872
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
66826
66873
  /**
66827
66874
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
66828
66875
  * per-frame detections emitted by the pipeline runner into tracked
@@ -68017,6 +68064,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
68017
68064
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
68018
68065
  kind: "mutation",
68019
68066
  auth: "admin"
68067
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
68068
+ kind: "mutation",
68069
+ auth: "admin"
68070
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
68071
+ kind: "query",
68072
+ auth: "admin"
68073
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
68074
+ kind: "mutation",
68075
+ auth: "admin"
68020
68076
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
68021
68077
  kind: "query",
68022
68078
  auth: "admin"
@@ -68171,6 +68227,11 @@ object({
68171
68227
  "jpeg"
68172
68228
  ])
68173
68229
  });
68230
+ /**
68231
+ * Process-local frame identity. It is serializable so it can ride an in-process
68232
+ * capability call, but `registryId` deliberately prevents resolution in any
68233
+ * other process or execution group.
68234
+ */
68174
68235
  var FrameRefSchema = object({
68175
68236
  registryId: string().min(1),
68176
68237
  id: string().min(1),
@@ -70376,7 +70437,7 @@ method(object({
70376
70437
  * linking rather than produce an eternal token.
70377
70438
  */
70378
70439
  ttlSec: union([number().int().positive(), literal("never")]).optional()
70379
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
70440
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
70380
70441
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
70381
70442
  providerId: string().min(1),
70382
70443
  displayName: string().min(1),
@@ -70471,10 +70532,13 @@ var EvictResultSchema = object({
70471
70532
  /** True when the provider has nothing left it is willing to drop on this location. */
70472
70533
  exhausted: boolean()
70473
70534
  });
70474
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
70535
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
70475
70536
  locationId: string(),
70476
70537
  targetBytes: number().int().positive()
70477
- }), EvictResultSchema, { kind: "mutation" });
70538
+ }), EvictResultSchema, {
70539
+ kind: "mutation",
70540
+ auth: "admin"
70541
+ });
70478
70542
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
70479
70543
  kind: "mutation",
70480
70544
  auth: "admin"
@@ -70534,26 +70598,50 @@ var ReadChunkInputSchema = object({
70534
70598
  length: number()
70535
70599
  });
70536
70600
  var EndDownloadInputSchema = object({ downloadId: string() });
70537
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
70601
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
70538
70602
  location: StorageLocationSchema,
70539
70603
  relativePath: string()
70540
- }), string()), method(object({
70604
+ }), string(), { auth: "admin" }), method(object({
70541
70605
  location: StorageLocationSchema,
70542
70606
  relativePath: string(),
70543
70607
  data: _instanceof(Uint8Array)
70544
- }), _void(), { kind: "mutation" }), method(object({
70608
+ }), _void(), {
70609
+ kind: "mutation",
70610
+ auth: "admin"
70611
+ }), method(object({
70545
70612
  location: StorageLocationSchema,
70546
70613
  relativePath: string()
70547
- }), _instanceof(Uint8Array)), method(object({
70614
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
70548
70615
  location: StorageLocationSchema,
70549
70616
  relativePath: string()
70550
- }), boolean()), method(object({
70617
+ }), boolean(), { auth: "admin" }), method(object({
70551
70618
  location: StorageLocationSchema,
70552
70619
  prefix: string().optional()
70553
- }), array(string()).readonly()), method(object({
70620
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
70554
70621
  location: StorageLocationSchema,
70555
70622
  relativePath: string()
70556
- }), _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" });
70623
+ }), _void(), {
70624
+ kind: "mutation",
70625
+ auth: "admin"
70626
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
70627
+ kind: "mutation",
70628
+ auth: "admin"
70629
+ }), method(WriteChunkInputSchema, _void(), {
70630
+ kind: "mutation",
70631
+ auth: "admin"
70632
+ }), method(FinalizeUploadInputSchema, _void(), {
70633
+ kind: "mutation",
70634
+ auth: "admin"
70635
+ }), method(AbortUploadInputSchema, _void(), {
70636
+ kind: "mutation",
70637
+ auth: "admin"
70638
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
70639
+ kind: "mutation",
70640
+ auth: "admin"
70641
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
70642
+ kind: "mutation",
70643
+ auth: "admin"
70644
+ });
70557
70645
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
70558
70646
  var ProfileSettingsSchemaBridge = unknown().nullable();
70559
70647
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -70811,7 +70899,8 @@ method(object({
70811
70899
  access: "create"
70812
70900
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
70813
70901
  kind: "mutation",
70814
- access: "view"
70902
+ access: "view",
70903
+ auth: "admin"
70815
70904
  }), method(object({
70816
70905
  /** Required — the user the assertion belongs to (verified). */
70817
70906
  userId: string(),
@@ -70819,10 +70908,12 @@ method(object({
70819
70908
  response: record(string(), unknown())
70820
70909
  }), object({ verified: boolean() }), {
70821
70910
  kind: "mutation",
70822
- access: "view"
70911
+ access: "view",
70912
+ auth: "admin"
70823
70913
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
70824
70914
  kind: "mutation",
70825
- access: "view"
70915
+ access: "view",
70916
+ auth: "admin"
70826
70917
  }), method(object({
70827
70918
  /** AuthenticationResponseJSON from the browser. */
70828
70919
  response: record(string(), unknown()) }), object({
@@ -70830,7 +70921,8 @@ response: record(string(), unknown()) }), object({
70830
70921
  userId: string().nullable()
70831
70922
  }), {
70832
70923
  kind: "mutation",
70833
- access: "view"
70924
+ access: "view",
70925
+ auth: "admin"
70834
70926
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
70835
70927
  userId: string(),
70836
70928
  credentialId: string()
@@ -71002,7 +71094,19 @@ var VectorStatsResultSchema = object({
71002
71094
  /** False when the backend ranks approximately. */
71003
71095
  exact: boolean()
71004
71096
  });
71005
- 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);
71097
+ method(VectorDeclareIndexInputSchema, _void(), {
71098
+ kind: "mutation",
71099
+ auth: "admin"
71100
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
71101
+ kind: "mutation",
71102
+ auth: "admin"
71103
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
71104
+ kind: "mutation",
71105
+ auth: "admin"
71106
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
71107
+ kind: "mutation",
71108
+ auth: "admin"
71109
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
71006
71110
  var ClipSchema = object({
71007
71111
  /** Opaque, provider-namespaced id. The default provider encodes the time
71008
71112
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -73480,7 +73584,27 @@ var MediaFileLiteSchema$1 = object({
73480
73584
  sizeBytes: number(),
73481
73585
  timestamp: number()
73482
73586
  });
73483
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
73587
+ method(object({
73588
+ /**
73589
+ * Inline {@link IdentitySchema.coverBase64} on every row.
73590
+ *
73591
+ * Default `false`, the same inversion `listRecentFaces` and
73592
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
73593
+ * why the burden belongs on the caller that WANTS the bytes). Measured
73594
+ * on the live hub the same day: four identities cost 40,979 B with the
73595
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
73596
+ * four times and the viewer holds at `staleTime: 30_000`.
73597
+ *
73598
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
73599
+ * the `event-media` plane serves that key `immutable` with an ETag.
73600
+ *
73601
+ * **This is an INPUT field, so it does not reach the addon until the
73602
+ * next train** — the hub router validates cap inputs against its own
73603
+ * compiled Zod and strips a key it does not know. Until then the
73604
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
73605
+ * is what ships, and the opt-in becomes reachable when the train lands.
73606
+ */
73607
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
73484
73608
  kind: "mutation",
73485
73609
  auth: "admin"
73486
73610
  }), method(object({
@@ -76370,8 +76494,10 @@ var PlateInfoSchema = object({
76370
76494
  keyFrameMediaKey: string().optional(),
76371
76495
  base64: string().optional(),
76372
76496
  /**
76373
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
76374
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
76497
+ * Same crop as a data-plane URL, always present when the plate has a stored
76498
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
76499
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
76500
+ * left at its `true` default.
76375
76501
  */
76376
76502
  cropUrl: string().optional()
76377
76503
  });
@@ -76391,14 +76517,34 @@ var PlateClusterSchema = object({
76391
76517
  });
76392
76518
  method(object({
76393
76519
  deviceId: number().int().optional(),
76394
- limit: number().int().positive().optional()
76520
+ limit: number().int().positive().optional(),
76521
+ /**
76522
+ * Inline the base64 crop on every row. Default `true` — the existing
76523
+ * behaviour, kept so no caller breaks.
76524
+ *
76525
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
76526
+ * Measured on the live hub at the 500 rows the Plates view asks for:
76527
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
76528
+ * metadata without them — and the browser then caches the images.
76529
+ *
76530
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
76531
+ * plates were the one gallery list left without it.
76532
+ *
76533
+ * **This is an INPUT field, so it does not reach the addon until the
76534
+ * next train.** The hub router validates cap inputs against its own
76535
+ * compiled Zod and strips a key it does not know. Until the train
76536
+ * ships, sending `false` is harmless and keeps the crops inline.
76537
+ */
76538
+ includeCrops: boolean().optional()
76395
76539
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
76396
76540
  deviceId: number().int(),
76397
76541
  trackId: string()
76398
76542
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
76399
76543
  text: string().min(1),
76400
76544
  maxDistance: number().int().min(0).optional(),
76401
- limit: number().int().positive().optional()
76545
+ limit: number().int().positive().optional(),
76546
+ /** See `listPlates.includeCrops`. Default `true`. */
76547
+ includeCrops: boolean().optional()
76402
76548
  }), array(PlateInfoSchema).readonly()), method(object({
76403
76549
  maxDistance: number().int().min(0).optional(),
76404
76550
  minClusterSize: number().int().min(2).optional(),
@@ -76412,7 +76558,13 @@ method(object({
76412
76558
  }), method(object({ plateId: string() }), _void(), {
76413
76559
  kind: "mutation",
76414
76560
  auth: "admin"
76415
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
76561
+ }), method(object({
76562
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
76563
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
76564
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
76565
+ * INPUT field: stripped by the hub router until the train ships, which
76566
+ * resolves to `false` and is exactly the intended default. */
76567
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
76416
76568
  kind: "mutation",
76417
76569
  auth: "admin"
76418
76570
  }), method(object({
@@ -83673,6 +83825,12 @@ Object.freeze({
83673
83825
  addonId: null,
83674
83826
  access: "create"
83675
83827
  },
83828
+ "pipelineAnalytics.cancelRelocateMedia": {
83829
+ capName: "pipeline-analytics",
83830
+ capScope: "device",
83831
+ addonId: null,
83832
+ access: "create"
83833
+ },
83676
83834
  "pipelineAnalytics.cancelStorageMigrationMove": {
83677
83835
  capName: "pipeline-analytics",
83678
83836
  capScope: "device",
@@ -83847,6 +84005,12 @@ Object.freeze({
83847
84005
  addonId: null,
83848
84006
  access: "view"
83849
84007
  },
84008
+ "pipelineAnalytics.listRelocateMediaJobs": {
84009
+ capName: "pipeline-analytics",
84010
+ capScope: "device",
84011
+ addonId: null,
84012
+ access: "view"
84013
+ },
83850
84014
  "pipelineAnalytics.listRetrainAnnotations": {
83851
84015
  capName: "pipeline-analytics",
83852
84016
  capScope: "device",
@@ -83925,6 +84089,12 @@ Object.freeze({
83925
84089
  addonId: null,
83926
84090
  access: "create"
83927
84091
  },
84092
+ "pipelineAnalytics.relocateMedia": {
84093
+ capName: "pipeline-analytics",
84094
+ capScope: "device",
84095
+ addonId: null,
84096
+ access: "create"
84097
+ },
83928
84098
  "pipelineAnalytics.restageRetrainTrack": {
83929
84099
  capName: "pipeline-analytics",
83930
84100
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreame",
3
- "version": "0.2.28",
3
+ "version": "0.2.29",
4
4
  "description": "Dreame robot-vacuum / lawn-mower device-provider addon for CamStack — wraps the @apocaliss92/nodedreame Dreamehome cloud client",
5
5
  "keywords": [
6
6
  "camstack",