@camstack/addon-auth 1.2.31 → 1.2.32

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.
@@ -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
@@ -6649,7 +6649,7 @@ function systemMethod(input, output, options) {
6649
6649
  }
6650
6650
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6651
6651
  var VersionOutputSchema$1 = object({ version: string() });
6652
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6652
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6653
6653
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6654
6654
  DeviceType["Camera"] = "camera";
6655
6655
  DeviceType["Hub"] = "hub";
@@ -6970,7 +6970,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6970
6970
  }({});
6971
6971
  var StaticDirOutputSchema = object({ staticDir: string() });
6972
6972
  var VersionOutputSchema = object({ version: string() });
6973
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6973
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6974
6974
  /**
6975
6975
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6976
6976
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7715,24 +7715,6 @@ var RecordingRetentionSchema = object({
7715
7715
  maxSizeGb: number().min(0).optional()
7716
7716
  });
7717
7717
  /**
7718
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7719
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7720
- * previews at. Five graduated steps; absent on a config = `standard` (the
7721
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7722
- *
7723
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7724
- * Each window's index sidecar carries its own tile dims, so a camera whose
7725
- * preset changed over time renders every historical window at the dims it was
7726
- * written with.
7727
- */
7728
- var ScrubThumbnailPresetSchema = _enum([
7729
- "minimal",
7730
- "low",
7731
- "standard",
7732
- "high",
7733
- "max"
7734
- ]);
7735
- /**
7736
7718
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7737
7719
  *
7738
7720
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7740,7 +7722,11 @@ var ScrubThumbnailPresetSchema = _enum([
7740
7722
  * other field is a storage knob (profiles, segment length, retention, scrub).
7741
7723
  *
7742
7724
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7743
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7725
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7726
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7727
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7728
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7729
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7744
7730
  * A stale caller must fail loudly — silently stripping its legacy intent would
7745
7731
  * persist a band-less config, i.e. silently stop recording the camera.
7746
7732
  */
@@ -7763,14 +7749,7 @@ var RecordingConfigSchema = object({
7763
7749
  * "off" is the absence of a covering band, never a band value.
7764
7750
  */
7765
7751
  bands: array(RecordingBandSchema).default([]),
7766
- retention: RecordingRetentionSchema.optional(),
7767
- /**
7768
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7769
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7770
- * windows only — existing sheets are immutable, and each window's index
7771
- * carries its own tile dims so mixed-preset history renders correctly.
7772
- */
7773
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7752
+ retention: RecordingRetentionSchema.optional()
7774
7753
  }).strict();
