@camstack/addon-export-alexa 1.2.130 → 1.2.131

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.
@@ -5406,7 +5406,7 @@ var ZodIssueCode = {
5406
5406
  var ZodFirstPartyTypeKind;
5407
5407
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5408
5408
  //#endregion
5409
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5409
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5410
5410
  /**
5411
5411
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5412
5412
  * window to float samples (D455).
@@ -10767,57 +10767,26 @@ var ClipSearchStrictnessSchema = _enum([
10767
10767
  "balanced",
10768
10768
  "strict"
10769
10769
  ]);
10770
- new Set([
10771
- {
10772
- id: "person",
10773
- name: "Person"
10774
- },
10775
- {
10776
- id: "vehicle",
10777
- name: "Vehicle"
10778
- },
10779
- {
10780
- id: "animal",
10781
- name: "Animal"
10782
- },
10783
- {
10784
- id: "package",
10785
- name: "Package"
10786
- }
10787
- ].map((l) => l.id));
10788
- var COCO_TO_MACRO = {
10789
- mapping: {
10790
- person: "person",
10791
- bicycle: "vehicle",
10792
- car: "vehicle",
10793
- motorcycle: "vehicle",
10794
- airplane: "vehicle",
10795
- bus: "vehicle",
10796
- train: "vehicle",
10797
- truck: "vehicle",
10798
- boat: "vehicle",
10799
- bird: "animal",
10800
- cat: "animal",
10801
- dog: "animal",
10802
- horse: "animal",
10803
- sheep: "animal",
10804
- cow: "animal",
10805
- elephant: "animal",
10806
- bear: "animal",
10807
- zebra: "animal",
10808
- giraffe: "animal",
10809
- suitcase: "package",
10810
- backpack: "package",
10811
- handbag: "package"
10812
- },
10813
- preserveOriginal: false
10814
- };
10815
- /** Steps a root detector may declare it fills. */
10816
- var FILLABLE_STEP_IDS = [
10770
+ /** Steps whose effect a root label can BE. */
10771
+ var LABEL_SUPPLY_STEP_IDS = [
10817
10772
  "animal-classifier",
10818
10773
  "vehicle-classifier",
10819
10774
  "package-detection"
10820
10775
  ];
10776
+ /** Steps whose box a root detection can BE. */
10777
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
10778
+ /**
10779
+ * Steps whose per-detection MASK a root detection can carry (D737). The live
10780
+ * mask step is `segmentation` — a frame-plane refiner that runs its own model
10781
+ * once per detection crop. (`instance-segmentation` is a dormant step id that
10782
+ * no camera tree carries.)
10783
+ */
10784
+ var MASK_SUPPLY_STEP_IDS = ["segmentation"];
10785
+ [
10786
+ ...LABEL_SUPPLY_STEP_IDS,
10787
+ ...CROP_SUPPLY_STEP_IDS,
10788
+ ...MASK_SUPPLY_STEP_IDS
10789
+ ];
10821
10790
  var MODEL_FORMATS = [
10822
10791
  "onnx",
10823
10792
  "coreml",
@@ -10846,7 +10815,53 @@ var ModelFormatEntrySchema = object({
10846
10815
  /** Multi-file payload (directory members or sibling files). */
10847
10816
  files: array(string()).readonly().optional(),
10848
10817
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
10849
- runtimes: array(_enum(["python"])).readonly().optional()
10818
+ runtimes: array(_enum(["python"])).readonly().optional(),
10819
+ /**
10820
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
10821
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
10822
+ * weight file) comes from the downloader's generated table, kept in step
10823
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
10824
+ * node records the revision it downloaded next to the file
10825
+ * (`<file>.revision`); a copy with no record or a different one is stale
10826
+ * unless its weight file hashes to the revision, and a stale copy is
10827
+ * downloaded again, the old one serving until the new one is complete. No
10828
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
10829
+ */
10830
+ revision: string().min(1).optional()
10831
+ });
10832
+ /**
10833
+ * What a node holds for one (model, format) (D746). `current` is a complete
10834
+ * copy at its catalog revision — exactly what `downloaded: true` means.
10835
+ * `stale` is bytes on disk that are not (yet) proven current under D743/D744:
10836
+ * no or a different revision record, or a missing sibling. `missing` is no
10837
+ * copy. `downloaded` alone folds `stale` into "not downloaded", which hid
10838
+ * reclaimable bytes and a copy about to be replaced.
10839
+ */
10840
+ var ModelOnDiskStateSchema = _enum([
10841
+ "current",
10842
+ "stale",
10843
+ "missing"
10844
+ ]);
10845
+ /**
10846
+ * The numeric precision of one format's BUILD (D746) — reported only when the
10847
+ * build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
10848
+ * CamStack Core ML export). Absent means "not stated", never "fp32".
10849
+ */
10850
+ var ModelFormatPrecisionSchema = _enum([
10851
+ "fp32",
10852
+ "fp16",
10853
+ "int8"
10854
+ ]);
10855
+ /**
10856
+ * One format of one model as a node's `pipelineExecutor.getSchema` reports it.
10857
+ * `onDisk` / `precision` are optional for version skew: a runner that predates
10858
+ * them omits them, and a reader falls back to `downloaded`.
10859
+ */
10860
+ var PipelineModelFormatStatusSchema = object({
10861
+ downloaded: boolean(),
10862
+ sizeMB: number(),
10863
+ onDisk: ModelOnDiskStateSchema.optional(),
10864
+ precision: ModelFormatPrecisionSchema.optional()
10850
10865
  });
10851
10866
  /**
10852
10867
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -10950,12 +10965,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10950
10965
  /** True when the weights or their data forbid commercial use. */
10951
10966
  nonCommercial: boolean().optional()
10952
10967
  }));
