@camstack/addon-export-alexa 1.2.130 → 1.2.132

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.
@@ -5379,7 +5379,7 @@ var ZodIssueCode = {
5379
5379
  var ZodFirstPartyTypeKind;
5380
5380
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5381
5381
  //#endregion
5382
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5382
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5383
5383
  /**
5384
5384
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5385
5385
  * window to float samples (D455).
@@ -10740,57 +10740,26 @@ var ClipSearchStrictnessSchema = _enum([
10740
10740
  "balanced",
10741
10741
  "strict"
10742
10742
  ]);
10743
- new Set([
10744
- {
10745
- id: "person",
10746
- name: "Person"
10747
- },
10748
- {
10749
- id: "vehicle",
10750
- name: "Vehicle"
10751
- },
10752
- {
10753
- id: "animal",
10754
- name: "Animal"
10755
- },
10756
- {
10757
- id: "package",
10758
- name: "Package"
10759
- }
10760
- ].map((l) => l.id));
10761
- var COCO_TO_MACRO = {
10762
- mapping: {
10763
- person: "person",
10764
- bicycle: "vehicle",
10765
- car: "vehicle",
10766
- motorcycle: "vehicle",
10767
- airplane: "vehicle",
10768
- bus: "vehicle",
10769
- train: "vehicle",
10770
- truck: "vehicle",
10771
- boat: "vehicle",
10772
- bird: "animal",
10773
- cat: "animal",
10774
- dog: "animal",
10775
- horse: "animal",
10776
- sheep: "animal",
10777
- cow: "animal",
10778
- elephant: "animal",
10779
- bear: "animal",
10780
- zebra: "animal",
10781
- giraffe: "animal",
10782
- suitcase: "package",
10783
- backpack: "package",
10784
- handbag: "package"
10785
- },
10786
- preserveOriginal: false
10787
- };
10788
- /** Steps a root detector may declare it fills. */
10789
- var FILLABLE_STEP_IDS = [
10743
+ /** Steps whose effect a root label can BE. */
10744
+ var LABEL_SUPPLY_STEP_IDS = [
10790
10745
  "animal-classifier",
10791
10746
  "vehicle-classifier",
10792
10747
  "package-detection"
10793
10748
  ];
10749
+ /** Steps whose box a root detection can BE. */
10750
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
10751
+ /**
10752
+ * Steps whose per-detection MASK a root detection can carry (D737). The live
10753
+ * mask step is `segmentation` — a frame-plane refiner that runs its own model
10754
+ * once per detection crop. (`instance-segmentation` is a dormant step id that
10755
+ * no camera tree carries.)
10756
+ */
10757
+ var MASK_SUPPLY_STEP_IDS = ["segmentation"];
10758
+ [
10759
+ ...LABEL_SUPPLY_STEP_IDS,
10760
+ ...CROP_SUPPLY_STEP_IDS,
10761
+ ...MASK_SUPPLY_STEP_IDS
10762
+ ];
10794
10763
  var MODEL_FORMATS = [
10795
10764
  "onnx",
10796
10765
  "coreml",
@@ -10819,7 +10788,53 @@ var ModelFormatEntrySchema = object({
10819
10788
  /** Multi-file payload (directory members or sibling files). */
10820
10789
  files: array(string()).readonly().optional(),
10821
10790
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
10822
- runtimes: array(_enum(["python"])).readonly().optional()
10791
+ runtimes: array(_enum(["python"])).readonly().optional(),
10792
+ /**
10793
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
10794
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
10795
+ * weight file) comes from the downloader's generated table, kept in step
10796
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
10797
+ * node records the revision it downloaded next to the file
10798
+ * (`<file>.revision`); a copy with no record or a different one is stale
10799
+ * unless its weight file hashes to the revision, and a stale copy is
10800
+ * downloaded again, the old one serving until the new one is complete. No
10801
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
10802
+ */
10803
+ revision: string().min(1).optional()
10804
+ });
10805
+ /**
10806
+ * What a node holds for one (model, format) (D746). `current` is a complete
10807
+ * copy at its catalog revision — exactly what `downloaded: true` means.
10808
+ * `stale` is bytes on disk that are not (yet) proven current under D743/D744:
10809
+ * no or a different revision record, or a missing sibling. `missing` is no
10810
+ * copy. `downloaded` alone folds `stale` into "not downloaded", which hid
10811
+ * reclaimable bytes and a copy about to be replaced.
10812
+ */
10813
+ var ModelOnDiskStateSchema = _enum([
10814
+ "current",
10815
+ "stale",
10816
+ "missing"
10817
+ ]);
10818
+ /**
10819
+ * The numeric precision of one format's BUILD (D746) — reported only when the
10820
+ * build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
10821
+ * CamStack Core ML export). Absent means "not stated", never "fp32".
10822
+ */
10823
+ var ModelFormatPrecisionSchema = _enum([
10824
+ "fp32",
10825
+ "fp16",
10826
+ "int8"
10827
+ ]);
10828
+ /**
10829
+ * One format of one model as a node's `pipelineExecutor.getSchema` reports it.
10830
+ * `onDisk` / `precision` are optional for version skew: a runner that predates
10831
+ * them omits them, and a reader falls back to `downloaded`.
10832
+ */
10833
+ var PipelineModelFormatStatusSchema = object({
10834
+ downloaded: boolean(),
10835
+ sizeMB: number(),
10836
+ onDisk: ModelOnDiskStateSchema.optional(),
10837
+ precision: ModelFormatPrecisionSchema.optional()
10823
10838
  });
10824
10839
  /**
10825
10840
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -10923,12 +10938,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10923
10938
  /** True when the weights or their data forbid commercial use. */
10924
10939
  nonCommercial: boolean().optional()
10925
10940
  }));
