@camstack/types 1.1.32 → 1.1.34

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 (54) hide show
  1. package/dist/addon.js +1 -1
  2. package/dist/addon.mjs +1 -1
  3. package/dist/capabilities/addons.cap.d.ts +1 -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 +38 -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 +22 -3
  13. package/dist/capabilities/model-distributor.cap.d.ts +38 -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 +161 -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/device/index.d.ts +2 -0
  25. package/dist/device/reachability-poll.d.ts +90 -0
  26. package/dist/encode-profile.d.ts +2 -2
  27. package/dist/enums/event-category.d.ts +12 -0
  28. package/dist/generated/addon-api.d.ts +771 -643
  29. package/dist/generated/capability-router-map.d.ts +4 -16
  30. package/dist/generated/device-proxy.d.ts +0 -2
  31. package/dist/generated/method-access-map.d.ts +1 -1
  32. package/dist/generated/system-proxy.d.ts +2 -2
  33. package/dist/index.d.ts +3 -3
  34. package/dist/index.js +568 -350
  35. package/dist/index.mjs +551 -344
  36. package/dist/interfaces/capability.d.ts +0 -7
  37. package/dist/interfaces/event-bus.d.ts +9 -0
  38. package/dist/interfaces/pipeline-executor-capability.d.ts +14 -1
  39. package/dist/interfaces/pipeline-runner-capability.d.ts +11 -11
  40. package/dist/interfaces/recording-config.d.ts +2 -2
  41. package/dist/{sleep-CZDdRBua.mjs → sleep-Cc14_yxc.mjs} +12 -4
  42. package/dist/{sleep-Dirr8nGw.js → sleep-DmP-uxoe.js} +12 -4
  43. package/dist/types/agent-pipeline-settings.d.ts +18 -6
  44. package/dist/types/camera-pipeline.d.ts +17 -3
  45. package/dist/types/model-variant-groups.d.ts +100 -0
  46. package/dist/types/models.d.ts +63 -3
  47. package/package.json +1 -1
  48. package/dist/capabilities/restreamer.cap.d.ts +0 -54
  49. package/dist/capabilities/snapshot-provider.cap.d.ts +0 -43
  50. package/dist/capabilities/streaming-engine.cap.d.ts +0 -61
  51. package/dist/capabilities/webrtc.cap.d.ts +0 -75
  52. package/dist/interfaces/restreamer.d.ts +0 -23
  53. package/dist/interfaces/streaming.d.ts +0 -28
  54. 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,36 @@ 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 variant) — the slot the
