@camstack/addon-remote-storage 1.2.27 → 1.2.28

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.
@@ -6631,7 +6631,7 @@ function method(input, output, options) {
6631
6631
  input,
6632
6632
  output,
6633
6633
  kind: options?.kind ?? "query",
6634
- auth: options?.auth ?? "protected",
6634
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6635
6635
  ...options?.access !== void 0 ? { access: options.access } : {},
6636
6636
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6637
6637
  timeoutMs: options?.timeoutMs
@@ -6651,7 +6651,7 @@ function systemMethod(input, output, options) {
6651
6651
  }
6652
6652
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6653
6653
  var VersionOutputSchema$1 = object({ version: string() });
6654
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6654
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6655
6655
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6656
6656
  DeviceType["Camera"] = "camera";
6657
6657
  DeviceType["Hub"] = "hub";
@@ -6972,7 +6972,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6972
6972
  }({});
6973
6973
  var StaticDirOutputSchema = object({ staticDir: string() });
6974
6974
  var VersionOutputSchema = object({ version: string() });
6975
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6975
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6976
6976
  /**
6977
6977
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6978
6978
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7586,24 +7586,6 @@ var RecordingRetentionSchema = object({
7586
7586
  maxSizeGb: number().min(0).optional()
7587
7587
  });
7588
7588
  /**
7589
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7590
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7591
- * previews at. Five graduated steps; absent on a config = `standard` (the
7592
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7593
- *
7594
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7595
- * Each window's index sidecar carries its own tile dims, so a camera whose
7596
- * preset changed over time renders every historical window at the dims it was
7597
- * written with.
7598
- */
7599
- var ScrubThumbnailPresetSchema = _enum([
7600
- "minimal",
7601
- "low",
7602
- "standard",
7603
- "high",
7604
- "max"
7605
- ]);
7606
- /**
7607
7589
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7608
7590
  *
7609
7591
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7611,7 +7593,11 @@ var ScrubThumbnailPresetSchema = _enum([
7611
7593
  * other field is a storage knob (profiles, segment length, retention, scrub).
7612
7594
  *
7613
7595
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7614
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7596
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7597
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7598
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7599
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7600
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7615
7601
  * A stale caller must fail loudly — silently stripping its legacy intent would
7616
7602
  * persist a band-less config, i.e. silently stop recording the camera.
7617
7603
  */
@@ -7634,14 +7620,7 @@ var RecordingConfigSchema = object({
7634
7620
  * "off" is the absence of a covering band, never a band value.
7635
7621
  */
7636
7622
  bands: array(RecordingBandSchema).default([]),
7637
- retention: RecordingRetentionSchema.optional(),
7638
- /**
7639
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7640
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7641
- * windows only — existing sheets are immutable, and each window's index
7642
- * carries its own tile dims so mixed-preset history renders correctly.
7643
- */
7644
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7623
+ retention: RecordingRetentionSchema.optional()
7645
7624
  }).strict();
