@camstack/addon-decoder-ffmpeg 1.2.27 → 1.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/index.js +249 -79
  2. package/dist/index.mjs +249 -79
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6635,7 +6635,7 @@ function method(input, output, options) {
6635
6635
  input,
6636
6636
  output,
6637
6637
  kind: options?.kind ?? "query",
6638
- auth: options?.auth ?? "protected",
6638
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6639
6639
  ...options?.access !== void 0 ? { access: options.access } : {},
6640
6640
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6641
6641
  timeoutMs: options?.timeoutMs
@@ -6655,7 +6655,7 @@ function systemMethod(input, output, options) {
6655
6655
  }
6656
6656
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6657
6657
  var VersionOutputSchema$1 = object({ version: string() });
6658
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6658
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6659
6659
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6660
6660
  DeviceType["Camera"] = "camera";
6661
6661
  DeviceType["Hub"] = "hub";
@@ -6976,7 +6976,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6976
6976
  }({});
6977
6977
  var StaticDirOutputSchema = object({ staticDir: string() });
6978
6978
  var VersionOutputSchema = object({ version: string() });
6979
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6979
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6980
6980
  /**
6981
6981
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6982
6982
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7602,24 +7602,6 @@ var RecordingRetentionSchema = object({
7602
7602
  maxSizeGb: number().min(0).optional()
7603
7603
  });
7604
7604
  /**
7605
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7606
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7607
- * previews at. Five graduated steps; absent on a config = `standard` (the
7608
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7609
- *
7610
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7611
- * Each window's index sidecar carries its own tile dims, so a camera whose
7612
- * preset changed over time renders every historical window at the dims it was
7613
- * written with.
7614
- */
7615
- var ScrubThumbnailPresetSchema = _enum([
7616
- "minimal",
7617
- "low",
7618
- "standard",
7619
- "high",
7620
- "max"
7621
- ]);
7622
- /**
7623
7605
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7624
7606
  *
7625
7607
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7627,7 +7609,11 @@ var ScrubThumbnailPresetSchema = _enum([
7627
7609
  * other field is a storage knob (profiles, segment length, retention, scrub).
7628
7610
  *
7629
7611
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7630
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7612
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7613
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7614
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7615
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7616
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7631
7617
  * A stale caller must fail loudly — silently stripping its legacy intent would
7632
7618
  * persist a band-less config, i.e. silently stop recording the camera.
7633
7619
  */
@@ -7650,14 +7636,7 @@ var RecordingConfigSchema = object({
7650
7636
  * "off" is the absence of a covering band, never a band value.
7651
7637
  */
7652
7638
  bands: array(RecordingBandSchema).default([]),
7653
- retention: RecordingRetentionSchema.optional(),
7654
- /**
7655
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7656
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7657
- * windows only — existing sheets are immutable, and each window's index
7658
- * carries its own tile dims so mixed-preset history renders correctly.
7659
- */
7660
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7639
+ retention: RecordingRetentionSchema.optional()
7661
7640
  }).strict();
