@camstack/types 1.1.31 → 1.1.33

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.
Files changed (52) hide show
  1. package/dist/addon.js +1 -1
  2. package/dist/addon.mjs +1 -1
  3. package/dist/capabilities/addons.cap.d.ts +3 -1
  4. package/dist/capabilities/alerts.cap.d.ts +5 -5
  5. package/dist/capabilities/camera-streams.cap.d.ts +5 -5
  6. package/dist/capabilities/cap-router-predicates.d.ts +32 -0
  7. package/dist/capabilities/capability-definition.d.ts +18 -13
  8. package/dist/capabilities/consumables.cap.d.ts +1 -1
  9. package/dist/capabilities/custom-model-registry.cap.d.ts +36 -0
  10. package/dist/capabilities/index.d.ts +8 -15
  11. package/dist/capabilities/integrations.cap.d.ts +1 -1
  12. package/dist/capabilities/model-convert.cap.d.ts +21 -3
  13. package/dist/capabilities/model-distributor.cap.d.ts +36 -0
  14. package/dist/capabilities/network-quality.cap.d.ts +1 -1
  15. package/dist/capabilities/nodes.cap.d.ts +1 -1
  16. package/dist/capabilities/pipeline-executor.cap.d.ts +135 -8
  17. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +87 -44
  18. package/dist/capabilities/pipeline-runner.cap.d.ts +10 -69
  19. package/dist/capabilities/snapshot.cap.d.ts +3 -3
  20. package/dist/capabilities/stream-broker.cap.d.ts +9 -1
  21. package/dist/capabilities/system.cap.d.ts +1 -1
  22. package/dist/capabilities/toast.cap.d.ts +1 -1
  23. package/dist/capabilities/webrtc-session.cap.d.ts +15 -1
  24. package/dist/encode-profile.d.ts +2 -2
  25. package/dist/enums/event-category.d.ts +12 -0
  26. package/dist/generated/addon-api.d.ts +746 -636
  27. package/dist/generated/capability-router-map.d.ts +4 -16
  28. package/dist/generated/device-proxy.d.ts +0 -2
  29. package/dist/generated/method-access-map.d.ts +1 -1
  30. package/dist/generated/system-proxy.d.ts +2 -2
  31. package/dist/index.d.ts +1 -3
  32. package/dist/index.js +425 -349
  33. package/dist/index.mjs +412 -343
  34. package/dist/interfaces/capability.d.ts +0 -7
  35. package/dist/interfaces/event-bus.d.ts +9 -0
  36. package/dist/interfaces/pipeline-executor-capability.d.ts +14 -1
  37. package/dist/interfaces/pipeline-runner-capability.d.ts +11 -11
  38. package/dist/interfaces/recording-config.d.ts +2 -2
  39. package/dist/{sleep-CZDdRBua.mjs → sleep-Cc14_yxc.mjs} +12 -4
  40. package/dist/{sleep-Dirr8nGw.js → sleep-DmP-uxoe.js} +12 -4
  41. package/dist/types/agent-pipeline-settings.d.ts +18 -6
  42. package/dist/types/camera-pipeline.d.ts +17 -3
  43. package/dist/types/model-variant-groups.d.ts +90 -0
  44. package/dist/types/models.d.ts +60 -3
  45. package/package.json +1 -1
  46. package/dist/capabilities/restreamer.cap.d.ts +0 -54
  47. package/dist/capabilities/snapshot-provider.cap.d.ts +0 -43
  48. package/dist/capabilities/streaming-engine.cap.d.ts +0 -61
  49. package/dist/capabilities/webrtc.cap.d.ts +0 -75
  50. package/dist/interfaces/restreamer.d.ts +0 -23
  51. package/dist/interfaces/streaming.d.ts +0 -28
  52. package/dist/interfaces/webrtc-provider.d.ts +0 -34
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-Dirr8nGw.js");
2
+ const require_sleep = require("./sleep-DmP-uxoe.js");
3
3
  const require_err_msg = require("./err-msg-COpsHMw2.js");
4
4
  let zod = require("zod");
5
5
  //#region src/health/wiring-health.ts
@@ -115,6 +115,28 @@ var ModelFormatsSchema = zod.z.object({
115
115
  tflite: ModelFormatEntrySchema.optional(),
116
116
  pt: ModelFormatEntrySchema.optional()
117
117
  });
