@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.
@@ -6654,7 +6654,7 @@ function method(input, output, options) {
6654
6654
  input,
6655
6655
  output,
6656
6656
  kind: options?.kind ?? "query",
6657
- auth: options?.auth ?? "protected",
6657
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6658
6658
  ...options?.access !== void 0 ? { access: options.access } : {},
6659
6659
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6660
6660
  timeoutMs: options?.timeoutMs
@@ -6674,7 +6674,7 @@ function systemMethod(input, output, options) {
6674
6674
  }
6675
6675
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6676
6676
  var VersionOutputSchema$1 = object({ version: string() });
6677
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6677
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6678
6678
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6679
6679
  DeviceType["Camera"] = "camera";
6680
6680
  DeviceType["Hub"] = "hub";
@@ -6995,7 +6995,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6995
6995
  }({});
6996
6996
  var StaticDirOutputSchema = object({ staticDir: string() });
6997
6997
  var VersionOutputSchema = object({ version: string() });
6998
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6998
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6999
6999
  /**
7000
7000
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7001
7001
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7609,24 +7609,6 @@ var RecordingRetentionSchema = object({
7609
7609
  maxSizeGb: number().min(0).optional()
7610
7610
  });
7611
7611
  /**
7612
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7613
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7614
- * previews at. Five graduated steps; absent on a config = `standard` (the
7615
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7616
- *
7617
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7618
- * Each window's index sidecar carries its own tile dims, so a camera whose
7619
- * preset changed over time renders every historical window at the dims it was
7620
- * written with.
7621
- */
7622
- var ScrubThumbnailPresetSchema = _enum([
7623
- "minimal",
7624
- "low",
7625
- "standard",
7626
- "high",
7627
- "max"
7628
- ]);
7629
- /**
7630
7612
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7631
7613
  *
7632
7614
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7634,7 +7616,11 @@ var ScrubThumbnailPresetSchema = _enum([
7634
7616
  * other field is a storage knob (profiles, segment length, retention, scrub).
7635
7617
  *
7636
7618
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7637
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7619
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7620
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7621
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7622
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7623
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7638
7624
  * A stale caller must fail loudly — silently stripping its legacy intent would
7639
7625
  * persist a band-less config, i.e. silently stop recording the camera.
7640
7626
  */
@@ -7657,14 +7643,7 @@ var RecordingConfigSchema = object({
7657
7643
  * "off" is the absence of a covering band, never a band value.
7658
7644
  */
7659
7645
  bands: array(RecordingBandSchema).default([]),
7660
- retention: RecordingRetentionSchema.optional(),
7661
- /**
7662
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7663
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7664
- * windows only — existing sheets are immutable, and each window's index
7665
- * carries its own tile dims so mixed-preset history renders correctly.
7666
- */
7667
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7646
+ retention: RecordingRetentionSchema.optional()
7668
7647
  }).strict();