7662
7641
  /**
7663
7642
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7733,10 +7712,11 @@ var RelocateFootageInputSchema = object({
7733
7712
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7734
7713
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7735
7714
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7736
- var StorageMigrationMediaMoveInputSchema = object({
7715
+ var RelocateMediaInputSchema = object({
7737
7716
  toLocationId: string(),
7738
7717
  throttleMbps: number().min(1).max(1e3).optional()
7739
- }).extend({ leaseId: string().min(1) });
7718
+ });
7719
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7740
7720
  /** The independently selectable logical storage classes. `recordings`
7741
7721
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7742
7722
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8031,7 +8011,26 @@ var LabelDefinitionSchema = object({
8031
8011
  description: string().optional(),
8032
8012
  icon: string().optional()
8033
8013
  });
8034
- var ClassMapDefinitionSchema = object({
8014
+ /**
8015
+ * Wire schema for a per-model CATALOG classMap override
8016
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8017
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8018
+ * detection pipeline executor actually routes.
8019
+ *
8020
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8021
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8022
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8023
+ * enum) — the two used to share the name `ClassMapDefinition`/
8024
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8025
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8026
+ * are not: it is two different concepts colliding on a name. Keep this type
8027
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8028
+ * would either narrow every `ClassMapDefinition` consumer to the four
8029
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8030
+ * schema exists for (see the "rejects a classMap whose target is not a
8031
+ * detection macro" test in `model-catalog-schema.test.ts`).
8032
+ */
8033
+ var DetectionCatalogClassMapSchema = object({
8035
8034
  mapping: record(string(), _enum([
8036
8035
  "person",
8037
8036
  "vehicle",
@@ -8236,7 +8235,7 @@ var ModelCatalogEntrySchema = object({
8236
8235
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8237
8236
  * labels already ARE the CamStack macros (Scrypted identity map).
8238
8237
  */
8239
- classMap: ClassMapDefinitionSchema.optional()
8238
+ classMap: DetectionCatalogClassMapSchema.optional()
8240
8239
  });
8241
8240
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8242
8241
  format: literal("openvino"),
@@ -8266,7 +8265,7 @@ var ModelConvertMetadataSchema = object({
8266
8265
  "segmentation"
8267
8266
  ]),
8268
8267
  faceAlignment: boolean().optional(),
8269
- classMap: ClassMapDefinitionSchema.optional()
8268
+ classMap: DetectionCatalogClassMapSchema.optional()
8270
8269
  });
8271
8270
  var ConvertResultSchema = object({
8272
8271
  entry: ModelCatalogEntrySchema,
@@ -9129,7 +9128,7 @@ var AddonPageDeclarationSchema = object({
9129
9128
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9130
9129
  sectionLabel: string().optional()
9131
9130
  });
9132
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9131
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9133
9132
  var AddonHttpRouteSchema = object({
9134
9133
  method: _enum([
9135
9134
  "GET",
@@ -9364,7 +9363,7 @@ var WidgetMetadataSchema = object({
9364
9363
  defaultColumns: number().int().min(1).max(12).default(6),
9365
9364
  defaultRows: number().int().min(1).max(12).default(1)
9366
9365
  });
9367
- method(_void(), array(WidgetMetadataSchema).readonly());
9366
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9368
9367
  /**
9369
9368
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9370
9369
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10923,7 +10922,7 @@ var CustomModelDescriptorSchema = object({
10923
10922
  stepId: string(),
10924
10923
  entry: ModelCatalogEntrySchema
10925
10924
  });
10926
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10925
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10927
10926
  /**
10928
10927
  * Query filter for settings-store collections.
10929
10928
  */
@@ -11010,7 +11009,8 @@ method(object({
11010
11009
  }), _void(), { kind: "mutation" }), method(object({
11011
11010
  namespace: string().optional(),
11012
11011
  collection: string(),
11013
- filter: QueryFilterSchema.optional()
11012
+ filter: QueryFilterSchema.optional(),
11013
+ columns: array(string()).readonly().optional()
11014
11014
  }), array(SettingsRecordSchema).readonly()), method(object({
11015
11015
  namespace: string().optional(),
11016
11016
  collection: string(),
@@ -11073,46 +11073,87 @@ var EngineInfoSchema = object({
11073
11073
  kind: _enum(["relational", "vector"]),
11074
11074
  displayName: string()
11075
11075
  });
11076
- method(_void(), EngineInfoSchema), method(object({
11076
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11077
11077
  namespace: string().optional(),
11078
11078
  collection: string(),
11079
11079
  key: string()
11080
- }), unknown()), method(object({
11080
+ }), unknown(), { auth: "admin" }), method(object({
11081
11081
  namespace: string().optional(),
11082
11082
  collection: string(),
11083
11083
  key: string(),
11084
11084
  value: unknown()
11085
- }), _void(), { kind: "mutation" }), method(object({
11085
+ }), _void(), {
11086
+ kind: "mutation",
11087
+ auth: "admin"
11088
+ }), method(object({
11086
11089
  namespace: string().optional(),
11087
11090
  collection: string(),
11088
- filter: QueryFilterSchema.optional()
11089
- }), array(SettingsRecordSchema).readonly()), method(object({
11091
+ filter: QueryFilterSchema.optional(),
11092
+ /**
11093
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11094
+ *
11095
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11096
+ * was wrong — corrected 2026-08-26 after the hop map
11097
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11098
+ * There is **no Zod parse at all** between the door and the engine: the
11099
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11100
+ * field declared here reaches `SqliteSettingsBackend` either way.
11101
+ *
11102
+ * What actually lost `columns` was the THIRD declaration of this shape:
11103
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11104
+ * interface the engine destructures from. The field existed on both
11105
+ * schemas and the engine still never read it, because nothing checks a
11106
+ * registered provider against `InferProvider<cap>` —
11107
+ * `ProviderRegistration.provider` is typed `object`.
11108
+ *
11109
+ * It is declared here anyway, and must stay in step with
11110
+ * `settings-store.query`: a caller reading only the cap definitions has
11111
+ * to be able to see that this call carries a projection.
11112
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11113
+ */
11114
+ columns: array(string()).readonly().optional()
11115
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11090
11116
  namespace: string().optional(),
11091
11117
  collection: string(),
11092
11118
  record: SettingsRecordSchema
11093
- }), _void(), { kind: "mutation" }), method(object({
11119
+ }), _void(), {
11120
+ kind: "mutation",
11121
+ auth: "admin"
11122
+ }), method(object({
11094
11123
  namespace: string().optional(),
11095
11124
  collection: string(),
11096
11125
  id: string(),
11097
11126
  data: record(string(), unknown())
11098
- }), _void(), { kind: "mutation" }), method(object({
11127
+ }), _void(), {
11128
+ kind: "mutation",
11129
+ auth: "admin"
11130
+ }), method(object({
11099
11131
  namespace: string().optional(),
11100
11132
  collection: string(),
11101
11133
  key: string()
11102
- }), _void(), { kind: "mutation" }), method(object({
11134
+ }), _void(), {
11135
+ kind: "mutation",
11136
+ auth: "admin"
11137
+ }), method(object({
11103
11138
  namespace: string().optional(),
11104
11139
  collection: string(),
11105
11140
  filter: MutationFilterSchema
11106
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11141
+ }), object({ deleted: number().int() }), {
11142
+ kind: "mutation",
11143
+ auth: "admin"
11144
+ }), method(object({
11107
11145
  namespace: string().optional(),
11108
11146
  collection: string(),
11109
11147
  filter: MutationFilterSchema,
11110
11148
  data: record(string(), unknown())
11111
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11149
+ }), object({ updated: number().int() }), {
11150
+ kind: "mutation",
11151
+ auth: "admin"
11152
+ }), method(object({
11112
11153
  namespace: string().optional(),
11113
11154
  collection: string(),
11114
11155
  filter: QueryFilterSchema.optional()
11115
- }), number()), method(object({
11156
+ }), number(), { auth: "admin" }), method(object({
11116
11157
  namespace: string().optional(),
11117
11158
  collection: string(),
11118
11159
  field: string(),
@@ -11122,15 +11163,18 @@ method(_void(), EngineInfoSchema), method(object({
11122
11163
  }), array(object({
11123
11164
  bucket: number().int(),
11124
11165
  count: number().int()
11125
- })).readonly()), method(object({
11166
+ })).readonly(), { auth: "admin" }), method(object({
11126
11167
  namespace: string().optional(),
11127
11168
  collection: string()
11128
- }), boolean()), method(object({
11169
+ }), boolean(), { auth: "admin" }), method(object({
11129
11170
  namespace: string().optional(),
11130
11171
  collection: string(),
11131
11172
  columns: array(CollectionColumnSchema).readonly(),
11132
11173
  indexes: array(CollectionIndexSchema).readonly().optional()
11133
- }), _void(), { kind: "mutation" });
11174
+ }), _void(), {
11175
+ kind: "mutation",
11176
+ auth: "admin"
11177
+ });
11134
11178
  /**
11135
11179
  * Stable UI option list for the `hwaccel` setting. Decoder addons
11136
11180
  * reuse this for `globalSettingsSchema()` so the dropdown is
@@ -12351,7 +12395,7 @@ method(object({
12351
12395
  crop: _instanceof(Uint8Array),
12352
12396
  width: number(),
12353
12397
  height: number()
12354
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12398
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12355
12399
  /**
12356
12400
  * filesystem-browse — per-node capability for browsing the node's local
12357
12401
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12644,19 +12688,22 @@ method(LlmGenerateBaseInputSchema.extend({
12644
12688
  runtime: ManagedRuntimeConfigSchema,
12645
12689
  /** The managed profile's timeout, threaded by the hub provider. */
12646
12690
  timeoutMs: number().int().positive().optional()
12647
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12691
+ }), LlmGenerateResultSchema, {
12692
+ kind: "mutation",
12693
+ auth: "admin"
12694
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12648
12695
  kind: "mutation",
12649
12696
  auth: "admin"
12650
12697
  }), method(object({}), _void(), {
12651
12698
  kind: "mutation",
12652
12699
  auth: "admin"
12653
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12700
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12654
12701
  kind: "mutation",
12655
12702
  auth: "admin"
12656
12703
  }), method(object({ file: string() }), _void(), {
12657
12704
  kind: "mutation",
12658
12705
  auth: "admin"
12659
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12706
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12660
12707
  /**
12661
12708
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12662
12709
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16129,7 +16176,7 @@ var OauthIntegrationDescriptorSchema = object({
16129
16176
  */
16130
16177
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16131
16178
  });
16132
- method(_void(), OauthIntegrationDescriptorSchema);
16179
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16133
16180
  /**
16134
16181
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16135
16182
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17324,6 +17371,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17324
17371
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17325
17372
  kind: "mutation",
17326
17373
  auth: "admin"
17374
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17375
+ kind: "mutation",
17376
+ auth: "admin"
17377
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17378
+ kind: "query",
17379
+ auth: "admin"
17380
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17381
+ kind: "mutation",
17382
+ auth: "admin"
17327
17383
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17328
17384
  kind: "query",
17329
17385
  auth: "admin"
@@ -17478,6 +17534,11 @@ object({
17478
17534
  "jpeg"
17479
17535
  ])
17480
17536
  });
17537
+ /**
17538
+ * Process-local frame identity. It is serializable so it can ride an in-process
17539
+ * capability call, but `registryId` deliberately prevents resolution in any
17540
+ * other process or execution group.
17541
+ */
17481
17542
  var FrameRefSchema = object({
17482
17543
  registryId: string().min(1),
17483
17544
  id: string().min(1),
@@ -19643,7 +19704,7 @@ method(object({
19643
19704
  * linking rather than produce an eternal token.
19644
19705
  */
19645
19706
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19646
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19707
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19647
19708
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19648
19709
  providerId: string().min(1),
19649
19710
  displayName: string().min(1),
@@ -19738,10 +19799,13 @@ var EvictResultSchema = object({
19738
19799
  /** True when the provider has nothing left it is willing to drop on this location. */
19739
19800
  exhausted: boolean()
19740
19801
  });
19741
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19802
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19742
19803
  locationId: string(),
19743
19804
  targetBytes: number().int().positive()
19744
- }), EvictResultSchema, { kind: "mutation" });
19805
+ }), EvictResultSchema, {
19806
+ kind: "mutation",
19807
+ auth: "admin"
19808
+ });
19745
19809
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19746
19810
  kind: "mutation",
19747
19811
  auth: "admin"
@@ -19801,26 +19865,50 @@ var ReadChunkInputSchema = object({
19801
19865
  length: number()
19802
19866
  });
19803
19867
  var EndDownloadInputSchema = object({ downloadId: string() });
19804
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19868
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19805
19869
  location: StorageLocationSchema,
19806
19870
  relativePath: string()
19807
- }), string()), method(object({
19871
+ }), string(), { auth: "admin" }), method(object({
19808
19872
  location: StorageLocationSchema,
19809
19873
  relativePath: string(),
19810
19874
  data: _instanceof(Uint8Array)
19811
- }), _void(), { kind: "mutation" }), method(object({
19875
+ }), _void(), {
19876
+ kind: "mutation",
19877
+ auth: "admin"
19878
+ }), method(object({
19812
19879
  location: StorageLocationSchema,
19813
19880
  relativePath: string()
19814
- }), _instanceof(Uint8Array)), method(object({
19881
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19815
19882
  location: StorageLocationSchema,
19816
19883
  relativePath: string()
19817
- }), boolean()), method(object({
19884
+ }), boolean(), { auth: "admin" }), method(object({
19818
19885
  location: StorageLocationSchema,
19819
19886
  prefix: string().optional()
19820
- }), array(string()).readonly()), method(object({
19887
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19821
19888
  location: StorageLocationSchema,
19822
19889
  relativePath: string()
19823
- }), _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" });
19890
+ }), _void(), {
19891
+ kind: "mutation",
19892
+ auth: "admin"
19893
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19894
+ kind: "mutation",
19895
+ auth: "admin"
19896
+ }), method(WriteChunkInputSchema, _void(), {
19897
+ kind: "mutation",
19898
+ auth: "admin"
19899
+ }), method(FinalizeUploadInputSchema, _void(), {
19900
+ kind: "mutation",
19901
+ auth: "admin"
19902
+ }), method(AbortUploadInputSchema, _void(), {
19903
+ kind: "mutation",
19904
+ auth: "admin"
19905
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19906
+ kind: "mutation",
19907
+ auth: "admin"
19908
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19909
+ kind: "mutation",
19910
+ auth: "admin"
19911
+ });
19824
19912
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19825
19913
  var ProfileSettingsSchemaBridge = unknown().nullable();
19826
19914
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20078,7 +20166,8 @@ method(object({
20078
20166
  access: "create"
20079
20167
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20080
20168
  kind: "mutation",
20081
- access: "view"
20169
+ access: "view",
20170
+ auth: "admin"
20082
20171
  }), method(object({
20083
20172
  /** Required — the user the assertion belongs to (verified). */
20084
20173
  userId: string(),
@@ -20086,10 +20175,12 @@ method(object({
20086
20175
  response: record(string(), unknown())
20087
20176
  }), object({ verified: boolean() }), {
20088
20177
  kind: "mutation",
20089
- access: "view"
20178
+ access: "view",
20179
+ auth: "admin"
20090
20180
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20091
20181
  kind: "mutation",
20092
- access: "view"
20182
+ access: "view",
20183
+ auth: "admin"
20093
20184
  }), method(object({
20094
20185
  /** AuthenticationResponseJSON from the browser. */
20095
20186
  response: record(string(), unknown()) }), object({
@@ -20097,7 +20188,8 @@ response: record(string(), unknown()) }), object({
20097
20188
  userId: string().nullable()
20098
20189
  }), {
20099
20190
  kind: "mutation",
20100
- access: "view"
20191
+ access: "view",
20192
+ auth: "admin"
20101
20193
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20102
20194
  userId: string(),
20103
20195
  credentialId: string()
@@ -20269,7 +20361,19 @@ var VectorStatsResultSchema = object({
20269
20361
  /** False when the backend ranks approximately. */
20270
20362
  exact: boolean()
20271
20363
  });
20272
- 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);
20364
+ method(VectorDeclareIndexInputSchema, _void(), {
20365
+ kind: "mutation",
20366
+ auth: "admin"
20367
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20368
+ kind: "mutation",
20369
+ auth: "admin"
20370
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20371
+ kind: "mutation",
20372
+ auth: "admin"
20373
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20374
+ kind: "mutation",
20375
+ auth: "admin"
20376
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20273
20377
  var ClipSchema = object({
20274
20378
  /** Opaque, provider-namespaced id. The default provider encodes the time
20275
20379
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21992,7 +22096,27 @@ var MediaFileLiteSchema$1 = object({
21992
22096
  sizeBytes: number(),
21993
22097
  timestamp: number()
21994
22098
  });
21995
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22099
+ method(object({
22100
+ /**
22101
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22102
+ *
22103
+ * Default `false`, the same inversion `listRecentFaces` and
22104
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22105
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22106
+ * on the live hub the same day: four identities cost 40,979 B with the
22107
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22108
+ * four times and the viewer holds at `staleTime: 30_000`.
22109
+ *
22110
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22111
+ * the `event-media` plane serves that key `immutable` with an ETag.
22112
+ *
22113
+ * **This is an INPUT field, so it does not reach the addon until the
22114
+ * next train** — the hub router validates cap inputs against its own
22115
+ * compiled Zod and strips a key it does not know. Until then the
22116
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22117
+ * is what ships, and the opt-in becomes reachable when the train lands.
22118
+ */
22119
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21996
22120
  kind: "mutation",
21997
22121
  auth: "admin"
21998
22122
  }), method(object({
@@ -24139,8 +24263,10 @@ var PlateInfoSchema = object({
24139
24263
  keyFrameMediaKey: string().optional(),
24140
24264
  base64: string().optional(),
24141
24265
  /**
24142
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24143
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24266
+ * Same crop as a data-plane URL, always present when the plate has a stored
24267
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24268
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24269
+ * left at its `true` default.
24144
24270
  */
24145
24271
  cropUrl: string().optional()
24146
24272
  });
@@ -24160,14 +24286,34 @@ var PlateClusterSchema = object({
24160
24286
  });
24161
24287
  method(object({
24162
24288
  deviceId: number().int().optional(),
24163
- limit: number().int().positive().optional()
24289
+ limit: number().int().positive().optional(),
24290
+ /**
24291
+ * Inline the base64 crop on every row. Default `true` — the existing
24292
+ * behaviour, kept so no caller breaks.
24293
+ *
24294
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24295
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24296
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24297
+ * metadata without them — and the browser then caches the images.
24298
+ *
24299
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24300
+ * plates were the one gallery list left without it.
24301
+ *
24302
+ * **This is an INPUT field, so it does not reach the addon until the
24303
+ * next train.** The hub router validates cap inputs against its own
24304
+ * compiled Zod and strips a key it does not know. Until the train
24305
+ * ships, sending `false` is harmless and keeps the crops inline.
24306
+ */
24307
+ includeCrops: boolean().optional()
24164
24308
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24165
24309
  deviceId: number().int(),
24166
24310
  trackId: string()
24167
24311
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24168
24312
  text: string().min(1),
24169
24313
  maxDistance: number().int().min(0).optional(),
24170
- limit: number().int().positive().optional()
24314
+ limit: number().int().positive().optional(),
24315
+ /** See `listPlates.includeCrops`. Default `true`. */
24316
+ includeCrops: boolean().optional()
24171
24317
  }), array(PlateInfoSchema).readonly()), method(object({
24172
24318
  maxDistance: number().int().min(0).optional(),
24173
24319
  minClusterSize: number().int().min(2).optional(),
@@ -24181,7 +24327,13 @@ method(object({
24181
24327
  }), method(object({ plateId: string() }), _void(), {
24182
24328
  kind: "mutation",
24183
24329
  auth: "admin"
24184
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24330
+ }), method(object({
24331
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24332
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24333
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24334
+ * INPUT field: stripped by the hub router until the train ships, which
24335
+ * resolves to `false` and is exactly the intended default. */
24336
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24185
24337
  kind: "mutation",
24186
24338
  auth: "admin"
24187
24339
  }), method(object({
@@ -29558,6 +29710,12 @@ Object.freeze({
29558
29710
  addonId: null,
29559
29711
  access: "create"
29560
29712
  },
29713
+ "pipelineAnalytics.cancelRelocateMedia": {
29714
+ capName: "pipeline-analytics",
29715
+ capScope: "device",
29716
+ addonId: null,
29717
+ access: "create"
29718
+ },
29561
29719
  "pipelineAnalytics.cancelStorageMigrationMove": {
29562
29720
  capName: "pipeline-analytics",
29563
29721
  capScope: "device",
@@ -29732,6 +29890,12 @@ Object.freeze({
29732
29890
  addonId: null,
29733
29891
  access: "view"
29734
29892
  },
29893
+ "pipelineAnalytics.listRelocateMediaJobs": {
29894
+ capName: "pipeline-analytics",
29895
+ capScope: "device",
29896
+ addonId: null,
29897
+ access: "view"
29898
+ },
29735
29899
  "pipelineAnalytics.listRetrainAnnotations": {
29736
29900
  capName: "pipeline-analytics",
29737
29901
  capScope: "device",
@@ -29810,6 +29974,12 @@ Object.freeze({
29810
29974
  addonId: null,
29811
29975
  access: "create"
29812
29976
  },
29977
+ "pipelineAnalytics.relocateMedia": {
29978
+ capName: "pipeline-analytics",
29979
+ capScope: "device",
29980
+ addonId: null,
29981
+ access: "create"
29982
+ },
29813
29983
  "pipelineAnalytics.restageRetrainTrack": {
29814
29984
  capName: "pipeline-analytics",
29815
29985
  capScope: "device",
package/dist/index.mjs CHANGED
@@ -6631,7 +6631,7 @@ function method(input, output, options) {
6631
6631
  input,
6632
6632
  output,
6633
6633
  kind: options?.kind ?? "query",
6634
- auth: options?.auth ?? "protected",
6634
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6635
6635
  ...options?.access !== void 0 ? { access: options.access } : {},
6636
6636
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6637
6637
  timeoutMs: options?.timeoutMs
@@ -6651,7 +6651,7 @@ function systemMethod(input, output, options) {
6651
6651
  }
6652
6652
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6653
6653
  var VersionOutputSchema$1 = object({ version: string() });
6654
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6654
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6655
6655
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6656
6656
  DeviceType["Camera"] = "camera";
6657
6657
  DeviceType["Hub"] = "hub";
@@ -6972,7 +6972,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6972
6972
  }({});
6973
6973
  var StaticDirOutputSchema = object({ staticDir: string() });
6974
6974
  var VersionOutputSchema = object({ version: string() });
6975
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6975
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6976
6976
  /**
6977
6977
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6978
6978
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7598,24 +7598,6 @@ var RecordingRetentionSchema = object({
7598
7598
  maxSizeGb: number().min(0).optional()
7599
7599
  });
7600
7600
  /**
7601
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7602
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7603
- * previews at. Five graduated steps; absent on a config = `standard` (the
7604
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7605
- *
7606
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7607
- * Each window's index sidecar carries its own tile dims, so a camera whose
7608
- * preset changed over time renders every historical window at the dims it was
7609
- * written with.
7610
- */
7611
- var ScrubThumbnailPresetSchema = _enum([
7612
- "minimal",
7613
- "low",
7614
- "standard",
7615
- "high",
7616
- "max"
7617
- ]);
7618
- /**
7619
7601
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7620
7602
  *
7621
7603
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7623,7 +7605,11 @@ var ScrubThumbnailPresetSchema = _enum([
7623
7605
  * other field is a storage knob (profiles, segment length, retention, scrub).
7624
7606
  *
7625
7607
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7626
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7608
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7609
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7610
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7611
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7612
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7627
7613
  * A stale caller must fail loudly — silently stripping its legacy intent would
7628
7614
  * persist a band-less config, i.e. silently stop recording the camera.
7629
7615
  */
@@ -7646,14 +7632,7 @@ var RecordingConfigSchema = object({
7646
7632
  * "off" is the absence of a covering band, never a band value.
7647
7633
  */
7648
7634
  bands: array(RecordingBandSchema).default([]),
7649
- retention: RecordingRetentionSchema.optional(),
7650
- /**
7651
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7652
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7653
- * windows only — existing sheets are immutable, and each window's index
7654
- * carries its own tile dims so mixed-preset history renders correctly.
7655
- */
7656
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7635
+ retention: RecordingRetentionSchema.optional()
7657
7636
  }).strict();
7658
7637
  /**
7659
7638
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7729,10 +7708,11 @@ var RelocateFootageInputSchema = object({
7729
7708
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7730
7709
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7731
7710
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7732
- var StorageMigrationMediaMoveInputSchema = object({
7711
+ var RelocateMediaInputSchema = object({
7733
7712
  toLocationId: string(),
7734
7713
  throttleMbps: number().min(1).max(1e3).optional()
7735
- }).extend({ leaseId: string().min(1) });
7714
+ });
7715
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7736
7716
  /** The independently selectable logical storage classes. `recordings`
7737
7717
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7738
7718
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8027,7 +8007,26 @@ var LabelDefinitionSchema = object({
8027
8007
  description: string().optional(),
8028
8008
  icon: string().optional()
8029
8009
  });
8030
- var ClassMapDefinitionSchema = object({
8010
+ /**
8011
+ * Wire schema for a per-model CATALOG classMap override
8012
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8013
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8014
+ * detection pipeline executor actually routes.
8015
+ *
8016
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8017
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8018
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8019
+ * enum) — the two used to share the name `ClassMapDefinition`/
8020
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8021
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8022
+ * are not: it is two different concepts colliding on a name. Keep this type
8023
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8024
+ * would either narrow every `ClassMapDefinition` consumer to the four
8025
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8026
+ * schema exists for (see the "rejects a classMap whose target is not a
8027
+ * detection macro" test in `model-catalog-schema.test.ts`).
8028
+ */
8029
+ var DetectionCatalogClassMapSchema = object({
8031
8030
  mapping: record(string(), _enum([
8032
8031
  "person",
8033
8032
  "vehicle",
@@ -8232,7 +8231,7 @@ var ModelCatalogEntrySchema = object({
8232
8231
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8233
8232
  * labels already ARE the CamStack macros (Scrypted identity map).
8234
8233
  */
8235
- classMap: ClassMapDefinitionSchema.optional()
8234
+ classMap: DetectionCatalogClassMapSchema.optional()
8236
8235
  });
8237
8236
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8238
8237
  format: literal("openvino"),
@@ -8262,7 +8261,7 @@ var ModelConvertMetadataSchema = object({
8262
8261
  "segmentation"
8263
8262
  ]),
8264
8263
  faceAlignment: boolean().optional(),
8265
- classMap: ClassMapDefinitionSchema.optional()
8264
+ classMap: DetectionCatalogClassMapSchema.optional()
8266
8265
  });
8267
8266
  var ConvertResultSchema = object({
8268
8267
  entry: ModelCatalogEntrySchema,
@@ -9125,7 +9124,7 @@ var AddonPageDeclarationSchema = object({
9125
9124
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9126
9125
  sectionLabel: string().optional()
9127
9126
  });
9128
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9127
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9129
9128
  var AddonHttpRouteSchema = object({
9130
9129
  method: _enum([
9131
9130
  "GET",
@@ -9360,7 +9359,7 @@ var WidgetMetadataSchema = object({
9360
9359
  defaultColumns: number().int().min(1).max(12).default(6),
9361
9360
  defaultRows: number().int().min(1).max(12).default(1)
9362
9361
  });
9363
- method(_void(), array(WidgetMetadataSchema).readonly());
9362
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9364
9363
  /**
9365
9364
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9366
9365
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10919,7 +10918,7 @@ var CustomModelDescriptorSchema = object({
10919
10918
  stepId: string(),
10920
10919
  entry: ModelCatalogEntrySchema
10921
10920
  });
10922
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10921
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10923
10922
  /**
10924
10923
  * Query filter for settings-store collections.
10925
10924
  */
@@ -11006,7 +11005,8 @@ method(object({
11006
11005
  }), _void(), { kind: "mutation" }), method(object({
11007
11006
  namespace: string().optional(),
11008
11007
  collection: string(),
11009
- filter: QueryFilterSchema.optional()
11008
+ filter: QueryFilterSchema.optional(),
11009
+ columns: array(string()).readonly().optional()
11010
11010
  }), array(SettingsRecordSchema).readonly()), method(object({
11011
11011
  namespace: string().optional(),
11012
11012
  collection: string(),
@@ -11069,46 +11069,87 @@ var EngineInfoSchema = object({
11069
11069
  kind: _enum(["relational", "vector"]),
11070
11070
  displayName: string()
11071
11071
  });
11072
- method(_void(), EngineInfoSchema), method(object({
11072
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11073
11073
  namespace: string().optional(),
11074
11074
  collection: string(),
11075
11075
  key: string()
11076
- }), unknown()), method(object({
11076
+ }), unknown(), { auth: "admin" }), method(object({
11077
11077
  namespace: string().optional(),
11078
11078
  collection: string(),
11079
11079
  key: string(),
11080
11080
  value: unknown()
11081
- }), _void(), { kind: "mutation" }), method(object({
11081
+ }), _void(), {
11082
+ kind: "mutation",
11083
+ auth: "admin"
11084
+ }), method(object({
11082
11085
  namespace: string().optional(),
11083
11086
  collection: string(),
11084
- filter: QueryFilterSchema.optional()
11085
- }), array(SettingsRecordSchema).readonly()), method(object({
11087
+ filter: QueryFilterSchema.optional(),
11088
+ /**
11089
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11090
+ *
11091
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11092
+ * was wrong — corrected 2026-08-26 after the hop map
11093
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11094
+ * There is **no Zod parse at all** between the door and the engine: the
11095
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11096
+ * field declared here reaches `SqliteSettingsBackend` either way.
11097
+ *
11098
+ * What actually lost `columns` was the THIRD declaration of this shape:
11099
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11100
+ * interface the engine destructures from. The field existed on both
11101
+ * schemas and the engine still never read it, because nothing checks a
11102
+ * registered provider against `InferProvider<cap>` —
11103
+ * `ProviderRegistration.provider` is typed `object`.
11104
+ *
11105
+ * It is declared here anyway, and must stay in step with
11106
+ * `settings-store.query`: a caller reading only the cap definitions has
11107
+ * to be able to see that this call carries a projection.
11108
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11109
+ */
11110
+ columns: array(string()).readonly().optional()
11111
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11086
11112
  namespace: string().optional(),
11087
11113
  collection: string(),
11088
11114
  record: SettingsRecordSchema
11089
- }), _void(), { kind: "mutation" }), method(object({
11115
+ }), _void(), {
11116
+ kind: "mutation",
11117
+ auth: "admin"
11118
+ }), method(object({
11090
11119
  namespace: string().optional(),
11091
11120
  collection: string(),
11092
11121
  id: string(),
11093
11122
  data: record(string(), unknown())
11094
- }), _void(), { kind: "mutation" }), method(object({
11123
+ }), _void(), {
11124
+ kind: "mutation",
11125
+ auth: "admin"
11126
+ }), method(object({
11095
11127
  namespace: string().optional(),
11096
11128
  collection: string(),
11097
11129
  key: string()
11098
- }), _void(), { kind: "mutation" }), method(object({
11130
+ }), _void(), {
11131
+ kind: "mutation",
11132
+ auth: "admin"
11133
+ }), method(object({
11099
11134
  namespace: string().optional(),
11100
11135
  collection: string(),
11101
11136
  filter: MutationFilterSchema
11102
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11137
+ }), object({ deleted: number().int() }), {
11138
+ kind: "mutation",
11139
+ auth: "admin"
11140
+ }), method(object({
11103
11141
  namespace: string().optional(),
11104
11142
  collection: string(),
11105
11143
  filter: MutationFilterSchema,
11106
11144
  data: record(string(), unknown())
11107
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11145
+ }), object({ updated: number().int() }), {
11146
+ kind: "mutation",
11147
+ auth: "admin"
11148
+ }), method(object({
11108
11149
  namespace: string().optional(),
11109
11150
  collection: string(),
11110
11151
  filter: QueryFilterSchema.optional()
11111
- }), number()), method(object({
11152
+ }), number(), { auth: "admin" }), method(object({
11112
11153
  namespace: string().optional(),
11113
11154
  collection: string(),
11114
11155
  field: string(),
@@ -11118,15 +11159,18 @@ method(_void(), EngineInfoSchema), method(object({
11118
11159
  }), array(object({
11119
11160
  bucket: number().int(),
11120
11161
  count: number().int()
11121
- })).readonly()), method(object({
11162
+ })).readonly(), { auth: "admin" }), method(object({
11122
11163
  namespace: string().optional(),
11123
11164
  collection: string()
11124
- }), boolean()), method(object({
11165
+ }), boolean(), { auth: "admin" }), method(object({
11125
11166
  namespace: string().optional(),
11126
11167
  collection: string(),
11127
11168
  columns: array(CollectionColumnSchema).readonly(),
11128
11169
  indexes: array(CollectionIndexSchema).readonly().optional()
11129
- }), _void(), { kind: "mutation" });
11170
+ }), _void(), {
11171
+ kind: "mutation",
11172
+ auth: "admin"
11173
+ });
11130
11174
  /**
11131
11175
  * Stable UI option list for the `hwaccel` setting. Decoder addons
11132
11176
  * reuse this for `globalSettingsSchema()` so the dropdown is
@@ -12347,7 +12391,7 @@ method(object({
12347
12391
  crop: _instanceof(Uint8Array),
12348
12392
  width: number(),
12349
12393
  height: number()
12350
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12394
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12351
12395
  /**
12352
12396
  * filesystem-browse — per-node capability for browsing the node's local
12353
12397
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12640,19 +12684,22 @@ method(LlmGenerateBaseInputSchema.extend({
12640
12684
  runtime: ManagedRuntimeConfigSchema,
12641
12685
  /** The managed profile's timeout, threaded by the hub provider. */
12642
12686
  timeoutMs: number().int().positive().optional()
12643
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12687
+ }), LlmGenerateResultSchema, {
12688
+ kind: "mutation",
12689
+ auth: "admin"
12690
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12644
12691
  kind: "mutation",
12645
12692
  auth: "admin"
12646
12693
  }), method(object({}), _void(), {
12647
12694
  kind: "mutation",
12648
12695
  auth: "admin"
12649
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12696
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12650
12697
  kind: "mutation",
12651
12698
  auth: "admin"
12652
12699
  }), method(object({ file: string() }), _void(), {
12653
12700
  kind: "mutation",
12654
12701
  auth: "admin"
12655
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12702
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12656
12703
  /**
12657
12704
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12658
12705
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16125,7 +16172,7 @@ var OauthIntegrationDescriptorSchema = object({
16125
16172
  */
16126
16173
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16127
16174
  });
16128
- method(_void(), OauthIntegrationDescriptorSchema);
16175
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16129
16176
  /**
16130
16177
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16131
16178
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17320,6 +17367,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17320
17367
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17321
17368
  kind: "mutation",
17322
17369
  auth: "admin"
17370
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17371
+ kind: "mutation",
17372
+ auth: "admin"
17373
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17374
+ kind: "query",
17375
+ auth: "admin"
17376
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17377
+ kind: "mutation",
17378
+ auth: "admin"
17323
17379
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17324
17380
  kind: "query",
17325
17381
  auth: "admin"
@@ -17474,6 +17530,11 @@ object({
17474
17530
  "jpeg"
17475
17531
  ])
17476
17532
  });
17533
+ /**
17534
+ * Process-local frame identity. It is serializable so it can ride an in-process
17535
+ * capability call, but `registryId` deliberately prevents resolution in any
17536
+ * other process or execution group.
17537
+ */
17477
17538
  var FrameRefSchema = object({
17478
17539
  registryId: string().min(1),
17479
17540
  id: string().min(1),
@@ -19639,7 +19700,7 @@ method(object({
19639
19700
  * linking rather than produce an eternal token.
19640
19701
  */
19641
19702
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19642
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19703
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19643
19704
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19644
19705
  providerId: string().min(1),
19645
19706
  displayName: string().min(1),
@@ -19734,10 +19795,13 @@ var EvictResultSchema = object({
19734
19795
  /** True when the provider has nothing left it is willing to drop on this location. */
19735
19796
  exhausted: boolean()
19736
19797
  });
19737
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19798
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19738
19799
  locationId: string(),
19739
19800
  targetBytes: number().int().positive()
19740
- }), EvictResultSchema, { kind: "mutation" });
19801
+ }), EvictResultSchema, {
19802
+ kind: "mutation",
19803
+ auth: "admin"
19804
+ });
19741
19805
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19742
19806
  kind: "mutation",
19743
19807
  auth: "admin"
@@ -19797,26 +19861,50 @@ var ReadChunkInputSchema = object({
19797
19861
  length: number()
19798
19862
  });
19799
19863
  var EndDownloadInputSchema = object({ downloadId: string() });
19800
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19864
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19801
19865
  location: StorageLocationSchema,
19802
19866
  relativePath: string()
19803
- }), string()), method(object({
19867
+ }), string(), { auth: "admin" }), method(object({
19804
19868
  location: StorageLocationSchema,
19805
19869
  relativePath: string(),
19806
19870
  data: _instanceof(Uint8Array)
19807
- }), _void(), { kind: "mutation" }), method(object({
19871
+ }), _void(), {
19872
+ kind: "mutation",
19873
+ auth: "admin"
19874
+ }), method(object({
19808
19875
  location: StorageLocationSchema,
19809
19876
  relativePath: string()
19810
- }), _instanceof(Uint8Array)), method(object({
19877
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19811
19878
  location: StorageLocationSchema,
19812
19879
  relativePath: string()
19813
- }), boolean()), method(object({
19880
+ }), boolean(), { auth: "admin" }), method(object({
19814
19881
  location: StorageLocationSchema,
19815
19882
  prefix: string().optional()
19816
- }), array(string()).readonly()), method(object({
19883
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19817
19884
  location: StorageLocationSchema,
19818
19885
  relativePath: string()
19819
- }), _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" });
19886
+ }), _void(), {
19887
+ kind: "mutation",
19888
+ auth: "admin"
19889
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19890
+ kind: "mutation",
19891
+ auth: "admin"
19892
+ }), method(WriteChunkInputSchema, _void(), {
19893
+ kind: "mutation",
19894
+ auth: "admin"
19895
+ }), method(FinalizeUploadInputSchema, _void(), {
19896
+ kind: "mutation",
19897
+ auth: "admin"
19898
+ }), method(AbortUploadInputSchema, _void(), {
19899
+ kind: "mutation",
19900
+ auth: "admin"
19901
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19902
+ kind: "mutation",
19903
+ auth: "admin"
19904
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19905
+ kind: "mutation",
19906
+ auth: "admin"
19907
+ });
19820
19908
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19821
19909
  var ProfileSettingsSchemaBridge = unknown().nullable();
19822
19910
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20074,7 +20162,8 @@ method(object({
20074
20162
  access: "create"
20075
20163
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20076
20164
  kind: "mutation",
20077
- access: "view"
20165
+ access: "view",
20166
+ auth: "admin"
20078
20167
  }), method(object({
20079
20168
  /** Required — the user the assertion belongs to (verified). */
20080
20169
  userId: string(),
@@ -20082,10 +20171,12 @@ method(object({
20082
20171
  response: record(string(), unknown())
20083
20172
  }), object({ verified: boolean() }), {
20084
20173
  kind: "mutation",
20085
- access: "view"
20174
+ access: "view",
20175
+ auth: "admin"
20086
20176
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20087
20177
  kind: "mutation",
20088
- access: "view"
20178
+ access: "view",
20179
+ auth: "admin"
20089
20180
  }), method(object({
20090
20181
  /** AuthenticationResponseJSON from the browser. */
20091
20182
  response: record(string(), unknown()) }), object({
@@ -20093,7 +20184,8 @@ response: record(string(), unknown()) }), object({
20093
20184
  userId: string().nullable()
20094
20185
  }), {
20095
20186
  kind: "mutation",
20096
- access: "view"
20187
+ access: "view",
20188
+ auth: "admin"
20097
20189
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20098
20190
  userId: string(),
20099
20191
  credentialId: string()
@@ -20265,7 +20357,19 @@ var VectorStatsResultSchema = object({
20265
20357
  /** False when the backend ranks approximately. */
20266
20358
  exact: boolean()
20267
20359
  });
20268
- 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);
20360
+ method(VectorDeclareIndexInputSchema, _void(), {
20361
+ kind: "mutation",
20362
+ auth: "admin"
20363
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20364
+ kind: "mutation",
20365
+ auth: "admin"
20366
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20367
+ kind: "mutation",
20368
+ auth: "admin"
20369
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20370
+ kind: "mutation",
20371
+ auth: "admin"
20372
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20269
20373
  var ClipSchema = object({
20270
20374
  /** Opaque, provider-namespaced id. The default provider encodes the time
20271
20375
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21988,7 +22092,27 @@ var MediaFileLiteSchema$1 = object({
21988
22092
  sizeBytes: number(),
21989
22093
  timestamp: number()
21990
22094
  });
21991
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22095
+ method(object({
22096
+ /**
22097
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22098
+ *
22099
+ * Default `false`, the same inversion `listRecentFaces` and
22100
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22101
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22102
+ * on the live hub the same day: four identities cost 40,979 B with the
22103
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22104
+ * four times and the viewer holds at `staleTime: 30_000`.
22105
+ *
22106
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22107
+ * the `event-media` plane serves that key `immutable` with an ETag.
22108
+ *
22109
+ * **This is an INPUT field, so it does not reach the addon until the
22110
+ * next train** — the hub router validates cap inputs against its own
22111
+ * compiled Zod and strips a key it does not know. Until then the
22112
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22113
+ * is what ships, and the opt-in becomes reachable when the train lands.
22114
+ */
22115
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21992
22116
  kind: "mutation",
21993
22117
  auth: "admin"
21994
22118
  }), method(object({
@@ -24135,8 +24259,10 @@ var PlateInfoSchema = object({
24135
24259
  keyFrameMediaKey: string().optional(),
24136
24260
  base64: string().optional(),
24137
24261
  /**
24138
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24139
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24262
+ * Same crop as a data-plane URL, always present when the plate has a stored
24263
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24264
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24265
+ * left at its `true` default.
24140
24266
  */
24141
24267
  cropUrl: string().optional()
24142
24268
  });
@@ -24156,14 +24282,34 @@ var PlateClusterSchema = object({
24156
24282
  });
24157
24283
  method(object({
24158
24284
  deviceId: number().int().optional(),
24159
- limit: number().int().positive().optional()
24285
+ limit: number().int().positive().optional(),
24286
+ /**
24287
+ * Inline the base64 crop on every row. Default `true` — the existing
24288
+ * behaviour, kept so no caller breaks.
24289
+ *
24290
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24291
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24292
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24293
+ * metadata without them — and the browser then caches the images.
24294
+ *
24295
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24296
+ * plates were the one gallery list left without it.
24297
+ *
24298
+ * **This is an INPUT field, so it does not reach the addon until the
24299
+ * next train.** The hub router validates cap inputs against its own
24300
+ * compiled Zod and strips a key it does not know. Until the train
24301
+ * ships, sending `false` is harmless and keeps the crops inline.
24302
+ */
24303
+ includeCrops: boolean().optional()
24160
24304
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24161
24305
  deviceId: number().int(),
24162
24306
  trackId: string()
24163
24307
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24164
24308
  text: string().min(1),
24165
24309
  maxDistance: number().int().min(0).optional(),
24166
- limit: number().int().positive().optional()
24310
+ limit: number().int().positive().optional(),
24311
+ /** See `listPlates.includeCrops`. Default `true`. */
24312
+ includeCrops: boolean().optional()
24167
24313
  }), array(PlateInfoSchema).readonly()), method(object({
24168
24314
  maxDistance: number().int().min(0).optional(),
24169
24315
  minClusterSize: number().int().min(2).optional(),
@@ -24177,7 +24323,13 @@ method(object({
24177
24323
  }), method(object({ plateId: string() }), _void(), {
24178
24324
  kind: "mutation",
24179
24325
  auth: "admin"
24180
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24326
+ }), method(object({
24327
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24328
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24329
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24330
+ * INPUT field: stripped by the hub router until the train ships, which
24331
+ * resolves to `false` and is exactly the intended default. */
24332
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24181
24333
  kind: "mutation",
24182
24334
  auth: "admin"
24183
24335
  }), method(object({
@@ -29554,6 +29706,12 @@ Object.freeze({
29554
29706
  addonId: null,
29555
29707
  access: "create"
29556
29708
  },
29709
+ "pipelineAnalytics.cancelRelocateMedia": {
29710
+ capName: "pipeline-analytics",
29711
+ capScope: "device",
29712
+ addonId: null,
29713
+ access: "create"
29714
+ },
29557
29715
  "pipelineAnalytics.cancelStorageMigrationMove": {
29558
29716
  capName: "pipeline-analytics",
29559
29717
  capScope: "device",
@@ -29728,6 +29886,12 @@ Object.freeze({
29728
29886
  addonId: null,
29729
29887
  access: "view"
29730
29888
  },
29889
+ "pipelineAnalytics.listRelocateMediaJobs": {
29890
+ capName: "pipeline-analytics",
29891
+ capScope: "device",
29892
+ addonId: null,
29893
+ access: "view"
29894
+ },
29731
29895
  "pipelineAnalytics.listRetrainAnnotations": {
29732
29896
  capName: "pipeline-analytics",
29733
29897
  capScope: "device",
@@ -29806,6 +29970,12 @@ Object.freeze({
29806
29970
  addonId: null,
29807
29971
  access: "create"
29808
29972
  },
29973
+ "pipelineAnalytics.relocateMedia": {
29974
+ capName: "pipeline-analytics",
29975
+ capScope: "device",
29976
+ addonId: null,
29977
+ access: "create"
29978
+ },
29809
29979
  "pipelineAnalytics.restageRetrainTrack": {
29810
29980
  capName: "pipeline-analytics",
29811
29981
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-decoder-ffmpeg",
3
- "version": "1.2.27",
3
+ "version": "1.2.28",
4
4
  "description": "Standalone ffmpeg-subprocess decoder fallback addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",