@camstack/addon-provider-amcrest 0.2.29 → 0.2.30

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
@@ -6635,7 +6635,7 @@ function method(input, output, options) {
6635
6635
  input,
6636
6636
  output,
6637
6637
  kind: options?.kind ?? "query",
6638
- auth: options?.auth ?? "protected",
6638
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6639
6639
  ...options?.access !== void 0 ? { access: options.access } : {},
6640
6640
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6641
6641
  timeoutMs: options?.timeoutMs
@@ -6659,7 +6659,7 @@ function event(data) {
6659
6659
  }
6660
6660
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6661
6661
  var VersionOutputSchema$1 = object({ version: string() });
6662
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6662
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6663
6663
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6664
6664
  DeviceType["Camera"] = "camera";
6665
6665
  DeviceType["Hub"] = "hub";
@@ -6980,7 +6980,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6980
6980
  }({});
6981
6981
  var StaticDirOutputSchema = object({ staticDir: string() });
6982
6982
  var VersionOutputSchema = object({ version: string() });
6983
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6983
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6984
6984
  /**
6985
6985
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6986
6986
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7594,24 +7594,6 @@ var RecordingRetentionSchema = object({
7594
7594
  maxSizeGb: number().min(0).optional()
7595
7595
  });
7596
7596
  /**
7597
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7598
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7599
- * previews at. Five graduated steps; absent on a config = `standard` (the
7600
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7601
- *
7602
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7603
- * Each window's index sidecar carries its own tile dims, so a camera whose
7604
- * preset changed over time renders every historical window at the dims it was
7605
- * written with.
7606
- */
7607
- var ScrubThumbnailPresetSchema = _enum([
7608
- "minimal",
7609
- "low",
7610
- "standard",
7611
- "high",
7612
- "max"
7613
- ]);
7614
- /**
7615
7597
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7616
7598
  *
7617
7599
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7619,7 +7601,11 @@ var ScrubThumbnailPresetSchema = _enum([
7619
7601
  * other field is a storage knob (profiles, segment length, retention, scrub).
7620
7602
  *
7621
7603
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7622
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7604
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7605
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7606
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7607
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7608
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7623
7609
  * A stale caller must fail loudly — silently stripping its legacy intent would
7624
7610
  * persist a band-less config, i.e. silently stop recording the camera.
7625
7611
  */
@@ -7642,14 +7628,7 @@ var RecordingConfigSchema = object({
7642
7628
  * "off" is the absence of a covering band, never a band value.
7643
7629
  */
7644
7630
  bands: array(RecordingBandSchema).default([]),
7645
- retention: RecordingRetentionSchema.optional(),
7646
- /**
7647
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7648
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7649
- * windows only — existing sheets are immutable, and each window's index
7650
- * carries its own tile dims so mixed-preset history renders correctly.
7651
- */
7652
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7631
+ retention: RecordingRetentionSchema.optional()
7653
7632
  }).strict();
