@camstack/addon-import-alexa 0.2.27 → 0.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +249 -79
  2. package/dist/addon.mjs +249 -79
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -6669,7 +6669,7 @@ function method(input, output, options) {
6669
6669
  input,
6670
6670
  output,
6671
6671
  kind: options?.kind ?? "query",
6672
- auth: options?.auth ?? "protected",
6672
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6673
6673
  ...options?.access !== void 0 ? { access: options.access } : {},
6674
6674
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6675
6675
  timeoutMs: options?.timeoutMs
@@ -6693,7 +6693,7 @@ function event(data) {
6693
6693
  }
6694
6694
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6695
6695
  var VersionOutputSchema$1 = object({ version: string() });
6696
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6696
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6697
6697
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6698
6698
  DeviceType["Camera"] = "camera";
6699
6699
  DeviceType["Hub"] = "hub";
@@ -7014,7 +7014,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7014
7014
  }({});
7015
7015
  var StaticDirOutputSchema = object({ staticDir: string() });
7016
7016
  var VersionOutputSchema = object({ version: string() });
7017
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7017
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7018
7018
  /**
7019
7019
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7020
7020
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7759,24 +7759,6 @@ var RecordingRetentionSchema = object({
7759
7759
  maxSizeGb: number().min(0).optional()
7760
7760
  });
7761
7761
  /**
7762
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7763
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7764
- * previews at. Five graduated steps; absent on a config = `standard` (the
7765
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7766
- *
7767
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7768
- * Each window's index sidecar carries its own tile dims, so a camera whose
7769
- * preset changed over time renders every historical window at the dims it was
7770
- * written with.
7771
- */
7772
- var ScrubThumbnailPresetSchema = _enum([
7773
- "minimal",
7774
- "low",
7775
- "standard",
7776
- "high",
7777
- "max"
7778
- ]);
7779
- /**
7780
7762
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7781
7763
  *
7782
7764
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7784,7 +7766,11 @@ var ScrubThumbnailPresetSchema = _enum([
7784
7766
  * other field is a storage knob (profiles, segment length, retention, scrub).
7785
7767
  *
7786
7768
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7787
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7769
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7770
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7771
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7772
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7773
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7788
7774
  * A stale caller must fail loudly — silently stripping its legacy intent would
7789
7775
  * persist a band-less config, i.e. silently stop recording the camera.
7790
7776
  */
@@ -7807,14 +7793,7 @@ var RecordingConfigSchema = object({
7807
7793
  * "off" is the absence of a covering band, never a band value.
7808
7794
  */
7809
7795
  bands: array(RecordingBandSchema).default([]),
7810
- retention: RecordingRetentionSchema.optional(),
7811
- /**
7812
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7813
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7814
- * windows only — existing sheets are immutable, and each window's index
7815
- * carries its own tile dims so mixed-preset history renders correctly.
7816
- */
7817
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7796
+ retention: RecordingRetentionSchema.optional()
7818
7797
  }).strict();
