@camstack/addon-provider-wyze 0.2.32 → 0.2.33

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
@@ -6662,7 +6662,7 @@ function method(input, output, options) {
6662
6662
  input,
6663
6663
  output,
6664
6664
  kind: options?.kind ?? "query",
6665
- auth: options?.auth ?? "protected",
6665
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6666
6666
  ...options?.access !== void 0 ? { access: options.access } : {},
6667
6667
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6668
6668
  timeoutMs: options?.timeoutMs
@@ -6686,7 +6686,7 @@ function event(data) {
6686
6686
  }
6687
6687
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6688
6688
  var VersionOutputSchema$1 = object({ version: string() });
6689
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6689
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6690
6690
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6691
6691
  DeviceType["Camera"] = "camera";
6692
6692
  DeviceType["Hub"] = "hub";
@@ -7007,7 +7007,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7007
7007
  }({});
7008
7008
  var StaticDirOutputSchema = object({ staticDir: string() });
7009
7009
  var VersionOutputSchema = object({ version: string() });
7010
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7010
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7011
7011
  /**
7012
7012
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7013
7013
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7633,24 +7633,6 @@ var RecordingRetentionSchema = object({
7633
7633
  maxSizeGb: number().min(0).optional()
7634
7634
  });
7635
7635
  /**
7636
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7637
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7638
- * previews at. Five graduated steps; absent on a config = `standard` (the
7639
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7640
- *
7641
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7642
- * Each window's index sidecar carries its own tile dims, so a camera whose
7643
- * preset changed over time renders every historical window at the dims it was
7644
- * written with.
7645
- */
7646
- var ScrubThumbnailPresetSchema = _enum([
7647
- "minimal",
7648
- "low",
7649
- "standard",
7650
- "high",
7651
- "max"
7652
- ]);
7653
- /**
7654
7636
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7655
7637
  *
7656
7638
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7658,7 +7640,11 @@ var ScrubThumbnailPresetSchema = _enum([
7658
7640
  * other field is a storage knob (profiles, segment length, retention, scrub).
7659
7641
  *
7660
7642
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7661
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7643
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7644
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7645
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7646
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7647
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7662
7648
  * A stale caller must fail loudly — silently stripping its legacy intent would
7663
7649
  * persist a band-less config, i.e. silently stop recording the camera.
7664
7650
  */
@@ -7681,14 +7667,7 @@ var RecordingConfigSchema = object({
7681
7667
  * "off" is the absence of a covering band, never a band value.
7682
7668
  */
7683
7669
  bands: array(RecordingBandSchema).default([]),
7684
- retention: RecordingRetentionSchema.optional(),
7685
- /**
7686
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7687
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7688
- * windows only — existing sheets are immutable, and each window's index
7689
- * carries its own tile dims so mixed-preset history renders correctly.
7690
- */
7691
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7670
+ retention: RecordingRetentionSchema.optional()
7692
7671
  }).strict();
