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