7775
7754
  /**
7776
7755
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7846,10 +7825,11 @@ var RelocateFootageInputSchema = object({
7846
7825
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7847
7826
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7848
7827
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7849
- var StorageMigrationMediaMoveInputSchema = object({
7828
+ var RelocateMediaInputSchema = object({
7850
7829
  toLocationId: string(),
7851
7830
  throttleMbps: number().min(1).max(1e3).optional()
7852
- }).extend({ leaseId: string().min(1) });
7831
+ });
7832
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7853
7833
  /** The independently selectable logical storage classes. `recordings`
7854
7834
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7855
7835
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8144,7 +8124,26 @@ var LabelDefinitionSchema = object({
8144
8124
  description: string().optional(),
8145
8125
  icon: string().optional()
8146
8126
  });
8147
- var ClassMapDefinitionSchema = object({
8127
+ /**
8128
+ * Wire schema for a per-model CATALOG classMap override
8129
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8130
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8131
+ * detection pipeline executor actually routes.
8132
+ *
8133
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8134
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8135
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8136
+ * enum) — the two used to share the name `ClassMapDefinition`/
8137
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8138
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8139
+ * are not: it is two different concepts colliding on a name. Keep this type
8140
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8141
+ * would either narrow every `ClassMapDefinition` consumer to the four
8142
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8143
+ * schema exists for (see the "rejects a classMap whose target is not a
8144
+ * detection macro" test in `model-catalog-schema.test.ts`).
8145
+ */
8146
+ var DetectionCatalogClassMapSchema = object({
8148
8147
  mapping: record(string(), _enum([
8149
8148
  "person",
8150
8149
  "vehicle",
@@ -8349,7 +8348,7 @@ var ModelCatalogEntrySchema = object({
8349
8348
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8350
8349
  * labels already ARE the CamStack macros (Scrypted identity map).
8351
8350
  */
8352
- classMap: ClassMapDefinitionSchema.optional()
8351
+ classMap: DetectionCatalogClassMapSchema.optional()
8353
8352
  });
8354
8353
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8355
8354
  format: literal("openvino"),
@@ -8379,7 +8378,7 @@ var ModelConvertMetadataSchema = object({
8379
8378
  "segmentation"
8380
8379
  ]),
8381
8380
  faceAlignment: boolean().optional(),
8382
- classMap: ClassMapDefinitionSchema.optional()
8381
+ classMap: DetectionCatalogClassMapSchema.optional()
8383
8382
  });
8384
8383
  var ConvertResultSchema = object({
8385
8384
  entry: ModelCatalogEntrySchema,
@@ -9242,7 +9241,7 @@ var AddonPageDeclarationSchema = object({
9242
9241
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9243
9242
  sectionLabel: string().optional()
9244
9243
  });
9245
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9244
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9246
9245
  var AddonHttpRouteSchema = object({
9247
9246
  method: _enum([
9248
9247
  "GET",
@@ -9501,7 +9500,20 @@ var addonWidgetsSourceCapability = {
9501
9500
  scope: "system",
9502
9501
  mode: "collection",
9503
9502
  internal: true,
9504
- methods: { listWidgets: method(_void(), array(WidgetMetadataSchema).readonly()) }
9503
+ methods: {
9504
+ /**
9505
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
9506
+ * `data-store-provider`) — this was reachable on the AppRouter by ANY
9507
+ * authenticated session at the default `auth: 'protected'`. The only
9508
+ * consumer, the `addon-widgets-aggregator` builtin, reads it via
9509
+ * `ctx.capabilities.getCollection('addon-widgets-source')` — LOCAL-PROCESS
9510
+ * only, never tRPC. The public, enriched listing admin-ui actually
9511
+ * consumes is the separate `addon-widgets` cap (`listWidgets` there is
9512
+ * gated separately, and a `preAuth: true` widget is surfaced through the
9513
+ * PUBLIC `auth.listLoginMethods` contribution channel instead) —
9514
+ * neither is affected by this change.
9515
+ */
9516
+ listWidgets: method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" }) }
9505
9517
  };
9506
9518
  /**
9507
9519
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
@@ -11037,7 +11049,7 @@ var CustomModelDescriptorSchema = object({
11037
11049
  stepId: string(),
11038
11050
  entry: ModelCatalogEntrySchema
11039
11051
  });
11040
- method(_void(), array(CustomModelDescriptorSchema).readonly());
11052
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
11041
11053
  /**
11042
11054
  * Query filter for settings-store collections.
11043
11055
  */
@@ -11124,7 +11136,8 @@ method(object({
11124
11136
  }), _void(), { kind: "mutation" }), method(object({
11125
11137
  namespace: string().optional(),
11126
11138
  collection: string(),
11127
- filter: QueryFilterSchema.optional()
11139
+ filter: QueryFilterSchema.optional(),
11140
+ columns: array(string()).readonly().optional()
11128
11141
  }), array(SettingsRecordSchema).readonly()), method(object({
11129
11142
  namespace: string().optional(),
11130
11143
  collection: string(),
@@ -11187,46 +11200,87 @@ var EngineInfoSchema = object({
11187
11200
  kind: _enum(["relational", "vector"]),
11188
11201
  displayName: string()
11189
11202
  });
11190
- method(_void(), EngineInfoSchema), method(object({
11203
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11191
11204
  namespace: string().optional(),
11192
11205
  collection: string(),
11193
11206
  key: string()
11194
- }), unknown()), method(object({
11207
+ }), unknown(), { auth: "admin" }), method(object({
11195
11208
  namespace: string().optional(),
11196
11209
  collection: string(),
11197
11210
  key: string(),
11198
11211
  value: unknown()
11199
- }), _void(), { kind: "mutation" }), method(object({
11212
+ }), _void(), {
11213
+ kind: "mutation",
11214
+ auth: "admin"
11215
+ }), method(object({
11200
11216
  namespace: string().optional(),
11201
11217
  collection: string(),
11202
- filter: QueryFilterSchema.optional()
11203
- }), array(SettingsRecordSchema).readonly()), method(object({
11218
+ filter: QueryFilterSchema.optional(),
11219
+ /**
11220
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11221
+ *
11222
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11223
+ * was wrong — corrected 2026-08-26 after the hop map
11224
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11225
+ * There is **no Zod parse at all** between the door and the engine: the
11226
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11227
+ * field declared here reaches `SqliteSettingsBackend` either way.
11228
+ *
11229
+ * What actually lost `columns` was the THIRD declaration of this shape:
11230
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11231
+ * interface the engine destructures from. The field existed on both
11232
+ * schemas and the engine still never read it, because nothing checks a
11233
+ * registered provider against `InferProvider<cap>` —
11234
+ * `ProviderRegistration.provider` is typed `object`.
11235
+ *
11236
+ * It is declared here anyway, and must stay in step with
11237
+ * `settings-store.query`: a caller reading only the cap definitions has
11238
+ * to be able to see that this call carries a projection.
11239
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11240
+ */
11241
+ columns: array(string()).readonly().optional()
11242
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11204
11243
  namespace: string().optional(),
11205
11244
  collection: string(),
11206
11245
  record: SettingsRecordSchema
11207
- }), _void(), { kind: "mutation" }), method(object({
11246
+ }), _void(), {
11247
+ kind: "mutation",
11248
+ auth: "admin"
11249
+ }), method(object({
11208
11250
  namespace: string().optional(),
11209
11251
  collection: string(),
11210
11252
  id: string(),
11211
11253
  data: record(string(), unknown())
11212
- }), _void(), { kind: "mutation" }), method(object({
11254
+ }), _void(), {
11255
+ kind: "mutation",
11256
+ auth: "admin"
11257
+ }), method(object({
11213
11258
  namespace: string().optional(),
11214
11259
  collection: string(),
11215
11260
  key: string()
11216
- }), _void(), { kind: "mutation" }), method(object({
11261
+ }), _void(), {
11262
+ kind: "mutation",
11263
+ auth: "admin"
11264
+ }), method(object({
11217
11265
  namespace: string().optional(),
11218
11266
  collection: string(),
11219
11267
  filter: MutationFilterSchema
11220
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11268
+ }), object({ deleted: number().int() }), {
11269
+ kind: "mutation",
11270
+ auth: "admin"
11271
+ }), method(object({
11221
11272
  namespace: string().optional(),
11222
11273
  collection: string(),
11223
11274
  filter: MutationFilterSchema,
11224
11275
  data: record(string(), unknown())
11225
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11276
+ }), object({ updated: number().int() }), {
11277
+ kind: "mutation",
11278
+ auth: "admin"
11279
+ }), method(object({
11226
11280
  namespace: string().optional(),
11227
11281
  collection: string(),
11228
11282
  filter: QueryFilterSchema.optional()
11229
- }), number()), method(object({
11283
+ }), number(), { auth: "admin" }), method(object({
11230
11284
  namespace: string().optional(),
11231
11285
  collection: string(),
11232
11286
  field: string(),
@@ -11236,15 +11290,18 @@ method(_void(), EngineInfoSchema), method(object({
11236
11290
  }), array(object({
11237
11291
  bucket: number().int(),
11238
11292
  count: number().int()
11239
- })).readonly()), method(object({
11293
+ })).readonly(), { auth: "admin" }), method(object({
11240
11294
  namespace: string().optional(),
11241
11295
  collection: string()
11242
- }), boolean()), method(object({
11296
+ }), boolean(), { auth: "admin" }), method(object({
11243
11297
  namespace: string().optional(),
11244
11298
  collection: string(),
11245
11299
  columns: array(CollectionColumnSchema).readonly(),
11246
11300
  indexes: array(CollectionIndexSchema).readonly().optional()
11247
- }), _void(), { kind: "mutation" });
11301
+ }), _void(), {
11302
+ kind: "mutation",
11303
+ auth: "admin"
11304
+ });
11248
11305
  /**
11249
11306
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11250
11307
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12372,7 +12429,7 @@ method(object({
12372
12429
  crop: _instanceof(Uint8Array),
12373
12430
  width: number(),
12374
12431
  height: number()
12375
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12432
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12376
12433
  /**
12377
12434
  * filesystem-browse — per-node capability for browsing the node's local
12378
12435
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12665,19 +12722,22 @@ method(LlmGenerateBaseInputSchema.extend({
12665
12722
  runtime: ManagedRuntimeConfigSchema,
12666
12723
  /** The managed profile's timeout, threaded by the hub provider. */
12667
12724
  timeoutMs: number().int().positive().optional()
12668
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12725
+ }), LlmGenerateResultSchema, {
12726
+ kind: "mutation",
12727
+ auth: "admin"
12728
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12669
12729
  kind: "mutation",
12670
12730
  auth: "admin"
12671
12731
  }), method(object({}), _void(), {
12672
12732
  kind: "mutation",
12673
12733
  auth: "admin"
12674
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12734
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12675
12735
  kind: "mutation",
12676
12736
  auth: "admin"
12677
12737
  }), method(object({ file: string() }), _void(), {
12678
12738
  kind: "mutation",
12679
12739
  auth: "admin"
12680
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12740
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12681
12741
  /**
12682
12742
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12683
12743
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16158,7 +16218,7 @@ var OauthIntegrationDescriptorSchema = object({
16158
16218
  */
16159
16219
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16160
16220
  });
16161
- method(_void(), OauthIntegrationDescriptorSchema);
16221
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16162
16222
  /**
16163
16223
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16164
16224
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17353,6 +17413,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17353
17413
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17354
17414
  kind: "mutation",
17355
17415
  auth: "admin"
17416
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17417
+ kind: "mutation",
17418
+ auth: "admin"
17419
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17420
+ kind: "query",
17421
+ auth: "admin"
17422
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17423
+ kind: "mutation",
17424
+ auth: "admin"
17356
17425
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17357
17426
  kind: "query",
17358
17427
  auth: "admin"
@@ -17507,6 +17576,11 @@ object({
17507
17576
  "jpeg"
17508
17577
  ])
17509
17578
  });
17579
+ /**
17580
+ * Process-local frame identity. It is serializable so it can ride an in-process
17581
+ * capability call, but `registryId` deliberately prevents resolution in any
17582
+ * other process or execution group.
17583
+ */
17510
17584
  var FrameRefSchema = object({
17511
17585
  registryId: string().min(1),
17512
17586
  id: string().min(1),
@@ -19672,7 +19746,7 @@ method(object({
19672
19746
  * linking rather than produce an eternal token.
19673
19747
  */
19674
19748
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19675
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19749
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19676
19750
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19677
19751
  providerId: string().min(1),
19678
19752
  displayName: string().min(1),
@@ -19767,10 +19841,13 @@ var EvictResultSchema = object({
19767
19841
  /** True when the provider has nothing left it is willing to drop on this location. */
19768
19842
  exhausted: boolean()
19769
19843
  });
19770
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19844
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19771
19845
  locationId: string(),
19772
19846
  targetBytes: number().int().positive()
19773
- }), EvictResultSchema, { kind: "mutation" });
19847
+ }), EvictResultSchema, {
19848
+ kind: "mutation",
19849
+ auth: "admin"
19850
+ });
19774
19851
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19775
19852
  kind: "mutation",
19776
19853
  auth: "admin"
@@ -19830,26 +19907,50 @@ var ReadChunkInputSchema = object({
19830
19907
  length: number()
19831
19908
  });
19832
19909
  var EndDownloadInputSchema = object({ downloadId: string() });
19833
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19910
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19834
19911
  location: StorageLocationSchema,
19835
19912
  relativePath: string()
19836
- }), string()), method(object({
19913
+ }), string(), { auth: "admin" }), method(object({
19837
19914
  location: StorageLocationSchema,
19838
19915
  relativePath: string(),
19839
19916
  data: _instanceof(Uint8Array)
19840
- }), _void(), { kind: "mutation" }), method(object({
19917
+ }), _void(), {
19918
+ kind: "mutation",
19919
+ auth: "admin"
19920
+ }), method(object({
19841
19921
  location: StorageLocationSchema,
19842
19922
  relativePath: string()
19843
- }), _instanceof(Uint8Array)), method(object({
19923
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19844
19924
  location: StorageLocationSchema,
19845
19925
  relativePath: string()
19846
- }), boolean()), method(object({
19926
+ }), boolean(), { auth: "admin" }), method(object({
19847
19927
  location: StorageLocationSchema,
19848
19928
  prefix: string().optional()
19849
- }), array(string()).readonly()), method(object({
19929
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19850
19930
  location: StorageLocationSchema,
19851
19931
  relativePath: string()
19852
- }), _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" });
19932
+ }), _void(), {
19933
+ kind: "mutation",
19934
+ auth: "admin"
19935
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19936
+ kind: "mutation",
19937
+ auth: "admin"
19938
+ }), method(WriteChunkInputSchema, _void(), {
19939
+ kind: "mutation",
19940
+ auth: "admin"
19941
+ }), method(FinalizeUploadInputSchema, _void(), {
19942
+ kind: "mutation",
19943
+ auth: "admin"
19944
+ }), method(AbortUploadInputSchema, _void(), {
19945
+ kind: "mutation",
19946
+ auth: "admin"
19947
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19948
+ kind: "mutation",
19949
+ auth: "admin"
19950
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19951
+ kind: "mutation",
19952
+ auth: "admin"
19953
+ });
19853
19954
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19854
19955
  var ProfileSettingsSchemaBridge = unknown().nullable();
19855
19956
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20113,9 +20214,28 @@ var userPasskeysCapability = {
20113
20214
  auth: "admin",
20114
20215
  access: "create"
20115
20216
  }),
20217
+ /**
20218
+ * The four methods below had NO `auth` override — `internal: true` did
20219
+ * not gate the mount (see the 2026-08-26 note on `data-store-provider`),
20220
+ * so they were reachable on the AppRouter at the default
20221
+ * `auth: 'protected'` (any authenticated session), inconsistent with
20222
+ * every other method on this cap (all already `auth: 'admin'`).
20223
+ *
20224
+ * ⚠ Checked before gating: these are also the PRE-AUTH login-ceremony
20225
+ * methods, so admin-gating them here must not break login for an
20226
+ * unauthenticated principal. It doesn't — the real login path is the
20227
+ * PUBLIC `auth.beginAuthentication` / `auth.finishAuthentication` /
20228
+ * `auth.beginDiscoverableAuthentication` / `auth.finishDiscoverableAuthentication`
20229
+ * procedures in `server/backend/src/api/core/auth.router.ts`, which call
20230
+ * `provider.beginAuthentication(...)` etc. directly against the
20231
+ * capability-registry-resolved provider — never through this cap's own
20232
+ * tRPC route. `auth: 'admin'` here only closes a redundant, unused
20233
+ * second entry point onto the same ceremony.
20234
+ */
20116
20235
  beginAuthentication: method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20117
20236
  kind: "mutation",
20118
- access: "view"
20237
+ access: "view",
20238
+ auth: "admin"
20119
20239
  }),