7654
7633
  /**
7655
7634
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7725,10 +7704,11 @@ var RelocateFootageInputSchema = object({
7725
7704
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7726
7705
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7727
7706
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7728
- var StorageMigrationMediaMoveInputSchema = object({
7707
+ var RelocateMediaInputSchema = object({
7729
7708
  toLocationId: string(),
7730
7709
  throttleMbps: number().min(1).max(1e3).optional()
7731
- }).extend({ leaseId: string().min(1) });
7710
+ });
7711
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7732
7712
  /** The independently selectable logical storage classes. `recordings`
7733
7713
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7734
7714
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8023,7 +8003,26 @@ var LabelDefinitionSchema = object({
8023
8003
  description: string().optional(),
8024
8004
  icon: string().optional()
8025
8005
  });
8026
- var ClassMapDefinitionSchema = object({
8006
+ /**
8007
+ * Wire schema for a per-model CATALOG classMap override
8008
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8009
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8010
+ * detection pipeline executor actually routes.
8011
+ *
8012
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8013
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8014
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8015
+ * enum) — the two used to share the name `ClassMapDefinition`/
8016
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8017
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8018
+ * are not: it is two different concepts colliding on a name. Keep this type
8019
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8020
+ * would either narrow every `ClassMapDefinition` consumer to the four
8021
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8022
+ * schema exists for (see the "rejects a classMap whose target is not a
8023
+ * detection macro" test in `model-catalog-schema.test.ts`).
8024
+ */
8025
+ var DetectionCatalogClassMapSchema = object({
8027
8026
  mapping: record(string(), _enum([
8028
8027
  "person",
8029
8028
  "vehicle",
@@ -8228,7 +8227,7 @@ var ModelCatalogEntrySchema = object({
8228
8227
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8229
8228
  * labels already ARE the CamStack macros (Scrypted identity map).
8230
8229
  */
8231
- classMap: ClassMapDefinitionSchema.optional()
8230
+ classMap: DetectionCatalogClassMapSchema.optional()
8232
8231
  });
8233
8232
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8234
8233
  format: literal("openvino"),
@@ -8258,7 +8257,7 @@ var ModelConvertMetadataSchema = object({
8258
8257
  "segmentation"
8259
8258
  ]),
8260
8259
  faceAlignment: boolean().optional(),
8261
- classMap: ClassMapDefinitionSchema.optional()
8260
+ classMap: DetectionCatalogClassMapSchema.optional()
8262
8261
  });
8263
8262
  var ConvertResultSchema = object({
8264
8263
  entry: ModelCatalogEntrySchema,
@@ -9121,7 +9120,7 @@ var AddonPageDeclarationSchema = object({
9121
9120
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9122
9121
  sectionLabel: string().optional()
9123
9122
  });
9124
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9123
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9125
9124
  var AddonHttpRouteSchema = object({
9126
9125
  method: _enum([
9127
9126
  "GET",
@@ -9356,7 +9355,7 @@ var WidgetMetadataSchema = object({
9356
9355
  defaultColumns: number().int().min(1).max(12).default(6),
9357
9356
  defaultRows: number().int().min(1).max(12).default(1)
9358
9357
  });
9359
- method(_void(), array(WidgetMetadataSchema).readonly());
9358
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9360
9359
  /**
9361
9360
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9362
9361
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10980,7 +10979,7 @@ var CustomModelDescriptorSchema = object({
10980
10979
  stepId: string(),
10981
10980
  entry: ModelCatalogEntrySchema
10982
10981
  });
10983
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10982
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10984
10983
  /**
10985
10984
  * Query filter for settings-store collections.
10986
10985
  */
@@ -11067,7 +11066,8 @@ method(object({
11067
11066
  }), _void(), { kind: "mutation" }), method(object({
11068
11067
  namespace: string().optional(),
11069
11068
  collection: string(),
11070
- filter: QueryFilterSchema.optional()
11069
+ filter: QueryFilterSchema.optional(),
11070
+ columns: array(string()).readonly().optional()
11071
11071
  }), array(SettingsRecordSchema).readonly()), method(object({
11072
11072
  namespace: string().optional(),
11073
11073
  collection: string(),
@@ -11130,46 +11130,87 @@ var EngineInfoSchema = object({
11130
11130
  kind: _enum(["relational", "vector"]),
11131
11131
  displayName: string()
11132
11132
  });
11133
- method(_void(), EngineInfoSchema), method(object({
11133
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11134
11134
  namespace: string().optional(),
11135
11135
  collection: string(),
11136
11136
  key: string()
11137
- }), unknown()), method(object({
11137
+ }), unknown(), { auth: "admin" }), method(object({
11138
11138
  namespace: string().optional(),
11139
11139
  collection: string(),
11140
11140
  key: string(),
11141
11141
  value: unknown()
11142
- }), _void(), { kind: "mutation" }), method(object({
11142
+ }), _void(), {
11143
+ kind: "mutation",
11144
+ auth: "admin"
11145
+ }), method(object({
11143
11146
  namespace: string().optional(),
11144
11147
  collection: string(),
11145
- filter: QueryFilterSchema.optional()
11146
- }), array(SettingsRecordSchema).readonly()), method(object({
11148
+ filter: QueryFilterSchema.optional(),
11149
+ /**
11150
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11151
+ *
11152
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11153
+ * was wrong — corrected 2026-08-26 after the hop map
11154
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11155
+ * There is **no Zod parse at all** between the door and the engine: the
11156
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11157
+ * field declared here reaches `SqliteSettingsBackend` either way.
11158
+ *
11159
+ * What actually lost `columns` was the THIRD declaration of this shape:
11160
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11161
+ * interface the engine destructures from. The field existed on both
11162
+ * schemas and the engine still never read it, because nothing checks a
11163
+ * registered provider against `InferProvider<cap>` —
11164
+ * `ProviderRegistration.provider` is typed `object`.
11165
+ *
11166
+ * It is declared here anyway, and must stay in step with
11167
+ * `settings-store.query`: a caller reading only the cap definitions has
11168
+ * to be able to see that this call carries a projection.
11169
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11170
+ */
11171
+ columns: array(string()).readonly().optional()
11172
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11147
11173
  namespace: string().optional(),
11148
11174
  collection: string(),
11149
11175
  record: SettingsRecordSchema
11150
- }), _void(), { kind: "mutation" }), method(object({
11176
+ }), _void(), {
11177
+ kind: "mutation",
11178
+ auth: "admin"
11179
+ }), method(object({
11151
11180
  namespace: string().optional(),
11152
11181
  collection: string(),
11153
11182
  id: string(),
11154
11183
  data: record(string(), unknown())
11155
- }), _void(), { kind: "mutation" }), method(object({
11184
+ }), _void(), {
11185
+ kind: "mutation",
11186
+ auth: "admin"
11187
+ }), method(object({
11156
11188
  namespace: string().optional(),
11157
11189
  collection: string(),
11158
11190
  key: string()
11159
- }), _void(), { kind: "mutation" }), method(object({
11191
+ }), _void(), {
11192
+ kind: "mutation",
11193
+ auth: "admin"
11194
+ }), method(object({
11160
11195
  namespace: string().optional(),
11161
11196
  collection: string(),
11162
11197
  filter: MutationFilterSchema
11163
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11198
+ }), object({ deleted: number().int() }), {
11199
+ kind: "mutation",
11200
+ auth: "admin"
11201
+ }), method(object({
11164
11202
  namespace: string().optional(),
11165
11203
  collection: string(),
11166
11204
  filter: MutationFilterSchema,
11167
11205
  data: record(string(), unknown())
11168
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11206
+ }), object({ updated: number().int() }), {
11207
+ kind: "mutation",
11208
+ auth: "admin"
11209
+ }), method(object({
11169
11210
  namespace: string().optional(),
11170
11211
  collection: string(),
11171
11212
  filter: QueryFilterSchema.optional()
11172
- }), number()), method(object({
11213
+ }), number(), { auth: "admin" }), method(object({
11173
11214
  namespace: string().optional(),
11174
11215
  collection: string(),
11175
11216
  field: string(),
@@ -11179,15 +11220,18 @@ method(_void(), EngineInfoSchema), method(object({
11179
11220
  }), array(object({
11180
11221
  bucket: number().int(),
11181
11222
  count: number().int()
11182
- })).readonly()), method(object({
11223
+ })).readonly(), { auth: "admin" }), method(object({
11183
11224
  namespace: string().optional(),
11184
11225
  collection: string()
11185
- }), boolean()), method(object({
11226
+ }), boolean(), { auth: "admin" }), method(object({
11186
11227
  namespace: string().optional(),
11187
11228
  collection: string(),
11188
11229
  columns: array(CollectionColumnSchema).readonly(),
11189
11230
  indexes: array(CollectionIndexSchema).readonly().optional()
11190
- }), _void(), { kind: "mutation" });
11231
+ }), _void(), {
11232
+ kind: "mutation",
11233
+ auth: "admin"
11234
+ });
11191
11235
  /**
11192
11236
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11193
11237
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12477,7 +12521,7 @@ method(object({
12477
12521
  crop: _instanceof(Uint8Array),
12478
12522
  width: number(),
12479
12523
  height: number()
12480
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12524
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12481
12525
  /**
12482
12526
  * filesystem-browse — per-node capability for browsing the node's local
12483
12527
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12770,19 +12814,22 @@ method(LlmGenerateBaseInputSchema.extend({
12770
12814
  runtime: ManagedRuntimeConfigSchema,
12771
12815
  /** The managed profile's timeout, threaded by the hub provider. */
12772
12816
  timeoutMs: number().int().positive().optional()
12773
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12817
+ }), LlmGenerateResultSchema, {
12818
+ kind: "mutation",
12819
+ auth: "admin"
12820
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12774
12821
  kind: "mutation",
12775
12822
  auth: "admin"
12776
12823
  }), method(object({}), _void(), {
12777
12824
  kind: "mutation",
12778
12825
  auth: "admin"
12779
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12826
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12780
12827
  kind: "mutation",
12781
12828
  auth: "admin"
12782
12829
  }), method(object({ file: string() }), _void(), {
12783
12830
  kind: "mutation",
12784
12831
  auth: "admin"
12785
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12832
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12786
12833
  /**
12787
12834
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12788
12835
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16293,7 +16340,7 @@ var OauthIntegrationDescriptorSchema = object({
16293
16340
  */
16294
16341
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16295
16342
  });
16296
- method(_void(), OauthIntegrationDescriptorSchema);
16343
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16297
16344
  /**
16298
16345
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16299
16346
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17488,6 +17535,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17488
17535
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17489
17536
  kind: "mutation",
17490
17537
  auth: "admin"
17538
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17539
+ kind: "mutation",
17540
+ auth: "admin"
17541
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17542
+ kind: "query",
17543
+ auth: "admin"
17544
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17545
+ kind: "mutation",
17546
+ auth: "admin"
17491
17547
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17492
17548
  kind: "query",
17493
17549
  auth: "admin"
@@ -17642,6 +17698,11 @@ object({
17642
17698
  "jpeg"
17643
17699
  ])
17644
17700
  });
17701
+ /**
17702
+ * Process-local frame identity. It is serializable so it can ride an in-process
17703
+ * capability call, but `registryId` deliberately prevents resolution in any
17704
+ * other process or execution group.
17705
+ */
17645
17706
  var FrameRefSchema = object({
17646
17707
  registryId: string().min(1),
17647
17708
  id: string().min(1),
@@ -19951,7 +20012,7 @@ method(object({
19951
20012
  * linking rather than produce an eternal token.
19952
20013
  */
19953
20014
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19954
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20015
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19955
20016
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19956
20017
  providerId: string().min(1),
19957
20018
  displayName: string().min(1),
@@ -20046,10 +20107,13 @@ var EvictResultSchema = object({
20046
20107
  /** True when the provider has nothing left it is willing to drop on this location. */
20047
20108
  exhausted: boolean()
20048
20109
  });
20049
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20110
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20050
20111
  locationId: string(),
20051
20112
  targetBytes: number().int().positive()
20052
- }), EvictResultSchema, { kind: "mutation" });
20113
+ }), EvictResultSchema, {
20114
+ kind: "mutation",
20115
+ auth: "admin"
20116
+ });
20053
20117
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20054
20118
  kind: "mutation",
20055
20119
  auth: "admin"
@@ -20109,26 +20173,50 @@ var ReadChunkInputSchema = object({
20109
20173
  length: number()
20110
20174
  });
20111
20175
  var EndDownloadInputSchema = object({ downloadId: string() });
20112
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20176
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20113
20177
  location: StorageLocationSchema,
20114
20178
  relativePath: string()
20115
- }), string()), method(object({
20179
+ }), string(), { auth: "admin" }), method(object({
20116
20180
  location: StorageLocationSchema,
20117
20181
  relativePath: string(),
20118
20182
  data: _instanceof(Uint8Array)
20119
- }), _void(), { kind: "mutation" }), method(object({
20183
+ }), _void(), {
20184
+ kind: "mutation",
20185
+ auth: "admin"
20186
+ }), method(object({
20120
20187
  location: StorageLocationSchema,
20121
20188
  relativePath: string()
20122
- }), _instanceof(Uint8Array)), method(object({
20189
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20123
20190
  location: StorageLocationSchema,
20124
20191
  relativePath: string()
20125
- }), boolean()), method(object({
20192
+ }), boolean(), { auth: "admin" }), method(object({
20126
20193
  location: StorageLocationSchema,
20127
20194
  prefix: string().optional()
20128
- }), array(string()).readonly()), method(object({
20195
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20129
20196
  location: StorageLocationSchema,
20130
20197
  relativePath: string()
20131
- }), _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" });
20198
+ }), _void(), {
20199
+ kind: "mutation",
20200
+ auth: "admin"
20201
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20202
+ kind: "mutation",
20203
+ auth: "admin"
20204
+ }), method(WriteChunkInputSchema, _void(), {
20205
+ kind: "mutation",
20206
+ auth: "admin"
20207
+ }), method(FinalizeUploadInputSchema, _void(), {
20208
+ kind: "mutation",
20209
+ auth: "admin"
20210
+ }), method(AbortUploadInputSchema, _void(), {
20211
+ kind: "mutation",
20212
+ auth: "admin"
20213
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20214
+ kind: "mutation",
20215
+ auth: "admin"
20216
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20217
+ kind: "mutation",
20218
+ auth: "admin"
20219
+ });
20132
20220
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20133
20221
  var ProfileSettingsSchemaBridge = unknown().nullable();
20134
20222
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20386,7 +20474,8 @@ method(object({
20386
20474
  access: "create"
20387
20475
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20388
20476
  kind: "mutation",
20389
- access: "view"
20477
+ access: "view",
20478
+ auth: "admin"
20390
20479
  }), method(object({
20391
20480
  /** Required — the user the assertion belongs to (verified). */
20392
20481
  userId: string(),
@@ -20394,10 +20483,12 @@ method(object({
20394
20483
  response: record(string(), unknown())
20395
20484
  }), object({ verified: boolean() }), {
20396
20485
  kind: "mutation",
20397
- access: "view"
20486
+ access: "view",
20487
+ auth: "admin"
20398
20488
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20399
20489
  kind: "mutation",
20400
- access: "view"
20490
+ access: "view",
20491
+ auth: "admin"
20401
20492
  }), method(object({
20402
20493
  /** AuthenticationResponseJSON from the browser. */
20403
20494
  response: record(string(), unknown()) }), object({
@@ -20405,7 +20496,8 @@ response: record(string(), unknown()) }), object({
20405
20496
  userId: string().nullable()
20406
20497
  }), {
20407
20498
  kind: "mutation",
20408
- access: "view"
20499
+ access: "view",
20500
+ auth: "admin"
20409
20501
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20410
20502
  userId: string(),
20411
20503
  credentialId: string()
@@ -20577,7 +20669,19 @@ var VectorStatsResultSchema = object({
20577
20669
  /** False when the backend ranks approximately. */
20578
20670
  exact: boolean()
20579
20671
  });
20580
- 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);
20672
+ method(VectorDeclareIndexInputSchema, _void(), {
20673
+ kind: "mutation",
20674
+ auth: "admin"
20675
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20676
+ kind: "mutation",
20677
+ auth: "admin"
20678
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20679
+ kind: "mutation",
20680
+ auth: "admin"
20681
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20682
+ kind: "mutation",
20683
+ auth: "admin"
20684
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20581
20685
  var ClipSchema = object({
20582
20686
  /** Opaque, provider-namespaced id. The default provider encodes the time
20583
20687
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23030,7 +23134,27 @@ var MediaFileLiteSchema$1 = object({
23030
23134
  sizeBytes: number(),
23031
23135
  timestamp: number()
23032
23136
  });
23033
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23137
+ method(object({
23138
+ /**
23139
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23140
+ *
23141
+ * Default `false`, the same inversion `listRecentFaces` and
23142
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23143
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23144
+ * on the live hub the same day: four identities cost 40,979 B with the
23145
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23146
+ * four times and the viewer holds at `staleTime: 30_000`.
23147
+ *
23148
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23149
+ * the `event-media` plane serves that key `immutable` with an ETag.
23150
+ *
23151
+ * **This is an INPUT field, so it does not reach the addon until the
23152
+ * next train** — the hub router validates cap inputs against its own
23153
+ * compiled Zod and strips a key it does not know. Until then the
23154
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23155
+ * is what ships, and the opt-in becomes reachable when the train lands.
23156
+ */
23157
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23034
23158
  kind: "mutation",
23035
23159
  auth: "admin"
23036
23160
  }), method(object({
@@ -25966,8 +26090,10 @@ var PlateInfoSchema = object({
25966
26090
  keyFrameMediaKey: string().optional(),
25967
26091
  base64: string().optional(),
25968
26092
  /**
25969
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25970
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26093
+ * Same crop as a data-plane URL, always present when the plate has a stored
26094
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26095
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26096
+ * left at its `true` default.
25971
26097
  */
25972
26098
  cropUrl: string().optional()
25973
26099
  });
@@ -25987,14 +26113,34 @@ var PlateClusterSchema = object({
25987
26113
  });
25988
26114
  method(object({
25989
26115
  deviceId: number().int().optional(),
25990
- limit: number().int().positive().optional()
26116
+ limit: number().int().positive().optional(),
26117
+ /**
26118
+ * Inline the base64 crop on every row. Default `true` — the existing
26119
+ * behaviour, kept so no caller breaks.
26120
+ *
26121
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26122
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26123
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26124
+ * metadata without them — and the browser then caches the images.
26125
+ *
26126
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26127
+ * plates were the one gallery list left without it.
26128
+ *
26129
+ * **This is an INPUT field, so it does not reach the addon until the
26130
+ * next train.** The hub router validates cap inputs against its own
26131
+ * compiled Zod and strips a key it does not know. Until the train
26132
+ * ships, sending `false` is harmless and keeps the crops inline.
26133
+ */
26134
+ includeCrops: boolean().optional()
25991
26135
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25992
26136
  deviceId: number().int(),
25993
26137
  trackId: string()
25994
26138
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25995
26139
  text: string().min(1),
25996
26140
  maxDistance: number().int().min(0).optional(),
25997
- limit: number().int().positive().optional()
26141
+ limit: number().int().positive().optional(),
26142
+ /** See `listPlates.includeCrops`. Default `true`. */
26143
+ includeCrops: boolean().optional()
25998
26144
  }), array(PlateInfoSchema).readonly()), method(object({
25999
26145
  maxDistance: number().int().min(0).optional(),
26000
26146
  minClusterSize: number().int().min(2).optional(),
@@ -26008,7 +26154,13 @@ method(object({
26008
26154
  }), method(object({ plateId: string() }), _void(), {
26009
26155
  kind: "mutation",
26010
26156
  auth: "admin"
26011
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26157
+ }), method(object({
26158
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26159
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26160
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26161
+ * INPUT field: stripped by the hub router until the train ships, which
26162
+ * resolves to `false` and is exactly the intended default. */
26163
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26012
26164
  kind: "mutation",
26013
26165
  auth: "admin"
26014
26166
  }), method(object({
@@ -33715,6 +33867,12 @@ Object.freeze({
33715
33867
  addonId: null,
33716
33868
  access: "create"
33717
33869
  },
33870
+ "pipelineAnalytics.cancelRelocateMedia": {
33871
+ capName: "pipeline-analytics",
33872
+ capScope: "device",
33873
+ addonId: null,
33874
+ access: "create"
33875
+ },
33718
33876
  "pipelineAnalytics.cancelStorageMigrationMove": {
33719
33877
  capName: "pipeline-analytics",
33720
33878
  capScope: "device",
@@ -33889,6 +34047,12 @@ Object.freeze({
33889
34047
  addonId: null,
33890
34048
  access: "view"
33891
34049
  },
34050
+ "pipelineAnalytics.listRelocateMediaJobs": {
34051
+ capName: "pipeline-analytics",
34052
+ capScope: "device",
34053
+ addonId: null,
34054
+ access: "view"
34055
+ },
33892
34056
  "pipelineAnalytics.listRetrainAnnotations": {
33893
34057
  capName: "pipeline-analytics",
33894
34058
  capScope: "device",
@@ -33967,6 +34131,12 @@ Object.freeze({
33967
34131
  addonId: null,
33968
34132
  access: "create"
33969
34133
  },
34134
+ "pipelineAnalytics.relocateMedia": {
34135
+ capName: "pipeline-analytics",
34136
+ capScope: "device",
34137
+ addonId: null,
34138
+ access: "create"
34139
+ },
33970
34140
  "pipelineAnalytics.restageRetrainTrack": {
33971
34141
  capName: "pipeline-analytics",
33972
34142
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6636,7 +6636,7 @@ function method(input, output, options) {
6636
6636
  input,
6637
6637
  output,
6638
6638
  kind: options?.kind ?? "query",
6639
- auth: options?.auth ?? "protected",
6639
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6640
6640
  ...options?.access !== void 0 ? { access: options.access } : {},
6641
6641
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6642
6642
  timeoutMs: options?.timeoutMs
@@ -6660,7 +6660,7 @@ function event(data) {
6660
6660
  }
6661
6661
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6662
6662
  var VersionOutputSchema$1 = object({ version: string() });
6663
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6663
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6664
6664
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6665
6665
  DeviceType["Camera"] = "camera";
6666
6666
  DeviceType["Hub"] = "hub";
@@ -6981,7 +6981,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6981
6981
  }({});
6982
6982
  var StaticDirOutputSchema = object({ staticDir: string() });
6983
6983
  var VersionOutputSchema = object({ version: string() });
6984
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6984
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6985
6985
  /**
6986
6986
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6987
6987
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7595,24 +7595,6 @@ var RecordingRetentionSchema = object({
7595
7595
  maxSizeGb: number().min(0).optional()
7596
7596
  });
7597
7597
  /**
7598
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7599
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7600
- * previews at. Five graduated steps; absent on a config = `standard` (the
7601
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7602
- *
7603
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7604
- * Each window's index sidecar carries its own tile dims, so a camera whose
7605
- * preset changed over time renders every historical window at the dims it was
7606
- * written with.
7607
- */
7608
- var ScrubThumbnailPresetSchema = _enum([
7609
- "minimal",
7610
- "low",
7611
- "standard",
7612
- "high",
7613
- "max"
7614
- ]);
7615
- /**
7616
7598
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7617
7599
  *
7618
7600
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7620,7 +7602,11 @@ var ScrubThumbnailPresetSchema = _enum([
7620
7602
  * other field is a storage knob (profiles, segment length, retention, scrub).
7621
7603
  *
7622
7604
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7623
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7605
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7606
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7607
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7608
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7609
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7624
7610
  * A stale caller must fail loudly — silently stripping its legacy intent would
7625
7611
  * persist a band-less config, i.e. silently stop recording the camera.
7626
7612
  */
@@ -7643,14 +7629,7 @@ var RecordingConfigSchema = object({
7643
7629
  * "off" is the absence of a covering band, never a band value.
7644
7630
  */
7645
7631
  bands: array(RecordingBandSchema).default([]),
7646
- retention: RecordingRetentionSchema.optional(),
7647
- /**
7648
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7649
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7650
- * windows only — existing sheets are immutable, and each window's index
7651
- * carries its own tile dims so mixed-preset history renders correctly.
7652
- */
7653
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7632
+ retention: RecordingRetentionSchema.optional()
7654
7633
  }).strict();
7655
7634
  /**
7656
7635
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7726,10 +7705,11 @@ var RelocateFootageInputSchema = object({
7726
7705
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7727
7706
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7728
7707
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7729
- var StorageMigrationMediaMoveInputSchema = object({
7708
+ var RelocateMediaInputSchema = object({
7730
7709
  toLocationId: string(),
7731
7710
  throttleMbps: number().min(1).max(1e3).optional()
7732
- }).extend({ leaseId: string().min(1) });
7711
+ });
7712
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7733
7713
  /** The independently selectable logical storage classes. `recordings`
7734
7714
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7735
7715
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8024,7 +8004,26 @@ var LabelDefinitionSchema = object({
8024
8004
  description: string().optional(),
8025
8005
  icon: string().optional()
8026
8006
  });
8027
- var ClassMapDefinitionSchema = object({
8007
+ /**
8008
+ * Wire schema for a per-model CATALOG classMap override
8009
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8010
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8011
+ * detection pipeline executor actually routes.
8012
+ *
8013
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8014
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8015
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8016
+ * enum) — the two used to share the name `ClassMapDefinition`/
8017
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8018
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8019
+ * are not: it is two different concepts colliding on a name. Keep this type
8020
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8021
+ * would either narrow every `ClassMapDefinition` consumer to the four
8022
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8023
+ * schema exists for (see the "rejects a classMap whose target is not a
8024
+ * detection macro" test in `model-catalog-schema.test.ts`).
8025
+ */
8026
+ var DetectionCatalogClassMapSchema = object({
8028
8027
  mapping: record(string(), _enum([
8029
8028
  "person",
8030
8029
  "vehicle",
@@ -8229,7 +8228,7 @@ var ModelCatalogEntrySchema = object({
8229
8228
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8230
8229
  * labels already ARE the CamStack macros (Scrypted identity map).
8231
8230
  */
8232
- classMap: ClassMapDefinitionSchema.optional()
8231
+ classMap: DetectionCatalogClassMapSchema.optional()
8233
8232
  });
8234
8233
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8235
8234
  format: literal("openvino"),
@@ -8259,7 +8258,7 @@ var ModelConvertMetadataSchema = object({
8259
8258
  "segmentation"
8260
8259
  ]),
8261
8260
  faceAlignment: boolean().optional(),
8262
- classMap: ClassMapDefinitionSchema.optional()
8261
+ classMap: DetectionCatalogClassMapSchema.optional()
8263
8262
  });
8264
8263
  var ConvertResultSchema = object({
8265
8264
  entry: ModelCatalogEntrySchema,
@@ -9122,7 +9121,7 @@ var AddonPageDeclarationSchema = object({
9122
9121
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9123
9122
  sectionLabel: string().optional()
9124
9123
  });
9125
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9124
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9126
9125
  var AddonHttpRouteSchema = object({
9127
9126
  method: _enum([
9128
9127
  "GET",
@@ -9357,7 +9356,7 @@ var WidgetMetadataSchema = object({
9357
9356
  defaultColumns: number().int().min(1).max(12).default(6),
9358
9357
  defaultRows: number().int().min(1).max(12).default(1)
9359
9358
  });
9360
- method(_void(), array(WidgetMetadataSchema).readonly());
9359
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9361
9360
  /**
9362
9361
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9363
9362
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10981,7 +10980,7 @@ var CustomModelDescriptorSchema = object({
10981
10980
  stepId: string(),
10982
10981
  entry: ModelCatalogEntrySchema
10983
10982
  });
10984
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10983
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10985
10984
  /**
10986
10985
  * Query filter for settings-store collections.
10987
10986
  */
@@ -11068,7 +11067,8 @@ method(object({
11068
11067
  }), _void(), { kind: "mutation" }), method(object({
11069
11068
  namespace: string().optional(),
11070
11069
  collection: string(),
11071
- filter: QueryFilterSchema.optional()
11070
+ filter: QueryFilterSchema.optional(),
11071
+ columns: array(string()).readonly().optional()
11072
11072
  }), array(SettingsRecordSchema).readonly()), method(object({
11073
11073
  namespace: string().optional(),
11074
11074
  collection: string(),
@@ -11131,46 +11131,87 @@ var EngineInfoSchema = object({
11131
11131
  kind: _enum(["relational", "vector"]),
11132
11132
  displayName: string()
11133
11133
  });
11134
- method(_void(), EngineInfoSchema), method(object({
11134
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11135
11135
  namespace: string().optional(),
11136
11136
  collection: string(),
11137
11137
  key: string()
11138
- }), unknown()), method(object({
11138
+ }), unknown(), { auth: "admin" }), method(object({
11139
11139
  namespace: string().optional(),
11140
11140
  collection: string(),
11141
11141
  key: string(),
11142
11142
  value: unknown()
11143
- }), _void(), { kind: "mutation" }), method(object({
11143
+ }), _void(), {
11144
+ kind: "mutation",
11145
+ auth: "admin"
11146
+ }), method(object({
11144
11147
  namespace: string().optional(),
11145
11148
  collection: string(),
11146
- filter: QueryFilterSchema.optional()
11147
- }), array(SettingsRecordSchema).readonly()), method(object({
11149
+ filter: QueryFilterSchema.optional(),
11150
+ /**
11151
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11152
+ *
11153
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11154
+ * was wrong — corrected 2026-08-26 after the hop map
11155
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11156
+ * There is **no Zod parse at all** between the door and the engine: the
11157
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11158
+ * field declared here reaches `SqliteSettingsBackend` either way.
11159
+ *
11160
+ * What actually lost `columns` was the THIRD declaration of this shape:
11161
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11162
+ * interface the engine destructures from. The field existed on both
11163
+ * schemas and the engine still never read it, because nothing checks a
11164
+ * registered provider against `InferProvider<cap>` —
11165
+ * `ProviderRegistration.provider` is typed `object`.
11166
+ *
11167
+ * It is declared here anyway, and must stay in step with
11168
+ * `settings-store.query`: a caller reading only the cap definitions has
11169
+ * to be able to see that this call carries a projection.
11170
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11171
+ */
11172
+ columns: array(string()).readonly().optional()
11173
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11148
11174
  namespace: string().optional(),
11149
11175
  collection: string(),
11150
11176
  record: SettingsRecordSchema
11151
- }), _void(), { kind: "mutation" }), method(object({
11177
+ }), _void(), {
11178
+ kind: "mutation",
11179
+ auth: "admin"
11180
+ }), method(object({
11152
11181
  namespace: string().optional(),
11153
11182
  collection: string(),
11154
11183
  id: string(),
11155
11184
  data: record(string(), unknown())
11156
- }), _void(), { kind: "mutation" }), method(object({
11185
+ }), _void(), {
11186
+ kind: "mutation",
11187
+ auth: "admin"
11188
+ }), method(object({
11157
11189
  namespace: string().optional(),
11158
11190
  collection: string(),
11159
11191
  key: string()
11160
- }), _void(), { kind: "mutation" }), method(object({
11192
+ }), _void(), {
11193
+ kind: "mutation",
11194
+ auth: "admin"
11195
+ }), method(object({
11161
11196
  namespace: string().optional(),
11162
11197
  collection: string(),
11163
11198
  filter: MutationFilterSchema
11164
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11199
+ }), object({ deleted: number().int() }), {
11200
+ kind: "mutation",
11201
+ auth: "admin"
11202
+ }), method(object({
11165
11203
  namespace: string().optional(),
11166
11204
  collection: string(),
11167
11205
  filter: MutationFilterSchema,
11168
11206
  data: record(string(), unknown())
11169
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11207
+ }), object({ updated: number().int() }), {
11208
+ kind: "mutation",
11209
+ auth: "admin"
11210
+ }), method(object({
11170
11211
  namespace: string().optional(),
11171
11212
  collection: string(),
11172
11213
  filter: QueryFilterSchema.optional()
11173
- }), number()), method(object({
11214
+ }), number(), { auth: "admin" }), method(object({
11174
11215
  namespace: string().optional(),
11175
11216
  collection: string(),
11176
11217
  field: string(),
@@ -11180,15 +11221,18 @@ method(_void(), EngineInfoSchema), method(object({
11180
11221
  }), array(object({
11181
11222
  bucket: number().int(),
11182
11223
  count: number().int()
11183
- })).readonly()), method(object({
11224
+ })).readonly(), { auth: "admin" }), method(object({
11184
11225
  namespace: string().optional(),
11185
11226
  collection: string()
11186
- }), boolean()), method(object({
11227
+ }), boolean(), { auth: "admin" }), method(object({
11187
11228
  namespace: string().optional(),
11188
11229
  collection: string(),
11189
11230
  columns: array(CollectionColumnSchema).readonly(),
11190
11231
  indexes: array(CollectionIndexSchema).readonly().optional()
11191
- }), _void(), { kind: "mutation" });
11232
+ }), _void(), {
11233
+ kind: "mutation",
11234
+ auth: "admin"
11235
+ });
11192
11236
  /**
11193
11237
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11194
11238
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12478,7 +12522,7 @@ method(object({
12478
12522
  crop: _instanceof(Uint8Array),
12479
12523
  width: number(),
12480
12524
  height: number()
12481
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12525
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12482
12526
  /**
12483
12527
  * filesystem-browse — per-node capability for browsing the node's local
12484
12528
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12771,19 +12815,22 @@ method(LlmGenerateBaseInputSchema.extend({
12771
12815
  runtime: ManagedRuntimeConfigSchema,
12772
12816
  /** The managed profile's timeout, threaded by the hub provider. */
12773
12817
  timeoutMs: number().int().positive().optional()
12774
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12818
+ }), LlmGenerateResultSchema, {
12819
+ kind: "mutation",
12820
+ auth: "admin"
12821
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12775
12822
  kind: "mutation",
12776
12823
  auth: "admin"
12777
12824
  }), method(object({}), _void(), {
12778
12825
  kind: "mutation",
12779
12826
  auth: "admin"
12780
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12827
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12781
12828
  kind: "mutation",
12782
12829
  auth: "admin"
12783
12830
  }), method(object({ file: string() }), _void(), {
12784
12831
  kind: "mutation",
12785
12832
  auth: "admin"
12786
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12833
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12787
12834
  /**
12788
12835
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12789
12836
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16294,7 +16341,7 @@ var OauthIntegrationDescriptorSchema = object({
16294
16341
  */
16295
16342
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16296
16343
  });
16297
- method(_void(), OauthIntegrationDescriptorSchema);
16344
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16298
16345
  /**
16299
16346
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16300
16347
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17489,6 +17536,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17489
17536
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17490
17537
  kind: "mutation",
17491
17538
  auth: "admin"
17539
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17540
+ kind: "mutation",
17541
+ auth: "admin"
17542
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17543
+ kind: "query",
17544
+ auth: "admin"
17545
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17546
+ kind: "mutation",
17547
+ auth: "admin"
17492
17548
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17493
17549
  kind: "query",
17494
17550
  auth: "admin"
@@ -17643,6 +17699,11 @@ object({
17643
17699
  "jpeg"
17644
17700
  ])
17645
17701
  });
17702
+ /**
17703
+ * Process-local frame identity. It is serializable so it can ride an in-process
17704
+ * capability call, but `registryId` deliberately prevents resolution in any
17705
+ * other process or execution group.
17706
+ */
17646
17707
  var FrameRefSchema = object({
17647
17708
  registryId: string().min(1),
17648
17709
  id: string().min(1),
@@ -19952,7 +20013,7 @@ method(object({
19952
20013
  * linking rather than produce an eternal token.
19953
20014
  */
19954
20015
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19955
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20016
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19956
20017
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19957
20018
  providerId: string().min(1),
19958
20019
  displayName: string().min(1),
@@ -20047,10 +20108,13 @@ var EvictResultSchema = object({
20047
20108
  /** True when the provider has nothing left it is willing to drop on this location. */
20048
20109
  exhausted: boolean()
20049
20110
  });
20050
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20111
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20051
20112
  locationId: string(),
20052
20113
  targetBytes: number().int().positive()
20053
- }), EvictResultSchema, { kind: "mutation" });
20114
+ }), EvictResultSchema, {
20115
+ kind: "mutation",
20116
+ auth: "admin"
20117
+ });
20054
20118
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20055
20119
  kind: "mutation",
20056
20120
  auth: "admin"
@@ -20110,26 +20174,50 @@ var ReadChunkInputSchema = object({
20110
20174
  length: number()
20111
20175
  });
20112
20176
  var EndDownloadInputSchema = object({ downloadId: string() });
20113
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20177
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20114
20178
  location: StorageLocationSchema,
20115
20179
  relativePath: string()
20116
- }), string()), method(object({
20180
+ }), string(), { auth: "admin" }), method(object({
20117
20181
  location: StorageLocationSchema,
20118
20182
  relativePath: string(),
20119
20183
  data: _instanceof(Uint8Array)
20120
- }), _void(), { kind: "mutation" }), method(object({
20184
+ }), _void(), {
20185
+ kind: "mutation",
20186
+ auth: "admin"
20187
+ }), method(object({
20121
20188
  location: StorageLocationSchema,
20122
20189
  relativePath: string()
20123
- }), _instanceof(Uint8Array)), method(object({
20190
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20124
20191
  location: StorageLocationSchema,
20125
20192
  relativePath: string()
20126
- }), boolean()), method(object({
20193
+ }), boolean(), { auth: "admin" }), method(object({
20127
20194
  location: StorageLocationSchema,
20128
20195
  prefix: string().optional()
20129
- }), array(string()).readonly()), method(object({
20196
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20130
20197
  location: StorageLocationSchema,
20131
20198
  relativePath: string()
20132
- }), _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" });
20199
+ }), _void(), {
20200
+ kind: "mutation",
20201
+ auth: "admin"
20202
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20203
+ kind: "mutation",
20204
+ auth: "admin"
20205
+ }), method(WriteChunkInputSchema, _void(), {
20206
+ kind: "mutation",
20207
+ auth: "admin"
20208
+ }), method(FinalizeUploadInputSchema, _void(), {
20209
+ kind: "mutation",
20210
+ auth: "admin"
20211
+ }), method(AbortUploadInputSchema, _void(), {
20212
+ kind: "mutation",
20213
+ auth: "admin"
20214
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20215
+ kind: "mutation",
20216
+ auth: "admin"
20217
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20218
+ kind: "mutation",
20219
+ auth: "admin"
20220
+ });
20133
20221
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20134
20222
  var ProfileSettingsSchemaBridge = unknown().nullable();
20135
20223
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20387,7 +20475,8 @@ method(object({
20387
20475
  access: "create"
20388
20476
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20389
20477
  kind: "mutation",
20390
- access: "view"
20478
+ access: "view",
20479
+ auth: "admin"
20391
20480
  }), method(object({
20392
20481
  /** Required — the user the assertion belongs to (verified). */
20393
20482
  userId: string(),
@@ -20395,10 +20484,12 @@ method(object({
20395
20484
  response: record(string(), unknown())
20396
20485
  }), object({ verified: boolean() }), {
20397
20486
  kind: "mutation",
20398
- access: "view"
20487
+ access: "view",
20488
+ auth: "admin"
20399
20489
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20400
20490
  kind: "mutation",
20401
- access: "view"
20491
+ access: "view",
20492
+ auth: "admin"
20402
20493
  }), method(object({
20403
20494
  /** AuthenticationResponseJSON from the browser. */
20404
20495
  response: record(string(), unknown()) }), object({
@@ -20406,7 +20497,8 @@ response: record(string(), unknown()) }), object({
20406
20497
  userId: string().nullable()
20407
20498
  }), {
20408
20499
  kind: "mutation",
20409
- access: "view"
20500
+ access: "view",
20501
+ auth: "admin"
20410
20502
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20411
20503
  userId: string(),
20412
20504
  credentialId: string()
@@ -20578,7 +20670,19 @@ var VectorStatsResultSchema = object({
20578
20670
  /** False when the backend ranks approximately. */
20579
20671
  exact: boolean()
20580
20672
  });
20581
- 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);
20673
+ method(VectorDeclareIndexInputSchema, _void(), {
20674
+ kind: "mutation",
20675
+ auth: "admin"
20676
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20677
+ kind: "mutation",
20678
+ auth: "admin"
20679
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20680
+ kind: "mutation",
20681
+ auth: "admin"
20682
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20683
+ kind: "mutation",
20684
+ auth: "admin"
20685
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20582
20686
  var ClipSchema = object({
20583
20687
  /** Opaque, provider-namespaced id. The default provider encodes the time
20584
20688
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23031,7 +23135,27 @@ var MediaFileLiteSchema$1 = object({
23031
23135
  sizeBytes: number(),
23032
23136
  timestamp: number()
23033
23137
  });
23034
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23138
+ method(object({
23139
+ /**
23140
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23141
+ *
23142
+ * Default `false`, the same inversion `listRecentFaces` and
23143
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23144
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23145
+ * on the live hub the same day: four identities cost 40,979 B with the
23146
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23147
+ * four times and the viewer holds at `staleTime: 30_000`.
23148
+ *
23149
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23150
+ * the `event-media` plane serves that key `immutable` with an ETag.
23151
+ *
23152
+ * **This is an INPUT field, so it does not reach the addon until the
23153
+ * next train** — the hub router validates cap inputs against its own
23154
+ * compiled Zod and strips a key it does not know. Until then the
23155
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23156
+ * is what ships, and the opt-in becomes reachable when the train lands.
23157
+ */
23158
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23035
23159
  kind: "mutation",
23036
23160
  auth: "admin"
23037
23161
  }), 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({
@@ -33716,6 +33868,12 @@ Object.freeze({
33716
33868
  addonId: null,
33717
33869
  access: "create"
33718
33870
  },
33871
+ "pipelineAnalytics.cancelRelocateMedia": {
33872
+ capName: "pipeline-analytics",
33873
+ capScope: "device",
33874
+ addonId: null,
33875
+ access: "create"
33876
+ },
33719
33877
  "pipelineAnalytics.cancelStorageMigrationMove": {
33720
33878
  capName: "pipeline-analytics",
33721
33879
  capScope: "device",
@@ -33890,6 +34048,12 @@ Object.freeze({
33890
34048
  addonId: null,
33891
34049
  access: "view"
33892
34050
  },
34051
+ "pipelineAnalytics.listRelocateMediaJobs": {
34052
+ capName: "pipeline-analytics",
34053
+ capScope: "device",
34054
+ addonId: null,
34055
+ access: "view"
34056
+ },
33893
34057
  "pipelineAnalytics.listRetrainAnnotations": {
33894
34058
  capName: "pipeline-analytics",
33895
34059
  capScope: "device",
@@ -33968,6 +34132,12 @@ Object.freeze({
33968
34132
  addonId: null,
33969
34133
  access: "create"
33970
34134
  },
34135
+ "pipelineAnalytics.relocateMedia": {
34136
+ capName: "pipeline-analytics",
34137
+ capScope: "device",
34138
+ addonId: null,
34139
+ access: "create"
34140
+ },
33971
34141
  "pipelineAnalytics.restageRetrainTrack": {
33972
34142
  capName: "pipeline-analytics",
33973
34143
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.29",
3
+ "version": "0.2.30",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",