@camstack/addon-provider-rtsp 1.2.28 → 1.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +249 -79
  2. package/dist/addon.mjs +249 -79
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -6654,7 +6654,7 @@ function method(input, output, options) {
6654
6654
  input,
6655
6655
  output,
6656
6656
  kind: options?.kind ?? "query",
6657
- auth: options?.auth ?? "protected",
6657
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6658
6658
  ...options?.access !== void 0 ? { access: options.access } : {},
6659
6659
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6660
6660
  timeoutMs: options?.timeoutMs
@@ -6678,7 +6678,7 @@ function event(data) {
6678
6678
  }
6679
6679
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6680
6680
  var VersionOutputSchema$1 = object({ version: string() });
6681
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6681
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6682
6682
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6683
6683
  DeviceType["Camera"] = "camera";
6684
6684
  DeviceType["Hub"] = "hub";
@@ -6999,7 +6999,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6999
6999
  }({});
7000
7000
  var StaticDirOutputSchema = object({ staticDir: string() });
7001
7001
  var VersionOutputSchema = object({ version: string() });
7002
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7002
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7003
7003
  /**
7004
7004
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7005
7005
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7657,24 +7657,6 @@ var RecordingRetentionSchema = object({
7657
7657
  maxSizeGb: number().min(0).optional()
7658
7658
  });
7659
7659
  /**
7660
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7661
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7662
- * previews at. Five graduated steps; absent on a config = `standard` (the
7663
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7664
- *
7665
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7666
- * Each window's index sidecar carries its own tile dims, so a camera whose
7667
- * preset changed over time renders every historical window at the dims it was
7668
- * written with.
7669
- */
7670
- var ScrubThumbnailPresetSchema = _enum([
7671
- "minimal",
7672
- "low",
7673
- "standard",
7674
- "high",
7675
- "max"
7676
- ]);
7677
- /**
7678
7660
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7679
7661
  *
7680
7662
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7682,7 +7664,11 @@ var ScrubThumbnailPresetSchema = _enum([
7682
7664
  * other field is a storage knob (profiles, segment length, retention, scrub).
7683
7665
  *
7684
7666
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7685
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7667
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7668
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7669
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7670
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7671
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7686
7672
  * A stale caller must fail loudly — silently stripping its legacy intent would
7687
7673
  * persist a band-less config, i.e. silently stop recording the camera.
7688
7674
  */
@@ -7705,14 +7691,7 @@ var RecordingConfigSchema = object({
7705
7691
  * "off" is the absence of a covering band, never a band value.
7706
7692
  */
7707
7693
  bands: array(RecordingBandSchema).default([]),
7708
- retention: RecordingRetentionSchema.optional(),
7709
- /**
7710
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7711
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7712
- * windows only — existing sheets are immutable, and each window's index
7713
- * carries its own tile dims so mixed-preset history renders correctly.
7714
- */
7715
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7694
+ retention: RecordingRetentionSchema.optional()
7716
7695
  }).strict();
