@camstack/addon-provider-homeassistant 1.2.41 → 1.2.42

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.
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-t-5RdKBJ.js");
2
+ const require_dist = require("./dist-Cef7D9kq.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-device-source.ts
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as pressureSensorCapability, A as coverCapability, B as imageCapability, C as buttonCapability, Ct as record, D as connectivityCapability, Dt as url, E as colorCapability, Et as unknown, F as fanControlCapability, G as normalizeUnit, H as lockControlCapability, I as floodCapability, J as numericSensorCapability, K as notificationOutputCapability, L as gasCapability, N as enumSensorCapability, O as contactCapability, Ot as EventCategory, P as eventEmitterCapability, Q as presenceCapability, R as humidifierCapability, S as buildAddonRouteProvider, St as object, T as climateControlCapability, Tt as union, U as mediaPlayerCapability, V as lawnMowerControlCapability, W as motionCapability, X as powerMeterCapability, Z as prepareNotification, _ as batteryCapability, _t as _enum, at as updateCapability, b as brightnessCapability, bt as literal, ct as vibrationCapability, d as accessoriesCapability, dt as errMsg, et as scriptRunnerCapability, f as addonRoutesCapability, g as automationControlCapability, gt as createEvent, h as ambientLightSensorCapability, ht as DeviceType, it as temperatureSensorCapability, j as deviceAdoptionCapability, k as controlCapability, lt as waterHeaterCapability, m as alarmPanelCapability, mt as DeviceRole, n as BaseDevice, nt as switchCapability, o as EnumSensorDateTimeFormatSchema, ot as vacuumControlCapability, p as airQualitySensorCapability, pt as DeviceFeature, q as notifierCapability, r as BaseDeviceProvider, rt as tamperCapability, st as valveCapability, tt as smokeCapability, u as TargetSchema, ut as weatherCapability, v as bestLocationMatch, vt as array, w as carbonMonoxideCapability, wt as string, x as brokerCapability, xt as number, y as binaryCapability, yt as discriminatedUnion, z as humiditySensorCapability } from "./dist-D1G6jUej.mjs";
1
+ import { $ as pressureSensorCapability, A as coverCapability, B as imageCapability, C as buttonCapability, Ct as record, D as connectivityCapability, Dt as url, E as colorCapability, Et as unknown, F as fanControlCapability, G as normalizeUnit, H as lockControlCapability, I as floodCapability, J as numericSensorCapability, K as notificationOutputCapability, L as gasCapability, N as enumSensorCapability, O as contactCapability, Ot as EventCategory, P as eventEmitterCapability, Q as presenceCapability, R as humidifierCapability, S as buildAddonRouteProvider, St as object, T as climateControlCapability, Tt as union, U as mediaPlayerCapability, V as lawnMowerControlCapability, W as motionCapability, X as powerMeterCapability, Z as prepareNotification, _ as batteryCapability, _t as _enum, at as updateCapability, b as brightnessCapability, bt as literal, ct as vibrationCapability, d as accessoriesCapability, dt as errMsg, et as scriptRunnerCapability, f as addonRoutesCapability, g as automationControlCapability, gt as createEvent, h as ambientLightSensorCapability, ht as DeviceType, it as temperatureSensorCapability, j as deviceAdoptionCapability, k as controlCapability, lt as waterHeaterCapability, m as alarmPanelCapability, mt as DeviceRole, n as BaseDevice, nt as switchCapability, o as EnumSensorDateTimeFormatSchema, ot as vacuumControlCapability, p as airQualitySensorCapability, pt as DeviceFeature, q as notifierCapability, r as BaseDeviceProvider, rt as tamperCapability, st as valveCapability, tt as smokeCapability, u as TargetSchema, ut as weatherCapability, v as bestLocationMatch, vt as array, w as carbonMonoxideCapability, wt as string, x as brokerCapability, xt as number, y as binaryCapability, yt as discriminatedUnion, z as humiditySensorCapability } from "./dist-DolpU5X1.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-device-source.ts
@@ -6629,7 +6629,7 @@ function method(input, output, options) {
6629
6629
  input,
6630
6630
  output,
6631
6631
  kind: options?.kind ?? "query",
6632
- auth: options?.auth ?? "protected",
6632
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6633
6633
  ...options?.access !== void 0 ? { access: options.access } : {},
6634
6634
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6635
6635
  timeoutMs: options?.timeoutMs
@@ -6653,7 +6653,7 @@ function event(data) {
6653
6653
  }
6654
6654
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6655
6655
  var VersionOutputSchema$1 = object({ version: string() });
6656
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6656
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6657
6657
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6658
6658
  DeviceType["Camera"] = "camera";
6659
6659
  DeviceType["Hub"] = "hub";
@@ -6974,7 +6974,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6974
6974
  }({});
6975
6975
  var StaticDirOutputSchema = object({ staticDir: string() });
6976
6976
  var VersionOutputSchema = object({ version: string() });
6977
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6977
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6978
6978
  /**
6979
6979
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6980
6980
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7719,24 +7719,6 @@ var RecordingRetentionSchema = object({
7719
7719
  maxSizeGb: number().min(0).optional()
7720
7720
  });
7721
7721
  /**
7722
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7723
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7724
- * previews at. Five graduated steps; absent on a config = `standard` (the
7725
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7726
- *
7727
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7728
- * Each window's index sidecar carries its own tile dims, so a camera whose
7729
- * preset changed over time renders every historical window at the dims it was
7730
- * written with.
7731
- */
7732
- var ScrubThumbnailPresetSchema = _enum([
7733
- "minimal",
7734
- "low",
7735
- "standard",
7736
- "high",
7737
- "max"
7738
- ]);
7739
- /**
7740
7722
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7741
7723
  *
7742
7724
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7744,7 +7726,11 @@ var ScrubThumbnailPresetSchema = _enum([
7744
7726
  * other field is a storage knob (profiles, segment length, retention, scrub).
7745
7727
  *
7746
7728
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7747
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7729
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7730
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7731
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7732
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7733
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7748
7734
  * A stale caller must fail loudly — silently stripping its legacy intent would
7749
7735
  * persist a band-less config, i.e. silently stop recording the camera.
7750
7736
  */
@@ -7767,14 +7753,7 @@ var RecordingConfigSchema = object({
7767
7753
  * "off" is the absence of a covering band, never a band value.
7768
7754
  */
7769
7755
  bands: array(RecordingBandSchema).default([]),
7770
- retention: RecordingRetentionSchema.optional(),
7771
- /**
7772
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7773
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7774
- * windows only — existing sheets are immutable, and each window's index
7775
- * carries its own tile dims so mixed-preset history renders correctly.
7776
- */
7777
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7756
+ retention: RecordingRetentionSchema.optional()
7778
7757
  }).strict();