10953
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
10954
- var FillsClassifierEffectSchema = object({
10955
- stepId: _enum(FILLABLE_STEP_IDS),
10956
- labelToEffect: record(string(), string()),
10957
- uncovered: array(string()).readonly()
10958
- });
10968
+ /**
10969
+ * One step a ROOT detector can supply from its own output (D730) — see
10970
+ * `ModelCatalogEntry.suppliesSteps`.
10971
+ *
10972
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
10973
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
10974
+ * the root cannot produce (shown as unavailable, never a blocker).
10975
+ * - `crop`: the root draws the box the step would have found (`license_plate`
10976
+ * for plate-detection, `face` for face-detection). The box becomes a detail
10977
+ * child of the `parentMacro` detection that contains it — never a track.
10978
+ * - `mask`: the root's decode emits an instance mask with every detection (a
10979
+ * YOLO26-seg root, D737) — the `segmentation` step's result, carried on the
10980
+ * detection in the shape that step produces. Derived from the model's
10981
+ * postprocessor on read, never stored by an import.
10982
+ */
10983
+ var RootStepSupplySchema = discriminatedUnion("kind", [
10984
+ object({
10985
+ kind: literal("label"),
10986
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
10987
+ labelToEffect: record(string(), string()),
10988
+ uncovered: array(string()).readonly()
10989
+ }),
10990
+ object({
10991
+ kind: literal("crop"),
10992
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
10993
+ rootLabels: array(string()).readonly(),
10994
+ parentMacro: _enum(["vehicle", "person"]),
10995
+ childClass: _enum(["plate", "face"]),
10996
+ /**
10997
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
10998
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
10999
+ * stored by an import.
11000
+ */
11001
+ rootInputPx: number().int().positive().optional()
11002
+ }),
11003
+ object({
11004
+ kind: literal("mask"),
11005
+ stepId: _enum(MASK_SUPPLY_STEP_IDS)
11006
+ })
11007
+ ]);
10959
11008
  var ModelCatalogEntrySchema = object({
10960
11009
  id: string(),
10961
11010
  name: string(),
@@ -11021,6 +11070,35 @@ var ModelCatalogEntrySchema = object({
11021
11070
  */
11022
11071
  defaultConfidence: number().min(0).max(1).optional(),
11023
11072
  /**
11073
+ * Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
11074
+ * on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
11075
+ * absent here runs at the step slider's global default. The same row shape
11076
+ * the floor measurement produces (`model-floors.json`: modelId → floors), so
11077
+ * a measured table is copied in as-is. An operator override is bound to the
11078
+ * model it was made for and does not survive a model change (D738). A custom
11079
+ * / imported model may declare it; without it, the global defaults apply.
11080
+ */
11081
+ defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
11082
+ /**
11083
+ * The inference precision this model's OpenVINO IR needs on an Intel GPU.
11084
+ * Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
11085
+ * that produces invalid output at f16 — measured 2026-10-07 for YOLO26
11086
+ * base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
11087
+ * scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
11088
+ * `PoolModelConfig.gpuInferencePrecision`; the pool sets
11089
+ * INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
11090
+ */
11091
+ gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
11092
+ /**
11093
+ * ROOT detectors only: per supplied step (`animal-classifier`, …), the
11094
+ * minimum DETECTION score from which this root's own fine label (species,
11095
+ * vehicle type — D736 root supply) is taken (D741). Below it the detection
11096
+ * keeps its macro class without the fine label. `1` = never take it from
11097
+ * this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
11098
+ * `minConfidence` slider, bound to the ROOT model, overrides it.
11099
+ */
11100
+ suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
11101
+ /**
11024
11102
  * When true, the executor produces a landmark-aligned crop (similarity warp
11025
11103
  * onto the canonical template) before this step runs, instead of a plain
11026
11104
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -11082,15 +11160,15 @@ var ModelCatalogEntrySchema = object({
11082
11160
  */
11083
11161
  classMap: DetectionCatalogClassMapSchema.optional(),
11084
11162
  /**
11085
- * The pipeline steps this ROOT detector already does the work of (D715):
11086
- * its labels name the effect the step exists to produce (`deer` for
11087
- * `animal-classifier`, `package` for `package-detection`). Derived from the
11088
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
11089
- * declares none. Whether a declaration is honoured is the step's own
11090
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
11091
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
11163
+ * The pipeline steps this ROOT detector can supply from its own output
11164
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
11165
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
11166
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
11167
+ * by hand and never assumed per family; a row without it is derived on read
11168
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
11169
+ * `useRootModel` flag (`resolveRootSupply`).
11092
11170
  */
11093
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
11171
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
11094
11172
  /**
11095
11173
  * The model's CLIP feature-space contract (text encoder, dimension, vector
11096
11174
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -16301,6 +16379,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
16301
16379
  kind: "mutation",
16302
16380
  auth: "admin"
16303
16381
  });
16382
+ var HUB_ADDRESS_ROLES = [
16383
+ "appConnections",
16384
+ "notificationTaps",
16385
+ "internal",
16386
+ "publicEndpoint"
16387
+ ];
16304
16388
  /**
16305
16389
  * Transport bounds for AI capability methods.
16306
16390
  *
@@ -18063,6 +18147,51 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
18063
18147
  kind: "mutation",
18064
18148
  auth: "admin"
18065
18149
  });
18150
+ new Set([
18151
+ {
18152
+ id: "person",
18153
+ name: "Person"
18154
+ },
18155
+ {
18156
+ id: "vehicle",
18157
+ name: "Vehicle"
18158
+ },
18159
+ {
18160
+ id: "animal",
18161
+ name: "Animal"
18162
+ },
18163
+ {
18164
+ id: "package",
18165
+ name: "Package"
18166
+ }
18167
+ ].map((l) => l.id));
18168
+ var COCO_TO_MACRO = {
18169
+ mapping: {
18170
+ person: "person",
18171
+ bicycle: "vehicle",
18172
+ car: "vehicle",
18173
+ motorcycle: "vehicle",
18174
+ airplane: "vehicle",
18175
+ bus: "vehicle",
18176
+ train: "vehicle",
18177
+ truck: "vehicle",
18178
+ boat: "vehicle",
18179
+ bird: "animal",
18180
+ cat: "animal",
18181
+ dog: "animal",
18182
+ horse: "animal",
18183
+ sheep: "animal",
18184
+ cow: "animal",
18185
+ elephant: "animal",
18186
+ bear: "animal",
18187
+ zebra: "animal",
18188
+ giraffe: "animal",
18189
+ suitcase: "package",
18190
+ backpack: "package",
18191
+ handbag: "package"
18192
+ },
18193
+ preserveOriginal: false
18194
+ };
18066
18195
  var AUDIO_MACRO_LABELS = [
18067
18196
  {
18068
18197
  id: "speech",
@@ -18820,6 +18949,8 @@ var NcSystemEventKindSchema = _enum([
18820
18949
  "stream-offline",
18821
18950
  "node-online",
18822
18951
  "node-offline",
18952
+ "node-restarting",
18953
+ "node-updating",
18823
18954
  "node-inference-unavailable",
18824
18955
  "detection-blind",
18825
18956
  "addon-crash-loop",
@@ -20425,7 +20556,13 @@ var NcAlarmModeDelaysListSchema = array(object({
20425
20556
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20426
20557
  * is the one that starts the entry delay — the entry-delay notification already names it.
20427
20558
  */
20428
- notifySensorRewatched: boolean().optional()
20559
+ notifySensorRewatched: boolean().optional(),
20560
+ /**
20561
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
20562
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
20563
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
20564
+ */
20565
+ notifySensorIgnored: boolean().optional()
20429
20566
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20430
20567
  var NcAlarmModeDelaysEditListSchema = array(object({
20431
20568
  mode: AlarmArmModeSchema,
@@ -20438,7 +20575,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20438
20575
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20439
20576
  notifyDuringEntryDelay: boolean().nullable().optional(),
20440
20577
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20441
- notifySensorRewatched: boolean().nullable().optional()
20578
+ notifySensorRewatched: boolean().nullable().optional(),
20579
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
20580
+ notifySensorIgnored: boolean().nullable().optional()
20442
20581
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20443
20582
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20444
20583
  var NcAlarmNonBlockingEditSchema = object({
@@ -23353,6 +23492,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23353
23492
  timestamp: number()
23354
23493
  });
23355
23494
  /**
23495
+ * A root model's boxes standing in for one crop-kind step's own inference
23496
+ * (D730) — see `runPipeline.suppliedRoot`.
23497
+ */
23498
+ var SuppliedRootOutputSchema = object({
23499
+ stepId: string(),
23500
+ /** The root model that drew the boxes — stamped on the result. */
23501
+ modelId: string(),
23502
+ detections: array(object({
23503
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
23504
+ bbox: tuple([
23505
+ number(),
23506
+ number(),
23507
+ number(),
23508
+ number()
23509
+ ]),
23510
+ score: number(),
23511
+ /**
23512
+ * Five facial landmarks in the same pixels — a face the step's own
23513
+ * detector already re-found inside a root face box (D730), so its
23514
+ * embedder child aligns it exactly as it aligns any detected face.
23515
+ */
23516
+ landmarks: array(object({
23517
+ x: number(),
23518
+ y: number()
23519
+ })).optional()
23520
+ })).min(1)
23521
+ });
23522
+ /**
23356
23523
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23357
23524
  * within the frame, so the executor can re-cut a leaf child ROI at native
23358
23525
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -23400,7 +23567,7 @@ var FrameRefSchema = object({
23400
23567
  timestamp: number(),
23401
23568
  capturedAt: number().optional()
23402
23569
  });
23403
- var ModelFormatSchema$1 = _enum([
23570
+ var ModelFormatSchema$2 = _enum([
23404
23571
  "onnx",
23405
23572
  "coreml",
23406
23573
  "openvino",
@@ -23418,7 +23585,7 @@ var PipelineSlotSchema = _enum([
23418
23585
  var PipelineEngineChoiceSchema = object({
23419
23586
  runtime: literal("python"),
23420
23587
  backend: string(),
23421
- format: ModelFormatSchema$1,
23588
+ format: ModelFormatSchema$2,
23422
23589
  device: string().optional()
23423
23590
  });
23424
23591
  /**
@@ -23475,15 +23642,12 @@ var PipelineTemplateSchema$1 = object({
23475
23642
  var PipelineModelOptionSchema = object({
23476
23643
  id: string(),
23477
23644
  name: string(),
23478
- formats: record(string(), object({
23479
- downloaded: boolean(),
23480
- sizeMB: number()
23481
- })),
23645
+ formats: record(string(), PipelineModelFormatStatusSchema),
23482
23646
  group: ModelVariantGroupSchema.optional(),
23483
23647
  legacy: boolean().optional(),
23484
23648
  provider: ModelProviderIdSchema.optional(),
23485
23649
  defaultConfidence: number().optional(),
23486
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
23650
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
23487
23651
  });
23488
23652
  var ConfigFieldBridge = custom();
23489
23653
  var PipelineAddonSchemaSchema = object({
@@ -23645,6 +23809,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23645
23809
  }), {
23646
23810
  kind: "mutation",
23647
23811
  auth: "admin"
23812
+ }), method(object({
23813
+ nodeId: string(),
23814
+ deviceIds: array(number()).readonly().optional(),
23815
+ dryRun: boolean()
23816
+ }), object({
23817
+ entries: array(object({
23818
+ deviceId: number(),
23819
+ keys: array(string()).readonly()
23820
+ })).readonly(),
23821
+ refused: array(object({
23822
+ deviceId: number(),
23823
+ reason: string()
23824
+ })).readonly()
23825
+ }), {
23826
+ kind: "mutation",
23827
+ auth: "admin"
23648
23828
  }), method(object({ nodeId: string() }), object({ unhealthy: array(object({
23649
23829
  /** `<backend>:<device>`, e.g. `openvino:gpu`. */
23650
23830
  deviceKey: string(),
@@ -23681,11 +23861,11 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23681
23861
  }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
23682
23862
  addonId: string(),
23683
23863
  modelId: string(),
23684
- format: ModelFormatSchema$1
23864
+ format: ModelFormatSchema$2
23685
23865
  }), DownloadModelResultSchema, { kind: "mutation" }), method(object({
23686
23866
  addonId: string(),
23687
23867
  modelId: string(),
23688
- format: ModelFormatSchema$1
23868
+ format: ModelFormatSchema$2
23689
23869
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
23690
23870
  steps: array(PipelineStepInputSchema).min(1),
23691
23871
  frame: FrameInputSchema.optional(),
@@ -23751,7 +23931,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23751
23931
  * `device-not-servable`), and nothing reaches the camera's live
23752
23932
  * trace stream. Absent ⇒ unchanged behaviour.
23753
23933
  */
23754
- replay: literal(true).optional()
23934
+ replay: literal(true).optional(),
23935
+ /**
23936
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
23937
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
23938
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
23939
+ * NOT inferred, these boxes are its output, and its children (the plate
23940
+ * reader) run on them through their own crop policy. Boxes are in the
23941
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
23942
+ */
23943
+ suppliedRoot: SuppliedRootOutputSchema.optional()
23755
23944
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
23756
23945
  steps: array(PipelineStepInputSchema).min(1),
23757
23946
  frames: array(FrameInputSchema).min(1).max(255),
@@ -23833,6 +24022,352 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23833
24022
  filename: string().optional(),
23834
24023
  settings: record(string(), unknown()).optional()
23835
24024
  }), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
24025
+ /**
24026
+ * Wire shapes of the Load balancing surface (D748): the session placement
24027
+ * policy, the atomic share write, the observed placement statistics, the
24028
+ * hardware share suggestion and the stale device pins.
24029
+ */
24030
+ /**
24031
+ * How a new detection session picks its node and device.
24032
+ * - `least-loaded` — the historical rule: lowest `attached / weight`, a
24033
+ * constant node order at a tie (D37). An idle node always ties at 0, so a
24034
+ * weight only bites once a node already holds a session.
24035
+ * - `share` — the share of PARALLEL sessions is held to the weights, and a
24036
+ * full or drowning node yields to a free one (D748).
24037
+ */
24038
+ var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
24039
+ var LoadBalancingSharesInputSchema = object({
24040
+ /** nodeId → share (> 0). A node left out keeps its weight. */
24041
+ nodes: record(string(), number().positive()).default({}),
24042
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
24043
+ devices: record(string(), record(string(), number().positive())).default({})
24044
+ });
24045
+ var PlacementStatsInputSchema = object({
24046
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
24047
+ windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
24048
+ var PlacementDeviceStatsSchema = object({
24049
+ deviceKey: string(),
24050
+ /** Sessions running on this device now. */
24051
+ sessionsNow: number(),
24052
+ /** Sessions started on this device inside the window. */
24053
+ sessionsStarted: number(),
24054
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
24055
+ observedShare: number().nullable()
24056
+ });
24057
+ var PlacementNodeStatsSchema = object({
24058
+ nodeId: string(),
24059
+ sessionsNow: number(),
24060
+ sessionsStarted: number(),
24061
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
24062
+ observedShare: number().nullable(),
24063
+ /** Most sessions this node ran at once inside the window. */
24064
+ peakSessions: number(),
24065
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
24066
+ yieldsAway: number(),
24067
+ devices: array(PlacementDeviceStatsSchema).readonly()
24068
+ });
24069
+ /** A camera's device pin that the session path cannot honour. */
24070
+ var StaleDevicePinSchema = object({
24071
+ deviceId: number(),
24072
+ deviceKey: string(),
24073
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
24074
+ reason: _enum(["disabled", "absent"])
24075
+ });
24076
+ var PlacementStatsSchema = object({
24077
+ policy: SessionPlacementPolicySchema,
24078
+ windowMs: number(),
24079
+ /** How much of the window was actually observed (the hub keeps it in memory). */
24080
+ observedForMs: number(),
24081
+ sessionsNow: number(),
24082
+ /** Most parallel sessions across the cluster inside the window. */
24083
+ clusterPeakSessions: number(),
24084
+ nodes: array(PlacementNodeStatsSchema).readonly(),
24085
+ stalePins: array(StaleDevicePinSchema).readonly()
24086
+ });
24087
+ var SuggestSharesInputSchema = object({ headroom: number().min(.3).max(.5).default(.4) });
24088
+ var SuggestedDeviceShareSchema = object({
24089
+ deviceKey: string(),
24090
+ /** Share of the node (0–100, rounded). */
24091
+ share: number(),
24092
+ modelId: string().nullable(),
24093
+ /** Inferences per second at that model, from the measured table. */
24094
+ fps: number().nullable(),
24095
+ measured: boolean(),
24096
+ /** Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋. Never enforced. */
24097
+ suggestedMaxSessions: number().nullable()
24098
+ });
24099
+ var SuggestedNodeShareSchema = object({
24100
+ nodeId: string(),
24101
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
24102
+ share: number().nullable(),
24103
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
24104
+ capacitySessions: number(),
24105
+ devices: array(SuggestedDeviceShareSchema).readonly(),
24106
+ skippedReason: string().nullable()
24107
+ });
24108
+ var SuggestSharesResultSchema = object({
24109
+ headroom: number(),
24110
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
24111
+ cameraFps: number(),
24112
+ /** How many share → model → capacity rounds ran before the shares stopped moving (≤ 3). */
24113
+ iterations: number(),
24114
+ nodes: array(SuggestedNodeShareSchema).readonly()
24115
+ });
24116
+ /**
24117
+ * Where the node and device shares come from (D750).
24118
+ * - `auto` — computed by the system from the cluster's measured capacity at
24119
+ * the Auto tune models, and recomputed whenever a node or device joins,
24120
+ * leaves, is switched on or off, or changes model.
24121
+ * - `manual` — the operator's stored sliders. A node or device that cannot
24122
+ * take sessions gives its share to the others in proportion; the stored
24123
+ * values are never rewritten for that.
24124
+ */
24125
+ var ShareSourceSchema = _enum(["auto", "manual"]);
24126
+ var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
24127
+ object({
24128
+ nodes: record(string(), number()),
24129
+ devices: record(string(), record(string(), number()))
24130
+ });
24131
+ var EffectiveDeviceShareSchema = object({
24132
+ deviceKey: string(),
24133
+ /** Can take sessions now (enabled, available, can run the root). */
24134
+ eligible: boolean(),
24135
+ /** The share the source assigns, as a percentage of the node's devices. */
24136
+ configuredPct: number(),
24137
+ /** The share actually used, after an ineligible device's share went to the others. */
24138
+ effectivePct: number()
24139
+ });
24140
+ var EffectiveNodeShareSchema = object({
24141
+ nodeId: string(),
24142
+ eligible: boolean(),
24143
+ configuredPct: number(),
24144
+ effectivePct: number(),
24145
+ devices: array(EffectiveDeviceShareSchema).readonly()
24146
+ });
24147
+ var EffectiveSharesSchema = object({
24148
+ source: ShareSourceSchema,
24149
+ policy: SessionPlacementPolicySchema,
24150
+ /** `auto` with no computed answer yet: the stored sliders are used meanwhile. */
24151
+ autoPending: boolean(),
24152
+ /** When the automatic shares were last computed (ms epoch); null = never. */
24153
+ computedAt: number().nullable(),
24154
+ /** What made the system recompute them last. */
24155
+ trigger: string().nullable(),
24156
+ nodes: array(EffectiveNodeShareSchema).readonly(),
24157
+ /** The relative weights the election reads (before eligibility). */
24158
+ nodeWeights: record(string(), number()),
24159
+ deviceWeights: record(string(), record(string(), number()))
24160
+ });
24161
+ /**
24162
+ * The wire shapes of the Auto tune plan and apply (D745), used by the
24163
+ * `pipeline-orchestrator` cap. The recommender's own types
24164
+ * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
24165
+ * schemas are what crosses the cap boundary.
24166
+ */
24167
+ var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
24168
+ var HardwareClassIdSchema = _enum([
24169
+ "intel-core-ultra",
24170
+ "intel-n-series",
24171
+ "apple-m-base",
24172
+ "apple-m-pro",
24173
+ "unknown"
24174
+ ]);
24175
+ var AcceleratorKindSchema = _enum([
24176
+ "intel-npu",
24177
+ "intel-igpu",
24178
+ "x86-cpu",
24179
+ "arm-cpu",
24180
+ "apple-ane",
24181
+ "coral"
24182
+ ]);
24183
+ var RecommendationReasonSchema = discriminatedUnion("kind", [
24184
+ object({
24185
+ kind: literal("fits"),
24186
+ utilisation: number()
24187
+ }),
24188
+ object({
24189
+ kind: literal("tie-faster"),
24190
+ over: string(),
24191
+ recallDelta: number()
24192
+ }),
24193
+ object({
24194
+ kind: literal("stepped-down"),
24195
+ from: string(),
24196
+ to: string(),
24197
+ limitedBy: string()
24198
+ }),
24199
+ object({
24200
+ kind: literal("no-fit-lightest"),
24201
+ utilisation: number()
24202
+ }),
24203
+ object({
24204
+ kind: literal("derived-latency"),
24205
+ modelId: string()
24206
+ }),
24207
+ object({
24208
+ kind: literal("estimated-load"),
24209
+ observedForMs: number().nullable()
24210
+ }),
24211
+ object({ kind: literal("cpu-device") }),
24212
+ object({ kind: literal("coral-untouched") }),
24213
+ object({ kind: literal("device-disabled") }),
24214
+ object({ kind: literal("device-unavailable") }),
24215
+ object({ kind: literal("node-offline") }),
24216
+ object({ kind: literal("no-hardware-facts") }),
24217
+ object({
24218
+ kind: literal("no-measured-data"),
24219
+ hardwareClass: HardwareClassIdSchema
24220
+ }),
24221
+ object({
24222
+ kind: literal("no-family-build"),
24223
+ format: ModelFormatSchema$1
24224
+ })
24225
+ ]);
24226
+ var DeviceDemandSchema = object({
24227
+ nodeId: string(),
24228
+ deviceKey: string(),
24229
+ demandFps: number(),
24230
+ maxCameraFps: number(),
24231
+ alwaysOnCameras: number(),
24232
+ onMotionSessions: number(),
24233
+ onMotionSource: _enum([
24234
+ "observed-24h",
24235
+ "estimate",
24236
+ "none"
24237
+ ]),
24238
+ observedForMs: number().nullable(),
24239
+ /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
24240
+ placement: SessionPlacementPolicySchema
24241
+ });
24242
+ var DeviceModelChoiceSchema = object({
24243
+ modelId: string(),
24244
+ p50Ms: number(),
24245
+ fps: number(),
24246
+ measured: boolean(),
24247
+ utilisation: number(),
24248
+ personRecall: number()
24249
+ });
24250
+ var DeviceRecommendationSchema = object({
24251
+ deviceKey: string(),
24252
+ accelerator: AcceleratorKindSchema.nullable(),
24253
+ enabled: boolean(),
24254
+ available: boolean(),
24255
+ demand: DeviceDemandSchema.nullable(),
24256
+ chosen: DeviceModelChoiceSchema.nullable(),
24257
+ reasons: array(RecommendationReasonSchema).readonly()
24258
+ });
24259
+ var NodeRecommendationSchema = object({
24260
+ nodeId: string(),
24261
+ reachable: boolean(),
24262
+ hardwareClass: HardwareClassIdSchema.nullable(),
24263
+ cpuModel: string().nullable(),
24264
+ skipped: boolean(),
24265
+ acceleratorModelId: string().nullable(),
24266
+ devices: array(DeviceRecommendationSchema).readonly(),
24267
+ reasons: array(RecommendationReasonSchema).readonly()
24268
+ });
24269
+ var ModelPinChangeSchema = object({
24270
+ stepId: string(),
24271
+ before: string().nullable(),
24272
+ after: string().nullable()
24273
+ });
24274
+ var NodeDeviceChangeSchema = object({
24275
+ nodeId: string(),
24276
+ deviceKey: string(),
24277
+ madeExplicit: boolean(),
24278
+ modelPins: array(ModelPinChangeSchema).readonly(),
24279
+ thresholds: array(object({
24280
+ stepId: string(),
24281
+ keys: array(string()).readonly()
24282
+ })).readonly()
24283
+ });
24284
+ var CameraOverrideClearSchema = object({
24285
+ deviceId: number(),
24286
+ source: _enum(["step-override", "wholesale"]),
24287
+ nodeId: string(),
24288
+ deviceKey: string().nullable(),
24289
+ stepId: string(),
24290
+ modelIdBefore: string().nullable(),
24291
+ keys: array(string()).readonly()
24292
+ });
24293
+ var DetectorStoreClearSchema = object({
24294
+ deviceId: number(),
24295
+ keys: array(string()).readonly()
24296
+ });
24297
+ var AutoTuneWarningSchema = discriminatedUnion("kind", [
24298
+ object({
24299
+ kind: literal("detector-store-cluster-wide"),
24300
+ skippedNodes: array(string()).readonly()
24301
+ }),
24302
+ object({
24303
+ kind: literal("detector-store-unreadable"),
24304
+ error: string()
24305
+ }),
24306
+ object({
24307
+ kind: literal("coral-enabled"),
24308
+ nodeId: string(),
24309
+ deviceKey: string()
24310
+ })
24311
+ ]);
24312
+ var AutoTuneOptionsSchema = object({
24313
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
24314
+ headroom: number().min(.3).max(.5).default(.4),
24315
+ /**
24316
+ * What-if shares (D748): plan as if these node/device shares were stored
24317
+ * and the policy were `share`. Absent = the stored shares under the stored
24318
+ * policy. A what-if plan is for display; apply always re-plans from what
24319
+ * is stored.
24320
+ */
24321
+ shares: LoadBalancingSharesInputSchema.optional()
24322
+ });
24323
+ var AutoTunePlanSchema = object({
24324
+ /** Hash of everything the apply will write — the apply refuses a different one. */
24325
+ planHash: string(),
24326
+ family: literal("yolov9"),
24327
+ headroom: number(),
24328
+ /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
24329
+ whatIf: boolean(),
24330
+ generatedAt: number(),
24331
+ nodes: array(NodeRecommendationSchema).readonly(),
24332
+ nodeChanges: array(NodeDeviceChangeSchema).readonly(),
24333
+ cameraClears: array(CameraOverrideClearSchema).readonly(),
24334
+ detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
24335
+ warnings: array(AutoTuneWarningSchema).readonly()
24336
+ });
24337
+ var AutoTuneApplyInputSchema = object({
24338
+ planHash: string(),
24339
+ headroom: number().min(.3).max(.5).default(.4)
24340
+ });
24341
+ var AutoTunePhaseResultSchema = object({
24342
+ phase: _enum([
24343
+ "download",
24344
+ "camera-overrides",
24345
+ "detector-thresholds",
24346
+ "node-models",
24347
+ "redispatch"
24348
+ ]),
24349
+ ok: boolean(),
24350
+ detail: string()
24351
+ });
24352
+ var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
24353
+ object({
24354
+ kind: literal("applied"),
24355
+ planHash: string(),
24356
+ phases: array(AutoTunePhaseResultSchema).readonly()
24357
+ }),
24358
+ object({
24359
+ kind: literal("aborted"),
24360
+ phases: array(AutoTunePhaseResultSchema).readonly()
24361
+ }),
24362
+ object({
24363
+ kind: literal("stale"),
24364
+ plan: AutoTunePlanSchema
24365
+ }),
24366
+ object({
24367
+ kind: literal("refused"),
24368
+ reason: _enum(["apply-in-progress"])
24369
+ })
24370
+ ]);
23836
24371
  object({
23837
24372
  activeCameras: number(),
23838
24373
  throttledCameras: number(),
@@ -24853,7 +25388,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
24853
25388
  */
24854
25389
  cropJpeg: string().optional(),
24855
25390
  parent: DetailParentSchema,
24856
- steps: array(string()).optional()
25391
+ steps: array(string()).optional(),
25392
+ /**
25393
+ * The camera's root model already drew this step's boxes (D730): a
25394
+ * `license_plate` inside the parent vehicle. The named step is NOT
25395
+ * inferred — these FRAME-space boxes are its output — and its
25396
+ * requested children (the plate reader) run on them. Absent ⇒ every
25397
+ * requested step infers as before.
25398
+ */
25399
+ supplied: object({
25400
+ stepId: string(),
25401
+ modelId: string(),
25402
+ boxes: array(object({
25403
+ bbox: NativeCropBboxSchema,
25404
+ score: number()
25405
+ })).min(1)
25406
+ }).optional()
24857
25407
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
24858
25408
  /** Catalog step id, e.g. `clip-embedding`. */
24859
25409
  stepId: string(),
@@ -24998,7 +25548,6 @@ var CameraStepOverridePatchSchema = object({
24998
25548
  settings: record(string(), unknown()).readonly().optional()
24999
25549
  });
25000
25550
  var CameraPipelineSettingsSchema = object({
25001
- pinnedAgentNodeId: string().optional(),
25002
25551
  stepToggles: record(string(), boolean()).optional(),
25003
25552
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
25004
25553
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -25497,12 +26046,6 @@ method(object({
25497
26046
  }), object({ success: literal(true) }), {
25498
26047
  kind: "mutation",
25499
26048
  auth: "admin"
25500
- }), method(object({
25501
- agentNodeId: string(),
25502
- detectWeight: number().positive().nullable()
25503
- }), object({ success: literal(true) }), {
25504
- kind: "mutation",
25505
- auth: "admin"
25506
26049
  }), method(object({
25507
26050
  agentNodeId: string(),
25508
26051
  detect: boolean().nullable().optional(),
@@ -25544,6 +26087,15 @@ method(object({
25544
26087
  }), {
25545
26088
  kind: "mutation",
25546
26089
  auth: "admin"
26090
+ }), method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }), method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
26091
+ kind: "mutation",
26092
+ auth: "admin"
26093
+ }), method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
26094
+ kind: "mutation",
26095
+ auth: "admin"
26096
+ }), method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }), method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }), method(_void(), EffectiveSharesSchema, { auth: "admin" }), method(SetShareSourceInputSchema, object({ success: literal(true) }), {
26097
+ kind: "mutation",
26098
+ auth: "admin"
25547
26099
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
25548
26100
  deviceId: number(),
25549
26101
  addonId: string(),
@@ -28154,6 +28706,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28154
28706
  */
28155
28707
  alive: boolean()
28156
28708
  })), method(object({
28709
+ deviceId: number().int().nonnegative(),
28710
+ sessionId: string(),
28711
+ downlinkMbps: number().nonnegative()
28712
+ }), object({
28713
+ outcome: _enum(["switching", "held"]),
28714
+ tier: CamProfileSchema.nullable(),
28715
+ reason: string()
28716
+ }), { kind: "mutation" }), method(object({
28157
28717
  deviceId: number().int().nonnegative(),
28158
28718
  sessionId: string()
28159
28719
  }), WebrtcSessionDebugSchema, { kind: "query" });
