@camstack/addon-provider-onvif 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/addon.js +249 -79
  2. package/dist/addon.mjs +249 -79
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -6633,7 +6633,7 @@ function method(input, output, options) {
6633
6633
  input,
6634
6634
  output,
6635
6635
  kind: options?.kind ?? "query",
6636
- auth: options?.auth ?? "protected",
6636
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6637
6637
  ...options?.access !== void 0 ? { access: options.access } : {},
6638
6638
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6639
6639
  timeoutMs: options?.timeoutMs
@@ -6653,7 +6653,7 @@ function systemMethod(input, output, options) {
6653
6653
  }
6654
6654
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6655
6655
  var VersionOutputSchema$1 = object({ version: string() });
6656
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6656
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6657
6657
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6658
6658
  DeviceType["Camera"] = "camera";
6659
6659
  DeviceType["Hub"] = "hub";
@@ -6974,7 +6974,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6974
6974
  }({});
6975
6975
  var StaticDirOutputSchema = object({ staticDir: string() });
6976
6976
  var VersionOutputSchema = object({ version: string() });
6977
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6977
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6978
6978
  /**
6979
6979
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6980
6980
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7600,24 +7600,6 @@ var RecordingRetentionSchema = object({
7600
7600
  maxSizeGb: number().min(0).optional()
7601
7601
  });
7602
7602
  /**
7603
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7604
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7605
- * previews at. Five graduated steps; absent on a config = `standard` (the
7606
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7607
- *
7608
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7609
- * Each window's index sidecar carries its own tile dims, so a camera whose
7610
- * preset changed over time renders every historical window at the dims it was
7611
- * written with.
7612
- */
7613
- var ScrubThumbnailPresetSchema = _enum([
7614
- "minimal",
7615
- "low",
7616
- "standard",
7617
- "high",
7618
- "max"
7619
- ]);
7620
- /**
7621
7603
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7622
7604
  *
7623
7605
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7625,7 +7607,11 @@ var ScrubThumbnailPresetSchema = _enum([
7625
7607
  * other field is a storage knob (profiles, segment length, retention, scrub).
7626
7608
  *
7627
7609
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7628
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7610
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7611
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7612
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7613
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7614
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7629
7615
  * A stale caller must fail loudly — silently stripping its legacy intent would
7630
7616
  * persist a band-less config, i.e. silently stop recording the camera.
7631
7617
  */
@@ -7648,14 +7634,7 @@ var RecordingConfigSchema = object({
7648
7634
  * "off" is the absence of a covering band, never a band value.
7649
7635
  */
7650
7636
  bands: array(RecordingBandSchema).default([]),
7651
- retention: RecordingRetentionSchema.optional(),
7652
- /**
7653
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7654
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7655
- * windows only — existing sheets are immutable, and each window's index
7656
- * carries its own tile dims so mixed-preset history renders correctly.
7657
- */
7658
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7637
+ retention: RecordingRetentionSchema.optional()
7659
7638
  }).strict();