7669
7648
  /**
7670
7649
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7740,10 +7719,11 @@ var RelocateFootageInputSchema = object({
7740
7719
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7741
7720
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7742
7721
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7743
- var StorageMigrationMediaMoveInputSchema = object({
7722
+ var RelocateMediaInputSchema = object({
7744
7723
  toLocationId: string(),
7745
7724
  throttleMbps: number().min(1).max(1e3).optional()
7746
- }).extend({ leaseId: string().min(1) });
7725
+ });
7726
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7747
7727
  /** The independently selectable logical storage classes. `recordings`
7748
7728
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7749
7729
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8038,7 +8018,26 @@ var LabelDefinitionSchema = object({
8038
8018
  description: string().optional(),
8039
8019
  icon: string().optional()
8040
8020
  });
8041
- var ClassMapDefinitionSchema = object({
8021
+ /**
8022
+ * Wire schema for a per-model CATALOG classMap override
8023
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8024
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8025
+ * detection pipeline executor actually routes.
8026
+ *
8027
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8028
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8029
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8030
+ * enum) — the two used to share the name `ClassMapDefinition`/
8031
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8032
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8033
+ * are not: it is two different concepts colliding on a name. Keep this type
8034
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8035
+ * would either narrow every `ClassMapDefinition` consumer to the four
8036
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8037
+ * schema exists for (see the "rejects a classMap whose target is not a
8038
+ * detection macro" test in `model-catalog-schema.test.ts`).
8039
+ */
8040
+ var DetectionCatalogClassMapSchema = object({
8042
8041
  mapping: record(string(), _enum([
8043
8042
  "person",
8044
8043
  "vehicle",
@@ -8243,7 +8242,7 @@ var ModelCatalogEntrySchema = object({
8243
8242
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8244
8243
  * labels already ARE the CamStack macros (Scrypted identity map).
8245
8244
  */
8246
- classMap: ClassMapDefinitionSchema.optional()
8245
+ classMap: DetectionCatalogClassMapSchema.optional()
8247
8246
  });
8248
8247
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8249
8248
  format: literal("openvino"),
@@ -8273,7 +8272,7 @@ var ModelConvertMetadataSchema = object({
8273
8272
  "segmentation"
8274
8273
  ]),
8275
8274
  faceAlignment: boolean().optional(),
8276
- classMap: ClassMapDefinitionSchema.optional()
8275
+ classMap: DetectionCatalogClassMapSchema.optional()
8277
8276
  });
8278
8277
  var ConvertResultSchema = object({
8279
8278
  entry: ModelCatalogEntrySchema,
@@ -9136,7 +9135,7 @@ var AddonPageDeclarationSchema = object({
9136
9135
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9137
9136
  sectionLabel: string().optional()
9138
9137
  });
9139
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9138
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9140
9139
  var AddonHttpRouteSchema = object({
9141
9140
  method: _enum([
9142
9141
  "GET",
@@ -9371,7 +9370,7 @@ var WidgetMetadataSchema = object({
9371
9370
  defaultColumns: number().int().min(1).max(12).default(6),
9372
9371
  defaultRows: number().int().min(1).max(12).default(1)
9373
9372
  });
9374
- method(_void(), array(WidgetMetadataSchema).readonly());
9373
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9375
9374
  /**
9376
9375
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9377
9376
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10893,7 +10892,7 @@ var CustomModelDescriptorSchema = object({
10893
10892
  stepId: string(),
10894
10893
  entry: ModelCatalogEntrySchema
10895
10894
  });
10896
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10895
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10897
10896
  /**
10898
10897
  * Query filter for settings-store collections.
10899
10898
  */
@@ -10980,7 +10979,8 @@ method(object({
10980
10979
  }), _void(), { kind: "mutation" }), method(object({
10981
10980
  namespace: string().optional(),
10982
10981
  collection: string(),
10983
- filter: QueryFilterSchema.optional()
10982
+ filter: QueryFilterSchema.optional(),
10983
+ columns: array(string()).readonly().optional()
10984
10984
  }), array(SettingsRecordSchema).readonly()), method(object({
10985
10985
  namespace: string().optional(),
10986
10986
  collection: string(),
@@ -11043,46 +11043,87 @@ var EngineInfoSchema = object({
11043
11043
  kind: _enum(["relational", "vector"]),
11044
11044
  displayName: string()
11045
11045
  });
11046
- method(_void(), EngineInfoSchema), method(object({
11046
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11047
11047
  namespace: string().optional(),
11048
11048
  collection: string(),
11049
11049
  key: string()
11050
- }), unknown()), method(object({
11050
+ }), unknown(), { auth: "admin" }), method(object({
11051
11051
  namespace: string().optional(),
11052
11052
  collection: string(),
11053
11053
  key: string(),
11054
11054
  value: unknown()
11055
- }), _void(), { kind: "mutation" }), method(object({
11055
+ }), _void(), {
11056
+ kind: "mutation",
11057
+ auth: "admin"
11058
+ }), method(object({
11056
11059
  namespace: string().optional(),
11057
11060
  collection: string(),
11058
- filter: QueryFilterSchema.optional()
11059
- }), array(SettingsRecordSchema).readonly()), method(object({
11061
+ filter: QueryFilterSchema.optional(),
11062
+ /**
11063
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11064
+ *
11065
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11066
+ * was wrong — corrected 2026-08-26 after the hop map
11067
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11068
+ * There is **no Zod parse at all** between the door and the engine: the
11069
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11070
+ * field declared here reaches `SqliteSettingsBackend` either way.
11071
+ *
11072
+ * What actually lost `columns` was the THIRD declaration of this shape:
11073
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11074
+ * interface the engine destructures from. The field existed on both
11075
+ * schemas and the engine still never read it, because nothing checks a
11076
+ * registered provider against `InferProvider<cap>` —
11077
+ * `ProviderRegistration.provider` is typed `object`.
11078
+ *
11079
+ * It is declared here anyway, and must stay in step with
11080
+ * `settings-store.query`: a caller reading only the cap definitions has
11081
+ * to be able to see that this call carries a projection.
11082
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11083
+ */
11084
+ columns: array(string()).readonly().optional()
11085
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11060
11086
  namespace: string().optional(),
11061
11087
  collection: string(),
11062
11088
  record: SettingsRecordSchema
11063
- }), _void(), { kind: "mutation" }), method(object({
11089
+ }), _void(), {
11090
+ kind: "mutation",
11091
+ auth: "admin"
11092
+ }), method(object({
11064
11093
  namespace: string().optional(),
11065
11094
  collection: string(),
11066
11095
  id: string(),
11067
11096
  data: record(string(), unknown())
11068
- }), _void(), { kind: "mutation" }), method(object({
11097
+ }), _void(), {
11098
+ kind: "mutation",
11099
+ auth: "admin"
11100
+ }), method(object({
11069
11101
  namespace: string().optional(),
11070
11102
  collection: string(),
11071
11103
  key: string()
11072
- }), _void(), { kind: "mutation" }), method(object({
11104
+ }), _void(), {
11105
+ kind: "mutation",
11106
+ auth: "admin"
11107
+ }), method(object({
11073
11108
  namespace: string().optional(),
11074
11109
  collection: string(),
11075
11110
  filter: MutationFilterSchema
11076
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11111
+ }), object({ deleted: number().int() }), {
11112
+ kind: "mutation",
11113
+ auth: "admin"
11114
+ }), method(object({
11077
11115
  namespace: string().optional(),
11078
11116
  collection: string(),
11079
11117
  filter: MutationFilterSchema,
11080
11118
  data: record(string(), unknown())
11081
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11119
+ }), object({ updated: number().int() }), {
11120
+ kind: "mutation",
11121
+ auth: "admin"
11122
+ }), method(object({
11082
11123
  namespace: string().optional(),
11083
11124
  collection: string(),
11084
11125
  filter: QueryFilterSchema.optional()
11085
- }), number()), method(object({
11126
+ }), number(), { auth: "admin" }), method(object({
11086
11127
  namespace: string().optional(),
11087
11128
  collection: string(),
11088
11129
  field: string(),
@@ -11092,15 +11133,18 @@ method(_void(), EngineInfoSchema), method(object({
11092
11133
  }), array(object({
11093
11134
  bucket: number().int(),
11094
11135
  count: number().int()
11095
- })).readonly()), method(object({
11136
+ })).readonly(), { auth: "admin" }), method(object({
11096
11137
  namespace: string().optional(),
11097
11138
  collection: string()
11098
- }), boolean()), method(object({
11139
+ }), boolean(), { auth: "admin" }), method(object({
11099
11140
  namespace: string().optional(),
11100
11141
  collection: string(),
11101
11142
  columns: array(CollectionColumnSchema).readonly(),
11102
11143
  indexes: array(CollectionIndexSchema).readonly().optional()
11103
- }), _void(), { kind: "mutation" });
11144
+ }), _void(), {
11145
+ kind: "mutation",
11146
+ auth: "admin"
11147
+ });
11104
11148
  /**
11105
11149
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11106
11150
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12228,7 +12272,7 @@ method(object({
12228
12272
  crop: _instanceof(Uint8Array),
12229
12273
  width: number(),
12230
12274
  height: number()
12231
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12275
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12232
12276
  /**
12233
12277
  * filesystem-browse — per-node capability for browsing the node's local
12234
12278
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12521,19 +12565,22 @@ method(LlmGenerateBaseInputSchema.extend({
12521
12565
  runtime: ManagedRuntimeConfigSchema,
12522
12566
  /** The managed profile's timeout, threaded by the hub provider. */
12523
12567
  timeoutMs: number().int().positive().optional()
12524
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12568
+ }), LlmGenerateResultSchema, {
12569
+ kind: "mutation",
12570
+ auth: "admin"
12571
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12525
12572
  kind: "mutation",
12526
12573
  auth: "admin"
12527
12574
  }), method(object({}), _void(), {
12528
12575
  kind: "mutation",
12529
12576
  auth: "admin"
12530
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12577
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12531
12578
  kind: "mutation",
12532
12579
  auth: "admin"
12533
12580
  }), method(object({ file: string() }), _void(), {
12534
12581
  kind: "mutation",
12535
12582
  auth: "admin"
12536
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12583
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12537
12584
  /**
12538
12585
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12539
12586
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16006,7 +16053,7 @@ var OauthIntegrationDescriptorSchema = object({
16006
16053
  */
16007
16054
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16008
16055
  });
16009
- method(_void(), OauthIntegrationDescriptorSchema);
16056
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16010
16057
  /**
16011
16058
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16012
16059
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17201,6 +17248,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17201
17248
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17202
17249
  kind: "mutation",
17203
17250
  auth: "admin"
17251
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17252
+ kind: "mutation",
17253
+ auth: "admin"
17254
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17255
+ kind: "query",
17256
+ auth: "admin"
17257
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17258
+ kind: "mutation",
17259
+ auth: "admin"
17204
17260
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17205
17261
  kind: "query",
17206
17262
  auth: "admin"
@@ -17355,6 +17411,11 @@ object({
17355
17411
  "jpeg"
17356
17412
  ])
17357
17413
  });
17414
+ /**
17415
+ * Process-local frame identity. It is serializable so it can ride an in-process
17416
+ * capability call, but `registryId` deliberately prevents resolution in any
17417
+ * other process or execution group.
17418
+ */
17358
17419
  var FrameRefSchema = object({
17359
17420
  registryId: string().min(1),
17360
17421
  id: string().min(1),
@@ -19520,7 +19581,7 @@ method(object({
19520
19581
  * linking rather than produce an eternal token.
19521
19582
  */
19522
19583
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19523
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19584
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19524
19585
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19525
19586
  providerId: string().min(1),
19526
19587
  displayName: string().min(1),
@@ -19615,10 +19676,13 @@ var EvictResultSchema = object({
19615
19676
  /** True when the provider has nothing left it is willing to drop on this location. */
19616
19677
  exhausted: boolean()
19617
19678
  });
19618
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19679
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19619
19680
  locationId: string(),
19620
19681
  targetBytes: number().int().positive()
19621
- }), EvictResultSchema, { kind: "mutation" });
19682
+ }), EvictResultSchema, {
19683
+ kind: "mutation",
19684
+ auth: "admin"
19685
+ });
19622
19686
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19623
19687
  kind: "mutation",
19624
19688
  auth: "admin"
@@ -19704,43 +19768,82 @@ var storageProviderCapability = {
19704
19768
  mode: "collection",
19705
19769
  internal: true,
19706
19770
  methods: {
19771
+ /**
19772
+ * Every method below except `testLocation` had NO `auth` override —
19773
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
19774
+ * `data-store-provider`), so this was reachable on the AppRouter by ANY
19775
+ * authenticated session at the default `auth: 'protected'`: arbitrary
19776
+ * read/write/delete/list against any storage location the operator has
19777
+ * configured, keyed only by a caller-supplied `location` + `relativePath`
19778
+ * — the same "public consumers never see this cap" claim that was false
19779
+ * for `data-store-provider`, here gating raw file I/O instead of raw
19780
+ * settings rows. The only legitimate caller,
19781
+ * `addon-registry.service.ts`'s `activeStorageProvider`, calls the
19782
+ * provider object directly (in-process) — never tRPC — so `auth: 'admin'`
19783
+ * on every method costs it nothing. Public consumers already go through
19784
+ * the separate `storage` singleton cap.
19785
+ */
19707
19786
  /** Self-description for the "Add location" wizard. */
19708
- getProviderInfo: method(_void(), ProviderInfoSchema),
19787
+ getProviderInfo: method(_void(), ProviderInfoSchema, { auth: "admin" }),
19709
19788
  /** Validate config + probe connectivity. Called on add and on edit. */
19710
19789
  testLocation: method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }),
19711
19790
  resolve: method(object({
19712
19791
  location: StorageLocationSchema,
19713
19792
  relativePath: string()
19714
- }), string()),
19793
+ }), string(), { auth: "admin" }),
19715
19794
  write: method(object({
19716
19795
  location: StorageLocationSchema,
19717
19796
  relativePath: string(),
19718
19797
  data: _instanceof(Uint8Array)
19719
- }), _void(), { kind: "mutation" }),
19798
+ }), _void(), {
19799
+ kind: "mutation",
19800
+ auth: "admin"
19801
+ }),
19720
19802
  read: method(object({
19721
19803
  location: StorageLocationSchema,
19722
19804
  relativePath: string()
19723
- }), _instanceof(Uint8Array)),
19805
+ }), _instanceof(Uint8Array), { auth: "admin" }),
19724
19806
  exists: method(object({
19725
19807
  location: StorageLocationSchema,
19726
19808
  relativePath: string()
19727
- }), boolean()),
19809
+ }), boolean(), { auth: "admin" }),
19728
19810
  list: method(object({
19729
19811
  location: StorageLocationSchema,
19730
19812
  prefix: string().optional()
19731
- }), array(string()).readonly()),
19813
+ }), array(string()).readonly(), { auth: "admin" }),
19732
19814
  delete: method(object({
19733
19815
  location: StorageLocationSchema,
19734
19816
  relativePath: string()
19735
- }), _void(), { kind: "mutation" }),
19736
- getAvailableSpace: method(object({ location: StorageLocationSchema }), number().nullable()),
19737
- beginUpload: method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }),
19738
- writeChunk: method(WriteChunkInputSchema, _void(), { kind: "mutation" }),
19739
- finalizeUpload: method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }),
19740
- abortUpload: method(AbortUploadInputSchema, _void(), { kind: "mutation" }),
19741
- beginDownload: method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }),
19742
- readChunk: method(ReadChunkInputSchema, _instanceof(Uint8Array)),
19743
- endDownload: method(EndDownloadInputSchema, _void(), { kind: "mutation" })
19817
+ }), _void(), {
19818
+ kind: "mutation",
19819
+ auth: "admin"
19820
+ }),
19821
+ getAvailableSpace: method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }),
19822
+ beginUpload: method(BeginUploadInputSchema, BeginUploadResultSchema, {
19823
+ kind: "mutation",
19824
+ auth: "admin"
19825
+ }),
19826
+ writeChunk: method(WriteChunkInputSchema, _void(), {
19827
+ kind: "mutation",
19828
+ auth: "admin"
19829
+ }),
19830
+ finalizeUpload: method(FinalizeUploadInputSchema, _void(), {
19831
+ kind: "mutation",
19832
+ auth: "admin"
19833
+ }),
19834
+ abortUpload: method(AbortUploadInputSchema, _void(), {
19835
+ kind: "mutation",
19836
+ auth: "admin"
19837
+ }),
19838
+ beginDownload: method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19839
+ kind: "mutation",
19840
+ auth: "admin"
19841
+ }),
19842
+ readChunk: method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }),
19843
+ endDownload: method(EndDownloadInputSchema, _void(), {
19844
+ kind: "mutation",
19845
+ auth: "admin"
19846
+ })
19744
19847
  }