118
+ /**
119
+ * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
120
+ * the reduced `PipelineModelOption` returned in `pipeline.getSchema()` so the
121
+ * grouped Family→Tier→Variant picker renders identically in the config UI and
122
+ * in the pipeline/device steppers. The flat `id` stays the source of truth for
123
+ * resolution/download/persistence; this is a presentation overlay resolved back
124
+ * to an `id`.
125
+ */
126
+ var ModelVariantGroupSchema = zod.z.object({
127
+ /** Top-level family, e.g. `yolo26` (later `d-fine`, `rf-detr`). */
128
+ family: zod.z.string(),
129
+ /** Size within the family, e.g. `n` | `s` | `m` | `l`. */
130
+ tier: zod.z.string(),
131
+ /** Quantization axis. Omit ⇒ the fp32 base build. */
132
+ precision: zod.z.enum(["fp32", "int8"]).optional(),
133
+ /**
134
+ * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
135
+ * latency-optimized export (e.g. ReLU-activation / reduced-input variant)
136
+ * — the slot the future performance variants plug into.
137
+ */
138
+ optimization: zod.z.enum(["standard", "fast"]).optional()
139
+ });
118
140
  var ModelCatalogEntrySchema = zod.z.object({
119
141
  id: zod.z.string(),
120
142
  name: zod.z.string(),
@@ -144,7 +166,43 @@ var ModelCatalogEntrySchema = zod.z.object({
144
166
  * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
145
167
  * Downloaded into the same modelsDir alongside the model file.
146
168
  */
147
- extraFiles: zod.z.array(ModelExtraFileSchema).readonly().optional()
169
+ extraFiles: zod.z.array(ModelExtraFileSchema).readonly().optional(),
170
+ /**
171
+ * LEGACY entry — retained in the catalog so a persisted operator selection
172
+ * still RESOLVES (and can be re-activated), but hidden from the selectable
173
+ * model list and excluded from the auto format-default pick. Set on the
174
+ * superseded / consolidated models (older lineages, redundant fp16 IRs) so
175
+ * the active lineup stays the coherent curated ladder without deleting a
176
+ * model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
177
+ * an explicit legacy id that has a build for the node's format.
178
+ */
179
+ legacy: zod.z.boolean().optional(),
180
+ /**
181
+ * Measured quality/latency metadata — populated from the benchmark addon on
182
+ * the real node classes. Absent = not yet measured (most entries today; the
183
+ * catalog historically carried only `sizeMB`, a poor cross-architecture
184
+ * speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
185
+ */
186
+ metrics: zod.z.object({
187
+ map50: zod.z.number().optional(),
188
+ p95LatencyMs: zod.z.record(zod.z.string(), zod.z.number()).optional()
189
+ }).optional(),
190
+ /**
191
+ * SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
192
+ * YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
193
+ * the retraining addon and any future commercial distribution.
194
+ */
195
+ license: zod.z.string().optional(),
196
+ /**
197
+ * Variant-selector grouping. The UI groups models by `family` + `tier` and
198
+ * offers `precision` / `optimization` as variant axes WITHIN a tier — so all
199
+ * of a family's sizes and quantizations collapse into one grouped picker
200
+ * instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
201
+ * (legacy / custom models) — never shown in the grouped selector. The flat
202
+ * `id` stays the source of truth for resolution/download/persistence; grouping
203
+ * is a presentation overlay resolved back to an `id`.
204
+ */
205
+ group: ModelVariantGroupSchema.optional()
148
206
  });
149
207
  var ConvertTargetSchema = zod.z.discriminatedUnion("format", [zod.z.object({
150
208
  format: zod.z.literal("openvino"),
@@ -187,6 +245,135 @@ var ConvertResultSchema = zod.z.object({
187
245
  artifacts: zod.z.array(ConvertArtifactSchema).readonly()
188
246
  });
189
247
  //#endregion
248
+ //#region src/types/model-variant-groups.ts
249
+ var FORMAT_KEYS = [
250
+ "onnx",
251
+ "coreml",
252
+ "openvino",
253
+ "tflite",
254
+ "pt"
255
+ ];
256
+ function familyLabel(family) {
257
+ return family.toUpperCase();
258
+ }
259
+ /** Strip a leading family label from a base model name → clean tier label. */
260
+ function tierLabel(family, baseName) {
261
+ const fl = familyLabel(family);
262
+ const stripped = baseName.replace(new RegExp(`^${fl}\\s+`, "i"), "").trim();
263
+ return stripped.length > 0 ? stripped : baseName;
264
+ }
265
+ function variantLabel(precision, optimization) {
266
+ const parts = [];
267
+ if (optimization === "fast") parts.push("Fast");
268
+ parts.push(precision === "int8" ? "Int8" : "Standard");
269
+ return parts.join(" · ");
270
+ }
271
+ function entryFormats(entry) {
272
+ return FORMAT_KEYS.filter((f) => entry.formats[f] !== void 0);
273
+ }
274
+ function smallestSizeMB(entry) {
275
+ const sizes = FORMAT_KEYS.map((f) => entry.formats[f]?.sizeMB).filter((n) => typeof n === "number");
276
+ return sizes.length > 0 ? Math.min(...sizes) : 0;
277
+ }
278
+ var TIER_ORDER = [
279
+ "n",
280
+ "s",
281
+ "m",
282
+ "l",
283
+ "x"
284
+ ];
285
+ var PRECISION_ORDER = ["fp32", "int8"];
286
+ /**
287
+ * Fold a flat catalog into the `family → tier → variant` tree. Deterministic
288
+ * ordering: tiers by the canonical size ladder (unknown tiers appended
289
+ * alphabetically), variants standard-before-int8 and fast last.
290
+ */
291
+ function buildModelVariantGroups(models) {
292
+ const byFamily = /* @__PURE__ */ new Map();
293
+ for (const m of models) {
294
+ if (m.legacy === true || m.group === void 0) continue;
295
+ const { family, tier } = m.group;
296
+ const tiers = byFamily.get(family) ?? /* @__PURE__ */ new Map();
297
+ const entries = tiers.get(tier) ?? [];
298
+ entries.push(m);
299
+ tiers.set(tier, entries);
300
+ byFamily.set(family, tiers);
301
+ }
302
+ const families = [];
303
+ for (const [family, tiers] of byFamily) {
304
+ const tierList = [];
305
+ for (const [tier, entries] of tiers) {
306
+ const options = entries.map((e) => {
307
+ const precision = e.group?.precision ?? "fp32";
308
+ const optimization = e.group?.optimization ?? "standard";
309
+ return {
310
+ modelId: e.id,
311
+ precision,
312
+ optimization,
313
+ label: variantLabel(precision, optimization),
314
+ formats: entryFormats(e),
315
+ sizeMB: smallestSizeMB(e)
316
+ };
317
+ }).toSorted((a, b) => {
318
+ if (a.optimization !== b.optimization) return a.optimization === "fast" ? 1 : -1;
319
+ return PRECISION_ORDER.indexOf(a.precision) - PRECISION_ORDER.indexOf(b.precision);
320
+ });
321
+ const base = options.find((o) => o.precision === "fp32" && o.optimization === "standard") ?? options[0];
322
+ if (base === void 0) continue;
323
+ const baseEntry = entries.find((e) => e.id === base.modelId);
324
+ tierList.push({
325
+ tier,
326
+ label: baseEntry ? tierLabel(family, baseEntry.name) : tier.toUpperCase(),
327
+ baseModelId: base.modelId,
328
+ options
329
+ });
330
+ }
331
+ tierList.sort((a, b) => {
332
+ const ia = TIER_ORDER.indexOf(a.tier);
333
+ const ib = TIER_ORDER.indexOf(b.tier);
334
+ if (ia !== -1 && ib !== -1) return ia - ib;
335
+ if (ia !== -1) return -1;
336
+ if (ib !== -1) return 1;
337
+ return a.tier.localeCompare(b.tier);
338
+ });
339
+ families.push({
340
+ family,
341
+ label: familyLabel(family),
342
+ tiers: tierList
343
+ });
344
+ }
345
+ families.sort((a, b) => a.family.localeCompare(b.family));
346
+ return families;
347
+ }
348
+ /**
349
+ * Map a grouped selection back to a flat catalog model id. Returns `null` when
350
+ * no entry matches (the UI then falls back to the tier base / format default).
351
+ * `precision`/`optimization` default to `fp32`/`standard` (the base build).
352
+ */
353
+ function resolveVariantModelId(models, selection) {
354
+ const precision = selection.precision ?? "fp32";
355
+ const optimization = selection.optimization ?? "standard";
356
+ for (const m of models) {
357
+ if (m.group === void 0) continue;
358
+ if (m.group.family !== selection.family || m.group.tier !== selection.tier) continue;
359
+ if ((m.group.precision ?? "fp32") !== precision) continue;
360
+ if ((m.group.optimization ?? "standard") !== optimization) continue;
361
+ return m.id;
362
+ }
363
+ return null;
364
+ }
365
+ /** Inverse: describe a flat model id as a grouped selection, or `null`. */
366
+ function describeModelVariant(models, modelId) {
367
+ const entry = models.find((m) => m.id === modelId);
368
+ if (entry?.group === void 0) return null;
369
+ return {
370
+ family: entry.group.family,
371
+ tier: entry.group.tier,
372
+ precision: entry.group.precision ?? "fp32",
373
+ optimization: entry.group.optimization ?? "standard"
374
+ };
375
+ }
376
+ //#endregion
190
377
  //#region src/interfaces/addon.ts
191
378
  var DEFAULT_ADDON_PLACEMENT = "hub-only";
192
379
  /**
@@ -572,8 +759,8 @@ var RecordingModeSchema = zod.z.enum([
572
759
  "onAudioThreshold"
573
760
  ]);
574
761
  /**
575
- * First-class, authoritative per-camera storage mode — the netta choice the UI
576
- * reads directly (never inferred from `rules`):
762
+ * First-class, authoritative per-camera storage mode — the explicit choice the
763
+ * UI reads directly (never inferred from `rules`):
577
764
  * - `off` — not recording.
578
765
  * - `events` — record only around triggers (motion / audio threshold),
579
766
  * with pre/post-buffer.
@@ -4478,42 +4665,14 @@ onBrightnessChanged: { data: zod.z.object({
4478
4665
  runtimeState: BrightnessStatusSchema
4479
4666
  };
4480
4667
  //#endregion
4481
- //#region src/capabilities/streaming-engine.cap.ts
4668
+ //#region src/capabilities/stream-broker.cap.ts
4669
+ /** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
4482
4670
  var StreamFormatSchema = zod.z.enum([
4483
4671
  "webrtc",
4484
4672
  "hls",
4485
4673
  "mjpeg",
4486
4674
  "rtsp"
4487
4675
  ]);
4488
- var StreamInfoSchema = zod.z.object({
4489
- streamId: zod.z.string(),
4490
- format: StreamFormatSchema,
4491
- url: zod.z.string().nullable(),
4492
- active: zod.z.boolean()
4493
- });
4494
- var streamingEngineCapability = {
4495
- name: "streaming-engine",
4496
- scope: "system",
4497
- mode: "singleton",
4498
- internal: true,
4499
- methods: {
4500
- registerStream: require_sleep.method(zod.z.object({
4501
- streamId: zod.z.string(),
4502
- sourceUrl: zod.z.string(),
4503
- codec: zod.z.string().optional()
4504
- }), zod.z.void(), { kind: "mutation" }),
4505
- unregisterStream: require_sleep.method(zod.z.object({ streamId: zod.z.string() }), zod.z.void(), { kind: "mutation" }),
4506
- getStreamUrl: require_sleep.method(zod.z.object({
4507
- streamId: zod.z.string(),
4508
- format: StreamFormatSchema
4509
- }), zod.z.string().nullable()),
4510
- listStreams: require_sleep.method(zod.z.void(), zod.z.array(StreamInfoSchema))
4511
- },
4512
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
4513
- mount: { kind: "skip" }
4514
- };
4515
- //#endregion
4516
- //#region src/capabilities/stream-broker.cap.ts
4517
4676
  var RtspRestreamEntrySchema = zod.z.object({
4518
4677
  brokerId: zod.z.string(),
4519
4678
  url: zod.z.string(),
@@ -5507,37 +5666,7 @@ var consumablesCapability = {
5507
5666
  scope: "device",
5508
5667
  deviceNative: true,
5509
5668
  mode: "singleton",
5510
- deviceTypes: [
5511
- require_sleep.DeviceType.Camera,
5512
- require_sleep.DeviceType.Hub,
5513
- require_sleep.DeviceType.Light,
5514
- require_sleep.DeviceType.Siren,
5515
- require_sleep.DeviceType.Switch,
5516
- require_sleep.DeviceType.Sensor,
5517
- require_sleep.DeviceType.Thermostat,
5518
- require_sleep.DeviceType.Button,
5519
- require_sleep.DeviceType.EventEmitter,
5520
- require_sleep.DeviceType.Update,
5521
- require_sleep.DeviceType.Generic,
5522
- require_sleep.DeviceType.Notifier,
5523
- require_sleep.DeviceType.Script,
5524
- require_sleep.DeviceType.Automation,
5525
- require_sleep.DeviceType.Lock,
5526
- require_sleep.DeviceType.Cover,
5527
- require_sleep.DeviceType.Valve,
5528
- require_sleep.DeviceType.Humidifier,
5529
- require_sleep.DeviceType.WaterHeater,
5530
- require_sleep.DeviceType.Fan,
5531
- require_sleep.DeviceType.MediaPlayer,
5532
- require_sleep.DeviceType.AlarmPanel,
5533
- require_sleep.DeviceType.Control,
5534
- require_sleep.DeviceType.Presence,
5535
- require_sleep.DeviceType.Weather,
5536
- require_sleep.DeviceType.Vacuum,
5537
- require_sleep.DeviceType.LawnMower,
5538
- require_sleep.DeviceType.Container,
5539
- require_sleep.DeviceType.Image
5540
- ],
5669
+ deviceTypes: Object.values(require_sleep.DeviceType),
5541
5670
  deviceConfig: { ui: {
5542
5671
  kind: "widget",
5543
5672
  widgetId: "host/consumables-panel",
@@ -7303,7 +7432,6 @@ var PipelineDefaultStepSchema = zod.z.lazy(() => zod.z.object({
7303
7432
  enabled: zod.z.boolean(),
7304
7433
  modelId: zod.z.string(),
7305
7434
  children: zod.z.array(PipelineDefaultStepSchema).readonly(),
7306
- engine: PipelineEngineChoiceSchema.optional(),
7307
7435
  group: zod.z.string().optional(),
7308
7436
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
7309
7437
  }));
@@ -7328,7 +7456,9 @@ var PipelineModelOptionSchema = zod.z.object({
7328
7456
  formats: zod.z.record(zod.z.string(), zod.z.object({
7329
7457
  downloaded: zod.z.boolean(),
7330
7458
  sizeMB: zod.z.number()
7331
- }))
7459
+ })),
7460
+ group: ModelVariantGroupSchema.optional(),
7461
+ legacy: zod.z.boolean().optional()
7332
7462
  });
7333
7463
  var ConfigFieldBridge = zod.z.custom();
7334
7464
  var PipelineAddonSchemaSchema = zod.z.object({
@@ -7379,15 +7509,42 @@ var EngineProvisioningSchema = zod.z.object({
7379
7509
  ]),
7380
7510
  progress: zod.z.number().optional(),
7381
7511
  error: zod.z.string().optional(),
7382
- nextRetryAt: zod.z.number().optional()
7512
+ nextRetryAt: zod.z.number().optional(),
7513
+ /**
7514
+ * Gate A (config-correctness gate at engine change): human-readable
7515
+ * config issues surfaced EAGERLY when the node's engine changes — model
7516
+ * substitutions ("chose X, running Y") and zero-build steps ("no model
7517
+ * has a <format> build"). Additive/optional: informational only, never
7518
+ * enforced here — `assertEngineReady` (readiness) still gates inference.
7519
+ * Absent/empty when the node-default tree resolves cleanly.
7520
+ */
7521
+ configIssues: zod.z.array(zod.z.string()).optional()
7383
7522
  });
7384
7523
  var PipelineStepInputSchema = zod.z.lazy(() => zod.z.object({
7385
7524
  addonId: zod.z.string(),
7386
- modelId: zod.z.string(),
7525
+ modelId: zod.z.string().optional(),
7387
7526
  enabled: zod.z.boolean().default(true),
7388
7527
  children: zod.z.array(PipelineStepInputSchema).optional(),
7389
7528
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
7390
7529
  }));
7530
+ var ModelSubstitutionSchema = zod.z.object({
7531
+ addonId: zod.z.string(),
7532
+ chosen: zod.z.string(),
7533
+ running: zod.z.string(),
7534
+ format: zod.z.string()
7535
+ });
7536
+ var PipelineValidationIssueSchema = zod.z.object({
7537
+ addonId: zod.z.string(),
7538
+ kind: zod.z.enum(["unknown-addon", "no-format-build"]),
7539
+ detail: zod.z.string()
7540
+ });
7541
+ var PipelineValidationResultSchema = zod.z.object({
7542
+ ok: zod.z.boolean(),
7543
+ issues: zod.z.array(PipelineValidationIssueSchema).readonly(),
7544
+ substitutions: zod.z.array(ModelSubstitutionSchema).readonly(),
7545
+ /** The node's `currentEngine.format` this validation ran against. */
7546
+ format: zod.z.string()
7547
+ });
7391
7548
  var ReferenceImageEntrySchema = zod.z.object({
7392
7549
  filename: zod.z.string(),
7393
7550
  stepIds: zod.z.array(zod.z.string()).readonly().optional()
@@ -7504,6 +7661,19 @@ var pipelineExecutorCapability = {
7504
7661
  getGlobalSteps: require_sleep.method(zod.z.void(), zod.z.array(PipelineDefaultStepSchema).readonly().nullable()),
7505
7662
  getGlobalPipelineConfig: require_sleep.method(zod.z.void(), PipelineConfigBridge),
7506
7663
  getOrchestratorConfigSchema: require_sleep.method(zod.z.void(), ConfigUISchemaBridge),
7664
+ /**
7665
+ * Gate B (pre-init config-correctness gate). PURE COMPUTE against this
7666
+ * node's `currentEngine.format` — resolves `steps` the same way the
7667
+ * runtime dispatch path would, and reports what WOULD happen without
7668
+ * touching any node-global state. Called by the orchestrator at attach
7669
+ * time (`attachOn`), node-pinned to the TARGET node, so config problems
7670
+ * surface BEFORE `pipelineRunner.attachCamera` rather than at the first
7671
+ * per-frame resolve. `ok` is false iff `issues` is non-empty (both
7672
+ * `unknown-addon` and `no-format-build` are HARD issues); `substitutions`
7673
+ * is informational (a degraded-but-loadable model swap) and never
7674
+ * affects `ok`. Never throws.
7675
+ */
7676
+ validatePipeline: require_sleep.method(zod.z.object({ steps: zod.z.array(PipelineStepInputSchema) }), PipelineValidationResultSchema),
7507
7677
  listTemplates: require_sleep.method(zod.z.void(), zod.z.array(PipelineTemplateSchema$1).readonly()),
7508
7678
  saveTemplate: require_sleep.method(zod.z.object({
7509
7679
  name: zod.z.string(),
@@ -7890,6 +8060,13 @@ var RunnerFrameSourceSchema = zod.z.discriminatedUnion("kind", [zod.z.object({ k
7890
8060
  kind: zod.z.literal("remote-restream"),
7891
8061
  /** The camera's source-owner node (slice 1: always the hub). */
7892
8062
  ownerNodeId: zod.z.string(),
8063
+ /**
8064
+ * The owner's LAN-reachable host, resolved by the orchestrator from the
8065
+ * per-node `reachableHost` override (Cluster UI). When present the runner
8066
+ * dials THIS host for the owner's restream, in preference to the
8067
+ * `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
8068
+ */
8069
+ ownerReachableHost: zod.z.string().optional(),
7893
8070
  /** Operator override for the owner host the runner dials. */
7894
8071
  hubHostnameOverride: zod.z.string().optional()
7895
8072
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
@@ -7898,13 +8075,11 @@ var RunnerFrameSourceSchema = zod.z.discriminatedUnion("kind", [zod.z.object({ k
7898
8075
  * specific runner instance via `attachCamera`. Carries everything the
7899
8076
  * runner needs to subscribe to the local broker and execute inference.
7900
8077
  *
7901
- * Stateless-pipeline model: the full pipeline content (`engine`, `steps`,
7902
- * optional `audio`) travels with the attach payload. The runner keeps it
7903
- * in RAM for the lifetime of the attach — on rebalance, edit, or
7904
- * restart the orchestrator re-sends the latest snapshot.
7905
- *
7906
- * `engine`/`steps`/`audio` are optional during the additive migration
7907
- * window; once orchestrator + UI are migrated they become required.
8078
+ * Stateless-pipeline model: the pipeline content (`steps`, optional
8079
+ * `audio`) travels with the attach payload. The runner keeps it in RAM
8080
+ * for the lifetime of the attach — on rebalance, edit, or restart the
8081
+ * orchestrator re-sends the latest snapshot. Engine is NOT carried: it is
8082
+ * node-local, resolved by the executing runner at dispatch time.
7908
8083
  */
7909
8084
  var RunnerCameraConfigSchema = zod.z.object({
7910
8085
  deviceId: zod.z.number(),
@@ -7955,14 +8130,11 @@ var RunnerCameraConfigSchema = zod.z.object({
7955
8130
  */
7956
8131
  motionSources: MotionSourcesSchema.default(["analyzer"]),
7957
8132
  pipelineEnabled: zod.z.boolean().default(true),
7958
- /** Engine choice for video steps (runtime+backend+format). */
7959
- engine: PipelineEngineChoiceSchema.optional(),
7960
8133
  /** Ordered tree of video steps. Absent → runner skips video detection. */
7961
8134
  steps: zod.z.array(PipelineStepInputSchema).readonly().optional(),
7962
8135
  /** Audio classification branch. `enabled:false` disables, null skips. */
7963
8136
  audio: zod.z.object({
7964
- engine: PipelineEngineChoiceSchema,
7965
- modelId: zod.z.string(),
8137
+ modelId: zod.z.string().optional(),
7966
8138
  enabled: zod.z.boolean()
7967
8139
  }).nullable().optional(),
7968
8140
  /**
@@ -12258,6 +12430,7 @@ function createSystemProxy(api) {
12258
12430
  getGlobalSteps: (input) => dispatch("pipelineExecutor", "getGlobalSteps", "query", input),
12259
12431
  getGlobalPipelineConfig: (input) => dispatch("pipelineExecutor", "getGlobalPipelineConfig", "query", input),
12260
12432
  getOrchestratorConfigSchema: (input) => dispatch("pipelineExecutor", "getOrchestratorConfigSchema", "query", input),
12433
+ validatePipeline: (input) => dispatch("pipelineExecutor", "validatePipeline", "query", input),
12261
12434
  listTemplates: (input) => dispatch("pipelineExecutor", "listTemplates", "query", input),
12262
12435
  saveTemplate: (input) => dispatch("pipelineExecutor", "saveTemplate", "mutation", input),
12263
12436
  updateTemplate: (input) => dispatch("pipelineExecutor", "updateTemplate", "mutation", input),
@@ -12289,6 +12462,7 @@ function createSystemProxy(api) {
12289
12462
  getGlobalMetrics: (input) => dispatch("pipelineOrchestrator", "getGlobalMetrics", "query", input),
12290
12463
  getCapabilityBindings: (input) => dispatch("pipelineOrchestrator", "getCapabilityBindings", "query", input),
12291
12464
  setCapabilityBinding: (input) => dispatch("pipelineOrchestrator", "setCapabilityBinding", "mutation", input),
12465
+ getIngestOwner: (input) => dispatch("pipelineOrchestrator", "getIngestOwner", "query", input),
12292
12466
  getDecoderAssignments: (input) => dispatch("pipelineOrchestrator", "getDecoderAssignments", "query", input),
12293
12467
  getAudioNodeLoad: (input) => dispatch("pipelineOrchestrator", "getAudioNodeLoad", "query", input),
12294
12468
  getAgentSettings: (input) => dispatch("pipelineOrchestrator", "getAgentSettings", "query", input),
@@ -12298,6 +12472,7 @@ function createSystemProxy(api) {
12298
12472
  setAgentMaxCameras: (input) => dispatch("pipelineOrchestrator", "setAgentMaxCameras", "mutation", input),
12299
12473
  setAgentDetectWeight: (input) => dispatch("pipelineOrchestrator", "setAgentDetectWeight", "mutation", input),
12300
12474
  setAgentCapabilities: (input) => dispatch("pipelineOrchestrator", "setAgentCapabilities", "mutation", input),
12475
+ setAgentReachableHost: (input) => dispatch("pipelineOrchestrator", "setAgentReachableHost", "mutation", input),
12301
12476
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
12302
12477
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
12303
12478
  saveTemplate: (input) => dispatch("pipelineOrchestrator", "saveTemplate", "mutation", input),
@@ -14410,6 +14585,65 @@ var cameraPipelineConfigCapability = {
14410
14585
  methods: {}
14411
14586
  };
14412
14587
  //#endregion
14588
+ //#region src/capabilities/cap-router-predicates.ts
14589
+ /**
14590
+ * Shared cap-router predicates — the SINGLE source for the structural Zod-shape
14591
+ * checks + naming used by BOTH the runtime cap-router builder
14592
+ * (`@camstack/system` `cap-router-builder.ts` + the server's
14593
+ * `cap-router-runtime.ts`) AND the codegen scripts (`scripts/generate-cap-*.ts`).
14594
+ *
14595
+ * These used to be independently reimplemented on each side, held in sync only
14596
+ * by "must stay byte-identical" comments — a live drift risk. Consolidating them
14597
+ * here (next to `resolveCapMount` / `expandCapMethods`, the other shared model)
14598
+ * makes the two paths provably agree. Each predicate accepts both Zod 4
14599
+ * (`_def.type`) and legacy Zod 3 (`_def.typeName` / `constructor.name`) shapes.
14600
+ */
14601
+ /** `z.void()` — input carries no data. */
14602
+ function isVoidInput(schema) {
14603
+ const def = schema._def;
14604
+ return schema.constructor?.name === "ZodVoid" || def?.type === "void" || def?.typeName === "ZodVoid";
14605
+ }
14606
+ /** `z.object()` — supports `.loose()` for out-of-band `nodeId`/`addonId` keys. */
14607
+ function isObjectInput(schema) {
14608
+ const def = schema._def;
14609
+ return schema.constructor?.name === "ZodObject" || def?.type === "object" || def?.typeName === "ZodObject";
14610
+ }
14611
+ /**
14612
+ * Structural "is this Zod schema an array output" check — bottoms out at
14613
+ * `ZodArray` through the canonical Zod 4 wrappers (readonly/optional/nullable/
14614
+ * default). Bounded unwrap guards against a malformed/cyclic schema.
14615
+ */
14616
+ function isArrayOutputSchema(schema) {
14617
+ let cur = schema;
14618
+ for (let depth = 0; depth < 8 && cur != null; depth += 1) {
14619
+ const def = cur._def;
14620
+ const ctor = cur.constructor?.name;
14621
+ if (ctor === "ZodArray" || def?.type === "array") return true;
14622
+ if (!(ctor === "ZodReadonly" || def?.type === "readonly" || ctor === "ZodOptional" || def?.type === "optional" || ctor === "ZodNullable" || def?.type === "nullable" || ctor === "ZodDefault" || def?.type === "default") || def?.innerType == null) return false;
14623
+ cur = def.innerType;
14624
+ }
14625
+ return false;
14626
+ }
14627
+ /**
14628
+ * Apply `.loose()` to an object input schema when available (Zod 4) so the
14629
+ * router accepts the out-of-band `nodeId`/`addonId` selector keys without
14630
+ * stripping them. Falls back to the schema unchanged when `.loose()` is absent.
14631
+ */
14632
+ function looseSchema(schema) {
14633
+ const loose = schema.loose;
14634
+ return typeof loose === "function" ? loose.call(schema) : schema;
14635
+ }
14636
+ /** Auth level → base-procedure key. `superAdmin` collapses to `admin`. */
14637
+ function procedureAuthKey(auth) {
14638
+ if (auth === "public") return "public";
14639
+ if (auth === "admin" || auth === "superAdmin") return "admin";
14640
+ return "protected";
14641
+ }
14642
+ /** kebab-case cap name → camelCase router-map key. */
14643
+ function kebabToCamel(s) {
14644
+ return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
14645
+ }
14646
+ //#endregion
14413
14647
  //#region src/capabilities/custom-actions.ts
14414
14648
  /**
14415
14649
  * Identity — preserves literal types for downstream inference.
@@ -17198,11 +17432,11 @@ var pipelineAnalyticsCapability = {
17198
17432
  //#endregion
17199
17433
  //#region src/capabilities/pipeline-orchestrator.cap.ts
17200
17434
  var CameraPipelineConfigSchema = zod.z.object({
17201
- engine: PipelineEngineChoiceSchema,
17435
+ engine: PipelineEngineChoiceSchema.optional(),
17202
17436
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
17203
17437
  audio: zod.z.object({
17204
- engine: PipelineEngineChoiceSchema,
17205
- modelId: zod.z.string(),
17438
+ engine: PipelineEngineChoiceSchema.optional(),
17439
+ modelId: zod.z.string().optional(),
17206
17440
  enabled: zod.z.boolean(),
17207
17441
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).readonly().optional()
17208
17442
  }).nullable().optional()
@@ -17217,7 +17451,7 @@ var PipelineTemplateSchema = zod.z.object({
17217
17451
  });
17218
17452
  var AgentAddonConfigSchema = zod.z.object({
17219
17453
  enabled: zod.z.boolean(),
17220
- modelId: zod.z.string(),
17454
+ modelId: zod.z.string().optional(),
17221
17455
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).readonly()
17222
17456
  });
17223
17457
  var AgentPipelineSettingsSchema = zod.z.object({
@@ -17232,7 +17466,15 @@ var AgentPipelineSettingsSchema = zod.z.object({
17232
17466
  /** Node is eligible to run audio-analyzer sessions. */
17233
17467
  audio: zod.z.boolean().optional(),
17234
17468
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
17235
- ingest: zod.z.boolean().optional()
17469
+ ingest: zod.z.boolean().optional(),
17470
+ /**
17471
+ * Operator override for the LAN host a cross-node decoder dials to reach
17472
+ * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
17473
+ * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
17474
+ * it already uses to reach the hub). Set this only when the auto-detected
17475
+ * address is wrong (multi-homed host, NAT, custom interface).
17476
+ */
17477
+ reachableHost: zod.z.string().optional()
17236
17478
  });
17237
17479
  var CameraPipelineForAgentSchema = zod.z.object({
17238
17480
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
@@ -17338,6 +17580,15 @@ var GlobalMetricsSchema = zod.z.object({
17338
17580
  * capability providers.
17339
17581
  */
17340
17582
  var CapabilityBindingsSchema = zod.z.record(zod.z.string(), zod.z.string());
17583
+ /**
17584
+ * The cluster's single camera-source owner (`clusterRoles.ingestNode`) plus
17585
+ * its LAN-reachable host, if one is registered. See `getIngestOwner`.
17586
+ */
17587
+ var IngestOwnerSchema = zod.z.object({
17588
+ ownerNodeId: zod.z.string(),
17589
+ reachableHost: zod.z.string().optional(),
17590
+ configIssue: zod.z.string().optional()
17591
+ });
17341
17592
  /** Stream entry surfaced from the stream-catalog for one device. */
17342
17593
  var CameraSourceStreamSchema = zod.z.object({
17343
17594
  camStreamId: zod.z.string(),
@@ -17354,6 +17605,14 @@ var CameraAssignmentStatusSchema = zod.z.object({
17354
17605
  detectionNodeId: zod.z.string().nullable(),
17355
17606
  decoderNodeId: zod.z.string().nullable(),
17356
17607
  audioNodeId: zod.z.string().nullable(),
17608
+ /**
17609
+ * The node that OWNS this camera's physical source pull (dials the RTSP and
17610
+ * hosts the broker/restream) — the cluster ingest owner today
17611
+ * (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
17612
+ * the UI show WHERE a camera is sourced without SSH/logs, and is the node the
17613
+ * broker block below was read from (pinned). Nullable only pre-wiring.
17614
+ */
17615
+ sourceNodeId: zod.z.string().nullable(),
17357
17616
  pinned: zod.z.object({
17358
17617
  detection: zod.z.boolean(),
17359
17618
  decoder: zod.z.boolean(),
@@ -17560,6 +17819,14 @@ var pipelineOrchestratorCapability = {
17560
17819
  kind: "mutation",
17561
17820
  auth: "admin"
17562
17821
  }),
17822
+ /**
17823
+ * The cluster's single camera-source owner — resolved UNCONDITIONALLY
17824
+ * from `clusterRoles.ingestNode` (NOT the detection-decode
17825
+ * `remoteSourcingNodes` knob). Consumers (recorder/snapshot/audio) pin
17826
+ * their broker calls to `ownerNodeId` and dial `reachableHost` when
17827
+ * present. Defaults to `{ ownerNodeId: 'hub' }`.
17828
+ */
17829
+ getIngestOwner: require_sleep.method(zod.z.void(), IngestOwnerSchema),
17563
17830
  /** Pin a device's decoder to a specific node. */
17564
17831
  assignDecoder: require_sleep.method(zod.z.object({
17565
17832
  deviceId: zod.z.number(),
@@ -17706,6 +17973,22 @@ var pipelineOrchestratorCapability = {
17706
17973
  kind: "mutation",
17707
17974
  auth: "admin"
17708
17975
  }),
17976
+ /**
17977
+ * Set (or clear) the operator override for the LAN host a cross-node
17978
+ * decoder dials to reach this node's restream. Pass a non-empty string to
17979
+ * override the auto-detected address (the runner's `CAMSTACK_HUB_URL`
17980
+ * default); pass `null` or an empty string to clear it and revert to
17981
+ * auto-detect. Applied on the next dispatch cycle — takes effect for new
17982
+ * cross-node attaches; existing attaches keep their current host until
17983
+ * re-dispatched.
17984
+ */
17985
+ setAgentReachableHost: require_sleep.method(zod.z.object({
17986
+ agentNodeId: zod.z.string(),
17987
+ reachableHost: zod.z.string().nullable()
17988
+ }), zod.z.object({ success: zod.z.literal(true) }), {
17989
+ kind: "mutation",
17990
+ auth: "admin"
17991
+ }),
17709
17992
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
17710
17993
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
17711
17994
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -17798,36 +18081,6 @@ var pipelineOrchestratorCapability = {
17798
18081
  }
17799
18082
  };
17800
18083
  //#endregion
17801
- //#region src/capabilities/restreamer.cap.ts
17802
- var RegisteredStreamSchema = zod.z.object({
17803
- streamId: zod.z.string(),
17804
- label: zod.z.string().optional(),
17805
- codec: zod.z.string(),
17806
- type: zod.z.enum(["video", "audio"]),
17807
- sourceUrl: zod.z.string()
17808
- });
17809
- var ExposedResourceSchema = zod.z.object({
17810
- streamId: zod.z.string(),
17811
- format: zod.z.string(),
17812
- value: zod.z.string()
17813
- });
17814
- var restreamerCapability = {
17815
- name: "restreamer",
17816
- scope: "system",
17817
- mode: "collection",
17818
- internal: true,
17819
- methods: {
17820
- registerDevice: require_sleep.method(zod.z.object({
17821
- deviceId: zod.z.number(),
17822
- streams: zod.z.array(RegisteredStreamSchema).readonly()
17823
- }), zod.z.void(), { kind: "mutation" }),
17824
- unregisterDevice: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
17825
- getExposedResources: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.array(ExposedResourceSchema).readonly())
17826
- },
17827
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
17828
- mount: { kind: "skip" }
17829
- };
17830
- //#endregion
17831
18084
  //#region src/capabilities/settings-store.cap.ts
17832
18085
  /**
17833
18086
  * Query filter for settings-store collections.
@@ -18055,9 +18308,9 @@ var smtpProviderCapability = {
18055
18308
  /**
18056
18309
  * A single device snapshot returned as base64 JPEG/PNG.
18057
18310
  *
18058
- * Shared with the `snapshot-provider` collection cap the orchestrator
18059
- * receives the same shape from each native provider and from the
18060
- * broker-based fallback.
18311
+ * The `SnapshotAddon` wrapper returns this shape whether the frame came from
18312
+ * the device-native provider (onboard capture) or from the stream-broker
18313
+ * prebuffer fallback.
18061
18314
  */
18062
18315
  var SnapshotImageSchema = zod.z.object({
18063
18316
  base64: zod.z.string(),
@@ -18133,38 +18386,6 @@ var snapshotCapability = {
18133
18386
  }
18134
18387
  };
18135
18388
  //#endregion
18136
- //#region src/capabilities/snapshot-provider.cap.ts
18137
- /**
18138
- * snapshot-provider — collection of native snapshot implementations.
18139
- *
18140
- * Device provider addons (ONVIF, Frigate, etc.) register here
18141
- * when they can capture frames through a protocol-native path (e.g.
18142
- * ONVIF GetSnapshotUri, Frigate /api/<cam>/latest.jpg). The `snapshot`
18143
- * singleton orchestrator iterates over the collection, asking each
18144
- * provider whether it supports the requested device, and calls the
18145
- * first matching one.
18146
- *
18147
- * If no provider in the collection supports a device, the orchestrator
18148
- * falls back to `stream-broker.grabFrame` (universal fallback).
18149
- *
18150
- * Public tRPC router (auto-mounted) so out-of-process addons, agents,
18151
- * and advanced clients can bypass the orchestrator when needed.
18152
- */
18153
- var snapshotProviderCapability = {
18154
- name: "snapshot-provider",
18155
- scope: "system",
18156
- mode: "collection",
18157
- methods: {
18158
- supportsDevice: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.boolean()),
18159
- getSnapshot: require_sleep.method(zod.z.object({
18160
- deviceId: zod.z.number(),
18161
- streamId: zod.z.string().optional()
18162
- }), SnapshotImageSchema.nullable())
18163
- },
18164
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
18165
- mount: { kind: "custom" }
18166
- };
18167
- //#endregion
18168
18389
  //#region src/capabilities/sso-bridge.cap.ts
18169
18390
  /**
18170
18391
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
@@ -18699,11 +18920,12 @@ var videoclipsCapability = {
18699
18920
  }
18700
18921
  };
18701
18922
  //#endregion
18702
- //#region src/capabilities/webrtc.cap.ts
18923
+ //#region src/capabilities/webrtc-session.cap.ts
18703
18924
  /**
18704
- * Optional client-side hints sent at session creation to help the
18705
- * provider pick the best native source. All fields are optional —
18706
- * a viewer that knows nothing still gets a sane default.
18925
+ * Optional client-side hints sent at session creation to help the provider
18926
+ * pick the best native source. All fields optional — a viewer that knows
18927
+ * nothing still gets a sane default. (Relocated from the retired `webrtc`
18928
+ * collection cap; this `webrtc-session` cap is the live signaling surface.)
18707
18929
  */
18708
18930
  var webrtcClientHintsSchema = zod.z.object({
18709
18931
  viewportWidth: zod.z.number().int().positive().optional(),
@@ -18714,51 +18936,6 @@ var webrtcClientHintsSchema = zod.z.object({
18714
18936
  /** Hard tier override; takes precedence over scoring when registered. */
18715
18937
  prefersTier: zod.z.string().optional()
18716
18938
  }).partial();
18717
- var webrtcCapability = {
18718
- name: "webrtc",
18719
- scope: "system",
18720
- mode: "collection",
18721
- internal: true,
18722
- methods: {
18723
- handleOffer: require_sleep.method(zod.z.object({
18724
- streamId: zod.z.string(),
18725
- sdpOffer: zod.z.string()
18726
- }), zod.z.string(), { kind: "mutation" }),
18727
- supportsStream: require_sleep.method(zod.z.object({ streamId: zod.z.string() }), zod.z.boolean()),
18728
- registerStream: require_sleep.method(zod.z.object({
18729
- streamId: zod.z.string(),
18730
- codec: zod.z.string()
18731
- }), zod.z.void(), { kind: "mutation" }),
18732
- unregisterStream: require_sleep.method(zod.z.object({ streamId: zod.z.string() }), zod.z.void(), { kind: "mutation" }),
18733
- /**
18734
- * Two-step server-offer signaling. `hints` is optional — providers
18735
- * that don't care about adaptive source selection ignore it.
18736
- */
18737
- createSession: require_sleep.method(zod.z.object({
18738
- streamId: zod.z.string(),
18739
- hints: webrtcClientHintsSchema.optional()
18740
- }), zod.z.object({
18741
- sessionId: zod.z.string(),
18742
- sdpOffer: zod.z.string()
18743
- }), { kind: "mutation" }),
18744
- handleAnswer: require_sleep.method(zod.z.object({
18745
- sessionId: zod.z.string(),
18746
- sdpAnswer: zod.z.string()
18747
- }), zod.z.void(), { kind: "mutation" }),
18748
- closeSession: require_sleep.method(zod.z.object({ sessionId: zod.z.string() }), zod.z.void(), { kind: "mutation" }),
18749
- /**
18750
- * Whether this provider supports adaptive bitrate for the given stream.
18751
- * Currently always false — adaptive selection is one-shot at session
18752
- * start, not in-session encoder switching. Phase 5 plans to layer
18753
- * encoder-driven adaptation on top.
18754
- */
18755
- hasAdaptiveBitrate: require_sleep.method(zod.z.object({ streamId: zod.z.string() }), zod.z.boolean())
18756
- },
18757
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
18758
- mount: { kind: "skip" }
18759
- };
18760
- //#endregion
18761
- //#region src/capabilities/webrtc-session.cap.ts
18762
18939
  /**
18763
18940
  * Discriminated target for a WebRTC session. The client sends this
18764
18941
  * structured object instead of building / parsing brokerId strings;
@@ -19031,7 +19208,7 @@ var webrtcSessionCapability = {
19031
19208
  }).nullable() }))
19032
19209
  },
19033
19210
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
19034
- mount: { kind: "custom" }
19211
+ mount: { kind: "server-provided" }
19035
19212
  };
19036
19213
  //#endregion
19037
19214
  //#region src/capabilities/accessories.cap.ts
@@ -19403,7 +19580,15 @@ var FrameworkPackageStatusSchema = zod.z.object({
19403
19580
  latestVersion: zod.z.string().nullable(),
19404
19581
  hasUpdate: zod.z.boolean(),
19405
19582
  /** Optional manifest description for the row tooltip. */
19406
- description: zod.z.string().optional()
19583
+ description: zod.z.string().optional(),
19584
+ /**
19585
+ * Content build-id (md5 of the resolved `dist/` tree) of the code the hub
19586
+ * ACTUALLY loaded. Framework packages ship code changes without always
19587
+ * bumping `currentVersion`, so semver alone hides "same version, new code".
19588
+ * `null` when the dist can't be hashed (not installed / empty). The admin-UI
19589
+ * surfaces this so a stale-code hub is visible even at an unchanged version.
19590
+ */
19591
+ buildId: zod.z.string().nullable()
19407
19592
  });
19408
19593
  var LogStreamEntrySchema = zod.z.object({
19409
19594
  timestamp: zod.z.string(),
@@ -19702,7 +19887,7 @@ var addonsCapability = {
19702
19887
  }), LogStreamEntrySchema, { kind: "subscription" })
19703
19888
  },
19704
19889
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
19705
- mount: { kind: "service-backed" }
19890
+ mount: { kind: "server-provided" }
19706
19891
  };
19707
19892
  //#endregion
19708
19893
  //#region src/capabilities/button.cap.ts
@@ -20118,7 +20303,7 @@ var integrationsCapability = {
20118
20303
  })
20119
20304
  },
20120
20305
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
20121
- mount: { kind: "service-backed" }
20306
+ mount: { kind: "server-provided" }
20122
20307
  };
20123
20308
  //#endregion
20124
20309
  //#region src/capabilities/intercom.cap.ts
@@ -20765,7 +20950,7 @@ var networkQualityCapability = {
20765
20950
  }), zod.z.void(), { kind: "mutation" })
20766
20951
  },
20767
20952
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
20768
- mount: { kind: "service-backed" }
20953
+ mount: { kind: "server-provided" }
20769
20954
  };
20770
20955
  //#endregion
20771
20956
  //#region src/capabilities/nodes.cap.ts
@@ -20957,7 +21142,7 @@ var nodesCapability = {
20957
21142
  })
20958
21143
  },
20959
21144
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
20960
- mount: { kind: "service-backed" }
21145
+ mount: { kind: "server-provided" }
20961
21146
  };
20962
21147
  //#endregion
20963
21148
  //#region src/capabilities/osd.cap.ts
@@ -21951,7 +22136,7 @@ var systemCapability = {
21951
22136
  })
21952
22137
  },
21953
22138
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
21954
- mount: { kind: "service-backed" }
22139
+ mount: { kind: "server-provided" }
21955
22140
  };
21956
22141
  //#endregion
21957
22142
  //#region src/capabilities/toast.cap.ts
@@ -21991,7 +22176,7 @@ var toastCapability = {
21991
22176
  mode: "singleton",
21992
22177
  methods: { onToast: require_sleep.method(zod.z.void(), ToastSchema, { kind: "subscription" }) },
21993
22178
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
21994
- mount: { kind: "service-backed" }
22179
+ mount: { kind: "server-provided" }
21995
22180
  };
21996
22181
  //#endregion
21997
22182
  //#region src/capabilities/user-management.cap.ts
@@ -22371,13 +22556,11 @@ var CAPABILITY_NAMES = {
22371
22556
  ptzAutotrack: "ptz-autotrack",
22372
22557
  reboot: "reboot",
22373
22558
  recording: "recording",
22374
- restreamer: "restreamer",
22375
22559
  scriptRunner: "script-runner",
22376
22560
  settingsStore: "settings-store",
22377
22561
  smoke: "smoke",
22378
22562
  smtpProvider: "smtp-provider",
22379
22563
  snapshot: "snapshot",
22380
- snapshotProvider: "snapshot-provider",
22381
22564
  ssoBridge: "sso-bridge",
22382
22565
  storage: "storage",
22383
22566
  storageEvictable: "storage-evictable",
@@ -22385,7 +22568,6 @@ var CAPABILITY_NAMES = {
22385
22568
  streamBroker: "stream-broker",
22386
22569
  streamCatalog: "stream-catalog",
22387
22570
  streamParams: "stream-params",
22388
- streamingEngine: "streaming-engine",
22389
22571
  switch: "switch",
22390
22572
  system: "system",
22391
22573
  tamper: "tamper",
@@ -22401,7 +22583,6 @@ var CAPABILITY_NAMES = {
22401
22583
  videoclips: "videoclips",
22402
22584
  waterHeater: "water-heater",
22403
22585
  weather: "weather",
22404
- webrtc: "webrtc",
22405
22586
  webrtcSession: "webrtc-session",
22406
22587
  zoneAnalytics: "zone-analytics",
22407
22588
  zoneRules: "zone-rules",
@@ -22825,10 +23006,6 @@ var CAPABILITY_ROUTER_KEYS = [
22825
23006
  key: "recording",
22826
23007
  name: "recording"
22827
23008
  },
22828
- {
22829
- key: "restreamer",
22830
- name: "restreamer"
22831
- },
22832
23009
  {
22833
23010
  key: "scriptRunner",
22834
23011
  name: "script-runner"
@@ -22849,10 +23026,6 @@ var CAPABILITY_ROUTER_KEYS = [
22849
23026
  key: "snapshot",
22850
23027
  name: "snapshot"
22851
23028
  },
22852
- {
22853
- key: "snapshotProvider",
22854
- name: "snapshot-provider"
22855
- },
22856
23029
  {
22857
23030
  key: "ssoBridge",
22858
23031
  name: "sso-bridge"
@@ -22881,10 +23054,6 @@ var CAPABILITY_ROUTER_KEYS = [
22881
23054
  key: "streamParams",
22882
23055
  name: "stream-params"
22883
23056
  },
22884
- {
22885
- key: "streamingEngine",
22886
- name: "streaming-engine"
22887
- },
22888
23057
  {
22889
23058
  key: "switch",
22890
23059
  name: "switch"
@@ -22945,10 +23114,6 @@ var CAPABILITY_ROUTER_KEYS = [
22945
23114
  key: "weather",
22946
23115
  name: "weather"
22947
23116
  },
22948
- {
22949
- key: "webrtc",
22950
- name: "webrtc"
22951
- },
22952
23117
  {
22953
23118
  key: "webrtcSession",
22954
23119
  name: "webrtc-session"
@@ -23080,13 +23245,11 @@ var ALL_CAPABILITY_DEFINITIONS = [
23080
23245
  ptzAutotrackCapability,
23081
23246
  rebootCapability,
23082
23247
  recordingCapability,
23083
- restreamerCapability,
23084
23248
  scriptRunnerCapability,
23085
23249
  settingsStoreCapability,
23086
23250
  smokeCapability,
23087
23251
  smtpProviderCapability,
23088
23252
  snapshotCapability,
23089
- snapshotProviderCapability,
23090
23253
  ssoBridgeCapability,
23091
23254
  storageCapability,
23092
23255
  storageEvictableCapability,
@@ -23094,7 +23257,6 @@ var ALL_CAPABILITY_DEFINITIONS = [
23094
23257
  streamBrokerCapability,
23095
23258
  streamCatalogCapability,
23096
23259
  streamParamsCapability,
23097
- streamingEngineCapability,
23098
23260
  switchCapability,
23099
23261
  systemCapability,
23100
23262
  tamperCapability,
@@ -23110,7 +23272,6 @@ var ALL_CAPABILITY_DEFINITIONS = [
23110
23272
  videoclipsCapability,
23111
23273
  waterHeaterCapability,
23112
23274
  weatherCapability,
23113
- webrtcCapability,
23114
23275
  webrtcSessionCapability,
23115
23276
  zoneAnalyticsCapability,
23116
23277
  zoneRulesCapability,
@@ -26009,6 +26170,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26009
26170
  addonId: null,
26010
26171
  access: "create"
26011
26172
  },
26173
+ "pipelineExecutor.validatePipeline": {
26174
+ capName: "pipeline-executor",
26175
+ capScope: "system",
26176
+ addonId: null,
26177
+ access: "view"
26178
+ },
26012
26179
  "pipelineOrchestrator.assignAudio": {
26013
26180
  capName: "pipeline-orchestrator",
26014
26181
  capScope: "system",
@@ -26117,6 +26284,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26117
26284
  addonId: null,
26118
26285
  access: "view"
26119
26286
  },
26287
+ "pipelineOrchestrator.getIngestOwner": {
26288
+ capName: "pipeline-orchestrator",
26289
+ capScope: "system",
26290
+ addonId: null,
26291
+ access: "view"
26292
+ },
26120
26293
  "pipelineOrchestrator.getPipelineAssignment": {
26121
26294
  capName: "pipeline-orchestrator",
26122
26295
  capScope: "system",
@@ -26189,6 +26362,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26189
26362
  addonId: null,
26190
26363
  access: "create"
26191
26364
  },
26365
+ "pipelineOrchestrator.setAgentReachableHost": {
26366
+ capName: "pipeline-orchestrator",
26367
+ capScope: "system",
26368
+ addonId: null,
26369
+ access: "create"
26370
+ },
26192
26371
  "pipelineOrchestrator.setCameraPipelineForAgent": {
26193
26372
  capName: "pipeline-orchestrator",
26194
26373
  capScope: "system",
@@ -26519,24 +26698,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
26519
26698
  addonId: null,
26520
26699
  access: "create"
26521
26700
  },
26522
- "restreamer.getExposedResources": {
26523
- capName: "restreamer",
26524
- capScope: "system",
26525
- addonId: null,
26526
- access: "view"
26527
- },
26528
- "restreamer.registerDevice": {
26529
- capName: "restreamer",
26530
- capScope: "system",
26531
- addonId: null,
26532
- access: "create"
26533
- },
26534
- "restreamer.unregisterDevice": {
26535
- capName: "restreamer",
26536
- capScope: "system",
26537
- addonId: null,
26538
- access: "delete"
26539
- },
26540
26701
  "scriptRunner.run": {
26541
26702
  capName: "script-runner",
26542
26703
  capScope: "device",
@@ -26639,18 +26800,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
26639
26800
  addonId: null,
26640
26801
  access: "create"
26641
26802
  },
26642
- "snapshotProvider.getSnapshot": {
26643
- capName: "snapshot-provider",
26644
- capScope: "system",
26645
- addonId: null,
26646
- access: "view"
26647
- },
26648
- "snapshotProvider.supportsDevice": {
26649
- capName: "snapshot-provider",
26650
- capScope: "system",
26651
- addonId: null,
26652
- access: "view"
26653
- },
26654
26803
  "ssoBridge.signBridgeToken": {
26655
26804
  capName: "sso-bridge",
26656
26805
  capScope: "system",
@@ -27077,30 +27226,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
27077
27226
  addonId: null,
27078
27227
  access: "view"
27079
27228
  },
27080
- "streamingEngine.getStreamUrl": {
27081
- capName: "streaming-engine",
27082
- capScope: "system",
27083
- addonId: null,
27084
- access: "view"
27085
- },
27086
- "streamingEngine.listStreams": {
27087
- capName: "streaming-engine",
27088
- capScope: "system",
27089
- addonId: null,
27090
- access: "view"
27091
- },
27092
- "streamingEngine.registerStream": {
27093
- capName: "streaming-engine",
27094
- capScope: "system",
27095
- addonId: null,
27096
- access: "create"
27097
- },
27098
- "streamingEngine.unregisterStream": {
27099
- capName: "streaming-engine",
27100
- capScope: "system",
27101
- addonId: null,
27102
- access: "delete"
27103
- },
27104
27229
  "streamParams.getConfigSchema": {
27105
27230
  capName: "stream-params",
27106
27231
  capScope: "device",
@@ -27467,54 +27592,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
27467
27592
  addonId: null,
27468
27593
  access: "create"
27469
27594
  },
27470
- "webrtc.closeSession": {
27471
- capName: "webrtc",
27472
- capScope: "system",
27473
- addonId: null,
27474
- access: "create"
27475
- },
27476
- "webrtc.createSession": {
27477
- capName: "webrtc",
27478
- capScope: "system",
27479
- addonId: null,
27480
- access: "create"
27481
- },
27482
- "webrtc.handleAnswer": {
27483
- capName: "webrtc",
27484
- capScope: "system",
27485
- addonId: null,
27486
- access: "create"
27487
- },
27488
- "webrtc.handleOffer": {
27489
- capName: "webrtc",
27490
- capScope: "system",
27491
- addonId: null,
27492
- access: "create"
27493
- },
27494
- "webrtc.hasAdaptiveBitrate": {
27495
- capName: "webrtc",
27496
- capScope: "system",
27497
- addonId: null,
27498
- access: "view"
27499
- },
27500
- "webrtc.registerStream": {
27501
- capName: "webrtc",
27502
- capScope: "system",
27503
- addonId: null,
27504
- access: "create"
27505
- },
27506
- "webrtc.supportsStream": {
27507
- capName: "webrtc",
27508
- capScope: "system",
27509
- addonId: null,
27510
- access: "view"
27511
- },
27512
- "webrtc.unregisterStream": {
27513
- capName: "webrtc",
27514
- capScope: "system",
27515
- addonId: null,
27516
- access: "delete"
27517
- },
27518
27595
  "webrtcSession.addIceCandidate": {
27519
27596
  capName: "webrtc-session",
27520
27597
  capScope: "device",
@@ -27715,12 +27792,10 @@ var KNOWN_CAP_NAMES = [
27715
27792
  "ptz-autotrack",
27716
27793
  "reboot",
27717
27794
  "recording",
27718
- "restreamer",
27719
27795
  "script-runner",
27720
27796
  "settings-store",
27721
27797
  "smtp-provider",
27722
27798
  "snapshot",
27723
- "snapshot-provider",
27724
27799
  "sso-bridge",
27725
27800
  "storage",
27726
27801
  "storage-evictable",
@@ -27728,7 +27803,6 @@ var KNOWN_CAP_NAMES = [
27728
27803
  "stream-broker",
27729
27804
  "stream-catalog",
27730
27805
  "stream-params",
27731
- "streaming-engine",
27732
27806
  "switch",
27733
27807
  "system",
27734
27808
  "toast",
@@ -27740,7 +27814,6 @@ var KNOWN_CAP_NAMES = [
27740
27814
  "valve",
27741
27815
  "videoclips",
27742
27816
  "water-heater",
27743
- "webrtc",
27744
27817
  "webrtc-session",
27745
27818
  "zone-analytics",
27746
27819
  "zone-rules",
@@ -27848,22 +27921,18 @@ var SYSTEM_CAP_NAMES = [
27848
27921
  "plate-gallery",
27849
27922
  "platform-probe",
27850
27923
  "recording",
27851
- "restreamer",
27852
27924
  "settings-store",
27853
27925
  "smtp-provider",
27854
- "snapshot-provider",
27855
27926
  "sso-bridge",
27856
27927
  "storage",
27857
27928
  "storage-evictable",
27858
27929
  "storage-provider",
27859
27930
  "stream-broker",
27860
- "streaming-engine",
27861
27931
  "system",
27862
27932
  "toast",
27863
27933
  "turn-provider",
27864
27934
  "user-management",
27865
- "user-passkeys",
27866
- "webrtc"
27935
+ "user-passkeys"
27867
27936
  ];
27868
27937
  //#endregion
27869
27938
  //#region src/generated/scope-presets.ts
@@ -28645,7 +28714,6 @@ exports.EventSourceType = EventSourceType;
28645
28714
  exports.ExportSetupFieldSchema = ExportSetupFieldSchema;
28646
28715
  exports.ExportSetupSchema = ExportSetupSchema;
28647
28716
  exports.ExposedDeviceSchema = ExposedDeviceSchema;
28648
- exports.ExposedResourceSchema = ExposedResourceSchema;
28649
28717
  exports.ExposureModeSchema = ExposureModeSchema;
28650
28718
  exports.ExpressionEvalError = ExpressionEvalError;
28651
28719
  exports.ExpressionParseError = ExpressionParseError;
@@ -28674,6 +28742,7 @@ exports.ImageSettingsOptionsSchema = ImageSettingsOptionsSchema;
28674
28742
  exports.ImageSettingsPatchSchema = ImageSettingsPatchSchema;
28675
28743
  exports.ImageSettingsStatusSchema = ImageSettingsStatusSchema;
28676
28744
  exports.ImageStatusSchema = ImageStatusSchema;
28745
+ exports.IngestOwnerSchema = IngestOwnerSchema;
28677
28746
  exports.InstalledPackageSchema = InstalledPackageSchema;
28678
28747
  exports.IntegrationLiteSchema = IntegrationLiteSchema;
28679
28748
  exports.IntegrationWithStateSchema = IntegrationWithStateSchema;
@@ -28722,6 +28791,8 @@ exports.ModelDistributeResultSchema = ModelDistributeResultSchema;
28722
28791
  exports.ModelExtraFileSchema = ModelExtraFileSchema;
28723
28792
  exports.ModelFormatEntrySchema = ModelFormatEntrySchema;
28724
28793
  exports.ModelFormatsSchema = ModelFormatsSchema;
28794
+ exports.ModelSubstitutionSchema = ModelSubstitutionSchema;
28795
+ exports.ModelVariantGroupSchema = ModelVariantGroupSchema;
28725
28796
  exports.MotionAnalysisResultSchema = MotionAnalysisResultSchema;
28726
28797
  exports.MotionEventSchema = MotionEventSchema;
28727
28798
  exports.MotionOnMotionChangedDataSchema = MotionOnMotionChangedDataSchema;
@@ -28778,6 +28849,8 @@ exports.PipelineDefaultStepSchema = PipelineDefaultStepSchema;
28778
28849
  exports.PipelineEngineChoiceSchema = PipelineEngineChoiceSchema;
28779
28850
  exports.PipelineRunResultBridge = PipelineRunResultBridge;
28780
28851
  exports.PipelineStepInputSchema = PipelineStepInputSchema;
28852
+ exports.PipelineValidationIssueSchema = PipelineValidationIssueSchema;
28853
+ exports.PipelineValidationResultSchema = PipelineValidationResultSchema;
28781
28854
  exports.PlaceholderReasonSchema = PlaceholderReasonSchema;
28782
28855
  exports.PolygonPointSchema = PolygonPointSchema;
28783
28856
  exports.PowerMeterStatusSchema = PowerMeterStatusSchema;
@@ -28828,7 +28901,6 @@ exports.RecordingStorageModeSchema = RecordingStorageModeSchema;
28828
28901
  exports.RecordingStorageUsageSchema = RecordingStorageUsageSchema;
28829
28902
  exports.RecordingTriggersSchema = RecordingTriggersSchema;
28830
28903
  exports.RecordingWeekdaySchema = RecordingWeekdaySchema;
28831
- exports.RegisteredStreamSchema = RegisteredStreamSchema;
28832
28904
  exports.RenderedAsSchema = RenderedAsSchema;
28833
28905
  exports.ReportMotionInputSchema = ReportMotionInputSchema;
28834
28906
  exports.RingBuffer = RingBuffer;
@@ -28882,7 +28954,6 @@ exports.StorageTestLocationResultSchema = TestLocationResultSchema;
28882
28954
  exports.StorageWriteChunkInputSchema = WriteChunkInputSchema;
28883
28955
  exports.StreamCodecSchema = StreamCodecSchema;
28884
28956
  exports.StreamFormatSchema = StreamFormatSchema;
28885
- exports.StreamInfoSchema = StreamInfoSchema;
28886
28957
  exports.StreamNetworkStatsSchema = StreamNetworkStatsSchema;
28887
28958
  exports.StreamParamsOptionsSchema = StreamParamsOptionsSchema;
28888
28959
  exports.StreamParamsStatusSchema = StreamParamsStatusSchema;
@@ -28987,6 +29058,7 @@ exports.bindAddonActions = bindAddonActions;
28987
29058
  exports.brightnessCapability = brightnessCapability;
28988
29059
  exports.brokerCapability = brokerCapability;
28989
29060
  exports.buildAddonRouteProvider = buildAddonRouteProvider;
29061
+ exports.buildModelVariantGroups = buildModelVariantGroups;
28990
29062
  exports.buildStreamParamsConfigSchema = buildStreamParamsConfigSchema;
28991
29063
  exports.buttonCapability = buttonCapability;
28992
29064
  exports.cameraCredentialsCapability = cameraCredentialsCapability;
@@ -29023,6 +29095,7 @@ exports.dayNightCapability = dayNightCapability;
29023
29095
  exports.decoderCapability = decoderCapability;
29024
29096
  exports.defaultDeviceFor = defaultDeviceFor;
29025
29097
  exports.defineCustomActions = defineCustomActions;
29098
+ exports.describeModelVariant = describeModelVariant;
29026
29099
  exports.detectionPipelineCapability = detectionPipelineCapability;
29027
29100
  exports.deviceAdoptionCapability = deviceAdoptionCapability;
29028
29101
  exports.deviceCustomAction = deviceCustomAction;
@@ -29075,10 +29148,14 @@ exports.imageSettingsCapability = imageSettingsCapability;
29075
29148
  exports.integrationsCapability = integrationsCapability;
29076
29149
  exports.intercomCapability = intercomCapability;
29077
29150
  exports.isAgentOnlyPlacement = isAgentOnlyPlacement;
29151
+ exports.isArrayOutputSchema = isArrayOutputSchema;
29078
29152
  exports.isDeployableToAgent = isDeployableToAgent;
29079
29153
  exports.isDeviceConfigCap = require_sleep.isDeviceConfigCap;
29080
29154
  exports.isEvent = require_sleep.isEvent;
29155
+ exports.isObjectInput = isObjectInput;
29156
+ exports.isVoidInput = isVoidInput;
29081
29157
  exports.jobKindSchema = jobKindSchema;
29158
+ exports.kebabToCamel = kebabToCamel;
29082
29159
  exports.lawnMowerControlCapability = lawnMowerControlCapability;
29083
29160
  exports.lifecycleJobSchema = lifecycleJobSchema;
29084
29161
  exports.lifecycleJobScopeSchema = lifecycleJobScopeSchema;
@@ -29088,6 +29165,7 @@ exports.localNetworkCapability = localNetworkCapability;
29088
29165
  exports.locationSimilarity = locationSimilarity;
29089
29166
  exports.lockControlCapability = lockControlCapability;
29090
29167
  exports.logDestinationCapability = logDestinationCapability;
29168
+ exports.looseSchema = looseSchema;
29091
29169
  exports.makeProfileBrokerId = require_sleep.makeProfileBrokerId;
29092
29170
  exports.makeSourceBrokerId = require_sleep.makeSourceBrokerId;
29093
29171
  exports.mapAudioLabelToMacro = mapAudioLabelToMacro;
@@ -29141,6 +29219,7 @@ exports.prepareNotification = prepareNotification;
29141
29219
  exports.presenceCapability = presenceCapability;
29142
29220
  exports.pressureSensorCapability = pressureSensorCapability;
29143
29221
  exports.privacyMaskCapability = privacyMaskCapability;
29222
+ exports.procedureAuthKey = procedureAuthKey;
29144
29223
  exports.ptzAutotrackCapability = ptzAutotrackCapability;
29145
29224
  exports.ptzCapability = ptzCapability;
29146
29225
  exports.pythonScriptForBackend = pythonScriptForBackend;
@@ -29160,7 +29239,7 @@ exports.resolveDeviceProfile = resolveDeviceProfile;
29160
29239
  exports.resolveFormat = resolveFormat;
29161
29240
  exports.resolveModelFormat = resolveModelFormat;
29162
29241
  exports.resolveRunnerId = resolveRunnerId;
29163
- exports.restreamerCapability = restreamerCapability;
29242
+ exports.resolveVariantModelId = resolveVariantModelId;
29164
29243
  exports.runInferenceStep = runInferenceStep;
29165
29244
  exports.runtimeDevices = runtimeDevices;
29166
29245
  exports.scopeKey = require_sleep.scopeKey;
@@ -29174,7 +29253,6 @@ exports.sleepCancellable = require_sleep.sleepCancellable;
29174
29253
  exports.smokeCapability = smokeCapability;
29175
29254
  exports.smtpProviderCapability = smtpProviderCapability;
29176
29255
  exports.snapshotCapability = snapshotCapability;
29177
- exports.snapshotProviderCapability = snapshotProviderCapability;
29178
29256
  exports.ssoBridgeCapability = ssoBridgeCapability;
29179
29257
  exports.storageCapability = storageCapability;
29180
29258
  exports.storageEvictableCapability = storageEvictableCapability;
@@ -29184,7 +29262,6 @@ exports.streamCatalogCapability = streamCatalogCapability;
29184
29262
  exports.streamParamsCapability = streamParamsCapability;
29185
29263
  exports.streamPixels = streamPixels;
29186
29264
  exports.streamQualityLabel = streamQualityLabel;
29187
- exports.streamingEngineCapability = streamingEngineCapability;
29188
29265
  exports.supportedRuntimes = supportedRuntimes;
29189
29266
  exports.switchCapability = switchCapability;
29190
29267
  exports.synthesizeSourceInfo = synthesizeSourceInfo;
@@ -29215,7 +29292,6 @@ exports.vibrationCapability = vibrationCapability;
29215
29292
  exports.videoclipsCapability = videoclipsCapability;
29216
29293
  exports.waterHeaterCapability = waterHeaterCapability;
29217
29294
  exports.weatherCapability = weatherCapability;
29218
- exports.webrtcCapability = webrtcCapability;
29219
29295
  exports.webrtcClientHintsSchema = webrtcClientHintsSchema;
29220
29296
  exports.webrtcSessionCapability = webrtcSessionCapability;
29221
29297
  exports.wiringAddonHealthSchema = wiringAddonHealthSchema;