7693
7672
  /**
7694
7673
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7764,10 +7743,11 @@ var RelocateFootageInputSchema = object({
7764
7743
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7765
7744
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7766
7745
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7767
- var StorageMigrationMediaMoveInputSchema = object({
7746
+ var RelocateMediaInputSchema = object({
7768
7747
  toLocationId: string(),
7769
7748
  throttleMbps: number().min(1).max(1e3).optional()
7770
- }).extend({ leaseId: string().min(1) });
7749
+ });
7750
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7771
7751
  /** The independently selectable logical storage classes. `recordings`
7772
7752
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7773
7753
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8062,7 +8042,26 @@ var LabelDefinitionSchema = object({
8062
8042
  description: string().optional(),
8063
8043
  icon: string().optional()
8064
8044
  });
8065
- var ClassMapDefinitionSchema = object({
8045
+ /**
8046
+ * Wire schema for a per-model CATALOG classMap override
8047
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8048
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8049
+ * detection pipeline executor actually routes.
8050
+ *
8051
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8052
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8053
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8054
+ * enum) — the two used to share the name `ClassMapDefinition`/
8055
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8056
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8057
+ * are not: it is two different concepts colliding on a name. Keep this type
8058
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8059
+ * would either narrow every `ClassMapDefinition` consumer to the four
8060
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8061
+ * schema exists for (see the "rejects a classMap whose target is not a
8062
+ * detection macro" test in `model-catalog-schema.test.ts`).
8063
+ */
8064
+ var DetectionCatalogClassMapSchema = object({
8066
8065
  mapping: record(string(), _enum([
8067
8066
  "person",
8068
8067
  "vehicle",
@@ -8267,7 +8266,7 @@ var ModelCatalogEntrySchema = object({
8267
8266
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8268
8267
  * labels already ARE the CamStack macros (Scrypted identity map).
8269
8268
  */
8270
- classMap: ClassMapDefinitionSchema.optional()
8269
+ classMap: DetectionCatalogClassMapSchema.optional()
8271
8270
  });
8272
8271
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8273
8272
  format: literal("openvino"),
@@ -8297,7 +8296,7 @@ var ModelConvertMetadataSchema = object({
8297
8296
  "segmentation"
8298
8297
  ]),
8299
8298
  faceAlignment: boolean().optional(),
8300
- classMap: ClassMapDefinitionSchema.optional()
8299
+ classMap: DetectionCatalogClassMapSchema.optional()
8301
8300
  });
8302
8301
  var ConvertResultSchema = object({
8303
8302
  entry: ModelCatalogEntrySchema,
@@ -9160,7 +9159,7 @@ var AddonPageDeclarationSchema = object({
9160
9159
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9161
9160
  sectionLabel: string().optional()
9162
9161
  });
9163
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9162
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9164
9163
  var AddonHttpRouteSchema = object({
9165
9164
  method: _enum([
9166
9165
  "GET",
@@ -9395,7 +9394,7 @@ var WidgetMetadataSchema = object({
9395
9394
  defaultColumns: number().int().min(1).max(12).default(6),
9396
9395
  defaultRows: number().int().min(1).max(12).default(1)
9397
9396
  });
9398
- method(_void(), array(WidgetMetadataSchema).readonly());
9397
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9399
9398
  /**
9400
9399
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9401
9400
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11019,7 +11018,7 @@ var CustomModelDescriptorSchema = object({
11019
11018
  stepId: string(),
11020
11019
  entry: ModelCatalogEntrySchema
11021
11020
  });
11022
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11021
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11023
11022
  /**
11024
11023
  * Query filter for settings-store collections.
11025
11024
  */
@@ -11106,7 +11105,8 @@ method(object({
11106
11105
  }), _void(), { kind: "mutation" }), method(object({
11107
11106
  namespace: string().optional(),
11108
11107
  collection: string(),
11109
- filter: QueryFilterSchema.optional()
11108
+ filter: QueryFilterSchema.optional(),
11109
+ columns: array(string()).readonly().optional()
11110
11110
  }), array(SettingsRecordSchema).readonly()), method(object({
11111
11111
  namespace: string().optional(),
11112
11112
  collection: string(),
@@ -11169,46 +11169,87 @@ var EngineInfoSchema = object({
11169
11169
  kind: _enum(["relational", "vector"]),
11170
11170
  displayName: string()
11171
11171
  });
11172
- method(_void(), EngineInfoSchema), method(object({
11172
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11173
11173
  namespace: string().optional(),
11174
11174
  collection: string(),
11175
11175
  key: string()
11176
- }), unknown()), method(object({
11176
+ }), unknown(), { auth: "admin" }), method(object({
11177
11177
  namespace: string().optional(),
11178
11178
  collection: string(),
11179
11179
  key: string(),
11180
11180
  value: unknown()
11181
- }), _void(), { kind: "mutation" }), method(object({
11181
+ }), _void(), {
11182
+ kind: "mutation",
11183
+ auth: "admin"
11184
+ }), method(object({
11182
11185
  namespace: string().optional(),
11183
11186
  collection: string(),
11184
- filter: QueryFilterSchema.optional()
11185
- }), array(SettingsRecordSchema).readonly()), method(object({
11187
+ filter: QueryFilterSchema.optional(),
11188
+ /**
11189
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11190
+ *
11191
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11192
+ * was wrong — corrected 2026-08-26 after the hop map
11193
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11194
+ * There is **no Zod parse at all** between the door and the engine: the
11195
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11196
+ * field declared here reaches `SqliteSettingsBackend` either way.
11197
+ *
11198
+ * What actually lost `columns` was the THIRD declaration of this shape:
11199
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11200
+ * interface the engine destructures from. The field existed on both
11201
+ * schemas and the engine still never read it, because nothing checks a
11202
+ * registered provider against `InferProvider<cap>` —
11203
+ * `ProviderRegistration.provider` is typed `object`.
11204
+ *
11205
+ * It is declared here anyway, and must stay in step with
11206
+ * `settings-store.query`: a caller reading only the cap definitions has
11207
+ * to be able to see that this call carries a projection.
11208
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11209
+ */
11210
+ columns: array(string()).readonly().optional()
11211
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11186
11212
  namespace: string().optional(),
11187
11213
  collection: string(),
11188
11214
  record: SettingsRecordSchema
11189
- }), _void(), { kind: "mutation" }), method(object({
11215
+ }), _void(), {
11216
+ kind: "mutation",
11217
+ auth: "admin"
11218
+ }), method(object({
11190
11219
  namespace: string().optional(),
11191
11220
  collection: string(),
11192
11221
  id: string(),
11193
11222
  data: record(string(), unknown())
11194
- }), _void(), { kind: "mutation" }), method(object({
11223
+ }), _void(), {
11224
+ kind: "mutation",
11225
+ auth: "admin"
11226
+ }), method(object({
11195
11227
  namespace: string().optional(),
11196
11228
  collection: string(),
11197
11229
  key: string()
11198
- }), _void(), { kind: "mutation" }), method(object({
11230
+ }), _void(), {
11231
+ kind: "mutation",
11232
+ auth: "admin"
11233
+ }), method(object({
11199
11234
  namespace: string().optional(),
11200
11235
  collection: string(),
11201
11236
  filter: MutationFilterSchema
11202
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11237
+ }), object({ deleted: number().int() }), {
11238
+ kind: "mutation",
11239
+ auth: "admin"
11240
+ }), method(object({
11203
11241
  namespace: string().optional(),
11204
11242
  collection: string(),
11205
11243
  filter: MutationFilterSchema,
11206
11244
  data: record(string(), unknown())
11207
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11245
+ }), object({ updated: number().int() }), {
11246
+ kind: "mutation",
11247
+ auth: "admin"
11248
+ }), method(object({
11208
11249
  namespace: string().optional(),
11209
11250
  collection: string(),
11210
11251
  filter: QueryFilterSchema.optional()
11211
- }), number()), method(object({
11252
+ }), number(), { auth: "admin" }), method(object({
11212
11253
  namespace: string().optional(),
11213
11254
  collection: string(),
11214
11255
  field: string(),
@@ -11218,15 +11259,18 @@ method(_void(), EngineInfoSchema), method(object({
11218
11259
  }), array(object({
11219
11260
  bucket: number().int(),
11220
11261
  count: number().int()
11221
- })).readonly()), method(object({
11262
+ })).readonly(), { auth: "admin" }), method(object({
11222
11263
  namespace: string().optional(),
11223
11264
  collection: string()
11224
- }), boolean()), method(object({
11265
+ }), boolean(), { auth: "admin" }), method(object({
11225
11266
  namespace: string().optional(),
11226
11267
  collection: string(),
11227
11268
  columns: array(CollectionColumnSchema).readonly(),
11228
11269
  indexes: array(CollectionIndexSchema).readonly().optional()
11229
- }), _void(), { kind: "mutation" });
11270
+ }), _void(), {
11271
+ kind: "mutation",
11272
+ auth: "admin"
11273
+ });
11230
11274
  /**
11231
11275
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11232
11276
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12533,7 +12577,7 @@ method(object({
12533
12577
  crop: _instanceof(Uint8Array),
12534
12578
  width: number(),
12535
12579
  height: number()
12536
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12580
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12537
12581
  /**
12538
12582
  * filesystem-browse — per-node capability for browsing the node's local
12539
12583
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12826,19 +12870,22 @@ method(LlmGenerateBaseInputSchema.extend({
12826
12870
  runtime: ManagedRuntimeConfigSchema,
12827
12871
  /** The managed profile's timeout, threaded by the hub provider. */
12828
12872
  timeoutMs: number().int().positive().optional()
12829
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12873
+ }), LlmGenerateResultSchema, {
12874
+ kind: "mutation",
12875
+ auth: "admin"
12876
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12830
12877
  kind: "mutation",
12831
12878
  auth: "admin"
12832
12879
  }), method(object({}), _void(), {
12833
12880
  kind: "mutation",
12834
12881
  auth: "admin"
12835
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12882
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12836
12883
  kind: "mutation",
12837
12884
  auth: "admin"
12838
12885
  }), method(object({ file: string() }), _void(), {
12839
12886
  kind: "mutation",
12840
12887
  auth: "admin"
12841
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12888
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12842
12889
  /**
12843
12890
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12844
12891
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16349,7 +16396,7 @@ var OauthIntegrationDescriptorSchema = object({
16349
16396
  */
16350
16397
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16351
16398
  });
16352
- method(_void(), OauthIntegrationDescriptorSchema);
16399
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16353
16400
  /**
16354
16401
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16355
16402
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17544,6 +17591,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17544
17591
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17545
17592
  kind: "mutation",
17546
17593
  auth: "admin"
17594
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17595
+ kind: "mutation",
17596
+ auth: "admin"
17597
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17598
+ kind: "query",
17599
+ auth: "admin"
17600
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17601
+ kind: "mutation",
17602
+ auth: "admin"
17547
17603
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17548
17604
  kind: "query",
17549
17605
  auth: "admin"
@@ -17698,6 +17754,11 @@ object({
17698
17754
  "jpeg"
17699
17755
  ])
17700
17756
  });
17757
+ /**
17758
+ * Process-local frame identity. It is serializable so it can ride an in-process
17759
+ * capability call, but `registryId` deliberately prevents resolution in any
17760
+ * other process or execution group.
17761
+ */
17701
17762
  var FrameRefSchema = object({
17702
17763
  registryId: string().min(1),
17703
17764
  id: string().min(1),
@@ -20007,7 +20068,7 @@ method(object({
20007
20068
  * linking rather than produce an eternal token.
20008
20069
  */
20009
20070
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20010
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20071
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20011
20072
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20012
20073
  providerId: string().min(1),
20013
20074
  displayName: string().min(1),
@@ -20102,10 +20163,13 @@ var EvictResultSchema = object({
20102
20163
  /** True when the provider has nothing left it is willing to drop on this location. */
20103
20164
  exhausted: boolean()
20104
20165
  });
20105
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20166
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20106
20167
  locationId: string(),
20107
20168
  targetBytes: number().int().positive()
20108
- }), EvictResultSchema, { kind: "mutation" });
20169
+ }), EvictResultSchema, {
20170
+ kind: "mutation",
20171
+ auth: "admin"
20172
+ });
20109
20173
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20110
20174
  kind: "mutation",
20111
20175
  auth: "admin"
@@ -20165,26 +20229,50 @@ var ReadChunkInputSchema = object({
20165
20229
  length: number()
20166
20230
  });
20167
20231
  var EndDownloadInputSchema = object({ downloadId: string() });
20168
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20232
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20169
20233
  location: StorageLocationSchema,
20170
20234
  relativePath: string()
20171
- }), string()), method(object({
20235
+ }), string(), { auth: "admin" }), method(object({
20172
20236
  location: StorageLocationSchema,
20173
20237
  relativePath: string(),
20174
20238
  data: _instanceof(Uint8Array)
20175
- }), _void(), { kind: "mutation" }), method(object({
20239
+ }), _void(), {
20240
+ kind: "mutation",
20241
+ auth: "admin"
20242
+ }), method(object({
20176
20243
  location: StorageLocationSchema,
20177
20244
  relativePath: string()
20178
- }), _instanceof(Uint8Array)), method(object({
20245
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20179
20246
  location: StorageLocationSchema,
20180
20247
  relativePath: string()
20181
- }), boolean()), method(object({
20248
+ }), boolean(), { auth: "admin" }), method(object({
20182
20249
  location: StorageLocationSchema,
20183
20250
  prefix: string().optional()
20184
- }), array(string()).readonly()), method(object({
20251
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20185
20252
  location: StorageLocationSchema,
20186
20253
  relativePath: string()
20187
- }), _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" });
20254
+ }), _void(), {
20255
+ kind: "mutation",
20256
+ auth: "admin"
20257
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20258
+ kind: "mutation",
20259
+ auth: "admin"
20260
+ }), method(WriteChunkInputSchema, _void(), {
20261
+ kind: "mutation",
20262
+ auth: "admin"
20263
+ }), method(FinalizeUploadInputSchema, _void(), {
20264
+ kind: "mutation",
20265
+ auth: "admin"
20266
+ }), method(AbortUploadInputSchema, _void(), {
20267
+ kind: "mutation",
20268
+ auth: "admin"
20269
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20270
+ kind: "mutation",
20271
+ auth: "admin"
20272
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20273
+ kind: "mutation",
20274
+ auth: "admin"
20275
+ });
20188
20276
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20189
20277
  var ProfileSettingsSchemaBridge = unknown().nullable();
20190
20278
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20442,7 +20530,8 @@ method(object({
20442
20530
  access: "create"
20443
20531
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20444
20532
  kind: "mutation",
20445
- access: "view"
20533
+ access: "view",
20534
+ auth: "admin"
20446
20535
  }), method(object({
20447
20536
  /** Required — the user the assertion belongs to (verified). */
20448
20537
  userId: string(),
@@ -20450,10 +20539,12 @@ method(object({
20450
20539
  response: record(string(), unknown())
20451
20540
  }), object({ verified: boolean() }), {
20452
20541
  kind: "mutation",
20453
- access: "view"
20542
+ access: "view",
20543
+ auth: "admin"
20454
20544
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20455
20545
  kind: "mutation",
20456
- access: "view"
20546
+ access: "view",
20547
+ auth: "admin"
20457
20548
  }), method(object({
20458
20549
  /** AuthenticationResponseJSON from the browser. */
20459
20550
  response: record(string(), unknown()) }), object({
@@ -20461,7 +20552,8 @@ response: record(string(), unknown()) }), object({
20461
20552
  userId: string().nullable()
20462
20553
  }), {
20463
20554
  kind: "mutation",
20464
- access: "view"
20555
+ access: "view",
20556
+ auth: "admin"
20465
20557
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20466
20558
  userId: string(),
20467
20559
  credentialId: string()
@@ -20633,7 +20725,19 @@ var VectorStatsResultSchema = object({
20633
20725
  /** False when the backend ranks approximately. */
20634
20726
  exact: boolean()
20635
20727
  });
20636
- 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);
20728
+ method(VectorDeclareIndexInputSchema, _void(), {
20729
+ kind: "mutation",
20730
+ auth: "admin"
20731
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20732
+ kind: "mutation",
20733
+ auth: "admin"
20734
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20735
+ kind: "mutation",
20736
+ auth: "admin"
20737
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20738
+ kind: "mutation",
20739
+ auth: "admin"
20740
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20637
20741
  var ClipSchema = object({
20638
20742
  /** Opaque, provider-namespaced id. The default provider encodes the time
20639
20743
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23094,7 +23198,27 @@ var MediaFileLiteSchema$1 = object({
23094
23198
  sizeBytes: number(),
23095
23199
  timestamp: number()
23096
23200
  });
23097
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23201
+ method(object({
23202
+ /**
23203
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23204
+ *
23205
+ * Default `false`, the same inversion `listRecentFaces` and
23206
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23207
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23208
+ * on the live hub the same day: four identities cost 40,979 B with the
23209
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23210
+ * four times and the viewer holds at `staleTime: 30_000`.
23211
+ *
23212
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23213
+ * the `event-media` plane serves that key `immutable` with an ETag.
23214
+ *
23215
+ * **This is an INPUT field, so it does not reach the addon until the
23216
+ * next train** — the hub router validates cap inputs against its own
23217
+ * compiled Zod and strips a key it does not know. Until then the
23218
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23219
+ * is what ships, and the opt-in becomes reachable when the train lands.
23220
+ */
23221
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23098
23222
  kind: "mutation",
23099
23223
  auth: "admin"
23100
23224
  }), method(object({
@@ -25984,8 +26108,10 @@ var PlateInfoSchema = object({
25984
26108
  keyFrameMediaKey: string().optional(),
25985
26109
  base64: string().optional(),
25986
26110
  /**
25987
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25988
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26111
+ * Same crop as a data-plane URL, always present when the plate has a stored
26112
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26113
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26114
+ * left at its `true` default.
25989
26115
  */
25990
26116
  cropUrl: string().optional()
25991
26117
  });
@@ -26005,14 +26131,34 @@ var PlateClusterSchema = object({
26005
26131
  });
26006
26132
  method(object({
26007
26133
  deviceId: number().int().optional(),
26008
- limit: number().int().positive().optional()
26134
+ limit: number().int().positive().optional(),
26135
+ /**
26136
+ * Inline the base64 crop on every row. Default `true` — the existing
26137
+ * behaviour, kept so no caller breaks.
26138
+ *
26139
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26140
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26141
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26142
+ * metadata without them — and the browser then caches the images.
26143
+ *
26144
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26145
+ * plates were the one gallery list left without it.
26146
+ *
26147
+ * **This is an INPUT field, so it does not reach the addon until the
26148
+ * next train.** The hub router validates cap inputs against its own
26149
+ * compiled Zod and strips a key it does not know. Until the train
26150
+ * ships, sending `false` is harmless and keeps the crops inline.
26151
+ */
26152
+ includeCrops: boolean().optional()
26009
26153
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26010
26154
  deviceId: number().int(),
26011
26155
  trackId: string()
26012
26156
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26013
26157
  text: string().min(1),
26014
26158
  maxDistance: number().int().min(0).optional(),
26015
- limit: number().int().positive().optional()
26159
+ limit: number().int().positive().optional(),
26160
+ /** See `listPlates.includeCrops`. Default `true`. */
26161
+ includeCrops: boolean().optional()
26016
26162
  }), array(PlateInfoSchema).readonly()), method(object({
26017
26163
  maxDistance: number().int().min(0).optional(),
26018
26164
  minClusterSize: number().int().min(2).optional(),
@@ -26026,7 +26172,13 @@ method(object({
26026
26172
  }), method(object({ plateId: string() }), _void(), {
26027
26173
  kind: "mutation",
26028
26174
  auth: "admin"
26029
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26175
+ }), method(object({
26176
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26177
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26178
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26179
+ * INPUT field: stripped by the hub router until the train ships, which
26180
+ * resolves to `false` and is exactly the intended default. */
26181
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26030
26182
  kind: "mutation",
26031
26183
  auth: "admin"
26032
26184
  }), method(object({
@@ -33287,6 +33439,12 @@ Object.freeze({
33287
33439
  addonId: null,
33288
33440
  access: "create"
33289
33441
  },
33442
+ "pipelineAnalytics.cancelRelocateMedia": {
33443
+ capName: "pipeline-analytics",
33444
+ capScope: "device",
33445
+ addonId: null,
33446
+ access: "create"
33447
+ },
33290
33448
  "pipelineAnalytics.cancelStorageMigrationMove": {
33291
33449
  capName: "pipeline-analytics",
33292
33450
  capScope: "device",
@@ -33461,6 +33619,12 @@ Object.freeze({
33461
33619
  addonId: null,
33462
33620
  access: "view"
33463
33621
  },
33622
+ "pipelineAnalytics.listRelocateMediaJobs": {
33623
+ capName: "pipeline-analytics",
33624
+ capScope: "device",
33625
+ addonId: null,
33626
+ access: "view"
33627
+ },
33464
33628
  "pipelineAnalytics.listRetrainAnnotations": {
33465
33629
  capName: "pipeline-analytics",
33466
33630
  capScope: "device",
@@ -33539,6 +33703,12 @@ Object.freeze({
33539
33703
  addonId: null,
33540
33704
  access: "create"
33541
33705
  },
33706
+ "pipelineAnalytics.relocateMedia": {
33707
+ capName: "pipeline-analytics",
33708
+ capScope: "device",
33709
+ addonId: null,
33710
+ access: "create"
33711
+ },
33542
33712
  "pipelineAnalytics.restageRetrainTrack": {
33543
33713
  capName: "pipeline-analytics",
33544
33714
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6641,7 +6641,7 @@ function method(input, output, options) {
6641
6641
  input,
6642
6642
  output,
6643
6643
  kind: options?.kind ?? "query",
6644
- auth: options?.auth ?? "protected",
6644
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6645
6645
  ...options?.access !== void 0 ? { access: options.access } : {},
6646
6646
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6647
6647
  timeoutMs: options?.timeoutMs
@@ -6665,7 +6665,7 @@ function event(data) {
6665
6665
  }
6666
6666
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6667
6667
  var VersionOutputSchema$1 = object({ version: string() });
6668
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6668
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6669
6669
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6670
6670
  DeviceType["Camera"] = "camera";
6671
6671
  DeviceType["Hub"] = "hub";
@@ -6986,7 +6986,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6986
6986
  }({});
6987
6987
  var StaticDirOutputSchema = object({ staticDir: string() });
6988
6988
  var VersionOutputSchema = object({ version: string() });
6989
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6989
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6990
6990
  /**
6991
6991
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6992
6992
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7612,24 +7612,6 @@ var RecordingRetentionSchema = object({
7612
7612
  maxSizeGb: number().min(0).optional()
7613
7613
  });
7614
7614
  /**
7615
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7616
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7617
- * previews at. Five graduated steps; absent on a config = `standard` (the
7618
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7619
- *
7620
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7621
- * Each window's index sidecar carries its own tile dims, so a camera whose
7622
- * preset changed over time renders every historical window at the dims it was
7623
- * written with.
7624
- */
7625
- var ScrubThumbnailPresetSchema = _enum([
7626
- "minimal",
7627
- "low",
7628
- "standard",
7629
- "high",
7630
- "max"
7631
- ]);
7632
- /**
7633
7615
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7634
7616
  *
7635
7617
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7637,7 +7619,11 @@ var ScrubThumbnailPresetSchema = _enum([
7637
7619
  * other field is a storage knob (profiles, segment length, retention, scrub).
7638
7620
  *
7639
7621
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7640
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7622
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7623
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7624
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7625
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7626
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7641
7627
  * A stale caller must fail loudly — silently stripping its legacy intent would
7642
7628
  * persist a band-less config, i.e. silently stop recording the camera.
7643
7629
  */
@@ -7660,14 +7646,7 @@ var RecordingConfigSchema = object({
7660
7646
  * "off" is the absence of a covering band, never a band value.
7661
7647
  */
7662
7648
  bands: array(RecordingBandSchema).default([]),
7663
- retention: RecordingRetentionSchema.optional(),
7664
- /**
7665
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7666
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7667
- * windows only — existing sheets are immutable, and each window's index
7668
- * carries its own tile dims so mixed-preset history renders correctly.
7669
- */
7670
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7649
+ retention: RecordingRetentionSchema.optional()
7671
7650
  }).strict();
7672
7651
  /**
7673
7652
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7743,10 +7722,11 @@ var RelocateFootageInputSchema = object({
7743
7722
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7744
7723
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7745
7724
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7746
- var StorageMigrationMediaMoveInputSchema = object({
7725
+ var RelocateMediaInputSchema = object({
7747
7726
  toLocationId: string(),
7748
7727
  throttleMbps: number().min(1).max(1e3).optional()
7749
- }).extend({ leaseId: string().min(1) });
7728
+ });
7729
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7750
7730
  /** The independently selectable logical storage classes. `recordings`
7751
7731
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7752
7732
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8041,7 +8021,26 @@ var LabelDefinitionSchema = object({
8041
8021
  description: string().optional(),
8042
8022
  icon: string().optional()
8043
8023
  });
8044
- var ClassMapDefinitionSchema = object({
8024
+ /**
8025
+ * Wire schema for a per-model CATALOG classMap override
8026
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8027
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8028
+ * detection pipeline executor actually routes.
8029
+ *
8030
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8031
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8032
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8033
+ * enum) — the two used to share the name `ClassMapDefinition`/
8034
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8035
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8036
+ * are not: it is two different concepts colliding on a name. Keep this type
8037
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8038
+ * would either narrow every `ClassMapDefinition` consumer to the four
8039
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8040
+ * schema exists for (see the "rejects a classMap whose target is not a
8041
+ * detection macro" test in `model-catalog-schema.test.ts`).
8042
+ */
8043
+ var DetectionCatalogClassMapSchema = object({
8045
8044
  mapping: record(string(), _enum([
8046
8045
  "person",
8047
8046
  "vehicle",
@@ -8246,7 +8245,7 @@ var ModelCatalogEntrySchema = object({
8246
8245
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8247
8246
  * labels already ARE the CamStack macros (Scrypted identity map).
8248
8247
  */
8249
- classMap: ClassMapDefinitionSchema.optional()
8248
+ classMap: DetectionCatalogClassMapSchema.optional()
8250
8249
  });
8251
8250
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8252
8251
  format: literal("openvino"),
@@ -8276,7 +8275,7 @@ var ModelConvertMetadataSchema = object({
8276
8275
  "segmentation"
8277
8276
  ]),
8278
8277
  faceAlignment: boolean().optional(),
8279
- classMap: ClassMapDefinitionSchema.optional()
8278
+ classMap: DetectionCatalogClassMapSchema.optional()
8280
8279
  });
8281
8280
  var ConvertResultSchema = object({
8282
8281
  entry: ModelCatalogEntrySchema,
@@ -9139,7 +9138,7 @@ var AddonPageDeclarationSchema = object({
9139
9138
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9140
9139
  sectionLabel: string().optional()
9141
9140
  });
9142
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9141
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9143
9142
  var AddonHttpRouteSchema = object({
9144
9143
  method: _enum([
9145
9144
  "GET",
@@ -9374,7 +9373,7 @@ var WidgetMetadataSchema = object({
9374
9373
  defaultColumns: number().int().min(1).max(12).default(6),
9375
9374
  defaultRows: number().int().min(1).max(12).default(1)
9376
9375
  });
9377
- method(_void(), array(WidgetMetadataSchema).readonly());
9376
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9378
9377
  /**
9379
9378
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9380
9379
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10998,7 +10997,7 @@ var CustomModelDescriptorSchema = object({
10998
10997
  stepId: string(),
10999
10998
  entry: ModelCatalogEntrySchema
11000
10999
  });
11001
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11000
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11002
11001
  /**
11003
11002
  * Query filter for settings-store collections.
11004
11003
  */
@@ -11085,7 +11084,8 @@ method(object({
11085
11084
  }), _void(), { kind: "mutation" }), method(object({
11086
11085
  namespace: string().optional(),
11087
11086
  collection: string(),
11088
- filter: QueryFilterSchema.optional()
11087
+ filter: QueryFilterSchema.optional(),
11088
+ columns: array(string()).readonly().optional()
11089
11089
  }), array(SettingsRecordSchema).readonly()), method(object({
11090
11090
  namespace: string().optional(),
11091
11091
  collection: string(),
@@ -11148,46 +11148,87 @@ var EngineInfoSchema = object({
11148
11148
  kind: _enum(["relational", "vector"]),
11149
11149
  displayName: string()
11150
11150
  });
11151
- method(_void(), EngineInfoSchema), method(object({
11151
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11152
11152
  namespace: string().optional(),
11153
11153
  collection: string(),
11154
11154
  key: string()
11155
- }), unknown()), method(object({
11155
+ }), unknown(), { auth: "admin" }), method(object({
11156
11156
  namespace: string().optional(),
11157
11157
  collection: string(),
11158
11158
  key: string(),
11159
11159
  value: unknown()
11160
- }), _void(), { kind: "mutation" }), method(object({
11160
+ }), _void(), {
11161
+ kind: "mutation",
11162
+ auth: "admin"
11163
+ }), method(object({
11161
11164
  namespace: string().optional(),
11162
11165
  collection: string(),
11163
- filter: QueryFilterSchema.optional()
11164
- }), array(SettingsRecordSchema).readonly()), method(object({
11166
+ filter: QueryFilterSchema.optional(),
11167
+ /**
11168
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11169
+ *
11170
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11171
+ * was wrong — corrected 2026-08-26 after the hop map
11172
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11173
+ * There is **no Zod parse at all** between the door and the engine: the
11174
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11175
+ * field declared here reaches `SqliteSettingsBackend` either way.
11176
+ *
11177
+ * What actually lost `columns` was the THIRD declaration of this shape:
11178
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11179
+ * interface the engine destructures from. The field existed on both
11180
+ * schemas and the engine still never read it, because nothing checks a
11181
+ * registered provider against `InferProvider<cap>` —
11182
+ * `ProviderRegistration.provider` is typed `object`.
11183
+ *
11184
+ * It is declared here anyway, and must stay in step with
11185
+ * `settings-store.query`: a caller reading only the cap definitions has
11186
+ * to be able to see that this call carries a projection.
11187
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11188
+ */
11189
+ columns: array(string()).readonly().optional()
11190
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11165
11191
  namespace: string().optional(),
11166
11192
  collection: string(),
11167
11193
  record: SettingsRecordSchema
11168
- }), _void(), { kind: "mutation" }), method(object({
11194
+ }), _void(), {
11195
+ kind: "mutation",
11196
+ auth: "admin"
11197
+ }), method(object({
11169
11198
  namespace: string().optional(),
11170
11199
  collection: string(),
11171
11200
  id: string(),
11172
11201
  data: record(string(), unknown())
11173
- }), _void(), { kind: "mutation" }), method(object({
11202
+ }), _void(), {
11203
+ kind: "mutation",
11204
+ auth: "admin"
11205
+ }), method(object({
11174
11206
  namespace: string().optional(),
11175
11207
  collection: string(),
11176
11208
  key: string()
11177
- }), _void(), { kind: "mutation" }), method(object({
11209
+ }), _void(), {
11210
+ kind: "mutation",
11211
+ auth: "admin"
11212
+ }), method(object({
11178
11213
  namespace: string().optional(),
11179
11214
  collection: string(),
11180
11215
  filter: MutationFilterSchema
11181
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11216
+ }), object({ deleted: number().int() }), {
11217
+ kind: "mutation",
11218
+ auth: "admin"
11219
+ }), method(object({
11182
11220
  namespace: string().optional(),
11183
11221
  collection: string(),
11184
11222
  filter: MutationFilterSchema,
11185
11223
  data: record(string(), unknown())
11186
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11224
+ }), object({ updated: number().int() }), {
11225
+ kind: "mutation",
11226
+ auth: "admin"
11227
+ }), method(object({
11187
11228
  namespace: string().optional(),
11188
11229
  collection: string(),
11189
11230
  filter: QueryFilterSchema.optional()
11190
- }), number()), method(object({
11231
+ }), number(), { auth: "admin" }), method(object({
11191
11232
  namespace: string().optional(),
11192
11233
  collection: string(),
11193
11234
  field: string(),
@@ -11197,15 +11238,18 @@ method(_void(), EngineInfoSchema), method(object({
11197
11238
  }), array(object({
11198
11239
  bucket: number().int(),
11199
11240
  count: number().int()
11200
- })).readonly()), method(object({
11241
+ })).readonly(), { auth: "admin" }), method(object({
11201
11242
  namespace: string().optional(),
11202
11243
  collection: string()
11203
- }), boolean()), method(object({
11244
+ }), boolean(), { auth: "admin" }), method(object({
11204
11245
  namespace: string().optional(),
11205
11246
  collection: string(),
11206
11247
  columns: array(CollectionColumnSchema).readonly(),
11207
11248
  indexes: array(CollectionIndexSchema).readonly().optional()
11208
- }), _void(), { kind: "mutation" });
11249
+ }), _void(), {
11250
+ kind: "mutation",
11251
+ auth: "admin"
11252
+ });
11209
11253
  /**
11210
11254
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11211
11255
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12512,7 +12556,7 @@ method(object({
12512
12556
  crop: _instanceof(Uint8Array),
12513
12557
  width: number(),
12514
12558
  height: number()
12515
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12559
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12516
12560
  /**
12517
12561
  * filesystem-browse — per-node capability for browsing the node's local
12518
12562
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12805,19 +12849,22 @@ method(LlmGenerateBaseInputSchema.extend({
12805
12849
  runtime: ManagedRuntimeConfigSchema,
12806
12850
  /** The managed profile's timeout, threaded by the hub provider. */
12807
12851
  timeoutMs: number().int().positive().optional()
12808
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12852
+ }), LlmGenerateResultSchema, {
12853
+ kind: "mutation",
12854
+ auth: "admin"
12855
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12809
12856
  kind: "mutation",
12810
12857
  auth: "admin"
12811
12858
  }), method(object({}), _void(), {
12812
12859
  kind: "mutation",
12813
12860
  auth: "admin"
12814
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12861
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12815
12862
  kind: "mutation",
12816
12863
  auth: "admin"
12817
12864
  }), method(object({ file: string() }), _void(), {
12818
12865
  kind: "mutation",
12819
12866
  auth: "admin"
12820
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12867
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12821
12868
  /**
12822
12869
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12823
12870
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16328,7 +16375,7 @@ var OauthIntegrationDescriptorSchema = object({
16328
16375
  */
16329
16376
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16330
16377
  });
16331
- method(_void(), OauthIntegrationDescriptorSchema);
16378
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16332
16379
  /**
16333
16380
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16334
16381
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17523,6 +17570,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17523
17570
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17524
17571
  kind: "mutation",
17525
17572
  auth: "admin"
17573
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17574
+ kind: "mutation",
17575
+ auth: "admin"
17576
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17577
+ kind: "query",
17578
+ auth: "admin"
17579
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17580
+ kind: "mutation",
17581
+ auth: "admin"
17526
17582
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17527
17583
  kind: "query",
17528
17584
  auth: "admin"
@@ -17677,6 +17733,11 @@ object({
17677
17733
  "jpeg"
17678
17734
  ])
17679
17735
  });
17736
+ /**
17737
+ * Process-local frame identity. It is serializable so it can ride an in-process
17738
+ * capability call, but `registryId` deliberately prevents resolution in any
17739
+ * other process or execution group.
17740
+ */
17680
17741
  var FrameRefSchema = object({
17681
17742
  registryId: string().min(1),
17682
17743
  id: string().min(1),
@@ -19986,7 +20047,7 @@ method(object({
19986
20047
  * linking rather than produce an eternal token.
19987
20048
  */
19988
20049
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19989
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20050
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19990
20051
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19991
20052
  providerId: string().min(1),
19992
20053
  displayName: string().min(1),
@@ -20081,10 +20142,13 @@ var EvictResultSchema = object({
20081
20142
  /** True when the provider has nothing left it is willing to drop on this location. */
20082
20143
  exhausted: boolean()
20083
20144
  });
20084
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20145
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20085
20146
  locationId: string(),
20086
20147
  targetBytes: number().int().positive()
20087
- }), EvictResultSchema, { kind: "mutation" });
20148
+ }), EvictResultSchema, {
20149
+ kind: "mutation",
20150
+ auth: "admin"
20151
+ });
20088
20152
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20089
20153
  kind: "mutation",
20090
20154
  auth: "admin"
@@ -20144,26 +20208,50 @@ var ReadChunkInputSchema = object({
20144
20208
  length: number()
20145
20209
  });
20146
20210
  var EndDownloadInputSchema = object({ downloadId: string() });
20147
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20211
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20148
20212
  location: StorageLocationSchema,
20149
20213
  relativePath: string()
20150
- }), string()), method(object({
20214
+ }), string(), { auth: "admin" }), method(object({
20151
20215
  location: StorageLocationSchema,
20152
20216
  relativePath: string(),
20153
20217
  data: _instanceof(Uint8Array)
20154
- }), _void(), { kind: "mutation" }), method(object({
20218
+ }), _void(), {
20219
+ kind: "mutation",
20220
+ auth: "admin"
20221
+ }), method(object({
20155
20222
  location: StorageLocationSchema,
20156
20223
  relativePath: string()
20157
- }), _instanceof(Uint8Array)), method(object({
20224
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20158
20225
  location: StorageLocationSchema,
20159
20226
  relativePath: string()
20160
- }), boolean()), method(object({
20227
+ }), boolean(), { auth: "admin" }), method(object({
20161
20228
  location: StorageLocationSchema,
20162
20229
  prefix: string().optional()
20163
- }), array(string()).readonly()), method(object({
20230
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20164
20231
  location: StorageLocationSchema,
20165
20232
  relativePath: string()
20166
- }), _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" });
20233
+ }), _void(), {
20234
+ kind: "mutation",
20235
+ auth: "admin"
20236
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20237
+ kind: "mutation",
20238
+ auth: "admin"
20239
+ }), method(WriteChunkInputSchema, _void(), {
20240
+ kind: "mutation",
20241
+ auth: "admin"
20242
+ }), method(FinalizeUploadInputSchema, _void(), {
20243
+ kind: "mutation",
20244
+ auth: "admin"
20245
+ }), method(AbortUploadInputSchema, _void(), {
20246
+ kind: "mutation",
20247
+ auth: "admin"
20248
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20249
+ kind: "mutation",
20250
+ auth: "admin"
20251
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20252
+ kind: "mutation",
20253
+ auth: "admin"
20254
+ });
20167
20255
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20168
20256
  var ProfileSettingsSchemaBridge = unknown().nullable();
20169
20257
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20421,7 +20509,8 @@ method(object({
20421
20509
  access: "create"
20422
20510
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20423
20511
  kind: "mutation",
20424
- access: "view"
20512
+ access: "view",
20513
+ auth: "admin"
20425
20514
  }), method(object({
20426
20515
  /** Required — the user the assertion belongs to (verified). */
20427
20516
  userId: string(),
@@ -20429,10 +20518,12 @@ method(object({
20429
20518
  response: record(string(), unknown())
20430
20519
  }), object({ verified: boolean() }), {
20431
20520
  kind: "mutation",
20432
- access: "view"
20521
+ access: "view",
20522
+ auth: "admin"
20433
20523
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20434
20524
  kind: "mutation",
20435
- access: "view"
20525
+ access: "view",
20526
+ auth: "admin"
20436
20527
  }), method(object({
20437
20528
  /** AuthenticationResponseJSON from the browser. */
20438
20529
  response: record(string(), unknown()) }), object({
@@ -20440,7 +20531,8 @@ response: record(string(), unknown()) }), object({
20440
20531
  userId: string().nullable()
20441
20532
  }), {
20442
20533
  kind: "mutation",
20443
- access: "view"
20534
+ access: "view",
20535
+ auth: "admin"
20444
20536
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20445
20537
  userId: string(),
20446
20538
  credentialId: string()
@@ -20612,7 +20704,19 @@ var VectorStatsResultSchema = object({
20612
20704
  /** False when the backend ranks approximately. */
20613
20705
  exact: boolean()
20614
20706
  });
20615
- 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);
20707
+ method(VectorDeclareIndexInputSchema, _void(), {
20708
+ kind: "mutation",
20709
+ auth: "admin"
20710
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20711
+ kind: "mutation",
20712
+ auth: "admin"
20713
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20714
+ kind: "mutation",
20715
+ auth: "admin"
20716
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20717
+ kind: "mutation",
20718
+ auth: "admin"
20719
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20616
20720
  var ClipSchema = object({
20617
20721
  /** Opaque, provider-namespaced id. The default provider encodes the time
20618
20722
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23073,7 +23177,27 @@ var MediaFileLiteSchema$1 = object({
23073
23177
  sizeBytes: number(),
23074
23178
  timestamp: number()
23075
23179
  });
23076
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23180
+ method(object({
23181
+ /**
23182
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23183
+ *
23184
+ * Default `false`, the same inversion `listRecentFaces` and
23185
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23186
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23187
+ * on the live hub the same day: four identities cost 40,979 B with the
23188
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23189
+ * four times and the viewer holds at `staleTime: 30_000`.
23190
+ *
23191
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23192
+ * the `event-media` plane serves that key `immutable` with an ETag.
23193
+ *
23194
+ * **This is an INPUT field, so it does not reach the addon until the
23195
+ * next train** — the hub router validates cap inputs against its own
23196
+ * compiled Zod and strips a key it does not know. Until then the
23197
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23198
+ * is what ships, and the opt-in becomes reachable when the train lands.
23199
+ */
23200
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23077
23201
  kind: "mutation",
23078
23202
  auth: "admin"
23079
23203
  }), method(object({
@@ -25963,8 +26087,10 @@ var PlateInfoSchema = object({
25963
26087
  keyFrameMediaKey: string().optional(),
25964
26088
  base64: string().optional(),
25965
26089
  /**
25966
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
25967
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26090
+ * Same crop as a data-plane URL, always present when the plate has a stored
26091
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26092
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26093
+ * left at its `true` default.
25968
26094
  */
25969
26095
  cropUrl: string().optional()
25970
26096
  });
@@ -25984,14 +26110,34 @@ var PlateClusterSchema = object({
25984
26110
  });
25985
26111
  method(object({
25986
26112
  deviceId: number().int().optional(),
25987
- limit: number().int().positive().optional()
26113
+ limit: number().int().positive().optional(),
26114
+ /**
26115
+ * Inline the base64 crop on every row. Default `true` — the existing
26116
+ * behaviour, kept so no caller breaks.
26117
+ *
26118
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26119
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26120
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26121
+ * metadata without them — and the browser then caches the images.
26122
+ *
26123
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26124
+ * plates were the one gallery list left without it.
26125
+ *
26126
+ * **This is an INPUT field, so it does not reach the addon until the
26127
+ * next train.** The hub router validates cap inputs against its own
26128
+ * compiled Zod and strips a key it does not know. Until the train
26129
+ * ships, sending `false` is harmless and keeps the crops inline.
26130
+ */
26131
+ includeCrops: boolean().optional()
25988
26132
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
25989
26133
  deviceId: number().int(),
25990
26134
  trackId: string()
25991
26135
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
25992
26136
  text: string().min(1),
25993
26137
  maxDistance: number().int().min(0).optional(),
25994
- limit: number().int().positive().optional()
26138
+ limit: number().int().positive().optional(),
26139
+ /** See `listPlates.includeCrops`. Default `true`. */
26140
+ includeCrops: boolean().optional()
25995
26141
  }), array(PlateInfoSchema).readonly()), method(object({
25996
26142
  maxDistance: number().int().min(0).optional(),
25997
26143
  minClusterSize: number().int().min(2).optional(),
@@ -26005,7 +26151,13 @@ method(object({
26005
26151
  }), method(object({ plateId: string() }), _void(), {
26006
26152
  kind: "mutation",
26007
26153
  auth: "admin"
26008
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26154
+ }), method(object({
26155
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26156
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26157
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26158
+ * INPUT field: stripped by the hub router until the train ships, which
26159
+ * resolves to `false` and is exactly the intended default. */
26160
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26009
26161
  kind: "mutation",
26010
26162
  auth: "admin"
26011
26163
  }), method(object({
@@ -33266,6 +33418,12 @@ Object.freeze({
33266
33418
  addonId: null,
33267
33419
  access: "create"
33268
33420
  },
33421
+ "pipelineAnalytics.cancelRelocateMedia": {
33422
+ capName: "pipeline-analytics",
33423
+ capScope: "device",
33424
+ addonId: null,
33425
+ access: "create"
33426
+ },
33269
33427
  "pipelineAnalytics.cancelStorageMigrationMove": {
33270
33428
  capName: "pipeline-analytics",
33271
33429
  capScope: "device",
@@ -33440,6 +33598,12 @@ Object.freeze({
33440
33598
  addonId: null,
33441
33599
  access: "view"
33442
33600
  },
33601
+ "pipelineAnalytics.listRelocateMediaJobs": {
33602
+ capName: "pipeline-analytics",
33603
+ capScope: "device",
33604
+ addonId: null,
33605
+ access: "view"
33606
+ },
33443
33607
  "pipelineAnalytics.listRetrainAnnotations": {
33444
33608
  capName: "pipeline-analytics",
33445
33609
  capScope: "device",
@@ -33518,6 +33682,12 @@ Object.freeze({
33518
33682
  addonId: null,
33519
33683
  access: "create"
33520
33684
  },
33685
+ "pipelineAnalytics.relocateMedia": {
33686
+ capName: "pipeline-analytics",
33687
+ capScope: "device",
33688
+ addonId: null,
33689
+ access: "create"
33690
+ },
33521
33691
  "pipelineAnalytics.restageRetrainTrack": {
33522
33692
  capName: "pipeline-analytics",
33523
33693
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.32",
3
+ "version": "0.2.33",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",