@camstack/addon-ai 0.4.21 → 0.4.22

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 +263 -80
  2. package/dist/addon.mjs +263 -80
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -6852,7 +6852,7 @@ function method(input, output, options) {
6852
6852
  input,
6853
6853
  output,
6854
6854
  kind: options?.kind ?? "query",
6855
- auth: options?.auth ?? "protected",
6855
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6856
6856
  ...options?.access !== void 0 ? { access: options.access } : {},
6857
6857
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6858
6858
  timeoutMs: options?.timeoutMs
@@ -6872,7 +6872,7 @@ function systemMethod(input, output, options) {
6872
6872
  }
6873
6873
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6874
6874
  var VersionOutputSchema$1 = object({ version: string() });
6875
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6875
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6876
6876
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6877
6877
  DeviceType["Camera"] = "camera";
6878
6878
  DeviceType["Hub"] = "hub";
@@ -7193,7 +7193,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7193
7193
  }({});
7194
7194
  var StaticDirOutputSchema = object({ staticDir: string() });
7195
7195
  var VersionOutputSchema = object({ version: string() });
7196
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7196
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7197
7197
  /**
7198
7198
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7199
7199
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7807,24 +7807,6 @@ var RecordingRetentionSchema = object({
7807
7807
  maxSizeGb: number$1().min(0).optional()
7808
7808
  });
7809
7809
  /**
7810
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7811
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7812
- * previews at. Five graduated steps; absent on a config = `standard` (the
7813
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7814
- *
7815
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7816
- * Each window's index sidecar carries its own tile dims, so a camera whose
7817
- * preset changed over time renders every historical window at the dims it was
7818
- * written with.
7819
- */
7820
- var ScrubThumbnailPresetSchema = _enum([
7821
- "minimal",
7822
- "low",
7823
- "standard",
7824
- "high",
7825
- "max"
7826
- ]);
7827
- /**
7828
7810
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7829
7811
  *
7830
7812
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7832,7 +7814,11 @@ var ScrubThumbnailPresetSchema = _enum([
7832
7814
  * other field is a storage knob (profiles, segment length, retention, scrub).
7833
7815
  *
7834
7816
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7835
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7817
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7818
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7819
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7820
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7821
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7836
7822
  * A stale caller must fail loudly — silently stripping its legacy intent would
7837
7823
  * persist a band-less config, i.e. silently stop recording the camera.
7838
7824
  */
@@ -7855,14 +7841,7 @@ var RecordingConfigSchema = object({
7855
7841
  * "off" is the absence of a covering band, never a band value.
7856
7842
  */
7857
7843
  bands: array(RecordingBandSchema).default([]),
7858
- retention: RecordingRetentionSchema.optional(),
7859
- /**
7860
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7861
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7862
- * windows only — existing sheets are immutable, and each window's index
7863
- * carries its own tile dims so mixed-preset history renders correctly.
7864
- */
7865
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7844
+ retention: RecordingRetentionSchema.optional()
7866
7845
  }).strict();
