@camstack/addon-smtp-nodemailer 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.
@@ -6667,7 +6667,7 @@ function method(input, output, options) {
6667
6667
  input,
6668
6668
  output,
6669
6669
  kind: options?.kind ?? "query",
6670
- auth: options?.auth ?? "protected",
6670
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6671
6671
  ...options?.access !== void 0 ? { access: options.access } : {},
6672
6672
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6673
6673
  timeoutMs: options?.timeoutMs
@@ -6687,7 +6687,7 @@ function systemMethod(input, output, options) {
6687
6687
  }
6688
6688
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6689
6689
  var VersionOutputSchema$1 = object({ version: string() });
6690
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6690
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6691
6691
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6692
6692
  DeviceType["Camera"] = "camera";
6693
6693
  DeviceType["Hub"] = "hub";
@@ -7008,7 +7008,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7008
7008
  }({});
7009
7009
  var StaticDirOutputSchema = object({ staticDir: string() });
7010
7010
  var VersionOutputSchema = object({ version: string() });
7011
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7011
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7012
7012
  /**
7013
7013
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7014
7014
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7622,24 +7622,6 @@ var RecordingRetentionSchema = object({
7622
7622
  maxSizeGb: number().min(0).optional()
7623
7623
  });
7624
7624
  /**
7625
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7626
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7627
- * previews at. Five graduated steps; absent on a config = `standard` (the
7628
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7629
- *
7630
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7631
- * Each window's index sidecar carries its own tile dims, so a camera whose
7632
- * preset changed over time renders every historical window at the dims it was
7633
- * written with.
7634
- */
7635
- var ScrubThumbnailPresetSchema = _enum([
7636
- "minimal",
7637
- "low",
7638
- "standard",
7639
- "high",
7640
- "max"
7641
- ]);
7642
- /**
7643
7625
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7644
7626
  *
7645
7627
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7647,7 +7629,11 @@ var ScrubThumbnailPresetSchema = _enum([
7647
7629
  * other field is a storage knob (profiles, segment length, retention, scrub).
7648
7630
  *
7649
7631
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7650
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7632
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7633
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7634
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7635
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7636
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7651
7637
  * A stale caller must fail loudly — silently stripping its legacy intent would
7652
7638
  * persist a band-less config, i.e. silently stop recording the camera.
7653
7639
  */
@@ -7670,14 +7656,7 @@ var RecordingConfigSchema = object({
7670
7656
  * "off" is the absence of a covering band, never a band value.
7671
7657
  */
7672
7658
  bands: array(RecordingBandSchema).default([]),
7673
- retention: RecordingRetentionSchema.optional(),
7674
- /**
7675
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7676
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7677
- * windows only — existing sheets are immutable, and each window's index
7678
- * carries its own tile dims so mixed-preset history renders correctly.
7679
- */
7680
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7659
+ retention: RecordingRetentionSchema.optional()
7681
7660
  }).strict();
