@camstack/addon-mqtt-broker 1.2.28 → 1.2.29

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.
@@ -6675,7 +6675,7 @@ function method(input, output, options) {
6675
6675
  input,
6676
6676
  output,
6677
6677
  kind: options?.kind ?? "query",
6678
- auth: options?.auth ?? "protected",
6678
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6679
6679
  ...options?.access !== void 0 ? { access: options.access } : {},
6680
6680
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6681
6681
  timeoutMs: options?.timeoutMs
@@ -6695,7 +6695,7 @@ function systemMethod(input, output, options) {
6695
6695
  }
6696
6696
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6697
6697
  var VersionOutputSchema$1 = object({ version: string() });
6698
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6698
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6699
6699
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6700
6700
  DeviceType["Camera"] = "camera";
6701
6701
  DeviceType["Hub"] = "hub";
@@ -7016,7 +7016,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7016
7016
  }({});
7017
7017
  var StaticDirOutputSchema = object({ staticDir: string() });
7018
7018
  var VersionOutputSchema = object({ version: string() });
7019
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7019
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7020
7020
  /**
7021
7021
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7022
7022
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7630,24 +7630,6 @@ var RecordingRetentionSchema = object({
7630
7630
  maxSizeGb: number().min(0).optional()
7631
7631
  });
7632
7632
  /**
7633
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7634
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7635
- * previews at. Five graduated steps; absent on a config = `standard` (the
7636
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7637
- *
7638
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7639
- * Each window's index sidecar carries its own tile dims, so a camera whose
7640
- * preset changed over time renders every historical window at the dims it was
7641
- * written with.
7642
- */
7643
- var ScrubThumbnailPresetSchema = _enum([
7644
- "minimal",
7645
- "low",
7646
- "standard",
7647
- "high",
7648
- "max"
7649
- ]);
7650
- /**
7651
7633
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7652
7634
  *
7653
7635
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7655,7 +7637,11 @@ var ScrubThumbnailPresetSchema = _enum([
7655
7637
  * other field is a storage knob (profiles, segment length, retention, scrub).
7656
7638
  *
7657
7639
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7658
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7640
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7641
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7642
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7643
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7644
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7659
7645
  * A stale caller must fail loudly — silently stripping its legacy intent would
7660
7646
  * persist a band-less config, i.e. silently stop recording the camera.
7661
7647
  */
@@ -7678,14 +7664,7 @@ var RecordingConfigSchema = object({
7678
7664
  * "off" is the absence of a covering band, never a band value.
7679
7665
  */
7680
7666
  bands: array(RecordingBandSchema).default([]),
7681
- retention: RecordingRetentionSchema.optional(),
7682
- /**
7683
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7684
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7685
- * windows only — existing sheets are immutable, and each window's index
7686
- * carries its own tile dims so mixed-preset history renders correctly.
7687
- */
7688
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7667
+ retention: RecordingRetentionSchema.optional()
7689
7668
  }).strict();