7867
7846
  /**
7868
7847
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7938,10 +7917,11 @@ var RelocateFootageInputSchema = object({
7938
7917
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7939
7918
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7940
7919
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7941
- var StorageMigrationMediaMoveInputSchema = object({
7920
+ var RelocateMediaInputSchema = object({
7942
7921
  toLocationId: string(),
7943
7922
  throttleMbps: number$1().min(1).max(1e3).optional()
7944
- }).extend({ leaseId: string().min(1) });
7923
+ });
7924
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7945
7925
  /** The independently selectable logical storage classes. `recordings`
7946
7926
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7947
7927
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8236,7 +8216,26 @@ var LabelDefinitionSchema = object({
8236
8216
  description: string().optional(),
8237
8217
  icon: string().optional()
8238
8218
  });
8239
- var ClassMapDefinitionSchema = object({
8219
+ /**
8220
+ * Wire schema for a per-model CATALOG classMap override
8221
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8222
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8223
+ * detection pipeline executor actually routes.
8224
+ *
8225
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8226
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8227
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8228
+ * enum) — the two used to share the name `ClassMapDefinition`/
8229
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8230
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8231
+ * are not: it is two different concepts colliding on a name. Keep this type
8232
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8233
+ * would either narrow every `ClassMapDefinition` consumer to the four
8234
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8235
+ * schema exists for (see the "rejects a classMap whose target is not a
8236
+ * detection macro" test in `model-catalog-schema.test.ts`).
8237
+ */
8238
+ var DetectionCatalogClassMapSchema = object({
8240
8239
  mapping: record(string(), _enum([
8241
8240
  "person",
8242
8241
  "vehicle",
@@ -8441,7 +8440,7 @@ var ModelCatalogEntrySchema = object({
8441
8440
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8442
8441
  * labels already ARE the CamStack macros (Scrypted identity map).
8443
8442
  */
8444
- classMap: ClassMapDefinitionSchema.optional()
8443
+ classMap: DetectionCatalogClassMapSchema.optional()
8445
8444
  });
8446
8445
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8447
8446
  format: literal("openvino"),
@@ -8471,7 +8470,7 @@ var ModelConvertMetadataSchema = object({
8471
8470
  "segmentation"
8472
8471
  ]),
8473
8472
  faceAlignment: boolean().optional(),
8474
- classMap: ClassMapDefinitionSchema.optional()
8473
+ classMap: DetectionCatalogClassMapSchema.optional()
8475
8474
  });
8476
8475
  var ConvertResultSchema = object({
8477
8476
  entry: ModelCatalogEntrySchema,
@@ -9334,7 +9333,7 @@ var AddonPageDeclarationSchema = object({
9334
9333
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9335
9334
  sectionLabel: string().optional()
9336
9335
  });
9337
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9336
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9338
9337
  var AddonHttpRouteSchema = object({
9339
9338
  method: _enum([
9340
9339
  "GET",
@@ -9569,7 +9568,7 @@ var WidgetMetadataSchema = object({
9569
9568
  defaultColumns: number$1().int().min(1).max(12).default(6),
9570
9569
  defaultRows: number$1().int().min(1).max(12).default(1)
9571
9570
  });
9572
- method(_void(), array(WidgetMetadataSchema).readonly());
9571
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9573
9572
  /**
9574
9573
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9575
9574
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11091,7 +11090,7 @@ var CustomModelDescriptorSchema = object({
11091
11090
  stepId: string(),
11092
11091
  entry: ModelCatalogEntrySchema
11093
11092
  });
11094
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11093
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11095
11094
  /**
11096
11095
  * Query filter for settings-store collections.
11097
11096
  */
@@ -11178,7 +11177,8 @@ method(object({
11178
11177
  }), _void(), { kind: "mutation" }), method(object({
11179
11178
  namespace: string().optional(),
11180
11179
  collection: string(),
11181
- filter: QueryFilterSchema.optional()
11180
+ filter: QueryFilterSchema.optional(),
11181
+ columns: array(string()).readonly().optional()
11182
11182
  }), array(SettingsRecordSchema).readonly()), method(object({
11183
11183
  namespace: string().optional(),
11184
11184
  collection: string(),
@@ -11241,46 +11241,87 @@ var EngineInfoSchema = object({
11241
11241
  kind: _enum(["relational", "vector"]),
11242
11242
  displayName: string()
11243
11243
  });
11244
- method(_void(), EngineInfoSchema), method(object({
11244
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11245
11245
  namespace: string().optional(),
11246
11246
  collection: string(),
11247
11247
  key: string()
11248
- }), unknown()), method(object({
11248
+ }), unknown(), { auth: "admin" }), method(object({
11249
11249
  namespace: string().optional(),
11250
11250
  collection: string(),
11251
11251
  key: string(),
11252
11252
  value: unknown()
11253
- }), _void(), { kind: "mutation" }), method(object({
11253
+ }), _void(), {
11254
+ kind: "mutation",
11255
+ auth: "admin"
11256
+ }), method(object({
11254
11257
  namespace: string().optional(),
11255
11258
  collection: string(),
11256
- filter: QueryFilterSchema.optional()
11257
- }), array(SettingsRecordSchema).readonly()), method(object({
11259
+ filter: QueryFilterSchema.optional(),
11260
+ /**
11261
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11262
+ *
11263
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11264
+ * was wrong — corrected 2026-08-26 after the hop map
11265
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11266
+ * There is **no Zod parse at all** between the door and the engine: the
11267
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11268
+ * field declared here reaches `SqliteSettingsBackend` either way.
11269
+ *
11270
+ * What actually lost `columns` was the THIRD declaration of this shape:
11271
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11272
+ * interface the engine destructures from. The field existed on both
11273
+ * schemas and the engine still never read it, because nothing checks a
11274
+ * registered provider against `InferProvider<cap>` —
11275
+ * `ProviderRegistration.provider` is typed `object`.
11276
+ *
11277
+ * It is declared here anyway, and must stay in step with
11278
+ * `settings-store.query`: a caller reading only the cap definitions has
11279
+ * to be able to see that this call carries a projection.
11280
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11281
+ */
11282
+ columns: array(string()).readonly().optional()
11283
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11258
11284
  namespace: string().optional(),
11259
11285
  collection: string(),
11260
11286
  record: SettingsRecordSchema
11261
- }), _void(), { kind: "mutation" }), method(object({
11287
+ }), _void(), {
11288
+ kind: "mutation",
11289
+ auth: "admin"
11290
+ }), method(object({
11262
11291
  namespace: string().optional(),
11263
11292
  collection: string(),
11264
11293
  id: string(),
11265
11294
  data: record(string(), unknown())
11266
- }), _void(), { kind: "mutation" }), method(object({
11295
+ }), _void(), {
11296
+ kind: "mutation",
11297
+ auth: "admin"
11298
+ }), method(object({
11267
11299
  namespace: string().optional(),
11268
11300
  collection: string(),
11269
11301
  key: string()
11270
- }), _void(), { kind: "mutation" }), method(object({
11302
+ }), _void(), {
11303
+ kind: "mutation",
11304
+ auth: "admin"
11305
+ }), method(object({
11271
11306
  namespace: string().optional(),
11272
11307
  collection: string(),
11273
11308
  filter: MutationFilterSchema
11274
- }), object({ deleted: number$1().int() }), { kind: "mutation" }), method(object({
11309
+ }), object({ deleted: number$1().int() }), {
11310
+ kind: "mutation",
11311
+ auth: "admin"
11312
+ }), method(object({
11275
11313
  namespace: string().optional(),
11276
11314
  collection: string(),
11277
11315
  filter: MutationFilterSchema,
11278
11316
  data: record(string(), unknown())
11279
- }), object({ updated: number$1().int() }), { kind: "mutation" }), method(object({
11317
+ }), object({ updated: number$1().int() }), {
11318
+ kind: "mutation",
11319
+ auth: "admin"
11320
+ }), method(object({
11280
11321
  namespace: string().optional(),
11281
11322
  collection: string(),
11282
11323
  filter: QueryFilterSchema.optional()
11283
- }), number$1()), method(object({
11324
+ }), number$1(), { auth: "admin" }), method(object({
11284
11325
  namespace: string().optional(),
11285
11326
  collection: string(),
11286
11327
  field: string(),
@@ -11290,15 +11331,18 @@ method(_void(), EngineInfoSchema), method(object({
11290
11331
  }), array(object({
11291
11332
  bucket: number$1().int(),
11292
11333
  count: number$1().int()
11293
- })).readonly()), method(object({
11334
+ })).readonly(), { auth: "admin" }), method(object({
11294
11335
  namespace: string().optional(),
11295
11336
  collection: string()
11296
- }), boolean()), method(object({
11337
+ }), boolean(), { auth: "admin" }), method(object({
11297
11338
  namespace: string().optional(),
11298
11339
  collection: string(),
11299
11340
  columns: array(CollectionColumnSchema).readonly(),
11300
11341
  indexes: array(CollectionIndexSchema).readonly().optional()
11301
- }), _void(), { kind: "mutation" });
11342
+ }), _void(), {
11343
+ kind: "mutation",
11344
+ auth: "admin"
11345
+ });
11302
11346
  /**
11303
11347
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11304
11348
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12426,7 +12470,7 @@ method(object({
12426
12470
  crop: _instanceof(Uint8Array),
12427
12471
  width: number$1(),
12428
12472
  height: number$1()
12429
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12473
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12430
12474
  /**
12431
12475
  * filesystem-browse — per-node capability for browsing the node's local
12432
12476
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12738,12 +12782,28 @@ var llmRuntimeCapability = {
12738
12782
  mode: "singleton",
12739
12783
  internal: true,
12740
12784
  methods: {
12785
+ /**
12786
+ * `complete`, `status`, `listLocalModels` and `getDiskUsage` had NO
12787
+ * `auth` override — `internal: true` did not gate the mount (see the
12788
+ * 2026-08-26 note on `data-store-provider`), so they were reachable on
12789
+ * the AppRouter by ANY authenticated session at the default
12790
+ * `auth: 'protected'`, inconsistent with the rest of this cap (already
12791
+ * `auth: 'admin'`) and with this file's own docblock: "the operator
12792
+ * reaches this only through the `llm` cap's methods." The sole caller,
12793
+ * `addon-ai`'s `runtime-client.ts`, reaches every method here via
12794
+ * `ctx.api` + `nodePin` — never tRPC — so `auth: 'admin'` costs it
12795
+ * nothing; the public `llm` cap (which end users and non-admin sessions
12796
+ * legitimately call for chat/generation) is untouched.
12797
+ */
12741
12798
  complete: method(LlmGenerateBaseInputSchema.extend({
12742
12799
  images: array(LlmImageSchema).optional(),
12743
12800
  runtime: ManagedRuntimeConfigSchema,
12744
12801
  /** The managed profile's timeout, threaded by the hub provider. */
12745
12802
  timeoutMs: number$1().int().positive().optional()
12746
- }), LlmGenerateResultSchema, { kind: "mutation" }),
12803
+ }), LlmGenerateResultSchema, {
12804
+ kind: "mutation",
12805
+ auth: "admin"
12806
+ }),
12747
12807
  ensureStarted: method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12748
12808
  kind: "mutation",
12749
12809
  auth: "admin"
@@ -12752,7 +12812,7 @@ var llmRuntimeCapability = {
12752
12812
  kind: "mutation",
12753
12813
  auth: "admin"
12754
12814
  }),
12755
- status: method(object({}), LlmRuntimeStatusSchema),
12815
+ status: method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }),
12756
12816
  installModel: method(object({ model: ManagedModelRefSchema }), _void(), {
12757
12817
  kind: "mutation",
12758
12818
  auth: "admin"
@@ -12761,8 +12821,8 @@ var llmRuntimeCapability = {
12761
12821
  kind: "mutation",
12762
12822
  auth: "admin"
12763
12823
  }),
12764
- listLocalModels: method(object({}), array(LlmNodeModelSchema)),
12765
- getDiskUsage: method(object({}), LlmRuntimeDiskUsageSchema)
12824
+ listLocalModels: method(object({}), array(LlmNodeModelSchema), { auth: "admin" }),
12825
+ getDiskUsage: method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" })
12766
12826
  }
12767
12827
  };
12768
12828
  /**
@@ -16285,7 +16345,7 @@ var OauthIntegrationDescriptorSchema = object({
16285
16345
  */
16286
16346
  refreshTokenTtlSec: union([number$1().int().positive(), literal("never")]).optional()
16287
16347
  });
16288
- method(_void(), OauthIntegrationDescriptorSchema);
16348
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16289
16349
  /**
16290
16350
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16291
16351
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17480,6 +17540,15 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
17480
17540
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17481
17541
  kind: "mutation",
17482
17542
  auth: "admin"
17543
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17544
+ kind: "mutation",
17545
+ auth: "admin"
17546
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17547
+ kind: "query",
17548
+ auth: "admin"
17549
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17550
+ kind: "mutation",
17551
+ auth: "admin"
17483
17552
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17484
17553
  kind: "query",
17485
17554
  auth: "admin"
@@ -17634,6 +17703,11 @@ object({
17634
17703
  "jpeg"
17635
17704
  ])
17636
17705
  });
17706
+ /**
17707
+ * Process-local frame identity. It is serializable so it can ride an in-process
17708
+ * capability call, but `registryId` deliberately prevents resolution in any
17709
+ * other process or execution group.
17710
+ */
17637
17711
  var FrameRefSchema = object({
17638
17712
  registryId: string().min(1),
17639
17713
  id: string().min(1),
@@ -19799,7 +19873,7 @@ method(object({
19799
19873
  * linking rather than produce an eternal token.
19800
19874
  */
19801
19875
  ttlSec: union([number$1().int().positive(), literal("never")]).optional()
19802
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19876
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19803
19877
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19804
19878
  providerId: string().min(1),
19805
19879
  displayName: string().min(1),
@@ -19894,10 +19968,13 @@ var EvictResultSchema = object({
19894
19968
  /** True when the provider has nothing left it is willing to drop on this location. */
19895
19969
  exhausted: boolean()
19896
19970
  });
19897
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19971
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19898
19972
  locationId: string(),
19899
19973
  targetBytes: number$1().int().positive()
19900
- }), EvictResultSchema, { kind: "mutation" });
19974
+ }), EvictResultSchema, {
19975
+ kind: "mutation",
19976
+ auth: "admin"
19977
+ });
19901
19978
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19902
19979
  kind: "mutation",
19903
19980
  auth: "admin"
@@ -19957,26 +20034,50 @@ var ReadChunkInputSchema = object({
19957
20034
  length: number$1()
19958
20035
  });
19959
20036
  var EndDownloadInputSchema = object({ downloadId: string() });
19960
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20037
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19961
20038
  location: StorageLocationSchema,
19962
20039
  relativePath: string()
19963
- }), string()), method(object({
20040
+ }), string(), { auth: "admin" }), method(object({
19964
20041
  location: StorageLocationSchema,
19965
20042
  relativePath: string(),
19966
20043
  data: _instanceof(Uint8Array)
19967
- }), _void(), { kind: "mutation" }), method(object({
20044
+ }), _void(), {
20045
+ kind: "mutation",
20046
+ auth: "admin"
20047
+ }), method(object({
19968
20048
  location: StorageLocationSchema,
19969
20049
  relativePath: string()
19970
- }), _instanceof(Uint8Array)), method(object({
20050
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19971
20051
  location: StorageLocationSchema,
19972
20052
  relativePath: string()
19973
- }), boolean()), method(object({
20053
+ }), boolean(), { auth: "admin" }), method(object({
19974
20054
  location: StorageLocationSchema,
19975
20055
  prefix: string().optional()
19976
- }), array(string()).readonly()), method(object({
20056
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19977
20057
  location: StorageLocationSchema,
19978
20058
  relativePath: string()
19979
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number$1().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" });
20059
+ }), _void(), {
20060
+ kind: "mutation",
20061
+ auth: "admin"
20062
+ }), method(object({ location: StorageLocationSchema }), number$1().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20063
+ kind: "mutation",
20064
+ auth: "admin"
20065
+ }), method(WriteChunkInputSchema, _void(), {
20066
+ kind: "mutation",
20067
+ auth: "admin"
20068
+ }), method(FinalizeUploadInputSchema, _void(), {
20069
+ kind: "mutation",
20070
+ auth: "admin"
20071
+ }), method(AbortUploadInputSchema, _void(), {
20072
+ kind: "mutation",
20073
+ auth: "admin"
20074
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20075
+ kind: "mutation",
20076
+ auth: "admin"
20077
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20078
+ kind: "mutation",
20079
+ auth: "admin"
20080
+ });
19980
20081
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19981
20082
  var ProfileSettingsSchemaBridge = unknown().nullable();