7819
7798
  /**
7820
7799
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7890,10 +7869,11 @@ var RelocateFootageInputSchema = object({
7890
7869
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7891
7870
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7892
7871
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7893
- var StorageMigrationMediaMoveInputSchema = object({
7872
+ var RelocateMediaInputSchema = object({
7894
7873
  toLocationId: string(),
7895
7874
  throttleMbps: number().min(1).max(1e3).optional()
7896
- }).extend({ leaseId: string().min(1) });
7875
+ });
7876
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7897
7877
  /** The independently selectable logical storage classes. `recordings`
7898
7878
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7899
7879
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8188,7 +8168,26 @@ var LabelDefinitionSchema = object({
8188
8168
  description: string().optional(),
8189
8169
  icon: string().optional()
8190
8170
  });
8191
- var ClassMapDefinitionSchema = object({
8171
+ /**
8172
+ * Wire schema for a per-model CATALOG classMap override
8173
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8174
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8175
+ * detection pipeline executor actually routes.
8176
+ *
8177
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8178
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8179
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8180
+ * enum) — the two used to share the name `ClassMapDefinition`/
8181
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8182
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8183
+ * are not: it is two different concepts colliding on a name. Keep this type
8184
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8185
+ * would either narrow every `ClassMapDefinition` consumer to the four
8186
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8187
+ * schema exists for (see the "rejects a classMap whose target is not a
8188
+ * detection macro" test in `model-catalog-schema.test.ts`).
8189
+ */
8190
+ var DetectionCatalogClassMapSchema = object({
8192
8191
  mapping: record(string(), _enum([
8193
8192
  "person",
8194
8193
  "vehicle",
@@ -8393,7 +8392,7 @@ var ModelCatalogEntrySchema = object({
8393
8392
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8394
8393
  * labels already ARE the CamStack macros (Scrypted identity map).
8395
8394
  */
8396
- classMap: ClassMapDefinitionSchema.optional()
8395
+ classMap: DetectionCatalogClassMapSchema.optional()
8397
8396
  });
8398
8397
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8399
8398
  format: literal("openvino"),
@@ -8423,7 +8422,7 @@ var ModelConvertMetadataSchema = object({
8423
8422
  "segmentation"
8424
8423
  ]),
8425
8424
  faceAlignment: boolean().optional(),
8426
- classMap: ClassMapDefinitionSchema.optional()
8425
+ classMap: DetectionCatalogClassMapSchema.optional()
8427
8426
  });
8428
8427
  var ConvertResultSchema = object({
8429
8428
  entry: ModelCatalogEntrySchema,
@@ -9286,7 +9285,7 @@ var AddonPageDeclarationSchema = object({
9286
9285
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9287
9286
  sectionLabel: string().optional()
9288
9287
  });
9289
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9288
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9290
9289
  var AddonHttpRouteSchema = object({
9291
9290
  method: _enum([
9292
9291
  "GET",
@@ -9540,7 +9539,7 @@ var WidgetMetadataSchema = object({
9540
9539
  defaultColumns: number().int().min(1).max(12).default(6),
9541
9540
  defaultRows: number().int().min(1).max(12).default(1)
9542
9541
  });
9543
- method(_void(), array(WidgetMetadataSchema).readonly());
9542
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9544
9543
  /**
9545
9544
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9546
9545
  * 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
@@ -12727,7 +12771,7 @@ method(object({
12727
12771
  crop: _instanceof(Uint8Array),
12728
12772
  width: number(),
12729
12773
  height: number()
12730
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12774
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12731
12775
  /**
12732
12776
  * filesystem-browse — per-node capability for browsing the node's local
12733
12777
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13020,19 +13064,22 @@ method(LlmGenerateBaseInputSchema.extend({
13020
13064
  runtime: ManagedRuntimeConfigSchema,
13021
13065
  /** The managed profile's timeout, threaded by the hub provider. */
13022
13066
  timeoutMs: number().int().positive().optional()
13023
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13067
+ }), LlmGenerateResultSchema, {
13068
+ kind: "mutation",
13069
+ auth: "admin"
13070
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13024
13071
  kind: "mutation",
13025
13072
  auth: "admin"
13026
13073
  }), method(object({}), _void(), {
13027
13074
  kind: "mutation",
13028
13075
  auth: "admin"
13029
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13076
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13030
13077
  kind: "mutation",
13031
13078
  auth: "admin"
13032
13079
  }), method(object({ file: string() }), _void(), {
13033
13080
  kind: "mutation",
13034
13081
  auth: "admin"
13035
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13082
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13036
13083
  /**
13037
13084
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13038
13085
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16543,7 +16590,7 @@ var OauthIntegrationDescriptorSchema = object({
16543
16590
  */
16544
16591
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16545
16592
  });
16546
- method(_void(), OauthIntegrationDescriptorSchema);
16593
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16547
16594
  /**
16548
16595
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16549
16596
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17738,6 +17785,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17738
17785
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17739
17786
  kind: "mutation",
17740
17787
  auth: "admin"
17788
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17789
+ kind: "mutation",
17790
+ auth: "admin"
17791
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17792
+ kind: "query",
17793
+ auth: "admin"
17794
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17795
+ kind: "mutation",
17796
+ auth: "admin"
17741
17797
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17742
17798
  kind: "query",
17743
17799
  auth: "admin"
@@ -17892,6 +17948,11 @@ object({
17892
17948
  "jpeg"
17893
17949
  ])
17894
17950
  });
17951
+ /**
17952
+ * Process-local frame identity. It is serializable so it can ride an in-process
17953
+ * capability call, but `registryId` deliberately prevents resolution in any
17954
+ * other process or execution group.
17955
+ */
17895
17956
  var FrameRefSchema = object({
17896
17957
  registryId: string().min(1),
17897
17958
  id: string().min(1),
@@ -20097,7 +20158,7 @@ method(object({
20097
20158
  * linking rather than produce an eternal token.
20098
20159
  */
20099
20160
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20100
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20161
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20101
20162
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20102
20163
  providerId: string().min(1),
20103
20164
  displayName: string().min(1),
@@ -20192,10 +20253,13 @@ var EvictResultSchema = object({
20192
20253
  /** True when the provider has nothing left it is willing to drop on this location. */
20193
20254
  exhausted: boolean()
20194
20255
  });
20195
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20256
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20196
20257
  locationId: string(),
20197
20258
  targetBytes: number().int().positive()
20198
- }), EvictResultSchema, { kind: "mutation" });
20259
+ }), EvictResultSchema, {
20260
+ kind: "mutation",
20261
+ auth: "admin"
20262
+ });
20199
20263
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20200
20264
  kind: "mutation",
20201
20265
  auth: "admin"
@@ -20255,26 +20319,50 @@ var ReadChunkInputSchema = object({
20255
20319
  length: number()
20256
20320
  });
20257
20321
  var EndDownloadInputSchema = object({ downloadId: string() });
20258
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20322
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20259
20323
  location: StorageLocationSchema,
20260
20324
  relativePath: string()
20261
- }), string()), method(object({
20325
+ }), string(), { auth: "admin" }), method(object({
20262
20326
  location: StorageLocationSchema,
20263
20327
  relativePath: string(),
20264
20328
  data: _instanceof(Uint8Array)
20265
- }), _void(), { kind: "mutation" }), method(object({
20329
+ }), _void(), {
20330
+ kind: "mutation",
20331
+ auth: "admin"
20332
+ }), method(object({
20266
20333
  location: StorageLocationSchema,
20267
20334
  relativePath: string()
20268
- }), _instanceof(Uint8Array)), method(object({
20335
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20269
20336
  location: StorageLocationSchema,
20270
20337
  relativePath: string()
20271
- }), boolean()), method(object({
20338
+ }), boolean(), { auth: "admin" }), method(object({
20272
20339
  location: StorageLocationSchema,
20273
20340
  prefix: string().optional()
20274
- }), array(string()).readonly()), method(object({
20341
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20275
20342
  location: StorageLocationSchema,
20276
20343
  relativePath: string()
20277
- }), _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" });
20344
+ }), _void(), {
20345
+ kind: "mutation",
20346
+ auth: "admin"
20347
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20348
+ kind: "mutation",
20349
+ auth: "admin"
20350
+ }), method(WriteChunkInputSchema, _void(), {
20351
+ kind: "mutation",
20352
+ auth: "admin"
20353
+ }), method(FinalizeUploadInputSchema, _void(), {
20354
+ kind: "mutation",
20355
+ auth: "admin"
20356
+ }), method(AbortUploadInputSchema, _void(), {
20357
+ kind: "mutation",
20358
+ auth: "admin"
20359
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20360
+ kind: "mutation",
20361
+ auth: "admin"
20362
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20363
+ kind: "mutation",
20364
+ auth: "admin"
20365
+ });
20278
20366
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20279
20367
  var ProfileSettingsSchemaBridge = unknown().nullable();
