@camstack/addon-export-alexa 1.2.129 → 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.
@@ -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,6 +10740,26 @@ var ClipSearchStrictnessSchema = _enum([
10740
10740
  "balanced",
10741
10741
  "strict"
10742
10742
  ]);
10743
+ /** Steps whose effect a root label can BE. */
10744
+ var LABEL_SUPPLY_STEP_IDS = [
10745
+ "animal-classifier",
10746
+ "vehicle-classifier",
10747
+ "package-detection"
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
+ ];
10743
10763
  var MODEL_FORMATS = [
10744
10764
  "onnx",
10745
10765
  "coreml",
@@ -10768,7 +10788,53 @@ var ModelFormatEntrySchema = object({
10768
10788
  /** Multi-file payload (directory members or sibling files). */
10769
10789
  files: array(string()).readonly().optional(),
10770
10790
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
10771
- 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()
10772
10838
  });
10773
10839
  /**
10774
10840
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -10872,6 +10938,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10872
10938
  /** True when the weights or their data forbid commercial use. */
10873
10939
  nonCommercial: boolean().optional()
10874
10940
  }));
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
+ ]);
10875
10981
  var ModelCatalogEntrySchema = object({
10876
10982
  id: string(),
10877
10983
  name: string(),
@@ -10937,6 +11043,35 @@ var ModelCatalogEntrySchema = object({
10937
11043
  */
10938
11044
  defaultConfidence: number().min(0).max(1).optional(),
10939
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
+ /**
10940
11075
  * When true, the executor produces a landmark-aligned crop (similarity warp
10941
11076
  * onto the canonical template) before this step runs, instead of a plain
10942
11077
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -10998,6 +11133,16 @@ var ModelCatalogEntrySchema = object({
10998
11133
  */
10999
11134
  classMap: DetectionCatalogClassMapSchema.optional(),
11000
11135
  /**
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`).
11143
+ */
11144
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
11145
+ /**
11001
11146
  * The model's CLIP feature-space contract (text encoder, dimension, vector
11002
11147
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
11003
11148
  * CLIP image encoder; its absence is what "not a CLIP model" means to the
@@ -16207,6 +16352,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
16207
16352
  kind: "mutation",
16208
16353
  auth: "admin"
16209
16354
  });
16355
+ var HUB_ADDRESS_ROLES = [
16356
+ "appConnections",
16357
+ "notificationTaps",
16358
+ "internal",
16359
+ "publicEndpoint"
16360
+ ];
16210
16361
  /**
16211
16362
  * Transport bounds for AI capability methods.
16212
16363
  *
@@ -18771,6 +18922,8 @@ var NcSystemEventKindSchema = _enum([
18771
18922
  "stream-offline",
18772
18923
  "node-online",
18773
18924
  "node-offline",
18925
+ "node-restarting",
18926
+ "node-updating",
18774
18927
  "node-inference-unavailable",
18775
18928
  "detection-blind",
18776
18929
  "addon-crash-loop",
@@ -20376,7 +20529,13 @@ var NcAlarmModeDelaysListSchema = array(object({
20376
20529
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20377
20530
  * is the one that starts the entry delay — the entry-delay notification already names it.
20378
20531
  */
20379
- 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()
20380
20539
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20381
20540
  var NcAlarmModeDelaysEditListSchema = array(object({
20382
20541
  mode: AlarmArmModeSchema,
@@ -20389,7 +20548,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20389
20548
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20390
20549
  notifyDuringEntryDelay: boolean().nullable().optional(),
20391
20550
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20392
- 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()
20393
20554
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20394
20555
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20395
20556
  var NcAlarmNonBlockingEditSchema = object({
@@ -23304,6 +23465,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23304
23465
  timestamp: number()
23305
23466
  });
23306
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
+ /**
23307
23496
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23308
23497
  * within the frame, so the executor can re-cut a leaf child ROI at native
23309
23498
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -23351,7 +23540,7 @@ var FrameRefSchema = object({
23351
23540
  timestamp: number(),
23352
23541
  capturedAt: number().optional()
23353
23542
  });
23354
- var ModelFormatSchema$1 = _enum([
23543
+ var ModelFormatSchema$2 = _enum([
23355
23544
  "onnx",
23356
23545
  "coreml",
23357
23546
  "openvino",
@@ -23369,7 +23558,7 @@ var PipelineSlotSchema = _enum([
23369
23558
  var PipelineEngineChoiceSchema = object({
23370
23559
  runtime: literal("python"),
23371
23560
  backend: string(),
23372
- format: ModelFormatSchema$1,
23561
+ format: ModelFormatSchema$2,
23373
23562
  device: string().optional()
23374
23563
  });
23375
23564
  /**
@@ -23426,14 +23615,12 @@ var PipelineTemplateSchema$1 = object({
23426
23615
  var PipelineModelOptionSchema = object({
23427
23616
  id: string(),
23428
23617
  name: string(),
23429
- formats: record(string(), object({
23430
- downloaded: boolean(),
23431
- sizeMB: number()
23432
- })),
23618
+ formats: record(string(), PipelineModelFormatStatusSchema),
23433
23619
  group: ModelVariantGroupSchema.optional(),
23434
23620
  legacy: boolean().optional(),
23435
23621
  provider: ModelProviderIdSchema.optional(),
23436
- defaultConfidence: number().optional()
23622
+ defaultConfidence: number().optional(),
23623
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
23437
23624
  });
23438
23625
  var ConfigFieldBridge = custom();
23439
23626
  var PipelineAddonSchemaSchema = object({
@@ -23595,6 +23782,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23595
23782
  }), {
23596
23783
  kind: "mutation",
23597
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"
23598
23801
  }), method(object({ nodeId: string() }), object({ unhealthy: array(object({
23599
23802
  /** `<backend>:<device>`, e.g. `openvino:gpu`. */
23600
23803
  deviceKey: string(),
@@ -23631,11 +23834,11 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23631
23834
  }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
23632
23835
  addonId: string(),
23633
23836
  modelId: string(),
23634
- format: ModelFormatSchema$1
23837
+ format: ModelFormatSchema$2
23635
23838
  }), DownloadModelResultSchema, { kind: "mutation" }), method(object({
23636
23839
  addonId: string(),
23637
23840
  modelId: string(),
23638
- format: ModelFormatSchema$1
23841
+ format: ModelFormatSchema$2
23639
23842
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
23640
23843
  steps: array(PipelineStepInputSchema).min(1),
23641
23844
  frame: FrameInputSchema.optional(),
@@ -23701,7 +23904,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23701
23904
  * `device-not-servable`), and nothing reaches the camera's live
23702
23905
  * trace stream. Absent ⇒ unchanged behaviour.
23703
23906
  */
23704
- 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()
23705
23917
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
23706
23918
  steps: array(PipelineStepInputSchema).min(1),
23707
23919
  frames: array(FrameInputSchema).min(1).max(255),
@@ -23783,6 +23995,352 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23783
23995
  filename: string().optional(),
23784
23996
  settings: record(string(), unknown()).optional()
23785
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
+ ]);
23786
24344
  object({
23787
24345
  activeCameras: number(),
23788
24346
  throttledCameras: number(),
@@ -24803,7 +25361,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
24803
25361
  */
24804
25362
  cropJpeg: string().optional(),
24805
25363
  parent: DetailParentSchema,
24806
- 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()
24807
25380
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
24808
25381
  /** Catalog step id, e.g. `clip-embedding`. */
24809
25382
  stepId: string(),
@@ -24948,7 +25521,6 @@ var CameraStepOverridePatchSchema = object({
24948
25521
  settings: record(string(), unknown()).readonly().optional()
24949
25522
  });
24950
25523
  var CameraPipelineSettingsSchema = object({
24951
- pinnedAgentNodeId: string().optional(),
24952
25524
  stepToggles: record(string(), boolean()).optional(),
24953
25525
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
24954
25526
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -25447,12 +26019,6 @@ method(object({
25447
26019
  }), object({ success: literal(true) }), {
25448
26020
  kind: "mutation",
25449
26021
  auth: "admin"
25450
- }), method(object({
25451
- agentNodeId: string(),
25452
- detectWeight: number().positive().nullable()
25453
- }), object({ success: literal(true) }), {
25454
- kind: "mutation",
25455
- auth: "admin"
25456
26022
  }), method(object({
25457
26023
  agentNodeId: string(),
25458
26024
  detect: boolean().nullable().optional(),
@@ -25494,6 +26060,15 @@ method(object({
25494
26060
  }), {
25495
26061
  kind: "mutation",
25496
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"
25497
26072
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
25498
26073
  deviceId: number(),
25499
26074
  addonId: string(),
@@ -28104,6 +28679,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28104
28679
  */
28105
28680
  alive: boolean()
28106
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({
28107
28690
  deviceId: number().int().nonnegative(),
28108
28691
  sessionId: string()
28109
28692
  }), WebrtcSessionDebugSchema, { kind: "query" });
@@ -30779,7 +31362,8 @@ var ConnectionEndpointSchema = object({
30779
31362
  "lan-ipv6",
30780
31363
  "public",
30781
31364
  "loopback",
30782
- "app-link"
31365
+ "app-link",
31366
+ "custom"
30783
31367
  ]),
30784
31368
  /**
30785
31369
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30848,7 +31432,7 @@ var GetConnectionEndpointsResultSchema = object({
30848
31432
  localPort: AdvertisedLocalPortSchema
30849
31433
  });
30850
31434
  /**
30851
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
31435
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
30852
31436
  * since D709 is the CamStack app link; `resolved` reports the effective value,
30853
31437
  * so the UI can show it either way.
30854
31438
  */
@@ -30881,6 +31465,72 @@ var ViewerEndpointsSchema = object({
30881
31465
  /** What the ranking currently resolves to (may be empty if nothing is up). */
30882
31466
  resolved: array(string()).readonly()
30883
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
+ });
30884
31534
  var AllowedAddressesSchema = object({
30885
31535
  /**
30886
31536
  * Allowlist of interface addresses operators have explicitly opted
@@ -30924,10 +31574,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30924
31574
  * tunnel always emits `https://` regardless. */
30925
31575
  scheme: _enum(["http", "https"]).optional(),
30926
31576
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30927
- * an address notification links can be flagged with, not a hub
31577
+ * an address notification taps can be flagged with, not a hub
30928
31578
  * route. Default `false`: racers and rankers never see it. */
30929
31579
  includeAppLink: boolean().optional()
30930
- }), 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, {
30931
31598
  kind: "mutation",
30932
31599
  auth: "admin"
30933
31600
  }), method(object({
@@ -31317,7 +31984,8 @@ object({
31317
31984
  * writes this slice (not even a boot seed), and neither does the runner's
31318
31985
  * phase machine: its phase is "a session is attached" for every on-motion
31319
31986
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
31320
- * 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`).
31321
31989
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
31322
31990
  * imports) — the provider pushes both edges itself, from the upstream
31323
31991
  * system's own state change. That is the sensor's own fact.
@@ -36448,6 +37116,16 @@ DeviceType.Camera, method(object({
36448
37116
  package: array(ZoneRuleSchema).readonly()
36449
37117
  });
36450
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
+ });
36451
37129
  /**
36452
37130
  * Accessory device helpers — shared across drivers.
36453
37131
  *
@@ -39376,12 +40054,24 @@ Object.freeze({
39376
40054
  addonId: null,
39377
40055
  access: "view"
39378
40056
  },
40057
+ "localNetwork.addCustomAddress": {
40058
+ capName: "local-network",
40059
+ capScope: "system",
40060
+ addonId: null,
40061
+ access: "create"
40062
+ },
39379
40063
  "localNetwork.downloadCa": {
39380
40064
  capName: "local-network",
39381
40065
  capScope: "system",
39382
40066
  addonId: null,
39383
40067
  access: "view"
39384
40068
  },
40069
+ "localNetwork.getAddresses": {
40070
+ capName: "local-network",
40071
+ capScope: "system",
40072
+ addonId: null,
40073
+ access: "view"
40074
+ },
39385
40075
  "localNetwork.getAllowedAddresses": {
39386
40076
  capName: "local-network",
39387
40077
  capScope: "system",
@@ -39394,6 +40084,12 @@ Object.freeze({
39394
40084
  addonId: null,
39395
40085
  access: "view"
39396
40086
  },
40087
+ "localNetwork.getHubAddresses": {
40088
+ capName: "local-network",
40089
+ capScope: "system",
40090
+ addonId: null,
40091
+ access: "view"
40092
+ },
39397
40093
  "localNetwork.getNotificationEndpoint": {
39398
40094
  capName: "local-network",
39399
40095
  capScope: "system",
@@ -39430,6 +40126,12 @@ Object.freeze({
39430
40126
  addonId: null,
39431
40127
  access: "create"
39432
40128
  },
40129
+ "localNetwork.removeCustomAddress": {
40130
+ capName: "local-network",
40131
+ capScope: "system",
40132
+ addonId: null,
40133
+ access: "delete"
40134
+ },
39433
40135
  "localNetwork.resetAllowlistToBestMatch": {
39434
40136
  capName: "local-network",
39435
40137
  capScope: "system",
@@ -39442,6 +40144,12 @@ Object.freeze({
39442
40144
  addonId: null,
39443
40145
  access: "create"
39444
40146
  },
40147
+ "localNetwork.setAddressRole": {
40148
+ capName: "local-network",
40149
+ capScope: "system",
40150
+ addonId: null,
40151
+ access: "create"
40152
+ },
39445
40153
  "localNetwork.setAllowedAddresses": {
39446
40154
  capName: "local-network",
39447
40155
  capScope: "system",
@@ -40936,6 +41644,12 @@ Object.freeze({
40936
41644
  addonId: null,
40937
41645
  access: "delete"
40938
41646
  },
41647
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
41648
+ capName: "pipeline-executor",
41649
+ capScope: "system",
41650
+ addonId: null,
41651
+ access: "delete"
41652
+ },
40939
41653
  "pipelineExecutor.deleteModel": {
40940
41654
  capName: "pipeline-executor",
40941
41655
  capScope: "system",
@@ -41152,6 +41866,12 @@ Object.freeze({
41152
41866
  addonId: null,
41153
41867
  access: "view"
41154
41868
  },
41869
+ "pipelineOrchestrator.applyAutoTune": {
41870
+ capName: "pipeline-orchestrator",
41871
+ capScope: "system",
41872
+ addonId: null,
41873
+ access: "create"
41874
+ },
41155
41875
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
41156
41876
  capName: "pipeline-orchestrator",
41157
41877
  capScope: "system",
@@ -41266,6 +41986,12 @@ Object.freeze({
41266
41986
  addonId: null,
41267
41987
  access: "view"
41268
41988
  },
41989
+ "pipelineOrchestrator.getEffectiveShares": {
41990
+ capName: "pipeline-orchestrator",
41991
+ capScope: "system",
41992
+ addonId: null,
41993
+ access: "view"
41994
+ },
41269
41995
  "pipelineOrchestrator.getGlobalMetrics": {
41270
41996
  capName: "pipeline-orchestrator",
41271
41997
  capScope: "system",
@@ -41302,6 +42028,12 @@ Object.freeze({
41302
42028
  addonId: null,
41303
42029
  access: "view"
41304
42030
  },
42031
+ "pipelineOrchestrator.getPlacementStats": {
42032
+ capName: "pipeline-orchestrator",
42033
+ capScope: "system",
42034
+ addonId: null,
42035
+ access: "view"
42036
+ },
41305
42037
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
41306
42038
  capName: "pipeline-orchestrator",
41307
42039
  capScope: "system",
@@ -41326,6 +42058,12 @@ Object.freeze({
41326
42058
  addonId: null,
41327
42059
  access: "create"
41328
42060
  },
42061
+ "pipelineOrchestrator.planAutoTune": {
42062
+ capName: "pipeline-orchestrator",
42063
+ capScope: "system",
42064
+ addonId: null,
42065
+ access: "view"
42066
+ },
41329
42067
  "pipelineOrchestrator.rebalance": {
41330
42068
  capName: "pipeline-orchestrator",
41331
42069
  capScope: "system",
@@ -41386,12 +42124,6 @@ Object.freeze({
41386
42124
  addonId: null,
41387
42125
  access: "create"
41388
42126
  },
41389
- "pipelineOrchestrator.setAgentDetectWeight": {
41390
- capName: "pipeline-orchestrator",
41391
- capScope: "system",
41392
- addonId: null,
41393
- access: "create"
41394
- },
41395
42127
  "pipelineOrchestrator.setAgentInferenceDevices": {
41396
42128
  capName: "pipeline-orchestrator",
41397
42129
  capScope: "system",
@@ -41446,12 +42178,30 @@ Object.freeze({
41446
42178
  addonId: null,
41447
42179
  access: "create"
41448
42180
  },
42181
+ "pipelineOrchestrator.setLoadBalancingShares": {
42182
+ capName: "pipeline-orchestrator",
42183
+ capScope: "system",
42184
+ addonId: null,
42185
+ access: "create"
42186
+ },
41449
42187
  "pipelineOrchestrator.setPipelineDevicePin": {
41450
42188
  capName: "pipeline-orchestrator",
41451
42189
  capScope: "system",
41452
42190
  addonId: null,
41453
42191
  access: "create"
41454
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
+ },
41455
42205
  "pipelineOrchestrator.unassignAudio": {
41456
42206
  capName: "pipeline-orchestrator",
41457
42207
  capScope: "system",
@@ -43696,6 +44446,12 @@ Object.freeze({
43696
44446
  addonId: null,
43697
44447
  access: "create"
43698
44448
  },
44449
+ "webrtcSession.applyDownlinkProbe": {
44450
+ capName: "webrtc-session",
44451
+ capScope: "device",
44452
+ addonId: null,
44453
+ access: "create"
44454
+ },
43699
44455
  "webrtcSession.closeSession": {
43700
44456
  capName: "webrtc-session",
43701
44457
  capScope: "device",
@@ -46742,6 +47498,11 @@ Object.freeze({
46742
47498
  form: "single",
46743
47499
  optional: false
46744
47500
  }],
47501
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
47502
+ name: "deviceIds",
47503
+ form: "array",
47504
+ optional: true
47505
+ }],
46745
47506
  "pipelineExecutor.runPipeline": [{
46746
47507
  name: "deviceId",
46747
47508
  form: "single",
@@ -47618,6 +48379,11 @@ Object.freeze({
47618
48379
  form: "single",
47619
48380
  optional: false
47620
48381
  }],
48382
+ "webrtcSession.applyDownlinkProbe": [{
48383
+ name: "deviceId",
48384
+ form: "single",
48385
+ optional: false
48386
+ }],
47621
48387
  "webrtcSession.closeSession": [{
47622
48388
  name: "deviceId",
47623
48389
  form: "single",
@@ -47847,6 +48613,8 @@ new Map(Object.entries({
47847
48613
  "detection-blind": "device-events",
47848
48614
  "node-online": "system",
47849
48615
  "node-offline": "system",
48616
+ "node-restarting": "system",
48617
+ "node-updating": "system",
47850
48618
  "node-inference-unavailable": "system",
47851
48619
  "addon-crash-loop": "system",
47852
48620
  "addon-update-available": "system",
@@ -47924,6 +48692,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47924
48692
  kinds: [
47925
48693
  "node-offline",
47926
48694
  "node-online",
48695
+ "node-restarting",
47927
48696
  "node-inference-unavailable"
47928
48697
  ]
47929
48698
  },
@@ -47945,6 +48714,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47945
48714
  label: "Server & container updates",
47946
48715
  kinds: [
47947
48716
  "server-update-available",
48717
+ "node-updating",
47948
48718
  "server-updated",
47949
48719
  "wrapper-update-available"
47950
48720
  ]
@@ -48092,6 +48862,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48092
48862
  kinds: [
48093
48863
  "node-offline",
48094
48864
  "node-online",
48865
+ "node-restarting",
48095
48866
  "node-inference-unavailable"
48096
48867
  ]
48097
48868
  },
@@ -48113,6 +48884,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48113
48884
  example: "server 1.2.377 → 1.2.378",
48114
48885
  kinds: [
48115
48886
  "server-update-available",
48887
+ "node-updating",
48116
48888
  "server-updated",
48117
48889
  "wrapper-update-available"
48118
48890
  ]
@@ -48145,7 +48917,7 @@ var STATE_SUMMARY_VARS = [
48145
48917
  {
48146
48918
  name: "summarySection",
48147
48919
  label: "Summary: this section",
48148
- 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.",
48149
48921
  example: "Batterie scariche",
48150
48922
  group: "system",
48151
48923
  families: ["rule"],
@@ -53204,7 +53976,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53204
53976
  type: "select",
53205
53977
  key: "region",
53206
53978
  label: "Skill region",
53207
- 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.",
53208
53980
  options: [
53209
53981
  {
53210
53982
  value: "NA",
@@ -53233,7 +54005,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53233
54005
  type: "text",
53234
54006
  key: "lwaClientId",
53235
54007
  label: "LWA client id (proactive events)",
53236
- 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.",
53237
54009
  default: DEFAULT_CONFIG.lwaClientId
53238
54010
  }),
53239
54011
  this.field({