7646
7625
  /**
7647
7626
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7717,10 +7696,11 @@ var RelocateFootageInputSchema = object({
7717
7696
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7718
7697
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7719
7698
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7720
- var StorageMigrationMediaMoveInputSchema = object({
7699
+ var RelocateMediaInputSchema = object({
7721
7700
  toLocationId: string(),
7722
7701
  throttleMbps: number().min(1).max(1e3).optional()
7723
- }).extend({ leaseId: string().min(1) });
7702
+ });
7703
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7724
7704
  /** The independently selectable logical storage classes. `recordings`
7725
7705
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7726
7706
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8015,7 +7995,26 @@ var LabelDefinitionSchema = object({
8015
7995
  description: string().optional(),
8016
7996
  icon: string().optional()
8017
7997
  });
8018
- var ClassMapDefinitionSchema = object({
7998
+ /**
7999
+ * Wire schema for a per-model CATALOG classMap override
8000
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8001
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8002
+ * detection pipeline executor actually routes.
8003
+ *
8004
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8005
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8006
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8007
+ * enum) — the two used to share the name `ClassMapDefinition`/
8008
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8009
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8010
+ * are not: it is two different concepts colliding on a name. Keep this type
8011
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8012
+ * would either narrow every `ClassMapDefinition` consumer to the four
8013
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8014
+ * schema exists for (see the "rejects a classMap whose target is not a
8015
+ * detection macro" test in `model-catalog-schema.test.ts`).
8016
+ */
8017
+ var DetectionCatalogClassMapSchema = object({
8019
8018
  mapping: record(string(), _enum([
8020
8019
  "person",
8021
8020
  "vehicle",
@@ -8220,7 +8219,7 @@ var ModelCatalogEntrySchema = object({
8220
8219
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8221
8220
  * labels already ARE the CamStack macros (Scrypted identity map).
8222
8221
  */
8223
- classMap: ClassMapDefinitionSchema.optional()
8222
+ classMap: DetectionCatalogClassMapSchema.optional()
8224
8223
  });
8225
8224
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8226
8225
  format: literal("openvino"),
@@ -8250,7 +8249,7 @@ var ModelConvertMetadataSchema = object({
8250
8249
  "segmentation"
8251
8250
  ]),
8252
8251
  faceAlignment: boolean().optional(),
8253
- classMap: ClassMapDefinitionSchema.optional()
8252
+ classMap: DetectionCatalogClassMapSchema.optional()
8254
8253
  });
8255
8254
  var ConvertResultSchema = object({
8256
8255
  entry: ModelCatalogEntrySchema,
@@ -9113,7 +9112,7 @@ var AddonPageDeclarationSchema = object({
9113
9112
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9114
9113
  sectionLabel: string().optional()
9115
9114
  });
9116
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9115
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9117
9116
  var AddonHttpRouteSchema = object({
9118
9117
  method: _enum([
9119
9118
  "GET",
@@ -9348,7 +9347,7 @@ var WidgetMetadataSchema = object({
9348
9347
  defaultColumns: number().int().min(1).max(12).default(6),
9349
9348
  defaultRows: number().int().min(1).max(12).default(1)
9350
9349
  });
9351
- method(_void(), array(WidgetMetadataSchema).readonly());
9350
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9352
9351
  /**
9353
9352
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9354
9353
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10870,7 +10869,7 @@ var CustomModelDescriptorSchema = object({
10870
10869
  stepId: string(),
10871
10870
  entry: ModelCatalogEntrySchema
10872
10871
  });
10873
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10872
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10874
10873
  /**
10875
10874
  * Query filter for settings-store collections.
10876
10875
  */
@@ -10957,7 +10956,8 @@ method(object({
10957
10956
  }), _void(), { kind: "mutation" }), method(object({
10958
10957
  namespace: string().optional(),
10959
10958
  collection: string(),
10960
- filter: QueryFilterSchema.optional()
10959
+ filter: QueryFilterSchema.optional(),
10960
+ columns: array(string()).readonly().optional()
10961
10961
  }), array(SettingsRecordSchema).readonly()), method(object({
10962
10962
  namespace: string().optional(),
10963
10963
  collection: string(),
@@ -11020,46 +11020,87 @@ var EngineInfoSchema = object({
11020
11020
  kind: _enum(["relational", "vector"]),
11021
11021
  displayName: string()
11022
11022
  });
11023
- method(_void(), EngineInfoSchema), method(object({
11023
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11024
11024
  namespace: string().optional(),
11025
11025
  collection: string(),
11026
11026
  key: string()
11027
- }), unknown()), method(object({
11027
+ }), unknown(), { auth: "admin" }), method(object({
11028
11028
  namespace: string().optional(),
11029
11029
  collection: string(),
11030
11030
  key: string(),
11031
11031
  value: unknown()
11032
- }), _void(), { kind: "mutation" }), method(object({
11032
+ }), _void(), {
11033
+ kind: "mutation",
11034
+ auth: "admin"
11035
+ }), method(object({
11033
11036
  namespace: string().optional(),
11034
11037
  collection: string(),
11035
- filter: QueryFilterSchema.optional()
11036
- }), array(SettingsRecordSchema).readonly()), method(object({
11038
+ filter: QueryFilterSchema.optional(),
11039
+ /**
11040
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11041
+ *
11042
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11043
+ * was wrong — corrected 2026-08-26 after the hop map
11044
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11045
+ * There is **no Zod parse at all** between the door and the engine: the
11046
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11047
+ * field declared here reaches `SqliteSettingsBackend` either way.
11048
+ *
11049
+ * What actually lost `columns` was the THIRD declaration of this shape:
11050
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11051
+ * interface the engine destructures from. The field existed on both
11052
+ * schemas and the engine still never read it, because nothing checks a
11053
+ * registered provider against `InferProvider<cap>` —
11054
+ * `ProviderRegistration.provider` is typed `object`.
11055
+ *
11056
+ * It is declared here anyway, and must stay in step with
11057
+ * `settings-store.query`: a caller reading only the cap definitions has
11058
+ * to be able to see that this call carries a projection.
11059
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11060
+ */
11061
+ columns: array(string()).readonly().optional()
11062
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11037
11063
  namespace: string().optional(),
11038
11064
  collection: string(),
11039
11065
  record: SettingsRecordSchema
11040
- }), _void(), { kind: "mutation" }), method(object({
11066
+ }), _void(), {
11067
+ kind: "mutation",
11068
+ auth: "admin"
11069
+ }), method(object({
11041
11070
  namespace: string().optional(),
11042
11071
  collection: string(),
11043
11072
  id: string(),
11044
11073
  data: record(string(), unknown())
11045
- }), _void(), { kind: "mutation" }), method(object({
11074
+ }), _void(), {
11075
+ kind: "mutation",
11076
+ auth: "admin"
11077
+ }), method(object({
11046
11078
  namespace: string().optional(),
11047
11079
  collection: string(),
11048
11080
  key: string()
11049
- }), _void(), { kind: "mutation" }), method(object({
11081
+ }), _void(), {
11082
+ kind: "mutation",
11083
+ auth: "admin"
11084
+ }), method(object({
11050
11085
  namespace: string().optional(),
11051
11086
  collection: string(),
11052
11087
  filter: MutationFilterSchema
11053
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11088
+ }), object({ deleted: number().int() }), {
11089
+ kind: "mutation",
11090
+ auth: "admin"
11091
+ }), method(object({
11054
11092
  namespace: string().optional(),
11055
11093
  collection: string(),
11056
11094
  filter: MutationFilterSchema,
11057
11095
  data: record(string(), unknown())
11058
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11096
+ }), object({ updated: number().int() }), {
11097
+ kind: "mutation",
11098
+ auth: "admin"
11099
+ }), method(object({
11059
11100
  namespace: string().optional(),
11060
11101
  collection: string(),
11061
11102
  filter: QueryFilterSchema.optional()
11062
- }), number()), method(object({
11103
+ }), number(), { auth: "admin" }), method(object({
11063
11104
  namespace: string().optional(),
11064
11105
  collection: string(),
11065
11106
  field: string(),
@@ -11069,15 +11110,18 @@ method(_void(), EngineInfoSchema), method(object({
11069
11110
  }), array(object({
11070
11111
  bucket: number().int(),
11071
11112
  count: number().int()
11072
- })).readonly()), method(object({
11113
+ })).readonly(), { auth: "admin" }), method(object({
11073
11114
  namespace: string().optional(),
11074
11115
  collection: string()
11075
- }), boolean()), method(object({
11116
+ }), boolean(), { auth: "admin" }), method(object({
11076
11117
  namespace: string().optional(),
11077
11118
  collection: string(),
11078
11119
  columns: array(CollectionColumnSchema).readonly(),
11079
11120
  indexes: array(CollectionIndexSchema).readonly().optional()
11080
- }), _void(), { kind: "mutation" });
11121
+ }), _void(), {
11122
+ kind: "mutation",
11123
+ auth: "admin"
11124
+ });
11081
11125
  /**
11082
11126
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11083
11127
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12205,7 +12249,7 @@ method(object({
12205
12249
  crop: _instanceof(Uint8Array),
12206
12250
  width: number(),
12207
12251
  height: number()
12208
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12252
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12209
12253
  /**
12210
12254
  * filesystem-browse — per-node capability for browsing the node's local
12211
12255
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12498,19 +12542,22 @@ method(LlmGenerateBaseInputSchema.extend({
12498
12542
  runtime: ManagedRuntimeConfigSchema,
12499
12543
  /** The managed profile's timeout, threaded by the hub provider. */
12500
12544
  timeoutMs: number().int().positive().optional()
12501
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12545
+ }), LlmGenerateResultSchema, {
12546
+ kind: "mutation",
12547
+ auth: "admin"
12548
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12502
12549
  kind: "mutation",
12503
12550
  auth: "admin"
12504
12551
  }), method(object({}), _void(), {
12505
12552
  kind: "mutation",
12506
12553
  auth: "admin"
12507
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12554
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12508
12555
  kind: "mutation",
12509
12556
  auth: "admin"
12510
12557
  }), method(object({ file: string() }), _void(), {
12511
12558
  kind: "mutation",
12512
12559
  auth: "admin"
12513
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12560
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12514
12561
  /**
12515
12562
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12516
12563
  * methods concat-fan across providers; single-row methods route to ONE
@@ -15983,7 +16030,7 @@ var OauthIntegrationDescriptorSchema = object({
15983
16030
  */
15984
16031
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
15985
16032
  });
15986
- method(_void(), OauthIntegrationDescriptorSchema);
16033
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
15987
16034
  /**
15988
16035
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
15989
16036
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17178,6 +17225,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17178
17225
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17179
17226
  kind: "mutation",
17180
17227
  auth: "admin"
17228
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17229
+ kind: "mutation",
17230
+ auth: "admin"
17231
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17232
+ kind: "query",
17233
+ auth: "admin"
17234
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17235
+ kind: "mutation",
17236
+ auth: "admin"
17181
17237
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17182
17238
  kind: "query",
17183
17239
  auth: "admin"
@@ -17332,6 +17388,11 @@ object({
17332
17388
  "jpeg"
17333
17389
  ])
17334
17390
  });
17391
+ /**
17392
+ * Process-local frame identity. It is serializable so it can ride an in-process
17393
+ * capability call, but `registryId` deliberately prevents resolution in any
17394
+ * other process or execution group.
17395
+ */
17335
17396
  var FrameRefSchema = object({
17336
17397
  registryId: string().min(1),
17337
17398
  id: string().min(1),
@@ -19497,7 +19558,7 @@ method(object({
19497
19558
  * linking rather than produce an eternal token.
19498
19559
  */
19499
19560
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19500
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19561
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19501
19562
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19502
19563
  providerId: string().min(1),
19503
19564
  displayName: string().min(1),
@@ -19592,10 +19653,13 @@ var EvictResultSchema = object({
19592
19653
  /** True when the provider has nothing left it is willing to drop on this location. */
19593
19654
  exhausted: boolean()
19594
19655
  });
19595
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19656
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19596
19657
  locationId: string(),
19597
19658
  targetBytes: number().int().positive()
19598
- }), EvictResultSchema, { kind: "mutation" });
19659
+ }), EvictResultSchema, {
19660
+ kind: "mutation",
19661
+ auth: "admin"
19662
+ });
19599
19663
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19600
19664
  kind: "mutation",
19601
19665
  auth: "admin"
@@ -19681,43 +19745,82 @@ var storageProviderCapability = {
19681
19745
  mode: "collection",
19682
19746
  internal: true,
19683
19747
  methods: {
19748
+ /**
19749
+ * Every method below except `testLocation` had NO `auth` override —
19750
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
19751
+ * `data-store-provider`), so this was reachable on the AppRouter by ANY
19752
+ * authenticated session at the default `auth: 'protected'`: arbitrary
19753
+ * read/write/delete/list against any storage location the operator has
19754
+ * configured, keyed only by a caller-supplied `location` + `relativePath`
19755
+ * — the same "public consumers never see this cap" claim that was false
19756
+ * for `data-store-provider`, here gating raw file I/O instead of raw
19757
+ * settings rows. The only legitimate caller,
19758
+ * `addon-registry.service.ts`'s `activeStorageProvider`, calls the
19759
+ * provider object directly (in-process) — never tRPC — so `auth: 'admin'`
19760
+ * on every method costs it nothing. Public consumers already go through
19761
+ * the separate `storage` singleton cap.
19762
+ */
19684
19763
  /** Self-description for the "Add location" wizard. */
19685
- getProviderInfo: method(_void(), ProviderInfoSchema),
19764
+ getProviderInfo: method(_void(), ProviderInfoSchema, { auth: "admin" }),
19686
19765
  /** Validate config + probe connectivity. Called on add and on edit. */
19687
19766
  testLocation: method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }),
19688
19767
  resolve: method(object({
19689
19768
  location: StorageLocationSchema,
19690
19769
  relativePath: string()
19691
- }), string()),
19770
+ }), string(), { auth: "admin" }),
19692
19771
  write: method(object({
19693
19772
  location: StorageLocationSchema,
19694
19773
  relativePath: string(),
19695
19774
  data: _instanceof(Uint8Array)
19696
- }), _void(), { kind: "mutation" }),
19775
+ }), _void(), {
19776
+ kind: "mutation",
19777
+ auth: "admin"
19778
+ }),
19697
19779
  read: method(object({
19698
19780
  location: StorageLocationSchema,
19699
19781
  relativePath: string()
19700
- }), _instanceof(Uint8Array)),
19782
+ }), _instanceof(Uint8Array), { auth: "admin" }),
19701
19783
  exists: method(object({
19702
19784
  location: StorageLocationSchema,
19703
19785
  relativePath: string()
19704
- }), boolean()),
19786
+ }), boolean(), { auth: "admin" }),
19705
19787
  list: method(object({
19706
19788
  location: StorageLocationSchema,
19707
19789
  prefix: string().optional()
19708
- }), array(string()).readonly()),
19790
+ }), array(string()).readonly(), { auth: "admin" }),
19709
19791
  delete: method(object({
19710
19792
  location: StorageLocationSchema,
19711
19793
  relativePath: string()
19712
- }), _void(), { kind: "mutation" }),
19713
- getAvailableSpace: method(object({ location: StorageLocationSchema }), number().nullable()),
19714
- beginUpload: method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }),
19715
- writeChunk: method(WriteChunkInputSchema, _void(), { kind: "mutation" }),
19716
- finalizeUpload: method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }),
19717
- abortUpload: method(AbortUploadInputSchema, _void(), { kind: "mutation" }),
19718
- beginDownload: method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }),
19719
- readChunk: method(ReadChunkInputSchema, _instanceof(Uint8Array)),
19720
- endDownload: method(EndDownloadInputSchema, _void(), { kind: "mutation" })
19794
+ }), _void(), {
19795
+ kind: "mutation",
19796
+ auth: "admin"
19797
+ }),
19798
+ getAvailableSpace: method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }),
19799
+ beginUpload: method(BeginUploadInputSchema, BeginUploadResultSchema, {
19800
+ kind: "mutation",
19801
+ auth: "admin"
19802
+ }),
19803
+ writeChunk: method(WriteChunkInputSchema, _void(), {
19804
+ kind: "mutation",
19805
+ auth: "admin"
19806
+ }),
19807
+ finalizeUpload: method(FinalizeUploadInputSchema, _void(), {
19808
+ kind: "mutation",
19809
+ auth: "admin"
19810
+ }),
19811
+ abortUpload: method(AbortUploadInputSchema, _void(), {
19812
+ kind: "mutation",
19813
+ auth: "admin"
19814
+ }),
19815
+ beginDownload: method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19816
+ kind: "mutation",
19817
+ auth: "admin"
19818
+ }),
19819
+ readChunk: method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }),
19820
+ endDownload: method(EndDownloadInputSchema, _void(), {
19821
+ kind: "mutation",
19822
+ auth: "admin"
19823
+ })
19721
19824
  }