7660
7639
  /**
7661
7640
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7731,10 +7710,11 @@ var RelocateFootageInputSchema = object({
7731
7710
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7732
7711
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7733
7712
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7734
- var StorageMigrationMediaMoveInputSchema = object({
7713
+ var RelocateMediaInputSchema = object({
7735
7714
  toLocationId: string(),
7736
7715
  throttleMbps: number().min(1).max(1e3).optional()
7737
- }).extend({ leaseId: string().min(1) });
7716
+ });
7717
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7738
7718
  /** The independently selectable logical storage classes. `recordings`
7739
7719
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7740
7720
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8029,7 +8009,26 @@ var LabelDefinitionSchema = object({
8029
8009
  description: string().optional(),
8030
8010
  icon: string().optional()
8031
8011
  });
8032
- var ClassMapDefinitionSchema = object({
8012
+ /**
8013
+ * Wire schema for a per-model CATALOG classMap override
8014
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8015
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8016
+ * detection pipeline executor actually routes.
8017
+ *
8018
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8019
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8020
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8021
+ * enum) — the two used to share the name `ClassMapDefinition`/
8022
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8023
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8024
+ * are not: it is two different concepts colliding on a name. Keep this type
8025
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8026
+ * would either narrow every `ClassMapDefinition` consumer to the four
8027
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8028
+ * schema exists for (see the "rejects a classMap whose target is not a
8029
+ * detection macro" test in `model-catalog-schema.test.ts`).
8030
+ */
8031
+ var DetectionCatalogClassMapSchema = object({
8033
8032
  mapping: record(string(), _enum([
8034
8033
  "person",
8035
8034
  "vehicle",
@@ -8234,7 +8233,7 @@ var ModelCatalogEntrySchema = object({
8234
8233
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8235
8234
  * labels already ARE the CamStack macros (Scrypted identity map).
8236
8235
  */
8237
- classMap: ClassMapDefinitionSchema.optional()
8236
+ classMap: DetectionCatalogClassMapSchema.optional()
8238
8237
  });
8239
8238
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8240
8239
  format: literal("openvino"),
@@ -8264,7 +8263,7 @@ var ModelConvertMetadataSchema = object({
8264
8263
  "segmentation"
8265
8264
  ]),
8266
8265
  faceAlignment: boolean().optional(),
8267
- classMap: ClassMapDefinitionSchema.optional()
8266
+ classMap: DetectionCatalogClassMapSchema.optional()
8268
8267
  });
8269
8268
  var ConvertResultSchema = object({
8270
8269
  entry: ModelCatalogEntrySchema,
@@ -9127,7 +9126,7 @@ var AddonPageDeclarationSchema = object({
9127
9126
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9128
9127
  sectionLabel: string().optional()
9129
9128
  });
9130
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9129
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9131
9130
  var AddonHttpRouteSchema = object({
9132
9131
  method: _enum([
9133
9132
  "GET",
@@ -9362,7 +9361,7 @@ var WidgetMetadataSchema = object({
9362
9361
  defaultColumns: number().int().min(1).max(12).default(6),
9363
9362
  defaultRows: number().int().min(1).max(12).default(1)
9364
9363
  });
9365
- method(_void(), array(WidgetMetadataSchema).readonly());
9364
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9366
9365
  /**
9367
9366
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9368
9367
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10884,7 +10883,7 @@ var CustomModelDescriptorSchema = object({
10884
10883
  stepId: string(),
10885
10884
  entry: ModelCatalogEntrySchema
10886
10885
  });
10887
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10886
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10888
10887
  /**
10889
10888
  * Query filter for settings-store collections.
10890
10889
  */
@@ -10971,7 +10970,8 @@ method(object({
10971
10970
  }), _void(), { kind: "mutation" }), method(object({
10972
10971
  namespace: string().optional(),
10973
10972
  collection: string(),
10974
- filter: QueryFilterSchema.optional()
10973
+ filter: QueryFilterSchema.optional(),
10974
+ columns: array(string()).readonly().optional()
10975
10975
  }), array(SettingsRecordSchema).readonly()), method(object({
10976
10976
  namespace: string().optional(),
10977
10977
  collection: string(),
@@ -11034,46 +11034,87 @@ var EngineInfoSchema = object({
11034
11034
  kind: _enum(["relational", "vector"]),
11035
11035
  displayName: string()
11036
11036
  });
11037
- method(_void(), EngineInfoSchema), method(object({
11037
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11038
11038
  namespace: string().optional(),
11039
11039
  collection: string(),
11040
11040
  key: string()
11041
- }), unknown()), method(object({
11041
+ }), unknown(), { auth: "admin" }), method(object({
11042
11042
  namespace: string().optional(),
11043
11043
  collection: string(),
11044
11044
  key: string(),
11045
11045
  value: unknown()
11046
- }), _void(), { kind: "mutation" }), method(object({
11046
+ }), _void(), {
11047
+ kind: "mutation",
11048
+ auth: "admin"
11049
+ }), method(object({
11047
11050
  namespace: string().optional(),
11048
11051
  collection: string(),
11049
- filter: QueryFilterSchema.optional()
11050
- }), array(SettingsRecordSchema).readonly()), method(object({
11052
+ filter: QueryFilterSchema.optional(),
11053
+ /**
11054
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11055
+ *
11056
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11057
+ * was wrong — corrected 2026-08-26 after the hop map
11058
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11059
+ * There is **no Zod parse at all** between the door and the engine: the
11060
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11061
+ * field declared here reaches `SqliteSettingsBackend` either way.
11062
+ *
11063
+ * What actually lost `columns` was the THIRD declaration of this shape:
11064
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11065
+ * interface the engine destructures from. The field existed on both
11066
+ * schemas and the engine still never read it, because nothing checks a
11067
+ * registered provider against `InferProvider<cap>` —
11068
+ * `ProviderRegistration.provider` is typed `object`.
11069
+ *
11070
+ * It is declared here anyway, and must stay in step with
11071
+ * `settings-store.query`: a caller reading only the cap definitions has
11072
+ * to be able to see that this call carries a projection.
11073
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11074
+ */
11075
+ columns: array(string()).readonly().optional()
11076
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11051
11077
  namespace: string().optional(),
11052
11078
  collection: string(),
11053
11079
  record: SettingsRecordSchema
11054
- }), _void(), { kind: "mutation" }), method(object({
11080
+ }), _void(), {
11081
+ kind: "mutation",
11082
+ auth: "admin"
11083
+ }), method(object({
11055
11084
  namespace: string().optional(),
11056
11085
  collection: string(),
11057
11086
  id: string(),
11058
11087
  data: record(string(), unknown())
11059
- }), _void(), { kind: "mutation" }), method(object({
11088
+ }), _void(), {
11089
+ kind: "mutation",
11090
+ auth: "admin"
11091
+ }), method(object({
11060
11092
  namespace: string().optional(),
11061
11093
  collection: string(),
11062
11094
  key: string()
11063
- }), _void(), { kind: "mutation" }), method(object({
11095
+ }), _void(), {
11096
+ kind: "mutation",
11097
+ auth: "admin"
11098
+ }), method(object({
11064
11099
  namespace: string().optional(),
11065
11100
  collection: string(),
11066
11101
  filter: MutationFilterSchema
11067
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11102
+ }), object({ deleted: number().int() }), {
11103
+ kind: "mutation",
11104
+ auth: "admin"
11105
+ }), method(object({
11068
11106
  namespace: string().optional(),
11069
11107
  collection: string(),
11070
11108
  filter: MutationFilterSchema,
11071
11109
  data: record(string(), unknown())
11072
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11110
+ }), object({ updated: number().int() }), {
11111
+ kind: "mutation",
11112
+ auth: "admin"
11113
+ }), method(object({
11073
11114
  namespace: string().optional(),
11074
11115
  collection: string(),
11075
11116
  filter: QueryFilterSchema.optional()
11076
- }), number()), method(object({
11117
+ }), number(), { auth: "admin" }), method(object({
11077
11118
  namespace: string().optional(),
11078
11119
  collection: string(),
11079
11120
  field: string(),
@@ -11083,15 +11124,18 @@ method(_void(), EngineInfoSchema), method(object({
11083
11124
  }), array(object({
11084
11125
  bucket: number().int(),
11085
11126
  count: number().int()
11086
- })).readonly()), method(object({
11127
+ })).readonly(), { auth: "admin" }), method(object({
11087
11128
  namespace: string().optional(),
11088
11129
  collection: string()
11089
- }), boolean()), method(object({
11130
+ }), boolean(), { auth: "admin" }), method(object({
11090
11131
  namespace: string().optional(),
11091
11132
  collection: string(),
11092
11133
  columns: array(CollectionColumnSchema).readonly(),
11093
11134
  indexes: array(CollectionIndexSchema).readonly().optional()
11094
- }), _void(), { kind: "mutation" });
11135
+ }), _void(), {
11136
+ kind: "mutation",
11137
+ auth: "admin"
11138
+ });
11095
11139
  /**
11096
11140
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11097
11141
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12274,7 +12318,7 @@ method(object({
12274
12318
  crop: _instanceof(Uint8Array),
12275
12319
  width: number(),
12276
12320
  height: number()
12277
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12321
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12278
12322
  /**
12279
12323
  * filesystem-browse — per-node capability for browsing the node's local
12280
12324
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12567,19 +12611,22 @@ method(LlmGenerateBaseInputSchema.extend({
12567
12611
  runtime: ManagedRuntimeConfigSchema,
12568
12612
  /** The managed profile's timeout, threaded by the hub provider. */
12569
12613
  timeoutMs: number().int().positive().optional()
12570
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12614
+ }), LlmGenerateResultSchema, {
12615
+ kind: "mutation",
12616
+ auth: "admin"
12617
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12571
12618
  kind: "mutation",
12572
12619
  auth: "admin"
12573
12620
  }), method(object({}), _void(), {
12574
12621
  kind: "mutation",
12575
12622
  auth: "admin"
12576
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12623
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12577
12624
  kind: "mutation",
12578
12625
  auth: "admin"
12579
12626
  }), method(object({ file: string() }), _void(), {
12580
12627
  kind: "mutation",
12581
12628
  auth: "admin"
12582
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12629
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12583
12630
  /**
12584
12631
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12585
12632
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16052,7 +16099,7 @@ var OauthIntegrationDescriptorSchema = object({
16052
16099
  */
16053
16100
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16054
16101
  });
16055
- method(_void(), OauthIntegrationDescriptorSchema);
16102
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16056
16103
  /**
16057
16104
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16058
16105
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17247,6 +17294,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17247
17294
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17248
17295
  kind: "mutation",
17249
17296
  auth: "admin"
17297
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17298
+ kind: "mutation",
17299
+ auth: "admin"
17300
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17301
+ kind: "query",
17302
+ auth: "admin"
17303
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17304
+ kind: "mutation",
17305
+ auth: "admin"
17250
17306
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17251
17307
  kind: "query",
17252
17308
  auth: "admin"
@@ -17401,6 +17457,11 @@ object({
17401
17457
  "jpeg"
17402
17458
  ])
17403
17459
  });
17460
+ /**
17461
+ * Process-local frame identity. It is serializable so it can ride an in-process
17462
+ * capability call, but `registryId` deliberately prevents resolution in any
17463
+ * other process or execution group.
17464
+ */
17404
17465
  var FrameRefSchema = object({
17405
17466
  registryId: string().min(1),
17406
17467
  id: string().min(1),
@@ -19670,7 +19731,7 @@ method(object({
19670
19731
  * linking rather than produce an eternal token.
19671
19732
  */
19672
19733
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19673
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19734
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19674
19735
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19675
19736
  providerId: string().min(1),
19676
19737
  displayName: string().min(1),
@@ -19765,10 +19826,13 @@ var EvictResultSchema = object({
19765
19826
  /** True when the provider has nothing left it is willing to drop on this location. */
19766
19827
  exhausted: boolean()
19767
19828
  });
19768
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19829
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19769
19830
  locationId: string(),
19770
19831
  targetBytes: number().int().positive()
19771
- }), EvictResultSchema, { kind: "mutation" });
19832
+ }), EvictResultSchema, {
19833
+ kind: "mutation",
19834
+ auth: "admin"
19835
+ });
19772
19836
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19773
19837
  kind: "mutation",
19774
19838
  auth: "admin"
@@ -19828,26 +19892,50 @@ var ReadChunkInputSchema = object({
19828
19892
  length: number()
19829
19893
  });
19830
19894
  var EndDownloadInputSchema = object({ downloadId: string() });
19831
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19895
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19832
19896
  location: StorageLocationSchema,
19833
19897
  relativePath: string()
19834
- }), string()), method(object({
19898
+ }), string(), { auth: "admin" }), method(object({
19835
19899
  location: StorageLocationSchema,
19836
19900
  relativePath: string(),
19837
19901
  data: _instanceof(Uint8Array)
19838
- }), _void(), { kind: "mutation" }), method(object({
19902
+ }), _void(), {
19903
+ kind: "mutation",
19904
+ auth: "admin"
19905
+ }), method(object({
19839
19906
  location: StorageLocationSchema,
19840
19907
  relativePath: string()
19841
- }), _instanceof(Uint8Array)), method(object({
19908
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19842
19909
  location: StorageLocationSchema,
19843
19910
  relativePath: string()
19844
- }), boolean()), method(object({
19911
+ }), boolean(), { auth: "admin" }), method(object({
19845
19912
  location: StorageLocationSchema,
19846
19913
  prefix: string().optional()
19847
- }), array(string()).readonly()), method(object({
19914
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19848
19915
  location: StorageLocationSchema,
19849
19916
  relativePath: string()
19850
- }), _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" });
19917
+ }), _void(), {
19918
+ kind: "mutation",
19919
+ auth: "admin"
19920
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19921
+ kind: "mutation",
19922
+ auth: "admin"
19923
+ }), method(WriteChunkInputSchema, _void(), {
19924
+ kind: "mutation",
19925
+ auth: "admin"
19926
+ }), method(FinalizeUploadInputSchema, _void(), {
19927
+ kind: "mutation",
19928
+ auth: "admin"
19929
+ }), method(AbortUploadInputSchema, _void(), {
19930
+ kind: "mutation",
19931
+ auth: "admin"
19932
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19933
+ kind: "mutation",
19934
+ auth: "admin"
19935
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19936
+ kind: "mutation",
19937
+ auth: "admin"
19938
+ });
19851
19939
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19852
19940
  var ProfileSettingsSchemaBridge = unknown().nullable();
19853
19941
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20105,7 +20193,8 @@ method(object({
20105
20193
  access: "create"
20106
20194
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20107
20195
  kind: "mutation",
20108
- access: "view"
20196
+ access: "view",
20197
+ auth: "admin"
20109
20198
  }), method(object({
20110
20199
  /** Required — the user the assertion belongs to (verified). */
20111
20200
  userId: string(),
@@ -20113,10 +20202,12 @@ method(object({
20113
20202
  response: record(string(), unknown())
20114
20203
  }), object({ verified: boolean() }), {
20115
20204
  kind: "mutation",
20116
- access: "view"
20205
+ access: "view",
20206
+ auth: "admin"
20117
20207
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20118
20208
  kind: "mutation",
20119
- access: "view"
20209
+ access: "view",
20210
+ auth: "admin"
20120
20211
  }), method(object({
20121
20212
  /** AuthenticationResponseJSON from the browser. */
20122
20213
  response: record(string(), unknown()) }), object({
@@ -20124,7 +20215,8 @@ response: record(string(), unknown()) }), object({
20124
20215
  userId: string().nullable()
20125
20216
  }), {
20126
20217
  kind: "mutation",
20127
- access: "view"
20218
+ access: "view",
20219
+ auth: "admin"
20128
20220
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20129
20221
  userId: string(),
20130
20222
  credentialId: string()
@@ -20296,7 +20388,19 @@ var VectorStatsResultSchema = object({
20296
20388
  /** False when the backend ranks approximately. */
20297
20389
  exact: boolean()
20298
20390
  });
20299
- 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);
20391
+ method(VectorDeclareIndexInputSchema, _void(), {
20392
+ kind: "mutation",
20393
+ auth: "admin"
20394
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20395
+ kind: "mutation",
20396
+ auth: "admin"
20397
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20398
+ kind: "mutation",
20399
+ auth: "admin"
20400
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20401
+ kind: "mutation",
20402
+ auth: "admin"
20403
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20300
20404
  var ClipSchema = object({
20301
20405
  /** Opaque, provider-namespaced id. The default provider encodes the time
20302
20406
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22019,7 +22123,27 @@ var MediaFileLiteSchema$1 = object({
22019
22123
  sizeBytes: number(),
22020
22124
  timestamp: number()
22021
22125
  });
22022
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22126
+ method(object({
22127
+ /**
22128
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22129
+ *
22130
+ * Default `false`, the same inversion `listRecentFaces` and
22131
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22132
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22133
+ * on the live hub the same day: four identities cost 40,979 B with the
22134
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22135
+ * four times and the viewer holds at `staleTime: 30_000`.
22136
+ *
22137
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22138
+ * the `event-media` plane serves that key `immutable` with an ETag.
22139
+ *
22140
+ * **This is an INPUT field, so it does not reach the addon until the
22141
+ * next train** — the hub router validates cap inputs against its own
22142
+ * compiled Zod and strips a key it does not know. Until then the
22143
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22144
+ * is what ships, and the opt-in becomes reachable when the train lands.
22145
+ */
22146
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22023
22147
  kind: "mutation",
22024
22148
  auth: "admin"
22025
22149
  }), method(object({
@@ -24166,8 +24290,10 @@ var PlateInfoSchema = object({
24166
24290
  keyFrameMediaKey: string().optional(),
24167
24291
  base64: string().optional(),
24168
24292
  /**
24169
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24170
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24293
+ * Same crop as a data-plane URL, always present when the plate has a stored
24294
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24295
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24296
+ * left at its `true` default.
24171
24297
  */
24172
24298
  cropUrl: string().optional()
24173
24299
  });
@@ -24187,14 +24313,34 @@ var PlateClusterSchema = object({
24187
24313
  });
24188
24314
  method(object({
24189
24315
  deviceId: number().int().optional(),
24190
- limit: number().int().positive().optional()
24316
+ limit: number().int().positive().optional(),
24317
+ /**
24318
+ * Inline the base64 crop on every row. Default `true` — the existing
24319
+ * behaviour, kept so no caller breaks.
24320
+ *
24321
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24322
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24323
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24324
+ * metadata without them — and the browser then caches the images.
24325
+ *
24326
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24327
+ * plates were the one gallery list left without it.
24328
+ *
24329
+ * **This is an INPUT field, so it does not reach the addon until the
24330
+ * next train.** The hub router validates cap inputs against its own
24331
+ * compiled Zod and strips a key it does not know. Until the train
24332
+ * ships, sending `false` is harmless and keeps the crops inline.
24333
+ */
24334
+ includeCrops: boolean().optional()
24191
24335
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24192
24336
  deviceId: number().int(),
24193
24337
  trackId: string()
24194
24338
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24195
24339
  text: string().min(1),
24196
24340
  maxDistance: number().int().min(0).optional(),
24197
- limit: number().int().positive().optional()
24341
+ limit: number().int().positive().optional(),
24342
+ /** See `listPlates.includeCrops`. Default `true`. */
24343
+ includeCrops: boolean().optional()
24198
24344
  }), array(PlateInfoSchema).readonly()), method(object({
24199
24345
  maxDistance: number().int().min(0).optional(),
24200
24346
  minClusterSize: number().int().min(2).optional(),
@@ -24208,7 +24354,13 @@ method(object({
24208
24354
  }), method(object({ plateId: string() }), _void(), {
24209
24355
  kind: "mutation",
24210
24356
  auth: "admin"
24211
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24357
+ }), method(object({
24358
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24359
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24360
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24361
+ * INPUT field: stripped by the hub router until the train ships, which
24362
+ * resolves to `false` and is exactly the intended default. */
24363
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24212
24364
  kind: "mutation",
24213
24365
  auth: "admin"
24214
24366
  }), method(object({
@@ -30037,6 +30189,12 @@ Object.freeze({
30037
30189
  addonId: null,
30038
30190
  access: "create"
30039
30191
  },
30192
+ "pipelineAnalytics.cancelRelocateMedia": {
30193
+ capName: "pipeline-analytics",
30194
+ capScope: "device",
30195
+ addonId: null,
30196
+ access: "create"
30197
+ },
30040
30198
  "pipelineAnalytics.cancelStorageMigrationMove": {
30041
30199
  capName: "pipeline-analytics",
30042
30200
  capScope: "device",
@@ -30211,6 +30369,12 @@ Object.freeze({
30211
30369
  addonId: null,
30212
30370
  access: "view"
30213
30371
  },
30372
+ "pipelineAnalytics.listRelocateMediaJobs": {
30373
+ capName: "pipeline-analytics",
30374
+ capScope: "device",
30375
+ addonId: null,
30376
+ access: "view"
30377
+ },
30214
30378
  "pipelineAnalytics.listRetrainAnnotations": {
30215
30379
  capName: "pipeline-analytics",
30216
30380
  capScope: "device",
@@ -30289,6 +30453,12 @@ Object.freeze({
30289
30453
  addonId: null,
30290
30454
  access: "create"
30291
30455
  },
30456
+ "pipelineAnalytics.relocateMedia": {
30457
+ capName: "pipeline-analytics",
30458
+ capScope: "device",
30459
+ addonId: null,
30460
+ access: "create"
30461
+ },
30292
30462
  "pipelineAnalytics.restageRetrainTrack": {
30293
30463
  capName: "pipeline-analytics",
30294
30464
  capScope: "device",
package/dist/addon.mjs 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()`.
@@ -10885,7 +10884,7 @@ var CustomModelDescriptorSchema = object({
10885
10884
  stepId: string(),
10886
10885
  entry: ModelCatalogEntrySchema
10887
10886
  });
10888
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10887
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10889
10888
  /**
10890
10889
  * Query filter for settings-store collections.
10891
10890
  */
@@ -10972,7 +10971,8 @@ method(object({
10972
10971
  }), _void(), { kind: "mutation" }), method(object({
10973
10972
  namespace: string().optional(),
10974
10973
  collection: string(),
10975
- filter: QueryFilterSchema.optional()
10974
+ filter: QueryFilterSchema.optional(),
10975
+ columns: array(string()).readonly().optional()
10976
10976
  }), array(SettingsRecordSchema).readonly()), method(object({
10977
10977
  namespace: string().optional(),
10978
10978
  collection: string(),
@@ -11035,46 +11035,87 @@ var EngineInfoSchema = object({
11035
11035
  kind: _enum(["relational", "vector"]),
11036
11036
  displayName: string()
11037
11037
  });
11038
- method(_void(), EngineInfoSchema), method(object({
11038
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11039
11039
  namespace: string().optional(),
11040
11040
  collection: string(),
11041
11041
  key: string()
11042
- }), unknown()), method(object({
11042
+ }), unknown(), { auth: "admin" }), method(object({
11043
11043
  namespace: string().optional(),
11044
11044
  collection: string(),
11045
11045
  key: string(),
11046
11046
  value: unknown()
11047
- }), _void(), { kind: "mutation" }), method(object({
11047
+ }), _void(), {
11048
+ kind: "mutation",
11049
+ auth: "admin"
11050
+ }), method(object({
11048
11051
  namespace: string().optional(),
11049
11052
  collection: string(),
11050
- filter: QueryFilterSchema.optional()
11051
- }), array(SettingsRecordSchema).readonly()), method(object({
11053
+ filter: QueryFilterSchema.optional(),
11054
+ /**
11055
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11056
+ *
11057
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11058
+ * was wrong — corrected 2026-08-26 after the hop map
11059
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11060
+ * There is **no Zod parse at all** between the door and the engine: the
11061
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11062
+ * field declared here reaches `SqliteSettingsBackend` either way.
11063
+ *
11064
+ * What actually lost `columns` was the THIRD declaration of this shape:
11065
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11066
+ * interface the engine destructures from. The field existed on both
11067
+ * schemas and the engine still never read it, because nothing checks a
11068
+ * registered provider against `InferProvider<cap>` —
11069
+ * `ProviderRegistration.provider` is typed `object`.
11070
+ *
11071
+ * It is declared here anyway, and must stay in step with
11072
+ * `settings-store.query`: a caller reading only the cap definitions has
11073
+ * to be able to see that this call carries a projection.
11074
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11075
+ */
11076
+ columns: array(string()).readonly().optional()
11077
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11052
11078
  namespace: string().optional(),
11053
11079
  collection: string(),
11054
11080
  record: SettingsRecordSchema
11055
- }), _void(), { kind: "mutation" }), method(object({
11081
+ }), _void(), {
11082
+ kind: "mutation",
11083
+ auth: "admin"
11084
+ }), method(object({
11056
11085
  namespace: string().optional(),
11057
11086
  collection: string(),
11058
11087
  id: string(),
11059
11088
  data: record(string(), unknown())
11060
- }), _void(), { kind: "mutation" }), method(object({
11089
+ }), _void(), {
11090
+ kind: "mutation",
11091
+ auth: "admin"
11092
+ }), method(object({
11061
11093
  namespace: string().optional(),
11062
11094
  collection: string(),
11063
11095
  key: string()
11064
- }), _void(), { kind: "mutation" }), method(object({
11096
+ }), _void(), {
11097
+ kind: "mutation",
11098
+ auth: "admin"
11099
+ }), method(object({
11065
11100
  namespace: string().optional(),
11066
11101
  collection: string(),
11067
11102
  filter: MutationFilterSchema
11068
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11103
+ }), object({ deleted: number().int() }), {
11104
+ kind: "mutation",
11105
+ auth: "admin"
11106
+ }), method(object({
11069
11107
  namespace: string().optional(),
11070
11108
  collection: string(),
11071
11109
  filter: MutationFilterSchema,
11072
11110
  data: record(string(), unknown())
11073
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11111
+ }), object({ updated: number().int() }), {
11112
+ kind: "mutation",
11113
+ auth: "admin"
11114
+ }), method(object({
11074
11115
  namespace: string().optional(),
11075
11116
  collection: string(),
11076
11117
  filter: QueryFilterSchema.optional()
11077
- }), number()), method(object({
11118
+ }), number(), { auth: "admin" }), method(object({
11078
11119
  namespace: string().optional(),
11079
11120
  collection: string(),
11080
11121
  field: string(),
@@ -11084,15 +11125,18 @@ method(_void(), EngineInfoSchema), method(object({
11084
11125
  }), array(object({
11085
11126
  bucket: number().int(),
11086
11127
  count: number().int()
11087
- })).readonly()), method(object({
11128
+ })).readonly(), { auth: "admin" }), method(object({
11088
11129
  namespace: string().optional(),
11089
11130
  collection: string()
11090
- }), boolean()), method(object({
11131
+ }), boolean(), { auth: "admin" }), method(object({
11091
11132
  namespace: string().optional(),
11092
11133
  collection: string(),
11093
11134
  columns: array(CollectionColumnSchema).readonly(),
11094
11135
  indexes: array(CollectionIndexSchema).readonly().optional()
11095
- }), _void(), { kind: "mutation" });
11136
+ }), _void(), {
11137
+ kind: "mutation",
11138
+ auth: "admin"
11139
+ });
11096
11140
  /**
11097
11141
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11098
11142
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12275,7 +12319,7 @@ method(object({
12275
12319
  crop: _instanceof(Uint8Array),
12276
12320
  width: number(),
12277
12321
  height: number()
12278
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12322
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12279
12323
  /**
12280
12324
  * filesystem-browse — per-node capability for browsing the node's local
12281
12325
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12568,19 +12612,22 @@ method(LlmGenerateBaseInputSchema.extend({
12568
12612
  runtime: ManagedRuntimeConfigSchema,
12569
12613
  /** The managed profile's timeout, threaded by the hub provider. */
12570
12614
  timeoutMs: number().int().positive().optional()
12571
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12615
+ }), LlmGenerateResultSchema, {
12616
+ kind: "mutation",
12617
+ auth: "admin"
12618
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12572
12619
  kind: "mutation",
12573
12620
  auth: "admin"
12574
12621
  }), method(object({}), _void(), {
12575
12622
  kind: "mutation",
12576
12623
  auth: "admin"
12577
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12624
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12578
12625
  kind: "mutation",
12579
12626
  auth: "admin"
12580
12627
  }), method(object({ file: string() }), _void(), {
12581
12628
  kind: "mutation",
12582
12629
  auth: "admin"
12583
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12630
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12584
12631
  /**
12585
12632
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12586
12633
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16053,7 +16100,7 @@ var OauthIntegrationDescriptorSchema = object({
16053
16100
  */
16054
16101
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16055
16102
  });
16056
- method(_void(), OauthIntegrationDescriptorSchema);
16103
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16057
16104
  /**
16058
16105
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16059
16106
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17248,6 +17295,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17248
17295
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17249
17296
  kind: "mutation",
17250
17297
  auth: "admin"
17298
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17299
+ kind: "mutation",
17300
+ auth: "admin"
17301
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17302
+ kind: "query",
17303
+ auth: "admin"
17304
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17305
+ kind: "mutation",
17306
+ auth: "admin"
17251
17307
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17252
17308
  kind: "query",
17253
17309
  auth: "admin"
@@ -17402,6 +17458,11 @@ object({
17402
17458
  "jpeg"
17403
17459
  ])
17404
17460
  });
17461
+ /**
17462
+ * Process-local frame identity. It is serializable so it can ride an in-process
17463
+ * capability call, but `registryId` deliberately prevents resolution in any
17464
+ * other process or execution group.
17465
+ */
17405
17466
  var FrameRefSchema = object({
17406
17467
  registryId: string().min(1),
17407
17468
  id: string().min(1),
@@ -19671,7 +19732,7 @@ method(object({
19671
19732
  * linking rather than produce an eternal token.
19672
19733
  */
19673
19734
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19674
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19735
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19675
19736
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19676
19737
  providerId: string().min(1),
19677
19738
  displayName: string().min(1),
@@ -19766,10 +19827,13 @@ var EvictResultSchema = object({
19766
19827
  /** True when the provider has nothing left it is willing to drop on this location. */
19767
19828
  exhausted: boolean()
19768
19829
  });
19769
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19830
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19770
19831
  locationId: string(),
19771
19832
  targetBytes: number().int().positive()
19772
- }), EvictResultSchema, { kind: "mutation" });
19833
+ }), EvictResultSchema, {
19834
+ kind: "mutation",
19835
+ auth: "admin"
19836
+ });
19773
19837
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19774
19838
  kind: "mutation",
19775
19839
  auth: "admin"
@@ -19829,26 +19893,50 @@ var ReadChunkInputSchema = object({
19829
19893
  length: number()
19830
19894
  });
19831
19895
  var EndDownloadInputSchema = object({ downloadId: string() });
19832
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19896
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19833
19897
  location: StorageLocationSchema,
19834
19898
  relativePath: string()
19835
- }), string()), method(object({
19899
+ }), string(), { auth: "admin" }), method(object({
19836
19900
  location: StorageLocationSchema,
19837
19901
  relativePath: string(),
19838
19902
  data: _instanceof(Uint8Array)
19839
- }), _void(), { kind: "mutation" }), method(object({
19903
+ }), _void(), {
19904
+ kind: "mutation",
19905
+ auth: "admin"
19906
+ }), method(object({
19840
19907
  location: StorageLocationSchema,
19841
19908
  relativePath: string()
19842
- }), _instanceof(Uint8Array)), method(object({
19909
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19843
19910
  location: StorageLocationSchema,
19844
19911
  relativePath: string()
19845
- }), boolean()), method(object({
19912
+ }), boolean(), { auth: "admin" }), method(object({
19846
19913
  location: StorageLocationSchema,
19847
19914
  prefix: string().optional()
19848
- }), array(string()).readonly()), method(object({
19915
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19849
19916
  location: StorageLocationSchema,
19850
19917
  relativePath: string()
19851
- }), _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" });
19918
+ }), _void(), {
19919
+ kind: "mutation",
19920
+ auth: "admin"
19921
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19922
+ kind: "mutation",
19923
+ auth: "admin"
19924
+ }), method(WriteChunkInputSchema, _void(), {
19925
+ kind: "mutation",
19926
+ auth: "admin"
19927
+ }), method(FinalizeUploadInputSchema, _void(), {
19928
+ kind: "mutation",
19929
+ auth: "admin"
19930
+ }), method(AbortUploadInputSchema, _void(), {
19931
+ kind: "mutation",
19932
+ auth: "admin"
19933
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19934
+ kind: "mutation",
19935
+ auth: "admin"
19936
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19937
+ kind: "mutation",
19938
+ auth: "admin"
19939
+ });
19852
19940
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19853
19941
  var ProfileSettingsSchemaBridge = unknown().nullable();
19854
19942
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20106,7 +20194,8 @@ method(object({
20106
20194
  access: "create"
20107
20195
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20108
20196
  kind: "mutation",
20109
- access: "view"
20197
+ access: "view",
20198
+ auth: "admin"
20110
20199
  }), method(object({
20111
20200
  /** Required — the user the assertion belongs to (verified). */
20112
20201
  userId: string(),
@@ -20114,10 +20203,12 @@ method(object({
20114
20203
  response: record(string(), unknown())
20115
20204
  }), object({ verified: boolean() }), {
20116
20205
  kind: "mutation",
20117
- access: "view"
20206
+ access: "view",
20207
+ auth: "admin"
20118
20208
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20119
20209
  kind: "mutation",
20120
- access: "view"
20210
+ access: "view",
20211
+ auth: "admin"
20121
20212
  }), method(object({
20122
20213
  /** AuthenticationResponseJSON from the browser. */
20123
20214
  response: record(string(), unknown()) }), object({
@@ -20125,7 +20216,8 @@ response: record(string(), unknown()) }), object({
20125
20216
  userId: string().nullable()
20126
20217
  }), {
20127
20218
  kind: "mutation",
20128
- access: "view"
20219
+ access: "view",
20220
+ auth: "admin"
20129
20221
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20130
20222
  userId: string(),
20131
20223
  credentialId: string()
@@ -20297,7 +20389,19 @@ var VectorStatsResultSchema = object({
20297
20389
  /** False when the backend ranks approximately. */
20298
20390
  exact: boolean()
20299
20391
  });
20300
- 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);
20392
+ method(VectorDeclareIndexInputSchema, _void(), {
20393
+ kind: "mutation",
20394
+ auth: "admin"
20395
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20396
+ kind: "mutation",
20397
+ auth: "admin"
20398
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20399
+ kind: "mutation",
20400
+ auth: "admin"
20401
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20402
+ kind: "mutation",
20403
+ auth: "admin"
20404
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20301
20405
  var ClipSchema = object({
20302
20406
  /** Opaque, provider-namespaced id. The default provider encodes the time
20303
20407
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22020,7 +22124,27 @@ var MediaFileLiteSchema$1 = object({
22020
22124
  sizeBytes: number(),
22021
22125
  timestamp: number()
22022
22126
  });
22023
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22127
+ method(object({
22128
+ /**
22129
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22130
+ *
22131
+ * Default `false`, the same inversion `listRecentFaces` and
22132
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22133
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22134
+ * on the live hub the same day: four identities cost 40,979 B with the
22135
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22136
+ * four times and the viewer holds at `staleTime: 30_000`.
22137
+ *
22138
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22139
+ * the `event-media` plane serves that key `immutable` with an ETag.
22140
+ *
22141
+ * **This is an INPUT field, so it does not reach the addon until the
22142
+ * next train** — the hub router validates cap inputs against its own
22143
+ * compiled Zod and strips a key it does not know. Until then the
22144
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22145
+ * is what ships, and the opt-in becomes reachable when the train lands.
22146
+ */
22147
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22024
22148
  kind: "mutation",
22025
22149
  auth: "admin"
22026
22150
  }), method(object({
@@ -24167,8 +24291,10 @@ var PlateInfoSchema = object({
24167
24291
  keyFrameMediaKey: string().optional(),
24168
24292
  base64: string().optional(),
24169
24293
  /**
24170
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24171
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24294
+ * Same crop as a data-plane URL, always present when the plate has a stored
24295
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24296
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24297
+ * left at its `true` default.
24172
24298
  */
24173
24299
  cropUrl: string().optional()
24174
24300
  });
@@ -24188,14 +24314,34 @@ var PlateClusterSchema = object({
24188
24314
  });
24189
24315
  method(object({
24190
24316
  deviceId: number().int().optional(),
24191
- limit: number().int().positive().optional()
24317
+ limit: number().int().positive().optional(),
24318
+ /**
24319
+ * Inline the base64 crop on every row. Default `true` — the existing
24320
+ * behaviour, kept so no caller breaks.
24321
+ *
24322
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24323
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24324
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24325
+ * metadata without them — and the browser then caches the images.
24326
+ *
24327
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24328
+ * plates were the one gallery list left without it.
24329
+ *
24330
+ * **This is an INPUT field, so it does not reach the addon until the
24331
+ * next train.** The hub router validates cap inputs against its own
24332
+ * compiled Zod and strips a key it does not know. Until the train
24333
+ * ships, sending `false` is harmless and keeps the crops inline.
24334
+ */
24335
+ includeCrops: boolean().optional()
24192
24336
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24193
24337
  deviceId: number().int(),
24194
24338
  trackId: string()
24195
24339
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24196
24340
  text: string().min(1),
24197
24341
  maxDistance: number().int().min(0).optional(),
24198
- limit: number().int().positive().optional()
24342
+ limit: number().int().positive().optional(),
24343
+ /** See `listPlates.includeCrops`. Default `true`. */
24344
+ includeCrops: boolean().optional()
24199
24345
  }), array(PlateInfoSchema).readonly()), method(object({
24200
24346
  maxDistance: number().int().min(0).optional(),
24201
24347
  minClusterSize: number().int().min(2).optional(),
@@ -24209,7 +24355,13 @@ method(object({
24209
24355
  }), method(object({ plateId: string() }), _void(), {
24210
24356
  kind: "mutation",
24211
24357
  auth: "admin"
24212
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24358
+ }), method(object({
24359
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24360
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24361
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24362
+ * INPUT field: stripped by the hub router until the train ships, which
24363
+ * resolves to `false` and is exactly the intended default. */
24364
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24213
24365
  kind: "mutation",
24214
24366
  auth: "admin"
24215
24367
  }), method(object({
@@ -30038,6 +30190,12 @@ Object.freeze({
30038
30190
  addonId: null,
30039
30191
  access: "create"
30040
30192
  },
30193
+ "pipelineAnalytics.cancelRelocateMedia": {
30194
+ capName: "pipeline-analytics",
30195
+ capScope: "device",
30196
+ addonId: null,
30197
+ access: "create"
30198
+ },
30041
30199
  "pipelineAnalytics.cancelStorageMigrationMove": {
30042
30200
  capName: "pipeline-analytics",
30043
30201
  capScope: "device",
@@ -30212,6 +30370,12 @@ Object.freeze({
30212
30370
  addonId: null,
30213
30371
  access: "view"
30214
30372
  },
30373
+ "pipelineAnalytics.listRelocateMediaJobs": {
30374
+ capName: "pipeline-analytics",
30375
+ capScope: "device",
30376
+ addonId: null,
30377
+ access: "view"
30378
+ },
30215
30379
  "pipelineAnalytics.listRetrainAnnotations": {
30216
30380
  capName: "pipeline-analytics",
30217
30381
  capScope: "device",
@@ -30290,6 +30454,12 @@ Object.freeze({
30290
30454
  addonId: null,
30291
30455
  access: "create"
30292
30456
  },
30457
+ "pipelineAnalytics.relocateMedia": {
30458
+ capName: "pipeline-analytics",
30459
+ capScope: "device",
30460
+ addonId: null,
30461
+ access: "create"
30462
+ },
30293
30463
  "pipelineAnalytics.restageRetrainTrack": {
30294
30464
  capName: "pipeline-analytics",
30295
30465
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-onvif",
3
- "version": "1.2.27",
3
+ "version": "1.2.28",
4
4
  "description": "ONVIF camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",