20120
20240
  finishAuthentication: method(object({
20121
20241
  /** Required — the user the assertion belongs to (verified). */
@@ -20124,11 +20244,13 @@ var userPasskeysCapability = {
20124
20244
  response: record(string(), unknown())
20125
20245
  }), object({ verified: boolean() }), {
20126
20246
  kind: "mutation",
20127
- access: "view"
20247
+ access: "view",
20248
+ auth: "admin"
20128
20249
  }),
20129
20250
  beginDiscoverableAuthentication: method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20130
20251
  kind: "mutation",
20131
- access: "view"
20252
+ access: "view",
20253
+ auth: "admin"
20132
20254
  }),
20133
20255
  finishDiscoverableAuthentication: method(object({
20134
20256
  /** AuthenticationResponseJSON from the browser. */
@@ -20137,7 +20259,8 @@ response: record(string(), unknown()) }), object({
20137
20259
  userId: string().nullable()
20138
20260
  }), {
20139
20261
  kind: "mutation",
20140
- access: "view"
20262
+ access: "view",
20263
+ auth: "admin"
20141
20264
  }),
20142
20265
  listPasskeys: method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }),
20143
20266
  removePasskey: method(object({
@@ -20315,7 +20438,19 @@ var VectorStatsResultSchema = object({
20315
20438
  /** False when the backend ranks approximately. */
20316
20439
  exact: boolean()
20317
20440
  });
20318
- 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);
20441
+ method(VectorDeclareIndexInputSchema, _void(), {
20442
+ kind: "mutation",
20443
+ auth: "admin"
20444
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20445
+ kind: "mutation",
20446
+ auth: "admin"
20447
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20448
+ kind: "mutation",
20449
+ auth: "admin"
20450
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20451
+ kind: "mutation",
20452
+ auth: "admin"
20453
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20319
20454
  var ClipSchema = object({
20320
20455
  /** Opaque, provider-namespaced id. The default provider encodes the time
20321
20456
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22038,7 +22173,27 @@ var MediaFileLiteSchema$1 = object({
22038
22173
  sizeBytes: number(),
22039
22174
  timestamp: number()
22040
22175
  });
22041
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22176
+ method(object({
22177
+ /**
22178
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22179
+ *
22180
+ * Default `false`, the same inversion `listRecentFaces` and
22181
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22182
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22183
+ * on the live hub the same day: four identities cost 40,979 B with the
22184
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22185
+ * four times and the viewer holds at `staleTime: 30_000`.
22186
+ *
22187
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22188
+ * the `event-media` plane serves that key `immutable` with an ETag.
22189
+ *
22190
+ * **This is an INPUT field, so it does not reach the addon until the
22191
+ * next train** — the hub router validates cap inputs against its own
22192
+ * compiled Zod and strips a key it does not know. Until then the
22193
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22194
+ * is what ships, and the opt-in becomes reachable when the train lands.
22195
+ */
22196
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22042
22197
  kind: "mutation",
22043
22198
  auth: "admin"
22044
22199
  }), method(object({
@@ -24185,8 +24340,10 @@ var PlateInfoSchema = object({
24185
24340
  keyFrameMediaKey: string().optional(),
24186
24341
  base64: string().optional(),
24187
24342
  /**
24188
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24189
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24343
+ * Same crop as a data-plane URL, always present when the plate has a stored
24344
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24345
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24346
+ * left at its `true` default.
24190
24347
  */
24191
24348
  cropUrl: string().optional()
24192
24349
  });
@@ -24206,14 +24363,34 @@ var PlateClusterSchema = object({
24206
24363
  });
24207
24364
  method(object({
24208
24365
  deviceId: number().int().optional(),
24209
- limit: number().int().positive().optional()
24366
+ limit: number().int().positive().optional(),
24367
+ /**
24368
+ * Inline the base64 crop on every row. Default `true` — the existing
24369
+ * behaviour, kept so no caller breaks.
24370
+ *
24371
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24372
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24373
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24374
+ * metadata without them — and the browser then caches the images.
24375
+ *
24376
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24377
+ * plates were the one gallery list left without it.
24378
+ *
24379
+ * **This is an INPUT field, so it does not reach the addon until the
24380
+ * next train.** The hub router validates cap inputs against its own
24381
+ * compiled Zod and strips a key it does not know. Until the train
24382
+ * ships, sending `false` is harmless and keeps the crops inline.
24383
+ */
24384
+ includeCrops: boolean().optional()
24210
24385
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24211
24386
  deviceId: number().int(),
24212
24387
  trackId: string()
24213
24388
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24214
24389
  text: string().min(1),
24215
24390
  maxDistance: number().int().min(0).optional(),
24216
- limit: number().int().positive().optional()
24391
+ limit: number().int().positive().optional(),
24392
+ /** See `listPlates.includeCrops`. Default `true`. */
24393
+ includeCrops: boolean().optional()
24217
24394
  }), array(PlateInfoSchema).readonly()), method(object({
24218
24395
  maxDistance: number().int().min(0).optional(),
24219
24396
  minClusterSize: number().int().min(2).optional(),
@@ -24227,7 +24404,13 @@ method(object({
24227
24404
  }), method(object({ plateId: string() }), _void(), {
24228
24405
  kind: "mutation",
24229
24406
  auth: "admin"
24230
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24407
+ }), method(object({
24408
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24409
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24410
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24411
+ * INPUT field: stripped by the hub router until the train ships, which
24412
+ * resolves to `false` and is exactly the intended default. */
24413
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24231
24414
  kind: "mutation",
24232
24415
  auth: "admin"
24233
24416
  }), method(object({
@@ -29604,6 +29787,12 @@ Object.freeze({
29604
29787
  addonId: null,
29605
29788
  access: "create"
29606
29789
  },
29790
+ "pipelineAnalytics.cancelRelocateMedia": {
29791
+ capName: "pipeline-analytics",
29792
+ capScope: "device",
29793
+ addonId: null,
29794
+ access: "create"
29795
+ },
29607
29796
  "pipelineAnalytics.cancelStorageMigrationMove": {
29608
29797
  capName: "pipeline-analytics",
29609
29798
  capScope: "device",
@@ -29778,6 +29967,12 @@ Object.freeze({
29778
29967
  addonId: null,
29779
29968
  access: "view"
29780
29969
  },
29970
+ "pipelineAnalytics.listRelocateMediaJobs": {
29971
+ capName: "pipeline-analytics",
29972
+ capScope: "device",
29973
+ addonId: null,
29974
+ access: "view"
29975
+ },
29781
29976
  "pipelineAnalytics.listRetrainAnnotations": {
29782
29977
  capName: "pipeline-analytics",
29783
29978
  capScope: "device",
@@ -29856,6 +30051,12 @@ Object.freeze({
29856
30051
  addonId: null,
29857
30052
  access: "create"
29858
30053
  },
30054
+ "pipelineAnalytics.relocateMedia": {
30055
+ capName: "pipeline-analytics",
30056
+ capScope: "device",
30057
+ addonId: null,
30058
+ access: "create"
30059
+ },
29859
30060
  "pipelineAnalytics.restageRetrainTrack": {
29860
30061
  capName: "pipeline-analytics",
29861
30062
  capScope: "device",