7779
7758
  /**
7780
7759
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7850,10 +7829,11 @@ var RelocateFootageInputSchema = object({
7850
7829
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7851
7830
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7852
7831
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7853
- var StorageMigrationMediaMoveInputSchema = object({
7832
+ var RelocateMediaInputSchema = object({
7854
7833
  toLocationId: string(),
7855
7834
  throttleMbps: number().min(1).max(1e3).optional()
7856
- }).extend({ leaseId: string().min(1) });
7835
+ });
7836
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7857
7837
  /** The independently selectable logical storage classes. `recordings`
7858
7838
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7859
7839
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8148,7 +8128,26 @@ var LabelDefinitionSchema = object({
8148
8128
  description: string().optional(),
8149
8129
  icon: string().optional()
8150
8130
  });
8151
- var ClassMapDefinitionSchema = object({
8131
+ /**
8132
+ * Wire schema for a per-model CATALOG classMap override
8133
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8134
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8135
+ * detection pipeline executor actually routes.
8136
+ *
8137
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8138
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8139
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8140
+ * enum) — the two used to share the name `ClassMapDefinition`/
8141
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8142
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8143
+ * are not: it is two different concepts colliding on a name. Keep this type
8144
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8145
+ * would either narrow every `ClassMapDefinition` consumer to the four
8146
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8147
+ * schema exists for (see the "rejects a classMap whose target is not a
8148
+ * detection macro" test in `model-catalog-schema.test.ts`).
8149
+ */
8150
+ var DetectionCatalogClassMapSchema = object({
8152
8151
  mapping: record(string(), _enum([
8153
8152
  "person",
8154
8153
  "vehicle",
@@ -8353,7 +8352,7 @@ var ModelCatalogEntrySchema = object({
8353
8352
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8354
8353
  * labels already ARE the CamStack macros (Scrypted identity map).
8355
8354
  */
8356
- classMap: ClassMapDefinitionSchema.optional()
8355
+ classMap: DetectionCatalogClassMapSchema.optional()
8357
8356
  });
8358
8357
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8359
8358
  format: literal("openvino"),
@@ -8383,7 +8382,7 @@ var ModelConvertMetadataSchema = object({
8383
8382
  "segmentation"
8384
8383
  ]),
8385
8384
  faceAlignment: boolean().optional(),
8386
- classMap: ClassMapDefinitionSchema.optional()
8385
+ classMap: DetectionCatalogClassMapSchema.optional()
8387
8386
  });
8388
8387
  var ConvertResultSchema = object({
8389
8388
  entry: ModelCatalogEntrySchema,
@@ -9246,7 +9245,7 @@ var AddonPageDeclarationSchema = object({
9246
9245
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9247
9246
  sectionLabel: string().optional()
9248
9247
  });
9249
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9248
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9250
9249
  var AddonHttpRouteSchema = object({
9251
9250
  method: _enum([
9252
9251
  "GET",
@@ -9500,7 +9499,7 @@ var WidgetMetadataSchema = object({
9500
9499
  defaultColumns: number().int().min(1).max(12).default(6),
9501
9500
  defaultRows: number().int().min(1).max(12).default(1)
9502
9501
  });
9503
- method(_void(), array(WidgetMetadataSchema).readonly());
9502
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9504
9503
  /**
9505
9504
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9506
9505
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11173,7 +11172,7 @@ var CustomModelDescriptorSchema = object({
11173
11172
  stepId: string(),
11174
11173
  entry: ModelCatalogEntrySchema
11175
11174
  });
11176
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11175
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11177
11176
  /**
11178
11177
  * Query filter for settings-store collections.
11179
11178
  */
@@ -11260,7 +11259,8 @@ method(object({
11260
11259
  }), _void(), { kind: "mutation" }), method(object({
11261
11260
  namespace: string().optional(),
11262
11261
  collection: string(),
11263
- filter: QueryFilterSchema.optional()
11262
+ filter: QueryFilterSchema.optional(),
11263
+ columns: array(string()).readonly().optional()
11264
11264
  }), array(SettingsRecordSchema).readonly()), method(object({
11265
11265
  namespace: string().optional(),
11266
11266
  collection: string(),
@@ -11323,46 +11323,87 @@ var EngineInfoSchema = object({
11323
11323
  kind: _enum(["relational", "vector"]),
11324
11324
  displayName: string()
11325
11325
  });
11326
- method(_void(), EngineInfoSchema), method(object({
11326
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11327
11327
  namespace: string().optional(),
11328
11328
  collection: string(),
11329
11329
  key: string()
11330
- }), unknown()), method(object({
11330
+ }), unknown(), { auth: "admin" }), method(object({
11331
11331
  namespace: string().optional(),
11332
11332
  collection: string(),
11333
11333
  key: string(),
11334
11334
  value: unknown()
11335
- }), _void(), { kind: "mutation" }), method(object({
11335
+ }), _void(), {
11336
+ kind: "mutation",
11337
+ auth: "admin"
11338
+ }), method(object({
11336
11339
  namespace: string().optional(),
11337
11340
  collection: string(),
11338
- filter: QueryFilterSchema.optional()
11339
- }), array(SettingsRecordSchema).readonly()), method(object({
11341
+ filter: QueryFilterSchema.optional(),
11342
+ /**
11343
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11344
+ *
11345
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11346
+ * was wrong — corrected 2026-08-26 after the hop map
11347
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11348
+ * There is **no Zod parse at all** between the door and the engine: the
11349
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11350
+ * field declared here reaches `SqliteSettingsBackend` either way.
11351
+ *
11352
+ * What actually lost `columns` was the THIRD declaration of this shape:
11353
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11354
+ * interface the engine destructures from. The field existed on both
11355
+ * schemas and the engine still never read it, because nothing checks a
11356
+ * registered provider against `InferProvider<cap>` —
11357
+ * `ProviderRegistration.provider` is typed `object`.
11358
+ *
11359
+ * It is declared here anyway, and must stay in step with
11360
+ * `settings-store.query`: a caller reading only the cap definitions has
11361
+ * to be able to see that this call carries a projection.
11362
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11363
+ */
11364
+ columns: array(string()).readonly().optional()
11365
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11340
11366
  namespace: string().optional(),
11341
11367
  collection: string(),
11342
11368
  record: SettingsRecordSchema
11343
- }), _void(), { kind: "mutation" }), method(object({
11369
+ }), _void(), {
11370
+ kind: "mutation",
11371
+ auth: "admin"
11372
+ }), method(object({
11344
11373
  namespace: string().optional(),
11345
11374
  collection: string(),
11346
11375
  id: string(),
11347
11376
  data: record(string(), unknown())
11348
- }), _void(), { kind: "mutation" }), method(object({
11377
+ }), _void(), {
11378
+ kind: "mutation",
11379
+ auth: "admin"
11380
+ }), method(object({
11349
11381
  namespace: string().optional(),
11350
11382
  collection: string(),
11351
11383
  key: string()
11352
- }), _void(), { kind: "mutation" }), method(object({
11384
+ }), _void(), {
11385
+ kind: "mutation",
11386
+ auth: "admin"
11387
+ }), method(object({
11353
11388
  namespace: string().optional(),
11354
11389
  collection: string(),
11355
11390
  filter: MutationFilterSchema
11356
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11391
+ }), object({ deleted: number().int() }), {
11392
+ kind: "mutation",
11393
+ auth: "admin"
11394
+ }), method(object({
11357
11395
  namespace: string().optional(),
11358
11396
  collection: string(),
11359
11397
  filter: MutationFilterSchema,
11360
11398
  data: record(string(), unknown())
11361
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11399
+ }), object({ updated: number().int() }), {
11400
+ kind: "mutation",
11401
+ auth: "admin"
11402
+ }), method(object({
11362
11403
  namespace: string().optional(),
11363
11404
  collection: string(),
11364
11405
  filter: QueryFilterSchema.optional()
11365
- }), number()), method(object({
11406
+ }), number(), { auth: "admin" }), method(object({
11366
11407
  namespace: string().optional(),
11367
11408
  collection: string(),
11368
11409
  field: string(),
@@ -11372,15 +11413,18 @@ method(_void(), EngineInfoSchema), method(object({
11372
11413
  }), array(object({
11373
11414
  bucket: number().int(),
11374
11415
  count: number().int()
11375
- })).readonly()), method(object({
11416
+ })).readonly(), { auth: "admin" }), method(object({
11376
11417
  namespace: string().optional(),
11377
11418
  collection: string()
11378
- }), boolean()), method(object({
11419
+ }), boolean(), { auth: "admin" }), method(object({
11379
11420
  namespace: string().optional(),
11380
11421
  collection: string(),
11381
11422
  columns: array(CollectionColumnSchema).readonly(),
11382
11423
  indexes: array(CollectionIndexSchema).readonly().optional()
11383
- }), _void(), { kind: "mutation" });
11424
+ }), _void(), {
11425
+ kind: "mutation",
11426
+ auth: "admin"
11427
+ });
11384
11428
  /**
11385
11429
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11386
11430
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12757,7 +12801,7 @@ method(object({
12757
12801
  crop: _instanceof(Uint8Array),
12758
12802
  width: number(),
12759
12803
  height: number()
12760
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12804
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12761
12805
  /**
12762
12806
  * filesystem-browse — per-node capability for browsing the node's local
12763
12807
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13050,19 +13094,22 @@ method(LlmGenerateBaseInputSchema.extend({
13050
13094
  runtime: ManagedRuntimeConfigSchema,
13051
13095
  /** The managed profile's timeout, threaded by the hub provider. */
13052
13096
  timeoutMs: number().int().positive().optional()
13053
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13097
+ }), LlmGenerateResultSchema, {
13098
+ kind: "mutation",
13099
+ auth: "admin"
13100
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13054
13101
  kind: "mutation",
13055
13102
  auth: "admin"
13056
13103
  }), method(object({}), _void(), {
13057
13104
  kind: "mutation",
13058
13105
  auth: "admin"
13059
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13106
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13060
13107
  kind: "mutation",
13061
13108
  auth: "admin"
13062
13109
  }), method(object({ file: string() }), _void(), {
13063
13110
  kind: "mutation",
13064
13111
  auth: "admin"
13065
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13112
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13066
13113
  /**
13067
13114
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13068
13115
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16592,7 +16639,17 @@ var oauthIntegrationCapability = {
16592
16639
  scope: "system",
16593
16640
  mode: "collection",
16594
16641
  internal: true,
16595
- methods: { getDescriptor: method(_void(), OauthIntegrationDescriptorSchema) }
16642
+ methods: {
16643
+ /**
16644
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
16645
+ * `data-store-provider`) — `getDescriptor` was reachable on the AppRouter
16646
+ * by ANY authenticated session at the default `auth: 'protected'`. The
16647
+ * real caller is `/api/oauth2/authorize` and `/api/oauth2/integrations`
16648
+ * (`oauth2-routes.ts`), which resolve the provider directly off the
16649
+ * capability registry — never through tRPC. `auth: 'admin'` closes the
16650
+ * tRPC surface without touching that path.
16651
+ */
16652
+ getDescriptor: method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" }) }
16596
16653
  };
16597
16654
  /**
16598
16655
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
@@ -17788,6 +17845,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17788
17845
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17789
17846
  kind: "mutation",
17790
17847
  auth: "admin"
17848
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17849
+ kind: "mutation",
17850
+ auth: "admin"
17851
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17852
+ kind: "query",
17853
+ auth: "admin"
17854
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17855
+ kind: "mutation",
17856
+ auth: "admin"
17791
17857
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17792
17858
  kind: "query",
17793
17859
  auth: "admin"
@@ -17942,6 +18008,11 @@ object({
17942
18008
  "jpeg"
17943
18009
  ])
17944
18010
  });
18011
+ /**
18012
+ * Process-local frame identity. It is serializable so it can ride an in-process
18013
+ * capability call, but `registryId` deliberately prevents resolution in any
18014
+ * other process or execution group.
18015
+ */
17945
18016
  var FrameRefSchema = object({
17946
18017
  registryId: string().min(1),
17947
18018
  id: string().min(1),
@@ -20147,7 +20218,7 @@ method(object({
20147
20218
  * linking rather than produce an eternal token.
20148
20219
  */
20149
20220
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20150
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20221
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20151
20222
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20152
20223
  providerId: string().min(1),
20153
20224
  displayName: string().min(1),
@@ -20242,10 +20313,13 @@ var EvictResultSchema = object({
20242
20313
  /** True when the provider has nothing left it is willing to drop on this location. */
20243
20314
  exhausted: boolean()
20244
20315
  });
20245
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20316
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20246
20317
  locationId: string(),
20247
20318
  targetBytes: number().int().positive()
20248
- }), EvictResultSchema, { kind: "mutation" });
20319
+ }), EvictResultSchema, {
20320
+ kind: "mutation",
20321
+ auth: "admin"
20322
+ });
20249
20323
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20250
20324
  kind: "mutation",
20251
20325
  auth: "admin"
@@ -20305,26 +20379,50 @@ var ReadChunkInputSchema = object({
20305
20379
  length: number()
20306
20380
  });
20307
20381
  var EndDownloadInputSchema = object({ downloadId: string() });
20308
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20382
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20309
20383
  location: StorageLocationSchema,
20310
20384
  relativePath: string()
20311
- }), string()), method(object({
20385
+ }), string(), { auth: "admin" }), method(object({
20312
20386
  location: StorageLocationSchema,
20313
20387
  relativePath: string(),
20314
20388
  data: _instanceof(Uint8Array)
20315
- }), _void(), { kind: "mutation" }), method(object({
20389
+ }), _void(), {
20390
+ kind: "mutation",
20391
+ auth: "admin"
20392
+ }), method(object({
20316
20393
  location: StorageLocationSchema,
20317
20394
  relativePath: string()
20318
- }), _instanceof(Uint8Array)), method(object({
20395
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20319
20396
  location: StorageLocationSchema,
20320
20397
  relativePath: string()
20321
- }), boolean()), method(object({
20398
+ }), boolean(), { auth: "admin" }), method(object({
20322
20399
  location: StorageLocationSchema,
20323
20400
  prefix: string().optional()
20324
- }), array(string()).readonly()), method(object({
20401
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20325
20402
  location: StorageLocationSchema,
20326
20403
  relativePath: string()
20327
- }), _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" });
20404
+ }), _void(), {
20405
+ kind: "mutation",
20406
+ auth: "admin"
20407
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20408
+ kind: "mutation",
20409
+ auth: "admin"
20410
+ }), method(WriteChunkInputSchema, _void(), {
20411
+ kind: "mutation",
20412
+ auth: "admin"
20413
+ }), method(FinalizeUploadInputSchema, _void(), {
20414
+ kind: "mutation",
20415
+ auth: "admin"
20416
+ }), method(AbortUploadInputSchema, _void(), {
20417
+ kind: "mutation",
20418
+ auth: "admin"
20419
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20420
+ kind: "mutation",
20421
+ auth: "admin"
20422
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20423
+ kind: "mutation",
20424
+ auth: "admin"
20425
+ });
20328
20426
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20329
20427
  var ProfileSettingsSchemaBridge = unknown().nullable();
20330
20428
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20582,7 +20680,8 @@ method(object({
20582
20680
  access: "create"
20583
20681
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20584
20682
  kind: "mutation",
20585
- access: "view"
20683
+ access: "view",
20684
+ auth: "admin"
20586
20685
  }), method(object({
20587
20686
  /** Required — the user the assertion belongs to (verified). */
20588
20687
  userId: string(),
@@ -20590,10 +20689,12 @@ method(object({
20590
20689
  response: record(string(), unknown())
20591
20690
  }), object({ verified: boolean() }), {
20592
20691
  kind: "mutation",
20593
- access: "view"
20692
+ access: "view",
20693
+ auth: "admin"
20594
20694
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20595
20695
  kind: "mutation",
20596
- access: "view"
20696
+ access: "view",
20697
+ auth: "admin"
20597
20698
  }), method(object({
20598
20699
  /** AuthenticationResponseJSON from the browser. */
20599
20700
  response: record(string(), unknown()) }), object({
@@ -20601,7 +20702,8 @@ response: record(string(), unknown()) }), object({
20601
20702
  userId: string().nullable()
20602
20703
  }), {
20603
20704
  kind: "mutation",
20604
- access: "view"
20705
+ access: "view",
20706
+ auth: "admin"
20605
20707
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20606
20708
  userId: string(),
20607
20709
  credentialId: string()
@@ -20773,7 +20875,19 @@ var VectorStatsResultSchema = object({
20773
20875
  /** False when the backend ranks approximately. */
20774
20876
  exact: boolean()
20775
20877
  });
20776
- 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);
20878
+ method(VectorDeclareIndexInputSchema, _void(), {
20879
+ kind: "mutation",
20880
+ auth: "admin"
20881
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20882
+ kind: "mutation",
20883
+ auth: "admin"
20884
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20885
+ kind: "mutation",
20886
+ auth: "admin"
20887
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20888
+ kind: "mutation",
20889
+ auth: "admin"
20890
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20777
20891
  var ClipSchema = object({
20778
20892
  /** Opaque, provider-namespaced id. The default provider encodes the time
20779
20893
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23315,7 +23429,27 @@ var MediaFileLiteSchema$1 = object({
23315
23429
  sizeBytes: number(),
23316
23430
  timestamp: number()
23317
23431
  });
23318
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23432
+ method(object({
23433
+ /**
23434
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23435
+ *
23436
+ * Default `false`, the same inversion `listRecentFaces` and
23437
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23438
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23439
+ * on the live hub the same day: four identities cost 40,979 B with the
23440
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23441
+ * four times and the viewer holds at `staleTime: 30_000`.
23442
+ *
23443
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23444
+ * the `event-media` plane serves that key `immutable` with an ETag.
23445
+ *
23446
+ * **This is an INPUT field, so it does not reach the addon until the
23447
+ * next train** — the hub router validates cap inputs against its own
23448
+ * compiled Zod and strips a key it does not know. Until then the
23449
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23450
+ * is what ships, and the opt-in becomes reachable when the train lands.
23451
+ */
23452
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23319
23453
  kind: "mutation",
23320
23454
  auth: "admin"
23321
23455
  }), method(object({
@@ -26205,8 +26339,10 @@ var PlateInfoSchema = object({
26205
26339
  keyFrameMediaKey: string().optional(),
26206
26340
  base64: string().optional(),
26207
26341
  /**
26208
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26209
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26342
+ * Same crop as a data-plane URL, always present when the plate has a stored
26343
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26344
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26345
+ * left at its `true` default.
26210
26346
  */
26211
26347
  cropUrl: string().optional()
26212
26348
  });
@@ -26226,14 +26362,34 @@ var PlateClusterSchema = object({
26226
26362
  });
26227
26363
  method(object({
26228
26364
  deviceId: number().int().optional(),
26229
- limit: number().int().positive().optional()
26365
+ limit: number().int().positive().optional(),
26366
+ /**
26367
+ * Inline the base64 crop on every row. Default `true` — the existing
26368
+ * behaviour, kept so no caller breaks.
26369
+ *
26370
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26371
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26372
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26373
+ * metadata without them — and the browser then caches the images.
26374
+ *
26375
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26376
+ * plates were the one gallery list left without it.
26377
+ *
26378
+ * **This is an INPUT field, so it does not reach the addon until the
26379
+ * next train.** The hub router validates cap inputs against its own
26380
+ * compiled Zod and strips a key it does not know. Until the train
26381
+ * ships, sending `false` is harmless and keeps the crops inline.
26382
+ */
26383
+ includeCrops: boolean().optional()
26230
26384
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26231
26385
  deviceId: number().int(),
26232
26386
  trackId: string()
26233
26387
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26234
26388
  text: string().min(1),
26235
26389
  maxDistance: number().int().min(0).optional(),
26236
- limit: number().int().positive().optional()
26390
+ limit: number().int().positive().optional(),
26391
+ /** See `listPlates.includeCrops`. Default `true`. */
26392
+ includeCrops: boolean().optional()
26237
26393
  }), array(PlateInfoSchema).readonly()), method(object({
26238
26394
  maxDistance: number().int().min(0).optional(),
26239
26395
  minClusterSize: number().int().min(2).optional(),
@@ -26247,7 +26403,13 @@ method(object({
26247
26403
  }), method(object({ plateId: string() }), _void(), {
26248
26404
  kind: "mutation",
26249
26405
  auth: "admin"
26250
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26406
+ }), method(object({
26407
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26408
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26409
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26410
+ * INPUT field: stripped by the hub router until the train ships, which
26411
+ * resolves to `false` and is exactly the intended default. */
26412
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26251
26413
  kind: "mutation",
26252
26414
  auth: "admin"
26253
26415
  }), method(object({
@@ -33508,6 +33670,12 @@ Object.freeze({
33508
33670
  addonId: null,
33509
33671
  access: "create"
33510
33672
  },
33673
+ "pipelineAnalytics.cancelRelocateMedia": {
33674
+ capName: "pipeline-analytics",
33675
+ capScope: "device",
33676
+ addonId: null,
33677
+ access: "create"
33678
+ },
33511
33679
  "pipelineAnalytics.cancelStorageMigrationMove": {
33512
33680
  capName: "pipeline-analytics",
33513
33681
  capScope: "device",
@@ -33682,6 +33850,12 @@ Object.freeze({
33682
33850
  addonId: null,
33683
33851
  access: "view"
33684
33852
  },
33853
+ "pipelineAnalytics.listRelocateMediaJobs": {
33854
+ capName: "pipeline-analytics",
33855
+ capScope: "device",
33856
+ addonId: null,
33857
+ access: "view"
33858
+ },
33685
33859
  "pipelineAnalytics.listRetrainAnnotations": {
33686
33860
  capName: "pipeline-analytics",
33687
33861
  capScope: "device",
@@ -33760,6 +33934,12 @@ Object.freeze({
33760
33934
  addonId: null,
33761
33935
  access: "create"
33762
33936
  },
33937
+ "pipelineAnalytics.relocateMedia": {
33938
+ capName: "pipeline-analytics",
33939
+ capScope: "device",
33940
+ addonId: null,
33941
+ access: "create"
33942
+ },
33763
33943
  "pipelineAnalytics.restageRetrainTrack": {
33764
33944
  capName: "pipeline-analytics",
33765
33945
  capScope: "device",
@@ -6629,7 +6629,7 @@ function method(input, output, options) {
6629
6629
  input,
6630
6630
  output,
6631
6631
  kind: options?.kind ?? "query",
6632
- auth: options?.auth ?? "protected",
6632
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6633
6633
  ...options?.access !== void 0 ? { access: options.access } : {},
6634
6634
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6635
6635
  timeoutMs: options?.timeoutMs
@@ -6653,7 +6653,7 @@ function event(data) {
6653
6653
  }
6654
6654
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6655
6655
  var VersionOutputSchema$1 = object({ version: string() });
6656
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6656
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6657
6657
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6658
6658
  DeviceType["Camera"] = "camera";
6659
6659
  DeviceType["Hub"] = "hub";
@@ -6974,7 +6974,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6974
6974
  }({});
6975
6975
  var StaticDirOutputSchema = object({ staticDir: string() });
6976
6976
  var VersionOutputSchema = object({ version: string() });
6977
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6977
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6978
6978
  /**
6979
6979
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6980
6980
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7719,24 +7719,6 @@ var RecordingRetentionSchema = object({
7719
7719
  maxSizeGb: number().min(0).optional()
7720
7720
  });
7721
7721
  /**
7722
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7723
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7724
- * previews at. Five graduated steps; absent on a config = `standard` (the
7725
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7726
- *
7727
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7728
- * Each window's index sidecar carries its own tile dims, so a camera whose
7729
- * preset changed over time renders every historical window at the dims it was
7730
- * written with.
7731
- */
7732
- var ScrubThumbnailPresetSchema = _enum([
7733
- "minimal",
7734
- "low",
7735
- "standard",
7736
- "high",
7737
- "max"
7738
- ]);
7739
- /**
7740
7722
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7741
7723
  *
7742
7724
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7744,7 +7726,11 @@ var ScrubThumbnailPresetSchema = _enum([
7744
7726
  * other field is a storage knob (profiles, segment length, retention, scrub).
7745
7727
  *
7746
7728
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7747
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7729
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7730
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7731
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7732
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7733
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7748
7734
  * A stale caller must fail loudly — silently stripping its legacy intent would
7749
7735
  * persist a band-less config, i.e. silently stop recording the camera.
7750
7736
  */
@@ -7767,14 +7753,7 @@ var RecordingConfigSchema = object({
7767
7753
  * "off" is the absence of a covering band, never a band value.
7768
7754
  */
7769
7755
  bands: array(RecordingBandSchema).default([]),
7770
- retention: RecordingRetentionSchema.optional(),
7771
- /**
7772
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7773
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7774
- * windows only — existing sheets are immutable, and each window's index
7775
- * carries its own tile dims so mixed-preset history renders correctly.
7776
- */
7777
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7756
+ retention: RecordingRetentionSchema.optional()
7778
7757
  }).strict();
7779
7758
  /**
7780
7759
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7850,10 +7829,11 @@ var RelocateFootageInputSchema = object({
7850
7829
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7851
7830
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7852
7831
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7853
- var StorageMigrationMediaMoveInputSchema = object({
7832
+ var RelocateMediaInputSchema = object({
7854
7833
  toLocationId: string(),
7855
7834
  throttleMbps: number().min(1).max(1e3).optional()
7856
- }).extend({ leaseId: string().min(1) });
7835
+ });
7836
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7857
7837
  /** The independently selectable logical storage classes. `recordings`
7858
7838
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7859
7839
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8148,7 +8128,26 @@ var LabelDefinitionSchema = object({
8148
8128
  description: string().optional(),
8149
8129
  icon: string().optional()
8150
8130
  });
8151
- var ClassMapDefinitionSchema = object({
8131
+ /**
8132
+ * Wire schema for a per-model CATALOG classMap override
8133
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8134
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8135
+ * detection pipeline executor actually routes.
8136
+ *
8137
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8138
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8139
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8140
+ * enum) — the two used to share the name `ClassMapDefinition`/
8141
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8142
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8143
+ * are not: it is two different concepts colliding on a name. Keep this type
8144
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8145
+ * would either narrow every `ClassMapDefinition` consumer to the four
8146
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8147
+ * schema exists for (see the "rejects a classMap whose target is not a
8148
+ * detection macro" test in `model-catalog-schema.test.ts`).
8149
+ */
8150
+ var DetectionCatalogClassMapSchema = object({
8152
8151
  mapping: record(string(), _enum([
8153
8152
  "person",
8154
8153
  "vehicle",
@@ -8353,7 +8352,7 @@ var ModelCatalogEntrySchema = object({
8353
8352
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8354
8353
  * labels already ARE the CamStack macros (Scrypted identity map).
8355
8354
  */
8356
- classMap: ClassMapDefinitionSchema.optional()
8355
+ classMap: DetectionCatalogClassMapSchema.optional()
8357
8356
  });
8358
8357
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8359
8358
  format: literal("openvino"),
@@ -8383,7 +8382,7 @@ var ModelConvertMetadataSchema = object({
8383
8382
  "segmentation"
8384
8383
  ]),
8385
8384
  faceAlignment: boolean().optional(),
8386
- classMap: ClassMapDefinitionSchema.optional()
8385
+ classMap: DetectionCatalogClassMapSchema.optional()
8387
8386
  });
8388
8387
  var ConvertResultSchema = object({
8389
8388
  entry: ModelCatalogEntrySchema,
@@ -9246,7 +9245,7 @@ var AddonPageDeclarationSchema = object({
9246
9245
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9247
9246
  sectionLabel: string().optional()
9248
9247
  });
9249
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9248
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9250
9249
  var AddonHttpRouteSchema = object({
9251
9250
  method: _enum([
9252
9251
  "GET",
@@ -9500,7 +9499,7 @@ var WidgetMetadataSchema = object({
9500
9499
  defaultColumns: number().int().min(1).max(12).default(6),
9501
9500
  defaultRows: number().int().min(1).max(12).default(1)
9502
9501
  });
9503
- method(_void(), array(WidgetMetadataSchema).readonly());
9502
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9504
9503
  /**
9505
9504
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9506
9505
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11173,7 +11172,7 @@ var CustomModelDescriptorSchema = object({
11173
11172
  stepId: string(),
11174
11173
  entry: ModelCatalogEntrySchema
11175
11174
  });
11176
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11175
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11177
11176
  /**
11178
11177
  * Query filter for settings-store collections.
11179
11178
  */
@@ -11260,7 +11259,8 @@ method(object({
11260
11259
  }), _void(), { kind: "mutation" }), method(object({
11261
11260
  namespace: string().optional(),
11262
11261
  collection: string(),
11263
- filter: QueryFilterSchema.optional()
11262
+ filter: QueryFilterSchema.optional(),
11263
+ columns: array(string()).readonly().optional()
11264
11264
  }), array(SettingsRecordSchema).readonly()), method(object({
11265
11265
  namespace: string().optional(),
11266
11266
  collection: string(),
@@ -11323,46 +11323,87 @@ var EngineInfoSchema = object({
11323
11323
  kind: _enum(["relational", "vector"]),
11324
11324
  displayName: string()
11325
11325
  });
11326
- method(_void(), EngineInfoSchema), method(object({
11326
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11327
11327
  namespace: string().optional(),
11328
11328
  collection: string(),
11329
11329
  key: string()
11330
- }), unknown()), method(object({
11330
+ }), unknown(), { auth: "admin" }), method(object({
11331
11331
  namespace: string().optional(),
11332
11332
  collection: string(),
11333
11333
  key: string(),
11334
11334
  value: unknown()
11335
- }), _void(), { kind: "mutation" }), method(object({
11335
+ }), _void(), {
11336
+ kind: "mutation",
11337
+ auth: "admin"
11338
+ }), method(object({
11336
11339
  namespace: string().optional(),
11337
11340
  collection: string(),
11338
- filter: QueryFilterSchema.optional()
11339
- }), array(SettingsRecordSchema).readonly()), method(object({
11341
+ filter: QueryFilterSchema.optional(),
11342
+ /**
11343
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11344
+ *
11345
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11346
+ * was wrong — corrected 2026-08-26 after the hop map
11347
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11348
+ * There is **no Zod parse at all** between the door and the engine: the
11349
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11350
+ * field declared here reaches `SqliteSettingsBackend` either way.
11351
+ *
11352
+ * What actually lost `columns` was the THIRD declaration of this shape:
11353
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11354
+ * interface the engine destructures from. The field existed on both
11355
+ * schemas and the engine still never read it, because nothing checks a
11356
+ * registered provider against `InferProvider<cap>` —
11357
+ * `ProviderRegistration.provider` is typed `object`.
11358
+ *
11359
+ * It is declared here anyway, and must stay in step with
11360
+ * `settings-store.query`: a caller reading only the cap definitions has
11361
+ * to be able to see that this call carries a projection.
11362
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11363
+ */
11364
+ columns: array(string()).readonly().optional()
11365
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11340
11366
  namespace: string().optional(),
11341
11367
  collection: string(),
11342
11368
  record: SettingsRecordSchema
11343
- }), _void(), { kind: "mutation" }), method(object({
11369
+ }), _void(), {
11370
+ kind: "mutation",
11371
+ auth: "admin"
11372
+ }), method(object({
11344
11373
  namespace: string().optional(),
11345
11374
  collection: string(),
11346
11375
  id: string(),
11347
11376
  data: record(string(), unknown())
11348
- }), _void(), { kind: "mutation" }), method(object({
11377
+ }), _void(), {
11378
+ kind: "mutation",
11379
+ auth: "admin"
11380
+ }), method(object({
11349
11381
  namespace: string().optional(),
11350
11382
  collection: string(),
11351
11383
  key: string()
11352
- }), _void(), { kind: "mutation" }), method(object({
11384
+ }), _void(), {
11385
+ kind: "mutation",
11386
+ auth: "admin"
11387
+ }), method(object({
11353
11388
  namespace: string().optional(),
11354
11389
  collection: string(),
11355
11390
  filter: MutationFilterSchema
11356
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11391
+ }), object({ deleted: number().int() }), {
11392
+ kind: "mutation",
11393
+ auth: "admin"
11394
+ }), method(object({
11357
11395
  namespace: string().optional(),
11358
11396
  collection: string(),
11359
11397
  filter: MutationFilterSchema,
11360
11398
  data: record(string(), unknown())
11361
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11399
+ }), object({ updated: number().int() }), {
11400
+ kind: "mutation",
11401
+ auth: "admin"
11402
+ }), method(object({
11362
11403
  namespace: string().optional(),
11363
11404
  collection: string(),
11364
11405
  filter: QueryFilterSchema.optional()
11365
- }), number()), method(object({
11406
+ }), number(), { auth: "admin" }), method(object({
11366
11407
  namespace: string().optional(),
11367
11408
  collection: string(),
11368
11409
  field: string(),
@@ -11372,15 +11413,18 @@ method(_void(), EngineInfoSchema), method(object({
11372
11413
  }), array(object({
11373
11414
  bucket: number().int(),
11374
11415
  count: number().int()
11375
- })).readonly()), method(object({
11416
+ })).readonly(), { auth: "admin" }), method(object({
11376
11417
  namespace: string().optional(),
11377
11418
  collection: string()
11378
- }), boolean()), method(object({
11419
+ }), boolean(), { auth: "admin" }), method(object({
11379
11420
  namespace: string().optional(),
11380
11421
  collection: string(),
11381
11422
  columns: array(CollectionColumnSchema).readonly(),
11382
11423
  indexes: array(CollectionIndexSchema).readonly().optional()
11383
- }), _void(), { kind: "mutation" });
11424
+ }), _void(), {
11425
+ kind: "mutation",
11426
+ auth: "admin"
11427
+ });
11384
11428
  /**
11385
11429
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11386
11430
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12757,7 +12801,7 @@ method(object({
12757
12801
  crop: _instanceof(Uint8Array),
12758
12802
  width: number(),
12759
12803
  height: number()
12760
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12804
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12761
12805
  /**
12762
12806
  * filesystem-browse — per-node capability for browsing the node's local
12763
12807
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13050,19 +13094,22 @@ method(LlmGenerateBaseInputSchema.extend({
13050
13094
  runtime: ManagedRuntimeConfigSchema,
13051
13095
  /** The managed profile's timeout, threaded by the hub provider. */
13052
13096
  timeoutMs: number().int().positive().optional()
13053
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13097
+ }), LlmGenerateResultSchema, {
13098
+ kind: "mutation",
13099
+ auth: "admin"
13100
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13054
13101
  kind: "mutation",
13055
13102
  auth: "admin"
13056
13103
  }), method(object({}), _void(), {
13057
13104
  kind: "mutation",
13058
13105
  auth: "admin"
13059
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13106
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13060
13107
  kind: "mutation",
13061
13108
  auth: "admin"
13062
13109
  }), method(object({ file: string() }), _void(), {
13063
13110
  kind: "mutation",
13064
13111
  auth: "admin"
13065
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13112
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13066
13113
  /**
13067
13114
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13068
13115
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16592,7 +16639,17 @@ var oauthIntegrationCapability = {
16592
16639
  scope: "system",
16593
16640
  mode: "collection",
16594
16641
  internal: true,
16595
- methods: { getDescriptor: method(_void(), OauthIntegrationDescriptorSchema) }
16642
+ methods: {
16643
+ /**
16644
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
16645
+ * `data-store-provider`) — `getDescriptor` was reachable on the AppRouter
16646
+ * by ANY authenticated session at the default `auth: 'protected'`. The
16647
+ * real caller is `/api/oauth2/authorize` and `/api/oauth2/integrations`
16648
+ * (`oauth2-routes.ts`), which resolve the provider directly off the
16649
+ * capability registry — never through tRPC. `auth: 'admin'` closes the
16650
+ * tRPC surface without touching that path.
16651
+ */
16652
+ getDescriptor: method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" }) }
16596
16653
  };
16597
16654
  /**
16598
16655
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
@@ -17788,6 +17845,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17788
17845
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17789
17846
  kind: "mutation",
17790
17847
  auth: "admin"
17848
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17849
+ kind: "mutation",
17850
+ auth: "admin"
17851
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17852
+ kind: "query",
17853
+ auth: "admin"
17854
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17855
+ kind: "mutation",
17856
+ auth: "admin"
17791
17857
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17792
17858
  kind: "query",
17793
17859
  auth: "admin"
@@ -17942,6 +18008,11 @@ object({
17942
18008
  "jpeg"
17943
18009
  ])
17944
18010
  });
18011
+ /**
18012
+ * Process-local frame identity. It is serializable so it can ride an in-process
18013
+ * capability call, but `registryId` deliberately prevents resolution in any
18014
+ * other process or execution group.
18015
+ */
17945
18016
  var FrameRefSchema = object({
17946
18017
  registryId: string().min(1),
17947
18018
  id: string().min(1),
@@ -20147,7 +20218,7 @@ method(object({
20147
20218
  * linking rather than produce an eternal token.
20148
20219
  */
20149
20220
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20150
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20221
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20151
20222
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20152
20223
  providerId: string().min(1),
20153
20224
  displayName: string().min(1),
@@ -20242,10 +20313,13 @@ var EvictResultSchema = object({
20242
20313
  /** True when the provider has nothing left it is willing to drop on this location. */
20243
20314
  exhausted: boolean()
20244
20315
  });
20245
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20316
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20246
20317
  locationId: string(),
20247
20318
  targetBytes: number().int().positive()
20248
- }), EvictResultSchema, { kind: "mutation" });
20319
+ }), EvictResultSchema, {
20320
+ kind: "mutation",
20321
+ auth: "admin"
20322
+ });
20249
20323
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20250
20324
  kind: "mutation",
20251
20325
  auth: "admin"
@@ -20305,26 +20379,50 @@ var ReadChunkInputSchema = object({
20305
20379
  length: number()
20306
20380
  });
20307
20381
  var EndDownloadInputSchema = object({ downloadId: string() });
20308
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20382
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20309
20383
  location: StorageLocationSchema,
20310
20384
  relativePath: string()
20311
- }), string()), method(object({
20385
+ }), string(), { auth: "admin" }), method(object({
20312
20386
  location: StorageLocationSchema,
20313
20387
  relativePath: string(),
20314
20388
  data: _instanceof(Uint8Array)
20315
- }), _void(), { kind: "mutation" }), method(object({
20389
+ }), _void(), {
20390
+ kind: "mutation",
20391
+ auth: "admin"
20392
+ }), method(object({
20316
20393
  location: StorageLocationSchema,
20317
20394
  relativePath: string()
20318
- }), _instanceof(Uint8Array)), method(object({
20395
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20319
20396
  location: StorageLocationSchema,
20320
20397
  relativePath: string()
20321
- }), boolean()), method(object({
20398
+ }), boolean(), { auth: "admin" }), method(object({
20322
20399
  location: StorageLocationSchema,
20323
20400
  prefix: string().optional()
20324
- }), array(string()).readonly()), method(object({
20401
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20325
20402
  location: StorageLocationSchema,
20326
20403
  relativePath: string()
20327
- }), _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" });
20404
+ }), _void(), {
20405
+ kind: "mutation",
20406
+ auth: "admin"
20407
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20408
+ kind: "mutation",
20409
+ auth: "admin"
20410
+ }), method(WriteChunkInputSchema, _void(), {
20411
+ kind: "mutation",
20412
+ auth: "admin"
20413
+ }), method(FinalizeUploadInputSchema, _void(), {
20414
+ kind: "mutation",
20415
+ auth: "admin"
20416
+ }), method(AbortUploadInputSchema, _void(), {
20417
+ kind: "mutation",
20418
+ auth: "admin"
20419
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20420
+ kind: "mutation",
20421
+ auth: "admin"
20422
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20423
+ kind: "mutation",
20424
+ auth: "admin"
20425
+ });
20328
20426
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20329
20427
  var ProfileSettingsSchemaBridge = unknown().nullable();
20330
20428
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20582,7 +20680,8 @@ method(object({
20582
20680
  access: "create"
20583
20681
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20584
20682
  kind: "mutation",
20585
- access: "view"
20683
+ access: "view",
20684
+ auth: "admin"
20586
20685
  }), method(object({
20587
20686
  /** Required — the user the assertion belongs to (verified). */
20588
20687
  userId: string(),
@@ -20590,10 +20689,12 @@ method(object({
20590
20689
  response: record(string(), unknown())
20591
20690
  }), object({ verified: boolean() }), {
20592
20691
  kind: "mutation",
20593
- access: "view"
20692
+ access: "view",
20693
+ auth: "admin"
20594
20694
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20595
20695
  kind: "mutation",
20596
- access: "view"
20696
+ access: "view",
20697
+ auth: "admin"
20597
20698
  }), method(object({
20598
20699
  /** AuthenticationResponseJSON from the browser. */
20599
20700
  response: record(string(), unknown()) }), object({
@@ -20601,7 +20702,8 @@ response: record(string(), unknown()) }), object({
20601
20702
  userId: string().nullable()
20602
20703
  }), {
20603
20704
  kind: "mutation",
20604
- access: "view"
20705
+ access: "view",
20706
+ auth: "admin"
20605
20707
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20606
20708
  userId: string(),
20607
20709
  credentialId: string()
@@ -20773,7 +20875,19 @@ var VectorStatsResultSchema = object({
20773
20875
  /** False when the backend ranks approximately. */
20774
20876
  exact: boolean()
20775
20877
  });
20776
- 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);
20878
+ method(VectorDeclareIndexInputSchema, _void(), {
20879
+ kind: "mutation",
20880
+ auth: "admin"
20881
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20882
+ kind: "mutation",
20883
+ auth: "admin"
20884
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20885
+ kind: "mutation",
20886
+ auth: "admin"
20887
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20888
+ kind: "mutation",
20889
+ auth: "admin"
20890
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20777
20891
  var ClipSchema = object({
20778
20892
  /** Opaque, provider-namespaced id. The default provider encodes the time
20779
20893
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -23315,7 +23429,27 @@ var MediaFileLiteSchema$1 = object({
23315
23429
  sizeBytes: number(),
23316
23430
  timestamp: number()
23317
23431
  });
23318
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23432
+ method(object({
23433
+ /**
23434
+ * Inline {@link IdentitySchema.coverBase64} on every row.
23435
+ *
23436
+ * Default `false`, the same inversion `listRecentFaces` and
23437
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
23438
+ * why the burden belongs on the caller that WANTS the bytes). Measured
23439
+ * on the live hub the same day: four identities cost 40,979 B with the
23440
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
23441
+ * four times and the viewer holds at `staleTime: 30_000`.
23442
+ *
23443
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
23444
+ * the `event-media` plane serves that key `immutable` with an ETag.
23445
+ *
23446
+ * **This is an INPUT field, so it does not reach the addon until the
23447
+ * next train** — the hub router validates cap inputs against its own
23448
+ * compiled Zod and strips a key it does not know. Until then the
23449
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
23450
+ * is what ships, and the opt-in becomes reachable when the train lands.
23451
+ */
23452
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
23319
23453
  kind: "mutation",
23320
23454
  auth: "admin"
23321
23455
  }), method(object({
@@ -26205,8 +26339,10 @@ var PlateInfoSchema = object({
26205
26339
  keyFrameMediaKey: string().optional(),
26206
26340
  base64: string().optional(),
26207
26341
  /**
26208
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
26209
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
26342
+ * Same crop as a data-plane URL, always present when the plate has a stored
26343
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
26344
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
26345
+ * left at its `true` default.
26210
26346
  */
26211
26347
  cropUrl: string().optional()
26212
26348
  });
@@ -26226,14 +26362,34 @@ var PlateClusterSchema = object({
26226
26362
  });
26227
26363
  method(object({
26228
26364
  deviceId: number().int().optional(),
26229
- limit: number().int().positive().optional()
26365
+ limit: number().int().positive().optional(),
26366
+ /**
26367
+ * Inline the base64 crop on every row. Default `true` — the existing
26368
+ * behaviour, kept so no caller breaks.
26369
+ *
26370
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
26371
+ * Measured on the live hub at the 500 rows the Plates view asks for:
26372
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
26373
+ * metadata without them — and the browser then caches the images.
26374
+ *
26375
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
26376
+ * plates were the one gallery list left without it.
26377
+ *
26378
+ * **This is an INPUT field, so it does not reach the addon until the
26379
+ * next train.** The hub router validates cap inputs against its own
26380
+ * compiled Zod and strips a key it does not know. Until the train
26381
+ * ships, sending `false` is harmless and keeps the crops inline.
26382
+ */
26383
+ includeCrops: boolean().optional()
26230
26384
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
26231
26385
  deviceId: number().int(),
26232
26386
  trackId: string()
26233
26387
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
26234
26388
  text: string().min(1),
26235
26389
  maxDistance: number().int().min(0).optional(),
26236
- limit: number().int().positive().optional()
26390
+ limit: number().int().positive().optional(),
26391
+ /** See `listPlates.includeCrops`. Default `true`. */
26392
+ includeCrops: boolean().optional()
26237
26393
  }), array(PlateInfoSchema).readonly()), method(object({
26238
26394
  maxDistance: number().int().min(0).optional(),
26239
26395
  minClusterSize: number().int().min(2).optional(),
@@ -26247,7 +26403,13 @@ method(object({
26247
26403
  }), method(object({ plateId: string() }), _void(), {
26248
26404
  kind: "mutation",
26249
26405
  auth: "admin"
26250
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26406
+ }), method(object({
26407
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
26408
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
26409
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
26410
+ * INPUT field: stripped by the hub router until the train ships, which
26411
+ * resolves to `false` and is exactly the intended default. */
26412
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
26251
26413
  kind: "mutation",
26252
26414
  auth: "admin"
26253
26415
  }), method(object({
@@ -33508,6 +33670,12 @@ Object.freeze({
33508
33670
  addonId: null,
33509
33671
  access: "create"
33510
33672
  },
33673
+ "pipelineAnalytics.cancelRelocateMedia": {
33674
+ capName: "pipeline-analytics",
33675
+ capScope: "device",
33676
+ addonId: null,
33677
+ access: "create"
33678
+ },
33511
33679
  "pipelineAnalytics.cancelStorageMigrationMove": {
33512
33680
  capName: "pipeline-analytics",
33513
33681
  capScope: "device",
@@ -33682,6 +33850,12 @@ Object.freeze({
33682
33850
  addonId: null,
33683
33851
  access: "view"
33684
33852
  },
33853
+ "pipelineAnalytics.listRelocateMediaJobs": {
33854
+ capName: "pipeline-analytics",
33855
+ capScope: "device",
33856
+ addonId: null,
33857
+ access: "view"
33858
+ },
33685
33859
  "pipelineAnalytics.listRetrainAnnotations": {
33686
33860
  capName: "pipeline-analytics",
33687
33861
  capScope: "device",
@@ -33760,6 +33934,12 @@ Object.freeze({
33760
33934
  addonId: null,
33761
33935
  access: "create"
33762
33936
  },
33937
+ "pipelineAnalytics.relocateMedia": {
33938
+ capName: "pipeline-analytics",
33939
+ capScope: "device",
33940
+ addonId: null,
33941
+ access: "create"
33942
+ },
33763
33943
  "pipelineAnalytics.restageRetrainTrack": {
33764
33944
  capName: "pipeline-analytics",
33765
33945
  capScope: "device",
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  //#endregion
6
- const require_dist = require("../dist-t-5RdKBJ.js");
6
+ const require_dist = require("../dist-Cef7D9kq.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  //#region src/ha-export/topics.ts
9
9
  /**
@@ -1,4 +1,4 @@
1
- import { M as deviceExportCapability, Ot as EventCategory, S as buildAddonRouteProvider, Y as oauthIntegrationCapability, a as CameraSwitchIdSchema, c as HvacModeSchema, f as addonRoutesCapability, ft as BaseAddon, i as COCO_TO_MACRO, l as MediaPlayerRepeatSchema, s as FanDirectionSchema, t as AlarmArmModeSchema, wt as string } from "../dist-D1G6jUej.mjs";
1
+ import { M as deviceExportCapability, Ot as EventCategory, S as buildAddonRouteProvider, Y as oauthIntegrationCapability, a as CameraSwitchIdSchema, c as HvacModeSchema, f as addonRoutesCapability, ft as BaseAddon, i as COCO_TO_MACRO, l as MediaPlayerRepeatSchema, s as FanDirectionSchema, t as AlarmArmModeSchema, wt as string } from "../dist-DolpU5X1.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  //#region src/ha-export/topics.ts
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.41",
3
+ "version": "1.2.42",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",