19745
19848
  };
19746
19849
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
@@ -20000,7 +20103,8 @@ method(object({
20000
20103
  access: "create"
20001
20104
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20002
20105
  kind: "mutation",
20003
- access: "view"
20106
+ access: "view",
20107
+ auth: "admin"
20004
20108
  }), method(object({
20005
20109
  /** Required — the user the assertion belongs to (verified). */
20006
20110
  userId: string(),
@@ -20008,10 +20112,12 @@ method(object({
20008
20112
  response: record(string(), unknown())
20009
20113
  }), object({ verified: boolean() }), {
20010
20114
  kind: "mutation",
20011
- access: "view"
20115
+ access: "view",
20116
+ auth: "admin"
20012
20117
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20013
20118
  kind: "mutation",
20014
- access: "view"
20119
+ access: "view",
20120
+ auth: "admin"
20015
20121
  }), method(object({
20016
20122
  /** AuthenticationResponseJSON from the browser. */
20017
20123
  response: record(string(), unknown()) }), object({
@@ -20019,7 +20125,8 @@ response: record(string(), unknown()) }), object({
20019
20125
  userId: string().nullable()
20020
20126
  }), {
20021
20127
  kind: "mutation",
20022
- access: "view"
20128
+ access: "view",
20129
+ auth: "admin"
20023
20130
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20024
20131
  userId: string(),
20025
20132
  credentialId: string()
@@ -20191,7 +20298,19 @@ var VectorStatsResultSchema = object({
20191
20298
  /** False when the backend ranks approximately. */
20192
20299
  exact: boolean()
20193
20300
  });
20194
- 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);
20301
+ method(VectorDeclareIndexInputSchema, _void(), {
20302
+ kind: "mutation",
20303
+ auth: "admin"
20304
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20305
+ kind: "mutation",
20306
+ auth: "admin"
20307
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20308
+ kind: "mutation",
20309
+ auth: "admin"
20310
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20311
+ kind: "mutation",
20312
+ auth: "admin"
20313
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20195
20314
  var ClipSchema = object({
20196
20315
  /** Opaque, provider-namespaced id. The default provider encodes the time
20197
20316
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21914,7 +22033,27 @@ var MediaFileLiteSchema$1 = object({
21914
22033
  sizeBytes: number(),
21915
22034
  timestamp: number()
21916
22035
  });
21917
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22036
+ method(object({
22037
+ /**
22038
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22039
+ *
22040
+ * Default `false`, the same inversion `listRecentFaces` and
22041
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22042
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22043
+ * on the live hub the same day: four identities cost 40,979 B with the
22044
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22045
+ * four times and the viewer holds at `staleTime: 30_000`.
22046
+ *
22047
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22048
+ * the `event-media` plane serves that key `immutable` with an ETag.
22049
+ *
22050
+ * **This is an INPUT field, so it does not reach the addon until the
22051
+ * next train** — the hub router validates cap inputs against its own
22052
+ * compiled Zod and strips a key it does not know. Until then the
22053
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22054
+ * is what ships, and the opt-in becomes reachable when the train lands.
22055
+ */
22056
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21918
22057
  kind: "mutation",
21919
22058
  auth: "admin"
21920
22059
  }), method(object({
@@ -24061,8 +24200,10 @@ var PlateInfoSchema = object({
24061
24200
  keyFrameMediaKey: string().optional(),
24062
24201
  base64: string().optional(),
24063
24202
  /**
24064
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24065
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24203
+ * Same crop as a data-plane URL, always present when the plate has a stored
24204
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24205
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24206
+ * left at its `true` default.
24066
24207
  */
24067
24208
  cropUrl: string().optional()
24068
24209
  });
@@ -24082,14 +24223,34 @@ var PlateClusterSchema = object({
24082
24223
  });
24083
24224
  method(object({
24084
24225
  deviceId: number().int().optional(),
24085
- limit: number().int().positive().optional()
24226
+ limit: number().int().positive().optional(),
24227
+ /**
24228
+ * Inline the base64 crop on every row. Default `true` — the existing
24229
+ * behaviour, kept so no caller breaks.
24230
+ *
24231
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24232
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24233
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24234
+ * metadata without them — and the browser then caches the images.
24235
+ *
24236
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24237
+ * plates were the one gallery list left without it.
24238
+ *
24239
+ * **This is an INPUT field, so it does not reach the addon until the
24240
+ * next train.** The hub router validates cap inputs against its own
24241
+ * compiled Zod and strips a key it does not know. Until the train
24242
+ * ships, sending `false` is harmless and keeps the crops inline.
24243
+ */
24244
+ includeCrops: boolean().optional()
24086
24245
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24087
24246
  deviceId: number().int(),
24088
24247
  trackId: string()
24089
24248
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24090
24249
  text: string().min(1),
24091
24250
  maxDistance: number().int().min(0).optional(),
24092
- limit: number().int().positive().optional()
24251
+ limit: number().int().positive().optional(),
24252
+ /** See `listPlates.includeCrops`. Default `true`. */
24253
+ includeCrops: boolean().optional()
24093
24254
  }), array(PlateInfoSchema).readonly()), method(object({
24094
24255
  maxDistance: number().int().min(0).optional(),
24095
24256
  minClusterSize: number().int().min(2).optional(),
@@ -24103,7 +24264,13 @@ method(object({
24103
24264
  }), method(object({ plateId: string() }), _void(), {
24104
24265
  kind: "mutation",
24105
24266
  auth: "admin"
24106
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24267
+ }), method(object({
24268
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24269
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24270
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24271
+ * INPUT field: stripped by the hub router until the train ships, which
24272
+ * resolves to `false` and is exactly the intended default. */
24273
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24107
24274
  kind: "mutation",
24108
24275
  auth: "admin"
24109
24276
  }), method(object({
@@ -29480,6 +29647,12 @@ Object.freeze({
29480
29647
  addonId: null,
29481
29648
  access: "create"
29482
29649
  },
29650
+ "pipelineAnalytics.cancelRelocateMedia": {
29651
+ capName: "pipeline-analytics",
29652
+ capScope: "device",
29653
+ addonId: null,
29654
+ access: "create"
29655
+ },
29483
29656
  "pipelineAnalytics.cancelStorageMigrationMove": {
29484
29657
  capName: "pipeline-analytics",
29485
29658
  capScope: "device",
@@ -29654,6 +29827,12 @@ Object.freeze({
29654
29827
  addonId: null,
29655
29828
  access: "view"
29656
29829
  },
29830
+ "pipelineAnalytics.listRelocateMediaJobs": {
29831
+ capName: "pipeline-analytics",
29832
+ capScope: "device",
29833
+ addonId: null,
29834
+ access: "view"
29835
+ },
29657
29836
  "pipelineAnalytics.listRetrainAnnotations": {
29658
29837
  capName: "pipeline-analytics",
29659
29838
  capScope: "device",
@@ -29732,6 +29911,12 @@ Object.freeze({
29732
29911
  addonId: null,
29733
29912
  access: "create"
29734
29913
  },
29914
+ "pipelineAnalytics.relocateMedia": {
29915
+ capName: "pipeline-analytics",
29916
+ capScope: "device",
29917
+ addonId: null,
29918
+ access: "create"
29919
+ },
29735
29920
  "pipelineAnalytics.restageRetrainTrack": {
29736
29921
  capName: "pipeline-analytics",
29737
29922
  capScope: "device",