19982
20083
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20234,7 +20335,8 @@ method(object({
20234
20335
  access: "create"
20235
20336
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20236
20337
  kind: "mutation",
20237
- access: "view"
20338
+ access: "view",
20339
+ auth: "admin"
20238
20340
  }), method(object({
20239
20341
  /** Required — the user the assertion belongs to (verified). */
20240
20342
  userId: string(),
@@ -20242,10 +20344,12 @@ method(object({
20242
20344
  response: record(string(), unknown())
20243
20345
  }), object({ verified: boolean() }), {
20244
20346
  kind: "mutation",
20245
- access: "view"
20347
+ access: "view",
20348
+ auth: "admin"
20246
20349
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20247
20350
  kind: "mutation",
20248
- access: "view"
20351
+ access: "view",
20352
+ auth: "admin"
20249
20353
  }), method(object({
20250
20354
  /** AuthenticationResponseJSON from the browser. */
20251
20355
  response: record(string(), unknown()) }), object({
@@ -20253,7 +20357,8 @@ response: record(string(), unknown()) }), object({
20253
20357
  userId: string().nullable()
20254
20358
  }), {
20255
20359
  kind: "mutation",
20256
- access: "view"
20360
+ access: "view",
20361
+ auth: "admin"
20257
20362
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20258
20363
  userId: string(),
20259
20364
  credentialId: string()
@@ -20425,7 +20530,19 @@ var VectorStatsResultSchema = object({
20425
20530
  /** False when the backend ranks approximately. */
20426
20531
  exact: boolean()
20427
20532
  });
20428
- 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);
20533
+ method(VectorDeclareIndexInputSchema, _void(), {
20534
+ kind: "mutation",
20535
+ auth: "admin"
20536
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20537
+ kind: "mutation",
20538
+ auth: "admin"
20539
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20540
+ kind: "mutation",
20541
+ auth: "admin"
20542
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20543
+ kind: "mutation",
20544
+ auth: "admin"
20545
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20429
20546
  var ClipSchema = object({
20430
20547
  /** Opaque, provider-namespaced id. The default provider encodes the time
20431
20548
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22148,7 +22265,27 @@ var MediaFileLiteSchema$1 = object({
22148
22265
  sizeBytes: number$1(),
22149
22266
  timestamp: number$1()
22150
22267
  });
22151
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22268
+ method(object({
22269
+ /**
22270
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22271
+ *
22272
+ * Default `false`, the same inversion `listRecentFaces` and
22273
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22274
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22275
+ * on the live hub the same day: four identities cost 40,979 B with the
22276
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22277
+ * four times and the viewer holds at `staleTime: 30_000`.
22278
+ *
22279
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22280
+ * the `event-media` plane serves that key `immutable` with an ETag.
22281
+ *
22282
+ * **This is an INPUT field, so it does not reach the addon until the
22283
+ * next train** — the hub router validates cap inputs against its own
22284
+ * compiled Zod and strips a key it does not know. Until then the
22285
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22286
+ * is what ships, and the opt-in becomes reachable when the train lands.
22287
+ */
22288
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22152
22289
  kind: "mutation",
22153
22290
  auth: "admin"
22154
22291
  }), method(object({
@@ -24295,8 +24432,10 @@ var PlateInfoSchema = object({
24295
24432
  keyFrameMediaKey: string().optional(),
24296
24433
  base64: string().optional(),
24297
24434
  /**
24298
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24299
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24435
+ * Same crop as a data-plane URL, always present when the plate has a stored
24436
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24437
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24438
+ * left at its `true` default.
24300
24439
  */
24301
24440
  cropUrl: string().optional()
24302
24441
  });
@@ -24316,14 +24455,34 @@ var PlateClusterSchema = object({
24316
24455
  });
24317
24456
  method(object({
24318
24457
  deviceId: number$1().int().optional(),
24319
- limit: number$1().int().positive().optional()
24458
+ limit: number$1().int().positive().optional(),
24459
+ /**
24460
+ * Inline the base64 crop on every row. Default `true` — the existing
24461
+ * behaviour, kept so no caller breaks.
24462
+ *
24463
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24464
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24465
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24466
+ * metadata without them — and the browser then caches the images.
24467
+ *
24468
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24469
+ * plates were the one gallery list left without it.
24470
+ *
24471
+ * **This is an INPUT field, so it does not reach the addon until the
24472
+ * next train.** The hub router validates cap inputs against its own
24473
+ * compiled Zod and strips a key it does not know. Until the train
24474
+ * ships, sending `false` is harmless and keeps the crops inline.
24475
+ */
24476
+ includeCrops: boolean().optional()
24320
24477
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24321
24478
  deviceId: number$1().int(),
24322
24479
  trackId: string()
24323
24480
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24324
24481
  text: string().min(1),
24325
24482
  maxDistance: number$1().int().min(0).optional(),
24326
- limit: number$1().int().positive().optional()
24483
+ limit: number$1().int().positive().optional(),
24484
+ /** See `listPlates.includeCrops`. Default `true`. */
24485
+ includeCrops: boolean().optional()
24327
24486
  }), array(PlateInfoSchema).readonly()), method(object({
24328
24487
  maxDistance: number$1().int().min(0).optional(),
24329
24488
  minClusterSize: number$1().int().min(2).optional(),
@@ -24337,7 +24496,13 @@ method(object({
24337
24496
  }), method(object({ plateId: string() }), _void(), {
24338
24497
  kind: "mutation",
24339
24498
  auth: "admin"
24340
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24499
+ }), method(object({
24500
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24501
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24502
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24503
+ * INPUT field: stripped by the hub router until the train ships, which
24504
+ * resolves to `false` and is exactly the intended default. */
24505
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24341
24506
  kind: "mutation",
24342
24507
  auth: "admin"
24343
24508
  }), method(object({
@@ -29714,6 +29879,12 @@ Object.freeze({
29714
29879
  addonId: null,
29715
29880
  access: "create"
29716
29881
  },
29882
+ "pipelineAnalytics.cancelRelocateMedia": {
29883
+ capName: "pipeline-analytics",
29884
+ capScope: "device",
29885
+ addonId: null,
29886
+ access: "create"
29887
+ },
29717
29888
  "pipelineAnalytics.cancelStorageMigrationMove": {
29718
29889
  capName: "pipeline-analytics",
29719
29890
  capScope: "device",
@@ -29888,6 +30059,12 @@ Object.freeze({
29888
30059
  addonId: null,
29889
30060
  access: "view"
29890
30061
  },
30062
+ "pipelineAnalytics.listRelocateMediaJobs": {
30063
+ capName: "pipeline-analytics",
30064
+ capScope: "device",
30065
+ addonId: null,
30066
+ access: "view"
30067
+ },
29891
30068
  "pipelineAnalytics.listRetrainAnnotations": {
29892
30069
  capName: "pipeline-analytics",
29893
30070
  capScope: "device",
@@ -29966,6 +30143,12 @@ Object.freeze({
29966
30143
  addonId: null,
29967
30144
  access: "create"
29968
30145
  },
30146
+ "pipelineAnalytics.relocateMedia": {
30147
+ capName: "pipeline-analytics",
30148
+ capScope: "device",
30149
+ addonId: null,
30150
+ access: "create"
30151
+ },
29969
30152
  "pipelineAnalytics.restageRetrainTrack": {
29970
30153
  capName: "pipeline-analytics",
29971
30154
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -6878,7 +6878,7 @@ function method(input, output, options) {
6878
6878
  input,
6879
6879
  output,
6880
6880
  kind: options?.kind ?? "query",
6881
- auth: options?.auth ?? "protected",
6881
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6882
6882
  ...options?.access !== void 0 ? { access: options.access } : {},
6883
6883
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6884
6884
  timeoutMs: options?.timeoutMs
@@ -6898,7 +6898,7 @@ function systemMethod(input, output, options) {
6898
6898
  }
6899
6899
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6900
6900
  var VersionOutputSchema$1 = object({ version: string() });
6901
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6901
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6902
6902
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6903
6903
  DeviceType["Camera"] = "camera";
6904
6904
  DeviceType["Hub"] = "hub";
@@ -7219,7 +7219,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7219
7219
  }({});
7220
7220
  var StaticDirOutputSchema = object({ staticDir: string() });
7221
7221
  var VersionOutputSchema = object({ version: string() });
7222
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7222
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7223
7223
  /**
7224
7224
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7225
7225
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7833,24 +7833,6 @@ var RecordingRetentionSchema = object({
7833
7833
  maxSizeGb: number$1().min(0).optional()
7834
7834
  });
7835
7835
  /**
7836
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7837
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7838
- * previews at. Five graduated steps; absent on a config = `standard` (the
7839
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7840
- *
7841
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7842
- * Each window's index sidecar carries its own tile dims, so a camera whose
7843
- * preset changed over time renders every historical window at the dims it was
7844
- * written with.
7845
- */
7846
- var ScrubThumbnailPresetSchema = _enum([
7847
- "minimal",
7848
- "low",
7849
- "standard",
7850
- "high",
7851
- "max"
7852
- ]);
7853
- /**
7854
7836
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7855
7837
  *
7856
7838
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7858,7 +7840,11 @@ var ScrubThumbnailPresetSchema = _enum([
7858
7840
  * other field is a storage knob (profiles, segment length, retention, scrub).
7859
7841
  *
7860
7842
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7861
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7843
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7844
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7845
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7846
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7847
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7862
7848
  * A stale caller must fail loudly — silently stripping its legacy intent would
7863
7849
  * persist a band-less config, i.e. silently stop recording the camera.
7864
7850
  */
@@ -7881,14 +7867,7 @@ var RecordingConfigSchema = object({
7881
7867
  * "off" is the absence of a covering band, never a band value.
7882
7868
  */
7883
7869
  bands: array(RecordingBandSchema).default([]),
7884
- retention: RecordingRetentionSchema.optional(),
7885
- /**
7886
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7887
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7888
- * windows only — existing sheets are immutable, and each window's index
7889
- * carries its own tile dims so mixed-preset history renders correctly.
7890
- */
7891
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7870
+ retention: RecordingRetentionSchema.optional()
7892
7871
  }).strict();
7893
7872
  /**
7894
7873
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7964,10 +7943,11 @@ var RelocateFootageInputSchema = object({
7964
7943
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7965
7944
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7966
7945
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7967
- var StorageMigrationMediaMoveInputSchema = object({
7946
+ var RelocateMediaInputSchema = object({
7968
7947
  toLocationId: string(),
7969
7948
  throttleMbps: number$1().min(1).max(1e3).optional()
7970
- }).extend({ leaseId: string().min(1) });
7949
+ });
7950
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7971
7951
  /** The independently selectable logical storage classes. `recordings`
7972
7952
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7973
7953
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8262,7 +8242,26 @@ var LabelDefinitionSchema = object({
8262
8242
  description: string().optional(),
8263
8243
  icon: string().optional()
8264
8244
  });
8265
- var ClassMapDefinitionSchema = object({
8245
+ /**
8246
+ * Wire schema for a per-model CATALOG classMap override
8247
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8248
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8249
+ * detection pipeline executor actually routes.
8250
+ *
8251
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8252
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8253
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8254
+ * enum) — the two used to share the name `ClassMapDefinition`/
8255
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8256
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8257
+ * are not: it is two different concepts colliding on a name. Keep this type
8258
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8259
+ * would either narrow every `ClassMapDefinition` consumer to the four
8260
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8261
+ * schema exists for (see the "rejects a classMap whose target is not a
8262
+ * detection macro" test in `model-catalog-schema.test.ts`).
8263
+ */
8264
+ var DetectionCatalogClassMapSchema = object({
8266
8265
  mapping: record(string(), _enum([
8267
8266
  "person",
8268
8267
  "vehicle",
@@ -8467,7 +8466,7 @@ var ModelCatalogEntrySchema = object({
8467
8466
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8468
8467
  * labels already ARE the CamStack macros (Scrypted identity map).
8469
8468
  */
8470
- classMap: ClassMapDefinitionSchema.optional()
8469
+ classMap: DetectionCatalogClassMapSchema.optional()
8471
8470
  });
8472
8471
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8473
8472
  format: literal("openvino"),
@@ -8497,7 +8496,7 @@ var ModelConvertMetadataSchema = object({
8497
8496
  "segmentation"
8498
8497
  ]),
8499
8498
  faceAlignment: boolean().optional(),
8500
- classMap: ClassMapDefinitionSchema.optional()
8499
+ classMap: DetectionCatalogClassMapSchema.optional()
8501
8500
  });
8502
8501
  var ConvertResultSchema = object({
8503
8502
  entry: ModelCatalogEntrySchema,
@@ -9360,7 +9359,7 @@ var AddonPageDeclarationSchema = object({
9360
9359
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9361
9360
  sectionLabel: string().optional()
9362
9361
  });
9363
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9362
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9364
9363
  var AddonHttpRouteSchema = object({
9365
9364
  method: _enum([
9366
9365
  "GET",
@@ -9595,7 +9594,7 @@ var WidgetMetadataSchema = object({
9595
9594
  defaultColumns: number$1().int().min(1).max(12).default(6),
9596
9595
  defaultRows: number$1().int().min(1).max(12).default(1)
9597
9596
  });
9598
- method(_void(), array(WidgetMetadataSchema).readonly());
9597
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9599
9598
  /**
9600
9599
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9601
9600
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11117,7 +11116,7 @@ var CustomModelDescriptorSchema = object({
11117
11116
  stepId: string(),
11118
11117
  entry: ModelCatalogEntrySchema
11119
11118
  });
11120
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11119
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11121
11120
  /**
11122
11121
  * Query filter for settings-store collections.
11123
11122
  */
@@ -11204,7 +11203,8 @@ method(object({
11204
11203
  }), _void(), { kind: "mutation" }), method(object({
11205
11204
  namespace: string().optional(),
11206
11205
  collection: string(),
11207
- filter: QueryFilterSchema.optional()
11206
+ filter: QueryFilterSchema.optional(),
11207
+ columns: array(string()).readonly().optional()
11208
11208
  }), array(SettingsRecordSchema).readonly()), method(object({
11209
11209
  namespace: string().optional(),
11210
11210
  collection: string(),
@@ -11267,46 +11267,87 @@ var EngineInfoSchema = object({
11267
11267
  kind: _enum(["relational", "vector"]),
11268
11268
  displayName: string()
11269
11269
  });
11270
- method(_void(), EngineInfoSchema), method(object({
11270
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11271
11271
  namespace: string().optional(),
11272
11272
  collection: string(),
11273
11273
  key: string()
11274
- }), unknown()), method(object({
11274
+ }), unknown(), { auth: "admin" }), method(object({
11275
11275
  namespace: string().optional(),
11276
11276
  collection: string(),
11277
11277
  key: string(),
11278
11278
  value: unknown()
11279
- }), _void(), { kind: "mutation" }), method(object({
11279
+ }), _void(), {
11280
+ kind: "mutation",
11281
+ auth: "admin"
11282
+ }), method(object({
11280
11283
  namespace: string().optional(),
11281
11284
  collection: string(),
11282
- filter: QueryFilterSchema.optional()
11283
- }), array(SettingsRecordSchema).readonly()), method(object({
11285
+ filter: QueryFilterSchema.optional(),
11286
+ /**
11287
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11288
+ *
11289
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11290
+ * was wrong — corrected 2026-08-26 after the hop map
11291
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11292
+ * There is **no Zod parse at all** between the door and the engine: the
11293
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11294
+ * field declared here reaches `SqliteSettingsBackend` either way.
11295
+ *
11296
+ * What actually lost `columns` was the THIRD declaration of this shape:
11297
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11298
+ * interface the engine destructures from. The field existed on both
11299
+ * schemas and the engine still never read it, because nothing checks a
11300
+ * registered provider against `InferProvider<cap>` —
11301
+ * `ProviderRegistration.provider` is typed `object`.
11302
+ *
11303
+ * It is declared here anyway, and must stay in step with
11304
+ * `settings-store.query`: a caller reading only the cap definitions has
11305
+ * to be able to see that this call carries a projection.
11306
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11307
+ */
11308
+ columns: array(string()).readonly().optional()
11309
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11284
11310
  namespace: string().optional(),
11285
11311
  collection: string(),
11286
11312
  record: SettingsRecordSchema
11287
- }), _void(), { kind: "mutation" }), method(object({
11313
+ }), _void(), {
11314
+ kind: "mutation",
11315
+ auth: "admin"
11316
+ }), method(object({
11288
11317
  namespace: string().optional(),
11289
11318
  collection: string(),
11290
11319
  id: string(),
11291
11320
  data: record(string(), unknown())
11292
- }), _void(), { kind: "mutation" }), method(object({
11321
+ }), _void(), {
11322
+ kind: "mutation",
11323
+ auth: "admin"
11324
+ }), method(object({
11293
11325
  namespace: string().optional(),
11294
11326
  collection: string(),
11295
11327
  key: string()
11296
- }), _void(), { kind: "mutation" }), method(object({
11328
+ }), _void(), {
11329
+ kind: "mutation",
11330
+ auth: "admin"
11331
+ }), method(object({
11297
11332
  namespace: string().optional(),
11298
11333
  collection: string(),
11299
11334
  filter: MutationFilterSchema
11300
- }), object({ deleted: number$1().int() }), { kind: "mutation" }), method(object({
11335
+ }), object({ deleted: number$1().int() }), {
11336
+ kind: "mutation",
11337
+ auth: "admin"
11338
+ }), method(object({
11301
11339
  namespace: string().optional(),
11302
11340
  collection: string(),
11303
11341
  filter: MutationFilterSchema,
11304
11342
  data: record(string(), unknown())
11305
- }), object({ updated: number$1().int() }), { kind: "mutation" }), method(object({
11343
+ }), object({ updated: number$1().int() }), {
11344
+ kind: "mutation",
11345
+ auth: "admin"
11346
+ }), method(object({
11306
11347
  namespace: string().optional(),
11307
11348
  collection: string(),
11308
11349
  filter: QueryFilterSchema.optional()
11309
- }), number$1()), method(object({
11350
+ }), number$1(), { auth: "admin" }), method(object({
11310
11351
  namespace: string().optional(),
11311
11352
  collection: string(),
11312
11353
  field: string(),
@@ -11316,15 +11357,18 @@ method(_void(), EngineInfoSchema), method(object({
11316
11357
  }), array(object({
11317
11358
  bucket: number$1().int(),
11318
11359
  count: number$1().int()
11319
- })).readonly()), method(object({
11360
+ })).readonly(), { auth: "admin" }), method(object({
11320
11361
  namespace: string().optional(),
11321
11362
  collection: string()
11322
- }), boolean()), method(object({
11363
+ }), boolean(), { auth: "admin" }), method(object({
11323
11364
  namespace: string().optional(),
11324
11365
  collection: string(),
11325
11366
  columns: array(CollectionColumnSchema).readonly(),
11326
11367
  indexes: array(CollectionIndexSchema).readonly().optional()
11327
- }), _void(), { kind: "mutation" });
11368
+ }), _void(), {
11369
+ kind: "mutation",
11370
+ auth: "admin"
11371
+ });
11328
11372
  /**
11329
11373
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11330
11374
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12452,7 +12496,7 @@ method(object({
12452
12496
  crop: _instanceof(Uint8Array),
12453
12497
  width: number$1(),
12454
12498
  height: number$1()
12455
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12499
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12456
12500
  /**
12457
12501
  * filesystem-browse — per-node capability for browsing the node's local
12458
12502
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12764,12 +12808,28 @@ var llmRuntimeCapability = {
12764
12808
  mode: "singleton",
12765
12809
  internal: true,
12766
12810
  methods: {
12811
+ /**
12812
+ * `complete`, `status`, `listLocalModels` and `getDiskUsage` had NO
12813
+ * `auth` override — `internal: true` did not gate the mount (see the
12814
+ * 2026-08-26 note on `data-store-provider`), so they were reachable on
12815
+ * the AppRouter by ANY authenticated session at the default
12816
+ * `auth: 'protected'`, inconsistent with the rest of this cap (already
12817
+ * `auth: 'admin'`) and with this file's own docblock: "the operator
12818
+ * reaches this only through the `llm` cap's methods." The sole caller,
12819
+ * `addon-ai`'s `runtime-client.ts`, reaches every method here via
12820
+ * `ctx.api` + `nodePin` — never tRPC — so `auth: 'admin'` costs it
12821
+ * nothing; the public `llm` cap (which end users and non-admin sessions
12822
+ * legitimately call for chat/generation) is untouched.
12823
+ */
12767
12824
  complete: method(LlmGenerateBaseInputSchema.extend({
12768
12825
  images: array(LlmImageSchema).optional(),
12769
12826
  runtime: ManagedRuntimeConfigSchema,
12770
12827
  /** The managed profile's timeout, threaded by the hub provider. */
12771
12828
  timeoutMs: number$1().int().positive().optional()
12772
- }), LlmGenerateResultSchema, { kind: "mutation" }),
12829
+ }), LlmGenerateResultSchema, {
12830
+ kind: "mutation",
12831
+ auth: "admin"
12832
+ }),
12773
12833
  ensureStarted: method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12774
12834
  kind: "mutation",
12775
12835
  auth: "admin"
@@ -12778,7 +12838,7 @@ var llmRuntimeCapability = {
12778
12838
  kind: "mutation",
12779
12839
  auth: "admin"
12780
12840
  }),
12781
- status: method(object({}), LlmRuntimeStatusSchema),
12841
+ status: method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }),
12782
12842
  installModel: method(object({ model: ManagedModelRefSchema }), _void(), {
12783
12843
  kind: "mutation",
12784
12844
  auth: "admin"
@@ -12787,8 +12847,8 @@ var llmRuntimeCapability = {
12787
12847
  kind: "mutation",
12788
12848
  auth: "admin"
12789
12849
  }),
12790
- listLocalModels: method(object({}), array(LlmNodeModelSchema)),
12791
- getDiskUsage: method(object({}), LlmRuntimeDiskUsageSchema)
12850
+ listLocalModels: method(object({}), array(LlmNodeModelSchema), { auth: "admin" }),
12851
+ getDiskUsage: method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" })
12792
12852
  }
12793
12853
  };
12794
12854
  /**
@@ -16311,7 +16371,7 @@ var OauthIntegrationDescriptorSchema = object({
16311
16371
  */
16312
16372
  refreshTokenTtlSec: union([number$1().int().positive(), literal("never")]).optional()
16313
16373
  });
16314
- method(_void(), OauthIntegrationDescriptorSchema);
16374
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16315
16375
  /**
16316
16376
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16317
16377
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17506,6 +17566,15 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
17506
17566
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17507
17567
  kind: "mutation",
17508
17568
  auth: "admin"
17569
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17570
+ kind: "mutation",
17571
+ auth: "admin"
17572
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17573
+ kind: "query",
17574
+ auth: "admin"
17575
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17576
+ kind: "mutation",
17577
+ auth: "admin"
17509
17578
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17510
17579
  kind: "query",
17511
17580
  auth: "admin"
@@ -17660,6 +17729,11 @@ object({
17660
17729
  "jpeg"
17661
17730
  ])
17662
17731
  });
17732
+ /**
17733
+ * Process-local frame identity. It is serializable so it can ride an in-process
17734
+ * capability call, but `registryId` deliberately prevents resolution in any
17735
+ * other process or execution group.
17736
+ */
17663
17737
  var FrameRefSchema = object({
17664
17738
  registryId: string().min(1),
17665
17739
  id: string().min(1),
@@ -19825,7 +19899,7 @@ method(object({
19825
19899
  * linking rather than produce an eternal token.
19826
19900
  */
19827
19901
  ttlSec: union([number$1().int().positive(), literal("never")]).optional()
19828
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19902
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19829
19903
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19830
19904
  providerId: string().min(1),
19831
19905
  displayName: string().min(1),
@@ -19920,10 +19994,13 @@ var EvictResultSchema = object({
19920
19994
  /** True when the provider has nothing left it is willing to drop on this location. */
19921
19995
  exhausted: boolean()
19922
19996
  });
19923
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19997
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19924
19998
  locationId: string(),
19925
19999
  targetBytes: number$1().int().positive()
19926
- }), EvictResultSchema, { kind: "mutation" });
20000
+ }), EvictResultSchema, {
20001
+ kind: "mutation",
20002
+ auth: "admin"
20003
+ });
19927
20004
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19928
20005
  kind: "mutation",
19929
20006
  auth: "admin"
@@ -19983,26 +20060,50 @@ var ReadChunkInputSchema = object({
19983
20060
  length: number$1()
19984
20061
  });
19985
20062
  var EndDownloadInputSchema = object({ downloadId: string() });
19986
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20063
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19987
20064
  location: StorageLocationSchema,
19988
20065
  relativePath: string()
19989
- }), string()), method(object({
20066
+ }), string(), { auth: "admin" }), method(object({
19990
20067
  location: StorageLocationSchema,
19991
20068
  relativePath: string(),
19992
20069
  data: _instanceof(Uint8Array)
19993
- }), _void(), { kind: "mutation" }), method(object({
20070
+ }), _void(), {
20071
+ kind: "mutation",
20072
+ auth: "admin"
20073
+ }), method(object({
19994
20074
  location: StorageLocationSchema,
19995
20075
  relativePath: string()
19996
- }), _instanceof(Uint8Array)), method(object({
20076
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19997
20077
  location: StorageLocationSchema,
19998
20078
  relativePath: string()
19999
- }), boolean()), method(object({
20079
+ }), boolean(), { auth: "admin" }), method(object({
20000
20080
  location: StorageLocationSchema,
20001
20081
  prefix: string().optional()
20002
- }), array(string()).readonly()), method(object({
20082
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20003
20083
  location: StorageLocationSchema,
20004
20084
  relativePath: string()
20005
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number$1().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" });
20085
+ }), _void(), {
20086
+ kind: "mutation",
20087
+ auth: "admin"
20088
+ }), method(object({ location: StorageLocationSchema }), number$1().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20089
+ kind: "mutation",
20090
+ auth: "admin"
20091
+ }), method(WriteChunkInputSchema, _void(), {
20092
+ kind: "mutation",
20093
+ auth: "admin"
20094
+ }), method(FinalizeUploadInputSchema, _void(), {
20095
+ kind: "mutation",
20096
+ auth: "admin"
20097
+ }), method(AbortUploadInputSchema, _void(), {
20098
+ kind: "mutation",
20099
+ auth: "admin"
20100
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20101
+ kind: "mutation",
20102
+ auth: "admin"
20103
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20104
+ kind: "mutation",
20105
+ auth: "admin"
20106
+ });
20006
20107
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20007
20108
  var ProfileSettingsSchemaBridge = unknown().nullable();
20008
20109
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20260,7 +20361,8 @@ method(object({
20260
20361
  access: "create"
20261
20362
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20262
20363
  kind: "mutation",
20263
- access: "view"
20364
+ access: "view",
20365
+ auth: "admin"
20264
20366
  }), method(object({
20265
20367
  /** Required — the user the assertion belongs to (verified). */
20266
20368
  userId: string(),
@@ -20268,10 +20370,12 @@ method(object({
20268
20370
  response: record(string(), unknown())
20269
20371
  }), object({ verified: boolean() }), {
20270
20372
  kind: "mutation",
20271
- access: "view"
20373
+ access: "view",
20374
+ auth: "admin"
20272
20375
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20273
20376
  kind: "mutation",
20274
- access: "view"
20377
+ access: "view",
20378
+ auth: "admin"
20275
20379
  }), method(object({
20276
20380
  /** AuthenticationResponseJSON from the browser. */
20277
20381
  response: record(string(), unknown()) }), object({
@@ -20279,7 +20383,8 @@ response: record(string(), unknown()) }), object({
20279
20383
  userId: string().nullable()
20280
20384
  }), {
20281
20385
  kind: "mutation",
20282
- access: "view"
20386
+ access: "view",
20387
+ auth: "admin"
20283
20388
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20284
20389
  userId: string(),
20285
20390
  credentialId: string()
@@ -20451,7 +20556,19 @@ var VectorStatsResultSchema = object({
20451
20556
  /** False when the backend ranks approximately. */
20452
20557
  exact: boolean()
20453
20558
  });
20454
- 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);
20559
+ method(VectorDeclareIndexInputSchema, _void(), {
20560
+ kind: "mutation",
20561
+ auth: "admin"
20562
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20563
+ kind: "mutation",
20564
+ auth: "admin"
20565
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20566
+ kind: "mutation",
20567
+ auth: "admin"
20568
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20569
+ kind: "mutation",
20570
+ auth: "admin"
20571
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20455
20572
  var ClipSchema = object({
20456
20573
  /** Opaque, provider-namespaced id. The default provider encodes the time
20457
20574
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22174,7 +22291,27 @@ var MediaFileLiteSchema$1 = object({
22174
22291
  sizeBytes: number$1(),
22175
22292
  timestamp: number$1()
22176
22293
  });
22177
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22294
+ method(object({
22295
+ /**
22296
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22297
+ *
22298
+ * Default `false`, the same inversion `listRecentFaces` and
22299
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22300
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22301
+ * on the live hub the same day: four identities cost 40,979 B with the
22302
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22303
+ * four times and the viewer holds at `staleTime: 30_000`.
22304
+ *
22305
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22306
+ * the `event-media` plane serves that key `immutable` with an ETag.
22307
+ *
22308
+ * **This is an INPUT field, so it does not reach the addon until the
22309
+ * next train** — the hub router validates cap inputs against its own
22310
+ * compiled Zod and strips a key it does not know. Until then the
22311
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22312
+ * is what ships, and the opt-in becomes reachable when the train lands.
22313
+ */
22314
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22178
22315
  kind: "mutation",
22179
22316
  auth: "admin"
22180
22317
  }), method(object({
@@ -24321,8 +24458,10 @@ var PlateInfoSchema = object({
24321
24458
  keyFrameMediaKey: string().optional(),
24322
24459
  base64: string().optional(),
24323
24460
  /**
24324
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24325
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24461
+ * Same crop as a data-plane URL, always present when the plate has a stored
24462
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24463
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24464
+ * left at its `true` default.
24326
24465
  */
24327
24466
  cropUrl: string().optional()
24328
24467
  });
@@ -24342,14 +24481,34 @@ var PlateClusterSchema = object({
24342
24481
  });
24343
24482
  method(object({
24344
24483
  deviceId: number$1().int().optional(),
24345
- limit: number$1().int().positive().optional()
24484
+ limit: number$1().int().positive().optional(),
24485
+ /**
24486
+ * Inline the base64 crop on every row. Default `true` — the existing
24487
+ * behaviour, kept so no caller breaks.
24488
+ *
24489
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24490
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24491
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24492
+ * metadata without them — and the browser then caches the images.
24493
+ *
24494
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24495
+ * plates were the one gallery list left without it.
24496
+ *
24497
+ * **This is an INPUT field, so it does not reach the addon until the
24498
+ * next train.** The hub router validates cap inputs against its own
24499
+ * compiled Zod and strips a key it does not know. Until the train
24500
+ * ships, sending `false` is harmless and keeps the crops inline.
24501
+ */
24502
+ includeCrops: boolean().optional()
24346
24503
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24347
24504
  deviceId: number$1().int(),
24348
24505
  trackId: string()
24349
24506
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24350
24507
  text: string().min(1),
24351
24508
  maxDistance: number$1().int().min(0).optional(),
24352
- limit: number$1().int().positive().optional()
24509
+ limit: number$1().int().positive().optional(),
24510
+ /** See `listPlates.includeCrops`. Default `true`. */
24511
+ includeCrops: boolean().optional()
24353
24512
  }), array(PlateInfoSchema).readonly()), method(object({
24354
24513
  maxDistance: number$1().int().min(0).optional(),
24355
24514
  minClusterSize: number$1().int().min(2).optional(),
@@ -24363,7 +24522,13 @@ method(object({
24363
24522
  }), method(object({ plateId: string() }), _void(), {
24364
24523
  kind: "mutation",
24365
24524
  auth: "admin"
24366
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24525
+ }), method(object({
24526
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24527
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24528
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24529
+ * INPUT field: stripped by the hub router until the train ships, which
24530
+ * resolves to `false` and is exactly the intended default. */
24531
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24367
24532
  kind: "mutation",
24368
24533
  auth: "admin"
24369
24534
  }), method(object({
@@ -29740,6 +29905,12 @@ Object.freeze({
29740
29905
  addonId: null,
29741
29906
  access: "create"
29742
29907
  },
29908
+ "pipelineAnalytics.cancelRelocateMedia": {
29909
+ capName: "pipeline-analytics",
29910
+ capScope: "device",
29911
+ addonId: null,
29912
+ access: "create"
29913
+ },
29743
29914
  "pipelineAnalytics.cancelStorageMigrationMove": {
29744
29915
  capName: "pipeline-analytics",
29745
29916
  capScope: "device",
@@ -29914,6 +30085,12 @@ Object.freeze({
29914
30085
  addonId: null,
29915
30086
  access: "view"
29916
30087
  },
30088
+ "pipelineAnalytics.listRelocateMediaJobs": {
30089
+ capName: "pipeline-analytics",
30090
+ capScope: "device",
30091
+ addonId: null,
30092
+ access: "view"
30093
+ },
29917
30094
  "pipelineAnalytics.listRetrainAnnotations": {
29918
30095
  capName: "pipeline-analytics",
29919
30096
  capScope: "device",
@@ -29992,6 +30169,12 @@ Object.freeze({
29992
30169
  addonId: null,
29993
30170
  access: "create"
29994
30171
  },
30172
+ "pipelineAnalytics.relocateMedia": {
30173
+ capName: "pipeline-analytics",
30174
+ capScope: "device",
30175
+ addonId: null,
30176
+ access: "create"
30177
+ },
29995
30178
  "pipelineAnalytics.restageRetrainTrack": {
29996
30179
  capName: "pipeline-analytics",
29997
30180
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.21",
3
+ "version": "0.4.22",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",