7682
7661
  /**
7683
7662
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7753,10 +7732,11 @@ var RelocateFootageInputSchema = object({
7753
7732
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7754
7733
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7755
7734
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7756
- var StorageMigrationMediaMoveInputSchema = object({
7735
+ var RelocateMediaInputSchema = object({
7757
7736
  toLocationId: string(),
7758
7737
  throttleMbps: number().min(1).max(1e3).optional()
7759
- }).extend({ leaseId: string().min(1) });
7738
+ });
7739
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7760
7740
  /** The independently selectable logical storage classes. `recordings`
7761
7741
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7762
7742
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8051,7 +8031,26 @@ var LabelDefinitionSchema = object({
8051
8031
  description: string().optional(),
8052
8032
  icon: string().optional()
8053
8033
  });
8054
- var ClassMapDefinitionSchema = object({
8034
+ /**
8035
+ * Wire schema for a per-model CATALOG classMap override
8036
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8037
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8038
+ * detection pipeline executor actually routes.
8039
+ *
8040
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8041
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8042
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8043
+ * enum) — the two used to share the name `ClassMapDefinition`/
8044
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8045
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8046
+ * are not: it is two different concepts colliding on a name. Keep this type
8047
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8048
+ * would either narrow every `ClassMapDefinition` consumer to the four
8049
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8050
+ * schema exists for (see the "rejects a classMap whose target is not a
8051
+ * detection macro" test in `model-catalog-schema.test.ts`).
8052
+ */
8053
+ var DetectionCatalogClassMapSchema = object({
8055
8054
  mapping: record(string(), _enum([
8056
8055
  "person",
8057
8056
  "vehicle",
@@ -8256,7 +8255,7 @@ var ModelCatalogEntrySchema = object({
8256
8255
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8257
8256
  * labels already ARE the CamStack macros (Scrypted identity map).
8258
8257
  */
8259
- classMap: ClassMapDefinitionSchema.optional()
8258
+ classMap: DetectionCatalogClassMapSchema.optional()
8260
8259
  });
8261
8260
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8262
8261
  format: literal("openvino"),
@@ -8286,7 +8285,7 @@ var ModelConvertMetadataSchema = object({
8286
8285
  "segmentation"
8287
8286
  ]),
8288
8287
  faceAlignment: boolean().optional(),
8289
- classMap: ClassMapDefinitionSchema.optional()
8288
+ classMap: DetectionCatalogClassMapSchema.optional()
8290
8289
  });
8291
8290
  var ConvertResultSchema = object({
8292
8291
  entry: ModelCatalogEntrySchema,
@@ -9149,7 +9148,7 @@ var AddonPageDeclarationSchema = object({
9149
9148
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9150
9149
  sectionLabel: string().optional()
9151
9150
  });
9152
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9151
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9153
9152
  var AddonHttpRouteSchema = object({
9154
9153
  method: _enum([
9155
9154
  "GET",
@@ -9384,7 +9383,7 @@ var WidgetMetadataSchema = object({
9384
9383
  defaultColumns: number().int().min(1).max(12).default(6),
9385
9384
  defaultRows: number().int().min(1).max(12).default(1)
9386
9385
  });
9387
- method(_void(), array(WidgetMetadataSchema).readonly());
9386
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9388
9387
  /**
9389
9388
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9390
9389
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10906,7 +10905,7 @@ var CustomModelDescriptorSchema = object({
10906
10905
  stepId: string(),
10907
10906
  entry: ModelCatalogEntrySchema
10908
10907
  });
10909
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10908
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10910
10909
  /**
10911
10910
  * Query filter for settings-store collections.
10912
10911
  */
@@ -10993,7 +10992,8 @@ method(object({
10993
10992
  }), _void(), { kind: "mutation" }), method(object({
10994
10993
  namespace: string().optional(),
10995
10994
  collection: string(),
10996
- filter: QueryFilterSchema.optional()
10995
+ filter: QueryFilterSchema.optional(),
10996
+ columns: array(string()).readonly().optional()
10997
10997
  }), array(SettingsRecordSchema).readonly()), method(object({
10998
10998
  namespace: string().optional(),
10999
10999
  collection: string(),
@@ -11056,46 +11056,87 @@ var EngineInfoSchema = object({
11056
11056
  kind: _enum(["relational", "vector"]),
11057
11057
  displayName: string()
11058
11058
  });
11059
- method(_void(), EngineInfoSchema), method(object({
11059
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11060
11060
  namespace: string().optional(),
11061
11061
  collection: string(),
11062
11062
  key: string()
11063
- }), unknown()), method(object({
11063
+ }), unknown(), { auth: "admin" }), method(object({
11064
11064
  namespace: string().optional(),
11065
11065
  collection: string(),
11066
11066
  key: string(),
11067
11067
  value: unknown()
11068
- }), _void(), { kind: "mutation" }), method(object({
11068
+ }), _void(), {
11069
+ kind: "mutation",
11070
+ auth: "admin"
11071
+ }), method(object({
11069
11072
  namespace: string().optional(),
11070
11073
  collection: string(),
11071
- filter: QueryFilterSchema.optional()
11072
- }), array(SettingsRecordSchema).readonly()), method(object({
11074
+ filter: QueryFilterSchema.optional(),
11075
+ /**
11076
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11077
+ *
11078
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11079
+ * was wrong — corrected 2026-08-26 after the hop map
11080
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11081
+ * There is **no Zod parse at all** between the door and the engine: the
11082
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11083
+ * field declared here reaches `SqliteSettingsBackend` either way.
11084
+ *
11085
+ * What actually lost `columns` was the THIRD declaration of this shape:
11086
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11087
+ * interface the engine destructures from. The field existed on both
11088
+ * schemas and the engine still never read it, because nothing checks a
11089
+ * registered provider against `InferProvider<cap>` —
11090
+ * `ProviderRegistration.provider` is typed `object`.
11091
+ *
11092
+ * It is declared here anyway, and must stay in step with
11093
+ * `settings-store.query`: a caller reading only the cap definitions has
11094
+ * to be able to see that this call carries a projection.
11095
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11096
+ */
11097
+ columns: array(string()).readonly().optional()
11098
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11073
11099
  namespace: string().optional(),
11074
11100
  collection: string(),
11075
11101
  record: SettingsRecordSchema
11076
- }), _void(), { kind: "mutation" }), method(object({
11102
+ }), _void(), {
11103
+ kind: "mutation",
11104
+ auth: "admin"
11105
+ }), method(object({
11077
11106
  namespace: string().optional(),
11078
11107
  collection: string(),
11079
11108
  id: string(),
11080
11109
  data: record(string(), unknown())
11081
- }), _void(), { kind: "mutation" }), method(object({
11110
+ }), _void(), {
11111
+ kind: "mutation",
11112
+ auth: "admin"
11113
+ }), method(object({
11082
11114
  namespace: string().optional(),
11083
11115
  collection: string(),
11084
11116
  key: string()
11085
- }), _void(), { kind: "mutation" }), method(object({
11117
+ }), _void(), {
11118
+ kind: "mutation",
11119
+ auth: "admin"
11120
+ }), method(object({
11086
11121
  namespace: string().optional(),
11087
11122
  collection: string(),
11088
11123
  filter: MutationFilterSchema
11089
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11124
+ }), object({ deleted: number().int() }), {
11125
+ kind: "mutation",
11126
+ auth: "admin"
11127
+ }), method(object({
11090
11128
  namespace: string().optional(),
11091
11129
  collection: string(),
11092
11130
  filter: MutationFilterSchema,
11093
11131
  data: record(string(), unknown())
11094
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11132
+ }), object({ updated: number().int() }), {
11133
+ kind: "mutation",
11134
+ auth: "admin"
11135
+ }), method(object({
11095
11136
  namespace: string().optional(),
11096
11137
  collection: string(),
11097
11138
  filter: QueryFilterSchema.optional()
11098
- }), number()), method(object({
11139
+ }), number(), { auth: "admin" }), method(object({
11099
11140
  namespace: string().optional(),
11100
11141
  collection: string(),
11101
11142
  field: string(),
@@ -11105,15 +11146,18 @@ method(_void(), EngineInfoSchema), method(object({
11105
11146
  }), array(object({
11106
11147
  bucket: number().int(),
11107
11148
  count: number().int()
11108
- })).readonly()), method(object({
11149
+ })).readonly(), { auth: "admin" }), method(object({
11109
11150
  namespace: string().optional(),
11110
11151
  collection: string()
11111
- }), boolean()), method(object({
11152
+ }), boolean(), { auth: "admin" }), method(object({
11112
11153
  namespace: string().optional(),
11113
11154
  collection: string(),
11114
11155
  columns: array(CollectionColumnSchema).readonly(),
11115
11156
  indexes: array(CollectionIndexSchema).readonly().optional()
11116
- }), _void(), { kind: "mutation" });
11157
+ }), _void(), {
11158
+ kind: "mutation",
11159
+ auth: "admin"
11160
+ });
11117
11161
  /**
11118
11162
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11119
11163
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12241,7 +12285,7 @@ method(object({
12241
12285
  crop: _instanceof(Uint8Array),
12242
12286
  width: number(),
12243
12287
  height: number()
12244
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12288
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12245
12289
  /**
12246
12290
  * filesystem-browse — per-node capability for browsing the node's local
12247
12291
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12534,19 +12578,22 @@ method(LlmGenerateBaseInputSchema.extend({
12534
12578
  runtime: ManagedRuntimeConfigSchema,
12535
12579
  /** The managed profile's timeout, threaded by the hub provider. */
12536
12580
  timeoutMs: number().int().positive().optional()
12537
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12581
+ }), LlmGenerateResultSchema, {
12582
+ kind: "mutation",
12583
+ auth: "admin"
12584
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12538
12585
  kind: "mutation",
12539
12586
  auth: "admin"
12540
12587
  }), method(object({}), _void(), {
12541
12588
  kind: "mutation",
12542
12589
  auth: "admin"
12543
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12590
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12544
12591
  kind: "mutation",
12545
12592
  auth: "admin"
12546
12593
  }), method(object({ file: string() }), _void(), {
12547
12594
  kind: "mutation",
12548
12595
  auth: "admin"
12549
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12596
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12550
12597
  /**
12551
12598
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12552
12599
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16019,7 +16066,7 @@ var OauthIntegrationDescriptorSchema = object({
16019
16066
  */
16020
16067
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16021
16068
  });
16022
- method(_void(), OauthIntegrationDescriptorSchema);
16069
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16023
16070
  /**
16024
16071
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16025
16072
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17214,6 +17261,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17214
17261
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17215
17262
  kind: "mutation",
17216
17263
  auth: "admin"
17264
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17265
+ kind: "mutation",
17266
+ auth: "admin"
17267
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17268
+ kind: "query",
17269
+ auth: "admin"
17270
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17271
+ kind: "mutation",
17272
+ auth: "admin"
17217
17273
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17218
17274
  kind: "query",
17219
17275
  auth: "admin"
@@ -17368,6 +17424,11 @@ object({
17368
17424
  "jpeg"
17369
17425
  ])
17370
17426
  });
17427
+ /**
17428
+ * Process-local frame identity. It is serializable so it can ride an in-process
17429
+ * capability call, but `registryId` deliberately prevents resolution in any
17430
+ * other process or execution group.
17431
+ */
17371
17432
  var FrameRefSchema = object({
17372
17433
  registryId: string().min(1),
17373
17434
  id: string().min(1),
@@ -19546,7 +19607,7 @@ method(object({
19546
19607
  * linking rather than produce an eternal token.
19547
19608
  */
19548
19609
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19549
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19610
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19550
19611
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19551
19612
  providerId: string().min(1),
19552
19613
  displayName: string().min(1),
@@ -19641,10 +19702,13 @@ var EvictResultSchema = object({
19641
19702
  /** True when the provider has nothing left it is willing to drop on this location. */
19642
19703
  exhausted: boolean()
19643
19704
  });
19644
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19705
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19645
19706
  locationId: string(),
19646
19707
  targetBytes: number().int().positive()
19647
- }), EvictResultSchema, { kind: "mutation" });
19708
+ }), EvictResultSchema, {
19709
+ kind: "mutation",
19710
+ auth: "admin"
19711
+ });
19648
19712
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19649
19713
  kind: "mutation",
19650
19714
  auth: "admin"
@@ -19704,26 +19768,50 @@ var ReadChunkInputSchema = object({
19704
19768
  length: number()
19705
19769
  });
19706
19770
  var EndDownloadInputSchema = object({ downloadId: string() });
19707
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19771
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19708
19772
  location: StorageLocationSchema,
19709
19773
  relativePath: string()
19710
- }), string()), method(object({
19774
+ }), string(), { auth: "admin" }), method(object({
19711
19775
  location: StorageLocationSchema,
19712
19776
  relativePath: string(),
19713
19777
  data: _instanceof(Uint8Array)
19714
- }), _void(), { kind: "mutation" }), method(object({
19778
+ }), _void(), {
19779
+ kind: "mutation",
19780
+ auth: "admin"
19781
+ }), method(object({
19715
19782
  location: StorageLocationSchema,
19716
19783
  relativePath: string()
19717
- }), _instanceof(Uint8Array)), method(object({
19784
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19718
19785
  location: StorageLocationSchema,
19719
19786
  relativePath: string()
19720
- }), boolean()), method(object({
19787
+ }), boolean(), { auth: "admin" }), method(object({
19721
19788
  location: StorageLocationSchema,
19722
19789
  prefix: string().optional()
19723
- }), array(string()).readonly()), method(object({
19790
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19724
19791
  location: StorageLocationSchema,
19725
19792
  relativePath: string()
19726
- }), _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" });
19793
+ }), _void(), {
19794
+ kind: "mutation",
19795
+ auth: "admin"
19796
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19797
+ kind: "mutation",
19798
+ auth: "admin"
19799
+ }), method(WriteChunkInputSchema, _void(), {
19800
+ kind: "mutation",
19801
+ auth: "admin"
19802
+ }), method(FinalizeUploadInputSchema, _void(), {
19803
+ kind: "mutation",
19804
+ auth: "admin"
19805
+ }), method(AbortUploadInputSchema, _void(), {
19806
+ kind: "mutation",
19807
+ auth: "admin"
19808
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19809
+ kind: "mutation",
19810
+ auth: "admin"
19811
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19812
+ kind: "mutation",
19813
+ auth: "admin"
19814
+ });
19727
19815
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19728
19816
  var ProfileSettingsSchemaBridge = unknown().nullable();
19729
19817
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -19981,7 +20069,8 @@ method(object({
19981
20069
  access: "create"
19982
20070
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
19983
20071
  kind: "mutation",
19984
- access: "view"
20072
+ access: "view",
20073
+ auth: "admin"
19985
20074
  }), method(object({
19986
20075
  /** Required — the user the assertion belongs to (verified). */
19987
20076
  userId: string(),
@@ -19989,10 +20078,12 @@ method(object({
19989
20078
  response: record(string(), unknown())
19990
20079
  }), object({ verified: boolean() }), {
19991
20080
  kind: "mutation",
19992
- access: "view"
20081
+ access: "view",
20082
+ auth: "admin"
19993
20083
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
19994
20084
  kind: "mutation",
19995
- access: "view"
20085
+ access: "view",
20086
+ auth: "admin"
19996
20087
  }), method(object({
19997
20088
  /** AuthenticationResponseJSON from the browser. */
19998
20089
  response: record(string(), unknown()) }), object({
@@ -20000,7 +20091,8 @@ response: record(string(), unknown()) }), object({
20000
20091
  userId: string().nullable()
20001
20092
  }), {
20002
20093
  kind: "mutation",
20003
- access: "view"
20094
+ access: "view",
20095
+ auth: "admin"
20004
20096
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20005
20097
  userId: string(),
20006
20098
  credentialId: string()
@@ -20172,7 +20264,19 @@ var VectorStatsResultSchema = object({
20172
20264
  /** False when the backend ranks approximately. */
20173
20265
  exact: boolean()
20174
20266
  });
20175
- 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);
20267
+ method(VectorDeclareIndexInputSchema, _void(), {
20268
+ kind: "mutation",
20269
+ auth: "admin"
20270
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20271
+ kind: "mutation",
20272
+ auth: "admin"
20273
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20274
+ kind: "mutation",
20275
+ auth: "admin"
20276
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20277
+ kind: "mutation",
20278
+ auth: "admin"
20279
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20176
20280
  var ClipSchema = object({
20177
20281
  /** Opaque, provider-namespaced id. The default provider encodes the time
20178
20282
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21895,7 +21999,27 @@ var MediaFileLiteSchema$1 = object({
21895
21999
  sizeBytes: number(),
21896
22000
  timestamp: number()
21897
22001
  });
21898
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22002
+ method(object({
22003
+ /**
22004
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22005
+ *
22006
+ * Default `false`, the same inversion `listRecentFaces` and
22007
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22008
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22009
+ * on the live hub the same day: four identities cost 40,979 B with the
22010
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22011
+ * four times and the viewer holds at `staleTime: 30_000`.
22012
+ *
22013
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22014
+ * the `event-media` plane serves that key `immutable` with an ETag.
22015
+ *
22016
+ * **This is an INPUT field, so it does not reach the addon until the
22017
+ * next train** — the hub router validates cap inputs against its own
22018
+ * compiled Zod and strips a key it does not know. Until then the
22019
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22020
+ * is what ships, and the opt-in becomes reachable when the train lands.
22021
+ */
22022
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21899
22023
  kind: "mutation",
21900
22024
  auth: "admin"
21901
22025
  }), method(object({
@@ -24042,8 +24166,10 @@ var PlateInfoSchema = object({
24042
24166
  keyFrameMediaKey: string().optional(),
24043
24167
  base64: string().optional(),
24044
24168
  /**
24045
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24046
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24169
+ * Same crop as a data-plane URL, always present when the plate has a stored
24170
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24171
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24172
+ * left at its `true` default.
24047
24173
  */
24048
24174
  cropUrl: string().optional()
24049
24175
  });
@@ -24063,14 +24189,34 @@ var PlateClusterSchema = object({
24063
24189
  });
24064
24190
  method(object({
24065
24191
  deviceId: number().int().optional(),
24066
- limit: number().int().positive().optional()
24192
+ limit: number().int().positive().optional(),
24193
+ /**
24194
+ * Inline the base64 crop on every row. Default `true` — the existing
24195
+ * behaviour, kept so no caller breaks.
24196
+ *
24197
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24198
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24199
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24200
+ * metadata without them — and the browser then caches the images.
24201
+ *
24202
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24203
+ * plates were the one gallery list left without it.
24204
+ *
24205
+ * **This is an INPUT field, so it does not reach the addon until the
24206
+ * next train.** The hub router validates cap inputs against its own
24207
+ * compiled Zod and strips a key it does not know. Until the train
24208
+ * ships, sending `false` is harmless and keeps the crops inline.
24209
+ */
24210
+ includeCrops: boolean().optional()
24067
24211
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24068
24212
  deviceId: number().int(),
24069
24213
  trackId: string()
24070
24214
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24071
24215
  text: string().min(1),
24072
24216
  maxDistance: number().int().min(0).optional(),
24073
- limit: number().int().positive().optional()
24217
+ limit: number().int().positive().optional(),
24218
+ /** See `listPlates.includeCrops`. Default `true`. */
24219
+ includeCrops: boolean().optional()
24074
24220
  }), array(PlateInfoSchema).readonly()), method(object({
24075
24221
  maxDistance: number().int().min(0).optional(),
24076
24222
  minClusterSize: number().int().min(2).optional(),
@@ -24084,7 +24230,13 @@ method(object({
24084
24230
  }), method(object({ plateId: string() }), _void(), {
24085
24231
  kind: "mutation",
24086
24232
  auth: "admin"
24087
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24233
+ }), method(object({
24234
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24235
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24236
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24237
+ * INPUT field: stripped by the hub router until the train ships, which
24238
+ * resolves to `false` and is exactly the intended default. */
24239
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24088
24240
  kind: "mutation",
24089
24241
  auth: "admin"
24090
24242
  }), method(object({
@@ -29461,6 +29613,12 @@ Object.freeze({
29461
29613
  addonId: null,
29462
29614
  access: "create"
29463
29615
  },
29616
+ "pipelineAnalytics.cancelRelocateMedia": {
29617
+ capName: "pipeline-analytics",
29618
+ capScope: "device",
29619
+ addonId: null,
29620
+ access: "create"
29621
+ },
29464
29622
  "pipelineAnalytics.cancelStorageMigrationMove": {
29465
29623
  capName: "pipeline-analytics",
29466
29624
  capScope: "device",
@@ -29635,6 +29793,12 @@ Object.freeze({
29635
29793
  addonId: null,
29636
29794
  access: "view"
29637
29795
  },
29796
+ "pipelineAnalytics.listRelocateMediaJobs": {
29797
+ capName: "pipeline-analytics",
29798
+ capScope: "device",
29799
+ addonId: null,
29800
+ access: "view"
29801
+ },
29638
29802
  "pipelineAnalytics.listRetrainAnnotations": {
29639
29803
  capName: "pipeline-analytics",
29640
29804
  capScope: "device",
@@ -29713,6 +29877,12 @@ Object.freeze({
29713
29877
  addonId: null,
29714
29878
  access: "create"
29715
29879
  },
29880
+ "pipelineAnalytics.relocateMedia": {
29881
+ capName: "pipeline-analytics",
29882
+ capScope: "device",
29883
+ addonId: null,
29884
+ access: "create"
29885
+ },
29716
29886
  "pipelineAnalytics.restageRetrainTrack": {
29717
29887
  capName: "pipeline-analytics",
29718
29888
  capScope: "device",
@@ -6665,7 +6665,7 @@ function method(input, output, options) {
6665
6665
  input,
6666
6666
  output,
6667
6667
  kind: options?.kind ?? "query",
6668
- auth: options?.auth ?? "protected",
6668
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6669
6669
  ...options?.access !== void 0 ? { access: options.access } : {},
6670
6670
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6671
6671
  timeoutMs: options?.timeoutMs
@@ -6685,7 +6685,7 @@ function systemMethod(input, output, options) {
6685
6685
  }
6686
6686
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6687
6687
  var VersionOutputSchema$1 = object({ version: string() });
6688
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6688
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6689
6689
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6690
6690
  DeviceType["Camera"] = "camera";
6691
6691
  DeviceType["Hub"] = "hub";
@@ -7006,7 +7006,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7006
7006
  }({});
7007
7007
  var StaticDirOutputSchema = object({ staticDir: string() });
7008
7008
  var VersionOutputSchema = object({ version: string() });
7009
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7009
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7010
7010
  /**
7011
7011
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7012
7012
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7620,24 +7620,6 @@ var RecordingRetentionSchema = object({
7620
7620
  maxSizeGb: number().min(0).optional()
7621
7621
  });
7622
7622
  /**
7623
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7624
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7625
- * previews at. Five graduated steps; absent on a config = `standard` (the
7626
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7627
- *
7628
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7629
- * Each window's index sidecar carries its own tile dims, so a camera whose
7630
- * preset changed over time renders every historical window at the dims it was
7631
- * written with.
7632
- */
7633
- var ScrubThumbnailPresetSchema = _enum([
7634
- "minimal",
7635
- "low",
7636
- "standard",
7637
- "high",
7638
- "max"
7639
- ]);
7640
- /**
7641
7623
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7642
7624
  *
7643
7625
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7645,7 +7627,11 @@ var ScrubThumbnailPresetSchema = _enum([
7645
7627
  * other field is a storage knob (profiles, segment length, retention, scrub).
7646
7628
  *
7647
7629
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7648
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7630
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7631
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7632
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7633
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7634
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7649
7635
  * A stale caller must fail loudly — silently stripping its legacy intent would
7650
7636
  * persist a band-less config, i.e. silently stop recording the camera.
7651
7637
  */
@@ -7668,14 +7654,7 @@ var RecordingConfigSchema = object({
7668
7654
  * "off" is the absence of a covering band, never a band value.
7669
7655
  */
7670
7656
  bands: array(RecordingBandSchema).default([]),
7671
- retention: RecordingRetentionSchema.optional(),
7672
- /**
7673
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7674
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7675
- * windows only — existing sheets are immutable, and each window's index
7676
- * carries its own tile dims so mixed-preset history renders correctly.
7677
- */
7678
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7657
+ retention: RecordingRetentionSchema.optional()
7679
7658
  }).strict();
7680
7659
  /**
7681
7660
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7751,10 +7730,11 @@ var RelocateFootageInputSchema = object({
7751
7730
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7752
7731
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7753
7732
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7754
- var StorageMigrationMediaMoveInputSchema = object({
7733
+ var RelocateMediaInputSchema = object({
7755
7734
  toLocationId: string(),
7756
7735
  throttleMbps: number().min(1).max(1e3).optional()
7757
- }).extend({ leaseId: string().min(1) });
7736
+ });
7737
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7758
7738
  /** The independently selectable logical storage classes. `recordings`
7759
7739
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7760
7740
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8049,7 +8029,26 @@ var LabelDefinitionSchema = object({
8049
8029
  description: string().optional(),
8050
8030
  icon: string().optional()
8051
8031
  });
8052
- var ClassMapDefinitionSchema = object({
8032
+ /**
8033
+ * Wire schema for a per-model CATALOG classMap override
8034
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8035
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8036
+ * detection pipeline executor actually routes.
8037
+ *
8038
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8039
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8040
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8041
+ * enum) — the two used to share the name `ClassMapDefinition`/
8042
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8043
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8044
+ * are not: it is two different concepts colliding on a name. Keep this type
8045
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8046
+ * would either narrow every `ClassMapDefinition` consumer to the four
8047
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8048
+ * schema exists for (see the "rejects a classMap whose target is not a
8049
+ * detection macro" test in `model-catalog-schema.test.ts`).
8050
+ */
8051
+ var DetectionCatalogClassMapSchema = object({
8053
8052
  mapping: record(string(), _enum([
8054
8053
  "person",
8055
8054
  "vehicle",
@@ -8254,7 +8253,7 @@ var ModelCatalogEntrySchema = object({
8254
8253
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8255
8254
  * labels already ARE the CamStack macros (Scrypted identity map).
8256
8255
  */
8257
- classMap: ClassMapDefinitionSchema.optional()
8256
+ classMap: DetectionCatalogClassMapSchema.optional()
8258
8257
  });
8259
8258
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8260
8259
  format: literal("openvino"),
@@ -8284,7 +8283,7 @@ var ModelConvertMetadataSchema = object({
8284
8283
  "segmentation"
8285
8284
  ]),
8286
8285
  faceAlignment: boolean().optional(),
8287
- classMap: ClassMapDefinitionSchema.optional()
8286
+ classMap: DetectionCatalogClassMapSchema.optional()
8288
8287
  });
8289
8288
  var ConvertResultSchema = object({
8290
8289
  entry: ModelCatalogEntrySchema,
@@ -9147,7 +9146,7 @@ var AddonPageDeclarationSchema = object({
9147
9146
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9148
9147
  sectionLabel: string().optional()
9149
9148
  });
9150
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9149
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9151
9150
  var AddonHttpRouteSchema = object({
9152
9151
  method: _enum([
9153
9152
  "GET",
@@ -9382,7 +9381,7 @@ var WidgetMetadataSchema = object({
9382
9381
  defaultColumns: number().int().min(1).max(12).default(6),
9383
9382
  defaultRows: number().int().min(1).max(12).default(1)
9384
9383
  });
9385
- method(_void(), array(WidgetMetadataSchema).readonly());
9384
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9386
9385
  /**
9387
9386
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9388
9387
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10904,7 +10903,7 @@ var CustomModelDescriptorSchema = object({
10904
10903
  stepId: string(),
10905
10904
  entry: ModelCatalogEntrySchema
10906
10905
  });
10907
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10906
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10908
10907
  /**
10909
10908
  * Query filter for settings-store collections.
10910
10909
  */
@@ -10991,7 +10990,8 @@ method(object({
10991
10990
  }), _void(), { kind: "mutation" }), method(object({
10992
10991
  namespace: string().optional(),
10993
10992
  collection: string(),
10994
- filter: QueryFilterSchema.optional()
10993
+ filter: QueryFilterSchema.optional(),
10994
+ columns: array(string()).readonly().optional()
10995
10995
  }), array(SettingsRecordSchema).readonly()), method(object({
10996
10996
  namespace: string().optional(),
10997
10997
  collection: string(),
@@ -11054,46 +11054,87 @@ var EngineInfoSchema = object({
11054
11054
  kind: _enum(["relational", "vector"]),
11055
11055
  displayName: string()
11056
11056
  });
11057
- method(_void(), EngineInfoSchema), method(object({
11057
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11058
11058
  namespace: string().optional(),
11059
11059
  collection: string(),
11060
11060
  key: string()
11061
- }), unknown()), method(object({
11061
+ }), unknown(), { auth: "admin" }), method(object({
11062
11062
  namespace: string().optional(),
11063
11063
  collection: string(),
11064
11064
  key: string(),
11065
11065
  value: unknown()
11066
- }), _void(), { kind: "mutation" }), method(object({
11066
+ }), _void(), {
11067
+ kind: "mutation",
11068
+ auth: "admin"
11069
+ }), method(object({
11067
11070
  namespace: string().optional(),
11068
11071
  collection: string(),
11069
- filter: QueryFilterSchema.optional()
11070
- }), array(SettingsRecordSchema).readonly()), method(object({
11072
+ filter: QueryFilterSchema.optional(),
11073
+ /**
11074
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11075
+ *
11076
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11077
+ * was wrong — corrected 2026-08-26 after the hop map
11078
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11079
+ * There is **no Zod parse at all** between the door and the engine: the
11080
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11081
+ * field declared here reaches `SqliteSettingsBackend` either way.
11082
+ *
11083
+ * What actually lost `columns` was the THIRD declaration of this shape:
11084
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11085
+ * interface the engine destructures from. The field existed on both
11086
+ * schemas and the engine still never read it, because nothing checks a
11087
+ * registered provider against `InferProvider<cap>` —
11088
+ * `ProviderRegistration.provider` is typed `object`.
11089
+ *
11090
+ * It is declared here anyway, and must stay in step with
11091
+ * `settings-store.query`: a caller reading only the cap definitions has
11092
+ * to be able to see that this call carries a projection.
11093
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11094
+ */
11095
+ columns: array(string()).readonly().optional()
11096
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11071
11097
  namespace: string().optional(),
11072
11098
  collection: string(),
11073
11099
  record: SettingsRecordSchema
11074
- }), _void(), { kind: "mutation" }), method(object({
11100
+ }), _void(), {
11101
+ kind: "mutation",
11102
+ auth: "admin"
11103
+ }), method(object({
11075
11104
  namespace: string().optional(),
11076
11105
  collection: string(),
11077
11106
  id: string(),
11078
11107
  data: record(string(), unknown())
11079
- }), _void(), { kind: "mutation" }), method(object({
11108
+ }), _void(), {
11109
+ kind: "mutation",
11110
+ auth: "admin"
11111
+ }), method(object({
11080
11112
  namespace: string().optional(),
11081
11113
  collection: string(),
11082
11114
  key: string()
11083
- }), _void(), { kind: "mutation" }), method(object({
11115
+ }), _void(), {
11116
+ kind: "mutation",
11117
+ auth: "admin"
11118
+ }), method(object({
11084
11119
  namespace: string().optional(),
11085
11120
  collection: string(),
11086
11121
  filter: MutationFilterSchema
11087
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11122
+ }), object({ deleted: number().int() }), {
11123
+ kind: "mutation",
11124
+ auth: "admin"
11125
+ }), method(object({
11088
11126
  namespace: string().optional(),
11089
11127
  collection: string(),
11090
11128
  filter: MutationFilterSchema,
11091
11129
  data: record(string(), unknown())
11092
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11130
+ }), object({ updated: number().int() }), {
11131
+ kind: "mutation",
11132
+ auth: "admin"
11133
+ }), method(object({
11093
11134
  namespace: string().optional(),
11094
11135
  collection: string(),
11095
11136
  filter: QueryFilterSchema.optional()
11096
- }), number()), method(object({
11137
+ }), number(), { auth: "admin" }), method(object({
11097
11138
  namespace: string().optional(),
11098
11139
  collection: string(),
11099
11140
  field: string(),
@@ -11103,15 +11144,18 @@ method(_void(), EngineInfoSchema), method(object({
11103
11144
  }), array(object({
11104
11145
  bucket: number().int(),
11105
11146
  count: number().int()
11106
- })).readonly()), method(object({
11147
+ })).readonly(), { auth: "admin" }), method(object({
11107
11148
  namespace: string().optional(),
11108
11149
  collection: string()
11109
- }), boolean()), method(object({
11150
+ }), boolean(), { auth: "admin" }), method(object({
11110
11151
  namespace: string().optional(),
11111
11152
  collection: string(),
11112
11153
  columns: array(CollectionColumnSchema).readonly(),
11113
11154
  indexes: array(CollectionIndexSchema).readonly().optional()
11114
- }), _void(), { kind: "mutation" });
11155
+ }), _void(), {
11156
+ kind: "mutation",
11157
+ auth: "admin"
11158
+ });
11115
11159
  /**
11116
11160
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11117
11161
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12239,7 +12283,7 @@ method(object({
12239
12283
  crop: _instanceof(Uint8Array),
12240
12284
  width: number(),
12241
12285
  height: number()
12242
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12286
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12243
12287
  /**
12244
12288
  * filesystem-browse — per-node capability for browsing the node's local
12245
12289
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12532,19 +12576,22 @@ method(LlmGenerateBaseInputSchema.extend({
12532
12576
  runtime: ManagedRuntimeConfigSchema,
12533
12577
  /** The managed profile's timeout, threaded by the hub provider. */
12534
12578
  timeoutMs: number().int().positive().optional()
12535
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12579
+ }), LlmGenerateResultSchema, {
12580
+ kind: "mutation",
12581
+ auth: "admin"
12582
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12536
12583
  kind: "mutation",
12537
12584
  auth: "admin"
12538
12585
  }), method(object({}), _void(), {
12539
12586
  kind: "mutation",
12540
12587
  auth: "admin"
12541
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12588
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12542
12589
  kind: "mutation",
12543
12590
  auth: "admin"
12544
12591
  }), method(object({ file: string() }), _void(), {
12545
12592
  kind: "mutation",
12546
12593
  auth: "admin"
12547
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12594
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12548
12595
  /**
12549
12596
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12550
12597
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16017,7 +16064,7 @@ var OauthIntegrationDescriptorSchema = object({
16017
16064
  */
16018
16065
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16019
16066
  });
16020
- method(_void(), OauthIntegrationDescriptorSchema);
16067
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16021
16068
  /**
16022
16069
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16023
16070
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17212,6 +17259,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17212
17259
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17213
17260
  kind: "mutation",
17214
17261
  auth: "admin"
17262
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17263
+ kind: "mutation",
17264
+ auth: "admin"
17265
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17266
+ kind: "query",
17267
+ auth: "admin"
17268
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17269
+ kind: "mutation",
17270
+ auth: "admin"
17215
17271
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17216
17272
  kind: "query",
17217
17273
  auth: "admin"
@@ -17366,6 +17422,11 @@ object({
17366
17422
  "jpeg"
17367
17423
  ])
17368
17424
  });
17425
+ /**
17426
+ * Process-local frame identity. It is serializable so it can ride an in-process
17427
+ * capability call, but `registryId` deliberately prevents resolution in any
17428
+ * other process or execution group.
17429
+ */
17369
17430
  var FrameRefSchema = object({
17370
17431
  registryId: string().min(1),
17371
17432
  id: string().min(1),
@@ -19544,7 +19605,7 @@ method(object({
19544
19605
  * linking rather than produce an eternal token.
19545
19606
  */
19546
19607
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19547
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19608
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19548
19609
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19549
19610
  providerId: string().min(1),
19550
19611
  displayName: string().min(1),
@@ -19639,10 +19700,13 @@ var EvictResultSchema = object({
19639
19700
  /** True when the provider has nothing left it is willing to drop on this location. */
19640
19701
  exhausted: boolean()
19641
19702
  });
19642
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19703
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19643
19704
  locationId: string(),
19644
19705
  targetBytes: number().int().positive()
19645
- }), EvictResultSchema, { kind: "mutation" });
19706
+ }), EvictResultSchema, {
19707
+ kind: "mutation",
19708
+ auth: "admin"
19709
+ });
19646
19710
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19647
19711
  kind: "mutation",
19648
19712
  auth: "admin"
@@ -19702,26 +19766,50 @@ var ReadChunkInputSchema = object({
19702
19766
  length: number()
19703
19767
  });
19704
19768
  var EndDownloadInputSchema = object({ downloadId: string() });
19705
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19769
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19706
19770
  location: StorageLocationSchema,
19707
19771
  relativePath: string()
19708
- }), string()), method(object({
19772
+ }), string(), { auth: "admin" }), method(object({
19709
19773
  location: StorageLocationSchema,
19710
19774
  relativePath: string(),
19711
19775
  data: _instanceof(Uint8Array)
19712
- }), _void(), { kind: "mutation" }), method(object({
19776
+ }), _void(), {
19777
+ kind: "mutation",
19778
+ auth: "admin"
19779
+ }), method(object({
19713
19780
  location: StorageLocationSchema,
19714
19781
  relativePath: string()
19715
- }), _instanceof(Uint8Array)), method(object({
19782
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19716
19783
  location: StorageLocationSchema,
19717
19784
  relativePath: string()
19718
- }), boolean()), method(object({
19785
+ }), boolean(), { auth: "admin" }), method(object({
19719
19786
  location: StorageLocationSchema,
19720
19787
  prefix: string().optional()
19721
- }), array(string()).readonly()), method(object({
19788
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19722
19789
  location: StorageLocationSchema,
19723
19790
  relativePath: string()
19724
- }), _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" });
19791
+ }), _void(), {
19792
+ kind: "mutation",
19793
+ auth: "admin"
19794
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19795
+ kind: "mutation",
19796
+ auth: "admin"
19797
+ }), method(WriteChunkInputSchema, _void(), {
19798
+ kind: "mutation",
19799
+ auth: "admin"
19800
+ }), method(FinalizeUploadInputSchema, _void(), {
19801
+ kind: "mutation",
19802
+ auth: "admin"
19803
+ }), method(AbortUploadInputSchema, _void(), {
19804
+ kind: "mutation",
19805
+ auth: "admin"
19806
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19807
+ kind: "mutation",
19808
+ auth: "admin"
19809
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19810
+ kind: "mutation",
19811
+ auth: "admin"
19812
+ });
19725
19813
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19726
19814
  var ProfileSettingsSchemaBridge = unknown().nullable();
19727
19815
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -19979,7 +20067,8 @@ method(object({
19979
20067
  access: "create"
19980
20068
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
19981
20069
  kind: "mutation",
19982
- access: "view"
20070
+ access: "view",
20071
+ auth: "admin"
19983
20072
  }), method(object({
19984
20073
  /** Required — the user the assertion belongs to (verified). */
19985
20074
  userId: string(),
@@ -19987,10 +20076,12 @@ method(object({
19987
20076
  response: record(string(), unknown())
19988
20077
  }), object({ verified: boolean() }), {
19989
20078
  kind: "mutation",
19990
- access: "view"
20079
+ access: "view",
20080
+ auth: "admin"
19991
20081
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
19992
20082
  kind: "mutation",
19993
- access: "view"
20083
+ access: "view",
20084
+ auth: "admin"
19994
20085
  }), method(object({
19995
20086
  /** AuthenticationResponseJSON from the browser. */
19996
20087
  response: record(string(), unknown()) }), object({
@@ -19998,7 +20089,8 @@ response: record(string(), unknown()) }), object({
19998
20089
  userId: string().nullable()
19999
20090
  }), {
20000
20091
  kind: "mutation",
20001
- access: "view"
20092
+ access: "view",
20093
+ auth: "admin"
20002
20094
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20003
20095
  userId: string(),
20004
20096
  credentialId: string()
@@ -20170,7 +20262,19 @@ var VectorStatsResultSchema = object({
20170
20262
  /** False when the backend ranks approximately. */
20171
20263
  exact: boolean()
20172
20264
  });
20173
- 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);
20265
+ method(VectorDeclareIndexInputSchema, _void(), {
20266
+ kind: "mutation",
20267
+ auth: "admin"
20268
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20269
+ kind: "mutation",
20270
+ auth: "admin"
20271
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20272
+ kind: "mutation",
20273
+ auth: "admin"
20274
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20275
+ kind: "mutation",
20276
+ auth: "admin"
20277
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20174
20278
  var ClipSchema = object({
20175
20279
  /** Opaque, provider-namespaced id. The default provider encodes the time
20176
20280
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21893,7 +21997,27 @@ var MediaFileLiteSchema$1 = object({
21893
21997
  sizeBytes: number(),
21894
21998
  timestamp: number()
21895
21999
  });
21896
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22000
+ method(object({
22001
+ /**
22002
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22003
+ *
22004
+ * Default `false`, the same inversion `listRecentFaces` and
22005
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22006
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22007
+ * on the live hub the same day: four identities cost 40,979 B with the
22008
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22009
+ * four times and the viewer holds at `staleTime: 30_000`.
22010
+ *
22011
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22012
+ * the `event-media` plane serves that key `immutable` with an ETag.
22013
+ *
22014
+ * **This is an INPUT field, so it does not reach the addon until the
22015
+ * next train** — the hub router validates cap inputs against its own
22016
+ * compiled Zod and strips a key it does not know. Until then the
22017
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22018
+ * is what ships, and the opt-in becomes reachable when the train lands.
22019
+ */
22020
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21897
22021
  kind: "mutation",
21898
22022
  auth: "admin"
21899
22023
  }), method(object({
@@ -24040,8 +24164,10 @@ var PlateInfoSchema = object({
24040
24164
  keyFrameMediaKey: string().optional(),
24041
24165
  base64: string().optional(),
24042
24166
  /**
24043
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24044
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24167
+ * Same crop as a data-plane URL, always present when the plate has a stored
24168
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24169
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24170
+ * left at its `true` default.
24045
24171
  */
24046
24172
  cropUrl: string().optional()
24047
24173
  });
@@ -24061,14 +24187,34 @@ var PlateClusterSchema = object({
24061
24187
  });
24062
24188
  method(object({
24063
24189
  deviceId: number().int().optional(),
24064
- limit: number().int().positive().optional()
24190
+ limit: number().int().positive().optional(),
24191
+ /**
24192
+ * Inline the base64 crop on every row. Default `true` — the existing
24193
+ * behaviour, kept so no caller breaks.
24194
+ *
24195
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24196
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24197
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24198
+ * metadata without them — and the browser then caches the images.
24199
+ *
24200
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24201
+ * plates were the one gallery list left without it.
24202
+ *
24203
+ * **This is an INPUT field, so it does not reach the addon until the
24204
+ * next train.** The hub router validates cap inputs against its own
24205
+ * compiled Zod and strips a key it does not know. Until the train
24206
+ * ships, sending `false` is harmless and keeps the crops inline.
24207
+ */
24208
+ includeCrops: boolean().optional()
24065
24209
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24066
24210
  deviceId: number().int(),
24067
24211
  trackId: string()
24068
24212
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24069
24213
  text: string().min(1),
24070
24214
  maxDistance: number().int().min(0).optional(),
24071
- limit: number().int().positive().optional()
24215
+ limit: number().int().positive().optional(),
24216
+ /** See `listPlates.includeCrops`. Default `true`. */
24217
+ includeCrops: boolean().optional()
24072
24218
  }), array(PlateInfoSchema).readonly()), method(object({
24073
24219
  maxDistance: number().int().min(0).optional(),
24074
24220
  minClusterSize: number().int().min(2).optional(),
@@ -24082,7 +24228,13 @@ method(object({
24082
24228
  }), method(object({ plateId: string() }), _void(), {
24083
24229
  kind: "mutation",
24084
24230
  auth: "admin"
24085
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24231
+ }), method(object({
24232
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24233
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24234
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24235
+ * INPUT field: stripped by the hub router until the train ships, which
24236
+ * resolves to `false` and is exactly the intended default. */
24237
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24086
24238
  kind: "mutation",
24087
24239
  auth: "admin"
24088
24240
  }), method(object({
@@ -29459,6 +29611,12 @@ Object.freeze({
29459
29611
  addonId: null,
29460
29612
  access: "create"
29461
29613
  },
29614
+ "pipelineAnalytics.cancelRelocateMedia": {
29615
+ capName: "pipeline-analytics",
29616
+ capScope: "device",
29617
+ addonId: null,
29618
+ access: "create"
29619
+ },
29462
29620
  "pipelineAnalytics.cancelStorageMigrationMove": {
29463
29621
  capName: "pipeline-analytics",
29464
29622
  capScope: "device",
@@ -29633,6 +29791,12 @@ Object.freeze({
29633
29791
  addonId: null,
29634
29792
  access: "view"
29635
29793
  },
29794
+ "pipelineAnalytics.listRelocateMediaJobs": {
29795
+ capName: "pipeline-analytics",
29796
+ capScope: "device",
29797
+ addonId: null,
29798
+ access: "view"
29799
+ },
29636
29800
  "pipelineAnalytics.listRetrainAnnotations": {
29637
29801
  capName: "pipeline-analytics",
29638
29802
  capScope: "device",
@@ -29711,6 +29875,12 @@ Object.freeze({
29711
29875
  addonId: null,
29712
29876
  access: "create"
29713
29877
  },
29878
+ "pipelineAnalytics.relocateMedia": {
29879
+ capName: "pipeline-analytics",
29880
+ capScope: "device",
29881
+ addonId: null,
29882
+ access: "create"
29883
+ },
29714
29884
  "pipelineAnalytics.restageRetrainTrack": {
29715
29885
  capName: "pipeline-analytics",
29716
29886
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.27",
3
+ "version": "1.2.28",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",