@camstack/addon-provider-wyze 0.2.128 → 0.2.129

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 (3) hide show
  1. package/dist/addon.js +910 -521
  2. package/dist/addon.mjs +910 -521
  3. package/package.json +1 -1
package/dist/addon.mjs CHANGED
@@ -10,7 +10,7 @@ import { getCACertificates, setDefaultCACertificates } from "node:tls";
10
10
  //#region \0rolldown/runtime.js
11
11
  var __require$1 = /* @__PURE__ */ createRequire(import.meta.url);
12
12
  //#endregion
13
- //#region ../types/dist/event-category-BGmz_oxW.mjs
13
+ //#region ../types/dist/event-category-B_0XEcLF.mjs
14
14
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
15
15
  EventCategory["SystemBoot"] = "system.boot";
16
16
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -511,15 +511,6 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
511
511
  EventCategory["AgentWsDisconnected"] = "agent.ws.disconnected";
512
512
  EventCategory["AgentBackupActivated"] = "agent.backup.activated";
513
513
  EventCategory["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
514
- /**
515
- * Per-agent hwaccel preference changed (user override set, cleared, or
516
- * re-probed). Observability event — decoders pull the current pref at
517
- * `createSession`, so running sessions keep their current backend until
518
- * they rotate naturally (camera add/remove, stream restart). Future
519
- * work can wire a listener in stream-broker that force-rotates live
520
- * sessions; for now this event powers logs + admin-UI toast feedback.
521
- */
522
- EventCategory["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
523
514
  EventCategory["MotionAnalysis"] = "detection.motion-analysis";
524
515
  /** All raw motion zones from CCL before minArea filter — for UI debug overlay. */
525
516
  EventCategory["MotionZonesRaw"] = "detection.motion-zones-raw";
@@ -5390,7 +5381,7 @@ var ZodIssueCode = {
5390
5381
  var ZodFirstPartyTypeKind;
5391
5382
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5392
5383
  //#endregion
5393
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5384
+ //#region ../types/dist/sleep-BNeXenvr.mjs
5394
5385
  /**
5395
5386
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5396
5387
  * window to float samples (D455).
@@ -6756,32 +6747,12 @@ object({
6756
6747
  audioCodec: string().optional(),
6757
6748
  metadata: record(string(), unknown()).readonly().optional()
6758
6749
  });
6759
- var EncodedPacketSchema = object({
6760
- type: _enum(["video", "audio"]),
6761
- data: _instanceof(Uint8Array),
6762
- pts: number(),
6763
- dts: number(),
6764
- keyframe: boolean(),
6765
- codec: string()
6766
- });
6767
- var DecodedFrameSchema = object({
6768
- data: _instanceof(Uint8Array),
6769
- width: number(),
6770
- height: number(),
6771
- format: _enum([
6772
- "jpeg",
6773
- "rgb",
6774
- "bgr",
6775
- "yuv420",
6776
- "gray"
6777
- ]),
6778
- timestamp: number()
6779
- });
6780
6750
  /**
6781
6751
  * Wire schema for `FrameHandle` — a zero-pixel, serialisable reference to a
6782
6752
  * frame in a shared-memory ring (Phase 5 / D9). Mirrors the `FrameHandle` TS
6783
- * interface in `interfaces/frame-handle.ts` field-for-field so a decoder cap
6784
- * method (`pullHandles`) can carry handles over tRPC / Moleculer.
6753
+ * interface in `interfaces/frame-handle.ts` field-for-field so a cap method
6754
+ * (the runner's native-crop and pipeline-executor inputs) can carry handles
6755
+ * over tRPC / Moleculer.
6785
6756
  *
6786
6757
  * The `satisfies` assertion below pins this schema to the interface: if a
6787
6758
  * field is added to / removed from `FrameHandle` without a matching schema
@@ -6807,50 +6778,6 @@ var FrameHandleSchema = object({
6807
6778
  slotCount: number().int().positive()
6808
6779
  });
6809
6780
  /**
6810
- * Pixel format a frame-handle subscriber can request from the broker
6811
- * (Phase 5 / D9). The packed, raster subset of `FrameFormat` — the formats a
6812
- * `frameSink: 'shm'` decoder session can write into a `FrameRing` slot.
6813
- * `jpeg` is excluded: a variable-length stream is not a fixed-stride ring
6814
- * payload, and no decoded-frame consumer requests it over the shm plane.
6815
- */
6816
- var FrameHandleFormatSchema = _enum([
6817
- "rgb",
6818
- "bgr",
6819
- "yuv420",
6820
- "gray"
6821
- ]);
6822
- /**
6823
- * Input for `stream-broker.subscribeFrames` (Phase 5 / D9). A consumer asks the
6824
- * broker for a `FrameHandle` stream of one `format`; the broker maintains one
6825
- * shared-memory ring per `(brokerId, format)` actually requested, so a `gray`
6826
- * subscriber (motion) and an `rgb` subscriber (detection) each read the format
6827
- * they asked for with no broker-side conversion.
6828
- */
6829
- var SubscribeFramesInputSchema = object({
6830
- brokerId: string(),
6831
- format: FrameHandleFormatSchema,
6832
- /**
6833
- * Optional reader-side cadence hint in frames per second. The broker does
6834
- * NOT throttle — latest-wins ring reads drop frames implicitly for a slow
6835
- * consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
6836
- * the consumer can pace its own `pullFrameHandles` polling.
6837
- */
6838
- maxFps: number().positive().optional(),
6839
- /** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
6840
- tag: string().optional()
6841
- });
6842
- /**
6843
- * Result of `stream-broker.subscribeFrames`. The consumer then polls
6844
- * `pullFrameHandles({ subscriptionId, maxCount })` and feeds each returned
6845
- * `FrameHandle` to a `FrameRingReader`.
6846
- */
6847
- var SubscribeFramesResultSchema = object({
6848
- /** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
6849
- subscriptionId: string(),
6850
- /** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
6851
- maxFps: number().nonnegative()
6852
- });
6853
- /**
6854
6781
  * Wire schema for a decoded audio chunk (Phase 5 / D9). Mirrors the
6855
6782
  * `DecodedAudioChunk` TS interface in `interfaces/stream-broker.ts`: PCM
6856
6783
  * sample bytes plus the track parameters a consumer needs to interpret them.
@@ -6858,8 +6785,8 @@ var SubscribeFramesResultSchema = object({
6858
6785
  * Audio chunks are tiny (a ~500ms AudioCodecSession window is a few KB of
6859
6786
  * Float32 PCM), so unlike video frames they ship their bytes INLINE over
6860
6787
  * tRPC / Moleculer — no shared-memory plane. `data` is typed `Uint8Array`
6861
- * (the wire-serialisable supertype of `Buffer`) to match `DecodedFrameSchema`
6862
- * / `EncodedPacketSchema`'s precedent; a `Buffer` is assignable to it.
6788
+ * (the wire-serialisable supertype of `Buffer`); a `Buffer` is assignable to
6789
+ * it.
6863
6790
  */
6864
6791
  var AudioChunkFormatSchema = _enum(AUDIO_CHUNK_FORMATS);
6865
6792
  var DecodedAudioChunkSchema = object({
@@ -6877,11 +6804,10 @@ var DecodedAudioChunkSchema = object({
6877
6804
  format: AudioChunkFormatSchema.optional()
6878
6805
  });
6879
6806
  /**
6880
- * Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). The
6881
- * handle-free, ship-bytes-inline analogue of `subscribeFrames`: a consumer
6882
- * asks the broker for the decoded audio-chunk stream of one broker; the
6883
- * broker keeps a per-subscription bounded FIFO queue the consumer drains via
6884
- * `pullAudioChunks`.
6807
+ * Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). Audio ships
6808
+ * its bytes inline: a consumer asks the broker for the decoded audio-chunk
6809
+ * stream of one broker; the broker keeps a per-subscription bounded FIFO queue
6810
+ * the consumer drains via `pullAudioChunks`.
6885
6811
  */
6886
6812
  var SubscribeAudioChunksInputSchema = object({
6887
6813
  brokerId: string(),
@@ -6912,9 +6838,7 @@ var BrokerStatsSchema = object({
6912
6838
  "stopped"
6913
6839
  ]),
6914
6840
  inputFps: number(),
6915
- decodeFps: number(),
6916
6841
  encodedSubscribers: number(),
6917
- decodedSubscribers: number(),
6918
6842
  uptimeMs: number(),
6919
6843
  bitrateKbps: number(),
6920
6844
  idrIntervalMs: number(),
@@ -6927,14 +6851,6 @@ var BrokerStatsSchema = object({
6927
6851
  preBufferMs: number(),
6928
6852
  preBufferPackets: number(),
6929
6853
  /**
6930
- * Moleculer node id of the decoder provider currently servicing this
6931
- * stream's decoded subscribers. `null` until the deferred decoder is
6932
- * created (no decoded clients yet, or codec not detected). Surfaces the
6933
- * runtime decoder placement so the UI can show "Decoder: <agent>" without
6934
- * a separate cap call per broker.
6935
- */
6936
- decoderNodeId: string().nullable(),
6937
- /**
6938
6854
  * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
6939
6855
  * when the stream has no audio track or the broker is in cold start.
6940
6856
  * `supported = false` means the codec was detected but the local
@@ -10290,70 +10206,6 @@ var StorageLocationDeclarationSchema = object({
10290
10206
  "backup"
10291
10207
  ]).optional()
10292
10208
  });
10293
- var DecoderStatsSchema = object({
10294
- inputFps: number(),
10295
- outputFps: number(),
10296
- avgDecodeTimeMs: number(),
10297
- droppedFrames: number(),
10298
- /**
10299
- * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
10300
- * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
10301
- * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
10302
- * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
10303
- */
10304
- lagMs: number().optional(),
10305
- effectiveFps: number().optional(),
10306
- adaptiveFps: number().optional()
10307
- });
10308
- var DecoderSessionConfigSchema = object({
10309
- codec: string(),
10310
- maxFps: number().default(0),
10311
- outputFormat: _enum([
10312
- "jpeg",
10313
- "rgb",
10314
- "bgr",
10315
- "yuv420",
10316
- "gray"
10317
- ]).default("jpeg"),
10318
- scale: number().default(1),
10319
- width: number().optional(),
10320
- height: number().optional(),
10321
- /**
10322
- * Identifier of the camera this decoder session serves. Optional
10323
- * because the cap is generic (any caller could request decode), but
10324
- * stream-broker passes it so decoder logs include `deviceId` for
10325
- * per-camera filtering when diagnosing failures (e.g. node-av
10326
- * sendPacket errors on a single hung camera).
10327
- */
10328
- deviceId: number().int().nonnegative().optional(),
10329
- /**
10330
- * Free-form tag for log scoping. Stream-broker uses
10331
- * `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
10332
- * on every line so `grep tag=broker:5/high` filters one camera
10333
- * profile cleanly.
10334
- */
10335
- tag: string().optional(),
10336
- /**
10337
- * Where the session delivers decoded frames (Phase 5 / D9):
10338
- *
10339
- * - `'callback'` (default) — the legacy pixel path: decoded frames are
10340
- * buffered as `DecodedFrame`s and drained via `pullFrames`.
10341
- * - `'shm'` — the shared-memory frame plane: decoded frames are written
10342
- * into an OS shared-memory ring and drained as zero-pixel
10343
- * `FrameHandle`s via `pullHandles`. A session is one mode or the
10344
- * other — `pullFrames` returns nothing for an `'shm'` session and
10345
- * `pullHandles` returns nothing for a `'callback'` session.
10346
- */
10347
- frameSink: _enum(["callback", "shm"]).default("callback"),
10348
- /**
10349
- * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
10350
- * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
10351
- * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
10352
- * stream-broker's `streamingDebug` gate — off by default so production logs
10353
- * stay quiet and the emit path pays zero per-frame cost when disabled.
10354
- */
10355
- debug: boolean().optional()
10356
- });
10357
10209
  /**
10358
10210
  * Per-component log CHANNELS — the gate a hot path consults, and the registry
10359
10211
  * an addon declares its channels in.
@@ -10496,57 +10348,26 @@ var ClipSearchStrictnessSchema = _enum([
10496
10348
  "balanced",
10497
10349
  "strict"
10498
10350
  ]);
10499
- new Set([
10500
- {
10501
- id: "person",
10502
- name: "Person"
10503
- },
10504
- {
10505
- id: "vehicle",
10506
- name: "Vehicle"
10507
- },
10508
- {
10509
- id: "animal",
10510
- name: "Animal"
10511
- },
10512
- {
10513
- id: "package",
10514
- name: "Package"
10515
- }
10516
- ].map((l) => l.id));
10517
- var COCO_TO_MACRO = {
10518
- mapping: {
10519
- person: "person",
10520
- bicycle: "vehicle",
10521
- car: "vehicle",
10522
- motorcycle: "vehicle",
10523
- airplane: "vehicle",
10524
- bus: "vehicle",
10525
- train: "vehicle",
10526
- truck: "vehicle",
10527
- boat: "vehicle",
10528
- bird: "animal",
10529
- cat: "animal",
10530
- dog: "animal",
10531
- horse: "animal",
10532
- sheep: "animal",
10533
- cow: "animal",
10534
- elephant: "animal",
10535
- bear: "animal",
10536
- zebra: "animal",
10537
- giraffe: "animal",
10538
- suitcase: "package",
10539
- backpack: "package",
10540
- handbag: "package"
10541
- },
10542
- preserveOriginal: false
10543
- };
10544
- /** Steps a root detector may declare it fills. */
10545
- var FILLABLE_STEP_IDS = [
10351
+ /** Steps whose effect a root label can BE. */
10352
+ var LABEL_SUPPLY_STEP_IDS = [
10546
10353
  "animal-classifier",
10547
10354
  "vehicle-classifier",
10548
10355
  "package-detection"
10549
10356
  ];
10357
+ /** Steps whose box a root detection can BE. */
10358
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
10359
+ /**
10360
+ * Steps whose per-detection MASK a root detection can carry (D737). The live
10361
+ * mask step is `segmentation` — a frame-plane refiner that runs its own model
10362
+ * once per detection crop. (`instance-segmentation` is a dormant step id that
10363
+ * no camera tree carries.)
10364
+ */
10365
+ var MASK_SUPPLY_STEP_IDS = ["segmentation"];
10366
+ [
10367
+ ...LABEL_SUPPLY_STEP_IDS,
10368
+ ...CROP_SUPPLY_STEP_IDS,
10369
+ ...MASK_SUPPLY_STEP_IDS
10370
+ ];
10550
10371
  var MODEL_FORMATS = [
10551
10372
  "onnx",
10552
10373
  "coreml",
@@ -10575,7 +10396,53 @@ var ModelFormatEntrySchema = object({
10575
10396
  /** Multi-file payload (directory members or sibling files). */
10576
10397
  files: array(string()).readonly().optional(),
10577
10398
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
10578
- runtimes: array(_enum(["python"])).readonly().optional()
10399
+ runtimes: array(_enum(["python"])).readonly().optional(),
10400
+ /**
10401
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
10402
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
10403
+ * weight file) comes from the downloader's generated table, kept in step
10404
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
10405
+ * node records the revision it downloaded next to the file
10406
+ * (`<file>.revision`); a copy with no record or a different one is stale
10407
+ * unless its weight file hashes to the revision, and a stale copy is
10408
+ * downloaded again, the old one serving until the new one is complete. No
10409
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
10410
+ */
10411
+ revision: string().min(1).optional()
10412
+ });
10413
+ /**
10414
+ * What a node holds for one (model, format) (D746). `current` is a complete
10415
+ * copy at its catalog revision — exactly what `downloaded: true` means.
10416
+ * `stale` is bytes on disk that are not (yet) proven current under D743/D744:
10417
+ * no or a different revision record, or a missing sibling. `missing` is no
10418
+ * copy. `downloaded` alone folds `stale` into "not downloaded", which hid
10419
+ * reclaimable bytes and a copy about to be replaced.
10420
+ */
10421
+ var ModelOnDiskStateSchema = _enum([
10422
+ "current",
10423
+ "stale",
10424
+ "missing"
10425
+ ]);
10426
+ /**
10427
+ * The numeric precision of one format's BUILD (D746) — reported only when the
10428
+ * build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
10429
+ * CamStack Core ML export). Absent means "not stated", never "fp32".
10430
+ */
10431
+ var ModelFormatPrecisionSchema = _enum([
10432
+ "fp32",
10433
+ "fp16",
10434
+ "int8"
10435
+ ]);
10436
+ /**
10437
+ * One format of one model as a node's `pipelineExecutor.getSchema` reports it.
10438
+ * `onDisk` / `precision` are optional for version skew: a runner that predates
10439
+ * them omits them, and a reader falls back to `downloaded`.
10440
+ */
10441
+ var PipelineModelFormatStatusSchema = object({
10442
+ downloaded: boolean(),
10443
+ sizeMB: number(),
10444
+ onDisk: ModelOnDiskStateSchema.optional(),
10445
+ precision: ModelFormatPrecisionSchema.optional()
10579
10446
  });
10580
10447
  /**
10581
10448
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -10679,12 +10546,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10679
10546
  /** True when the weights or their data forbid commercial use. */
10680
10547
  nonCommercial: boolean().optional()
10681
10548
  }));
10682
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
10683
- var FillsClassifierEffectSchema = object({
10684
- stepId: _enum(FILLABLE_STEP_IDS),
10685
- labelToEffect: record(string(), string()),
10686
- uncovered: array(string()).readonly()
10687
- });
10549
+ /**
10550
+ * One step a ROOT detector can supply from its own output (D730) — see
10551
+ * `ModelCatalogEntry.suppliesSteps`.
10552
+ *
10553
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
10554
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
10555
+ * the root cannot produce (shown as unavailable, never a blocker).
10556
+ * - `crop`: the root draws the box the step would have found (`license_plate`
10557
+ * for plate-detection, `face` for face-detection). The box becomes a detail
10558
+ * child of the `parentMacro` detection that contains it — never a track.
10559
+ * - `mask`: the root's decode emits an instance mask with every detection (a
10560
+ * YOLO26-seg root, D737) — the `segmentation` step's result, carried on the
10561
+ * detection in the shape that step produces. Derived from the model's
10562
+ * postprocessor on read, never stored by an import.
10563
+ */
10564
+ var RootStepSupplySchema = discriminatedUnion("kind", [
10565
+ object({
10566
+ kind: literal("label"),
10567
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
10568
+ labelToEffect: record(string(), string()),
10569
+ uncovered: array(string()).readonly()
10570
+ }),
10571
+ object({
10572
+ kind: literal("crop"),
10573
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
10574
+ rootLabels: array(string()).readonly(),
10575
+ parentMacro: _enum(["vehicle", "person"]),
10576
+ childClass: _enum(["plate", "face"]),
10577
+ /**
10578
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
10579
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
10580
+ * stored by an import.
10581
+ */
10582
+ rootInputPx: number().int().positive().optional()
10583
+ }),
10584
+ object({
10585
+ kind: literal("mask"),
10586
+ stepId: _enum(MASK_SUPPLY_STEP_IDS)
10587
+ })
10588
+ ]);
10688
10589
  var ModelCatalogEntrySchema = object({
10689
10590
  id: string(),
10690
10591
  name: string(),
@@ -10750,6 +10651,35 @@ var ModelCatalogEntrySchema = object({
10750
10651
  */
10751
10652
  defaultConfidence: number().min(0).max(1).optional(),
10752
10653
  /**
10654
+ * Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
10655
+ * on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
10656
+ * absent here runs at the step slider's global default. The same row shape
10657
+ * the floor measurement produces (`model-floors.json`: modelId → floors), so
10658
+ * a measured table is copied in as-is. An operator override is bound to the
10659
+ * model it was made for and does not survive a model change (D738). A custom
10660
+ * / imported model may declare it; without it, the global defaults apply.
10661
+ */
10662
+ defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
10663
+ /**
10664
+ * The inference precision this model's OpenVINO IR needs on an Intel GPU.
10665
+ * Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
10666
+ * that produces invalid output at f16 — measured 2026-10-07 for YOLO26
10667
+ * base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
10668
+ * scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
10669
+ * `PoolModelConfig.gpuInferencePrecision`; the pool sets
10670
+ * INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
10671
+ */
10672
+ gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
10673
+ /**
10674
+ * ROOT detectors only: per supplied step (`animal-classifier`, …), the
10675
+ * minimum DETECTION score from which this root's own fine label (species,
10676
+ * vehicle type — D736 root supply) is taken (D741). Below it the detection
10677
+ * keeps its macro class without the fine label. `1` = never take it from
10678
+ * this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
10679
+ * `minConfidence` slider, bound to the ROOT model, overrides it.
10680
+ */
10681
+ suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
10682
+ /**
10753
10683
  * When true, the executor produces a landmark-aligned crop (similarity warp
10754
10684
  * onto the canonical template) before this step runs, instead of a plain
10755
10685
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -10811,15 +10741,15 @@ var ModelCatalogEntrySchema = object({
10811
10741
  */
10812
10742
  classMap: DetectionCatalogClassMapSchema.optional(),
10813
10743
  /**
10814
- * The pipeline steps this ROOT detector already does the work of (D715):
10815
- * its labels name the effect the step exists to produce (`deer` for
10816
- * `animal-classifier`, `package` for `package-detection`). Derived from the
10817
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
10818
- * declares none. Whether a declaration is honoured is the step's own
10819
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
10820
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
10744
+ * The pipeline steps this ROOT detector can supply from its own output
10745
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
10746
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
10747
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
10748
+ * by hand and never assumed per family; a row without it is derived on read
10749
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
10750
+ * `useRootModel` flag (`resolveRootSupply`).
10821
10751
  */
10822
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
10752
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
10823
10753
  /**
10824
10754
  * The model's CLIP feature-space contract (text encoder, dimension, vector
10825
10755
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -12422,13 +12352,6 @@ var BrokerRtspClientSchema = object({
12422
12352
  lastRtpAt: number(),
12423
12353
  bytesSent: number()
12424
12354
  });
12425
- var BrokerDecodedClientSchema = object({
12426
- tag: string(),
12427
- subscribedAt: number(),
12428
- maxFps: number(),
12429
- framesDelivered: number(),
12430
- framesDropped: number()
12431
- });
12432
12355
  var BrokerAudioClientSchema = object({
12433
12356
  tag: string(),
12434
12357
  subscribedAt: number(),
@@ -12520,7 +12443,6 @@ var BrokerEncodedClientSchema = object({
12520
12443
  });
12521
12444
  var BrokerClientsSchema = object({
12522
12445
  rtsp: array(BrokerRtspClientSchema).readonly(),
12523
- decoded: array(BrokerDecodedClientSchema).readonly(),
12524
12446
  audio: array(BrokerAudioClientSchema).readonly(),
12525
12447
  encoded: array(BrokerEncodedClientSchema).readonly(),
12526
12448
  pipeClients: number(),
@@ -12889,11 +12811,7 @@ method(object({
12889
12811
  auth: "admin"
12890
12812
  }), method(object({ brokerId: string() }), BrokerClientsSchema), method(object({
12891
12813
  brokerId: string(),
12892
- channel: _enum([
12893
- "rtsp",
12894
- "decoded",
12895
- "audio"
12896
- ]),
12814
+ channel: _enum(["rtsp", "audio"]),
12897
12815
  handle: string()
12898
12816
  }), object({ killed: boolean() }), {
12899
12817
  kind: "mutation",
@@ -12928,10 +12846,7 @@ method(object({
12928
12846
  }), method(SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, { kind: "mutation" }), method(object({
12929
12847
  subscriptionId: string(),
12930
12848
  maxCount: number().int().positive().default(8)
12931
- }), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(SubscribeFramesInputSchema, SubscribeFramesResultSchema, { kind: "mutation" }), method(object({
12932
- subscriptionId: string(),
12933
- maxCount: number().int().positive().default(4)
12934
- }), array(FrameHandleSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
12849
+ }), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
12935
12850
  brokerId: string(),
12936
12851
  seconds: number().min(0).max(30)
12937
12852
  }), _void(), {
@@ -14190,54 +14105,12 @@ id: union([string(), number()]) }), {
14190
14105
  kind: "mutation",
14191
14106
  auth: "admin"
14192
14107
  });
14193
- /**
14194
- * shm ring usage stats for a `frameSink: 'shm'` decoder session —
14195
- * exposed via `decoder.getShmStats` so downstream consumers can
14196
- * observe ring pressure (slot count, byte budget, hit/miss ratio).
14197
- */
14198
- var ShmRingStatsSchema = object({
14199
- sessionId: string(),
14200
- slotCount: number().int(),
14201
- slotByteLength: number().int(),
14202
- segmentBytes: number().int(),
14203
- budgetMb: number().int(),
14204
- framesWritten: number().int(),
14205
- getFrameHits: number().int(),
14206
- getFrameMisses: number().int()
14207
- });
14208
- method(object({ codec: string() }), boolean()), method(_void(), object({
14108
+ method(_void(), object({
14209
14109
  id: string(),
14210
14110
  name: string(),
14211
- isPullMode: boolean().optional(),
14212
- priority: number().optional(),
14213
14111
  hwaccel: string().optional(),
14214
14112
  probedBestHwaccel: string().optional()
14215
- })), method(DecoderSessionConfigSchema, object({
14216
- sessionId: string(),
14217
- nodeId: string()
14218
- })), method(object({ sessionId: string() }), _void()), method(object({
14219
- sessionId: string(),
14220
- packet: EncodedPacketSchema
14221
- }), _void()), method(object({
14222
- sessionId: string(),
14223
- url: string()
14224
- }), _void()), method(object({
14225
- sessionId: string(),
14226
- maxCount: number().default(1),
14227
- waitMs: number().optional()
14228
- }), array(DecodedFrameSchema)), method(object({
14229
- sessionId: string(),
14230
- maxCount: number().default(1),
14231
- waitMs: number().optional()
14232
- }), array(FrameHandleSchema)), method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()), method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()), method(object({
14233
- sessionId: string(),
14234
- config: DecoderSessionConfigSchema.partial()
14235
- }), _void()), method(object({ sessionId: string() }), DecoderStatsSchema), method(_void(), array(object({
14236
- sessionId: string(),
14237
- codec: string(),
14238
- outputFormat: string(),
14239
- createdAtMs: number()
14240
- })).readonly()), method(_void(), object({ backend: string() }), {
14113
+ })), method(_void(), object({ backend: string() }), {
14241
14114
  kind: "mutation",
14242
14115
  auth: "admin"
14243
14116
  });
@@ -16286,6 +16159,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
16286
16159
  kind: "mutation",
16287
16160
  auth: "admin"
16288
16161
  });
16162
+ var HUB_ADDRESS_ROLES = [
16163
+ "appConnections",
16164
+ "notificationTaps",
16165
+ "internal",
16166
+ "publicEndpoint"
16167
+ ];
16289
16168
  /**
16290
16169
  * Transport bounds for AI capability methods.
16291
16170
  *
@@ -18048,6 +17927,51 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
18048
17927
  kind: "mutation",
18049
17928
  auth: "admin"
18050
17929
  });
17930
+ new Set([
17931
+ {
17932
+ id: "person",
17933
+ name: "Person"
17934
+ },
17935
+ {
17936
+ id: "vehicle",
17937
+ name: "Vehicle"
17938
+ },
17939
+ {
17940
+ id: "animal",
17941
+ name: "Animal"
17942
+ },
17943
+ {
17944
+ id: "package",
17945
+ name: "Package"
17946
+ }
17947
+ ].map((l) => l.id));
17948
+ var COCO_TO_MACRO = {
17949
+ mapping: {
17950
+ person: "person",
17951
+ bicycle: "vehicle",
17952
+ car: "vehicle",
17953
+ motorcycle: "vehicle",
17954
+ airplane: "vehicle",
17955
+ bus: "vehicle",
17956
+ train: "vehicle",
17957
+ truck: "vehicle",
17958
+ boat: "vehicle",
17959
+ bird: "animal",
17960
+ cat: "animal",
17961
+ dog: "animal",
17962
+ horse: "animal",
17963
+ sheep: "animal",
17964
+ cow: "animal",
17965
+ elephant: "animal",
17966
+ bear: "animal",
17967
+ zebra: "animal",
17968
+ giraffe: "animal",
17969
+ suitcase: "package",
17970
+ backpack: "package",
17971
+ handbag: "package"
17972
+ },
17973
+ preserveOriginal: false
17974
+ };
18051
17975
  var AUDIO_MACRO_LABELS = [
18052
17976
  {
18053
17977
  id: "speech",
@@ -20450,7 +20374,13 @@ var NcAlarmModeDelaysListSchema = array(object({
20450
20374
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20451
20375
  * is the one that starts the entry delay — the entry-delay notification already names it.
20452
20376
  */
20453
- notifySensorRewatched: boolean().optional()
20377
+ notifySensorRewatched: boolean().optional(),
20378
+ /**
20379
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
20380
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
20381
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
20382
+ */
20383
+ notifySensorIgnored: boolean().optional()
20454
20384
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20455
20385
  var NcAlarmModeDelaysEditListSchema = array(object({
20456
20386
  mode: AlarmArmModeSchema,
@@ -20463,7 +20393,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20463
20393
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20464
20394
  notifyDuringEntryDelay: boolean().nullable().optional(),
20465
20395
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20466
- notifySensorRewatched: boolean().nullable().optional()
20396
+ notifySensorRewatched: boolean().nullable().optional(),
20397
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
20398
+ notifySensorIgnored: boolean().nullable().optional()
20467
20399
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20468
20400
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20469
20401
  var NcAlarmNonBlockingEditSchema = object({
@@ -21441,8 +21373,8 @@ Object.freeze(Object.fromEntries([{
21441
21373
  var CLUSTER_STEP_SETTING_FIELDS = [{
21442
21374
  stepId: "face-embedding",
21443
21375
  key: "minLandmarkFaceSize",
21444
- label: "Min face size for recognition (detection px)",
21445
- description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
21376
+ label: "Min face size to embed (detection-frame px)",
21377
+ description: "Faces smaller than this in the small frame the detector sees are not embedded, so they can never be recognised. Below it the face cannot be aligned reliably and a bad embedding matches everyone. Same value on every node. 0 = no limit.",
21446
21378
  type: "slider",
21447
21379
  min: 0,
21448
21380
  max: 64,
@@ -23362,6 +23294,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23362
23294
  timestamp: number()
23363
23295
  });
23364
23296
  /**
23297
+ * A root model's boxes standing in for one crop-kind step's own inference
23298
+ * (D730) — see `runPipeline.suppliedRoot`.
23299
+ */
23300
+ var SuppliedRootOutputSchema = object({
23301
+ stepId: string(),
23302
+ /** The root model that drew the boxes — stamped on the result. */
23303
+ modelId: string(),
23304
+ detections: array(object({
23305
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
23306
+ bbox: tuple([
23307
+ number(),
23308
+ number(),
23309
+ number(),
23310
+ number()
23311
+ ]),
23312
+ score: number(),
23313
+ /**
23314
+ * Five facial landmarks in the same pixels — a face the step's own
23315
+ * detector already re-found inside a root face box (D730), so its
23316
+ * embedder child aligns it exactly as it aligns any detected face.
23317
+ */
23318
+ landmarks: array(object({
23319
+ x: number(),
23320
+ y: number()
23321
+ })).optional()
23322
+ })).min(1)
23323
+ });
23324
+ /**
23365
23325
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23366
23326
  * within the frame, so the executor can re-cut a leaf child ROI at native
23367
23327
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -23409,7 +23369,7 @@ var FrameRefSchema = object({
23409
23369
  timestamp: number(),
23410
23370
  capturedAt: number().optional()
23411
23371
  });
23412
- var ModelFormatSchema$1 = _enum([
23372
+ var ModelFormatSchema$2 = _enum([
23413
23373
  "onnx",
23414
23374
  "coreml",
23415
23375
  "openvino",
@@ -23427,7 +23387,7 @@ var PipelineSlotSchema = _enum([
23427
23387
  var PipelineEngineChoiceSchema = object({
23428
23388
  runtime: literal("python"),
23429
23389
  backend: string(),
23430
- format: ModelFormatSchema$1,
23390
+ format: ModelFormatSchema$2,
23431
23391
  device: string().optional()
23432
23392
  });
23433
23393
  /**
@@ -23466,33 +23426,15 @@ var PipelineDefaultStepSchema = lazy(() => object({
23466
23426
  group: string().optional(),
23467
23427
  settings: record(string(), unknown()).optional()
23468
23428
  }));
23469
- var PipelineTemplateStepSchema = lazy(() => object({
23470
- addonId: string(),
23471
- enabled: boolean(),
23472
- modelId: string(),
23473
- children: array(PipelineTemplateStepSchema).readonly(),
23474
- settings: record(string(), unknown()).optional()
23475
- }));
23476
- var PipelineTemplateSchema$1 = object({
23477
- id: string(),
23478
- name: string(),
23479
- createdAt: string(),
23480
- updatedAt: string(),
23481
- engine: PipelineEngineChoiceSchema,
23482
- steps: array(PipelineTemplateStepSchema).readonly()
23483
- });
23484
23429
  var PipelineModelOptionSchema = object({
23485
23430
  id: string(),
23486
23431
  name: string(),
23487
- formats: record(string(), object({
23488
- downloaded: boolean(),
23489
- sizeMB: number()
23490
- })),
23432
+ formats: record(string(), PipelineModelFormatStatusSchema),
23491
23433
  group: ModelVariantGroupSchema.optional(),
23492
23434
  legacy: boolean().optional(),
23493
23435
  provider: ModelProviderIdSchema.optional(),
23494
23436
  defaultConfidence: number().optional(),
23495
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
23437
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
23496
23438
  });
23497
23439
  var ConfigFieldBridge = custom();
23498
23440
  var PipelineAddonSchemaSchema = object({
@@ -23654,6 +23596,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23654
23596
  }), {
23655
23597
  kind: "mutation",
23656
23598
  auth: "admin"
23599
+ }), method(object({
23600
+ nodeId: string(),
23601
+ deviceIds: array(number()).readonly().optional(),
23602
+ dryRun: boolean()
23603
+ }), object({
23604
+ entries: array(object({
23605
+ deviceId: number(),
23606
+ keys: array(string()).readonly()
23607
+ })).readonly(),
23608
+ refused: array(object({
23609
+ deviceId: number(),
23610
+ reason: string()
23611
+ })).readonly()
23612
+ }), {
23613
+ kind: "mutation",
23614
+ auth: "admin"
23657
23615
  }), method(object({ nodeId: string() }), object({ unhealthy: array(object({
23658
23616
  /** `<backend>:<device>`, e.g. `openvino:gpu`. */
23659
23617
  deviceKey: string(),
@@ -23679,22 +23637,14 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23679
23637
  }), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(object({
23680
23638
  steps: array(PipelineStepInputSchema),
23681
23639
  deviceKey: string().optional()
23682
- }), PipelineValidationResultSchema), method(_void(), array(PipelineTemplateSchema$1).readonly()), method(object({
23683
- name: string(),
23684
- steps: array(PipelineTemplateStepSchema).readonly(),
23685
- engine: PipelineEngineChoiceSchema
23686
- }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({
23687
- id: string(),
23688
- name: string().optional(),
23689
- steps: array(PipelineTemplateStepSchema).readonly().optional()
23690
- }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
23640
+ }), PipelineValidationResultSchema), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
23691
23641
  addonId: string(),
23692
23642
  modelId: string(),
23693
- format: ModelFormatSchema$1
23643
+ format: ModelFormatSchema$2
23694
23644
  }), DownloadModelResultSchema, { kind: "mutation" }), method(object({
23695
23645
  addonId: string(),
23696
23646
  modelId: string(),
23697
- format: ModelFormatSchema$1
23647
+ format: ModelFormatSchema$2
23698
23648
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
23699
23649
  steps: array(PipelineStepInputSchema).min(1),
23700
23650
  frame: FrameInputSchema.optional(),
@@ -23760,7 +23710,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23760
23710
  * `device-not-servable`), and nothing reaches the camera's live
23761
23711
  * trace stream. Absent ⇒ unchanged behaviour.
23762
23712
  */
23763
- replay: literal(true).optional()
23713
+ replay: literal(true).optional(),
23714
+ /**
23715
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
23716
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
23717
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
23718
+ * NOT inferred, these boxes are its output, and its children (the plate
23719
+ * reader) run on them through their own crop policy. Boxes are in the
23720
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
23721
+ */
23722
+ suppliedRoot: SuppliedRootOutputSchema.optional()
23764
23723
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
23765
23724
  steps: array(PipelineStepInputSchema).min(1),
23766
23725
  frames: array(FrameInputSchema).min(1).max(255),
@@ -23842,6 +23801,375 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23842
23801
  filename: string().optional(),
23843
23802
  settings: record(string(), unknown()).optional()
23844
23803
  }), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
23804
+ /**
23805
+ * The wire shapes of the Auto tune plan and apply (D745), used by the
23806
+ * `pipeline-orchestrator` cap. The recommender's own types
23807
+ * (`recommend.ts`) are the TS face of the same data; these
23808
+ * schemas are what crosses the cap boundary.
23809
+ */
23810
+ var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
23811
+ /** The operator's range for it. */
23812
+ var MIN_SESSIONS_PER_DEVICE_RANGE = {
23813
+ min: 1,
23814
+ max: 8
23815
+ };
23816
+ var HardwareClassIdSchema = _enum([
23817
+ "intel-core-ultra",
23818
+ "intel-n-series",
23819
+ "apple-m-base",
23820
+ "apple-m-pro",
23821
+ "unknown"
23822
+ ]);
23823
+ var AcceleratorKindSchema = _enum([
23824
+ "intel-npu",
23825
+ "intel-igpu",
23826
+ "x86-cpu",
23827
+ "arm-cpu",
23828
+ "apple-ane",
23829
+ "coral"
23830
+ ]);
23831
+ var RecommendationReasonSchema = discriminatedUnion("kind", [
23832
+ object({
23833
+ kind: literal("capacity"),
23834
+ sessions: number(),
23835
+ minSessions: number()
23836
+ }),
23837
+ object({
23838
+ kind: literal("tie-faster"),
23839
+ over: string(),
23840
+ recallDelta: number()
23841
+ }),
23842
+ object({
23843
+ kind: literal("stepped-down"),
23844
+ from: string(),
23845
+ to: string(),
23846
+ limitedBy: string()
23847
+ }),
23848
+ object({
23849
+ kind: literal("no-fit-lightest"),
23850
+ sessions: number(),
23851
+ minSessions: number()
23852
+ }),
23853
+ object({
23854
+ kind: literal("derived-latency"),
23855
+ modelId: string()
23856
+ }),
23857
+ object({ kind: literal("cpu-device") }),
23858
+ object({ kind: literal("coral-untouched") }),
23859
+ object({ kind: literal("device-disabled") }),
23860
+ object({ kind: literal("device-unavailable") }),
23861
+ object({ kind: literal("node-offline") }),
23862
+ object({ kind: literal("no-hardware-facts") }),
23863
+ object({
23864
+ kind: literal("no-measured-data"),
23865
+ hardwareClass: HardwareClassIdSchema
23866
+ }),
23867
+ object({
23868
+ kind: literal("no-family-build"),
23869
+ format: ModelFormatSchema$1
23870
+ })
23871
+ ]);
23872
+ var DeviceModelChoiceSchema = object({
23873
+ modelId: string(),
23874
+ p50Ms: number(),
23875
+ fps: number(),
23876
+ measured: boolean(),
23877
+ /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
23878
+ capacitySessions: number(),
23879
+ personRecall: number()
23880
+ });
23881
+ var DeviceRecommendationSchema = object({
23882
+ deviceKey: string(),
23883
+ accelerator: AcceleratorKindSchema.nullable(),
23884
+ enabled: boolean(),
23885
+ available: boolean(),
23886
+ chosen: DeviceModelChoiceSchema.nullable(),
23887
+ reasons: array(RecommendationReasonSchema).readonly()
23888
+ });
23889
+ var NodeRecommendationSchema = object({
23890
+ nodeId: string(),
23891
+ reachable: boolean(),
23892
+ hardwareClass: HardwareClassIdSchema.nullable(),
23893
+ cpuModel: string().nullable(),
23894
+ skipped: boolean(),
23895
+ acceleratorModelId: string().nullable(),
23896
+ devices: array(DeviceRecommendationSchema).readonly(),
23897
+ reasons: array(RecommendationReasonSchema).readonly()
23898
+ });
23899
+ var ModelPinChangeSchema = object({
23900
+ stepId: string(),
23901
+ before: string().nullable(),
23902
+ after: string().nullable()
23903
+ });
23904
+ var NodeDeviceChangeSchema = object({
23905
+ nodeId: string(),
23906
+ deviceKey: string(),
23907
+ madeExplicit: boolean(),
23908
+ modelPins: array(ModelPinChangeSchema).readonly(),
23909
+ thresholds: array(object({
23910
+ stepId: string(),
23911
+ keys: array(string()).readonly()
23912
+ })).readonly()
23913
+ });
23914
+ var CameraOverrideClearSchema = object({
23915
+ deviceId: number(),
23916
+ source: _enum(["step-override", "wholesale"]),
23917
+ nodeId: string(),
23918
+ deviceKey: string().nullable(),
23919
+ stepId: string(),
23920
+ modelIdBefore: string().nullable(),
23921
+ keys: array(string()).readonly()
23922
+ });
23923
+ var DetectorStoreClearSchema = object({
23924
+ deviceId: number(),
23925
+ keys: array(string()).readonly()
23926
+ });
23927
+ var AutoTuneWarningSchema = discriminatedUnion("kind", [
23928
+ object({
23929
+ kind: literal("detector-store-cluster-wide"),
23930
+ skippedNodes: array(string()).readonly()
23931
+ }),
23932
+ object({
23933
+ kind: literal("detector-store-unreadable"),
23934
+ error: string()
23935
+ }),
23936
+ object({
23937
+ kind: literal("coral-enabled"),
23938
+ nodeId: string(),
23939
+ deviceKey: string()
23940
+ })
23941
+ ]);
23942
+ var AutoTuneOptionsSchema = object({
23943
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
23944
+ headroom: number().min(.3).max(.5).default(.4),
23945
+ /**
23946
+ * The least number of parallel sessions every device must sustain at the
23947
+ * camera rate with the headroom kept free (D755). The most accurate model
23948
+ * that reaches it wins.
23949
+ */
23950
+ minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
23951
+ });
23952
+ var AutoTunePlanSchema = object({
23953
+ /** Hash of everything the apply will write — the apply refuses a different one. */
23954
+ planHash: string(),
23955
+ family: literal("yolov9"),
23956
+ headroom: number(),
23957
+ minSessionsPerDevice: number(),
23958
+ /** The detection rate a session is counted at (the fastest camera running the pipeline root). */
23959
+ cameraFps: number(),
23960
+ generatedAt: number(),
23961
+ nodes: array(NodeRecommendationSchema).readonly(),
23962
+ nodeChanges: array(NodeDeviceChangeSchema).readonly(),
23963
+ cameraClears: array(CameraOverrideClearSchema).readonly(),
23964
+ detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
23965
+ warnings: array(AutoTuneWarningSchema).readonly()
23966
+ });
23967
+ var AutoTuneApplyInputSchema = object({
23968
+ planHash: string(),
23969
+ headroom: number().min(.3).max(.5).default(.4),
23970
+ minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
23971
+ });
23972
+ var AutoTunePhaseResultSchema = object({
23973
+ phase: _enum([
23974
+ "download",
23975
+ "camera-overrides",
23976
+ "detector-thresholds",
23977
+ "node-models",
23978
+ "redispatch"
23979
+ ]),
23980
+ ok: boolean(),
23981
+ detail: string()
23982
+ });
23983
+ var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
23984
+ object({
23985
+ kind: literal("applied"),
23986
+ planHash: string(),
23987
+ phases: array(AutoTunePhaseResultSchema).readonly()
23988
+ }),
23989
+ object({
23990
+ kind: literal("aborted"),
23991
+ phases: array(AutoTunePhaseResultSchema).readonly()
23992
+ }),
23993
+ object({
23994
+ kind: literal("stale"),
23995
+ plan: AutoTunePlanSchema
23996
+ }),
23997
+ object({
23998
+ kind: literal("refused"),
23999
+ reason: _enum(["apply-in-progress"])
24000
+ })
24001
+ ]);
24002
+ /**
24003
+ * Wire shapes of the Load balancing surface (D748): the session placement
24004
+ * policy, the atomic share write, the observed placement statistics, the
24005
+ * hardware share suggestion and the stale device pins.
24006
+ */
24007
+ /**
24008
+ * How a new detection session picks its node and device.
24009
+ * - `least-loaded` — the historical rule: lowest `attached / weight`, a
24010
+ * constant node order at a tie (D37). An idle node always ties at 0, so a
24011
+ * weight only bites once a node already holds a session.
24012
+ * - `share` — the share of PARALLEL sessions is held to the weights, and a
24013
+ * full or drowning node yields to a free one (D748).
24014
+ */
24015
+ var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
24016
+ var LoadBalancingSharesInputSchema = object({
24017
+ /** nodeId → share (> 0). A node left out keeps its weight. */
24018
+ nodes: record(string(), number().positive()).default({}),
24019
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
24020
+ devices: record(string(), record(string(), number().positive())).default({})
24021
+ });
24022
+ var PlacementStatsInputSchema = object({
24023
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
24024
+ windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
24025
+ var PlacementDeviceStatsSchema = object({
24026
+ deviceKey: string(),
24027
+ /** Sessions running on this device now. */
24028
+ sessionsNow: number(),
24029
+ /** Sessions started on this device inside the window. */
24030
+ sessionsStarted: number(),
24031
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
24032
+ observedShare: number().nullable()
24033
+ });
24034
+ var PlacementNodeStatsSchema = object({
24035
+ nodeId: string(),
24036
+ sessionsNow: number(),
24037
+ sessionsStarted: number(),
24038
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
24039
+ observedShare: number().nullable(),
24040
+ /** Most sessions this node ran at once inside the window. */
24041
+ peakSessions: number(),
24042
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
24043
+ yieldsAway: number(),
24044
+ devices: array(PlacementDeviceStatsSchema).readonly()
24045
+ });
24046
+ /** A camera's device pin that the session path cannot honour. */
24047
+ var StaleDevicePinSchema = object({
24048
+ deviceId: number(),
24049
+ deviceKey: string(),
24050
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
24051
+ reason: _enum(["disabled", "absent"])
24052
+ });
24053
+ var PlacementStatsSchema = object({
24054
+ policy: SessionPlacementPolicySchema,
24055
+ windowMs: number(),
24056
+ /** How much of the window was actually observed (the hub keeps it in memory). */
24057
+ observedForMs: number(),
24058
+ sessionsNow: number(),
24059
+ /** Most parallel sessions across the cluster inside the window. */
24060
+ clusterPeakSessions: number(),
24061
+ nodes: array(PlacementNodeStatsSchema).readonly(),
24062
+ stalePins: array(StaleDevicePinSchema).readonly()
24063
+ });
24064
+ /**
24065
+ * Where an automatic share's capacity comes from (D755).
24066
+ * - `hardware` — the static capacity of each device at its Auto tune model:
24067
+ * the measured latency table for the node's hardware class.
24068
+ * - `benchmark` — the node's own measured capacity (node benchmark results).
24069
+ * A node with no results falls back to `hardware`, and says so.
24070
+ */
24071
+ var CapacitySourceSchema = _enum(["hardware", "benchmark"]);
24072
+ /** Why a node under the `benchmark` source was sized from hardware instead. */
24073
+ var CapacityFallbackSchema = _enum(["no-benchmark-results", "partial-benchmark-results"]);
24074
+ var SuggestSharesInputSchema = object({
24075
+ headroom: number().min(.3).max(.5).default(.4),
24076
+ /** Default `hardware`. */
24077
+ source: CapacitySourceSchema.default("hardware")
24078
+ });
24079
+ var SuggestedDeviceShareSchema = object({
24080
+ deviceKey: string(),
24081
+ /** Share of the node (0–100, rounded). */
24082
+ share: number(),
24083
+ modelId: string().nullable(),
24084
+ /** Inferences per second at that model, from the measured table; null when sized by a benchmark. */
24085
+ fps: number().nullable(),
24086
+ /** False for a table cell derived from another chip; true for a measured cell or a benchmark. */
24087
+ measured: boolean(),
24088
+ /**
24089
+ * Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋ from the table,
24090
+ * or the benchmark's measured max sessions. Never enforced.
24091
+ */
24092
+ suggestedMaxSessions: number().nullable()
24093
+ });
24094
+ var SuggestedNodeShareSchema = object({
24095
+ nodeId: string(),
24096
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
24097
+ share: number().nullable(),
24098
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
24099
+ capacitySessions: number(),
24100
+ devices: array(SuggestedDeviceShareSchema).readonly(),
24101
+ skippedReason: string().nullable(),
24102
+ /** What this node's capacity was read from; null when the node is skipped. */
24103
+ capacitySource: CapacitySourceSchema.nullable(),
24104
+ /** Set when the `benchmark` source was asked for and this node used `hardware`. */
24105
+ capacityFallback: CapacityFallbackSchema.nullable()
24106
+ });
24107
+ var SuggestSharesResultSchema = object({
24108
+ headroom: number(),
24109
+ /** The source asked for; each node says what it actually used. */
24110
+ source: CapacitySourceSchema,
24111
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
24112
+ cameraFps: number(),
24113
+ /** The Auto tune capacity floor the models were picked at. */
24114
+ minSessionsPerDevice: number(),
24115
+ nodes: array(SuggestedNodeShareSchema).readonly()
24116
+ });
24117
+ /**
24118
+ * Where the node and device shares come from (D750, D755).
24119
+ * - `hardware` (default) — computed by the system from each node's static
24120
+ * capacity (its accelerators at their Auto tune models, from the measured
24121
+ * latency table), recomputed whenever a node or device joins, leaves, is
24122
+ * switched on or off, or changes model. No load input.
24123
+ * - `benchmark` — the same, from each node's measured capacity (node
24124
+ * benchmark results); a node without results falls back to `hardware`.
24125
+ * - `manual` — the operator's stored sliders.
24126
+ * Either way a node or device that cannot take sessions gives its share to
24127
+ * the others in proportion; the stored values are never rewritten for that.
24128
+ */
24129
+ var ShareSourceSchema = _enum([
24130
+ "hardware",
24131
+ "benchmark",
24132
+ "manual"
24133
+ ]);
24134
+ var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
24135
+ object({
24136
+ nodes: record(string(), number()),
24137
+ devices: record(string(), record(string(), number()))
24138
+ });
24139
+ var EffectiveDeviceShareSchema = object({
24140
+ deviceKey: string(),
24141
+ /** Can take sessions now (enabled, available, can run the root). */
24142
+ eligible: boolean(),
24143
+ /** The share the source assigns, as a percentage of the node's devices. */
24144
+ configuredPct: number(),
24145
+ /** The share actually used, after an ineligible device's share went to the others. */
24146
+ effectivePct: number()
24147
+ });
24148
+ var EffectiveNodeShareSchema = object({
24149
+ nodeId: string(),
24150
+ eligible: boolean(),
24151
+ configuredPct: number(),
24152
+ effectivePct: number(),
24153
+ /** Automatic sources: what this node's share was computed from; null under `manual` or before the first answer. */
24154
+ capacitySource: CapacitySourceSchema.nullable(),
24155
+ /** Automatic `benchmark`: why this node used `hardware` instead. */
24156
+ capacityFallback: CapacityFallbackSchema.nullable(),
24157
+ devices: array(EffectiveDeviceShareSchema).readonly()
24158
+ });
24159
+ var EffectiveSharesSchema = object({
24160
+ source: ShareSourceSchema,
24161
+ policy: SessionPlacementPolicySchema,
24162
+ /** An automatic source with no computed answer yet: the stored sliders are used meanwhile. */
24163
+ autoPending: boolean(),
24164
+ /** When the automatic shares were last computed (ms epoch); null = never. */
24165
+ computedAt: number().nullable(),
24166
+ /** What made the system recompute them last. */
24167
+ trigger: string().nullable(),
24168
+ nodes: array(EffectiveNodeShareSchema).readonly(),
24169
+ /** The relative weights the election reads (before eligibility). */
24170
+ nodeWeights: record(string(), number()),
24171
+ deviceWeights: record(string(), record(string(), number()))
24172
+ });
23845
24173
  object({
23846
24174
  activeCameras: number(),
23847
24175
  throttledCameras: number(),
@@ -24759,14 +25087,15 @@ var RunnerLocalLoadSchema = object({
24759
25087
  * Per-inference-device live load (multi-device C4). One entry per deviceKey
24760
25088
  * this runner currently has attached cameras on, so the orchestrator's second
24761
25089
  * `balance()` pass (over a node's devices) weights on real per-pool session
24762
- * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
24763
- * per device is 0 until the pool backlog gets a public accessor (follow-up).
25090
+ * counts. Empty on single-device / pre-multi-device runners. There is no
25091
+ * per-device queue depth: the inference pool's backlog has no accessor, and
25092
+ * a field that always read 0 was removed rather than shown as a measurement
25093
+ * (D762).
24764
25094
  */
24765
25095
  devices: array(object({
24766
25096
  deviceKey: string(),
24767
25097
  backend: string(),
24768
- attachedCameras: number(),
24769
- queueDepthTotal: number()
25098
+ attachedCameras: number()
24770
25099
  })).default([]),
24771
25100
  /** Hardware capability flags reported by this node. */
24772
25101
  hardware: object({
@@ -24902,7 +25231,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
24902
25231
  */
24903
25232
  cropJpeg: string().optional(),
24904
25233
  parent: DetailParentSchema,
24905
- steps: array(string()).optional()
25234
+ steps: array(string()).optional(),
25235
+ /**
25236
+ * The camera's root model already drew this step's boxes (D730): a
25237
+ * `license_plate` inside the parent vehicle. The named step is NOT
25238
+ * inferred — these FRAME-space boxes are its output — and its
25239
+ * requested children (the plate reader) run on them. Absent ⇒ every
25240
+ * requested step infers as before.
25241
+ */
25242
+ supplied: object({
25243
+ stepId: string(),
25244
+ modelId: string(),
25245
+ boxes: array(object({
25246
+ bbox: NativeCropBboxSchema,
25247
+ score: number()
25248
+ })).min(1)
25249
+ }).optional()
24906
25250
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
24907
25251
  /** Catalog step id, e.g. `clip-embedding`. */
24908
25252
  stepId: string(),
@@ -24965,14 +25309,6 @@ var CameraPipelineConfigSchema = object({
24965
25309
  settings: record(string(), unknown()).readonly().optional()
24966
25310
  }).nullable().optional()
24967
25311
  });
24968
- var PipelineTemplateSchema = object({
24969
- id: string(),
24970
- name: string(),
24971
- description: string().optional(),
24972
- config: CameraPipelineConfigSchema,
24973
- createdAt: string(),
24974
- updatedAt: string()
24975
- });
24976
25312
  var DeviceStepConfigSchema = object({
24977
25313
  modelId: string().optional(),
24978
25314
  settings: record(string(), unknown()).optional(),
@@ -25046,9 +25382,10 @@ var CameraStepOverridePatchSchema = object({
25046
25382
  modelId: string().optional(),
25047
25383
  settings: record(string(), unknown()).readonly().optional()
25048
25384
  });
25385
+ var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
25049
25386
  var CameraPipelineSettingsSchema = object({
25050
- pinnedAgentNodeId: string().optional(),
25051
25387
  stepToggles: record(string(), boolean()).optional(),
25388
+ stepSettings: CameraStepSettingsSchema.optional(),
25052
25389
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
25053
25390
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
25054
25391
  });
@@ -25081,7 +25418,10 @@ var PipelineAssignmentSchema = object({
25081
25418
  });
25082
25419
  /**
25083
25420
  * Per-agent load summary surfaced to the load balancer + dashboards.
25084
- * Aggregated from each runner's `getLocalLoad` cap call.
25421
+ * Aggregated from each runner's `getLocalLoad` cap call. In the
25422
+ * `getAgentLoad` report, a single-device node's default-pool sessions (no
25423
+ * `deviceKey`) are credited to its one eligible device in `load.devices` —
25424
+ * the default pool IS that device (D745); the balancer's census stays raw.
25085
25425
  */
25086
25426
  var AgentLoadSummarySchema = object({
25087
25427
  nodeId: string(),
@@ -25170,26 +25510,27 @@ var CameraBrokerStatusSchema = object({
25170
25510
  width: number(),
25171
25511
  height: number(),
25172
25512
  subscribers: number(),
25173
- inFps: number(),
25174
- outFps: number()
25513
+ /**
25514
+ * Encoded packets/s the broker receives from the camera. null when the
25515
+ * broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
25516
+ * There is no output rate: decoding runs in the session decode workers, not
25517
+ * in the broker, so the broker's own decoded-frame rate is 0 on every live
25518
+ * camera and is not served (D758).
25519
+ */
25520
+ inFps: number().nullable()
25175
25521
  })).readonly(),
25176
25522
  webrtcSessions: number(),
25177
25523
  rtspRestream: boolean()
25178
25524
  });
25179
- /** Shared-memory ring statistics within the decoder block. */
25180
- var CameraDecoderShmSchema = object({
25181
- framesWritten: number(),
25182
- getFrameHits: number(),
25183
- getFrameMisses: number(),
25184
- budgetMb: number()
25185
- });
25186
- /** Decoder block — null when the decoder stage is unreachable or inactive. */
25187
- var CameraDecoderStatusSchema = object({
25188
- nodeId: string(),
25189
- formats: array(string()).readonly(),
25190
- sessionCount: number(),
25191
- shm: CameraDecoderShmSchema
25192
- });
25525
+ /**
25526
+ * Decoder block — WHERE decode runs (co-located with the detection node by
25527
+ * construction); null when the camera has no detection node. It carries no
25528
+ * frame counter: the shared-memory plane whose counters it used to serve is
25529
+ * gone, and those fields read 0 forever. Whether frames actually flow is read
25530
+ * from `detection.actualFps` (frames delivered to and processed by the
25531
+ * detector), never from a counter nothing feeds.
25532
+ */
25533
+ var CameraDecoderStatusSchema = object({ nodeId: string() });
25193
25534
  /** Motion block — null when motion detection is not active for this device. */
25194
25535
  var CameraMotionStatusSchema = object({
25195
25536
  enabled: boolean(),
@@ -25546,12 +25887,6 @@ method(object({
25546
25887
  }), object({ success: literal(true) }), {
25547
25888
  kind: "mutation",
25548
25889
  auth: "admin"
25549
- }), method(object({
25550
- agentNodeId: string(),
25551
- detectWeight: number().positive().nullable()
25552
- }), object({ success: literal(true) }), {
25553
- kind: "mutation",
25554
- auth: "admin"
25555
25890
  }), method(object({
25556
25891
  agentNodeId: string(),
25557
25892
  detect: boolean().nullable().optional(),
@@ -25593,6 +25928,15 @@ method(object({
25593
25928
  }), {
25594
25929
  kind: "mutation",
25595
25930
  auth: "admin"
25931
+ }), method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }), method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
25932
+ kind: "mutation",
25933
+ auth: "admin"
25934
+ }), method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
25935
+ kind: "mutation",
25936
+ auth: "admin"
25937
+ }), method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }), method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }), method(_void(), EffectiveSharesSchema, { auth: "admin" }), method(SetShareSourceInputSchema, object({ success: literal(true) }), {
25938
+ kind: "mutation",
25939
+ auth: "admin"
25596
25940
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
25597
25941
  deviceId: number(),
25598
25942
  addonId: string(),
@@ -25609,6 +25953,13 @@ method(object({
25609
25953
  }), object({ success: literal(true) }), {
25610
25954
  kind: "mutation",
25611
25955
  auth: "admin"
25956
+ }), method(object({
25957
+ deviceId: number(),
25958
+ addonId: string(),
25959
+ settings: record(string(), unknown()).nullable()
25960
+ }), object({ success: literal(true) }), {
25961
+ kind: "mutation",
25962
+ auth: "admin"
25612
25963
  }), method(object({
25613
25964
  deviceId: number(),
25614
25965
  agentNodeId: string(),
@@ -25632,25 +25983,7 @@ method(object({
25632
25983
  }), method(_void(), DiskReconcileJobSchema, {
25633
25984
  kind: "mutation",
25634
25985
  auth: "admin"
25635
- }), method(_void(), DiskReconcileJobSchema, { auth: "admin" }), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
25636
- name: string(),
25637
- description: string().optional(),
25638
- config: CameraPipelineConfigSchema
25639
- }), PipelineTemplateSchema, {
25640
- kind: "mutation",
25641
- auth: "admin"
25642
- }), method(object({
25643
- id: string(),
25644
- name: string().optional(),
25645
- description: string().optional(),
25646
- config: CameraPipelineConfigSchema.optional()
25647
- }), PipelineTemplateSchema, {
25648
- kind: "mutation",
25649
- auth: "admin"
25650
- }), method(object({ id: string() }), object({ success: literal(true) }), {
25651
- kind: "mutation",
25652
- auth: "admin"
25653
- });
25986
+ }), method(_void(), DiskReconcileJobSchema, { auth: "admin" });
25654
25987
  /**
25655
25988
  * Cap → event-kind mapping for the SENSOR / CONTROL cap families — the table
25656
25989
  * `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
@@ -28003,8 +28336,6 @@ var WebrtcStreamChoiceSchema = object({
28003
28336
  ]).nullable(),
28004
28337
  /** Input FPS from the camera (null for adaptive). */
28005
28338
  inputFps: number().nullable(),
28006
- /** Decoded FPS (null for adaptive). */
28007
- decodeFps: number().nullable(),
28008
28339
  /** Bitrate in kbps (null for adaptive). */
28009
28340
  bitrateKbps: number().nullable()
28010
28341
  });
@@ -28336,6 +28667,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28336
28667
  */
28337
28668
  alive: boolean()
28338
28669
  })), method(object({
28670
+ deviceId: number().int().nonnegative(),
28671
+ sessionId: string(),
28672
+ downlinkMbps: number().nonnegative()
28673
+ }), object({
28674
+ outcome: _enum(["switching", "held"]),
28675
+ tier: CamProfileSchema.nullable(),
28676
+ reason: string()
28677
+ }), { kind: "mutation" }), method(object({
28339
28678
  deviceId: number().int().nonnegative(),
28340
28679
  sessionId: string()
28341
28680
  }), WebrtcSessionDebugSchema, { kind: "query" });
@@ -32155,7 +32494,8 @@ var ConnectionEndpointSchema = object({
32155
32494
  "lan-ipv6",
32156
32495
  "public",
32157
32496
  "loopback",
32158
- "app-link"
32497
+ "app-link",
32498
+ "custom"
32159
32499
  ]),
32160
32500
  /**
32161
32501
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -32224,7 +32564,7 @@ var GetConnectionEndpointsResultSchema = object({
32224
32564
  localPort: AdvertisedLocalPortSchema
32225
32565
  });
32226
32566
  /**
32227
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
32567
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
32228
32568
  * since D709 is the CamStack app link; `resolved` reports the effective value,
32229
32569
  * so the UI can show it either way.
32230
32570
  */
@@ -32257,6 +32597,72 @@ var ViewerEndpointsSchema = object({
32257
32597
  /** What the ranking currently resolves to (may be empty if nothing is up). */
32258
32598
  resolved: array(string()).readonly()
32259
32599
  });
32600
+ /**
32601
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
32602
+ * for addons built against it): `cluster` is the `internal` role, `browser`
32603
+ * the `publicEndpoint` role; `override` is the flagged address.
32604
+ */
32605
+ var HubAddressSnapshotSchema = object({
32606
+ override: string().nullable(),
32607
+ resolved: string().nullable(),
32608
+ source: _enum([
32609
+ "override",
32610
+ "auto",
32611
+ "none"
32612
+ ])
32613
+ });
32614
+ var HubAddressesSchema = object({
32615
+ cluster: HubAddressSnapshotSchema,
32616
+ browser: HubAddressSnapshotSchema
32617
+ });
32618
+ /**
32619
+ * What an address is used for (`hub-address.ts`, D734). `appConnections` is
32620
+ * many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
32621
+ * by at most one address.
32622
+ */
32623
+ var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
32624
+ var RoleSourceSchema = _enum([
32625
+ "flagged",
32626
+ "auto",
32627
+ "none"
32628
+ ]);
32629
+ /** One single-valued role: the flagged address, the one in use, and why. */
32630
+ var HubAddressRoleResolutionSchema = object({
32631
+ /** The address carrying the flag, or null = automatic. */
32632
+ flagged: string().nullable(),
32633
+ /** The address in use, or null when nothing qualifies (never loopback). */
32634
+ resolved: string().nullable(),
32635
+ source: RoleSourceSchema
32636
+ });
32637
+ var HubAppConnectionsResolutionSchema = object({
32638
+ /** The addresses flagged `appConnections`, or empty = automatic. */
32639
+ flagged: array(string()).readonly(),
32640
+ /** What the apps race right now. */
32641
+ resolved: array(string()).readonly(),
32642
+ source: RoleSourceSchema
32643
+ });
32644
+ var HubAddressBookSchema = object({
32645
+ rows: array(ConnectionEndpointSchema.extend({
32646
+ /** In the hub's detected palette right now. */
32647
+ detected: boolean(),
32648
+ /** Entered by the operator (removable). */
32649
+ custom: boolean(),
32650
+ /** The roles explicitly flagged on this address. */
32651
+ flags: array(HubAddressRoleSchema).readonly(),
32652
+ /** The roles this address serves right now — flagged or automatic. */
32653
+ inUse: array(HubAddressRoleSchema).readonly(),
32654
+ /** The roles this address may be flagged with. */
32655
+ eligible: array(HubAddressRoleSchema).readonly()
32656
+ })).readonly(),
32657
+ roles: object({
32658
+ appConnections: HubAppConnectionsResolutionSchema,
32659
+ notificationTaps: HubAddressRoleResolutionSchema,
32660
+ internal: HubAddressRoleResolutionSchema,
32661
+ publicEndpoint: HubAddressRoleResolutionSchema
32662
+ }),
32663
+ /** The `hub=` an app link carries (D709), or null. */
32664
+ appLinkHub: string().nullable()
32665
+ });
32260
32666
  var AllowedAddressesSchema = object({
32261
32667
  /**
32262
32668
  * Allowlist of interface addresses operators have explicitly opted
@@ -32300,10 +32706,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
32300
32706
  * tunnel always emits `https://` regardless. */
32301
32707
  scheme: _enum(["http", "https"]).optional(),
32302
32708
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
32303
- * an address notification links can be flagged with, not a hub
32709
+ * an address notification taps can be flagged with, not a hub
32304
32710
  * route. Default `false`: racers and rankers never see it. */
32305
32711
  includeAppLink: boolean().optional()
32306
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
32712
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema), method(object({
32713
+ baseUrl: string(),
32714
+ label: string().max(80)
32715
+ }), HubAddressBookSchema, {
32716
+ kind: "mutation",
32717
+ auth: "admin"
32718
+ }), method(object({ baseUrl: string() }), HubAddressBookSchema, {
32719
+ kind: "mutation",
32720
+ auth: "admin"
32721
+ }), method(object({
32722
+ role: HubAddressRoleSchema,
32723
+ baseUrl: string().nullable(),
32724
+ enabled: boolean(),
32725
+ acceptInsecureHttp: boolean().optional()
32726
+ }), HubAddressBookSchema, {
32727
+ kind: "mutation",
32728
+ auth: "admin"
32729
+ }), method(_void(), HubAddressesSchema), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
32307
32730
  kind: "mutation",
32308
32731
  auth: "admin"
32309
32732
  }), method(object({
@@ -39309,6 +39732,16 @@ var zoneRulesCapability = {
39309
39732
  durability: "restored"
39310
39733
  };
39311
39734
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
39735
+ Object.freeze({
39736
+ person: .5,
39737
+ vehicle: .5,
39738
+ animal: .5
39739
+ });
39740
+ Object.freeze({
39741
+ person: .65,
39742
+ vehicle: .65,
39743
+ animal: .65
39744
+ });
39312
39745
  /**
39313
39746
  * Accessory device helpers — shared across drivers.
39314
39747
  *
@@ -42189,90 +42622,18 @@ Object.freeze({
42189
42622
  addonId: null,
42190
42623
  access: "create"
42191
42624
  },
42192
- "decoder.createSession": {
42193
- capName: "decoder",
42194
- capScope: "system",
42195
- addonId: null,
42196
- access: "view"
42197
- },
42198
- "decoder.destroySession": {
42199
- capName: "decoder",
42200
- capScope: "system",
42201
- addonId: null,
42202
- access: "delete"
42203
- },
42204
- "decoder.getFrame": {
42205
- capName: "decoder",
42206
- capScope: "system",
42207
- addonId: null,
42208
- access: "view"
42209
- },
42210
42625
  "decoder.getInfo": {
42211
42626
  capName: "decoder",
42212
42627
  capScope: "system",
42213
42628
  addonId: null,
42214
42629
  access: "view"
42215
42630
  },
42216
- "decoder.getShmStats": {
42217
- capName: "decoder",
42218
- capScope: "system",
42219
- addonId: null,
42220
- access: "view"
42221
- },
42222
- "decoder.getStats": {
42223
- capName: "decoder",
42224
- capScope: "system",
42225
- addonId: null,
42226
- access: "view"
42227
- },
42228
- "decoder.listActiveSessions": {
42229
- capName: "decoder",
42230
- capScope: "system",
42231
- addonId: null,
42232
- access: "view"
42233
- },
42234
- "decoder.openStream": {
42235
- capName: "decoder",
42236
- capScope: "system",
42237
- addonId: null,
42238
- access: "view"
42239
- },
42240
- "decoder.pullFrames": {
42241
- capName: "decoder",
42242
- capScope: "system",
42243
- addonId: null,
42244
- access: "view"
42245
- },
42246
- "decoder.pullHandles": {
42247
- capName: "decoder",
42248
- capScope: "system",
42249
- addonId: null,
42250
- access: "view"
42251
- },
42252
- "decoder.pushPacket": {
42253
- capName: "decoder",
42254
- capScope: "system",
42255
- addonId: null,
42256
- access: "view"
42257
- },
42258
42631
  "decoder.reprobeHwaccel": {
42259
42632
  capName: "decoder",
42260
42633
  capScope: "system",
42261
42634
  addonId: null,
42262
42635
  access: "create"
42263
42636
  },
42264
- "decoder.supportsCodec": {
42265
- capName: "decoder",
42266
- capScope: "system",
42267
- addonId: null,
42268
- access: "view"
42269
- },
42270
- "decoder.updateConfig": {
42271
- capName: "decoder",
42272
- capScope: "system",
42273
- addonId: null,
42274
- access: "view"
42275
- },
42276
42637
  "detectionPipeline.applyDeviceSettingsPatch": {
42277
42638
  capName: "detection-pipeline",
42278
42639
  capScope: "device",
@@ -43761,12 +44122,24 @@ Object.freeze({
43761
44122
  addonId: null,
43762
44123
  access: "view"
43763
44124
  },
44125
+ "localNetwork.addCustomAddress": {
44126
+ capName: "local-network",
44127
+ capScope: "system",
44128
+ addonId: null,
44129
+ access: "create"
44130
+ },
43764
44131
  "localNetwork.downloadCa": {
43765
44132
  capName: "local-network",
43766
44133
  capScope: "system",
43767
44134
  addonId: null,
43768
44135
  access: "view"
43769
44136
  },
44137
+ "localNetwork.getAddresses": {
44138
+ capName: "local-network",
44139
+ capScope: "system",
44140
+ addonId: null,
44141
+ access: "view"
44142
+ },
43770
44143
  "localNetwork.getAllowedAddresses": {
43771
44144
  capName: "local-network",
43772
44145
  capScope: "system",
@@ -43779,6 +44152,12 @@ Object.freeze({
43779
44152
  addonId: null,
43780
44153
  access: "view"
43781
44154
  },
44155
+ "localNetwork.getHubAddresses": {
44156
+ capName: "local-network",
44157
+ capScope: "system",
44158
+ addonId: null,
44159
+ access: "view"
44160
+ },
43782
44161
  "localNetwork.getNotificationEndpoint": {
43783
44162
  capName: "local-network",
43784
44163
  capScope: "system",
@@ -43815,6 +44194,12 @@ Object.freeze({
43815
44194
  addonId: null,
43816
44195
  access: "create"
43817
44196
  },
44197
+ "localNetwork.removeCustomAddress": {
44198
+ capName: "local-network",
44199
+ capScope: "system",
44200
+ addonId: null,
44201
+ access: "delete"
44202
+ },
43818
44203
  "localNetwork.resetAllowlistToBestMatch": {
43819
44204
  capName: "local-network",
43820
44205
  capScope: "system",
@@ -43827,6 +44212,12 @@ Object.freeze({
43827
44212
  addonId: null,
43828
44213
  access: "create"
43829
44214
  },
44215
+ "localNetwork.setAddressRole": {
44216
+ capName: "local-network",
44217
+ capScope: "system",
44218
+ addonId: null,
44219
+ access: "create"
44220
+ },
43830
44221
  "localNetwork.setAllowedAddresses": {
43831
44222
  capName: "local-network",
43832
44223
  capScope: "system",
@@ -45321,13 +45712,13 @@ Object.freeze({
45321
45712
  addonId: null,
45322
45713
  access: "delete"
45323
45714
  },
45324
- "pipelineExecutor.deleteModel": {
45715
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
45325
45716
  capName: "pipeline-executor",
45326
45717
  capScope: "system",
45327
45718
  addonId: null,
45328
45719
  access: "delete"
45329
45720
  },
45330
- "pipelineExecutor.deleteTemplate": {
45721
+ "pipelineExecutor.deleteModel": {
45331
45722
  capName: "pipeline-executor",
45332
45723
  capScope: "system",
45333
45724
  addonId: null,
@@ -45471,12 +45862,6 @@ Object.freeze({
45471
45862
  addonId: null,
45472
45863
  access: "view"
45473
45864
  },
45474
- "pipelineExecutor.listTemplates": {
45475
- capName: "pipeline-executor",
45476
- capScope: "system",
45477
- addonId: null,
45478
- access: "view"
45479
- },
45480
45865
  "pipelineExecutor.rearmInferenceDevice": {
45481
45866
  capName: "pipeline-executor",
45482
45867
  capScope: "system",
@@ -45501,12 +45886,6 @@ Object.freeze({
45501
45886
  addonId: null,
45502
45887
  access: "create"
45503
45888
  },
45504
- "pipelineExecutor.saveTemplate": {
45505
- capName: "pipeline-executor",
45506
- capScope: "system",
45507
- addonId: null,
45508
- access: "create"
45509
- },
45510
45889
  "pipelineExecutor.setVideoPipelineSteps": {
45511
45890
  capName: "pipeline-executor",
45512
45891
  capScope: "system",
@@ -45525,41 +45904,35 @@ Object.freeze({
45525
45904
  addonId: null,
45526
45905
  access: "create"
45527
45906
  },
45528
- "pipelineExecutor.updateTemplate": {
45529
- capName: "pipeline-executor",
45530
- capScope: "system",
45531
- addonId: null,
45532
- access: "create"
45533
- },
45534
45907
  "pipelineExecutor.validatePipeline": {
45535
45908
  capName: "pipeline-executor",
45536
45909
  capScope: "system",
45537
45910
  addonId: null,
45538
45911
  access: "view"
45539
45912
  },
45540
- "pipelineOrchestrator.applyDeviceSettingsPatch": {
45913
+ "pipelineOrchestrator.applyAutoTune": {
45541
45914
  capName: "pipeline-orchestrator",
45542
45915
  capScope: "system",
45543
45916
  addonId: null,
45544
45917
  access: "create"
45545
45918
  },
45546
- "pipelineOrchestrator.assignAudio": {
45919
+ "pipelineOrchestrator.applyDeviceSettingsPatch": {
45547
45920
  capName: "pipeline-orchestrator",
45548
45921
  capScope: "system",
45549
45922
  addonId: null,
45550
45923
  access: "create"
45551
45924
  },
45552
- "pipelineOrchestrator.assignPipeline": {
45925
+ "pipelineOrchestrator.assignAudio": {
45553
45926
  capName: "pipeline-orchestrator",
45554
45927
  capScope: "system",
45555
45928
  addonId: null,
45556
45929
  access: "create"
45557
45930
  },
45558
- "pipelineOrchestrator.deleteTemplate": {
45931
+ "pipelineOrchestrator.assignPipeline": {
45559
45932
  capName: "pipeline-orchestrator",
45560
45933
  capScope: "system",
45561
45934
  addonId: null,
45562
- access: "delete"
45935
+ access: "create"
45563
45936
  },
45564
45937
  "pipelineOrchestrator.getAgentLoad": {
45565
45938
  capName: "pipeline-orchestrator",
@@ -45651,6 +46024,12 @@ Object.freeze({
45651
46024
  addonId: null,
45652
46025
  access: "view"
45653
46026
  },
46027
+ "pipelineOrchestrator.getEffectiveShares": {
46028
+ capName: "pipeline-orchestrator",
46029
+ capScope: "system",
46030
+ addonId: null,
46031
+ access: "view"
46032
+ },
45654
46033
  "pipelineOrchestrator.getGlobalMetrics": {
45655
46034
  capName: "pipeline-orchestrator",
45656
46035
  capScope: "system",
@@ -45687,19 +46066,19 @@ Object.freeze({
45687
46066
  addonId: null,
45688
46067
  access: "view"
45689
46068
  },
45690
- "pipelineOrchestrator.getReconcileFromDiskStatus": {
46069
+ "pipelineOrchestrator.getPlacementStats": {
45691
46070
  capName: "pipeline-orchestrator",
45692
46071
  capScope: "system",
45693
46072
  addonId: null,
45694
46073
  access: "view"
45695
46074
  },
45696
- "pipelineOrchestrator.listAgentSettings": {
46075
+ "pipelineOrchestrator.getReconcileFromDiskStatus": {
45697
46076
  capName: "pipeline-orchestrator",
45698
46077
  capScope: "system",
45699
46078
  addonId: null,
45700
46079
  access: "view"
45701
46080
  },
45702
- "pipelineOrchestrator.listTemplates": {
46081
+ "pipelineOrchestrator.listAgentSettings": {
45703
46082
  capName: "pipeline-orchestrator",
45704
46083
  capScope: "system",
45705
46084
  addonId: null,
@@ -45711,6 +46090,12 @@ Object.freeze({
45711
46090
  addonId: null,
45712
46091
  access: "create"
45713
46092
  },
46093
+ "pipelineOrchestrator.planAutoTune": {
46094
+ capName: "pipeline-orchestrator",
46095
+ capScope: "system",
46096
+ addonId: null,
46097
+ access: "view"
46098
+ },
45714
46099
  "pipelineOrchestrator.rebalance": {
45715
46100
  capName: "pipeline-orchestrator",
45716
46101
  capScope: "system",
@@ -45753,12 +46138,6 @@ Object.freeze({
45753
46138
  addonId: null,
45754
46139
  access: "create"
45755
46140
  },
45756
- "pipelineOrchestrator.saveTemplate": {
45757
- capName: "pipeline-orchestrator",
45758
- capScope: "system",
45759
- addonId: null,
45760
- access: "create"
45761
- },
45762
46141
  "pipelineOrchestrator.setAgentCapabilities": {
45763
46142
  capName: "pipeline-orchestrator",
45764
46143
  capScope: "system",
@@ -45771,12 +46150,6 @@ Object.freeze({
45771
46150
  addonId: null,
45772
46151
  access: "create"
45773
46152
  },
45774
- "pipelineOrchestrator.setAgentDetectWeight": {
45775
- capName: "pipeline-orchestrator",
45776
- capScope: "system",
45777
- addonId: null,
45778
- access: "create"
45779
- },
45780
46153
  "pipelineOrchestrator.setAgentInferenceDevices": {
45781
46154
  capName: "pipeline-orchestrator",
45782
46155
  capScope: "system",
@@ -45813,6 +46186,12 @@ Object.freeze({
45813
46186
  addonId: null,
45814
46187
  access: "create"
45815
46188
  },
46189
+ "pipelineOrchestrator.setCameraStepSettings": {
46190
+ capName: "pipeline-orchestrator",
46191
+ capScope: "system",
46192
+ addonId: null,
46193
+ access: "create"
46194
+ },
45816
46195
  "pipelineOrchestrator.setCameraStepToggle": {
45817
46196
  capName: "pipeline-orchestrator",
45818
46197
  capScope: "system",
@@ -45831,25 +46210,37 @@ Object.freeze({
45831
46210
  addonId: null,
45832
46211
  access: "create"
45833
46212
  },
46213
+ "pipelineOrchestrator.setLoadBalancingShares": {
46214
+ capName: "pipeline-orchestrator",
46215
+ capScope: "system",
46216
+ addonId: null,
46217
+ access: "create"
46218
+ },
45834
46219
  "pipelineOrchestrator.setPipelineDevicePin": {
45835
46220
  capName: "pipeline-orchestrator",
45836
46221
  capScope: "system",
45837
46222
  addonId: null,
45838
46223
  access: "create"
45839
46224
  },
45840
- "pipelineOrchestrator.unassignAudio": {
46225
+ "pipelineOrchestrator.setShareSource": {
45841
46226
  capName: "pipeline-orchestrator",
45842
46227
  capScope: "system",
45843
46228
  addonId: null,
45844
46229
  access: "create"
45845
46230
  },
45846
- "pipelineOrchestrator.unassignPipeline": {
46231
+ "pipelineOrchestrator.suggestShares": {
46232
+ capName: "pipeline-orchestrator",
46233
+ capScope: "system",
46234
+ addonId: null,
46235
+ access: "view"
46236
+ },
46237
+ "pipelineOrchestrator.unassignAudio": {
45847
46238
  capName: "pipeline-orchestrator",
45848
46239
  capScope: "system",
45849
46240
  addonId: null,
45850
46241
  access: "create"
45851
46242
  },
45852
- "pipelineOrchestrator.updateTemplate": {
46243
+ "pipelineOrchestrator.unassignPipeline": {
45853
46244
  capName: "pipeline-orchestrator",
45854
46245
  capScope: "system",
45855
46246
  addonId: null,
@@ -47289,12 +47680,6 @@ Object.freeze({
47289
47680
  addonId: null,
47290
47681
  access: "view"
47291
47682
  },
47292
- "streamBroker.pullFrameHandles": {
47293
- capName: "stream-broker",
47294
- capScope: "system",
47295
- addonId: null,
47296
- access: "view"
47297
- },
47298
47683
  "streamBroker.regenerateRtspToken": {
47299
47684
  capName: "stream-broker",
47300
47685
  capScope: "system",
@@ -47361,12 +47746,6 @@ Object.freeze({
47361
47746
  addonId: null,
47362
47747
  access: "create"
47363
47748
  },
47364
- "streamBroker.subscribeFrames": {
47365
- capName: "stream-broker",
47366
- capScope: "system",
47367
- addonId: null,
47368
- access: "create"
47369
- },
47370
47749
  "streamBroker.unassignProfile": {
47371
47750
  capName: "stream-broker",
47372
47751
  capScope: "system",
@@ -47379,12 +47758,6 @@ Object.freeze({
47379
47758
  addonId: null,
47380
47759
  access: "create"
47381
47760
  },
47382
- "streamBroker.unsubscribeFrames": {
47383
- capName: "stream-broker",
47384
- capScope: "system",
47385
- addonId: null,
47386
- access: "create"
47387
- },
47388
47761
  "streamCatalog.getCatalog": {
47389
47762
  capName: "stream-catalog",
47390
47763
  capScope: "device",
@@ -48081,6 +48454,12 @@ Object.freeze({
48081
48454
  addonId: null,
48082
48455
  access: "create"
48083
48456
  },
48457
+ "webrtcSession.applyDownlinkProbe": {
48458
+ capName: "webrtc-session",
48459
+ capScope: "device",
48460
+ addonId: null,
48461
+ access: "create"
48462
+ },
48084
48463
  "webrtcSession.closeSession": {
48085
48464
  capName: "webrtc-session",
48086
48465
  capScope: "device",
@@ -49892,11 +50271,6 @@ Object.freeze({
49892
50271
  form: "single",
49893
50272
  optional: false
49894
50273
  }],
49895
- "decoder.createSession": [{
49896
- name: "deviceId",
49897
- form: "single",
49898
- optional: true
49899
- }],
49900
50274
  "detectionPipeline.applyDeviceSettingsPatch": [{
49901
50275
  name: "deviceId",
49902
50276
  form: "single",
@@ -51127,6 +51501,11 @@ Object.freeze({
51127
51501
  form: "single",
51128
51502
  optional: false
51129
51503
  }],
51504
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
51505
+ name: "deviceIds",
51506
+ form: "array",
51507
+ optional: true
51508
+ }],
51130
51509
  "pipelineExecutor.runPipeline": [{
51131
51510
  name: "deviceId",
51132
51511
  form: "single",
@@ -51232,6 +51611,11 @@ Object.freeze({
51232
51611
  form: "single",
51233
51612
  optional: false
51234
51613
  }],
51614
+ "pipelineOrchestrator.setCameraStepSettings": [{
51615
+ name: "deviceId",
51616
+ form: "single",
51617
+ optional: false
51618
+ }],
51235
51619
  "pipelineOrchestrator.setCameraStepToggle": [{
51236
51620
  name: "deviceId",
51237
51621
  form: "single",
@@ -52003,6 +52387,11 @@ Object.freeze({
52003
52387
  form: "single",
52004
52388
  optional: false
52005
52389
  }],
52390
+ "webrtcSession.applyDownlinkProbe": [{
52391
+ name: "deviceId",
52392
+ form: "single",
52393
+ optional: false
52394
+ }],
52006
52395
  "webrtcSession.closeSession": [{
52007
52396
  name: "deviceId",
52008
52397
  form: "single",
@@ -52536,7 +52925,7 @@ var STATE_SUMMARY_VARS = [
52536
52925
  {
52537
52926
  name: "summarySection",
52538
52927
  label: "Summary: this section",
52539
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
52928
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
52540
52929
  example: "Batterie scariche",
52541
52930
  group: "system",
52542
52931
  families: ["rule"],