136
+ * future performance variants plug into.
137
+ */
138
+ optimization: zod.z.enum(["standard", "fast"]).optional(),
139
+ /**
140
+ * Input-resolution axis (square input side, px). Omit ⇒ the family's native
141
+ * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
142
+ * cheap latency lever — especially on Apple ANE and the Intel N100 — at a
143
+ * small-object accuracy cost. Mirrors the model's `inputSize` but lifted onto
144
+ * the group so the selector can offer it as a variant axis.
145
+ */
146
+ resolution: zod.z.number().int().positive().optional()
147
+ });
118
148
  var ModelCatalogEntrySchema = zod.z.object({
119
149
  id: zod.z.string(),
120
150
  name: zod.z.string(),
@@ -144,7 +174,43 @@ var ModelCatalogEntrySchema = zod.z.object({
144
174
  * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
145
175
  * Downloaded into the same modelsDir alongside the model file.
146
176
  */
147
- extraFiles: zod.z.array(ModelExtraFileSchema).readonly().optional()
177
+ extraFiles: zod.z.array(ModelExtraFileSchema).readonly().optional(),
178
+ /**
179
+ * LEGACY entry — retained in the catalog so a persisted operator selection
180
+ * still RESOLVES (and can be re-activated), but hidden from the selectable
181
+ * model list and excluded from the auto format-default pick. Set on the
182
+ * superseded / consolidated models (older lineages, redundant fp16 IRs) so
183
+ * the active lineup stays the coherent curated ladder without deleting a
184
+ * model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
185
+ * an explicit legacy id that has a build for the node's format.
186
+ */
187
+ legacy: zod.z.boolean().optional(),
188
+ /**
189
+ * Measured quality/latency metadata — populated from the benchmark addon on
190
+ * the real node classes. Absent = not yet measured (most entries today; the
191
+ * catalog historically carried only `sizeMB`, a poor cross-architecture
192
+ * speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
193
+ */
194
+ metrics: zod.z.object({
195
+ map50: zod.z.number().optional(),
196
+ p95LatencyMs: zod.z.record(zod.z.string(), zod.z.number()).optional()
197
+ }).optional(),
198
+ /**
199
+ * SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
200
+ * YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
201
+ * the retraining addon and any future commercial distribution.
202
+ */
203
+ license: zod.z.string().optional(),
204
+ /**
205
+ * Variant-selector grouping. The UI groups models by `family` + `tier` and
206
+ * offers `precision` / `optimization` as variant axes WITHIN a tier — so all
207
+ * of a family's sizes and quantizations collapse into one grouped picker
208
+ * instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
209
+ * (legacy / custom models) — never shown in the grouped selector. The flat
210
+ * `id` stays the source of truth for resolution/download/persistence; grouping
211
+ * is a presentation overlay resolved back to an `id`.
212
+ */
213
+ group: ModelVariantGroupSchema.optional()
148
214
  });
149
215
  var ConvertTargetSchema = zod.z.discriminatedUnion("format", [zod.z.object({
150
216
  format: zod.z.literal("openvino"),
@@ -187,6 +253,139 @@ var ConvertResultSchema = zod.z.object({
187
253
  artifacts: zod.z.array(ConvertArtifactSchema).readonly()
188
254
  });
189
255
  //#endregion
256
+ //#region src/types/model-variant-groups.ts
257
+ var FORMAT_KEYS = [
258
+ "onnx",
259
+ "coreml",
260
+ "openvino",
261
+ "tflite",
262
+ "pt"
263
+ ];
264
+ function familyLabel(family) {
265
+ return family.toUpperCase();
266
+ }
267
+ /** Strip a leading family label from a base model name → clean tier label. */
268
+ function tierLabel(family, baseName) {
269
+ const fl = familyLabel(family);
270
+ const stripped = baseName.replace(new RegExp(`^${fl}\\s+`, "i"), "").trim();
271
+ return stripped.length > 0 ? stripped : baseName;
272
+ }
273
+ function variantLabel(precision, optimization) {
274
+ const parts = [];
275
+ if (optimization === "fast") parts.push("Fast");
276
+ parts.push(precision === "int8" ? "Int8" : "Standard");
277
+ return parts.join(" · ");
278
+ }
279
+ function entryFormats(entry) {
280
+ return FORMAT_KEYS.filter((f) => entry.formats[f] !== void 0);
281
+ }
282
+ function smallestSizeMB(entry) {
283
+ const sizes = FORMAT_KEYS.map((f) => entry.formats[f]?.sizeMB).filter((n) => typeof n === "number");
284
+ return sizes.length > 0 ? Math.min(...sizes) : 0;
285
+ }
286
+ var TIER_ORDER = [
287
+ "n",
288
+ "s",
289
+ "m",
290
+ "l",
291
+ "x"
292
+ ];
293
+ var PRECISION_ORDER = ["fp32", "int8"];
294
+ /**
295
+ * Fold a flat catalog into the `family → tier → variant` tree. Deterministic
296
+ * ordering: tiers by the canonical size ladder (unknown tiers appended
297
+ * alphabetically), variants standard-before-int8 and fast last.
298
+ */
299
+ function buildModelVariantGroups(models) {
300
+ const byFamily = /* @__PURE__ */ new Map();
301
+ for (const m of models) {
302
+ if (m.legacy === true || m.group === void 0) continue;
303
+ const { family, tier } = m.group;
304
+ const tiers = byFamily.get(family) ?? /* @__PURE__ */ new Map();
305
+ const entries = tiers.get(tier) ?? [];
306
+ entries.push(m);
307
+ tiers.set(tier, entries);
308
+ byFamily.set(family, tiers);
309
+ }
310
+ const families = [];
311
+ for (const [family, tiers] of byFamily) {
312
+ const tierList = [];
313
+ for (const [tier, entries] of tiers) {
314
+ const options = entries.map((e) => {
315
+ const precision = e.group?.precision ?? "fp32";
316
+ const optimization = e.group?.optimization ?? "standard";
317
+ return {
318
+ modelId: e.id,
319
+ precision,
320
+ optimization,
321
+ resolution: e.group?.resolution,
322
+ label: variantLabel(precision, optimization),
323
+ formats: entryFormats(e),
324
+ sizeMB: smallestSizeMB(e)
325
+ };
326
+ }).toSorted((a, b) => {
327
+ if (a.resolution !== b.resolution) return (b.resolution ?? Infinity) - (a.resolution ?? Infinity);
328
+ if (a.optimization !== b.optimization) return a.optimization === "fast" ? 1 : -1;
329
+ return PRECISION_ORDER.indexOf(a.precision) - PRECISION_ORDER.indexOf(b.precision);
330
+ });
331
+ const base = options.find((o) => o.precision === "fp32" && o.optimization === "standard" && o.resolution === void 0) ?? options[0];
332
+ if (base === void 0) continue;
333
+ const baseEntry = entries.find((e) => e.id === base.modelId);
334
+ tierList.push({
335
+ tier,
336
+ label: baseEntry ? tierLabel(family, baseEntry.name) : tier.toUpperCase(),
337
+ baseModelId: base.modelId,
338
+ options
339
+ });
340
+ }
341
+ tierList.sort((a, b) => {
342
+ const ia = TIER_ORDER.indexOf(a.tier);
343
+ const ib = TIER_ORDER.indexOf(b.tier);
344
+ if (ia !== -1 && ib !== -1) return ia - ib;
345
+ if (ia !== -1) return -1;
346
+ if (ib !== -1) return 1;
347
+ return a.tier.localeCompare(b.tier);
348
+ });
349
+ families.push({
350
+ family,
351
+ label: familyLabel(family),
352
+ tiers: tierList
353
+ });
354
+ }
355
+ families.sort((a, b) => a.family.localeCompare(b.family));
356
+ return families;
357
+ }
358
+ /**
359
+ * Map a grouped selection back to a flat catalog model id. Returns `null` when
360
+ * no entry matches (the UI then falls back to the tier base / format default).
361
+ * `precision`/`optimization` default to `fp32`/`standard` (the base build).
362
+ */
363
+ function resolveVariantModelId(models, selection) {
364
+ const precision = selection.precision ?? "fp32";
365
+ const optimization = selection.optimization ?? "standard";
366
+ for (const m of models) {
367
+ if (m.group === void 0) continue;
368
+ if (m.group.family !== selection.family || m.group.tier !== selection.tier) continue;
369
+ if ((m.group.precision ?? "fp32") !== precision) continue;
370
+ if ((m.group.optimization ?? "standard") !== optimization) continue;
371
+ if (m.group.resolution !== selection.resolution) continue;
372
+ return m.id;
373
+ }
374
+ return null;
375
+ }
376
+ /** Inverse: describe a flat model id as a grouped selection, or `null`. */
377
+ function describeModelVariant(models, modelId) {
378
+ const entry = models.find((m) => m.id === modelId);
379
+ if (entry?.group === void 0) return null;
380
+ return {
381
+ family: entry.group.family,
382
+ tier: entry.group.tier,
383
+ precision: entry.group.precision ?? "fp32",
384
+ optimization: entry.group.optimization ?? "standard",
385
+ resolution: entry.group.resolution
386
+ };
387
+ }
388
+ //#endregion
190
389
  //#region src/interfaces/addon.ts
191
390
  var DEFAULT_ADDON_PLACEMENT = "hub-only";
192
391
  /**
@@ -572,8 +771,8 @@ var RecordingModeSchema = zod.z.enum([
572
771
  "onAudioThreshold"
573
772
  ]);
574
773
  /**
575
- * First-class, authoritative per-camera storage mode — the netta choice the UI
576
- * reads directly (never inferred from `rules`):
774
+ * First-class, authoritative per-camera storage mode — the explicit choice the
775
+ * UI reads directly (never inferred from `rules`):
577
776
  * - `off` — not recording.
578
777
  * - `events` — record only around triggers (motion / audio threshold),
579
778
  * with pre/post-buffer.
@@ -1609,7 +1808,7 @@ async function runInferenceStep(fn, timeoutMs) {
1609
1808
  const t0 = performance.now();
1610
1809
  try {
1611
1810
  return {
1612
- output: timeoutMs !== void 0 ? await withTimeout(fn(), timeoutMs) : await fn(),
1811
+ output: timeoutMs !== void 0 ? await withTimeout$1(fn(), timeoutMs) : await fn(),
1613
1812
  durationMs: roundMs(performance.now() - t0),
1614
1813
  ok: true
1615
1814
  };
@@ -1627,7 +1826,7 @@ function roundMs(ms) {
1627
1826
  return Math.round(ms * 100) / 100;
1628
1827
  }
1629
1828
  /** Reject a promise if it exceeds the given timeout */
1630
- function withTimeout(promise, ms) {
1829
+ function withTimeout$1(promise, ms) {
1631
1830
  return new Promise((resolve, reject) => {
1632
1831
  const timer = setTimeout(() => reject(/* @__PURE__ */ new Error(`Inference timeout after ${ms}ms`)), ms);
1633
1832
  promise.then((v) => {
@@ -3589,6 +3788,111 @@ function createRuntimeStateBridge(params) {
3589
3788
  };
3590
3789
  }
3591
3790
  //#endregion
3791
+ //#region src/device/reachability-poll.ts
3792
+ /**
3793
+ * Shared control-plane reachability poller for camera devices.
3794
+ *
3795
+ * `device.online` must reflect CONTROL-PLANE REACHABILITY — "can we talk to
3796
+ * the camera's management API right now" — NOT whether video happens to be
3797
+ * flowing through the stream broker. A camera that dials on-demand (no
3798
+ * consumer attached) is fully reachable yet has no active stream; driving
3799
+ * `online` from stream health falsely marks it OFFLINE.
3800
+ *
3801
+ * Every camera provider owns a cheap control-plane round-trip (Hikvision
3802
+ * ISAPI `getDeviceInfo`, Amcrest Dahua CGI `getDeviceInfo`, ONVIF
3803
+ * `getDeviceInformation`, RTSP `OPTIONS`/TCP-connect). Each provider passes
3804
+ * that round-trip as a `probe: () => Promise<boolean>` and this helper runs
3805
+ * the loop, applies hysteresis, and drives the device's `online` setter.
3806
+ *
3807
+ * Hysteresis rules (avoid flapping on a single dropped packet):
3808
+ * - mark ONLINE immediately on the first successful probe;
3809
+ * - mark OFFLINE only after {@link REACHABILITY_FAILURES_TO_OFFLINE}
3810
+ * CONSECUTIVE failures.
3811
+ *
3812
+ * Robustness rules:
3813
+ * - each probe is bounded by {@link REACHABILITY_PROBE_TIMEOUT_MS} so a hung
3814
+ * control channel can't wedge the loop;
3815
+ * - a single in-flight probe at a time — a slow probe never stacks up;
3816
+ * - the loop never throws (a rejected/thrown probe counts as a failure);
3817
+ * - `isEnabled()` gates each tick so a soft-disabled device isn't polled.
3818
+ */
3819
+ /** Poll cadence — probe every camera's control plane on this interval. */
3820
+ var REACHABILITY_POLL_INTERVAL_MS = 3e4;
3821
+ /**
3822
+ * Consecutive failures required before flipping `online` to `false`.
3823
+ * ONLINE is asserted on the first success; OFFLINE waits for N misses so a
3824
+ * single transient timeout doesn't flap the flag.
3825
+ */
3826
+ var REACHABILITY_FAILURES_TO_OFFLINE = 3;
3827
+ /** Per-probe timeout — an unreachable/hung control channel resolves as a miss. */
3828
+ var REACHABILITY_PROBE_TIMEOUT_MS = 1e4;
3829
+ /** Reject after `ms`; always clears its own timer. */
3830
+ async function withTimeout(promise, ms, label) {
3831
+ let timer;
3832
+ const timeout = new Promise((_resolve, reject) => {
3833
+ timer = setTimeout(() => reject(/* @__PURE__ */ new Error(`${label} timed out after ${String(ms)}ms`)), ms);
3834
+ });
3835
+ try {
3836
+ return await Promise.race([promise, timeout]);
3837
+ } finally {
3838
+ if (timer !== void 0) clearTimeout(timer);
3839
+ }
3840
+ }
3841
+ /**
3842
+ * Start the reachability poll loop. Returns a handle whose `stop()` clears the
3843
+ * timer and prevents any further ticks. Start on device activation, stop on
3844
+ * device teardown (`removeDevice`) so no timer leaks.
3845
+ */
3846
+ function startReachabilityPoll(options) {
3847
+ const intervalMs = options.intervalMs ?? 3e4;
3848
+ const failuresToOffline = options.failuresToOffline ?? 3;
3849
+ const probeTimeoutMs = options.probeTimeoutMs ?? 1e4;
3850
+ const runImmediately = options.runImmediately ?? true;
3851
+ let stopped = false;
3852
+ let running = false;
3853
+ let consecutiveFailures = 0;
3854
+ let timer;
3855
+ const tick = async () => {
3856
+ if (stopped) return;
3857
+ if (running) return;
3858
+ if (options.isEnabled && !options.isEnabled()) return;
3859
+ running = true;
3860
+ try {
3861
+ const reachable = await withTimeout(Promise.resolve().then(options.probe), probeTimeoutMs, "reachability probe");
3862
+ if (stopped) return;
3863
+ if (reachable) {
3864
+ consecutiveFailures = 0;
3865
+ options.setOnline(true);
3866
+ } else registerFailure("probe resolved unreachable");
3867
+ } catch (error) {
3868
+ if (stopped) return;
3869
+ registerFailure(error instanceof Error ? error.message : "probe threw");
3870
+ } finally {
3871
+ running = false;
3872
+ }
3873
+ };
3874
+ const registerFailure = (reason) => {
3875
+ consecutiveFailures += 1;
3876
+ options.logger?.debug("reachability probe failed", {
3877
+ reason,
3878
+ consecutiveFailures,
3879
+ failuresToOffline
3880
+ });
3881
+ if (consecutiveFailures >= failuresToOffline) options.setOnline(false);
3882
+ };
3883
+ timer = setInterval(() => {
3884
+ tick();
3885
+ }, intervalMs);
3886
+ if (typeof timer === "object" && timer !== null && "unref" in timer) timer.unref();
3887
+ if (runImmediately) tick();
3888
+ return { stop: () => {
3889
+ if (stopped) return;
3890
+ stopped = true;
3891
+ if (timer !== void 0) clearInterval(timer);
3892
+ timer = void 0;
3893
+ } };
3894
+ }
3895
+ //#endregion
3592
3896
  //#region src/notification/format-transcode.ts
3593
3897
  /** Strip a small, safe subset of Markdown down to plain text. */
3594
3898
  function markdownToText(md) {
@@ -4478,42 +4782,14 @@ onBrightnessChanged: { data: zod.z.object({
4478
4782
  runtimeState: BrightnessStatusSchema
4479
4783
  };
4480
4784
  //#endregion
4481
- //#region src/capabilities/streaming-engine.cap.ts
4785
+ //#region src/capabilities/stream-broker.cap.ts
4786
+ /** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
4482
4787
  var StreamFormatSchema = zod.z.enum([
4483
4788
  "webrtc",
4484
4789
  "hls",
4485
4790
  "mjpeg",
4486
4791
  "rtsp"
4487
4792
  ]);
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
4793
  var RtspRestreamEntrySchema = zod.z.object({
4518
4794
  brokerId: zod.z.string(),
4519
4795
  url: zod.z.string(),
@@ -5507,37 +5783,7 @@ var consumablesCapability = {
5507
5783
  scope: "device",
5508
5784
  deviceNative: true,
5509
5785
  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
- ],
5786
+ deviceTypes: Object.values(require_sleep.DeviceType),
5541
5787
  deviceConfig: { ui: {
5542
5788
  kind: "widget",
5543
5789
  widgetId: "host/consumables-panel",
@@ -7303,7 +7549,6 @@ var PipelineDefaultStepSchema = zod.z.lazy(() => zod.z.object({
7303
7549
  enabled: zod.z.boolean(),
7304
7550
  modelId: zod.z.string(),
7305
7551
  children: zod.z.array(PipelineDefaultStepSchema).readonly(),
7306
- engine: PipelineEngineChoiceSchema.optional(),
7307
7552
  group: zod.z.string().optional(),
7308
7553
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
7309
7554
  }));
@@ -7328,7 +7573,9 @@ var PipelineModelOptionSchema = zod.z.object({
7328
7573
  formats: zod.z.record(zod.z.string(), zod.z.object({
7329
7574
  downloaded: zod.z.boolean(),
7330
7575
  sizeMB: zod.z.number()
7331
- }))
7576
+ })),
7577
+ group: ModelVariantGroupSchema.optional(),
7578
+ legacy: zod.z.boolean().optional()
7332
7579
  });
7333
7580
  var ConfigFieldBridge = zod.z.custom();
7334
7581
  var PipelineAddonSchemaSchema = zod.z.object({
@@ -7379,15 +7626,42 @@ var EngineProvisioningSchema = zod.z.object({
7379
7626
  ]),
7380
7627
  progress: zod.z.number().optional(),
7381
7628
  error: zod.z.string().optional(),
7382
- nextRetryAt: zod.z.number().optional()
7629
+ nextRetryAt: zod.z.number().optional(),
7630
+ /**
7631
+ * Gate A (config-correctness gate at engine change): human-readable
7632
+ * config issues surfaced EAGERLY when the node's engine changes — model
7633
+ * substitutions ("chose X, running Y") and zero-build steps ("no model
7634
+ * has a <format> build"). Additive/optional: informational only, never
7635
+ * enforced here — `assertEngineReady` (readiness) still gates inference.
7636
+ * Absent/empty when the node-default tree resolves cleanly.
7637
+ */
7638
+ configIssues: zod.z.array(zod.z.string()).optional()
7383
7639
  });
7384
7640
  var PipelineStepInputSchema = zod.z.lazy(() => zod.z.object({
7385
7641
  addonId: zod.z.string(),
7386
- modelId: zod.z.string(),
7642
+ modelId: zod.z.string().optional(),
7387
7643
  enabled: zod.z.boolean().default(true),
7388
7644
  children: zod.z.array(PipelineStepInputSchema).optional(),
7389
7645
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
7390
7646
  }));
7647
+ var ModelSubstitutionSchema = zod.z.object({
7648
+ addonId: zod.z.string(),
7649
+ chosen: zod.z.string(),
7650
+ running: zod.z.string(),
7651
+ format: zod.z.string()
7652
+ });
7653
+ var PipelineValidationIssueSchema = zod.z.object({
7654
+ addonId: zod.z.string(),
7655
+ kind: zod.z.enum(["unknown-addon", "no-format-build"]),
7656
+ detail: zod.z.string()
7657
+ });
7658
+ var PipelineValidationResultSchema = zod.z.object({
7659
+ ok: zod.z.boolean(),
7660
+ issues: zod.z.array(PipelineValidationIssueSchema).readonly(),
7661
+ substitutions: zod.z.array(ModelSubstitutionSchema).readonly(),
7662
+ /** The node's `currentEngine.format` this validation ran against. */
7663
+ format: zod.z.string()
7664
+ });
7391
7665
  var ReferenceImageEntrySchema = zod.z.object({
7392
7666
  filename: zod.z.string(),
7393
7667
  stepIds: zod.z.array(zod.z.string()).readonly().optional()
@@ -7500,10 +7774,45 @@ var pipelineExecutorCapability = {
7500
7774
  kind: "mutation",
7501
7775
  auth: "admin"
7502
7776
  }),
7777
+ /**
7778
+ * Reset ONE node's detection-pipeline to its factory defaults, forcing
7779
+ * regeneration of the (now hardware-aware) default object-detection
7780
+ * model. `nodeId` is the ROUTING key — the generated cap-router strips
7781
+ * it (default `nodeIdMode: 'routing'`, same as `getSelectedEngine` /
7782
+ * `getDefaultSteps`) and dispatches to that node, so the provider method
7783
+ * runs ON the target node and receives no `nodeId`.
7784
+ *
7785
+ * Clears the node's persisted global pipeline seed (`pipelineSteps`) +
7786
+ * legacy engine blob (`pipelineEngine`) and every device's per-camera
7787
+ * step overrides, then re-seeds the hardware-aware default tree. Returns
7788
+ * the regenerated object-detection model id (null when the default tree
7789
+ * has no detector for this node's engine format) so the caller can
7790
+ * verify the reset without a second round-trip.
7791
+ */
7792
+ resetToDefault: require_sleep.method(zod.z.object({ nodeId: zod.z.string() }), zod.z.object({
7793
+ success: zod.z.literal(true),
7794
+ regeneratedModelId: zod.z.string().nullable()
7795
+ }), {
7796
+ kind: "mutation",
7797
+ auth: "admin"
7798
+ }),
7503
7799
  getSchema: require_sleep.method(zod.z.void(), PipelineSchemaSchema),
7504
7800
  getGlobalSteps: require_sleep.method(zod.z.void(), zod.z.array(PipelineDefaultStepSchema).readonly().nullable()),
7505
7801
  getGlobalPipelineConfig: require_sleep.method(zod.z.void(), PipelineConfigBridge),
7506
7802
  getOrchestratorConfigSchema: require_sleep.method(zod.z.void(), ConfigUISchemaBridge),
7803
+ /**
7804
+ * Gate B (pre-init config-correctness gate). PURE COMPUTE against this
7805
+ * node's `currentEngine.format` — resolves `steps` the same way the
7806
+ * runtime dispatch path would, and reports what WOULD happen without
7807
+ * touching any node-global state. Called by the orchestrator at attach
7808
+ * time (`attachOn`), node-pinned to the TARGET node, so config problems
7809
+ * surface BEFORE `pipelineRunner.attachCamera` rather than at the first
7810
+ * per-frame resolve. `ok` is false iff `issues` is non-empty (both
7811
+ * `unknown-addon` and `no-format-build` are HARD issues); `substitutions`
7812
+ * is informational (a degraded-but-loadable model swap) and never
7813
+ * affects `ok`. Never throws.
7814
+ */
7815
+ validatePipeline: require_sleep.method(zod.z.object({ steps: zod.z.array(PipelineStepInputSchema) }), PipelineValidationResultSchema),
7507
7816
  listTemplates: require_sleep.method(zod.z.void(), zod.z.array(PipelineTemplateSchema$1).readonly()),
7508
7817
  saveTemplate: require_sleep.method(zod.z.object({
7509
7818
  name: zod.z.string(),
@@ -7890,6 +8199,13 @@ var RunnerFrameSourceSchema = zod.z.discriminatedUnion("kind", [zod.z.object({ k
7890
8199
  kind: zod.z.literal("remote-restream"),
7891
8200
  /** The camera's source-owner node (slice 1: always the hub). */
7892
8201
  ownerNodeId: zod.z.string(),
8202
+ /**
8203
+ * The owner's LAN-reachable host, resolved by the orchestrator from the
8204
+ * per-node `reachableHost` override (Cluster UI). When present the runner
8205
+ * dials THIS host for the owner's restream, in preference to the
8206
+ * `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
8207
+ */
8208
+ ownerReachableHost: zod.z.string().optional(),
7893
8209
  /** Operator override for the owner host the runner dials. */
7894
8210
  hubHostnameOverride: zod.z.string().optional()
7895
8211
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
@@ -7898,13 +8214,11 @@ var RunnerFrameSourceSchema = zod.z.discriminatedUnion("kind", [zod.z.object({ k
7898
8214
  * specific runner instance via `attachCamera`. Carries everything the
7899
8215
  * runner needs to subscribe to the local broker and execute inference.
7900
8216
  *
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.
8217
+ * Stateless-pipeline model: the pipeline content (`steps`, optional
8218
+ * `audio`) travels with the attach payload. The runner keeps it in RAM
8219
+ * for the lifetime of the attach — on rebalance, edit, or restart the
8220
+ * orchestrator re-sends the latest snapshot. Engine is NOT carried: it is
8221
+ * node-local, resolved by the executing runner at dispatch time.
7908
8222
  */
7909
8223
  var RunnerCameraConfigSchema = zod.z.object({
7910
8224
  deviceId: zod.z.number(),
@@ -7955,14 +8269,11 @@ var RunnerCameraConfigSchema = zod.z.object({
7955
8269
  */
7956
8270
  motionSources: MotionSourcesSchema.default(["analyzer"]),
7957
8271
  pipelineEnabled: zod.z.boolean().default(true),
7958
- /** Engine choice for video steps (runtime+backend+format). */
7959
- engine: PipelineEngineChoiceSchema.optional(),
7960
8272
  /** Ordered tree of video steps. Absent → runner skips video detection. */
7961
8273
  steps: zod.z.array(PipelineStepInputSchema).readonly().optional(),
7962
8274
  /** Audio classification branch. `enabled:false` disables, null skips. */
7963
8275
  audio: zod.z.object({
7964
- engine: PipelineEngineChoiceSchema,
7965
- modelId: zod.z.string(),
8276
+ modelId: zod.z.string().optional(),
7966
8277
  enabled: zod.z.boolean()
7967
8278
  }).nullable().optional(),
7968
8279
  /**
@@ -12254,10 +12565,12 @@ function createSystemProxy(api) {
12254
12565
  getEngineProvisioning: (input) => dispatch("pipelineExecutor", "getEngineProvisioning", "query", input),
12255
12566
  getVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "getVideoPipelineSteps", "query", input),
12256
12567
  setVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "setVideoPipelineSteps", "mutation", input),
12568
+ resetToDefault: (input) => dispatch("pipelineExecutor", "resetToDefault", "mutation", input),
12257
12569
  getSchema: (input) => dispatch("pipelineExecutor", "getSchema", "query", input),
12258
12570
  getGlobalSteps: (input) => dispatch("pipelineExecutor", "getGlobalSteps", "query", input),
12259
12571
  getGlobalPipelineConfig: (input) => dispatch("pipelineExecutor", "getGlobalPipelineConfig", "query", input),
12260
12572
  getOrchestratorConfigSchema: (input) => dispatch("pipelineExecutor", "getOrchestratorConfigSchema", "query", input),
12573
+ validatePipeline: (input) => dispatch("pipelineExecutor", "validatePipeline", "query", input),
12261
12574
  listTemplates: (input) => dispatch("pipelineExecutor", "listTemplates", "query", input),
12262
12575
  saveTemplate: (input) => dispatch("pipelineExecutor", "saveTemplate", "mutation", input),
12263
12576
  updateTemplate: (input) => dispatch("pipelineExecutor", "updateTemplate", "mutation", input),
@@ -12289,6 +12602,7 @@ function createSystemProxy(api) {
12289
12602
  getGlobalMetrics: (input) => dispatch("pipelineOrchestrator", "getGlobalMetrics", "query", input),
12290
12603
  getCapabilityBindings: (input) => dispatch("pipelineOrchestrator", "getCapabilityBindings", "query", input),
12291
12604
  setCapabilityBinding: (input) => dispatch("pipelineOrchestrator", "setCapabilityBinding", "mutation", input),
12605
+ getIngestOwner: (input) => dispatch("pipelineOrchestrator", "getIngestOwner", "query", input),
12292
12606
  getDecoderAssignments: (input) => dispatch("pipelineOrchestrator", "getDecoderAssignments", "query", input),
12293
12607
  getAudioNodeLoad: (input) => dispatch("pipelineOrchestrator", "getAudioNodeLoad", "query", input),
12294
12608
  getAgentSettings: (input) => dispatch("pipelineOrchestrator", "getAgentSettings", "query", input),
@@ -12298,6 +12612,7 @@ function createSystemProxy(api) {
12298
12612
  setAgentMaxCameras: (input) => dispatch("pipelineOrchestrator", "setAgentMaxCameras", "mutation", input),
12299
12613
  setAgentDetectWeight: (input) => dispatch("pipelineOrchestrator", "setAgentDetectWeight", "mutation", input),
12300
12614
  setAgentCapabilities: (input) => dispatch("pipelineOrchestrator", "setAgentCapabilities", "mutation", input),
12615
+ setAgentReachableHost: (input) => dispatch("pipelineOrchestrator", "setAgentReachableHost", "mutation", input),
12301
12616
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
12302
12617
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
12303
12618
  saveTemplate: (input) => dispatch("pipelineOrchestrator", "saveTemplate", "mutation", input),
@@ -14410,6 +14725,65 @@ var cameraPipelineConfigCapability = {
14410
14725
  methods: {}
14411
14726
  };
14412
14727
  //#endregion
14728
+ //#region src/capabilities/cap-router-predicates.ts
14729
+ /**
14730
+ * Shared cap-router predicates — the SINGLE source for the structural Zod-shape
14731
+ * checks + naming used by BOTH the runtime cap-router builder
14732
+ * (`@camstack/system` `cap-router-builder.ts` + the server's
14733
+ * `cap-router-runtime.ts`) AND the codegen scripts (`scripts/generate-cap-*.ts`).
14734
+ *
14735
+ * These used to be independently reimplemented on each side, held in sync only
14736
+ * by "must stay byte-identical" comments — a live drift risk. Consolidating them
14737
+ * here (next to `resolveCapMount` / `expandCapMethods`, the other shared model)
14738
+ * makes the two paths provably agree. Each predicate accepts both Zod 4
14739
+ * (`_def.type`) and legacy Zod 3 (`_def.typeName` / `constructor.name`) shapes.
14740
+ */
14741
+ /** `z.void()` — input carries no data. */
14742
+ function isVoidInput(schema) {
14743
+ const def = schema._def;
14744
+ return schema.constructor?.name === "ZodVoid" || def?.type === "void" || def?.typeName === "ZodVoid";
14745
+ }
14746
+ /** `z.object()` — supports `.loose()` for out-of-band `nodeId`/`addonId` keys. */
14747
+ function isObjectInput(schema) {
14748
+ const def = schema._def;
14749
+ return schema.constructor?.name === "ZodObject" || def?.type === "object" || def?.typeName === "ZodObject";
14750
+ }
14751
+ /**
14752
+ * Structural "is this Zod schema an array output" check — bottoms out at
14753
+ * `ZodArray` through the canonical Zod 4 wrappers (readonly/optional/nullable/
14754
+ * default). Bounded unwrap guards against a malformed/cyclic schema.
14755
+ */
14756
+ function isArrayOutputSchema(schema) {
14757
+ let cur = schema;
14758
+ for (let depth = 0; depth < 8 && cur != null; depth += 1) {
14759
+ const def = cur._def;
14760
+ const ctor = cur.constructor?.name;
14761
+ if (ctor === "ZodArray" || def?.type === "array") return true;
14762
+ 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;
14763
+ cur = def.innerType;
14764
+ }
14765
+ return false;
14766
+ }
14767
+ /**
14768
+ * Apply `.loose()` to an object input schema when available (Zod 4) so the
14769
+ * router accepts the out-of-band `nodeId`/`addonId` selector keys without
14770
+ * stripping them. Falls back to the schema unchanged when `.loose()` is absent.
14771
+ */
14772
+ function looseSchema(schema) {
14773
+ const loose = schema.loose;
14774
+ return typeof loose === "function" ? loose.call(schema) : schema;
14775
+ }
14776
+ /** Auth level → base-procedure key. `superAdmin` collapses to `admin`. */
14777
+ function procedureAuthKey(auth) {
14778
+ if (auth === "public") return "public";
14779
+ if (auth === "admin" || auth === "superAdmin") return "admin";
14780
+ return "protected";
14781
+ }
14782
+ /** kebab-case cap name → camelCase router-map key. */
14783
+ function kebabToCamel(s) {
14784
+ return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
14785
+ }
14786
+ //#endregion
14413
14787
  //#region src/capabilities/custom-actions.ts
14414
14788
  /**
14415
14789
  * Identity — preserves literal types for downstream inference.
@@ -17198,11 +17572,11 @@ var pipelineAnalyticsCapability = {
17198
17572
  //#endregion
17199
17573
  //#region src/capabilities/pipeline-orchestrator.cap.ts
17200
17574
  var CameraPipelineConfigSchema = zod.z.object({
17201
- engine: PipelineEngineChoiceSchema,
17575
+ engine: PipelineEngineChoiceSchema.optional(),
17202
17576
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
17203
17577
  audio: zod.z.object({
17204
- engine: PipelineEngineChoiceSchema,
17205
- modelId: zod.z.string(),
17578
+ engine: PipelineEngineChoiceSchema.optional(),
17579
+ modelId: zod.z.string().optional(),
17206
17580
  enabled: zod.z.boolean(),
17207
17581
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).readonly().optional()
17208
17582
  }).nullable().optional()
@@ -17217,7 +17591,7 @@ var PipelineTemplateSchema = zod.z.object({
17217
17591
  });
17218
17592
  var AgentAddonConfigSchema = zod.z.object({
17219
17593
  enabled: zod.z.boolean(),
17220
- modelId: zod.z.string(),
17594
+ modelId: zod.z.string().optional(),
17221
17595
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).readonly()
17222
17596
  });
17223
17597
  var AgentPipelineSettingsSchema = zod.z.object({
@@ -17232,7 +17606,15 @@ var AgentPipelineSettingsSchema = zod.z.object({
17232
17606
  /** Node is eligible to run audio-analyzer sessions. */
17233
17607
  audio: zod.z.boolean().optional(),
17234
17608
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
17235
- ingest: zod.z.boolean().optional()
17609
+ ingest: zod.z.boolean().optional(),
17610
+ /**
17611
+ * Operator override for the LAN host a cross-node decoder dials to reach
17612
+ * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
17613
+ * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
17614
+ * it already uses to reach the hub). Set this only when the auto-detected
17615
+ * address is wrong (multi-homed host, NAT, custom interface).
17616
+ */
17617
+ reachableHost: zod.z.string().optional()
17236
17618
  });
17237
17619
  var CameraPipelineForAgentSchema = zod.z.object({
17238
17620
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
@@ -17338,6 +17720,15 @@ var GlobalMetricsSchema = zod.z.object({
17338
17720
  * capability providers.
17339
17721
  */
17340
17722
  var CapabilityBindingsSchema = zod.z.record(zod.z.string(), zod.z.string());
17723
+ /**
17724
+ * The cluster's single camera-source owner (`clusterRoles.ingestNode`) plus
17725
+ * its LAN-reachable host, if one is registered. See `getIngestOwner`.
17726
+ */
17727
+ var IngestOwnerSchema = zod.z.object({
17728
+ ownerNodeId: zod.z.string(),
17729
+ reachableHost: zod.z.string().optional(),
17730
+ configIssue: zod.z.string().optional()
17731
+ });
17341
17732
  /** Stream entry surfaced from the stream-catalog for one device. */
17342
17733
  var CameraSourceStreamSchema = zod.z.object({
17343
17734
  camStreamId: zod.z.string(),
@@ -17354,6 +17745,14 @@ var CameraAssignmentStatusSchema = zod.z.object({
17354
17745
  detectionNodeId: zod.z.string().nullable(),
17355
17746
  decoderNodeId: zod.z.string().nullable(),
17356
17747
  audioNodeId: zod.z.string().nullable(),
17748
+ /**
17749
+ * The node that OWNS this camera's physical source pull (dials the RTSP and
17750
+ * hosts the broker/restream) — the cluster ingest owner today
17751
+ * (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
17752
+ * the UI show WHERE a camera is sourced without SSH/logs, and is the node the
17753
+ * broker block below was read from (pinned). Nullable only pre-wiring.
17754
+ */
17755
+ sourceNodeId: zod.z.string().nullable(),
17357
17756
  pinned: zod.z.object({
17358
17757
  detection: zod.z.boolean(),
17359
17758
  decoder: zod.z.boolean(),
@@ -17560,6 +17959,14 @@ var pipelineOrchestratorCapability = {
17560
17959
  kind: "mutation",
17561
17960
  auth: "admin"
17562
17961
  }),
17962
+ /**
17963
+ * The cluster's single camera-source owner — resolved UNCONDITIONALLY
17964
+ * from `clusterRoles.ingestNode` (NOT the detection-decode
17965
+ * `remoteSourcingNodes` knob). Consumers (recorder/snapshot/audio) pin
17966
+ * their broker calls to `ownerNodeId` and dial `reachableHost` when
17967
+ * present. Defaults to `{ ownerNodeId: 'hub' }`.
17968
+ */
17969
+ getIngestOwner: require_sleep.method(zod.z.void(), IngestOwnerSchema),
17563
17970
  /** Pin a device's decoder to a specific node. */
17564
17971
  assignDecoder: require_sleep.method(zod.z.object({
17565
17972
  deviceId: zod.z.number(),
@@ -17706,6 +18113,22 @@ var pipelineOrchestratorCapability = {
17706
18113
  kind: "mutation",
17707
18114
  auth: "admin"
17708
18115
  }),
18116
+ /**
18117
+ * Set (or clear) the operator override for the LAN host a cross-node
18118
+ * decoder dials to reach this node's restream. Pass a non-empty string to
18119
+ * override the auto-detected address (the runner's `CAMSTACK_HUB_URL`
18120
+ * default); pass `null` or an empty string to clear it and revert to
18121
+ * auto-detect. Applied on the next dispatch cycle — takes effect for new
18122
+ * cross-node attaches; existing attaches keep their current host until
18123
+ * re-dispatched.
18124
+ */
18125
+ setAgentReachableHost: require_sleep.method(zod.z.object({
18126
+ agentNodeId: zod.z.string(),
18127
+ reachableHost: zod.z.string().nullable()
18128
+ }), zod.z.object({ success: zod.z.literal(true) }), {
18129
+ kind: "mutation",
18130
+ auth: "admin"
18131
+ }),
17709
18132
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
17710
18133
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
17711
18134
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -17798,36 +18221,6 @@ var pipelineOrchestratorCapability = {
17798
18221
  }
17799
18222
  };
17800
18223
  //#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
18224
  //#region src/capabilities/settings-store.cap.ts
17832
18225
  /**
17833
18226
  * Query filter for settings-store collections.
@@ -18055,9 +18448,9 @@ var smtpProviderCapability = {
18055
18448
  /**
18056
18449
  * A single device snapshot returned as base64 JPEG/PNG.
18057
18450
  *
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.
18451
+ * The `SnapshotAddon` wrapper returns this shape whether the frame came from
18452
+ * the device-native provider (onboard capture) or from the stream-broker
18453
+ * prebuffer fallback.
18061
18454
  */
18062
18455
  var SnapshotImageSchema = zod.z.object({
18063
18456
  base64: zod.z.string(),
@@ -18133,38 +18526,6 @@ var snapshotCapability = {
18133
18526
  }
18134
18527
  };
18135
18528
  //#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
18529
  //#region src/capabilities/sso-bridge.cap.ts
18169
18530
  /**
18170
18531
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
@@ -18699,11 +19060,12 @@ var videoclipsCapability = {
18699
19060
  }
18700
19061
  };
18701
19062
  //#endregion
18702
- //#region src/capabilities/webrtc.cap.ts
19063
+ //#region src/capabilities/webrtc-session.cap.ts
18703
19064
  /**
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.
19065
+ * Optional client-side hints sent at session creation to help the provider
19066
+ * pick the best native source. All fields optional — a viewer that knows
19067
+ * nothing still gets a sane default. (Relocated from the retired `webrtc`
19068
+ * collection cap; this `webrtc-session` cap is the live signaling surface.)
18707
19069
  */
18708
19070
  var webrtcClientHintsSchema = zod.z.object({
18709
19071
  viewportWidth: zod.z.number().int().positive().optional(),
@@ -18714,51 +19076,6 @@ var webrtcClientHintsSchema = zod.z.object({
18714
19076
  /** Hard tier override; takes precedence over scoring when registered. */
18715
19077
  prefersTier: zod.z.string().optional()
18716
19078
  }).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
19079
  /**
18763
19080
  * Discriminated target for a WebRTC session. The client sends this
18764
19081
  * structured object instead of building / parsing brokerId strings;
@@ -19031,7 +19348,7 @@ var webrtcSessionCapability = {
19031
19348
  }).nullable() }))
19032
19349
  },
19033
19350
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
19034
- mount: { kind: "custom" }
19351
+ mount: { kind: "server-provided" }
19035
19352
  };
19036
19353
  //#endregion
19037
19354
  //#region src/capabilities/accessories.cap.ts
@@ -19710,7 +20027,7 @@ var addonsCapability = {
19710
20027
  }), LogStreamEntrySchema, { kind: "subscription" })
19711
20028
  },
19712
20029
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
19713
- mount: { kind: "service-backed" }
20030
+ mount: { kind: "server-provided" }
19714
20031
  };
19715
20032
  //#endregion
19716
20033
  //#region src/capabilities/button.cap.ts
@@ -20126,7 +20443,7 @@ var integrationsCapability = {
20126
20443
  })
20127
20444
  },
20128
20445
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
20129
- mount: { kind: "service-backed" }
20446
+ mount: { kind: "server-provided" }
20130
20447
  };
20131
20448
  //#endregion
20132
20449
  //#region src/capabilities/intercom.cap.ts
@@ -20773,7 +21090,7 @@ var networkQualityCapability = {
20773
21090
  }), zod.z.void(), { kind: "mutation" })
20774
21091
  },
20775
21092
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
20776
- mount: { kind: "service-backed" }
21093
+ mount: { kind: "server-provided" }
20777
21094
  };
20778
21095
  //#endregion
20779
21096
  //#region src/capabilities/nodes.cap.ts
@@ -20965,7 +21282,7 @@ var nodesCapability = {
20965
21282
  })
20966
21283
  },
20967
21284
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
20968
- mount: { kind: "service-backed" }
21285
+ mount: { kind: "server-provided" }
20969
21286
  };
20970
21287
  //#endregion
20971
21288
  //#region src/capabilities/osd.cap.ts
@@ -21959,7 +22276,7 @@ var systemCapability = {
21959
22276
  })
21960
22277
  },
21961
22278
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
21962
- mount: { kind: "service-backed" }
22279
+ mount: { kind: "server-provided" }
21963
22280
  };
21964
22281
  //#endregion
21965
22282
  //#region src/capabilities/toast.cap.ts
@@ -21999,7 +22316,7 @@ var toastCapability = {
21999
22316
  mode: "singleton",
22000
22317
  methods: { onToast: require_sleep.method(zod.z.void(), ToastSchema, { kind: "subscription" }) },
22001
22318
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
22002
- mount: { kind: "service-backed" }
22319
+ mount: { kind: "server-provided" }
22003
22320
  };
22004
22321
  //#endregion
22005
22322
  //#region src/capabilities/user-management.cap.ts
@@ -22379,13 +22696,11 @@ var CAPABILITY_NAMES = {
22379
22696
  ptzAutotrack: "ptz-autotrack",
22380
22697
  reboot: "reboot",
22381
22698
  recording: "recording",
22382
- restreamer: "restreamer",
22383
22699
  scriptRunner: "script-runner",
22384
22700
  settingsStore: "settings-store",
22385
22701
  smoke: "smoke",
22386
22702
  smtpProvider: "smtp-provider",
22387
22703
  snapshot: "snapshot",
22388
- snapshotProvider: "snapshot-provider",
22389
22704
  ssoBridge: "sso-bridge",
22390
22705
  storage: "storage",
22391
22706
  storageEvictable: "storage-evictable",
@@ -22393,7 +22708,6 @@ var CAPABILITY_NAMES = {
22393
22708
  streamBroker: "stream-broker",
22394
22709
  streamCatalog: "stream-catalog",
22395
22710
  streamParams: "stream-params",
22396
- streamingEngine: "streaming-engine",
22397
22711
  switch: "switch",
22398
22712
  system: "system",
22399
22713
  tamper: "tamper",
@@ -22409,7 +22723,6 @@ var CAPABILITY_NAMES = {
22409
22723
  videoclips: "videoclips",
22410
22724
  waterHeater: "water-heater",
22411
22725
  weather: "weather",
22412
- webrtc: "webrtc",
22413
22726
  webrtcSession: "webrtc-session",
22414
22727
  zoneAnalytics: "zone-analytics",
22415
22728
  zoneRules: "zone-rules",
@@ -22833,10 +23146,6 @@ var CAPABILITY_ROUTER_KEYS = [
22833
23146
  key: "recording",
22834
23147
  name: "recording"
22835
23148
  },
22836
- {
22837
- key: "restreamer",
22838
- name: "restreamer"
22839
- },
22840
23149
  {
22841
23150
  key: "scriptRunner",
22842
23151
  name: "script-runner"
@@ -22857,10 +23166,6 @@ var CAPABILITY_ROUTER_KEYS = [
22857
23166
  key: "snapshot",
22858
23167
  name: "snapshot"
22859
23168
  },
22860
- {
22861
- key: "snapshotProvider",
22862
- name: "snapshot-provider"
22863
- },
22864
23169
  {
22865
23170
  key: "ssoBridge",
22866
23171
  name: "sso-bridge"
@@ -22889,10 +23194,6 @@ var CAPABILITY_ROUTER_KEYS = [
22889
23194
  key: "streamParams",
22890
23195
  name: "stream-params"
22891
23196
  },
22892
- {
22893
- key: "streamingEngine",
22894
- name: "streaming-engine"
22895
- },
22896
23197
  {
22897
23198
  key: "switch",
22898
23199
  name: "switch"
@@ -22953,10 +23254,6 @@ var CAPABILITY_ROUTER_KEYS = [
22953
23254
  key: "weather",
22954
23255
  name: "weather"
22955
23256
  },
22956
- {
22957
- key: "webrtc",
22958
- name: "webrtc"
22959
- },
22960
23257
  {
22961
23258
  key: "webrtcSession",
22962
23259
  name: "webrtc-session"
@@ -23088,13 +23385,11 @@ var ALL_CAPABILITY_DEFINITIONS = [
23088
23385
  ptzAutotrackCapability,
23089
23386
  rebootCapability,
23090
23387
  recordingCapability,
23091
- restreamerCapability,
23092
23388
  scriptRunnerCapability,
23093
23389
  settingsStoreCapability,
23094
23390
  smokeCapability,
23095
23391
  smtpProviderCapability,
23096
23392
  snapshotCapability,
23097
- snapshotProviderCapability,
23098
23393
  ssoBridgeCapability,
23099
23394
  storageCapability,
23100
23395
  storageEvictableCapability,
@@ -23102,7 +23397,6 @@ var ALL_CAPABILITY_DEFINITIONS = [
23102
23397
  streamBrokerCapability,
23103
23398
  streamCatalogCapability,
23104
23399
  streamParamsCapability,
23105
- streamingEngineCapability,
23106
23400
  switchCapability,
23107
23401
  systemCapability,
23108
23402
  tamperCapability,
@@ -23118,7 +23412,6 @@ var ALL_CAPABILITY_DEFINITIONS = [
23118
23412
  videoclipsCapability,
23119
23413
  waterHeaterCapability,
23120
23414
  weatherCapability,
23121
- webrtcCapability,
23122
23415
  webrtcSessionCapability,
23123
23416
  zoneAnalyticsCapability,
23124
23417
  zoneRulesCapability,
@@ -25969,6 +26262,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
25969
26262
  addonId: null,
25970
26263
  access: "create"
25971
26264
  },
26265
+ "pipelineExecutor.resetToDefault": {
26266
+ capName: "pipeline-executor",
26267
+ capScope: "system",
26268
+ addonId: null,
26269
+ access: "delete"
26270
+ },
25972
26271
  "pipelineExecutor.runAudioTest": {
25973
26272
  capName: "pipeline-executor",
25974
26273
  capScope: "system",
@@ -26017,6 +26316,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26017
26316
  addonId: null,
26018
26317
  access: "create"
26019
26318
  },
26319
+ "pipelineExecutor.validatePipeline": {
26320
+ capName: "pipeline-executor",
26321
+ capScope: "system",
26322
+ addonId: null,
26323
+ access: "view"
26324
+ },
26020
26325
  "pipelineOrchestrator.assignAudio": {
26021
26326
  capName: "pipeline-orchestrator",
26022
26327
  capScope: "system",
@@ -26125,6 +26430,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26125
26430
  addonId: null,
26126
26431
  access: "view"
26127
26432
  },
26433
+ "pipelineOrchestrator.getIngestOwner": {
26434
+ capName: "pipeline-orchestrator",
26435
+ capScope: "system",
26436
+ addonId: null,
26437
+ access: "view"
26438
+ },
26128
26439
  "pipelineOrchestrator.getPipelineAssignment": {
26129
26440
  capName: "pipeline-orchestrator",
26130
26441
  capScope: "system",
@@ -26197,6 +26508,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26197
26508
  addonId: null,
26198
26509
  access: "create"
26199
26510
  },
26511
+ "pipelineOrchestrator.setAgentReachableHost": {
26512
+ capName: "pipeline-orchestrator",
26513
+ capScope: "system",
26514
+ addonId: null,
26515
+ access: "create"
26516
+ },
26200
26517
  "pipelineOrchestrator.setCameraPipelineForAgent": {
26201
26518
  capName: "pipeline-orchestrator",
26202
26519
  capScope: "system",
@@ -26527,24 +26844,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
26527
26844
  addonId: null,
26528
26845
  access: "create"
26529
26846
  },
26530
- "restreamer.getExposedResources": {
26531
- capName: "restreamer",
26532
- capScope: "system",
26533
- addonId: null,
26534
- access: "view"
26535
- },
26536
- "restreamer.registerDevice": {
26537
- capName: "restreamer",
26538
- capScope: "system",
26539
- addonId: null,
26540
- access: "create"
26541
- },
26542
- "restreamer.unregisterDevice": {
26543
- capName: "restreamer",
26544
- capScope: "system",
26545
- addonId: null,
26546
- access: "delete"
26547
- },
26548
26847
  "scriptRunner.run": {
26549
26848
  capName: "script-runner",
26550
26849
  capScope: "device",
@@ -26647,18 +26946,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
26647
26946
  addonId: null,
26648
26947
  access: "create"
26649
26948
  },
26650
- "snapshotProvider.getSnapshot": {
26651
- capName: "snapshot-provider",
26652
- capScope: "system",
26653
- addonId: null,
26654
- access: "view"
26655
- },
26656
- "snapshotProvider.supportsDevice": {
26657
- capName: "snapshot-provider",
26658
- capScope: "system",
26659
- addonId: null,
26660
- access: "view"
26661
- },
26662
26949
  "ssoBridge.signBridgeToken": {
26663
26950
  capName: "sso-bridge",
26664
26951
  capScope: "system",
@@ -27085,30 +27372,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
27085
27372
  addonId: null,
27086
27373
  access: "view"
27087
27374
  },
27088
- "streamingEngine.getStreamUrl": {
27089
- capName: "streaming-engine",
27090
- capScope: "system",
27091
- addonId: null,
27092
- access: "view"
27093
- },
27094
- "streamingEngine.listStreams": {
27095
- capName: "streaming-engine",
27096
- capScope: "system",
27097
- addonId: null,
27098
- access: "view"
27099
- },
27100
- "streamingEngine.registerStream": {
27101
- capName: "streaming-engine",
27102
- capScope: "system",
27103
- addonId: null,
27104
- access: "create"
27105
- },
27106
- "streamingEngine.unregisterStream": {
27107
- capName: "streaming-engine",
27108
- capScope: "system",
27109
- addonId: null,
27110
- access: "delete"
27111
- },
27112
27375
  "streamParams.getConfigSchema": {
27113
27376
  capName: "stream-params",
27114
27377
  capScope: "device",
@@ -27475,54 +27738,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
27475
27738
  addonId: null,
27476
27739
  access: "create"
27477
27740
  },
27478
- "webrtc.closeSession": {
27479
- capName: "webrtc",
27480
- capScope: "system",
27481
- addonId: null,
27482
- access: "create"
27483
- },
27484
- "webrtc.createSession": {
27485
- capName: "webrtc",
27486
- capScope: "system",
27487
- addonId: null,
27488
- access: "create"
27489
- },
27490
- "webrtc.handleAnswer": {
27491
- capName: "webrtc",
27492
- capScope: "system",
27493
- addonId: null,
27494
- access: "create"
27495
- },
27496
- "webrtc.handleOffer": {
27497
- capName: "webrtc",
27498
- capScope: "system",
27499
- addonId: null,
27500
- access: "create"
27501
- },
27502
- "webrtc.hasAdaptiveBitrate": {
27503
- capName: "webrtc",
27504
- capScope: "system",
27505
- addonId: null,
27506
- access: "view"
27507
- },
27508
- "webrtc.registerStream": {
27509
- capName: "webrtc",
27510
- capScope: "system",
27511
- addonId: null,
27512
- access: "create"
27513
- },
27514
- "webrtc.supportsStream": {
27515
- capName: "webrtc",
27516
- capScope: "system",
27517
- addonId: null,
27518
- access: "view"
27519
- },
27520
- "webrtc.unregisterStream": {
27521
- capName: "webrtc",
27522
- capScope: "system",
27523
- addonId: null,
27524
- access: "delete"
27525
- },
27526
27741
  "webrtcSession.addIceCandidate": {
27527
27742
  capName: "webrtc-session",
27528
27743
  capScope: "device",
@@ -27723,12 +27938,10 @@ var KNOWN_CAP_NAMES = [
27723
27938
  "ptz-autotrack",
27724
27939
  "reboot",
27725
27940
  "recording",
27726
- "restreamer",
27727
27941
  "script-runner",
27728
27942
  "settings-store",
27729
27943
  "smtp-provider",
27730
27944
  "snapshot",
27731
- "snapshot-provider",
27732
27945
  "sso-bridge",
27733
27946
  "storage",
27734
27947
  "storage-evictable",
@@ -27736,7 +27949,6 @@ var KNOWN_CAP_NAMES = [
27736
27949
  "stream-broker",
27737
27950
  "stream-catalog",
27738
27951
  "stream-params",
27739
- "streaming-engine",
27740
27952
  "switch",
27741
27953
  "system",
27742
27954
  "toast",
@@ -27748,7 +27960,6 @@ var KNOWN_CAP_NAMES = [
27748
27960
  "valve",
27749
27961
  "videoclips",
27750
27962
  "water-heater",
27751
- "webrtc",
27752
27963
  "webrtc-session",
27753
27964
  "zone-analytics",
27754
27965
  "zone-rules",
@@ -27856,22 +28067,18 @@ var SYSTEM_CAP_NAMES = [
27856
28067
  "plate-gallery",
27857
28068
  "platform-probe",
27858
28069
  "recording",
27859
- "restreamer",
27860
28070
  "settings-store",
27861
28071
  "smtp-provider",
27862
- "snapshot-provider",
27863
28072
  "sso-bridge",
27864
28073
  "storage",
27865
28074
  "storage-evictable",
27866
28075
  "storage-provider",
27867
28076
  "stream-broker",
27868
- "streaming-engine",
27869
28077
  "system",
27870
28078
  "toast",
27871
28079
  "turn-provider",
27872
28080
  "user-management",
27873
- "user-passkeys",
27874
- "webrtc"
28081
+ "user-passkeys"
27875
28082
  ];
27876
28083
  //#endregion
27877
28084
  //#region src/generated/scope-presets.ts
@@ -28653,7 +28860,6 @@ exports.EventSourceType = EventSourceType;
28653
28860
  exports.ExportSetupFieldSchema = ExportSetupFieldSchema;
28654
28861
  exports.ExportSetupSchema = ExportSetupSchema;
28655
28862
  exports.ExposedDeviceSchema = ExposedDeviceSchema;
28656
- exports.ExposedResourceSchema = ExposedResourceSchema;
28657
28863
  exports.ExposureModeSchema = ExposureModeSchema;
28658
28864
  exports.ExpressionEvalError = ExpressionEvalError;
28659
28865
  exports.ExpressionParseError = ExpressionParseError;
@@ -28682,6 +28888,7 @@ exports.ImageSettingsOptionsSchema = ImageSettingsOptionsSchema;
28682
28888
  exports.ImageSettingsPatchSchema = ImageSettingsPatchSchema;
28683
28889
  exports.ImageSettingsStatusSchema = ImageSettingsStatusSchema;
28684
28890
  exports.ImageStatusSchema = ImageStatusSchema;
28891
+ exports.IngestOwnerSchema = IngestOwnerSchema;
28685
28892
  exports.InstalledPackageSchema = InstalledPackageSchema;
28686
28893
  exports.IntegrationLiteSchema = IntegrationLiteSchema;
28687
28894
  exports.IntegrationWithStateSchema = IntegrationWithStateSchema;
@@ -28730,6 +28937,8 @@ exports.ModelDistributeResultSchema = ModelDistributeResultSchema;
28730
28937
  exports.ModelExtraFileSchema = ModelExtraFileSchema;
28731
28938
  exports.ModelFormatEntrySchema = ModelFormatEntrySchema;
28732
28939
  exports.ModelFormatsSchema = ModelFormatsSchema;
28940
+ exports.ModelSubstitutionSchema = ModelSubstitutionSchema;
28941
+ exports.ModelVariantGroupSchema = ModelVariantGroupSchema;
28733
28942
  exports.MotionAnalysisResultSchema = MotionAnalysisResultSchema;
28734
28943
  exports.MotionEventSchema = MotionEventSchema;
28735
28944
  exports.MotionOnMotionChangedDataSchema = MotionOnMotionChangedDataSchema;
@@ -28786,6 +28995,8 @@ exports.PipelineDefaultStepSchema = PipelineDefaultStepSchema;
28786
28995
  exports.PipelineEngineChoiceSchema = PipelineEngineChoiceSchema;
28787
28996
  exports.PipelineRunResultBridge = PipelineRunResultBridge;
28788
28997
  exports.PipelineStepInputSchema = PipelineStepInputSchema;
28998
+ exports.PipelineValidationIssueSchema = PipelineValidationIssueSchema;
28999
+ exports.PipelineValidationResultSchema = PipelineValidationResultSchema;
28789
29000
  exports.PlaceholderReasonSchema = PlaceholderReasonSchema;
28790
29001
  exports.PolygonPointSchema = PolygonPointSchema;
28791
29002
  exports.PowerMeterStatusSchema = PowerMeterStatusSchema;
@@ -28809,6 +29020,9 @@ exports.PtzPositionSchema = PtzPositionSchema;
28809
29020
  exports.PtzPresetSchema = PtzPresetSchema;
28810
29021
  exports.PtzStatusSchema = PtzStatusSchema;
28811
29022
  exports.QueryFilterSchema = QueryFilterSchema;
29023
+ exports.REACHABILITY_FAILURES_TO_OFFLINE = REACHABILITY_FAILURES_TO_OFFLINE;
29024
+ exports.REACHABILITY_POLL_INTERVAL_MS = REACHABILITY_POLL_INTERVAL_MS;
29025
+ exports.REACHABILITY_PROBE_TIMEOUT_MS = REACHABILITY_PROBE_TIMEOUT_MS;
28812
29026
  exports.RECOGNITION_TYPES = RECOGNITION_TYPES;
28813
29027
  exports.RESERVED_BINDING_NAMES = RESERVED_BINDING_NAMES;
28814
29028
  exports.RUNTIME_DEFAULTS = RUNTIME_DEFAULTS;
@@ -28836,7 +29050,6 @@ exports.RecordingStorageModeSchema = RecordingStorageModeSchema;
28836
29050
  exports.RecordingStorageUsageSchema = RecordingStorageUsageSchema;
28837
29051
  exports.RecordingTriggersSchema = RecordingTriggersSchema;
28838
29052
  exports.RecordingWeekdaySchema = RecordingWeekdaySchema;
28839
- exports.RegisteredStreamSchema = RegisteredStreamSchema;
28840
29053
  exports.RenderedAsSchema = RenderedAsSchema;
28841
29054
  exports.ReportMotionInputSchema = ReportMotionInputSchema;
28842
29055
  exports.RingBuffer = RingBuffer;
@@ -28890,7 +29103,6 @@ exports.StorageTestLocationResultSchema = TestLocationResultSchema;
28890
29103
  exports.StorageWriteChunkInputSchema = WriteChunkInputSchema;
28891
29104
  exports.StreamCodecSchema = StreamCodecSchema;
28892
29105
  exports.StreamFormatSchema = StreamFormatSchema;
28893
- exports.StreamInfoSchema = StreamInfoSchema;
28894
29106
  exports.StreamNetworkStatsSchema = StreamNetworkStatsSchema;
28895
29107
  exports.StreamParamsOptionsSchema = StreamParamsOptionsSchema;
28896
29108
  exports.StreamParamsStatusSchema = StreamParamsStatusSchema;
@@ -28995,6 +29207,7 @@ exports.bindAddonActions = bindAddonActions;
28995
29207
  exports.brightnessCapability = brightnessCapability;
28996
29208
  exports.brokerCapability = brokerCapability;
28997
29209
  exports.buildAddonRouteProvider = buildAddonRouteProvider;
29210
+ exports.buildModelVariantGroups = buildModelVariantGroups;
28998
29211
  exports.buildStreamParamsConfigSchema = buildStreamParamsConfigSchema;
28999
29212
  exports.buttonCapability = buttonCapability;
29000
29213
  exports.cameraCredentialsCapability = cameraCredentialsCapability;
@@ -29031,6 +29244,7 @@ exports.dayNightCapability = dayNightCapability;
29031
29244
  exports.decoderCapability = decoderCapability;
29032
29245
  exports.defaultDeviceFor = defaultDeviceFor;
29033
29246
  exports.defineCustomActions = defineCustomActions;
29247
+ exports.describeModelVariant = describeModelVariant;
29034
29248
  exports.detectionPipelineCapability = detectionPipelineCapability;
29035
29249
  exports.deviceAdoptionCapability = deviceAdoptionCapability;
29036
29250
  exports.deviceCustomAction = deviceCustomAction;
@@ -29083,10 +29297,14 @@ exports.imageSettingsCapability = imageSettingsCapability;
29083
29297
  exports.integrationsCapability = integrationsCapability;
29084
29298
  exports.intercomCapability = intercomCapability;
29085
29299
  exports.isAgentOnlyPlacement = isAgentOnlyPlacement;
29300
+ exports.isArrayOutputSchema = isArrayOutputSchema;
29086
29301
  exports.isDeployableToAgent = isDeployableToAgent;
29087
29302
  exports.isDeviceConfigCap = require_sleep.isDeviceConfigCap;
29088
29303
  exports.isEvent = require_sleep.isEvent;
29304
+ exports.isObjectInput = isObjectInput;
29305
+ exports.isVoidInput = isVoidInput;
29089
29306
  exports.jobKindSchema = jobKindSchema;
29307
+ exports.kebabToCamel = kebabToCamel;
29090
29308
  exports.lawnMowerControlCapability = lawnMowerControlCapability;
29091
29309
  exports.lifecycleJobSchema = lifecycleJobSchema;
29092
29310
  exports.lifecycleJobScopeSchema = lifecycleJobScopeSchema;
@@ -29096,6 +29314,7 @@ exports.localNetworkCapability = localNetworkCapability;
29096
29314
  exports.locationSimilarity = locationSimilarity;
29097
29315
  exports.lockControlCapability = lockControlCapability;
29098
29316
  exports.logDestinationCapability = logDestinationCapability;
29317
+ exports.looseSchema = looseSchema;
29099
29318
  exports.makeProfileBrokerId = require_sleep.makeProfileBrokerId;
29100
29319
  exports.makeSourceBrokerId = require_sleep.makeSourceBrokerId;
29101
29320
  exports.mapAudioLabelToMacro = mapAudioLabelToMacro;
@@ -29149,6 +29368,7 @@ exports.prepareNotification = prepareNotification;
29149
29368
  exports.presenceCapability = presenceCapability;
29150
29369
  exports.pressureSensorCapability = pressureSensorCapability;
29151
29370
  exports.privacyMaskCapability = privacyMaskCapability;
29371
+ exports.procedureAuthKey = procedureAuthKey;
29152
29372
  exports.ptzAutotrackCapability = ptzAutotrackCapability;
29153
29373
  exports.ptzCapability = ptzCapability;
29154
29374
  exports.pythonScriptForBackend = pythonScriptForBackend;
@@ -29168,7 +29388,7 @@ exports.resolveDeviceProfile = resolveDeviceProfile;
29168
29388
  exports.resolveFormat = resolveFormat;
29169
29389
  exports.resolveModelFormat = resolveModelFormat;
29170
29390
  exports.resolveRunnerId = resolveRunnerId;
29171
- exports.restreamerCapability = restreamerCapability;
29391
+ exports.resolveVariantModelId = resolveVariantModelId;
29172
29392
  exports.runInferenceStep = runInferenceStep;
29173
29393
  exports.runtimeDevices = runtimeDevices;
29174
29394
  exports.scopeKey = require_sleep.scopeKey;
@@ -29182,8 +29402,8 @@ exports.sleepCancellable = require_sleep.sleepCancellable;
29182
29402
  exports.smokeCapability = smokeCapability;
29183
29403
  exports.smtpProviderCapability = smtpProviderCapability;
29184
29404
  exports.snapshotCapability = snapshotCapability;
29185
- exports.snapshotProviderCapability = snapshotProviderCapability;
29186
29405
  exports.ssoBridgeCapability = ssoBridgeCapability;
29406
+ exports.startReachabilityPoll = startReachabilityPoll;
29187
29407
  exports.storageCapability = storageCapability;
29188
29408
  exports.storageEvictableCapability = storageEvictableCapability;
29189
29409
  exports.storageProviderCapability = storageProviderCapability;
@@ -29192,7 +29412,6 @@ exports.streamCatalogCapability = streamCatalogCapability;
29192
29412
  exports.streamParamsCapability = streamParamsCapability;
29193
29413
  exports.streamPixels = streamPixels;
29194
29414
  exports.streamQualityLabel = streamQualityLabel;
29195
- exports.streamingEngineCapability = streamingEngineCapability;
29196
29415
  exports.supportedRuntimes = supportedRuntimes;
29197
29416
  exports.switchCapability = switchCapability;
29198
29417
  exports.synthesizeSourceInfo = synthesizeSourceInfo;
@@ -29223,7 +29442,6 @@ exports.vibrationCapability = vibrationCapability;
29223
29442
  exports.videoclipsCapability = videoclipsCapability;
29224
29443
  exports.waterHeaterCapability = waterHeaterCapability;
29225
29444
  exports.weatherCapability = weatherCapability;
29226
- exports.webrtcCapability = webrtcCapability;
29227
29445
  exports.webrtcClientHintsSchema = webrtcClientHintsSchema;
29228
29446
  exports.webrtcSessionCapability = webrtcSessionCapability;
29229
29447
  exports.wiringAddonHealthSchema = wiringAddonHealthSchema;