19722
19825
  };
19723
19826
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
@@ -19977,7 +20080,8 @@ method(object({
19977
20080
  access: "create"
19978
20081
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
19979
20082
  kind: "mutation",
19980
- access: "view"
20083
+ access: "view",
20084
+ auth: "admin"
19981
20085
  }), method(object({
19982
20086
  /** Required — the user the assertion belongs to (verified). */
19983
20087
  userId: string(),
@@ -19985,10 +20089,12 @@ method(object({
19985
20089
  response: record(string(), unknown())
19986
20090
  }), object({ verified: boolean() }), {
19987
20091
  kind: "mutation",
19988
- access: "view"
20092
+ access: "view",
20093
+ auth: "admin"
19989
20094
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
19990
20095
  kind: "mutation",
19991
- access: "view"
20096
+ access: "view",
20097
+ auth: "admin"
19992
20098
  }), method(object({
19993
20099
  /** AuthenticationResponseJSON from the browser. */
19994
20100
  response: record(string(), unknown()) }), object({
@@ -19996,7 +20102,8 @@ response: record(string(), unknown()) }), object({
19996
20102
  userId: string().nullable()
19997
20103
  }), {
19998
20104
  kind: "mutation",
19999
- access: "view"
20105
+ access: "view",
20106
+ auth: "admin"
20000
20107
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20001
20108
  userId: string(),
20002
20109
  credentialId: string()
@@ -20168,7 +20275,19 @@ var VectorStatsResultSchema = object({
20168
20275
  /** False when the backend ranks approximately. */
20169
20276
  exact: boolean()
20170
20277
  });
20171
- 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);
20278
+ method(VectorDeclareIndexInputSchema, _void(), {
20279
+ kind: "mutation",
20280
+ auth: "admin"
20281
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20282
+ kind: "mutation",
20283
+ auth: "admin"
20284
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20285
+ kind: "mutation",
20286
+ auth: "admin"
20287
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20288
+ kind: "mutation",
20289
+ auth: "admin"
20290
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20172
20291
  var ClipSchema = object({
20173
20292
  /** Opaque, provider-namespaced id. The default provider encodes the time
20174
20293
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21891,7 +22010,27 @@ var MediaFileLiteSchema$1 = object({
21891
22010
  sizeBytes: number(),
21892
22011
  timestamp: number()
21893
22012
  });
21894
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22013
+ method(object({
22014
+ /**
22015
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22016
+ *
22017
+ * Default `false`, the same inversion `listRecentFaces` and
22018
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22019
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22020
+ * on the live hub the same day: four identities cost 40,979 B with the
22021
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22022
+ * four times and the viewer holds at `staleTime: 30_000`.
22023
+ *
22024
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22025
+ * the `event-media` plane serves that key `immutable` with an ETag.
22026
+ *
22027
+ * **This is an INPUT field, so it does not reach the addon until the
22028
+ * next train** — the hub router validates cap inputs against its own
22029
+ * compiled Zod and strips a key it does not know. Until then the
22030
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22031
+ * is what ships, and the opt-in becomes reachable when the train lands.
22032
+ */
22033
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21895
22034
  kind: "mutation",
21896
22035
  auth: "admin"
21897
22036
  }), method(object({
@@ -24038,8 +24177,10 @@ var PlateInfoSchema = object({
24038
24177
  keyFrameMediaKey: string().optional(),
24039
24178
  base64: string().optional(),
24040
24179
  /**
24041
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24042
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24180
+ * Same crop as a data-plane URL, always present when the plate has a stored
24181
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24182
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24183
+ * left at its `true` default.
24043
24184
  */
24044
24185
  cropUrl: string().optional()
24045
24186
  });
@@ -24059,14 +24200,34 @@ var PlateClusterSchema = object({
24059
24200
  });
24060
24201
  method(object({
24061
24202
  deviceId: number().int().optional(),
24062
- limit: number().int().positive().optional()
24203
+ limit: number().int().positive().optional(),
24204
+ /**
24205
+ * Inline the base64 crop on every row. Default `true` — the existing
24206
+ * behaviour, kept so no caller breaks.
24207
+ *
24208
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24209
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24210
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24211
+ * metadata without them — and the browser then caches the images.
24212
+ *
24213
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24214
+ * plates were the one gallery list left without it.
24215
+ *
24216
+ * **This is an INPUT field, so it does not reach the addon until the
24217
+ * next train.** The hub router validates cap inputs against its own
24218
+ * compiled Zod and strips a key it does not know. Until the train
24219
+ * ships, sending `false` is harmless and keeps the crops inline.
24220
+ */
24221
+ includeCrops: boolean().optional()
24063
24222
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24064
24223
  deviceId: number().int(),
24065
24224
  trackId: string()
24066
24225
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24067
24226
  text: string().min(1),
24068
24227
  maxDistance: number().int().min(0).optional(),
24069
- limit: number().int().positive().optional()
24228
+ limit: number().int().positive().optional(),
24229
+ /** See `listPlates.includeCrops`. Default `true`. */
24230
+ includeCrops: boolean().optional()
24070
24231
  }), array(PlateInfoSchema).readonly()), method(object({
24071
24232
  maxDistance: number().int().min(0).optional(),
24072
24233
  minClusterSize: number().int().min(2).optional(),
@@ -24080,7 +24241,13 @@ method(object({
24080
24241
  }), method(object({ plateId: string() }), _void(), {
24081
24242
  kind: "mutation",
24082
24243
  auth: "admin"
24083
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24244
+ }), method(object({
24245
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24246
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24247
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24248
+ * INPUT field: stripped by the hub router until the train ships, which
24249
+ * resolves to `false` and is exactly the intended default. */
24250
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24084
24251
  kind: "mutation",
24085
24252
  auth: "admin"
24086
24253
  }), method(object({
@@ -29457,6 +29624,12 @@ Object.freeze({
29457
29624
  addonId: null,
29458
29625
  access: "create"
29459
29626
  },
29627
+ "pipelineAnalytics.cancelRelocateMedia": {
29628
+ capName: "pipeline-analytics",
29629
+ capScope: "device",
29630
+ addonId: null,
29631
+ access: "create"
29632
+ },
29460
29633
  "pipelineAnalytics.cancelStorageMigrationMove": {
29461
29634
  capName: "pipeline-analytics",
29462
29635
  capScope: "device",
@@ -29631,6 +29804,12 @@ Object.freeze({
29631
29804
  addonId: null,
29632
29805
  access: "view"
29633
29806
  },
29807
+ "pipelineAnalytics.listRelocateMediaJobs": {
29808
+ capName: "pipeline-analytics",
29809
+ capScope: "device",
29810
+ addonId: null,
29811
+ access: "view"
29812
+ },
29634
29813
  "pipelineAnalytics.listRetrainAnnotations": {
29635
29814
  capName: "pipeline-analytics",
29636
29815
  capScope: "device",
@@ -29709,6 +29888,12 @@ Object.freeze({
29709
29888
  addonId: null,
29710
29889
  access: "create"
29711
29890
  },
29891
+ "pipelineAnalytics.relocateMedia": {
29892
+ capName: "pipeline-analytics",
29893
+ capScope: "device",
29894
+ addonId: null,
29895
+ access: "create"
29896
+ },
29712
29897
  "pipelineAnalytics.restageRetrainTrack": {
29713
29898
  capName: "pipeline-analytics",
29714
29899
  capScope: "device",