10926
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
10927
- var FillsClassifierEffectSchema = object({
10928
- stepId: _enum(FILLABLE_STEP_IDS),
10929
- labelToEffect: record(string(), string()),
10930
- uncovered: array(string()).readonly()
10931
- });
10941
+ /**
10942
+ * One step a ROOT detector can supply from its own output (D730) — see
10943
+ * `ModelCatalogEntry.suppliesSteps`.
10944
+ *
10945
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
10946
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
10947
+ * the root cannot produce (shown as unavailable, never a blocker).
10948
+ * - `crop`: the root draws the box the step would have found (`license_plate`
10949
+ * for plate-detection, `face` for face-detection). The box becomes a detail
10950
+ * child of the `parentMacro` detection that contains it — never a track.
10951
+ * - `mask`: the root's decode emits an instance mask with every detection (a
10952
+ * YOLO26-seg root, D737) — the `segmentation` step's result, carried on the
10953
+ * detection in the shape that step produces. Derived from the model's
10954
+ * postprocessor on read, never stored by an import.
10955
+ */
10956
+ var RootStepSupplySchema = discriminatedUnion("kind", [
10957
+ object({
10958
+ kind: literal("label"),
10959
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
10960
+ labelToEffect: record(string(), string()),
10961
+ uncovered: array(string()).readonly()
10962
+ }),
10963
+ object({
10964
+ kind: literal("crop"),
10965
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
10966
+ rootLabels: array(string()).readonly(),
10967
+ parentMacro: _enum(["vehicle", "person"]),
10968
+ childClass: _enum(["plate", "face"]),
10969
+ /**
10970
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
10971
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
10972
+ * stored by an import.
10973
+ */
10974
+ rootInputPx: number().int().positive().optional()
10975
+ }),
10976
+ object({
10977
+ kind: literal("mask"),
10978
+ stepId: _enum(MASK_SUPPLY_STEP_IDS)
10979
+ })
10980
+ ]);
10932
10981
  var ModelCatalogEntrySchema = object({
10933
10982
  id: string(),
10934
10983
  name: string(),
@@ -10994,6 +11043,35 @@ var ModelCatalogEntrySchema = object({
10994
11043
  */
10995
11044
  defaultConfidence: number().min(0).max(1).optional(),
10996
11045
  /**
11046
+ * Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
11047
+ * on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
11048
+ * absent here runs at the step slider's global default. The same row shape
11049
+ * the floor measurement produces (`model-floors.json`: modelId → floors), so
11050
+ * a measured table is copied in as-is. An operator override is bound to the
11051
+ * model it was made for and does not survive a model change (D738). A custom
11052
+ * / imported model may declare it; without it, the global defaults apply.
11053
+ */
11054
+ defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
11055
+ /**
11056
+ * The inference precision this model's OpenVINO IR needs on an Intel GPU.
11057
+ * Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
11058
+ * that produces invalid output at f16 — measured 2026-10-07 for YOLO26
11059
+ * base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
11060
+ * scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
11061
+ * `PoolModelConfig.gpuInferencePrecision`; the pool sets
11062
+ * INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
11063
+ */
11064
+ gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
11065
+ /**
11066
+ * ROOT detectors only: per supplied step (`animal-classifier`, …), the
11067
+ * minimum DETECTION score from which this root's own fine label (species,
11068
+ * vehicle type — D736 root supply) is taken (D741). Below it the detection
11069
+ * keeps its macro class without the fine label. `1` = never take it from
11070
+ * this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
11071
+ * `minConfidence` slider, bound to the ROOT model, overrides it.
11072
+ */
11073
+ suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
11074
+ /**
10997
11075
  * When true, the executor produces a landmark-aligned crop (similarity warp
10998
11076
  * onto the canonical template) before this step runs, instead of a plain
10999
11077
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -11055,15 +11133,15 @@ var ModelCatalogEntrySchema = object({
11055
11133
  */
11056
11134
  classMap: DetectionCatalogClassMapSchema.optional(),
11057
11135
  /**
11058
- * The pipeline steps this ROOT detector already does the work of (D715):
11059
- * its labels name the effect the step exists to produce (`deer` for
11060
- * `animal-classifier`, `package` for `package-detection`). Derived from the
11061
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
11062
- * declares none. Whether a declaration is honoured is the step's own
11063
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
11064
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
11136
+ * The pipeline steps this ROOT detector can supply from its own output
11137
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
11138
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
11139
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
11140
+ * by hand and never assumed per family; a row without it is derived on read
11141
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
11142
+ * `useRootModel` flag (`resolveRootSupply`).
11065
11143
  */
11066
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
11144
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
11067
11145
  /**
11068
11146
  * The model's CLIP feature-space contract (text encoder, dimension, vector
11069
11147
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -16274,6 +16352,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
16274
16352
  kind: "mutation",
16275
16353
  auth: "admin"
16276
16354
  });
16355
+ var HUB_ADDRESS_ROLES = [
16356
+ "appConnections",
16357
+ "notificationTaps",
16358
+ "internal",
16359
+ "publicEndpoint"
16360
+ ];
16277
16361
  /**
16278
16362
  * Transport bounds for AI capability methods.
16279
16363
  *
@@ -18036,6 +18120,51 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
18036
18120
  kind: "mutation",
18037
18121
  auth: "admin"
18038
18122
  });
18123
+ new Set([
18124
+ {
18125
+ id: "person",
18126
+ name: "Person"
18127
+ },
18128
+ {
18129
+ id: "vehicle",
18130
+ name: "Vehicle"
18131
+ },
18132
+ {
18133
+ id: "animal",
18134
+ name: "Animal"
18135
+ },
18136
+ {
18137
+ id: "package",
18138
+ name: "Package"
18139
+ }
18140
+ ].map((l) => l.id));
18141
+ var COCO_TO_MACRO = {
18142
+ mapping: {
18143
+ person: "person",
18144
+ bicycle: "vehicle",
18145
+ car: "vehicle",
18146
+ motorcycle: "vehicle",
18147
+ airplane: "vehicle",
18148
+ bus: "vehicle",
18149
+ train: "vehicle",
18150
+ truck: "vehicle",
18151
+ boat: "vehicle",
18152
+ bird: "animal",
18153
+ cat: "animal",
18154
+ dog: "animal",
18155
+ horse: "animal",
18156
+ sheep: "animal",
18157
+ cow: "animal",
18158
+ elephant: "animal",
18159
+ bear: "animal",
18160
+ zebra: "animal",
18161
+ giraffe: "animal",
18162
+ suitcase: "package",
18163
+ backpack: "package",
18164
+ handbag: "package"
18165
+ },
18166
+ preserveOriginal: false
18167
+ };
18039
18168
  var AUDIO_MACRO_LABELS = [
18040
18169
  {
18041
18170
  id: "speech",
@@ -18793,6 +18922,8 @@ var NcSystemEventKindSchema = _enum([
18793
18922
  "stream-offline",
18794
18923
  "node-online",
18795
18924
  "node-offline",
18925
+ "node-restarting",
18926
+ "node-updating",
18796
18927
  "node-inference-unavailable",
18797
18928
  "detection-blind",
18798
18929
  "addon-crash-loop",
@@ -20398,7 +20529,13 @@ var NcAlarmModeDelaysListSchema = array(object({
20398
20529
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20399
20530
  * is the one that starts the entry delay — the entry-delay notification already names it.
20400
20531
  */
20401
- notifySensorRewatched: boolean().optional()
20532
+ notifySensorRewatched: boolean().optional(),
20533
+ /**
20534
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
20535
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
20536
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
20537
+ */
20538
+ notifySensorIgnored: boolean().optional()
20402
20539
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20403
20540
  var NcAlarmModeDelaysEditListSchema = array(object({
20404
20541
  mode: AlarmArmModeSchema,
@@ -20411,7 +20548,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20411
20548
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20412
20549
  notifyDuringEntryDelay: boolean().nullable().optional(),
20413
20550
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20414
- notifySensorRewatched: boolean().nullable().optional()
20551
+ notifySensorRewatched: boolean().nullable().optional(),
20552
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
20553
+ notifySensorIgnored: boolean().nullable().optional()
20415
20554
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20416
20555
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20417
20556
  var NcAlarmNonBlockingEditSchema = object({
@@ -23326,6 +23465,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23326
23465
  timestamp: number()
23327
23466
  });
23328
23467
  /**
23468
+ * A root model's boxes standing in for one crop-kind step's own inference
23469
+ * (D730) — see `runPipeline.suppliedRoot`.
23470
+ */
23471
+ var SuppliedRootOutputSchema = object({
23472
+ stepId: string(),
23473
+ /** The root model that drew the boxes — stamped on the result. */
23474
+ modelId: string(),
23475
+ detections: array(object({
23476
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
23477
+ bbox: tuple([
23478
+ number(),
23479
+ number(),
23480
+ number(),
23481
+ number()
23482
+ ]),
23483
+ score: number(),
23484
+ /**
23485
+ * Five facial landmarks in the same pixels — a face the step's own
23486
+ * detector already re-found inside a root face box (D730), so its
23487
+ * embedder child aligns it exactly as it aligns any detected face.
23488
+ */
23489
+ landmarks: array(object({
23490
+ x: number(),
23491
+ y: number()
23492
+ })).optional()
23493
+ })).min(1)
23494
+ });
23495
+ /**
23329
23496
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23330
23497
  * within the frame, so the executor can re-cut a leaf child ROI at native
23331
23498
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -23373,7 +23540,7 @@ var FrameRefSchema = object({
23373
23540
  timestamp: number(),
23374
23541
  capturedAt: number().optional()
23375
23542
  });
23376
- var ModelFormatSchema$1 = _enum([
23543
+ var ModelFormatSchema$2 = _enum([
23377
23544
  "onnx",
23378
23545
  "coreml",
23379
23546
  "openvino",
@@ -23391,7 +23558,7 @@ var PipelineSlotSchema = _enum([
23391
23558
  var PipelineEngineChoiceSchema = object({
23392
23559
  runtime: literal("python"),
23393
23560
  backend: string(),
23394
- format: ModelFormatSchema$1,
23561
+ format: ModelFormatSchema$2,
23395
23562
  device: string().optional()
23396
23563
  });
23397
23564
  /**
@@ -23448,15 +23615,12 @@ var PipelineTemplateSchema$1 = object({
23448
23615
  var PipelineModelOptionSchema = object({
23449
23616
  id: string(),
23450
23617
  name: string(),
23451
- formats: record(string(), object({
23452
- downloaded: boolean(),
23453
- sizeMB: number()
23454
- })),
23618
+ formats: record(string(), PipelineModelFormatStatusSchema),
23455
23619
  group: ModelVariantGroupSchema.optional(),
23456
23620
  legacy: boolean().optional(),
23457
23621
  provider: ModelProviderIdSchema.optional(),
23458
23622
  defaultConfidence: number().optional(),
23459
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
23623
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
23460
23624
  });
23461
23625
  var ConfigFieldBridge = custom();
23462
23626
  var PipelineAddonSchemaSchema = object({
@@ -23618,6 +23782,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23618
23782
  }), {
23619
23783
  kind: "mutation",
23620
23784
  auth: "admin"
23785
+ }), method(object({
23786
+ nodeId: string(),
23787
+ deviceIds: array(number()).readonly().optional(),
23788
+ dryRun: boolean()
23789
+ }), object({
23790
+ entries: array(object({
23791
+ deviceId: number(),
23792
+ keys: array(string()).readonly()
23793
+ })).readonly(),
23794
+ refused: array(object({
23795
+ deviceId: number(),
23796
+ reason: string()
23797
+ })).readonly()
23798
+ }), {
23799
+ kind: "mutation",
23800
+ auth: "admin"
23621
23801
  }), method(object({ nodeId: string() }), object({ unhealthy: array(object({
23622
23802
  /** `<backend>:<device>`, e.g. `openvino:gpu`. */
23623
23803
  deviceKey: string(),
@@ -23654,11 +23834,11 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23654
23834
  }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
23655
23835
  addonId: string(),
23656
23836
  modelId: string(),
23657
- format: ModelFormatSchema$1
23837
+ format: ModelFormatSchema$2
23658
23838
  }), DownloadModelResultSchema, { kind: "mutation" }), method(object({
23659
23839
  addonId: string(),
23660
23840
  modelId: string(),
23661
- format: ModelFormatSchema$1
23841
+ format: ModelFormatSchema$2
23662
23842
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
23663
23843
  steps: array(PipelineStepInputSchema).min(1),
23664
23844
  frame: FrameInputSchema.optional(),
@@ -23724,7 +23904,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23724
23904
  * `device-not-servable`), and nothing reaches the camera's live
23725
23905
  * trace stream. Absent ⇒ unchanged behaviour.
23726
23906
  */
23727
- replay: literal(true).optional()
23907
+ replay: literal(true).optional(),
23908
+ /**
23909
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
23910
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
23911
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
23912
+ * NOT inferred, these boxes are its output, and its children (the plate
23913
+ * reader) run on them through their own crop policy. Boxes are in the
23914
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
23915
+ */
23916
+ suppliedRoot: SuppliedRootOutputSchema.optional()
23728
23917
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
23729
23918
  steps: array(PipelineStepInputSchema).min(1),
23730
23919
  frames: array(FrameInputSchema).min(1).max(255),
@@ -23806,6 +23995,352 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23806
23995
  filename: string().optional(),
23807
23996
  settings: record(string(), unknown()).optional()
23808
23997
  }), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
23998
+ /**
23999
+ * Wire shapes of the Load balancing surface (D748): the session placement
24000
+ * policy, the atomic share write, the observed placement statistics, the
24001
+ * hardware share suggestion and the stale device pins.
24002
+ */
24003
+ /**
24004
+ * How a new detection session picks its node and device.
24005
+ * - `least-loaded` — the historical rule: lowest `attached / weight`, a
24006
+ * constant node order at a tie (D37). An idle node always ties at 0, so a
24007
+ * weight only bites once a node already holds a session.
24008
+ * - `share` — the share of PARALLEL sessions is held to the weights, and a
24009
+ * full or drowning node yields to a free one (D748).
24010
+ */
24011
+ var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
24012
+ var LoadBalancingSharesInputSchema = object({
24013
+ /** nodeId → share (> 0). A node left out keeps its weight. */
24014
+ nodes: record(string(), number().positive()).default({}),
24015
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
24016
+ devices: record(string(), record(string(), number().positive())).default({})
24017
+ });
24018
+ var PlacementStatsInputSchema = object({
24019
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
24020
+ windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
24021
+ var PlacementDeviceStatsSchema = object({
24022
+ deviceKey: string(),
24023
+ /** Sessions running on this device now. */
24024
+ sessionsNow: number(),
24025
+ /** Sessions started on this device inside the window. */
24026
+ sessionsStarted: number(),
24027
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
24028
+ observedShare: number().nullable()
24029
+ });
24030
+ var PlacementNodeStatsSchema = object({
24031
+ nodeId: string(),
24032
+ sessionsNow: number(),
24033
+ sessionsStarted: number(),
24034
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
24035
+ observedShare: number().nullable(),
24036
+ /** Most sessions this node ran at once inside the window. */
24037
+ peakSessions: number(),
24038
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
24039
+ yieldsAway: number(),
24040
+ devices: array(PlacementDeviceStatsSchema).readonly()
24041
+ });
24042
+ /** A camera's device pin that the session path cannot honour. */
24043
+ var StaleDevicePinSchema = object({
24044
+ deviceId: number(),
24045
+ deviceKey: string(),
24046
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
24047
+ reason: _enum(["disabled", "absent"])
24048
+ });
24049
+ var PlacementStatsSchema = object({
24050
+ policy: SessionPlacementPolicySchema,
24051
+ windowMs: number(),
24052
+ /** How much of the window was actually observed (the hub keeps it in memory). */
24053
+ observedForMs: number(),
24054
+ sessionsNow: number(),
24055
+ /** Most parallel sessions across the cluster inside the window. */
24056
+ clusterPeakSessions: number(),
24057
+ nodes: array(PlacementNodeStatsSchema).readonly(),
24058
+ stalePins: array(StaleDevicePinSchema).readonly()
24059
+ });
24060
+ var SuggestSharesInputSchema = object({ headroom: number().min(.3).max(.5).default(.4) });
24061
+ var SuggestedDeviceShareSchema = object({
24062
+ deviceKey: string(),
24063
+ /** Share of the node (0–100, rounded). */
24064
+ share: number(),
24065
+ modelId: string().nullable(),
24066
+ /** Inferences per second at that model, from the measured table. */
24067
+ fps: number().nullable(),
24068
+ measured: boolean(),
24069
+ /** Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋. Never enforced. */
24070
+ suggestedMaxSessions: number().nullable()
24071
+ });
24072
+ var SuggestedNodeShareSchema = object({
24073
+ nodeId: string(),
24074
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
24075
+ share: number().nullable(),
24076
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
24077
+ capacitySessions: number(),
24078
+ devices: array(SuggestedDeviceShareSchema).readonly(),
24079
+ skippedReason: string().nullable()
24080
+ });
24081
+ var SuggestSharesResultSchema = object({
24082
+ headroom: number(),
24083
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
24084
+ cameraFps: number(),
24085
+ /** How many share → model → capacity rounds ran before the shares stopped moving (≤ 3). */
24086
+ iterations: number(),
24087
+ nodes: array(SuggestedNodeShareSchema).readonly()
24088
+ });
24089
+ /**
24090
+ * Where the node and device shares come from (D750).
24091
+ * - `auto` — computed by the system from the cluster's measured capacity at
24092
+ * the Auto tune models, and recomputed whenever a node or device joins,
24093
+ * leaves, is switched on or off, or changes model.
24094
+ * - `manual` — the operator's stored sliders. A node or device that cannot
24095
+ * take sessions gives its share to the others in proportion; the stored
24096
+ * values are never rewritten for that.
24097
+ */
24098
+ var ShareSourceSchema = _enum(["auto", "manual"]);
24099
+ var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
24100
+ object({
24101
+ nodes: record(string(), number()),
24102
+ devices: record(string(), record(string(), number()))
24103
+ });
24104
+ var EffectiveDeviceShareSchema = object({
24105
+ deviceKey: string(),
24106
+ /** Can take sessions now (enabled, available, can run the root). */
24107
+ eligible: boolean(),
24108
+ /** The share the source assigns, as a percentage of the node's devices. */
24109
+ configuredPct: number(),
24110
+ /** The share actually used, after an ineligible device's share went to the others. */
24111
+ effectivePct: number()
24112
+ });
24113
+ var EffectiveNodeShareSchema = object({
24114
+ nodeId: string(),
24115
+ eligible: boolean(),
24116
+ configuredPct: number(),
24117
+ effectivePct: number(),
24118
+ devices: array(EffectiveDeviceShareSchema).readonly()
24119
+ });
24120
+ var EffectiveSharesSchema = object({
24121
+ source: ShareSourceSchema,
24122
+ policy: SessionPlacementPolicySchema,
24123
+ /** `auto` with no computed answer yet: the stored sliders are used meanwhile. */
24124
+ autoPending: boolean(),
24125
+ /** When the automatic shares were last computed (ms epoch); null = never. */
24126
+ computedAt: number().nullable(),
24127
+ /** What made the system recompute them last. */
24128
+ trigger: string().nullable(),
24129
+ nodes: array(EffectiveNodeShareSchema).readonly(),
24130
+ /** The relative weights the election reads (before eligibility). */
24131
+ nodeWeights: record(string(), number()),
24132
+ deviceWeights: record(string(), record(string(), number()))
24133
+ });
24134
+ /**
24135
+ * The wire shapes of the Auto tune plan and apply (D745), used by the
24136
+ * `pipeline-orchestrator` cap. The recommender's own types
24137
+ * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
24138
+ * schemas are what crosses the cap boundary.
24139
+ */
24140
+ var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
24141
+ var HardwareClassIdSchema = _enum([
24142
+ "intel-core-ultra",
24143
+ "intel-n-series",
24144
+ "apple-m-base",
24145
+ "apple-m-pro",
24146
+ "unknown"
24147
+ ]);
24148
+ var AcceleratorKindSchema = _enum([
24149
+ "intel-npu",
24150
+ "intel-igpu",
24151
+ "x86-cpu",
24152
+ "arm-cpu",
24153
+ "apple-ane",
24154
+ "coral"
24155
+ ]);
24156
+ var RecommendationReasonSchema = discriminatedUnion("kind", [
24157
+ object({
24158
+ kind: literal("fits"),
24159
+ utilisation: number()
24160
+ }),
24161
+ object({
24162
+ kind: literal("tie-faster"),
24163
+ over: string(),
24164
+ recallDelta: number()
24165
+ }),
24166
+ object({
24167
+ kind: literal("stepped-down"),
24168
+ from: string(),
24169
+ to: string(),
24170
+ limitedBy: string()
24171
+ }),
24172
+ object({
24173
+ kind: literal("no-fit-lightest"),
24174
+ utilisation: number()
24175
+ }),
24176
+ object({
24177
+ kind: literal("derived-latency"),
24178
+ modelId: string()
24179
+ }),
24180
+ object({
24181
+ kind: literal("estimated-load"),
24182
+ observedForMs: number().nullable()
24183
+ }),
24184
+ object({ kind: literal("cpu-device") }),
24185
+ object({ kind: literal("coral-untouched") }),
24186
+ object({ kind: literal("device-disabled") }),
24187
+ object({ kind: literal("device-unavailable") }),
24188
+ object({ kind: literal("node-offline") }),
24189
+ object({ kind: literal("no-hardware-facts") }),
24190
+ object({
24191
+ kind: literal("no-measured-data"),
24192
+ hardwareClass: HardwareClassIdSchema
24193
+ }),
24194
+ object({
24195
+ kind: literal("no-family-build"),
24196
+ format: ModelFormatSchema$1
24197
+ })
24198
+ ]);
24199
+ var DeviceDemandSchema = object({
24200
+ nodeId: string(),
24201
+ deviceKey: string(),
24202
+ demandFps: number(),
24203
+ maxCameraFps: number(),
24204
+ alwaysOnCameras: number(),
24205
+ onMotionSessions: number(),
24206
+ onMotionSource: _enum([
24207
+ "observed-24h",
24208
+ "estimate",
24209
+ "none"
24210
+ ]),
24211
+ observedForMs: number().nullable(),
24212
+ /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
24213
+ placement: SessionPlacementPolicySchema
24214
+ });
24215
+ var DeviceModelChoiceSchema = object({
24216
+ modelId: string(),
24217
+ p50Ms: number(),
24218
+ fps: number(),
24219
+ measured: boolean(),
24220
+ utilisation: number(),
24221
+ personRecall: number()
24222
+ });
24223
+ var DeviceRecommendationSchema = object({
24224
+ deviceKey: string(),
24225
+ accelerator: AcceleratorKindSchema.nullable(),
24226
+ enabled: boolean(),
24227
+ available: boolean(),
24228
+ demand: DeviceDemandSchema.nullable(),
24229
+ chosen: DeviceModelChoiceSchema.nullable(),
24230
+ reasons: array(RecommendationReasonSchema).readonly()
24231
+ });
24232
+ var NodeRecommendationSchema = object({
24233
+ nodeId: string(),
24234
+ reachable: boolean(),
24235
+ hardwareClass: HardwareClassIdSchema.nullable(),
24236
+ cpuModel: string().nullable(),
24237
+ skipped: boolean(),
24238
+ acceleratorModelId: string().nullable(),
24239
+ devices: array(DeviceRecommendationSchema).readonly(),
24240
+ reasons: array(RecommendationReasonSchema).readonly()
24241
+ });
24242
+ var ModelPinChangeSchema = object({
24243
+ stepId: string(),
24244
+ before: string().nullable(),
24245
+ after: string().nullable()
24246
+ });
24247
+ var NodeDeviceChangeSchema = object({
24248
+ nodeId: string(),
24249
+ deviceKey: string(),
24250
+ madeExplicit: boolean(),
24251
+ modelPins: array(ModelPinChangeSchema).readonly(),
24252
+ thresholds: array(object({
24253
+ stepId: string(),
24254
+ keys: array(string()).readonly()
24255
+ })).readonly()
24256
+ });
24257
+ var CameraOverrideClearSchema = object({
24258
+ deviceId: number(),
24259
+ source: _enum(["step-override", "wholesale"]),
24260
+ nodeId: string(),
24261
+ deviceKey: string().nullable(),
24262
+ stepId: string(),
24263
+ modelIdBefore: string().nullable(),
24264
+ keys: array(string()).readonly()
24265
+ });
24266
+ var DetectorStoreClearSchema = object({
24267
+ deviceId: number(),
24268
+ keys: array(string()).readonly()
24269
+ });
24270
+ var AutoTuneWarningSchema = discriminatedUnion("kind", [
24271
+ object({
24272
+ kind: literal("detector-store-cluster-wide"),
24273
+ skippedNodes: array(string()).readonly()
24274
+ }),
24275
+ object({
24276
+ kind: literal("detector-store-unreadable"),
24277
+ error: string()
24278
+ }),
24279
+ object({
24280
+ kind: literal("coral-enabled"),
24281
+ nodeId: string(),
24282
+ deviceKey: string()
24283
+ })
24284
+ ]);
24285
+ var AutoTuneOptionsSchema = object({
24286
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
24287
+ headroom: number().min(.3).max(.5).default(.4),
24288
+ /**
24289
+ * What-if shares (D748): plan as if these node/device shares were stored
24290
+ * and the policy were `share`. Absent = the stored shares under the stored
24291
+ * policy. A what-if plan is for display; apply always re-plans from what
24292
+ * is stored.
24293
+ */
24294
+ shares: LoadBalancingSharesInputSchema.optional()
24295
+ });
24296
+ var AutoTunePlanSchema = object({
24297
+ /** Hash of everything the apply will write — the apply refuses a different one. */
24298
+ planHash: string(),
24299
+ family: literal("yolov9"),
24300
+ headroom: number(),
24301
+ /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
24302
+ whatIf: boolean(),
24303
+ generatedAt: number(),
24304
+ nodes: array(NodeRecommendationSchema).readonly(),
24305
+ nodeChanges: array(NodeDeviceChangeSchema).readonly(),
24306
+ cameraClears: array(CameraOverrideClearSchema).readonly(),
24307
+ detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
24308
+ warnings: array(AutoTuneWarningSchema).readonly()
24309
+ });
24310
+ var AutoTuneApplyInputSchema = object({
24311
+ planHash: string(),
24312
+ headroom: number().min(.3).max(.5).default(.4)
24313
+ });
24314
+ var AutoTunePhaseResultSchema = object({
24315
+ phase: _enum([
24316
+ "download",
24317
+ "camera-overrides",
24318
+ "detector-thresholds",
24319
+ "node-models",
24320
+ "redispatch"
24321
+ ]),
24322
+ ok: boolean(),
24323
+ detail: string()
24324
+ });
24325
+ var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
24326
+ object({
24327
+ kind: literal("applied"),
24328
+ planHash: string(),
24329
+ phases: array(AutoTunePhaseResultSchema).readonly()
24330
+ }),
24331
+ object({
24332
+ kind: literal("aborted"),
24333
+ phases: array(AutoTunePhaseResultSchema).readonly()
24334
+ }),
24335
+ object({
24336
+ kind: literal("stale"),
24337
+ plan: AutoTunePlanSchema
24338
+ }),
24339
+ object({
24340
+ kind: literal("refused"),
24341
+ reason: _enum(["apply-in-progress"])
24342
+ })
24343
+ ]);
23809
24344
  object({
23810
24345
  activeCameras: number(),
23811
24346
  throttledCameras: number(),
@@ -24826,7 +25361,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
24826
25361
  */
24827
25362
  cropJpeg: string().optional(),
24828
25363
  parent: DetailParentSchema,
24829
- steps: array(string()).optional()
25364
+ steps: array(string()).optional(),
25365
+ /**
25366
+ * The camera's root model already drew this step's boxes (D730): a
25367
+ * `license_plate` inside the parent vehicle. The named step is NOT
25368
+ * inferred — these FRAME-space boxes are its output — and its
25369
+ * requested children (the plate reader) run on them. Absent ⇒ every
25370
+ * requested step infers as before.
25371
+ */
25372
+ supplied: object({
25373
+ stepId: string(),
25374
+ modelId: string(),
25375
+ boxes: array(object({
25376
+ bbox: NativeCropBboxSchema,
25377
+ score: number()
25378
+ })).min(1)
25379
+ }).optional()
24830
25380
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
24831
25381
  /** Catalog step id, e.g. `clip-embedding`. */
24832
25382
  stepId: string(),
@@ -24971,7 +25521,6 @@ var CameraStepOverridePatchSchema = object({
24971
25521
  settings: record(string(), unknown()).readonly().optional()
24972
25522
  });
24973
25523
  var CameraPipelineSettingsSchema = object({
24974
- pinnedAgentNodeId: string().optional(),
24975
25524
  stepToggles: record(string(), boolean()).optional(),
24976
25525
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
24977
25526
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -25470,12 +26019,6 @@ method(object({
25470
26019
  }), object({ success: literal(true) }), {
25471
26020
  kind: "mutation",
25472
26021
  auth: "admin"
25473
- }), method(object({
25474
- agentNodeId: string(),
25475
- detectWeight: number().positive().nullable()
25476
- }), object({ success: literal(true) }), {
25477
- kind: "mutation",
25478
- auth: "admin"
25479
26022
  }), method(object({
25480
26023
  agentNodeId: string(),
25481
26024
  detect: boolean().nullable().optional(),
@@ -25517,6 +26060,15 @@ method(object({
25517
26060
  }), {
25518
26061
  kind: "mutation",
25519
26062
  auth: "admin"
26063
+ }), method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }), method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
26064
+ kind: "mutation",
26065
+ auth: "admin"
26066
+ }), method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
26067
+ kind: "mutation",
26068
+ auth: "admin"
26069
+ }), method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }), method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }), method(_void(), EffectiveSharesSchema, { auth: "admin" }), method(SetShareSourceInputSchema, object({ success: literal(true) }), {
26070
+ kind: "mutation",
26071
+ auth: "admin"
25520
26072
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
25521
26073
  deviceId: number(),
25522
26074
  addonId: string(),
@@ -28127,6 +28679,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28127
28679
  */
28128
28680
  alive: boolean()
28129
28681
  })), method(object({
28682
+ deviceId: number().int().nonnegative(),
28683
+ sessionId: string(),
28684
+ downlinkMbps: number().nonnegative()
28685
+ }), object({
28686
+ outcome: _enum(["switching", "held"]),
28687
+ tier: CamProfileSchema.nullable(),
28688
+ reason: string()
28689
+ }), { kind: "mutation" }), method(object({
28130
28690
  deviceId: number().int().nonnegative(),
28131
28691
  sessionId: string()
28132
28692
  }), WebrtcSessionDebugSchema, { kind: "query" });