@@ -30829,7 +31389,8 @@ var ConnectionEndpointSchema = object({
30829
31389
  "lan-ipv6",
30830
31390
  "public",
30831
31391
  "loopback",
30832
- "app-link"
31392
+ "app-link",
31393
+ "custom"
30833
31394
  ]),
30834
31395
  /**
30835
31396
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30898,7 +31459,7 @@ var GetConnectionEndpointsResultSchema = object({
30898
31459
  localPort: AdvertisedLocalPortSchema
30899
31460
  });
30900
31461
  /**
30901
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
31462
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
30902
31463
  * since D709 is the CamStack app link; `resolved` reports the effective value,
30903
31464
  * so the UI can show it either way.
30904
31465
  */
@@ -30931,6 +31492,72 @@ var ViewerEndpointsSchema = object({
30931
31492
  /** What the ranking currently resolves to (may be empty if nothing is up). */
30932
31493
  resolved: array(string()).readonly()
30933
31494
  });
31495
+ /**
31496
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
31497
+ * for addons built against it): `cluster` is the `internal` role, `browser`
31498
+ * the `publicEndpoint` role; `override` is the flagged address.
31499
+ */
31500
+ var HubAddressSnapshotSchema = object({
31501
+ override: string().nullable(),
31502
+ resolved: string().nullable(),
31503
+ source: _enum([
31504
+ "override",
31505
+ "auto",
31506
+ "none"
31507
+ ])
31508
+ });
31509
+ var HubAddressesSchema = object({
31510
+ cluster: HubAddressSnapshotSchema,
31511
+ browser: HubAddressSnapshotSchema
31512
+ });
31513
+ /**
31514
+ * What an address is used for (`hub-address.ts`, D734). `appConnections` is
31515
+ * many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
31516
+ * by at most one address.
31517
+ */
31518
+ var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
31519
+ var RoleSourceSchema = _enum([
31520
+ "flagged",
31521
+ "auto",
31522
+ "none"
31523
+ ]);
31524
+ /** One single-valued role: the flagged address, the one in use, and why. */
31525
+ var HubAddressRoleResolutionSchema = object({
31526
+ /** The address carrying the flag, or null = automatic. */
31527
+ flagged: string().nullable(),
31528
+ /** The address in use, or null when nothing qualifies (never loopback). */
31529
+ resolved: string().nullable(),
31530
+ source: RoleSourceSchema
31531
+ });
31532
+ var HubAppConnectionsResolutionSchema = object({
31533
+ /** The addresses flagged `appConnections`, or empty = automatic. */
31534
+ flagged: array(string()).readonly(),
31535
+ /** What the apps race right now. */
31536
+ resolved: array(string()).readonly(),
31537
+ source: RoleSourceSchema
31538
+ });
31539
+ var HubAddressBookSchema = object({
31540
+ rows: array(ConnectionEndpointSchema.extend({
31541
+ /** In the hub's detected palette right now. */
31542
+ detected: boolean(),
31543
+ /** Entered by the operator (removable). */
31544
+ custom: boolean(),
31545
+ /** The roles explicitly flagged on this address. */
31546
+ flags: array(HubAddressRoleSchema).readonly(),
31547
+ /** The roles this address serves right now — flagged or automatic. */
31548
+ inUse: array(HubAddressRoleSchema).readonly(),
31549
+ /** The roles this address may be flagged with. */
31550
+ eligible: array(HubAddressRoleSchema).readonly()
31551
+ })).readonly(),
31552
+ roles: object({
31553
+ appConnections: HubAppConnectionsResolutionSchema,
31554
+ notificationTaps: HubAddressRoleResolutionSchema,
31555
+ internal: HubAddressRoleResolutionSchema,
31556
+ publicEndpoint: HubAddressRoleResolutionSchema
31557
+ }),
31558
+ /** The `hub=` an app link carries (D709), or null. */
31559
+ appLinkHub: string().nullable()
31560
+ });
30934
31561
  var AllowedAddressesSchema = object({
30935
31562
  /**
30936
31563
  * Allowlist of interface addresses operators have explicitly opted
@@ -30974,10 +31601,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30974
31601
  * tunnel always emits `https://` regardless. */
30975
31602
  scheme: _enum(["http", "https"]).optional(),
30976
31603
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30977
- * an address notification links can be flagged with, not a hub
31604
+ * an address notification taps can be flagged with, not a hub
30978
31605
  * route. Default `false`: racers and rankers never see it. */
30979
31606
  includeAppLink: boolean().optional()
30980
- }), 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, {
31607
+ }), 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({
31608
+ baseUrl: string(),
31609
+ label: string().max(80)
31610
+ }), HubAddressBookSchema, {
31611
+ kind: "mutation",
31612
+ auth: "admin"
31613
+ }), method(object({ baseUrl: string() }), HubAddressBookSchema, {
31614
+ kind: "mutation",
31615
+ auth: "admin"
31616
+ }), method(object({
31617
+ role: HubAddressRoleSchema,
31618
+ baseUrl: string().nullable(),
31619
+ enabled: boolean(),
31620
+ acceptInsecureHttp: boolean().optional()
31621
+ }), HubAddressBookSchema, {
31622
+ kind: "mutation",
31623
+ auth: "admin"
31624
+ }), 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, {
30981
31625
  kind: "mutation",
30982
31626
  auth: "admin"
30983
31627
  }), method(object({
@@ -31367,7 +32011,8 @@ object({
31367
32011
  * writes this slice (not even a boot seed), and neither does the runner's
31368
32012
  * phase machine: its phase is "a session is attached" for every on-motion
31369
32013
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
31370
- * A provider's `isDetected` answers from the hub's slice.
32014
+ * A provider's `isDetected` and `getStatus` answer from the hub's slice
32015
+ * (`hubMotionNativeProvider`).
31371
32016
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
31372
32017
  * imports) — the provider pushes both edges itself, from the upstream
31373
32018
  * system's own state change. That is the sensor's own fact.
@@ -36498,6 +37143,16 @@ DeviceType.Camera, method(object({
36498
37143
  package: array(ZoneRuleSchema).readonly()
36499
37144
  });
36500
37145
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
37146
+ Object.freeze({
37147
+ person: .5,
37148
+ vehicle: .5,
37149
+ animal: .5
37150
+ });
37151
+ Object.freeze({
37152
+ person: .65,
37153
+ vehicle: .65,
37154
+ animal: .65
37155
+ });
36501
37156
  /**
36502
37157
  * Accessory device helpers — shared across drivers.
36503
37158
  *
@@ -39426,12 +40081,24 @@ Object.freeze({
39426
40081
  addonId: null,
39427
40082
  access: "view"
39428
40083
  },
40084
+ "localNetwork.addCustomAddress": {
40085
+ capName: "local-network",
40086
+ capScope: "system",
40087
+ addonId: null,
40088
+ access: "create"
40089
+ },
39429
40090
  "localNetwork.downloadCa": {
39430
40091
  capName: "local-network",
39431
40092
  capScope: "system",
39432
40093
  addonId: null,
39433
40094
  access: "view"
39434
40095
  },
40096
+ "localNetwork.getAddresses": {
40097
+ capName: "local-network",
40098
+ capScope: "system",
40099
+ addonId: null,
40100
+ access: "view"
40101
+ },
39435
40102
  "localNetwork.getAllowedAddresses": {
39436
40103
  capName: "local-network",
39437
40104
  capScope: "system",
@@ -39444,6 +40111,12 @@ Object.freeze({
39444
40111
  addonId: null,
39445
40112
  access: "view"
39446
40113
  },
40114
+ "localNetwork.getHubAddresses": {
40115
+ capName: "local-network",
40116
+ capScope: "system",
40117
+ addonId: null,
40118
+ access: "view"
40119
+ },
39447
40120
  "localNetwork.getNotificationEndpoint": {
39448
40121
  capName: "local-network",
39449
40122
  capScope: "system",
@@ -39480,6 +40153,12 @@ Object.freeze({
39480
40153
  addonId: null,
39481
40154
  access: "create"
39482
40155
  },
40156
+ "localNetwork.removeCustomAddress": {
40157
+ capName: "local-network",
40158
+ capScope: "system",
40159
+ addonId: null,
40160
+ access: "delete"
40161
+ },
39483
40162
  "localNetwork.resetAllowlistToBestMatch": {
39484
40163
  capName: "local-network",
39485
40164
  capScope: "system",
@@ -39492,6 +40171,12 @@ Object.freeze({
39492
40171
  addonId: null,
39493
40172
  access: "create"
39494
40173
  },
40174
+ "localNetwork.setAddressRole": {
40175
+ capName: "local-network",
40176
+ capScope: "system",
40177
+ addonId: null,
40178
+ access: "create"
40179
+ },
39495
40180
  "localNetwork.setAllowedAddresses": {
39496
40181
  capName: "local-network",
39497
40182
  capScope: "system",
@@ -40986,6 +41671,12 @@ Object.freeze({
40986
41671
  addonId: null,
40987
41672
  access: "delete"
40988
41673
  },
41674
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
41675
+ capName: "pipeline-executor",
41676
+ capScope: "system",
41677
+ addonId: null,
41678
+ access: "delete"
41679
+ },
40989
41680
  "pipelineExecutor.deleteModel": {
40990
41681
  capName: "pipeline-executor",
40991
41682
  capScope: "system",
@@ -41202,6 +41893,12 @@ Object.freeze({
41202
41893
  addonId: null,
41203
41894
  access: "view"
41204
41895
  },
41896
+ "pipelineOrchestrator.applyAutoTune": {
41897
+ capName: "pipeline-orchestrator",
41898
+ capScope: "system",
41899
+ addonId: null,
41900
+ access: "create"
41901
+ },
41205
41902
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
41206
41903
  capName: "pipeline-orchestrator",
41207
41904
  capScope: "system",
@@ -41316,6 +42013,12 @@ Object.freeze({
41316
42013
  addonId: null,
41317
42014
  access: "view"
41318
42015
  },
42016
+ "pipelineOrchestrator.getEffectiveShares": {
42017
+ capName: "pipeline-orchestrator",
42018
+ capScope: "system",
42019
+ addonId: null,
42020
+ access: "view"
42021
+ },
41319
42022
  "pipelineOrchestrator.getGlobalMetrics": {
41320
42023
  capName: "pipeline-orchestrator",
41321
42024
  capScope: "system",
@@ -41352,6 +42055,12 @@ Object.freeze({
41352
42055
  addonId: null,
41353
42056
  access: "view"
41354
42057
  },
42058
+ "pipelineOrchestrator.getPlacementStats": {
42059
+ capName: "pipeline-orchestrator",
42060
+ capScope: "system",
42061
+ addonId: null,
42062
+ access: "view"
42063
+ },
41355
42064
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
41356
42065
  capName: "pipeline-orchestrator",
41357
42066
  capScope: "system",
@@ -41376,6 +42085,12 @@ Object.freeze({
41376
42085
  addonId: null,
41377
42086
  access: "create"
41378
42087
  },
42088
+ "pipelineOrchestrator.planAutoTune": {
42089
+ capName: "pipeline-orchestrator",
42090
+ capScope: "system",
42091
+ addonId: null,
42092
+ access: "view"
42093
+ },
41379
42094
  "pipelineOrchestrator.rebalance": {
41380
42095
  capName: "pipeline-orchestrator",
41381
42096
  capScope: "system",
@@ -41436,12 +42151,6 @@ Object.freeze({
41436
42151
  addonId: null,
41437
42152
  access: "create"
41438
42153
  },
41439
- "pipelineOrchestrator.setAgentDetectWeight": {
41440
- capName: "pipeline-orchestrator",
41441
- capScope: "system",
41442
- addonId: null,
41443
- access: "create"
41444
- },
41445
42154
  "pipelineOrchestrator.setAgentInferenceDevices": {
41446
42155
  capName: "pipeline-orchestrator",
41447
42156
  capScope: "system",
@@ -41496,12 +42205,30 @@ Object.freeze({
41496
42205
  addonId: null,
41497
42206
  access: "create"
41498
42207
  },
42208
+ "pipelineOrchestrator.setLoadBalancingShares": {
42209
+ capName: "pipeline-orchestrator",
42210
+ capScope: "system",
42211
+ addonId: null,
42212
+ access: "create"
42213
+ },
41499
42214
  "pipelineOrchestrator.setPipelineDevicePin": {
41500
42215
  capName: "pipeline-orchestrator",
41501
42216
  capScope: "system",
41502
42217
  addonId: null,
41503
42218
  access: "create"
41504
42219
  },
42220
+ "pipelineOrchestrator.setShareSource": {
42221
+ capName: "pipeline-orchestrator",
42222
+ capScope: "system",
42223
+ addonId: null,
42224
+ access: "create"
42225
+ },
42226
+ "pipelineOrchestrator.suggestShares": {
42227
+ capName: "pipeline-orchestrator",
42228
+ capScope: "system",
42229
+ addonId: null,
42230
+ access: "view"
42231
+ },
41505
42232
  "pipelineOrchestrator.unassignAudio": {
41506
42233
  capName: "pipeline-orchestrator",
41507
42234
  capScope: "system",
@@ -43746,6 +44473,12 @@ Object.freeze({
43746
44473
  addonId: null,
43747
44474
  access: "create"
43748
44475
  },
44476
+ "webrtcSession.applyDownlinkProbe": {
44477
+ capName: "webrtc-session",
44478
+ capScope: "device",
44479
+ addonId: null,
44480
+ access: "create"
44481
+ },
43749
44482
  "webrtcSession.closeSession": {
43750
44483
  capName: "webrtc-session",
43751
44484
  capScope: "device",
@@ -46792,6 +47525,11 @@ Object.freeze({
46792
47525
  form: "single",
46793
47526
  optional: false
46794
47527
  }],
47528
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
47529
+ name: "deviceIds",
47530
+ form: "array",
47531
+ optional: true
47532
+ }],
46795
47533
  "pipelineExecutor.runPipeline": [{
46796
47534
  name: "deviceId",
46797
47535
  form: "single",
@@ -47668,6 +48406,11 @@ Object.freeze({
47668
48406
  form: "single",
47669
48407
  optional: false
47670
48408
  }],
48409
+ "webrtcSession.applyDownlinkProbe": [{
48410
+ name: "deviceId",
48411
+ form: "single",
48412
+ optional: false
48413
+ }],
47671
48414
  "webrtcSession.closeSession": [{
47672
48415
  name: "deviceId",
47673
48416
  form: "single",
@@ -47897,6 +48640,8 @@ new Map(Object.entries({
47897
48640
  "detection-blind": "device-events",
47898
48641
  "node-online": "system",
47899
48642
  "node-offline": "system",
48643
+ "node-restarting": "system",
48644
+ "node-updating": "system",
47900
48645
  "node-inference-unavailable": "system",
47901
48646
  "addon-crash-loop": "system",
47902
48647
  "addon-update-available": "system",
@@ -47974,6 +48719,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47974
48719
  kinds: [
47975
48720
  "node-offline",
47976
48721
  "node-online",
48722
+ "node-restarting",
47977
48723
  "node-inference-unavailable"
47978
48724
  ]
47979
48725
  },
@@ -47995,6 +48741,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47995
48741
  label: "Server & container updates",
47996
48742
  kinds: [
47997
48743
  "server-update-available",
48744
+ "node-updating",
47998
48745
  "server-updated",
47999
48746
  "wrapper-update-available"
48000
48747
  ]
@@ -48142,6 +48889,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48142
48889
  kinds: [
48143
48890
  "node-offline",
48144
48891
  "node-online",
48892
+ "node-restarting",
48145
48893
  "node-inference-unavailable"
48146
48894
  ]
48147
48895
  },
@@ -48163,6 +48911,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48163
48911
  example: "server 1.2.377 → 1.2.378",
48164
48912
  kinds: [
48165
48913
  "server-update-available",
48914
+ "node-updating",
48166
48915
  "server-updated",
48167
48916
  "wrapper-update-available"
48168
48917
  ]
@@ -48195,7 +48944,7 @@ var STATE_SUMMARY_VARS = [
48195
48944
  {
48196
48945
  name: "summarySection",
48197
48946
  label: "Summary: this section",
48198
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
48947
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
48199
48948
  example: "Batterie scariche",
48200
48949
  group: "system",
48201
48950
  families: ["rule"],
@@ -53254,7 +54003,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53254
54003
  type: "select",
53255
54004
  key: "region",
53256
54005
  label: "Skill region",
53257
- description: "Drives the Event Gateway endpoint used for proactive doorbell push. Pick the region your Alexa account is in.",
54006
+ 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.",
53258
54007
  options: [
53259
54008
  {
53260
54009
  value: "NA",
@@ -53283,7 +54032,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53283
54032
  type: "text",
53284
54033
  key: "lwaClientId",
53285
54034
  label: "LWA client id (proactive events)",
53286
- description: "From the skill's Permissions → \"Send Alexa Events\" panel. Required for proactive doorbell push to Alexa.",
54035
+ 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.",
53287
54036
  default: DEFAULT_CONFIG.lwaClientId
53288
54037
  }),
53289
54038
  this.field({