7717
7696
  /**
7718
7697
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7788,10 +7767,11 @@ var RelocateFootageInputSchema = object({
7788
7767
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7789
7768
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7790
7769
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7791
- var StorageMigrationMediaMoveInputSchema = object({
7770
+ var RelocateMediaInputSchema = object({
7792
7771
  toLocationId: string(),
7793
7772
  throttleMbps: number().min(1).max(1e3).optional()
7794
- }).extend({ leaseId: string().min(1) });
7773
+ });
7774
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7795
7775
  /** The independently selectable logical storage classes. `recordings`
7796
7776
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7797
7777
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8086,7 +8066,26 @@ var LabelDefinitionSchema = object({
8086
8066
  description: string().optional(),
8087
8067
  icon: string().optional()
8088
8068
  });
8089
- var ClassMapDefinitionSchema = object({
8069
+ /**
8070
+ * Wire schema for a per-model CATALOG classMap override
8071
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8072
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8073
+ * detection pipeline executor actually routes.
8074
+ *
8075
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8076
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8077
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8078
+ * enum) — the two used to share the name `ClassMapDefinition`/
8079
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8080
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8081
+ * are not: it is two different concepts colliding on a name. Keep this type
8082
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8083
+ * would either narrow every `ClassMapDefinition` consumer to the four
8084
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8085
+ * schema exists for (see the "rejects a classMap whose target is not a
8086
+ * detection macro" test in `model-catalog-schema.test.ts`).
8087
+ */
8088
+ var DetectionCatalogClassMapSchema = object({
8090
8089
  mapping: record(string(), _enum([
8091
8090
  "person",
8092
8091
  "vehicle",
@@ -8291,7 +8290,7 @@ var ModelCatalogEntrySchema = object({
8291
8290
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8292
8291
  * labels already ARE the CamStack macros (Scrypted identity map).
8293
8292
  */
8294
- classMap: ClassMapDefinitionSchema.optional()
8293
+ classMap: DetectionCatalogClassMapSchema.optional()
8295
8294
  });
8296
8295
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8297
8296
  format: literal("openvino"),
@@ -8321,7 +8320,7 @@ var ModelConvertMetadataSchema = object({
8321
8320
  "segmentation"
8322
8321
  ]),
8323
8322
  faceAlignment: boolean().optional(),
8324
- classMap: ClassMapDefinitionSchema.optional()
8323
+ classMap: DetectionCatalogClassMapSchema.optional()
8325
8324
  });
8326
8325
  var ConvertResultSchema = object({
8327
8326
  entry: ModelCatalogEntrySchema,
@@ -9184,7 +9183,7 @@ var AddonPageDeclarationSchema = object({
9184
9183
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9185
9184
  sectionLabel: string().optional()
9186
9185
  });
9187
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9186
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9188
9187
  var AddonHttpRouteSchema = object({
9189
9188
  method: _enum([
9190
9189
  "GET",
@@ -9419,7 +9418,7 @@ var WidgetMetadataSchema = object({
9419
9418
  defaultColumns: number().int().min(1).max(12).default(6),
9420
9419
  defaultRows: number().int().min(1).max(12).default(1)
9421
9420
  });
9422
- method(_void(), array(WidgetMetadataSchema).readonly());
9421
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9423
9422
  /**
9424
9423
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9425
9424
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11043,7 +11042,7 @@ var CustomModelDescriptorSchema = object({
11043
11042
  stepId: string(),
11044
11043
  entry: ModelCatalogEntrySchema
11045
11044
  });
11046
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11045
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11047
11046
  /**
11048
11047
  * Query filter for settings-store collections.
11049
11048
  */
@@ -11130,7 +11129,8 @@ method(object({
11130
11129
  }), _void(), { kind: "mutation" }), method(object({
11131
11130
  namespace: string().optional(),
11132
11131
  collection: string(),
11133
- filter: QueryFilterSchema.optional()
11132
+ filter: QueryFilterSchema.optional(),
11133
+ columns: array(string()).readonly().optional()
11134
11134
  }), array(SettingsRecordSchema).readonly()), method(object({
11135
11135
  namespace: string().optional(),
11136
11136
  collection: string(),
@@ -11193,46 +11193,87 @@ var EngineInfoSchema = object({
11193
11193
  kind: _enum(["relational", "vector"]),
11194
11194
  displayName: string()
11195
11195
  });
11196
- method(_void(), EngineInfoSchema), method(object({
11196
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11197
11197
  namespace: string().optional(),
11198
11198
  collection: string(),
11199
11199
  key: string()
11200
- }), unknown()), method(object({
11200
+ }), unknown(), { auth: "admin" }), method(object({
11201
11201
  namespace: string().optional(),
11202
11202
  collection: string(),
11203
11203
  key: string(),
11204
11204
  value: unknown()
11205
- }), _void(), { kind: "mutation" }), method(object({
11205
+ }), _void(), {
11206
+ kind: "mutation",
11207
+ auth: "admin"
11208
+ }), method(object({
11206
11209
  namespace: string().optional(),
11207
11210
  collection: string(),
11208
- filter: QueryFilterSchema.optional()
11209
- }), array(SettingsRecordSchema).readonly()), method(object({
11211
+ filter: QueryFilterSchema.optional(),
11212
+ /**
11213
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11214
+ *
11215
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11216
+ * was wrong — corrected 2026-08-26 after the hop map
11217
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11218
+ * There is **no Zod parse at all** between the door and the engine: the
11219
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11220
+ * field declared here reaches `SqliteSettingsBackend` either way.
11221
+ *
11222
+ * What actually lost `columns` was the THIRD declaration of this shape:
11223
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11224
+ * interface the engine destructures from. The field existed on both
11225
+ * schemas and the engine still never read it, because nothing checks a
11226
+ * registered provider against `InferProvider<cap>` —
11227
+ * `ProviderRegistration.provider` is typed `object`.
11228
+ *
11229
+ * It is declared here anyway, and must stay in step with
11230
+ * `settings-store.query`: a caller reading only the cap definitions has
11231
+ * to be able to see that this call carries a projection.
11232
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11233
+ */
11234
+ columns: array(string()).readonly().optional()
11235
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11210
11236
  namespace: string().optional(),
11211
11237
  collection: string(),
11212
11238
  record: SettingsRecordSchema
11213
- }), _void(), { kind: "mutation" }), method(object({
11239
+ }), _void(), {
11240
+ kind: "mutation",
11241
+ auth: "admin"
11242
+ }), method(object({
11214
11243
  namespace: string().optional(),
11215
11244
  collection: string(),
11216
11245
  id: string(),
11217
11246
  data: record(string(), unknown())
11218
- }), _void(), { kind: "mutation" }), method(object({
11247
+ }), _void(), {
11248
+ kind: "mutation",
11249
+ auth: "admin"
11250
+ }), method(object({
11219
11251
  namespace: string().optional(),
11220
11252
  collection: string(),
11221
11253
  key: string()
11222
- }), _void(), { kind: "mutation" }), method(object({
11254
+ }), _void(), {
11255
+ kind: "mutation",
11256
+ auth: "admin"
11257
+ }), method(object({
11223
11258
  namespace: string().optional(),
11224
11259
  collection: string(),
11225
11260
  filter: MutationFilterSchema
11226
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11261
+ }), object({ deleted: number().int() }), {
11262
+ kind: "mutation",
11263
+ auth: "admin"
11264
+ }), method(object({
11227
11265
  namespace: string().optional(),
11228
11266
  collection: string(),
11229
11267
  filter: MutationFilterSchema,
11230
11268
  data: record(string(), unknown())
11231
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11269
+ }), object({ updated: number().int() }), {
11270
+ kind: "mutation",
11271
+ auth: "admin"
11272
+ }), method(object({
11232
11273
  namespace: string().optional(),
11233
11274
  collection: string(),
11234
11275
  filter: QueryFilterSchema.optional()
11235
- }), number()), method(object({
11276
+ }), number(), { auth: "admin" }), method(object({
11236
11277
  namespace: string().optional(),
11237
11278
  collection: string(),
11238
11279
  field: string(),
@@ -11242,15 +11283,18 @@ method(_void(), EngineInfoSchema), method(object({
11242
11283
  }), array(object({
11243
11284
  bucket: number().int(),
11244
11285
  count: number().int()
11245
- })).readonly()), method(object({
11286
+ })).readonly(), { auth: "admin" }), method(object({
11246
11287
  namespace: string().optional(),
11247
11288
  collection: string()
11248
- }), boolean()), method(object({
11289
+ }), boolean(), { auth: "admin" }), method(object({
11249
11290
  namespace: string().optional(),
11250
11291
  collection: string(),
11251
11292
  columns: array(CollectionColumnSchema).readonly(),
11252
11293
  indexes: array(CollectionIndexSchema).readonly().optional()
11253
- }), _void(), { kind: "mutation" });
11294
+ }), _void(), {
11295
+ kind: "mutation",
11296
+ auth: "admin"
11297
+ });
11254
11298
  /**
11255
11299
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11256
11300
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12540,7 +12584,7 @@ method(object({
12540
12584
  crop: _instanceof(Uint8Array),
12541
12585
  width: number(),
12542
12586
  height: number()
12543
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12587
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12544
12588
  /**
12545
12589
  * filesystem-browse — per-node capability for browsing the node's local
12546
12590
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12833,19 +12877,22 @@ method(LlmGenerateBaseInputSchema.extend({
12833
12877
  runtime: ManagedRuntimeConfigSchema,
12834
12878
  /** The managed profile's timeout, threaded by the hub provider. */
12835
12879
  timeoutMs: number().int().positive().optional()
12836
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12880
+ }), LlmGenerateResultSchema, {
12881
+ kind: "mutation",
12882
+ auth: "admin"
12883
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12837
12884
  kind: "mutation",
12838
12885
  auth: "admin"
12839
12886
  }), method(object({}), _void(), {
12840
12887
  kind: "mutation",
12841
12888
  auth: "admin"
12842
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12889
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12843
12890
  kind: "mutation",
12844
12891
  auth: "admin"
12845
12892
  }), method(object({ file: string() }), _void(), {
12846
12893
  kind: "mutation",
12847
12894
  auth: "admin"
12848
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12895
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12849
12896
  /**
12850
12897
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12851
12898
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16356,7 +16403,7 @@ var OauthIntegrationDescriptorSchema = object({
16356
16403
  */
16357
16404
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16358
16405
  });
16359
- method(_void(), OauthIntegrationDescriptorSchema);
16406
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16360
16407
  /**
16361
16408
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16362
16409
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17551,6 +17598,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17551
17598
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17552
17599
  kind: "mutation",
17553
17600
  auth: "admin"
17601
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17602
+ kind: "mutation",
17603
+ auth: "admin"
17604
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17605
+ kind: "query",
17606
+ auth: "admin"
17607
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17608
+ kind: "mutation",
17609
+ auth: "admin"
17554
17610
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17555
17611
  kind: "query",
17556
17612
  auth: "admin"
@@ -17705,6 +17761,11 @@ object({
17705
17761
  "jpeg"
17706
17762
  ])
17707
17763
  });
17764
+ /**
17765
+ * Process-local frame identity. It is serializable so it can ride an in-process
17766
+ * capability call, but `registryId` deliberately prevents resolution in any
17767
+ * other process or execution group.
17768
+ */
17708
17769
  var FrameRefSchema = object({
17709
17770
  registryId: string().min(1),
17710
17771
  id: string().min(1),
@@ -20014,7 +20075,7 @@ method(object({
20014
20075
  * linking rather than produce an eternal token.
20015
20076
  */
20016
20077
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20017
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20078
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20018
20079
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20019
20080
  providerId: string().min(1),
20020
20081
  displayName: string().min(1),
@@ -20109,10 +20170,13 @@ var EvictResultSchema = object({
20109
20170
  /** True when the provider has nothing left it is willing to drop on this location. */
20110
20171
  exhausted: boolean()
20111
20172
  });
20112
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20173
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20113
20174
  locationId: string(),
20114
20175
  targetBytes: number().int().positive()
20115
- }), EvictResultSchema, { kind: "mutation" });
20176
+ }), EvictResultSchema, {
20177
+ kind: "mutation",
20178
+ auth: "admin"
20179
+ });
20116
20180
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20117
20181
  kind: "mutation",
20118
20182
  auth: "admin"
@@ -20172,26 +20236,50 @@ var ReadChunkInputSchema = object({
20172
20236
  length: number()
20173
20237
  });
20174
20238
  var EndDownloadInputSchema = object({ downloadId: string() });
20175
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20239
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20176
20240
  location: StorageLocationSchema,
20177
20241
  relativePath: string()
20178
- }), string()), method(object({
20242
+ }), string(), { auth: "admin" }), method(object({
20179
20243
  location: StorageLocationSchema,
20180
20244
  relativePath: string(),
20181
20245
  data: _instanceof(Uint8Array)
20182
- }), _void(), { kind: "mutation" }), method(object({
20246
+ }), _void(), {
20247
+ kind: "mutation",
20248
+ auth: "admin"
20249
+ }), method(object({
20183
20250
  location: StorageLocationSchema,
20184
20251
  relativePath: string()
20185
- }), _instanceof(Uint8Array)), method(object({
20252
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20186
20253
  location: StorageLocationSchema,
20187
20254
  relativePath: string()
20188
- }), boolean()), method(object({
20255
+ }), boolean(), { auth: "admin" }), method(object({
20189
20256
  location: StorageLocationSchema,
20190
20257
  prefix: string().optional()
20191
- }), array(string()).readonly()), method(object({
20258
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20192
20259
  location: StorageLocationSchema,
20193
20260
  relativePath: string()
20194
- }), _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" });
20261
+ }), _void(), {
20262
+ kind: "mutation",
20263
+ auth: "admin"
20264
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20265
+ kind: "mutation",
20266
+ auth: "admin"
20267
+ }), method(WriteChunkInputSchema, _void(), {
20268
+ kind: "mutation",
20269
+ auth: "admin"
20270
+ }), method(FinalizeUploadInputSchema, _void(), {
20271
+ kind: "mutation",
20272
+ auth: "admin"
20273
+ }), method(AbortUploadInputSchema, _void(), {
20274
+ kind: "mutation",
20275
+ auth: "admin"
20276
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20277
+ kind: "mutation",
20278
+ auth: "admin"
20279
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20280
+ kind: "mutation",
20281
+ auth: "admin"
20282
+ });
20195
20283
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20196
20284
  var ProfileSettingsSchemaBridge = unknown().nullable();
20197
20285
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20449,7 +20537,8 @@ method(object({
20449
20537
  access: "create"
20450
20538
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20451
20539
  kind: "mutation",
20452
- access: "view"
20540
+ access: "view",
20541
+ auth: "admin"
20453
20542
  }), method(object({
20454
20543
  /** Required — the user the assertion belongs to (verified). */
20455
20544
  userId: string(),
@@ -20457,10 +20546,12 @@ method(object({
20457
20546
  response: record(string(), unknown())
20458
20547
  }), object({ verified: boolean() }), {
20459
20548
  kind: "mutation",
20460
- access: "view"
20549
+ access: "view",
20550
+ auth: "admin"
20461
20551
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20462
20552
  kind: "mutation",
20463
- access: "view"
20553
+ access: "view",
20554
+ auth: "admin"
20464
20555
  }), method(object({
20465
20556
  /** AuthenticationResponseJSON from the browser. */
20466
20557
  response: record(string(), unknown()) }), object({
@@ -20468,7 +20559,8 @@ response: record(string(), unknown()) }), object({
20468
20559
  userId: string().nullable()
20469
20560
  }), {
20470
20561
  kind: "mutation",
20471
- access: "view"
20562
+ access: "view",
20563
+ auth: "admin"
20472
20564
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20473
20565
  userId: string(),
20474
20566
  credentialId: string()
@@ -20640,7 +20732,19 @@ var VectorStatsResultSchema = object({
20640
20732
  /** False when the backend ranks approximately. */
20641
20733
  exact: boolean()
20642
20734
  });
20643
- 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);
20735
+ method(VectorDeclareIndexInputSchema, _void(), {
20736
+ kind: "mutation",
20737
+ auth: "admin"
20738
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20739
+ kind: "mutation",
20740
+ auth: "admin"
20741
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20742
+ kind: "mutation",
20743
+ auth: "admin"
20744
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20745
+ kind: "mutation",
20746
+ auth: "admin"
20747
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20644
20748
  var ClipSchema = object({
20645
20749
  /** Opaque, provider-namespaced id. The default provider encodes the time
20646
20750
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23101,7 +23205,27 @@ var MediaFileLiteSchema$1 = object({
23101
23205
  sizeBytes: number(),
23102
23206
  timestamp: number()
23103
23207
  });
23104
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23208
+ method(object({
23209
+ /**
23210
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23211
+ *
23212
+ * Default `false`, the same inversion `listRecentFaces` and
23213
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23214
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23215
+ * on the live hub the same day: four identities cost 40,979 B with the
23216
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23217
+ * four times and the viewer holds at `staleTime: 30_000`.
23218
+ *
23219
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23220
+ * the `event-media` plane serves that key `immutable` with an ETag.
23221
+ *
23222
+ * **This is an INPUT field, so it does not reach the addon until the
23223
+ * next train** — the hub router validates cap inputs against its own
23224
+ * compiled Zod and strips a key it does not know. Until then the
23225
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23226
+ * is what ships, and the opt-in becomes reachable when the train lands.
23227
+ */
23228
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23105
23229
  kind: "mutation",
23106
23230
  auth: "admin"
23107
23231
  }), method(object({
@@ -25991,8 +26115,10 @@ var PlateInfoSchema = object({
25991
26115
  keyFrameMediaKey: string().optional(),
25992
26116
  base64: string().optional(),
25993
26117
  /**
25994
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25995
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26118
+ * Same crop as a data-plane URL, always present when the plate has a stored
26119
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26120
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26121
+ * left at its `true` default.
25996
26122
  */
25997
26123
  cropUrl: string().optional()
25998
26124
  });
@@ -26012,14 +26138,34 @@ var PlateClusterSchema = object({
26012
26138
  });
26013
26139
  method(object({
26014
26140
  deviceId: number().int().optional(),
26015
- limit: number().int().positive().optional()
26141
+ limit: number().int().positive().optional(),
26142
+ /**
26143
+ * Inline the base64 crop on every row. Default `true` — the existing
26144
+ * behaviour, kept so no caller breaks.
26145
+ *
26146
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26147
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26148
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26149
+ * metadata without them — and the browser then caches the images.
26150
+ *
26151
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26152
+ * plates were the one gallery list left without it.
26153
+ *
26154
+ * **This is an INPUT field, so it does not reach the addon until the
26155
+ * next train.** The hub router validates cap inputs against its own
26156
+ * compiled Zod and strips a key it does not know. Until the train
26157
+ * ships, sending `false` is harmless and keeps the crops inline.
26158
+ */
26159
+ includeCrops: boolean().optional()
26016
26160
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26017
26161
  deviceId: number().int(),
26018
26162
  trackId: string()
26019
26163
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26020
26164
  text: string().min(1),
26021
26165
  maxDistance: number().int().min(0).optional(),
26022
- limit: number().int().positive().optional()
26166
+ limit: number().int().positive().optional(),
26167
+ /** See `listPlates.includeCrops`. Default `true`. */
26168
+ includeCrops: boolean().optional()
26023
26169
  }), array(PlateInfoSchema).readonly()), method(object({
26024
26170
  maxDistance: number().int().min(0).optional(),
26025
26171
  minClusterSize: number().int().min(2).optional(),
@@ -26033,7 +26179,13 @@ method(object({
26033
26179
  }), method(object({ plateId: string() }), _void(), {
26034
26180
  kind: "mutation",
26035
26181
  auth: "admin"
26036
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26182
+ }), method(object({
26183
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26184
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26185
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26186
+ * INPUT field: stripped by the hub router until the train ships, which
26187
+ * resolves to `false` and is exactly the intended default. */
26188
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26037
26189
  kind: "mutation",
26038
26190
  auth: "admin"
26039
26191
  }), method(object({
@@ -33360,6 +33512,12 @@ Object.freeze({
33360
33512
  addonId: null,
33361
33513
  access: "create"
33362
33514
  },
33515
+ "pipelineAnalytics.cancelRelocateMedia": {
33516
+ capName: "pipeline-analytics",
33517
+ capScope: "device",
33518
+ addonId: null,
33519
+ access: "create"
33520
+ },
33363
33521
  "pipelineAnalytics.cancelStorageMigrationMove": {
33364
33522
  capName: "pipeline-analytics",
33365
33523
  capScope: "device",
@@ -33534,6 +33692,12 @@ Object.freeze({
33534
33692
  addonId: null,
33535
33693
  access: "view"
33536
33694
  },
33695
+ "pipelineAnalytics.listRelocateMediaJobs": {
33696
+ capName: "pipeline-analytics",
33697
+ capScope: "device",
33698
+ addonId: null,
33699
+ access: "view"
33700
+ },
33537
33701
  "pipelineAnalytics.listRetrainAnnotations": {
33538
33702
  capName: "pipeline-analytics",
33539
33703
  capScope: "device",
@@ -33612,6 +33776,12 @@ Object.freeze({
33612
33776
  addonId: null,
33613
33777
  access: "create"
33614
33778
  },
33779
+ "pipelineAnalytics.relocateMedia": {
33780
+ capName: "pipeline-analytics",
33781
+ capScope: "device",
33782
+ addonId: null,
33783
+ access: "create"
33784
+ },
33615
33785
  "pipelineAnalytics.restageRetrainTrack": {
33616
33786
  capName: "pipeline-analytics",
33617
33787
  capScope: "device",
package/dist/addon.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
@@ -6654,7 +6654,7 @@ function event(data) {
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.
@@ -7633,24 +7633,6 @@ var RecordingRetentionSchema = object({
7633
7633
  maxSizeGb: number().min(0).optional()
7634
7634
  });
7635
7635
  /**
7636
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7637
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7638
- * previews at. Five graduated steps; absent on a config = `standard` (the
7639
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7640
- *
7641
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7642
- * Each window's index sidecar carries its own tile dims, so a camera whose
7643
- * preset changed over time renders every historical window at the dims it was
7644
- * written with.
7645
- */
7646
- var ScrubThumbnailPresetSchema = _enum([
7647
- "minimal",
7648
- "low",
7649
- "standard",
7650
- "high",
7651
- "max"
7652
- ]);
7653
- /**
7654
7636
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7655
7637
  *
7656
7638
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7658,7 +7640,11 @@ var ScrubThumbnailPresetSchema = _enum([
7658
7640
  * other field is a storage knob (profiles, segment length, retention, scrub).
7659
7641
  *
7660
7642
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7661
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7643
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7644
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7645
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7646
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7647
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7662
7648
  * A stale caller must fail loudly — silently stripping its legacy intent would
7663
7649
  * persist a band-less config, i.e. silently stop recording the camera.
7664
7650
  */
@@ -7681,14 +7667,7 @@ var RecordingConfigSchema = object({
7681
7667
  * "off" is the absence of a covering band, never a band value.
7682
7668
  */
7683
7669
  bands: array(RecordingBandSchema).default([]),
7684
- retention: RecordingRetentionSchema.optional(),
7685
- /**
7686
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7687
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7688
- * windows only — existing sheets are immutable, and each window's index
7689
- * carries its own tile dims so mixed-preset history renders correctly.
7690
- */
7691
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7670
+ retention: RecordingRetentionSchema.optional()
7692
7671
  }).strict();
7693
7672
  /**
7694
7673
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7764,10 +7743,11 @@ var RelocateFootageInputSchema = object({
7764
7743
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7765
7744
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7766
7745
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7767
- var StorageMigrationMediaMoveInputSchema = object({
7746
+ var RelocateMediaInputSchema = object({
7768
7747
  toLocationId: string(),
7769
7748
  throttleMbps: number().min(1).max(1e3).optional()
7770
- }).extend({ leaseId: string().min(1) });
7749
+ });
7750
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7771
7751
  /** The independently selectable logical storage classes. `recordings`
7772
7752
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7773
7753
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8062,7 +8042,26 @@ var LabelDefinitionSchema = object({
8062
8042
  description: string().optional(),
8063
8043
  icon: string().optional()
8064
8044
  });
8065
- var ClassMapDefinitionSchema = object({
8045
+ /**
8046
+ * Wire schema for a per-model CATALOG classMap override
8047
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8048
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8049
+ * detection pipeline executor actually routes.
8050
+ *
8051
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8052
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8053
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8054
+ * enum) — the two used to share the name `ClassMapDefinition`/
8055
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8056
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8057
+ * are not: it is two different concepts colliding on a name. Keep this type
8058
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8059
+ * would either narrow every `ClassMapDefinition` consumer to the four
8060
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8061
+ * schema exists for (see the "rejects a classMap whose target is not a
8062
+ * detection macro" test in `model-catalog-schema.test.ts`).
8063
+ */
8064
+ var DetectionCatalogClassMapSchema = object({
8066
8065
  mapping: record(string(), _enum([
8067
8066
  "person",
8068
8067
  "vehicle",
@@ -8267,7 +8266,7 @@ var ModelCatalogEntrySchema = object({
8267
8266
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8268
8267
  * labels already ARE the CamStack macros (Scrypted identity map).
8269
8268
  */
8270
- classMap: ClassMapDefinitionSchema.optional()
8269
+ classMap: DetectionCatalogClassMapSchema.optional()
8271
8270
  });
8272
8271
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8273
8272
  format: literal("openvino"),
@@ -8297,7 +8296,7 @@ var ModelConvertMetadataSchema = object({
8297
8296
  "segmentation"
8298
8297
  ]),
8299
8298
  faceAlignment: boolean().optional(),
8300
- classMap: ClassMapDefinitionSchema.optional()
8299
+ classMap: DetectionCatalogClassMapSchema.optional()
8301
8300
  });
8302
8301
  var ConvertResultSchema = object({
8303
8302
  entry: ModelCatalogEntrySchema,
@@ -9160,7 +9159,7 @@ var AddonPageDeclarationSchema = object({
9160
9159
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9161
9160
  sectionLabel: string().optional()
9162
9161
  });
9163
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9162
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9164
9163
  var AddonHttpRouteSchema = object({
9165
9164
  method: _enum([
9166
9165
  "GET",
@@ -9395,7 +9394,7 @@ var WidgetMetadataSchema = object({
9395
9394
  defaultColumns: number().int().min(1).max(12).default(6),
9396
9395
  defaultRows: number().int().min(1).max(12).default(1)
9397
9396
  });
9398
- method(_void(), array(WidgetMetadataSchema).readonly());
9397
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9399
9398
  /**
9400
9399
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9401
9400
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11019,7 +11018,7 @@ var CustomModelDescriptorSchema = object({
11019
11018
  stepId: string(),
11020
11019
  entry: ModelCatalogEntrySchema
11021
11020
  });
11022
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11021
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11023
11022
  /**
11024
11023
  * Query filter for settings-store collections.
11025
11024
  */
@@ -11106,7 +11105,8 @@ method(object({
11106
11105
  }), _void(), { kind: "mutation" }), method(object({
11107
11106
  namespace: string().optional(),
11108
11107
  collection: string(),
11109
- filter: QueryFilterSchema.optional()
11108
+ filter: QueryFilterSchema.optional(),
11109
+ columns: array(string()).readonly().optional()
11110
11110
  }), array(SettingsRecordSchema).readonly()), method(object({
11111
11111
  namespace: string().optional(),
11112
11112
  collection: string(),
@@ -11169,46 +11169,87 @@ var EngineInfoSchema = object({
11169
11169
  kind: _enum(["relational", "vector"]),
11170
11170
  displayName: string()
11171
11171
  });
11172
- method(_void(), EngineInfoSchema), method(object({
11172
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11173
11173
  namespace: string().optional(),
11174
11174
  collection: string(),
11175
11175
  key: string()
11176
- }), unknown()), method(object({
11176
+ }), unknown(), { auth: "admin" }), method(object({
11177
11177
  namespace: string().optional(),
11178
11178
  collection: string(),
11179
11179
  key: string(),
11180
11180
  value: unknown()
11181
- }), _void(), { kind: "mutation" }), method(object({
11181
+ }), _void(), {
11182
+ kind: "mutation",
11183
+ auth: "admin"
11184
+ }), method(object({
11182
11185
  namespace: string().optional(),
11183
11186
  collection: string(),
11184
- filter: QueryFilterSchema.optional()
11185
- }), array(SettingsRecordSchema).readonly()), method(object({
11187
+ filter: QueryFilterSchema.optional(),
11188
+ /**
11189
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11190
+ *
11191
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11192
+ * was wrong — corrected 2026-08-26 after the hop map
11193
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11194
+ * There is **no Zod parse at all** between the door and the engine: the
11195
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11196
+ * field declared here reaches `SqliteSettingsBackend` either way.
11197
+ *
11198
+ * What actually lost `columns` was the THIRD declaration of this shape:
11199
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11200
+ * interface the engine destructures from. The field existed on both
11201
+ * schemas and the engine still never read it, because nothing checks a
11202
+ * registered provider against `InferProvider<cap>` —
11203
+ * `ProviderRegistration.provider` is typed `object`.
11204
+ *
11205
+ * It is declared here anyway, and must stay in step with
11206
+ * `settings-store.query`: a caller reading only the cap definitions has
11207
+ * to be able to see that this call carries a projection.
11208
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11209
+ */
11210
+ columns: array(string()).readonly().optional()
11211
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11186
11212
  namespace: string().optional(),
11187
11213
  collection: string(),
11188
11214
  record: SettingsRecordSchema
11189
- }), _void(), { kind: "mutation" }), method(object({
11215
+ }), _void(), {
11216
+ kind: "mutation",
11217
+ auth: "admin"
11218
+ }), method(object({
11190
11219
  namespace: string().optional(),
11191
11220
  collection: string(),
11192
11221
  id: string(),
11193
11222
  data: record(string(), unknown())
11194
- }), _void(), { kind: "mutation" }), method(object({
11223
+ }), _void(), {
11224
+ kind: "mutation",
11225
+ auth: "admin"
11226
+ }), method(object({
11195
11227
  namespace: string().optional(),
11196
11228
  collection: string(),
11197
11229
  key: string()
11198
- }), _void(), { kind: "mutation" }), method(object({
11230
+ }), _void(), {
11231
+ kind: "mutation",
11232
+ auth: "admin"
11233
+ }), method(object({
11199
11234
  namespace: string().optional(),
11200
11235
  collection: string(),
11201
11236
  filter: MutationFilterSchema
11202
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11237
+ }), object({ deleted: number().int() }), {
11238
+ kind: "mutation",
11239
+ auth: "admin"
11240
+ }), method(object({
11203
11241
  namespace: string().optional(),
11204
11242
  collection: string(),
11205
11243
  filter: MutationFilterSchema,
11206
11244
  data: record(string(), unknown())
11207
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11245
+ }), object({ updated: number().int() }), {
11246
+ kind: "mutation",
11247
+ auth: "admin"
11248
+ }), method(object({
11208
11249
  namespace: string().optional(),
11209
11250
  collection: string(),
11210
11251
  filter: QueryFilterSchema.optional()
11211
- }), number()), method(object({
11252
+ }), number(), { auth: "admin" }), method(object({
11212
11253
  namespace: string().optional(),
11213
11254
  collection: string(),
11214
11255
  field: string(),
@@ -11218,15 +11259,18 @@ method(_void(), EngineInfoSchema), method(object({
11218
11259
  }), array(object({
11219
11260
  bucket: number().int(),
11220
11261
  count: number().int()
11221
- })).readonly()), method(object({
11262
+ })).readonly(), { auth: "admin" }), method(object({
11222
11263
  namespace: string().optional(),
11223
11264
  collection: string()
11224
- }), boolean()), method(object({
11265
+ }), boolean(), { auth: "admin" }), method(object({
11225
11266
  namespace: string().optional(),
11226
11267
  collection: string(),
11227
11268
  columns: array(CollectionColumnSchema).readonly(),
11228
11269
  indexes: array(CollectionIndexSchema).readonly().optional()
11229
- }), _void(), { kind: "mutation" });
11270
+ }), _void(), {
11271
+ kind: "mutation",
11272
+ auth: "admin"
11273
+ });
11230
11274
  /**
11231
11275
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11232
11276
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12516,7 +12560,7 @@ method(object({
12516
12560
  crop: _instanceof(Uint8Array),
12517
12561
  width: number(),
12518
12562
  height: number()
12519
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12563
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12520
12564
  /**
12521
12565
  * filesystem-browse — per-node capability for browsing the node's local
12522
12566
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12809,19 +12853,22 @@ method(LlmGenerateBaseInputSchema.extend({
12809
12853
  runtime: ManagedRuntimeConfigSchema,
12810
12854
  /** The managed profile's timeout, threaded by the hub provider. */
12811
12855
  timeoutMs: number().int().positive().optional()
12812
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12856
+ }), LlmGenerateResultSchema, {
12857
+ kind: "mutation",
12858
+ auth: "admin"
12859
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12813
12860
  kind: "mutation",
12814
12861
  auth: "admin"
12815
12862
  }), method(object({}), _void(), {
12816
12863
  kind: "mutation",
12817
12864
  auth: "admin"
12818
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12865
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12819
12866
  kind: "mutation",
12820
12867
  auth: "admin"
12821
12868
  }), method(object({ file: string() }), _void(), {
12822
12869
  kind: "mutation",
12823
12870
  auth: "admin"
12824
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12871
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12825
12872
  /**
12826
12873
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12827
12874
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16332,7 +16379,7 @@ var OauthIntegrationDescriptorSchema = object({
16332
16379
  */
16333
16380
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16334
16381
  });
16335
- method(_void(), OauthIntegrationDescriptorSchema);
16382
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16336
16383
  /**
16337
16384
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16338
16385
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17527,6 +17574,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17527
17574
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17528
17575
  kind: "mutation",
17529
17576
  auth: "admin"
17577
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17578
+ kind: "mutation",
17579
+ auth: "admin"
17580
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17581
+ kind: "query",
17582
+ auth: "admin"
17583
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17584
+ kind: "mutation",
17585
+ auth: "admin"
17530
17586
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17531
17587
  kind: "query",
17532
17588
  auth: "admin"
@@ -17681,6 +17737,11 @@ object({
17681
17737
  "jpeg"
17682
17738
  ])
17683
17739
  });
17740
+ /**
17741
+ * Process-local frame identity. It is serializable so it can ride an in-process
17742
+ * capability call, but `registryId` deliberately prevents resolution in any
17743
+ * other process or execution group.
17744
+ */
17684
17745
  var FrameRefSchema = object({
17685
17746
  registryId: string().min(1),
17686
17747
  id: string().min(1),
@@ -19990,7 +20051,7 @@ method(object({
19990
20051
  * linking rather than produce an eternal token.
19991
20052
  */
19992
20053
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19993
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20054
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19994
20055
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19995
20056
  providerId: string().min(1),
19996
20057
  displayName: string().min(1),
@@ -20085,10 +20146,13 @@ var EvictResultSchema = object({
20085
20146
  /** True when the provider has nothing left it is willing to drop on this location. */
20086
20147
  exhausted: boolean()
20087
20148
  });
20088
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20149
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20089
20150
  locationId: string(),
20090
20151
  targetBytes: number().int().positive()
20091
- }), EvictResultSchema, { kind: "mutation" });
20152
+ }), EvictResultSchema, {
20153
+ kind: "mutation",
20154
+ auth: "admin"
20155
+ });
20092
20156
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20093
20157
  kind: "mutation",
20094
20158
  auth: "admin"
@@ -20148,26 +20212,50 @@ var ReadChunkInputSchema = object({
20148
20212
  length: number()
20149
20213
  });
20150
20214
  var EndDownloadInputSchema = object({ downloadId: string() });
20151
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20215
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20152
20216
  location: StorageLocationSchema,
20153
20217
  relativePath: string()
20154
- }), string()), method(object({
20218
+ }), string(), { auth: "admin" }), method(object({
20155
20219
  location: StorageLocationSchema,
20156
20220
  relativePath: string(),
20157
20221
  data: _instanceof(Uint8Array)
20158
- }), _void(), { kind: "mutation" }), method(object({
20222
+ }), _void(), {
20223
+ kind: "mutation",
20224
+ auth: "admin"
20225
+ }), method(object({
20159
20226
  location: StorageLocationSchema,
20160
20227
  relativePath: string()
20161
- }), _instanceof(Uint8Array)), method(object({
20228
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20162
20229
  location: StorageLocationSchema,
20163
20230
  relativePath: string()
20164
- }), boolean()), method(object({
20231
+ }), boolean(), { auth: "admin" }), method(object({
20165
20232
  location: StorageLocationSchema,
20166
20233
  prefix: string().optional()
20167
- }), array(string()).readonly()), method(object({
20234
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20168
20235
  location: StorageLocationSchema,
20169
20236
  relativePath: string()
20170
- }), _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" });
20237
+ }), _void(), {
20238
+ kind: "mutation",
20239
+ auth: "admin"
20240
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20241
+ kind: "mutation",
20242
+ auth: "admin"
20243
+ }), method(WriteChunkInputSchema, _void(), {
20244
+ kind: "mutation",
20245
+ auth: "admin"
20246
+ }), method(FinalizeUploadInputSchema, _void(), {
20247
+ kind: "mutation",
20248
+ auth: "admin"
20249
+ }), method(AbortUploadInputSchema, _void(), {
20250
+ kind: "mutation",
20251
+ auth: "admin"
20252
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20253
+ kind: "mutation",
20254
+ auth: "admin"
20255
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20256
+ kind: "mutation",
20257
+ auth: "admin"
20258
+ });
20171
20259
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20172
20260
  var ProfileSettingsSchemaBridge = unknown().nullable();
20173
20261
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20425,7 +20513,8 @@ method(object({
20425
20513
  access: "create"
20426
20514
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20427
20515
  kind: "mutation",
20428
- access: "view"
20516
+ access: "view",
20517
+ auth: "admin"
20429
20518
  }), method(object({
20430
20519
  /** Required — the user the assertion belongs to (verified). */
20431
20520
  userId: string(),
@@ -20433,10 +20522,12 @@ method(object({
20433
20522
  response: record(string(), unknown())
20434
20523
  }), object({ verified: boolean() }), {
20435
20524
  kind: "mutation",
20436
- access: "view"
20525
+ access: "view",
20526
+ auth: "admin"
20437
20527
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20438
20528
  kind: "mutation",
20439
- access: "view"
20529
+ access: "view",
20530
+ auth: "admin"
20440
20531
  }), method(object({
20441
20532
  /** AuthenticationResponseJSON from the browser. */
20442
20533
  response: record(string(), unknown()) }), object({
@@ -20444,7 +20535,8 @@ response: record(string(), unknown()) }), object({
20444
20535
  userId: string().nullable()
20445
20536
  }), {
20446
20537
  kind: "mutation",
20447
- access: "view"
20538
+ access: "view",
20539
+ auth: "admin"
20448
20540
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20449
20541
  userId: string(),
20450
20542
  credentialId: string()
@@ -20616,7 +20708,19 @@ var VectorStatsResultSchema = object({
20616
20708
  /** False when the backend ranks approximately. */
20617
20709
  exact: boolean()
20618
20710
  });
20619
- 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);
20711
+ method(VectorDeclareIndexInputSchema, _void(), {
20712
+ kind: "mutation",
20713
+ auth: "admin"
20714
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20715
+ kind: "mutation",
20716
+ auth: "admin"
20717
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20718
+ kind: "mutation",
20719
+ auth: "admin"
20720
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20721
+ kind: "mutation",
20722
+ auth: "admin"
20723
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20620
20724
  var ClipSchema = object({
20621
20725
  /** Opaque, provider-namespaced id. The default provider encodes the time
20622
20726
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23077,7 +23181,27 @@ var MediaFileLiteSchema$1 = object({
23077
23181
  sizeBytes: number(),
23078
23182
  timestamp: number()
23079
23183
  });
23080
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23184
+ method(object({
23185
+ /**
23186
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23187
+ *
23188
+ * Default `false`, the same inversion `listRecentFaces` and
23189
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23190
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23191
+ * on the live hub the same day: four identities cost 40,979 B with the
23192
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23193
+ * four times and the viewer holds at `staleTime: 30_000`.
23194
+ *
23195
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23196
+ * the `event-media` plane serves that key `immutable` with an ETag.
23197
+ *
23198
+ * **This is an INPUT field, so it does not reach the addon until the
23199
+ * next train** — the hub router validates cap inputs against its own
23200
+ * compiled Zod and strips a key it does not know. Until then the
23201
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23202
+ * is what ships, and the opt-in becomes reachable when the train lands.
23203
+ */
23204
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23081
23205
  kind: "mutation",
23082
23206
  auth: "admin"
23083
23207
  }), method(object({
@@ -25967,8 +26091,10 @@ var PlateInfoSchema = object({
25967
26091
  keyFrameMediaKey: string().optional(),
25968
26092
  base64: string().optional(),
25969
26093
  /**
25970
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25971
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26094
+ * Same crop as a data-plane URL, always present when the plate has a stored
26095
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26096
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26097
+ * left at its `true` default.
25972
26098
  */
25973
26099
  cropUrl: string().optional()
25974
26100
  });
@@ -25988,14 +26114,34 @@ var PlateClusterSchema = object({
25988
26114
  });
25989
26115
  method(object({
25990
26116
  deviceId: number().int().optional(),
25991
- limit: number().int().positive().optional()
26117
+ limit: number().int().positive().optional(),
26118
+ /**
26119
+ * Inline the base64 crop on every row. Default `true` — the existing
26120
+ * behaviour, kept so no caller breaks.
26121
+ *
26122
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26123
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26124
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26125
+ * metadata without them — and the browser then caches the images.
26126
+ *
26127
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26128
+ * plates were the one gallery list left without it.
26129
+ *
26130
+ * **This is an INPUT field, so it does not reach the addon until the
26131
+ * next train.** The hub router validates cap inputs against its own
26132
+ * compiled Zod and strips a key it does not know. Until the train
26133
+ * ships, sending `false` is harmless and keeps the crops inline.
26134
+ */
26135
+ includeCrops: boolean().optional()
25992
26136
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25993
26137
  deviceId: number().int(),
25994
26138
  trackId: string()
25995
26139
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25996
26140
  text: string().min(1),
25997
26141
  maxDistance: number().int().min(0).optional(),
25998
- limit: number().int().positive().optional()
26142
+ limit: number().int().positive().optional(),
26143
+ /** See `listPlates.includeCrops`. Default `true`. */
26144
+ includeCrops: boolean().optional()
25999
26145
  }), array(PlateInfoSchema).readonly()), method(object({
26000
26146
  maxDistance: number().int().min(0).optional(),
26001
26147
  minClusterSize: number().int().min(2).optional(),
@@ -26009,7 +26155,13 @@ method(object({
26009
26155
  }), method(object({ plateId: string() }), _void(), {
26010
26156
  kind: "mutation",
26011
26157
  auth: "admin"
26012
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26158
+ }), method(object({
26159
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26160
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26161
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26162
+ * INPUT field: stripped by the hub router until the train ships, which
26163
+ * resolves to `false` and is exactly the intended default. */
26164
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26013
26165
  kind: "mutation",
26014
26166
  auth: "admin"
26015
26167
  }), method(object({
@@ -33336,6 +33488,12 @@ Object.freeze({
33336
33488
  addonId: null,
33337
33489
  access: "create"
33338
33490
  },
33491
+ "pipelineAnalytics.cancelRelocateMedia": {
33492
+ capName: "pipeline-analytics",
33493
+ capScope: "device",
33494
+ addonId: null,
33495
+ access: "create"
33496
+ },
33339
33497
  "pipelineAnalytics.cancelStorageMigrationMove": {
33340
33498
  capName: "pipeline-analytics",
33341
33499
  capScope: "device",
@@ -33510,6 +33668,12 @@ Object.freeze({
33510
33668
  addonId: null,
33511
33669
  access: "view"
33512
33670
  },
33671
+ "pipelineAnalytics.listRelocateMediaJobs": {
33672
+ capName: "pipeline-analytics",
33673
+ capScope: "device",
33674
+ addonId: null,
33675
+ access: "view"
33676
+ },
33513
33677
  "pipelineAnalytics.listRetrainAnnotations": {
33514
33678
  capName: "pipeline-analytics",
33515
33679
  capScope: "device",
@@ -33588,6 +33752,12 @@ Object.freeze({
33588
33752
  addonId: null,
33589
33753
  access: "create"
33590
33754
  },
33755
+ "pipelineAnalytics.relocateMedia": {
33756
+ capName: "pipeline-analytics",
33757
+ capScope: "device",
33758
+ addonId: null,
33759
+ access: "create"
33760
+ },
33591
33761
  "pipelineAnalytics.restageRetrainTrack": {
33592
33762
  capName: "pipeline-analytics",
33593
33763
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.28",
3
+ "version": "1.2.29",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",