@@ -30802,7 +31362,8 @@ var ConnectionEndpointSchema = object({
30802
31362
  "lan-ipv6",
30803
31363
  "public",
30804
31364
  "loopback",
30805
- "app-link"
31365
+ "app-link",
31366
+ "custom"
30806
31367
  ]),
30807
31368
  /**
30808
31369
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30871,7 +31432,7 @@ var GetConnectionEndpointsResultSchema = object({
30871
31432
  localPort: AdvertisedLocalPortSchema
30872
31433
  });
30873
31434
  /**
30874
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
31435
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
30875
31436
  * since D709 is the CamStack app link; `resolved` reports the effective value,
30876
31437
  * so the UI can show it either way.
30877
31438
  */
@@ -30904,6 +31465,72 @@ var ViewerEndpointsSchema = object({
30904
31465
  /** What the ranking currently resolves to (may be empty if nothing is up). */
30905
31466
  resolved: array(string()).readonly()
30906
31467
  });
31468
+ /**
31469
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
31470
+ * for addons built against it): `cluster` is the `internal` role, `browser`
31471
+ * the `publicEndpoint` role; `override` is the flagged address.
31472
+ */
31473
+ var HubAddressSnapshotSchema = object({
31474
+ override: string().nullable(),
31475
+ resolved: string().nullable(),
31476
+ source: _enum([
31477
+ "override",
31478
+ "auto",
31479
+ "none"
31480
+ ])
31481
+ });
31482
+ var HubAddressesSchema = object({
31483
+ cluster: HubAddressSnapshotSchema,
31484
+ browser: HubAddressSnapshotSchema
31485
+ });
31486
+ /**
31487
+ * What an address is used for (`hub-address.ts`, D734). `appConnections` is
31488
+ * many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
31489
+ * by at most one address.
31490
+ */
31491
+ var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
31492
+ var RoleSourceSchema = _enum([
31493
+ "flagged",
31494
+ "auto",
31495
+ "none"
31496
+ ]);
31497
+ /** One single-valued role: the flagged address, the one in use, and why. */
31498
+ var HubAddressRoleResolutionSchema = object({
31499
+ /** The address carrying the flag, or null = automatic. */
31500
+ flagged: string().nullable(),
31501
+ /** The address in use, or null when nothing qualifies (never loopback). */
31502
+ resolved: string().nullable(),
31503
+ source: RoleSourceSchema
31504
+ });
31505
+ var HubAppConnectionsResolutionSchema = object({
31506
+ /** The addresses flagged `appConnections`, or empty = automatic. */
31507
+ flagged: array(string()).readonly(),
31508
+ /** What the apps race right now. */
31509
+ resolved: array(string()).readonly(),
31510
+ source: RoleSourceSchema
31511
+ });
31512
+ var HubAddressBookSchema = object({
31513
+ rows: array(ConnectionEndpointSchema.extend({
31514
+ /** In the hub's detected palette right now. */
31515
+ detected: boolean(),
31516
+ /** Entered by the operator (removable). */
31517
+ custom: boolean(),
31518
+ /** The roles explicitly flagged on this address. */
31519
+ flags: array(HubAddressRoleSchema).readonly(),
31520
+ /** The roles this address serves right now — flagged or automatic. */
31521
+ inUse: array(HubAddressRoleSchema).readonly(),
31522
+ /** The roles this address may be flagged with. */
31523
+ eligible: array(HubAddressRoleSchema).readonly()
31524
+ })).readonly(),
31525
+ roles: object({
31526
+ appConnections: HubAppConnectionsResolutionSchema,
31527
+ notificationTaps: HubAddressRoleResolutionSchema,
31528
+ internal: HubAddressRoleResolutionSchema,
31529
+ publicEndpoint: HubAddressRoleResolutionSchema
31530
+ }),
31531
+ /** The `hub=` an app link carries (D709), or null. */
31532
+ appLinkHub: string().nullable()
31533
+ });
30907
31534
  var AllowedAddressesSchema = object({
30908
31535
  /**
30909
31536
  * Allowlist of interface addresses operators have explicitly opted
@@ -30947,10 +31574,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30947
31574
  * tunnel always emits `https://` regardless. */
30948
31575
  scheme: _enum(["http", "https"]).optional(),
30949
31576
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30950
- * an address notification links can be flagged with, not a hub
31577
+ * an address notification taps can be flagged with, not a hub
30951
31578
  * route. Default `false`: racers and rankers never see it. */
30952
31579
  includeAppLink: boolean().optional()
30953
- }), 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, {
31580
+ }), 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({
31581
+ baseUrl: string(),
31582
+ label: string().max(80)
31583
+ }), HubAddressBookSchema, {
31584
+ kind: "mutation",
31585
+ auth: "admin"
31586
+ }), method(object({ baseUrl: string() }), HubAddressBookSchema, {
31587
+ kind: "mutation",
31588
+ auth: "admin"
31589
+ }), method(object({
31590
+ role: HubAddressRoleSchema,
31591
+ baseUrl: string().nullable(),
31592
+ enabled: boolean(),
31593
+ acceptInsecureHttp: boolean().optional()
31594
+ }), HubAddressBookSchema, {
31595
+ kind: "mutation",
31596
+ auth: "admin"
31597
+ }), 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, {
30954
31598
  kind: "mutation",
30955
31599
  auth: "admin"
30956
31600
  }), method(object({
@@ -31340,7 +31984,8 @@ object({
31340
31984
  * writes this slice (not even a boot seed), and neither does the runner's
31341
31985
  * phase machine: its phase is "a session is attached" for every on-motion
31342
31986
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
31343
- * A provider's `isDetected` answers from the hub's slice.
31987
+ * A provider's `isDetected` and `getStatus` answer from the hub's slice
31988
+ * (`hubMotionNativeProvider`).
31344
31989
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
31345
31990
  * imports) — the provider pushes both edges itself, from the upstream
31346
31991
  * system's own state change. That is the sensor's own fact.
@@ -36471,6 +37116,16 @@ DeviceType.Camera, method(object({
36471
37116
  package: array(ZoneRuleSchema).readonly()
36472
37117
  });
36473
37118
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
37119
+ Object.freeze({
37120
+ person: .5,
37121
+ vehicle: .5,
37122
+ animal: .5
37123
+ });
37124
+ Object.freeze({
37125
+ person: .65,
37126
+ vehicle: .65,
37127
+ animal: .65
37128
+ });
36474
37129
  /**
36475
37130
  * Accessory device helpers — shared across drivers.
36476
37131
  *
@@ -39399,12 +40054,24 @@ Object.freeze({
39399
40054
  addonId: null,
39400
40055
  access: "view"
39401
40056
  },
40057
+ "localNetwork.addCustomAddress": {
40058
+ capName: "local-network",
40059
+ capScope: "system",
40060
+ addonId: null,
40061
+ access: "create"
40062
+ },
39402
40063
  "localNetwork.downloadCa": {
39403
40064
  capName: "local-network",
39404
40065
  capScope: "system",
39405
40066
  addonId: null,
39406
40067
  access: "view"
39407
40068
  },
40069
+ "localNetwork.getAddresses": {
40070
+ capName: "local-network",
40071
+ capScope: "system",
40072
+ addonId: null,
40073
+ access: "view"
40074
+ },
39408
40075
  "localNetwork.getAllowedAddresses": {
39409
40076
  capName: "local-network",
39410
40077
  capScope: "system",
@@ -39417,6 +40084,12 @@ Object.freeze({
39417
40084
  addonId: null,
39418
40085
  access: "view"
39419
40086
  },
40087
+ "localNetwork.getHubAddresses": {
40088
+ capName: "local-network",
40089
+ capScope: "system",
40090
+ addonId: null,
40091
+ access: "view"
40092
+ },
39420
40093
  "localNetwork.getNotificationEndpoint": {
39421
40094
  capName: "local-network",
39422
40095
  capScope: "system",
@@ -39453,6 +40126,12 @@ Object.freeze({
39453
40126
  addonId: null,
39454
40127
  access: "create"
39455
40128
  },
40129
+ "localNetwork.removeCustomAddress": {
40130
+ capName: "local-network",
40131
+ capScope: "system",
40132
+ addonId: null,
40133
+ access: "delete"
40134
+ },
39456
40135
  "localNetwork.resetAllowlistToBestMatch": {
39457
40136
  capName: "local-network",
39458
40137
  capScope: "system",
@@ -39465,6 +40144,12 @@ Object.freeze({
39465
40144
  addonId: null,
39466
40145
  access: "create"
39467
40146
  },
40147
+ "localNetwork.setAddressRole": {
40148
+ capName: "local-network",
40149
+ capScope: "system",
40150
+ addonId: null,
40151
+ access: "create"
40152
+ },
39468
40153
  "localNetwork.setAllowedAddresses": {
39469
40154
  capName: "local-network",
39470
40155
  capScope: "system",
@@ -40959,6 +41644,12 @@ Object.freeze({
40959
41644
  addonId: null,
40960
41645
  access: "delete"
40961
41646
  },
41647
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
41648
+ capName: "pipeline-executor",
41649
+ capScope: "system",
41650
+ addonId: null,
41651
+ access: "delete"
41652
+ },
40962
41653
  "pipelineExecutor.deleteModel": {
40963
41654
  capName: "pipeline-executor",
40964
41655
  capScope: "system",
@@ -41175,6 +41866,12 @@ Object.freeze({
41175
41866
  addonId: null,
41176
41867
  access: "view"
41177
41868
  },
41869
+ "pipelineOrchestrator.applyAutoTune": {
41870
+ capName: "pipeline-orchestrator",
41871
+ capScope: "system",
41872
+ addonId: null,
41873
+ access: "create"
41874
+ },
41178
41875
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
41179
41876
  capName: "pipeline-orchestrator",
41180
41877
  capScope: "system",
@@ -41289,6 +41986,12 @@ Object.freeze({
41289
41986
  addonId: null,
41290
41987
  access: "view"
41291
41988
  },
41989
+ "pipelineOrchestrator.getEffectiveShares": {
41990
+ capName: "pipeline-orchestrator",
41991
+ capScope: "system",
41992
+ addonId: null,
41993
+ access: "view"
41994
+ },
41292
41995
  "pipelineOrchestrator.getGlobalMetrics": {
41293
41996
  capName: "pipeline-orchestrator",
41294
41997
  capScope: "system",
@@ -41325,6 +42028,12 @@ Object.freeze({
41325
42028
  addonId: null,
41326
42029
  access: "view"
41327
42030
  },
42031
+ "pipelineOrchestrator.getPlacementStats": {
42032
+ capName: "pipeline-orchestrator",
42033
+ capScope: "system",
42034
+ addonId: null,
42035
+ access: "view"
42036
+ },
41328
42037
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
41329
42038
  capName: "pipeline-orchestrator",
41330
42039
  capScope: "system",
@@ -41349,6 +42058,12 @@ Object.freeze({
41349
42058
  addonId: null,
41350
42059
  access: "create"
41351
42060
  },
42061
+ "pipelineOrchestrator.planAutoTune": {
42062
+ capName: "pipeline-orchestrator",
42063
+ capScope: "system",
42064
+ addonId: null,
42065
+ access: "view"
42066
+ },
41352
42067
  "pipelineOrchestrator.rebalance": {
41353
42068
  capName: "pipeline-orchestrator",
41354
42069
  capScope: "system",
@@ -41409,12 +42124,6 @@ Object.freeze({
41409
42124
  addonId: null,
41410
42125
  access: "create"
41411
42126
  },
41412
- "pipelineOrchestrator.setAgentDetectWeight": {
41413
- capName: "pipeline-orchestrator",
41414
- capScope: "system",
41415
- addonId: null,
41416
- access: "create"
41417
- },
41418
42127
  "pipelineOrchestrator.setAgentInferenceDevices": {
41419
42128
  capName: "pipeline-orchestrator",
41420
42129
  capScope: "system",
@@ -41469,12 +42178,30 @@ Object.freeze({
41469
42178
  addonId: null,
41470
42179
  access: "create"
41471
42180
  },
42181
+ "pipelineOrchestrator.setLoadBalancingShares": {
42182
+ capName: "pipeline-orchestrator",
42183
+ capScope: "system",
42184
+ addonId: null,
42185
+ access: "create"
42186
+ },
41472
42187
  "pipelineOrchestrator.setPipelineDevicePin": {
41473
42188
  capName: "pipeline-orchestrator",
41474
42189
  capScope: "system",
41475
42190
  addonId: null,
41476
42191
  access: "create"
41477
42192
  },
42193
+ "pipelineOrchestrator.setShareSource": {
42194
+ capName: "pipeline-orchestrator",
42195
+ capScope: "system",
42196
+ addonId: null,
42197
+ access: "create"
42198
+ },
42199
+ "pipelineOrchestrator.suggestShares": {
42200
+ capName: "pipeline-orchestrator",
42201
+ capScope: "system",
42202
+ addonId: null,
42203
+ access: "view"
42204
+ },
41478
42205
  "pipelineOrchestrator.unassignAudio": {
41479
42206
  capName: "pipeline-orchestrator",
41480
42207
  capScope: "system",
@@ -43719,6 +44446,12 @@ Object.freeze({
43719
44446
  addonId: null,
43720
44447
  access: "create"
43721
44448
  },
44449
+ "webrtcSession.applyDownlinkProbe": {
44450
+ capName: "webrtc-session",
44451
+ capScope: "device",
44452
+ addonId: null,
44453
+ access: "create"
44454
+ },
43722
44455
  "webrtcSession.closeSession": {
43723
44456
  capName: "webrtc-session",
43724
44457
  capScope: "device",
@@ -46765,6 +47498,11 @@ Object.freeze({
46765
47498
  form: "single",
46766
47499
  optional: false
46767
47500
  }],
47501
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
47502
+ name: "deviceIds",
47503
+ form: "array",
47504
+ optional: true
47505
+ }],
46768
47506
  "pipelineExecutor.runPipeline": [{
46769
47507
  name: "deviceId",
46770
47508
  form: "single",
@@ -47641,6 +48379,11 @@ Object.freeze({
47641
48379
  form: "single",
47642
48380
  optional: false
47643
48381
  }],
48382
+ "webrtcSession.applyDownlinkProbe": [{
48383
+ name: "deviceId",
48384
+ form: "single",
48385
+ optional: false
48386
+ }],
47644
48387
  "webrtcSession.closeSession": [{
47645
48388
  name: "deviceId",
47646
48389
  form: "single",
@@ -47870,6 +48613,8 @@ new Map(Object.entries({
47870
48613
  "detection-blind": "device-events",
47871
48614
  "node-online": "system",
47872
48615
  "node-offline": "system",
48616
+ "node-restarting": "system",
48617
+ "node-updating": "system",
47873
48618
  "node-inference-unavailable": "system",
47874
48619
  "addon-crash-loop": "system",
47875
48620
  "addon-update-available": "system",
@@ -47947,6 +48692,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47947
48692
  kinds: [
47948
48693
  "node-offline",
47949
48694
  "node-online",
48695
+ "node-restarting",
47950
48696
  "node-inference-unavailable"
47951
48697
  ]
47952
48698
  },
@@ -47968,6 +48714,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47968
48714
  label: "Server & container updates",
47969
48715
  kinds: [
47970
48716
  "server-update-available",
48717
+ "node-updating",
47971
48718
  "server-updated",
47972
48719
  "wrapper-update-available"
47973
48720
  ]
@@ -48115,6 +48862,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48115
48862
  kinds: [
48116
48863
  "node-offline",
48117
48864
  "node-online",
48865
+ "node-restarting",
48118
48866
  "node-inference-unavailable"
48119
48867
  ]
48120
48868
  },
@@ -48136,6 +48884,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48136
48884
  example: "server 1.2.377 → 1.2.378",
48137
48885
  kinds: [
48138
48886
  "server-update-available",
48887
+ "node-updating",
48139
48888
  "server-updated",
48140
48889
  "wrapper-update-available"
48141
48890
  ]
@@ -48168,7 +48917,7 @@ var STATE_SUMMARY_VARS = [
48168
48917
  {
48169
48918
  name: "summarySection",
48170
48919
  label: "Summary: this section",
48171
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
48920
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
48172
48921
  example: "Batterie scariche",
48173
48922
  group: "system",
48174
48923
  families: ["rule"],
@@ -53227,7 +53976,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53227
53976
  type: "select",
53228
53977
  key: "region",
53229
53978
  label: "Skill region",
53230
- description: "Drives the Event Gateway endpoint used for proactive doorbell push. Pick the region your Alexa account is in.",
53979
+ description: "The Alexa Event Gateway this hub posts to: doorbell presses, motion, battery level, and the device-list updates sent when you expose or unexpose a camera. Pick the region your Amazon account is in — events sent to another region are rejected.",
53231
53980
  options: [
53232
53981
  {
53233
53982
  value: "NA",
@@ -53256,7 +54005,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53256
54005
  type: "text",
53257
54006
  key: "lwaClientId",
53258
54007
  label: "LWA client id (proactive events)",
53259
- description: "From the skill's Permissions → \"Send Alexa Events\" panel. Required for proactive doorbell push to Alexa.",
54008
+ description: "From the skill's Permissions → \"Send Alexa Events\" panel. Required for everything the hub pushes to Alexa: doorbell presses, motion, battery level and device-list updates.",
53260
54009
  default: DEFAULT_CONFIG.lwaClientId
53261
54010
  }),
53262
54011
  this.field({