7690
7669
  /**
7691
7670
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7761,10 +7740,11 @@ var RelocateFootageInputSchema = object({
7761
7740
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7762
7741
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7763
7742
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7764
- var StorageMigrationMediaMoveInputSchema = object({
7743
+ var RelocateMediaInputSchema = object({
7765
7744
  toLocationId: string(),
7766
7745
  throttleMbps: number().min(1).max(1e3).optional()
7767
- }).extend({ leaseId: string().min(1) });
7746
+ });
7747
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7768
7748
  /** The independently selectable logical storage classes. `recordings`
7769
7749
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7770
7750
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8059,7 +8039,26 @@ var LabelDefinitionSchema = object({
8059
8039
  description: string().optional(),
8060
8040
  icon: string().optional()
8061
8041
  });
8062
- var ClassMapDefinitionSchema = object({
8042
+ /**
8043
+ * Wire schema for a per-model CATALOG classMap override
8044
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8045
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8046
+ * detection pipeline executor actually routes.
8047
+ *
8048
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8049
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8050
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8051
+ * enum) — the two used to share the name `ClassMapDefinition`/
8052
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8053
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8054
+ * are not: it is two different concepts colliding on a name. Keep this type
8055
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8056
+ * would either narrow every `ClassMapDefinition` consumer to the four
8057
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8058
+ * schema exists for (see the "rejects a classMap whose target is not a
8059
+ * detection macro" test in `model-catalog-schema.test.ts`).
8060
+ */
8061
+ var DetectionCatalogClassMapSchema = object({
8063
8062
  mapping: record(string(), _enum([
8064
8063
  "person",
8065
8064
  "vehicle",
@@ -8264,7 +8263,7 @@ var ModelCatalogEntrySchema = object({
8264
8263
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8265
8264
  * labels already ARE the CamStack macros (Scrypted identity map).
8266
8265
  */
8267
- classMap: ClassMapDefinitionSchema.optional()
8266
+ classMap: DetectionCatalogClassMapSchema.optional()
8268
8267
  });
8269
8268
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8270
8269
  format: literal("openvino"),
@@ -8294,7 +8293,7 @@ var ModelConvertMetadataSchema = object({
8294
8293
  "segmentation"
8295
8294
  ]),
8296
8295
  faceAlignment: boolean().optional(),
8297
- classMap: ClassMapDefinitionSchema.optional()
8296
+ classMap: DetectionCatalogClassMapSchema.optional()
8298
8297
  });
8299
8298
  var ConvertResultSchema = object({
8300
8299
  entry: ModelCatalogEntrySchema,
@@ -9157,7 +9156,7 @@ var AddonPageDeclarationSchema = object({
9157
9156
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9158
9157
  sectionLabel: string().optional()
9159
9158
  });
9160
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9159
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9161
9160
  var AddonHttpRouteSchema = object({
9162
9161
  method: _enum([
9163
9162
  "GET",
@@ -9392,7 +9391,7 @@ var WidgetMetadataSchema = object({
9392
9391
  defaultColumns: number().int().min(1).max(12).default(6),
9393
9392
  defaultRows: number().int().min(1).max(12).default(1)
9394
9393
  });
9395
- method(_void(), array(WidgetMetadataSchema).readonly());
9394
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9396
9395
  /**
9397
9396
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9398
9397
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10963,7 +10962,7 @@ var CustomModelDescriptorSchema = object({
10963
10962
  stepId: string(),
10964
10963
  entry: ModelCatalogEntrySchema
10965
10964
  });
10966
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10965
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10967
10966
  /**
10968
10967
  * Query filter for settings-store collections.
10969
10968
  */
@@ -11050,7 +11049,8 @@ method(object({
11050
11049
  }), _void(), { kind: "mutation" }), method(object({
11051
11050
  namespace: string().optional(),
11052
11051
  collection: string(),
11053
- filter: QueryFilterSchema.optional()
11052
+ filter: QueryFilterSchema.optional(),
11053
+ columns: array(string()).readonly().optional()
11054
11054
  }), array(SettingsRecordSchema).readonly()), method(object({
11055
11055
  namespace: string().optional(),
11056
11056
  collection: string(),
@@ -11113,46 +11113,87 @@ var EngineInfoSchema = object({
11113
11113
  kind: _enum(["relational", "vector"]),
11114
11114
  displayName: string()
11115
11115
  });
11116
- method(_void(), EngineInfoSchema), method(object({
11116
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11117
11117
  namespace: string().optional(),
11118
11118
  collection: string(),
11119
11119
  key: string()
11120
- }), unknown()), method(object({
11120
+ }), unknown(), { auth: "admin" }), method(object({
11121
11121
  namespace: string().optional(),
11122
11122
  collection: string(),
11123
11123
  key: string(),
11124
11124
  value: unknown()
11125
- }), _void(), { kind: "mutation" }), method(object({
11125
+ }), _void(), {
11126
+ kind: "mutation",
11127
+ auth: "admin"
11128
+ }), method(object({
11126
11129
  namespace: string().optional(),
11127
11130
  collection: string(),
11128
- filter: QueryFilterSchema.optional()
11129
- }), array(SettingsRecordSchema).readonly()), method(object({
11131
+ filter: QueryFilterSchema.optional(),
11132
+ /**
11133
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11134
+ *
11135
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11136
+ * was wrong — corrected 2026-08-26 after the hop map
11137
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11138
+ * There is **no Zod parse at all** between the door and the engine: the
11139
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11140
+ * field declared here reaches `SqliteSettingsBackend` either way.
11141
+ *
11142
+ * What actually lost `columns` was the THIRD declaration of this shape:
11143
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11144
+ * interface the engine destructures from. The field existed on both
11145
+ * schemas and the engine still never read it, because nothing checks a
11146
+ * registered provider against `InferProvider<cap>` —
11147
+ * `ProviderRegistration.provider` is typed `object`.
11148
+ *
11149
+ * It is declared here anyway, and must stay in step with
11150
+ * `settings-store.query`: a caller reading only the cap definitions has
11151
+ * to be able to see that this call carries a projection.
11152
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11153
+ */
11154
+ columns: array(string()).readonly().optional()
11155
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11130
11156
  namespace: string().optional(),
11131
11157
  collection: string(),
11132
11158
  record: SettingsRecordSchema
11133
- }), _void(), { kind: "mutation" }), method(object({
11159
+ }), _void(), {
11160
+ kind: "mutation",
11161
+ auth: "admin"
11162
+ }), method(object({
11134
11163
  namespace: string().optional(),
11135
11164
  collection: string(),
11136
11165
  id: string(),
11137
11166
  data: record(string(), unknown())
11138
- }), _void(), { kind: "mutation" }), method(object({
11167
+ }), _void(), {
11168
+ kind: "mutation",
11169
+ auth: "admin"
11170
+ }), method(object({
11139
11171
  namespace: string().optional(),
11140
11172
  collection: string(),
11141
11173
  key: string()
11142
- }), _void(), { kind: "mutation" }), method(object({
11174
+ }), _void(), {
11175
+ kind: "mutation",
11176
+ auth: "admin"
11177
+ }), method(object({
11143
11178
  namespace: string().optional(),
11144
11179
  collection: string(),
11145
11180
  filter: MutationFilterSchema
11146
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11181
+ }), object({ deleted: number().int() }), {
11182
+ kind: "mutation",
11183
+ auth: "admin"
11184
+ }), method(object({
11147
11185
  namespace: string().optional(),
11148
11186
  collection: string(),
11149
11187
  filter: MutationFilterSchema,
11150
11188
  data: record(string(), unknown())
11151
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11189
+ }), object({ updated: number().int() }), {
11190
+ kind: "mutation",
11191
+ auth: "admin"
11192
+ }), method(object({
11152
11193
  namespace: string().optional(),
11153
11194
  collection: string(),
11154
11195
  filter: QueryFilterSchema.optional()
11155
- }), number()), method(object({
11196
+ }), number(), { auth: "admin" }), method(object({
11156
11197
  namespace: string().optional(),
11157
11198
  collection: string(),
11158
11199
  field: string(),
@@ -11162,15 +11203,18 @@ method(_void(), EngineInfoSchema), method(object({
11162
11203
  }), array(object({
11163
11204
  bucket: number().int(),
11164
11205
  count: number().int()
11165
- })).readonly()), method(object({
11206
+ })).readonly(), { auth: "admin" }), method(object({
11166
11207
  namespace: string().optional(),
11167
11208
  collection: string()
11168
- }), boolean()), method(object({
11209
+ }), boolean(), { auth: "admin" }), method(object({
11169
11210
  namespace: string().optional(),
11170
11211
  collection: string(),
11171
11212
  columns: array(CollectionColumnSchema).readonly(),
11172
11213
  indexes: array(CollectionIndexSchema).readonly().optional()
11173
- }), _void(), { kind: "mutation" });
11214
+ }), _void(), {
11215
+ kind: "mutation",
11216
+ auth: "admin"
11217
+ });
11174
11218
  /**
11175
11219
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11176
11220
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12298,7 +12342,7 @@ method(object({
12298
12342
  crop: _instanceof(Uint8Array),
12299
12343
  width: number(),
12300
12344
  height: number()
12301
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12345
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12302
12346
  /**
12303
12347
  * filesystem-browse — per-node capability for browsing the node's local
12304
12348
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12591,19 +12635,22 @@ method(LlmGenerateBaseInputSchema.extend({
12591
12635
  runtime: ManagedRuntimeConfigSchema,
12592
12636
  /** The managed profile's timeout, threaded by the hub provider. */
12593
12637
  timeoutMs: number().int().positive().optional()
12594
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12638
+ }), LlmGenerateResultSchema, {
12639
+ kind: "mutation",
12640
+ auth: "admin"
12641
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12595
12642
  kind: "mutation",
12596
12643
  auth: "admin"
12597
12644
  }), method(object({}), _void(), {
12598
12645
  kind: "mutation",
12599
12646
  auth: "admin"
12600
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12647
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12601
12648
  kind: "mutation",
12602
12649
  auth: "admin"
12603
12650
  }), method(object({ file: string() }), _void(), {
12604
12651
  kind: "mutation",
12605
12652
  auth: "admin"
12606
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12653
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12607
12654
  /**
12608
12655
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12609
12656
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16095,7 +16142,7 @@ var OauthIntegrationDescriptorSchema = object({
16095
16142
  */
16096
16143
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16097
16144
  });
16098
- method(_void(), OauthIntegrationDescriptorSchema);
16145
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16099
16146
  /**
16100
16147
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16101
16148
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17290,6 +17337,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17290
17337
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17291
17338
  kind: "mutation",
17292
17339
  auth: "admin"
17340
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17341
+ kind: "mutation",
17342
+ auth: "admin"
17343
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17344
+ kind: "query",
17345
+ auth: "admin"
17346
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17347
+ kind: "mutation",
17348
+ auth: "admin"
17293
17349
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17294
17350
  kind: "query",
17295
17351
  auth: "admin"
@@ -17444,6 +17500,11 @@ object({
17444
17500
  "jpeg"
17445
17501
  ])
17446
17502
  });
17503
+ /**
17504
+ * Process-local frame identity. It is serializable so it can ride an in-process
17505
+ * capability call, but `registryId` deliberately prevents resolution in any
17506
+ * other process or execution group.
17507
+ */
17447
17508
  var FrameRefSchema = object({
17448
17509
  registryId: string().min(1),
17449
17510
  id: string().min(1),
@@ -19609,7 +19670,7 @@ method(object({
19609
19670
  * linking rather than produce an eternal token.
19610
19671
  */
19611
19672
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19612
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19673
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19613
19674
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19614
19675
  providerId: string().min(1),
19615
19676
  displayName: string().min(1),
@@ -19704,10 +19765,13 @@ var EvictResultSchema = object({
19704
19765
  /** True when the provider has nothing left it is willing to drop on this location. */
19705
19766
  exhausted: boolean()
19706
19767
  });
19707
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19768
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19708
19769
  locationId: string(),
19709
19770
  targetBytes: number().int().positive()
19710
- }), EvictResultSchema, { kind: "mutation" });
19771
+ }), EvictResultSchema, {
19772
+ kind: "mutation",
19773
+ auth: "admin"
19774
+ });
19711
19775
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19712
19776
  kind: "mutation",
19713
19777
  auth: "admin"
@@ -19767,26 +19831,50 @@ var ReadChunkInputSchema = object({
19767
19831
  length: number()
19768
19832
  });
19769
19833
  var EndDownloadInputSchema = object({ downloadId: string() });
19770
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19834
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19771
19835
  location: StorageLocationSchema,
19772
19836
  relativePath: string()
19773
- }), string()), method(object({
19837
+ }), string(), { auth: "admin" }), method(object({
19774
19838
  location: StorageLocationSchema,
19775
19839
  relativePath: string(),
19776
19840
  data: _instanceof(Uint8Array)
19777
- }), _void(), { kind: "mutation" }), method(object({
19841
+ }), _void(), {
19842
+ kind: "mutation",
19843
+ auth: "admin"
19844
+ }), method(object({
19778
19845
  location: StorageLocationSchema,
19779
19846
  relativePath: string()
19780
- }), _instanceof(Uint8Array)), method(object({
19847
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19781
19848
  location: StorageLocationSchema,
19782
19849
  relativePath: string()
19783
- }), boolean()), method(object({
19850
+ }), boolean(), { auth: "admin" }), method(object({
19784
19851
  location: StorageLocationSchema,
19785
19852
  prefix: string().optional()
19786
- }), array(string()).readonly()), method(object({
19853
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19787
19854
  location: StorageLocationSchema,
19788
19855
  relativePath: string()
19789
- }), _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" });
19856
+ }), _void(), {
19857
+ kind: "mutation",
19858
+ auth: "admin"
19859
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19860
+ kind: "mutation",
19861
+ auth: "admin"
19862
+ }), method(WriteChunkInputSchema, _void(), {
19863
+ kind: "mutation",
19864
+ auth: "admin"
19865
+ }), method(FinalizeUploadInputSchema, _void(), {
19866
+ kind: "mutation",
19867
+ auth: "admin"
19868
+ }), method(AbortUploadInputSchema, _void(), {
19869
+ kind: "mutation",
19870
+ auth: "admin"
19871
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19872
+ kind: "mutation",
19873
+ auth: "admin"
19874
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19875
+ kind: "mutation",
19876
+ auth: "admin"
19877
+ });
19790
19878
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19791
19879
  var ProfileSettingsSchemaBridge = unknown().nullable();
19792
19880
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20044,7 +20132,8 @@ method(object({
20044
20132
  access: "create"
20045
20133
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20046
20134
  kind: "mutation",
20047
- access: "view"
20135
+ access: "view",
20136
+ auth: "admin"
20048
20137
  }), method(object({
20049
20138
  /** Required — the user the assertion belongs to (verified). */
20050
20139
  userId: string(),
@@ -20052,10 +20141,12 @@ method(object({
20052
20141
  response: record(string(), unknown())
20053
20142
  }), object({ verified: boolean() }), {
20054
20143
  kind: "mutation",
20055
- access: "view"
20144
+ access: "view",
20145
+ auth: "admin"
20056
20146
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20057
20147
  kind: "mutation",
20058
- access: "view"
20148
+ access: "view",
20149
+ auth: "admin"
20059
20150
  }), method(object({
20060
20151
  /** AuthenticationResponseJSON from the browser. */
20061
20152
  response: record(string(), unknown()) }), object({
@@ -20063,7 +20154,8 @@ response: record(string(), unknown()) }), object({
20063
20154
  userId: string().nullable()
20064
20155
  }), {
20065
20156
  kind: "mutation",
20066
- access: "view"
20157
+ access: "view",
20158
+ auth: "admin"
20067
20159
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20068
20160
  userId: string(),
20069
20161
  credentialId: string()
@@ -20235,7 +20327,19 @@ var VectorStatsResultSchema = object({
20235
20327
  /** False when the backend ranks approximately. */
20236
20328
  exact: boolean()
20237
20329
  });
20238
- 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);
20330
+ method(VectorDeclareIndexInputSchema, _void(), {
20331
+ kind: "mutation",
20332
+ auth: "admin"
20333
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20334
+ kind: "mutation",
20335
+ auth: "admin"
20336
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20337
+ kind: "mutation",
20338
+ auth: "admin"
20339
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20340
+ kind: "mutation",
20341
+ auth: "admin"
20342
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20239
20343
  var ClipSchema = object({
20240
20344
  /** Opaque, provider-namespaced id. The default provider encodes the time
20241
20345
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21958,7 +22062,27 @@ var MediaFileLiteSchema$1 = object({
21958
22062
  sizeBytes: number(),
21959
22063
  timestamp: number()
21960
22064
  });
21961
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22065
+ method(object({
22066
+ /**
22067
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22068
+ *
22069
+ * Default `false`, the same inversion `listRecentFaces` and
22070
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22071
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22072
+ * on the live hub the same day: four identities cost 40,979 B with the
22073
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22074
+ * four times and the viewer holds at `staleTime: 30_000`.
22075
+ *
22076
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22077
+ * the `event-media` plane serves that key `immutable` with an ETag.
22078
+ *
22079
+ * **This is an INPUT field, so it does not reach the addon until the
22080
+ * next train** — the hub router validates cap inputs against its own
22081
+ * compiled Zod and strips a key it does not know. Until then the
22082
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22083
+ * is what ships, and the opt-in becomes reachable when the train lands.
22084
+ */
22085
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21962
22086
  kind: "mutation",
21963
22087
  auth: "admin"
21964
22088
  }), method(object({
@@ -24105,8 +24229,10 @@ var PlateInfoSchema = object({
24105
24229
  keyFrameMediaKey: string().optional(),
24106
24230
  base64: string().optional(),
24107
24231
  /**
24108
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24109
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24232
+ * Same crop as a data-plane URL, always present when the plate has a stored
24233
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24234
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24235
+ * left at its `true` default.
24110
24236
  */
24111
24237
  cropUrl: string().optional()
24112
24238
  });
@@ -24126,14 +24252,34 @@ var PlateClusterSchema = object({
24126
24252
  });
24127
24253
  method(object({
24128
24254
  deviceId: number().int().optional(),
24129
- limit: number().int().positive().optional()
24255
+ limit: number().int().positive().optional(),
24256
+ /**
24257
+ * Inline the base64 crop on every row. Default `true` — the existing
24258
+ * behaviour, kept so no caller breaks.
24259
+ *
24260
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24261
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24262
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24263
+ * metadata without them — and the browser then caches the images.
24264
+ *
24265
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24266
+ * plates were the one gallery list left without it.
24267
+ *
24268
+ * **This is an INPUT field, so it does not reach the addon until the
24269
+ * next train.** The hub router validates cap inputs against its own
24270
+ * compiled Zod and strips a key it does not know. Until the train
24271
+ * ships, sending `false` is harmless and keeps the crops inline.
24272
+ */
24273
+ includeCrops: boolean().optional()
24130
24274
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24131
24275
  deviceId: number().int(),
24132
24276
  trackId: string()
24133
24277
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24134
24278
  text: string().min(1),
24135
24279
  maxDistance: number().int().min(0).optional(),
24136
- limit: number().int().positive().optional()
24280
+ limit: number().int().positive().optional(),
24281
+ /** See `listPlates.includeCrops`. Default `true`. */
24282
+ includeCrops: boolean().optional()
24137
24283
  }), array(PlateInfoSchema).readonly()), method(object({
24138
24284
  maxDistance: number().int().min(0).optional(),
24139
24285
  minClusterSize: number().int().min(2).optional(),
@@ -24147,7 +24293,13 @@ method(object({
24147
24293
  }), method(object({ plateId: string() }), _void(), {
24148
24294
  kind: "mutation",
24149
24295
  auth: "admin"
24150
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24296
+ }), method(object({
24297
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24298
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24299
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24300
+ * INPUT field: stripped by the hub router until the train ships, which
24301
+ * resolves to `false` and is exactly the intended default. */
24302
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24151
24303
  kind: "mutation",
24152
24304
  auth: "admin"
24153
24305
  }), method(object({
@@ -29524,6 +29676,12 @@ Object.freeze({
29524
29676
  addonId: null,
29525
29677
  access: "create"
29526
29678
  },
29679
+ "pipelineAnalytics.cancelRelocateMedia": {
29680
+ capName: "pipeline-analytics",
29681
+ capScope: "device",
29682
+ addonId: null,
29683
+ access: "create"
29684
+ },
29527
29685
  "pipelineAnalytics.cancelStorageMigrationMove": {
29528
29686
  capName: "pipeline-analytics",
29529
29687
  capScope: "device",
@@ -29698,6 +29856,12 @@ Object.freeze({
29698
29856
  addonId: null,
29699
29857
  access: "view"
29700
29858
  },
29859
+ "pipelineAnalytics.listRelocateMediaJobs": {
29860
+ capName: "pipeline-analytics",
29861
+ capScope: "device",
29862
+ addonId: null,
29863
+ access: "view"
29864
+ },
29701
29865
  "pipelineAnalytics.listRetrainAnnotations": {
29702
29866
  capName: "pipeline-analytics",
29703
29867
  capScope: "device",
@@ -29776,6 +29940,12 @@ Object.freeze({
29776
29940
  addonId: null,
29777
29941
  access: "create"
29778
29942
  },
29943
+ "pipelineAnalytics.relocateMedia": {
29944
+ capName: "pipeline-analytics",
29945
+ capScope: "device",
29946
+ addonId: null,
29947
+ access: "create"
29948
+ },
29779
29949
  "pipelineAnalytics.restageRetrainTrack": {
29780
29950
  capName: "pipeline-analytics",
29781
29951
  capScope: "device",
@@ -6670,7 +6670,7 @@ function method(input, output, options) {
6670
6670
  input,
6671
6671
  output,
6672
6672
  kind: options?.kind ?? "query",
6673
- auth: options?.auth ?? "protected",
6673
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6674
6674
  ...options?.access !== void 0 ? { access: options.access } : {},
6675
6675
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6676
6676
  timeoutMs: options?.timeoutMs
@@ -6690,7 +6690,7 @@ function systemMethod(input, output, options) {
6690
6690
  }
6691
6691
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6692
6692
  var VersionOutputSchema$1 = object({ version: string() });
6693
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6693
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6694
6694
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6695
6695
  DeviceType["Camera"] = "camera";
6696
6696
  DeviceType["Hub"] = "hub";
@@ -7011,7 +7011,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7011
7011
  }({});
7012
7012
  var StaticDirOutputSchema = object({ staticDir: string() });
7013
7013
  var VersionOutputSchema = object({ version: string() });
7014
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7014
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7015
7015
  /**
7016
7016
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7017
7017
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7625,24 +7625,6 @@ var RecordingRetentionSchema = object({
7625
7625
  maxSizeGb: number().min(0).optional()
7626
7626
  });
7627
7627
  /**
7628
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7629
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7630
- * previews at. Five graduated steps; absent on a config = `standard` (the
7631
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7632
- *
7633
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7634
- * Each window's index sidecar carries its own tile dims, so a camera whose
7635
- * preset changed over time renders every historical window at the dims it was
7636
- * written with.
7637
- */
7638
- var ScrubThumbnailPresetSchema = _enum([
7639
- "minimal",
7640
- "low",
7641
- "standard",
7642
- "high",
7643
- "max"
7644
- ]);
7645
- /**
7646
7628
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7647
7629
  *
7648
7630
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7650,7 +7632,11 @@ var ScrubThumbnailPresetSchema = _enum([
7650
7632
  * other field is a storage knob (profiles, segment length, retention, scrub).
7651
7633
  *
7652
7634
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7653
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7635
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7636
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7637
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7638
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7639
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7654
7640
  * A stale caller must fail loudly — silently stripping its legacy intent would
7655
7641
  * persist a band-less config, i.e. silently stop recording the camera.
7656
7642
  */
@@ -7673,14 +7659,7 @@ var RecordingConfigSchema = object({
7673
7659
  * "off" is the absence of a covering band, never a band value.
7674
7660
  */
7675
7661
  bands: array(RecordingBandSchema).default([]),
7676
- retention: RecordingRetentionSchema.optional(),
7677
- /**
7678
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7679
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7680
- * windows only — existing sheets are immutable, and each window's index
7681
- * carries its own tile dims so mixed-preset history renders correctly.
7682
- */
7683
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7662
+ retention: RecordingRetentionSchema.optional()
7684
7663
  }).strict();
7685
7664
  /**
7686
7665
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7756,10 +7735,11 @@ var RelocateFootageInputSchema = object({
7756
7735
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7757
7736
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7758
7737
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7759
- var StorageMigrationMediaMoveInputSchema = object({
7738
+ var RelocateMediaInputSchema = object({
7760
7739
  toLocationId: string(),
7761
7740
  throttleMbps: number().min(1).max(1e3).optional()
7762
- }).extend({ leaseId: string().min(1) });
7741
+ });
7742
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7763
7743
  /** The independently selectable logical storage classes. `recordings`
7764
7744
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7765
7745
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8054,7 +8034,26 @@ var LabelDefinitionSchema = object({
8054
8034
  description: string().optional(),
8055
8035
  icon: string().optional()
8056
8036
  });
8057
- var ClassMapDefinitionSchema = object({
8037
+ /**
8038
+ * Wire schema for a per-model CATALOG classMap override
8039
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8040
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8041
+ * detection pipeline executor actually routes.
8042
+ *
8043
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8044
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8045
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8046
+ * enum) — the two used to share the name `ClassMapDefinition`/
8047
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8048
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8049
+ * are not: it is two different concepts colliding on a name. Keep this type
8050
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8051
+ * would either narrow every `ClassMapDefinition` consumer to the four
8052
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8053
+ * schema exists for (see the "rejects a classMap whose target is not a
8054
+ * detection macro" test in `model-catalog-schema.test.ts`).
8055
+ */
8056
+ var DetectionCatalogClassMapSchema = object({
8058
8057
  mapping: record(string(), _enum([
8059
8058
  "person",
8060
8059
  "vehicle",
@@ -8259,7 +8258,7 @@ var ModelCatalogEntrySchema = object({
8259
8258
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8260
8259
  * labels already ARE the CamStack macros (Scrypted identity map).
8261
8260
  */
8262
- classMap: ClassMapDefinitionSchema.optional()
8261
+ classMap: DetectionCatalogClassMapSchema.optional()
8263
8262
  });
8264
8263
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8265
8264
  format: literal("openvino"),
@@ -8289,7 +8288,7 @@ var ModelConvertMetadataSchema = object({
8289
8288
  "segmentation"
8290
8289
  ]),
8291
8290
  faceAlignment: boolean().optional(),
8292
- classMap: ClassMapDefinitionSchema.optional()
8291
+ classMap: DetectionCatalogClassMapSchema.optional()
8293
8292
  });
8294
8293
  var ConvertResultSchema = object({
8295
8294
  entry: ModelCatalogEntrySchema,
@@ -9152,7 +9151,7 @@ var AddonPageDeclarationSchema = object({
9152
9151
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9153
9152
  sectionLabel: string().optional()
9154
9153
  });
9155
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9154
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9156
9155
  var AddonHttpRouteSchema = object({
9157
9156
  method: _enum([
9158
9157
  "GET",
@@ -9387,7 +9386,7 @@ var WidgetMetadataSchema = object({
9387
9386
  defaultColumns: number().int().min(1).max(12).default(6),
9388
9387
  defaultRows: number().int().min(1).max(12).default(1)
9389
9388
  });
9390
- method(_void(), array(WidgetMetadataSchema).readonly());
9389
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9391
9390
  /**
9392
9391
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9393
9392
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10958,7 +10957,7 @@ var CustomModelDescriptorSchema = object({
10958
10957
  stepId: string(),
10959
10958
  entry: ModelCatalogEntrySchema
10960
10959
  });
10961
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10960
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10962
10961
  /**
10963
10962
  * Query filter for settings-store collections.
10964
10963
  */
@@ -11045,7 +11044,8 @@ method(object({
11045
11044
  }), _void(), { kind: "mutation" }), method(object({
11046
11045
  namespace: string().optional(),
11047
11046
  collection: string(),
11048
- filter: QueryFilterSchema.optional()
11047
+ filter: QueryFilterSchema.optional(),
11048
+ columns: array(string()).readonly().optional()
11049
11049
  }), array(SettingsRecordSchema).readonly()), method(object({
11050
11050
  namespace: string().optional(),
11051
11051
  collection: string(),
@@ -11108,46 +11108,87 @@ var EngineInfoSchema = object({
11108
11108
  kind: _enum(["relational", "vector"]),
11109
11109
  displayName: string()
11110
11110
  });
11111
- method(_void(), EngineInfoSchema), method(object({
11111
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11112
11112
  namespace: string().optional(),
11113
11113
  collection: string(),
11114
11114
  key: string()
11115
- }), unknown()), method(object({
11115
+ }), unknown(), { auth: "admin" }), method(object({
11116
11116
  namespace: string().optional(),
11117
11117
  collection: string(),
11118
11118
  key: string(),
11119
11119
  value: unknown()
11120
- }), _void(), { kind: "mutation" }), method(object({
11120
+ }), _void(), {
11121
+ kind: "mutation",
11122
+ auth: "admin"
11123
+ }), method(object({
11121
11124
  namespace: string().optional(),
11122
11125
  collection: string(),
11123
- filter: QueryFilterSchema.optional()
11124
- }), array(SettingsRecordSchema).readonly()), method(object({
11126
+ filter: QueryFilterSchema.optional(),
11127
+ /**
11128
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11129
+ *
11130
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11131
+ * was wrong — corrected 2026-08-26 after the hop map
11132
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11133
+ * There is **no Zod parse at all** between the door and the engine: the
11134
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11135
+ * field declared here reaches `SqliteSettingsBackend` either way.
11136
+ *
11137
+ * What actually lost `columns` was the THIRD declaration of this shape:
11138
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11139
+ * interface the engine destructures from. The field existed on both
11140
+ * schemas and the engine still never read it, because nothing checks a
11141
+ * registered provider against `InferProvider<cap>` —
11142
+ * `ProviderRegistration.provider` is typed `object`.
11143
+ *
11144
+ * It is declared here anyway, and must stay in step with
11145
+ * `settings-store.query`: a caller reading only the cap definitions has
11146
+ * to be able to see that this call carries a projection.
11147
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11148
+ */
11149
+ columns: array(string()).readonly().optional()
11150
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11125
11151
  namespace: string().optional(),
11126
11152
  collection: string(),
11127
11153
  record: SettingsRecordSchema
11128
- }), _void(), { kind: "mutation" }), method(object({
11154
+ }), _void(), {
11155
+ kind: "mutation",
11156
+ auth: "admin"
11157
+ }), method(object({
11129
11158
  namespace: string().optional(),
11130
11159
  collection: string(),
11131
11160
  id: string(),
11132
11161
  data: record(string(), unknown())
11133
- }), _void(), { kind: "mutation" }), method(object({
11162
+ }), _void(), {
11163
+ kind: "mutation",
11164
+ auth: "admin"
11165
+ }), method(object({
11134
11166
  namespace: string().optional(),
11135
11167
  collection: string(),
11136
11168
  key: string()
11137
- }), _void(), { kind: "mutation" }), method(object({
11169
+ }), _void(), {
11170
+ kind: "mutation",
11171
+ auth: "admin"
11172
+ }), method(object({
11138
11173
  namespace: string().optional(),
11139
11174
  collection: string(),
11140
11175
  filter: MutationFilterSchema
11141
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11176
+ }), object({ deleted: number().int() }), {
11177
+ kind: "mutation",
11178
+ auth: "admin"
11179
+ }), method(object({
11142
11180
  namespace: string().optional(),
11143
11181
  collection: string(),
11144
11182
  filter: MutationFilterSchema,
11145
11183
  data: record(string(), unknown())
11146
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11184
+ }), object({ updated: number().int() }), {
11185
+ kind: "mutation",
11186
+ auth: "admin"
11187
+ }), method(object({
11147
11188
  namespace: string().optional(),
11148
11189
  collection: string(),
11149
11190
  filter: QueryFilterSchema.optional()
11150
- }), number()), method(object({
11191
+ }), number(), { auth: "admin" }), method(object({
11151
11192
  namespace: string().optional(),
11152
11193
  collection: string(),
11153
11194
  field: string(),
@@ -11157,15 +11198,18 @@ method(_void(), EngineInfoSchema), method(object({
11157
11198
  }), array(object({
11158
11199
  bucket: number().int(),
11159
11200
  count: number().int()
11160
- })).readonly()), method(object({
11201
+ })).readonly(), { auth: "admin" }), method(object({
11161
11202
  namespace: string().optional(),
11162
11203
  collection: string()
11163
- }), boolean()), method(object({
11204
+ }), boolean(), { auth: "admin" }), method(object({
11164
11205
  namespace: string().optional(),
11165
11206
  collection: string(),
11166
11207
  columns: array(CollectionColumnSchema).readonly(),
11167
11208
  indexes: array(CollectionIndexSchema).readonly().optional()
11168
- }), _void(), { kind: "mutation" });
11209
+ }), _void(), {
11210
+ kind: "mutation",
11211
+ auth: "admin"
11212
+ });
11169
11213
  /**
11170
11214
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11171
11215
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12293,7 +12337,7 @@ method(object({
12293
12337
  crop: _instanceof(Uint8Array),
12294
12338
  width: number(),
12295
12339
  height: number()
12296
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12340
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12297
12341
  /**
12298
12342
  * filesystem-browse — per-node capability for browsing the node's local
12299
12343
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12586,19 +12630,22 @@ method(LlmGenerateBaseInputSchema.extend({
12586
12630
  runtime: ManagedRuntimeConfigSchema,
12587
12631
  /** The managed profile's timeout, threaded by the hub provider. */
12588
12632
  timeoutMs: number().int().positive().optional()
12589
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12633
+ }), LlmGenerateResultSchema, {
12634
+ kind: "mutation",
12635
+ auth: "admin"
12636
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12590
12637
  kind: "mutation",
12591
12638
  auth: "admin"
12592
12639
  }), method(object({}), _void(), {
12593
12640
  kind: "mutation",
12594
12641
  auth: "admin"
12595
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12642
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12596
12643
  kind: "mutation",
12597
12644
  auth: "admin"
12598
12645
  }), method(object({ file: string() }), _void(), {
12599
12646
  kind: "mutation",
12600
12647
  auth: "admin"
12601
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12648
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12602
12649
  /**
12603
12650
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12604
12651
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16090,7 +16137,7 @@ var OauthIntegrationDescriptorSchema = object({
16090
16137
  */
16091
16138
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16092
16139
  });
16093
- method(_void(), OauthIntegrationDescriptorSchema);
16140
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16094
16141
  /**
16095
16142
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16096
16143
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17285,6 +17332,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17285
17332
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17286
17333
  kind: "mutation",
17287
17334
  auth: "admin"
17335
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17336
+ kind: "mutation",
17337
+ auth: "admin"
17338
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17339
+ kind: "query",
17340
+ auth: "admin"
17341
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17342
+ kind: "mutation",
17343
+ auth: "admin"
17288
17344
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17289
17345
  kind: "query",
17290
17346
  auth: "admin"
@@ -17439,6 +17495,11 @@ object({
17439
17495
  "jpeg"
17440
17496
  ])
17441
17497
  });
17498
+ /**
17499
+ * Process-local frame identity. It is serializable so it can ride an in-process
17500
+ * capability call, but `registryId` deliberately prevents resolution in any
17501
+ * other process or execution group.
17502
+ */
17442
17503
  var FrameRefSchema = object({
17443
17504
  registryId: string().min(1),
17444
17505
  id: string().min(1),
@@ -19604,7 +19665,7 @@ method(object({
19604
19665
  * linking rather than produce an eternal token.
19605
19666
  */
19606
19667
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19607
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19668
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19608
19669
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19609
19670
  providerId: string().min(1),
19610
19671
  displayName: string().min(1),
@@ -19699,10 +19760,13 @@ var EvictResultSchema = object({
19699
19760
  /** True when the provider has nothing left it is willing to drop on this location. */
19700
19761
  exhausted: boolean()
19701
19762
  });
19702
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19763
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19703
19764
  locationId: string(),
19704
19765
  targetBytes: number().int().positive()
19705
- }), EvictResultSchema, { kind: "mutation" });
19766
+ }), EvictResultSchema, {
19767
+ kind: "mutation",
19768
+ auth: "admin"
19769
+ });
19706
19770
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19707
19771
  kind: "mutation",
19708
19772
  auth: "admin"
@@ -19762,26 +19826,50 @@ var ReadChunkInputSchema = object({
19762
19826
  length: number()
19763
19827
  });
19764
19828
  var EndDownloadInputSchema = object({ downloadId: string() });
19765
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19829
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19766
19830
  location: StorageLocationSchema,
19767
19831
  relativePath: string()
19768
- }), string()), method(object({
19832
+ }), string(), { auth: "admin" }), method(object({
19769
19833
  location: StorageLocationSchema,
19770
19834
  relativePath: string(),
19771
19835
  data: _instanceof(Uint8Array)
19772
- }), _void(), { kind: "mutation" }), method(object({
19836
+ }), _void(), {
19837
+ kind: "mutation",
19838
+ auth: "admin"
19839
+ }), method(object({
19773
19840
  location: StorageLocationSchema,
19774
19841
  relativePath: string()
19775
- }), _instanceof(Uint8Array)), method(object({
19842
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19776
19843
  location: StorageLocationSchema,
19777
19844
  relativePath: string()
19778
- }), boolean()), method(object({
19845
+ }), boolean(), { auth: "admin" }), method(object({
19779
19846
  location: StorageLocationSchema,
19780
19847
  prefix: string().optional()
19781
- }), array(string()).readonly()), method(object({
19848
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19782
19849
  location: StorageLocationSchema,
19783
19850
  relativePath: string()
19784
- }), _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" });
19851
+ }), _void(), {
19852
+ kind: "mutation",
19853
+ auth: "admin"
19854
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19855
+ kind: "mutation",
19856
+ auth: "admin"
19857
+ }), method(WriteChunkInputSchema, _void(), {
19858
+ kind: "mutation",
19859
+ auth: "admin"
19860
+ }), method(FinalizeUploadInputSchema, _void(), {
19861
+ kind: "mutation",
19862
+ auth: "admin"
19863
+ }), method(AbortUploadInputSchema, _void(), {
19864
+ kind: "mutation",
19865
+ auth: "admin"
19866
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19867
+ kind: "mutation",
19868
+ auth: "admin"
19869
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19870
+ kind: "mutation",
19871
+ auth: "admin"
19872
+ });
19785
19873
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19786
19874
  var ProfileSettingsSchemaBridge = unknown().nullable();
19787
19875
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20039,7 +20127,8 @@ method(object({
20039
20127
  access: "create"
20040
20128
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20041
20129
  kind: "mutation",
20042
- access: "view"
20130
+ access: "view",
20131
+ auth: "admin"
20043
20132
  }), method(object({
20044
20133
  /** Required — the user the assertion belongs to (verified). */
20045
20134
  userId: string(),
@@ -20047,10 +20136,12 @@ method(object({
20047
20136
  response: record(string(), unknown())
20048
20137
  }), object({ verified: boolean() }), {
20049
20138
  kind: "mutation",
20050
- access: "view"
20139
+ access: "view",
20140
+ auth: "admin"
20051
20141
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20052
20142
  kind: "mutation",
20053
- access: "view"
20143
+ access: "view",
20144
+ auth: "admin"
20054
20145
  }), method(object({
20055
20146
  /** AuthenticationResponseJSON from the browser. */
20056
20147
  response: record(string(), unknown()) }), object({
@@ -20058,7 +20149,8 @@ response: record(string(), unknown()) }), object({
20058
20149
  userId: string().nullable()
20059
20150
  }), {
20060
20151
  kind: "mutation",
20061
- access: "view"
20152
+ access: "view",
20153
+ auth: "admin"
20062
20154
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20063
20155
  userId: string(),
20064
20156
  credentialId: string()
@@ -20230,7 +20322,19 @@ var VectorStatsResultSchema = object({
20230
20322
  /** False when the backend ranks approximately. */
20231
20323
  exact: boolean()
20232
20324
  });
20233
- 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);
20325
+ method(VectorDeclareIndexInputSchema, _void(), {
20326
+ kind: "mutation",
20327
+ auth: "admin"
20328
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20329
+ kind: "mutation",
20330
+ auth: "admin"
20331
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20332
+ kind: "mutation",
20333
+ auth: "admin"
20334
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20335
+ kind: "mutation",
20336
+ auth: "admin"
20337
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20234
20338
  var ClipSchema = object({
20235
20339
  /** Opaque, provider-namespaced id. The default provider encodes the time
20236
20340
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21953,7 +22057,27 @@ var MediaFileLiteSchema$1 = object({
21953
22057
  sizeBytes: number(),
21954
22058
  timestamp: number()
21955
22059
  });
21956
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22060
+ method(object({
22061
+ /**
22062
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22063
+ *
22064
+ * Default `false`, the same inversion `listRecentFaces` and
22065
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22066
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22067
+ * on the live hub the same day: four identities cost 40,979 B with the
22068
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22069
+ * four times and the viewer holds at `staleTime: 30_000`.
22070
+ *
22071
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22072
+ * the `event-media` plane serves that key `immutable` with an ETag.
22073
+ *
22074
+ * **This is an INPUT field, so it does not reach the addon until the
22075
+ * next train** — the hub router validates cap inputs against its own
22076
+ * compiled Zod and strips a key it does not know. Until then the
22077
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22078
+ * is what ships, and the opt-in becomes reachable when the train lands.
22079
+ */
22080
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21957
22081
  kind: "mutation",
21958
22082
  auth: "admin"
21959
22083
  }), method(object({
@@ -24100,8 +24224,10 @@ var PlateInfoSchema = object({
24100
24224
  keyFrameMediaKey: string().optional(),
24101
24225
  base64: string().optional(),
24102
24226
  /**
24103
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24104
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24227
+ * Same crop as a data-plane URL, always present when the plate has a stored
24228
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24229
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24230
+ * left at its `true` default.
24105
24231
  */
24106
24232
  cropUrl: string().optional()
24107
24233
  });
@@ -24121,14 +24247,34 @@ var PlateClusterSchema = object({
24121
24247
  });
24122
24248
  method(object({
24123
24249
  deviceId: number().int().optional(),
24124
- limit: number().int().positive().optional()
24250
+ limit: number().int().positive().optional(),
24251
+ /**
24252
+ * Inline the base64 crop on every row. Default `true` — the existing
24253
+ * behaviour, kept so no caller breaks.
24254
+ *
24255
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24256
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24257
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24258
+ * metadata without them — and the browser then caches the images.
24259
+ *
24260
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24261
+ * plates were the one gallery list left without it.
24262
+ *
24263
+ * **This is an INPUT field, so it does not reach the addon until the
24264
+ * next train.** The hub router validates cap inputs against its own
24265
+ * compiled Zod and strips a key it does not know. Until the train
24266
+ * ships, sending `false` is harmless and keeps the crops inline.
24267
+ */
24268
+ includeCrops: boolean().optional()
24125
24269
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24126
24270
  deviceId: number().int(),
24127
24271
  trackId: string()
24128
24272
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24129
24273
  text: string().min(1),
24130
24274
  maxDistance: number().int().min(0).optional(),
24131
- limit: number().int().positive().optional()
24275
+ limit: number().int().positive().optional(),
24276
+ /** See `listPlates.includeCrops`. Default `true`. */
24277
+ includeCrops: boolean().optional()
24132
24278
  }), array(PlateInfoSchema).readonly()), method(object({
24133
24279
  maxDistance: number().int().min(0).optional(),
24134
24280
  minClusterSize: number().int().min(2).optional(),
@@ -24142,7 +24288,13 @@ method(object({
24142
24288
  }), method(object({ plateId: string() }), _void(), {
24143
24289
  kind: "mutation",
24144
24290
  auth: "admin"
24145
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24291
+ }), method(object({
24292
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24293
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24294
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24295
+ * INPUT field: stripped by the hub router until the train ships, which
24296
+ * resolves to `false` and is exactly the intended default. */
24297
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24146
24298
  kind: "mutation",
24147
24299
  auth: "admin"
24148
24300
  }), method(object({
@@ -29519,6 +29671,12 @@ Object.freeze({
29519
29671
  addonId: null,
29520
29672
  access: "create"
29521
29673
  },
29674
+ "pipelineAnalytics.cancelRelocateMedia": {
29675
+ capName: "pipeline-analytics",
29676
+ capScope: "device",
29677
+ addonId: null,
29678
+ access: "create"
29679
+ },
29522
29680
  "pipelineAnalytics.cancelStorageMigrationMove": {
29523
29681
  capName: "pipeline-analytics",
29524
29682
  capScope: "device",
@@ -29693,6 +29851,12 @@ Object.freeze({
29693
29851
  addonId: null,
29694
29852
  access: "view"
29695
29853
  },
29854
+ "pipelineAnalytics.listRelocateMediaJobs": {
29855
+ capName: "pipeline-analytics",
29856
+ capScope: "device",
29857
+ addonId: null,
29858
+ access: "view"
29859
+ },
29696
29860
  "pipelineAnalytics.listRetrainAnnotations": {
29697
29861
  capName: "pipeline-analytics",
29698
29862
  capScope: "device",
@@ -29771,6 +29935,12 @@ Object.freeze({
29771
29935
  addonId: null,
29772
29936
  access: "create"
29773
29937
  },
29938
+ "pipelineAnalytics.relocateMedia": {
29939
+ capName: "pipeline-analytics",
29940
+ capScope: "device",
29941
+ addonId: null,
29942
+ access: "create"
29943
+ },
29774
29944
  "pipelineAnalytics.restageRetrainTrack": {
29775
29945
  capName: "pipeline-analytics",
29776
29946
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.2.28",
3
+ "version": "1.2.29",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",