20280
20368
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20532,7 +20620,8 @@ method(object({
20532
20620
  access: "create"
20533
20621
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20534
20622
  kind: "mutation",
20535
- access: "view"
20623
+ access: "view",
20624
+ auth: "admin"
20536
20625
  }), method(object({
20537
20626
  /** Required — the user the assertion belongs to (verified). */
20538
20627
  userId: string(),
@@ -20540,10 +20629,12 @@ method(object({
20540
20629
  response: record(string(), unknown())
20541
20630
  }), object({ verified: boolean() }), {
20542
20631
  kind: "mutation",
20543
- access: "view"
20632
+ access: "view",
20633
+ auth: "admin"
20544
20634
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20545
20635
  kind: "mutation",
20546
- access: "view"
20636
+ access: "view",
20637
+ auth: "admin"
20547
20638
  }), method(object({
20548
20639
  /** AuthenticationResponseJSON from the browser. */
20549
20640
  response: record(string(), unknown()) }), object({
@@ -20551,7 +20642,8 @@ response: record(string(), unknown()) }), object({
20551
20642
  userId: string().nullable()
20552
20643
  }), {
20553
20644
  kind: "mutation",
20554
- access: "view"
20645
+ access: "view",
20646
+ auth: "admin"
20555
20647
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20556
20648
  userId: string(),
20557
20649
  credentialId: string()
@@ -20723,7 +20815,19 @@ var VectorStatsResultSchema = object({
20723
20815
  /** False when the backend ranks approximately. */
20724
20816
  exact: boolean()
20725
20817
  });
20726
- 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);
20818
+ method(VectorDeclareIndexInputSchema, _void(), {
20819
+ kind: "mutation",
20820
+ auth: "admin"
20821
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20822
+ kind: "mutation",
20823
+ auth: "admin"
20824
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20825
+ kind: "mutation",
20826
+ auth: "admin"
20827
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20828
+ kind: "mutation",
20829
+ auth: "admin"
20830
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20727
20831
  var ClipSchema = object({
20728
20832
  /** Opaque, provider-namespaced id. The default provider encodes the time
20729
20833
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23193,7 +23297,27 @@ var MediaFileLiteSchema$1 = object({
23193
23297
  sizeBytes: number(),
23194
23298
  timestamp: number()
23195
23299
  });
23196
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23300
+ method(object({
23301
+ /**
23302
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23303
+ *
23304
+ * Default `false`, the same inversion `listRecentFaces` and
23305
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23306
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23307
+ * on the live hub the same day: four identities cost 40,979 B with the
23308
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23309
+ * four times and the viewer holds at `staleTime: 30_000`.
23310
+ *
23311
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23312
+ * the `event-media` plane serves that key `immutable` with an ETag.
23313
+ *
23314
+ * **This is an INPUT field, so it does not reach the addon until the
23315
+ * next train** — the hub router validates cap inputs against its own
23316
+ * compiled Zod and strips a key it does not know. Until then the
23317
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23318
+ * is what ships, and the opt-in becomes reachable when the train lands.
23319
+ */
23320
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23197
23321
  kind: "mutation",
23198
23322
  auth: "admin"
23199
23323
  }), method(object({
@@ -26083,8 +26207,10 @@ var PlateInfoSchema = object({
26083
26207
  keyFrameMediaKey: string().optional(),
26084
26208
  base64: string().optional(),
26085
26209
  /**
26086
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26087
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26210
+ * Same crop as a data-plane URL, always present when the plate has a stored
26211
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26212
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26213
+ * left at its `true` default.
26088
26214
  */
26089
26215
  cropUrl: string().optional()
26090
26216
  });
@@ -26104,14 +26230,34 @@ var PlateClusterSchema = object({
26104
26230
  });
26105
26231
  method(object({
26106
26232
  deviceId: number().int().optional(),
26107
- limit: number().int().positive().optional()
26233
+ limit: number().int().positive().optional(),
26234
+ /**
26235
+ * Inline the base64 crop on every row. Default `true` — the existing
26236
+ * behaviour, kept so no caller breaks.
26237
+ *
26238
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26239
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26240
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26241
+ * metadata without them — and the browser then caches the images.
26242
+ *
26243
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26244
+ * plates were the one gallery list left without it.
26245
+ *
26246
+ * **This is an INPUT field, so it does not reach the addon until the
26247
+ * next train.** The hub router validates cap inputs against its own
26248
+ * compiled Zod and strips a key it does not know. Until the train
26249
+ * ships, sending `false` is harmless and keeps the crops inline.
26250
+ */
26251
+ includeCrops: boolean().optional()
26108
26252
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26109
26253
  deviceId: number().int(),
26110
26254
  trackId: string()
26111
26255
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26112
26256
  text: string().min(1),
26113
26257
  maxDistance: number().int().min(0).optional(),
26114
- limit: number().int().positive().optional()
26258
+ limit: number().int().positive().optional(),
26259
+ /** See `listPlates.includeCrops`. Default `true`. */
26260
+ includeCrops: boolean().optional()
26115
26261
  }), array(PlateInfoSchema).readonly()), method(object({
26116
26262
  maxDistance: number().int().min(0).optional(),
26117
26263
  minClusterSize: number().int().min(2).optional(),
@@ -26125,7 +26271,13 @@ method(object({
26125
26271
  }), method(object({ plateId: string() }), _void(), {
26126
26272
  kind: "mutation",
26127
26273
  auth: "admin"
26128
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26274
+ }), method(object({
26275
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26276
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26277
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26278
+ * INPUT field: stripped by the hub router until the train ships, which
26279
+ * resolves to `false` and is exactly the intended default. */
26280
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26129
26281
  kind: "mutation",
26130
26282
  auth: "admin"
26131
26283
  }), method(object({
@@ -33386,6 +33538,12 @@ Object.freeze({
33386
33538
  addonId: null,
33387
33539
  access: "create"
33388
33540
  },
33541
+ "pipelineAnalytics.cancelRelocateMedia": {
33542
+ capName: "pipeline-analytics",
33543
+ capScope: "device",
33544
+ addonId: null,
33545
+ access: "create"
33546
+ },
33389
33547
  "pipelineAnalytics.cancelStorageMigrationMove": {
33390
33548
  capName: "pipeline-analytics",
33391
33549
  capScope: "device",
@@ -33560,6 +33718,12 @@ Object.freeze({
33560
33718
  addonId: null,
33561
33719
  access: "view"
33562
33720
  },
33721
+ "pipelineAnalytics.listRelocateMediaJobs": {
33722
+ capName: "pipeline-analytics",
33723
+ capScope: "device",
33724
+ addonId: null,
33725
+ access: "view"
33726
+ },
33563
33727
  "pipelineAnalytics.listRetrainAnnotations": {
33564
33728
  capName: "pipeline-analytics",
33565
33729
  capScope: "device",
@@ -33638,6 +33802,12 @@ Object.freeze({
33638
33802
  addonId: null,
33639
33803
  access: "create"
33640
33804
  },
33805
+ "pipelineAnalytics.relocateMedia": {
33806
+ capName: "pipeline-analytics",
33807
+ capScope: "device",
33808
+ addonId: null,
33809
+ access: "create"
33810
+ },
33641
33811
  "pipelineAnalytics.restageRetrainTrack": {
33642
33812
  capName: "pipeline-analytics",
33643
33813
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6669,7 +6669,7 @@ function method(input, output, options) {
6669
6669
  input,
6670
6670
  output,
6671
6671
  kind: options?.kind ?? "query",
6672
- auth: options?.auth ?? "protected",
6672
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6673
6673
  ...options?.access !== void 0 ? { access: options.access } : {},
6674
6674
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6675
6675
  timeoutMs: options?.timeoutMs
@@ -6693,7 +6693,7 @@ function event(data) {
6693
6693
  }
6694
6694
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6695
6695
  var VersionOutputSchema$1 = object({ version: string() });
6696
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6696
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6697
6697
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6698
6698
  DeviceType["Camera"] = "camera";
6699
6699
  DeviceType["Hub"] = "hub";
@@ -7014,7 +7014,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7014
7014
  }({});
7015
7015
  var StaticDirOutputSchema = object({ staticDir: string() });
7016
7016
  var VersionOutputSchema = object({ version: string() });
7017
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7017
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7018
7018
  /**
7019
7019
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7020
7020
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7759,24 +7759,6 @@ var RecordingRetentionSchema = object({
7759
7759
  maxSizeGb: number().min(0).optional()
7760
7760
  });
7761
7761
  /**
7762
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7763
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7764
- * previews at. Five graduated steps; absent on a config = `standard` (the
7765
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7766
- *
7767
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7768
- * Each window's index sidecar carries its own tile dims, so a camera whose
7769
- * preset changed over time renders every historical window at the dims it was
7770
- * written with.
7771
- */
7772
- var ScrubThumbnailPresetSchema = _enum([
7773
- "minimal",
7774
- "low",
7775
- "standard",
7776
- "high",
7777
- "max"
7778
- ]);
7779
- /**
7780
7762
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7781
7763
  *
7782
7764
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7784,7 +7766,11 @@ var ScrubThumbnailPresetSchema = _enum([
7784
7766
  * other field is a storage knob (profiles, segment length, retention, scrub).
7785
7767
  *
7786
7768
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7787
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7769
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7770
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7771
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7772
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7773
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7788
7774
  * A stale caller must fail loudly — silently stripping its legacy intent would
7789
7775
  * persist a band-less config, i.e. silently stop recording the camera.
7790
7776
  */
@@ -7807,14 +7793,7 @@ var RecordingConfigSchema = object({
7807
7793
  * "off" is the absence of a covering band, never a band value.
7808
7794
  */
7809
7795
  bands: array(RecordingBandSchema).default([]),
7810
- retention: RecordingRetentionSchema.optional(),
7811
- /**
7812
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7813
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7814
- * windows only — existing sheets are immutable, and each window's index
7815
- * carries its own tile dims so mixed-preset history renders correctly.
7816
- */
7817
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7796
+ retention: RecordingRetentionSchema.optional()
7818
7797
  }).strict();
7819
7798
  /**
7820
7799
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7890,10 +7869,11 @@ var RelocateFootageInputSchema = object({
7890
7869
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7891
7870
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7892
7871
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7893
- var StorageMigrationMediaMoveInputSchema = object({
7872
+ var RelocateMediaInputSchema = object({
7894
7873
  toLocationId: string(),
7895
7874
  throttleMbps: number().min(1).max(1e3).optional()
7896
- }).extend({ leaseId: string().min(1) });
7875
+ });
7876
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7897
7877
  /** The independently selectable logical storage classes. `recordings`
7898
7878
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7899
7879
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8188,7 +8168,26 @@ var LabelDefinitionSchema = object({
8188
8168
  description: string().optional(),
8189
8169
  icon: string().optional()
8190
8170
  });
8191
- var ClassMapDefinitionSchema = object({
8171
+ /**
8172
+ * Wire schema for a per-model CATALOG classMap override
8173
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8174
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8175
+ * detection pipeline executor actually routes.
8176
+ *
8177
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8178
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8179
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8180
+ * enum) — the two used to share the name `ClassMapDefinition`/
8181
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8182
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8183
+ * are not: it is two different concepts colliding on a name. Keep this type
8184
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8185
+ * would either narrow every `ClassMapDefinition` consumer to the four
8186
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8187
+ * schema exists for (see the "rejects a classMap whose target is not a
8188
+ * detection macro" test in `model-catalog-schema.test.ts`).
8189
+ */
8190
+ var DetectionCatalogClassMapSchema = object({
8192
8191
  mapping: record(string(), _enum([
8193
8192
  "person",
8194
8193
  "vehicle",
@@ -8393,7 +8392,7 @@ var ModelCatalogEntrySchema = object({
8393
8392
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8394
8393
  * labels already ARE the CamStack macros (Scrypted identity map).
8395
8394
  */
8396
- classMap: ClassMapDefinitionSchema.optional()
8395
+ classMap: DetectionCatalogClassMapSchema.optional()
8397
8396
  });
8398
8397
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8399
8398
  format: literal("openvino"),
@@ -8423,7 +8422,7 @@ var ModelConvertMetadataSchema = object({
8423
8422
  "segmentation"
8424
8423
  ]),
8425
8424
  faceAlignment: boolean().optional(),
8426
- classMap: ClassMapDefinitionSchema.optional()
8425
+ classMap: DetectionCatalogClassMapSchema.optional()
8427
8426
  });
8428
8427
  var ConvertResultSchema = object({
8429
8428
  entry: ModelCatalogEntrySchema,
@@ -9286,7 +9285,7 @@ var AddonPageDeclarationSchema = object({
9286
9285
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9287
9286
  sectionLabel: string().optional()
9288
9287
  });
9289
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9288
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9290
9289
  var AddonHttpRouteSchema = object({
9291
9290
  method: _enum([
9292
9291
  "GET",
@@ -9540,7 +9539,7 @@ var WidgetMetadataSchema = object({
9540
9539
  defaultColumns: number().int().min(1).max(12).default(6),
9541
9540
  defaultRows: number().int().min(1).max(12).default(1)
9542
9541
  });
9543
- method(_void(), array(WidgetMetadataSchema).readonly());
9542
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9544
9543
  /**
9545
9544
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9546
9545
  * 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
@@ -12727,7 +12771,7 @@ method(object({
12727
12771
  crop: _instanceof(Uint8Array),
12728
12772
  width: number(),
12729
12773
  height: number()
12730
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12774
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12731
12775
  /**
12732
12776
  * filesystem-browse — per-node capability for browsing the node's local
12733
12777
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13020,19 +13064,22 @@ method(LlmGenerateBaseInputSchema.extend({
13020
13064
  runtime: ManagedRuntimeConfigSchema,
13021
13065
  /** The managed profile's timeout, threaded by the hub provider. */
13022
13066
  timeoutMs: number().int().positive().optional()
13023
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13067
+ }), LlmGenerateResultSchema, {
13068
+ kind: "mutation",
13069
+ auth: "admin"
13070
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13024
13071
  kind: "mutation",
13025
13072
  auth: "admin"
13026
13073
  }), method(object({}), _void(), {
13027
13074
  kind: "mutation",
13028
13075
  auth: "admin"
13029
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13076
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13030
13077
  kind: "mutation",
13031
13078
  auth: "admin"
13032
13079
  }), method(object({ file: string() }), _void(), {
13033
13080
  kind: "mutation",
13034
13081
  auth: "admin"
13035
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13082
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13036
13083
  /**
13037
13084
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13038
13085
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16543,7 +16590,7 @@ var OauthIntegrationDescriptorSchema = object({
16543
16590
  */
16544
16591
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16545
16592
  });
16546
- method(_void(), OauthIntegrationDescriptorSchema);
16593
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16547
16594
  /**
16548
16595
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16549
16596
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17738,6 +17785,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17738
17785
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17739
17786
  kind: "mutation",
17740
17787
  auth: "admin"
17788
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17789
+ kind: "mutation",
17790
+ auth: "admin"
17791
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17792
+ kind: "query",
17793
+ auth: "admin"
17794
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17795
+ kind: "mutation",
17796
+ auth: "admin"
17741
17797
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17742
17798
  kind: "query",
17743
17799
  auth: "admin"
@@ -17892,6 +17948,11 @@ object({
17892
17948
  "jpeg"
17893
17949
  ])
17894
17950
  });
17951
+ /**
17952
+ * Process-local frame identity. It is serializable so it can ride an in-process
17953
+ * capability call, but `registryId` deliberately prevents resolution in any
17954
+ * other process or execution group.
17955
+ */
17895
17956
  var FrameRefSchema = object({
17896
17957
  registryId: string().min(1),
17897
17958
  id: string().min(1),
@@ -20097,7 +20158,7 @@ method(object({
20097
20158
  * linking rather than produce an eternal token.
20098
20159
  */
20099
20160
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20100
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20161
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20101
20162
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20102
20163
  providerId: string().min(1),
20103
20164
  displayName: string().min(1),
@@ -20192,10 +20253,13 @@ var EvictResultSchema = object({
20192
20253
  /** True when the provider has nothing left it is willing to drop on this location. */
20193
20254
  exhausted: boolean()
20194
20255
  });
20195
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20256
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20196
20257
  locationId: string(),
20197
20258
  targetBytes: number().int().positive()
20198
- }), EvictResultSchema, { kind: "mutation" });
20259
+ }), EvictResultSchema, {
20260
+ kind: "mutation",
20261
+ auth: "admin"
20262
+ });
20199
20263
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20200
20264
  kind: "mutation",
20201
20265
  auth: "admin"
@@ -20255,26 +20319,50 @@ var ReadChunkInputSchema = object({
20255
20319
  length: number()
20256
20320
  });
20257
20321
  var EndDownloadInputSchema = object({ downloadId: string() });
20258
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20322
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20259
20323
  location: StorageLocationSchema,
20260
20324
  relativePath: string()
20261
- }), string()), method(object({
20325
+ }), string(), { auth: "admin" }), method(object({
20262
20326
  location: StorageLocationSchema,
20263
20327
  relativePath: string(),
20264
20328
  data: _instanceof(Uint8Array)
20265
- }), _void(), { kind: "mutation" }), method(object({
20329
+ }), _void(), {
20330
+ kind: "mutation",
20331
+ auth: "admin"
20332
+ }), method(object({
20266
20333
  location: StorageLocationSchema,
20267
20334
  relativePath: string()
20268
- }), _instanceof(Uint8Array)), method(object({
20335
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20269
20336
  location: StorageLocationSchema,
20270
20337
  relativePath: string()
20271
- }), boolean()), method(object({
20338
+ }), boolean(), { auth: "admin" }), method(object({
20272
20339
  location: StorageLocationSchema,
20273
20340
  prefix: string().optional()
20274
- }), array(string()).readonly()), method(object({
20341
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20275
20342
  location: StorageLocationSchema,
20276
20343
  relativePath: string()
20277
- }), _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" });
20344
+ }), _void(), {
20345
+ kind: "mutation",
20346
+ auth: "admin"
20347
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20348
+ kind: "mutation",
20349
+ auth: "admin"
20350
+ }), method(WriteChunkInputSchema, _void(), {
20351
+ kind: "mutation",
20352
+ auth: "admin"
20353
+ }), method(FinalizeUploadInputSchema, _void(), {
20354
+ kind: "mutation",
20355
+ auth: "admin"
20356
+ }), method(AbortUploadInputSchema, _void(), {
20357
+ kind: "mutation",
20358
+ auth: "admin"
20359
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20360
+ kind: "mutation",
20361
+ auth: "admin"
20362
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20363
+ kind: "mutation",
20364
+ auth: "admin"
20365
+ });
20278
20366
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20279
20367
  var ProfileSettingsSchemaBridge = unknown().nullable();
20280
20368
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20532,7 +20620,8 @@ method(object({
20532
20620
  access: "create"
20533
20621
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20534
20622
  kind: "mutation",
20535
- access: "view"
20623
+ access: "view",
20624
+ auth: "admin"
20536
20625
  }), method(object({
20537
20626
  /** Required — the user the assertion belongs to (verified). */
20538
20627
  userId: string(),
@@ -20540,10 +20629,12 @@ method(object({
20540
20629
  response: record(string(), unknown())
20541
20630
  }), object({ verified: boolean() }), {
20542
20631
  kind: "mutation",
20543
- access: "view"
20632
+ access: "view",
20633
+ auth: "admin"
20544
20634
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20545
20635
  kind: "mutation",
20546
- access: "view"
20636
+ access: "view",
20637
+ auth: "admin"
20547
20638
  }), method(object({
20548
20639
  /** AuthenticationResponseJSON from the browser. */
20549
20640
  response: record(string(), unknown()) }), object({
@@ -20551,7 +20642,8 @@ response: record(string(), unknown()) }), object({
20551
20642
  userId: string().nullable()
20552
20643
  }), {
20553
20644
  kind: "mutation",
20554
- access: "view"
20645
+ access: "view",
20646
+ auth: "admin"
20555
20647
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20556
20648
  userId: string(),
20557
20649
  credentialId: string()
@@ -20723,7 +20815,19 @@ var VectorStatsResultSchema = object({
20723
20815
  /** False when the backend ranks approximately. */
20724
20816
  exact: boolean()
20725
20817
  });
20726
- 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);
20818
+ method(VectorDeclareIndexInputSchema, _void(), {
20819
+ kind: "mutation",
20820
+ auth: "admin"
20821
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20822
+ kind: "mutation",
20823
+ auth: "admin"
20824
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20825
+ kind: "mutation",
20826
+ auth: "admin"
20827
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20828
+ kind: "mutation",
20829
+ auth: "admin"
20830
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20727
20831
  var ClipSchema = object({
20728
20832
  /** Opaque, provider-namespaced id. The default provider encodes the time
20729
20833
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23193,7 +23297,27 @@ var MediaFileLiteSchema$1 = object({
23193
23297
  sizeBytes: number(),
23194
23298
  timestamp: number()
23195
23299
  });
23196
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23300
+ method(object({
23301
+ /**
23302
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23303
+ *
23304
+ * Default `false`, the same inversion `listRecentFaces` and
23305
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23306
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23307
+ * on the live hub the same day: four identities cost 40,979 B with the
23308
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23309
+ * four times and the viewer holds at `staleTime: 30_000`.
23310
+ *
23311
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23312
+ * the `event-media` plane serves that key `immutable` with an ETag.
23313
+ *
23314
+ * **This is an INPUT field, so it does not reach the addon until the
23315
+ * next train** — the hub router validates cap inputs against its own
23316
+ * compiled Zod and strips a key it does not know. Until then the
23317
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23318
+ * is what ships, and the opt-in becomes reachable when the train lands.
23319
+ */
23320
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23197
23321
  kind: "mutation",
23198
23322
  auth: "admin"
23199
23323
  }), method(object({
@@ -26083,8 +26207,10 @@ var PlateInfoSchema = object({
26083
26207
  keyFrameMediaKey: string().optional(),
26084
26208
  base64: string().optional(),
26085
26209
  /**
26086
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26087
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26210
+ * Same crop as a data-plane URL, always present when the plate has a stored
26211
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26212
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26213
+ * left at its `true` default.
26088
26214
  */
26089
26215
  cropUrl: string().optional()
26090
26216
  });
@@ -26104,14 +26230,34 @@ var PlateClusterSchema = object({
26104
26230
  });
26105
26231
  method(object({
26106
26232
  deviceId: number().int().optional(),
26107
- limit: number().int().positive().optional()
26233
+ limit: number().int().positive().optional(),
26234
+ /**
26235
+ * Inline the base64 crop on every row. Default `true` — the existing
26236
+ * behaviour, kept so no caller breaks.
26237
+ *
26238
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26239
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26240
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26241
+ * metadata without them — and the browser then caches the images.
26242
+ *
26243
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26244
+ * plates were the one gallery list left without it.
26245
+ *
26246
+ * **This is an INPUT field, so it does not reach the addon until the
26247
+ * next train.** The hub router validates cap inputs against its own
26248
+ * compiled Zod and strips a key it does not know. Until the train
26249
+ * ships, sending `false` is harmless and keeps the crops inline.
26250
+ */
26251
+ includeCrops: boolean().optional()
26108
26252
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26109
26253
  deviceId: number().int(),
26110
26254
  trackId: string()
26111
26255
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26112
26256
  text: string().min(1),
26113
26257
  maxDistance: number().int().min(0).optional(),
26114
- limit: number().int().positive().optional()
26258
+ limit: number().int().positive().optional(),
26259
+ /** See `listPlates.includeCrops`. Default `true`. */
26260
+ includeCrops: boolean().optional()
26115
26261
  }), array(PlateInfoSchema).readonly()), method(object({
26116
26262
  maxDistance: number().int().min(0).optional(),
26117
26263
  minClusterSize: number().int().min(2).optional(),
@@ -26125,7 +26271,13 @@ method(object({
26125
26271
  }), method(object({ plateId: string() }), _void(), {
26126
26272
  kind: "mutation",
26127
26273
  auth: "admin"
26128
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26274
+ }), method(object({
26275
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26276
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26277
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26278
+ * INPUT field: stripped by the hub router until the train ships, which
26279
+ * resolves to `false` and is exactly the intended default. */
26280
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26129
26281
  kind: "mutation",
26130
26282
  auth: "admin"
26131
26283
  }), method(object({
@@ -33386,6 +33538,12 @@ Object.freeze({
33386
33538
  addonId: null,
33387
33539
  access: "create"
33388
33540
  },
33541
+ "pipelineAnalytics.cancelRelocateMedia": {
33542
+ capName: "pipeline-analytics",
33543
+ capScope: "device",
33544
+ addonId: null,
33545
+ access: "create"
33546
+ },
33389
33547
  "pipelineAnalytics.cancelStorageMigrationMove": {
33390
33548
  capName: "pipeline-analytics",
33391
33549
  capScope: "device",
@@ -33560,6 +33718,12 @@ Object.freeze({
33560
33718
  addonId: null,
33561
33719
  access: "view"
33562
33720
  },
33721
+ "pipelineAnalytics.listRelocateMediaJobs": {
33722
+ capName: "pipeline-analytics",
33723
+ capScope: "device",
33724
+ addonId: null,
33725
+ access: "view"
33726
+ },
33563
33727
  "pipelineAnalytics.listRetrainAnnotations": {
33564
33728
  capName: "pipeline-analytics",
33565
33729
  capScope: "device",
@@ -33638,6 +33802,12 @@ Object.freeze({
33638
33802
  addonId: null,
33639
33803
  access: "create"
33640
33804
  },
33805
+ "pipelineAnalytics.relocateMedia": {
33806
+ capName: "pipeline-analytics",
33807
+ capScope: "device",
33808
+ addonId: null,
33809
+ access: "create"
33810
+ },
33641
33811
  "pipelineAnalytics.restageRetrainTrack": {
33642
33812
  capName: "pipeline-analytics",
33643
33813
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-import-alexa",
3
- "version": "0.2.27",
3
+ "version": "0.2.28",
4
4
  "description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
5
5
  "keywords": [
6
6
  "camstack",