@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.
@@ -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,6 +10767,26 @@ var ClipSearchStrictnessSchema = _enum([
10767
10767
  "balanced",
10768
10768
  "strict"
10769
10769
  ]);
10770
+ /** Steps whose effect a root label can BE. */
10771
+ var LABEL_SUPPLY_STEP_IDS = [
10772
+ "animal-classifier",
10773
+ "vehicle-classifier",
10774
+ "package-detection"
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
+ ];
10770
10790
  var MODEL_FORMATS = [
10771
10791
  "onnx",
10772
10792
  "coreml",
@@ -10795,7 +10815,53 @@ var ModelFormatEntrySchema = object({
10795
10815
  /** Multi-file payload (directory members or sibling files). */
10796
10816
  files: array(string()).readonly().optional(),
10797
10817
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
10798
- 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()
10799
10865
  });
10800
10866
  /**
10801
10867
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -10899,6 +10965,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10899
10965
  /** True when the weights or their data forbid commercial use. */
10900
10966
  nonCommercial: boolean().optional()
10901
10967
  }));
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
+ ]);
10902
11008
  var ModelCatalogEntrySchema = object({
10903
11009
  id: string(),
10904
11010
  name: string(),
@@ -10964,6 +11070,35 @@ var ModelCatalogEntrySchema = object({
10964
11070
  */
10965
11071
  defaultConfidence: number().min(0).max(1).optional(),
10966
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
+ /**
10967
11102
  * When true, the executor produces a landmark-aligned crop (similarity warp
10968
11103
  * onto the canonical template) before this step runs, instead of a plain
10969
11104
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -11025,6 +11160,16 @@ var ModelCatalogEntrySchema = object({
11025
11160
  */
11026
11161
  classMap: DetectionCatalogClassMapSchema.optional(),
11027
11162
  /**
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`).
11170
+ */
11171
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
11172
+ /**
11028
11173
  * The model's CLIP feature-space contract (text encoder, dimension, vector
11029
11174
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
11030
11175
  * CLIP image encoder; its absence is what "not a CLIP model" means to the
@@ -16234,6 +16379,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
16234
16379
  kind: "mutation",
16235
16380
  auth: "admin"
16236
16381
  });
16382
+ var HUB_ADDRESS_ROLES = [
16383
+ "appConnections",
16384
+ "notificationTaps",
16385
+ "internal",
16386
+ "publicEndpoint"
16387
+ ];
16237
16388
  /**
16238
16389
  * Transport bounds for AI capability methods.
16239
16390
  *
@@ -18798,6 +18949,8 @@ var NcSystemEventKindSchema = _enum([
18798
18949
  "stream-offline",
18799
18950
  "node-online",
18800
18951
  "node-offline",
18952
+ "node-restarting",
18953
+ "node-updating",
18801
18954
  "node-inference-unavailable",
18802
18955
  "detection-blind",
18803
18956
  "addon-crash-loop",
@@ -20403,7 +20556,13 @@ var NcAlarmModeDelaysListSchema = array(object({
20403
20556
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20404
20557
  * is the one that starts the entry delay — the entry-delay notification already names it.
20405
20558
  */
20406
- 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()
20407
20566
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20408
20567
  var NcAlarmModeDelaysEditListSchema = array(object({
20409
20568
  mode: AlarmArmModeSchema,
@@ -20416,7 +20575,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20416
20575
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20417
20576
  notifyDuringEntryDelay: boolean().nullable().optional(),
20418
20577
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
20419
- 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()
20420
20581
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20421
20582
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20422
20583
  var NcAlarmNonBlockingEditSchema = object({
@@ -23331,6 +23492,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23331
23492
  timestamp: number()
23332
23493
  });
23333
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
+ /**
23334
23523
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23335
23524
  * within the frame, so the executor can re-cut a leaf child ROI at native
23336
23525
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -23378,7 +23567,7 @@ var FrameRefSchema = object({
23378
23567
  timestamp: number(),
23379
23568
  capturedAt: number().optional()
23380
23569
  });
23381
- var ModelFormatSchema$1 = _enum([
23570
+ var ModelFormatSchema$2 = _enum([
23382
23571
  "onnx",
23383
23572
  "coreml",
23384
23573
  "openvino",
@@ -23396,7 +23585,7 @@ var PipelineSlotSchema = _enum([
23396
23585
  var PipelineEngineChoiceSchema = object({
23397
23586
  runtime: literal("python"),
23398
23587
  backend: string(),
23399
- format: ModelFormatSchema$1,
23588
+ format: ModelFormatSchema$2,
23400
23589
  device: string().optional()
23401
23590
  });
23402
23591
  /**
@@ -23453,14 +23642,12 @@ var PipelineTemplateSchema$1 = object({
23453
23642
  var PipelineModelOptionSchema = object({
23454
23643
  id: string(),
23455
23644
  name: string(),
23456
- formats: record(string(), object({
23457
- downloaded: boolean(),
23458
- sizeMB: number()
23459
- })),
23645
+ formats: record(string(), PipelineModelFormatStatusSchema),
23460
23646
  group: ModelVariantGroupSchema.optional(),
23461
23647
  legacy: boolean().optional(),
23462
23648
  provider: ModelProviderIdSchema.optional(),
23463
- defaultConfidence: number().optional()
23649
+ defaultConfidence: number().optional(),
23650
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
23464
23651
  });
23465
23652
  var ConfigFieldBridge = custom();
23466
23653
  var PipelineAddonSchemaSchema = object({
@@ -23622,6 +23809,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23622
23809
  }), {
23623
23810
  kind: "mutation",
23624
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"
23625
23828
  }), method(object({ nodeId: string() }), object({ unhealthy: array(object({
23626
23829
  /** `<backend>:<device>`, e.g. `openvino:gpu`. */
23627
23830
  deviceKey: string(),
@@ -23658,11 +23861,11 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23658
23861
  }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
23659
23862
  addonId: string(),
23660
23863
  modelId: string(),
23661
- format: ModelFormatSchema$1
23864
+ format: ModelFormatSchema$2
23662
23865
  }), DownloadModelResultSchema, { kind: "mutation" }), method(object({
23663
23866
  addonId: string(),
23664
23867
  modelId: string(),
23665
- format: ModelFormatSchema$1
23868
+ format: ModelFormatSchema$2
23666
23869
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
23667
23870
  steps: array(PipelineStepInputSchema).min(1),
23668
23871
  frame: FrameInputSchema.optional(),
@@ -23728,7 +23931,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23728
23931
  * `device-not-servable`), and nothing reaches the camera's live
23729
23932
  * trace stream. Absent ⇒ unchanged behaviour.
23730
23933
  */
23731
- 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()
23732
23944
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
23733
23945
  steps: array(PipelineStepInputSchema).min(1),
23734
23946
  frames: array(FrameInputSchema).min(1).max(255),
@@ -23810,6 +24022,352 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23810
24022
  filename: string().optional(),
23811
24023
  settings: record(string(), unknown()).optional()
23812
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
+ ]);
23813
24371
  object({
23814
24372
  activeCameras: number(),
23815
24373
  throttledCameras: number(),
@@ -24830,7 +25388,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
24830
25388
  */
24831
25389
  cropJpeg: string().optional(),
24832
25390
  parent: DetailParentSchema,
24833
- 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()
24834
25407
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
24835
25408
  /** Catalog step id, e.g. `clip-embedding`. */
24836
25409
  stepId: string(),
@@ -24975,7 +25548,6 @@ var CameraStepOverridePatchSchema = object({
24975
25548
  settings: record(string(), unknown()).readonly().optional()
24976
25549
  });
24977
25550
  var CameraPipelineSettingsSchema = object({
24978
- pinnedAgentNodeId: string().optional(),
24979
25551
  stepToggles: record(string(), boolean()).optional(),
24980
25552
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
24981
25553
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -25474,12 +26046,6 @@ method(object({
25474
26046
  }), object({ success: literal(true) }), {
25475
26047
  kind: "mutation",
25476
26048
  auth: "admin"
25477
- }), method(object({
25478
- agentNodeId: string(),
25479
- detectWeight: number().positive().nullable()
25480
- }), object({ success: literal(true) }), {
25481
- kind: "mutation",
25482
- auth: "admin"
25483
26049
  }), method(object({
25484
26050
  agentNodeId: string(),
25485
26051
  detect: boolean().nullable().optional(),
@@ -25521,6 +26087,15 @@ method(object({
25521
26087
  }), {
25522
26088
  kind: "mutation",
25523
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"
25524
26099
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
25525
26100
  deviceId: number(),
25526
26101
  addonId: string(),
@@ -28131,6 +28706,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
28131
28706
  */
28132
28707
  alive: boolean()
28133
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({
28134
28717
  deviceId: number().int().nonnegative(),
28135
28718
  sessionId: string()
28136
28719
  }), WebrtcSessionDebugSchema, { kind: "query" });
@@ -30806,7 +31389,8 @@ var ConnectionEndpointSchema = object({
30806
31389
  "lan-ipv6",
30807
31390
  "public",
30808
31391
  "loopback",
30809
- "app-link"
31392
+ "app-link",
31393
+ "custom"
30810
31394
  ]),
30811
31395
  /**
30812
31396
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30875,7 +31459,7 @@ var GetConnectionEndpointsResultSchema = object({
30875
31459
  localPort: AdvertisedLocalPortSchema
30876
31460
  });
30877
31461
  /**
30878
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
31462
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
30879
31463
  * since D709 is the CamStack app link; `resolved` reports the effective value,
30880
31464
  * so the UI can show it either way.
30881
31465
  */
@@ -30908,6 +31492,72 @@ var ViewerEndpointsSchema = object({
30908
31492
  /** What the ranking currently resolves to (may be empty if nothing is up). */
30909
31493
  resolved: array(string()).readonly()
30910
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
+ });
30911
31561
  var AllowedAddressesSchema = object({
30912
31562
  /**
30913
31563
  * Allowlist of interface addresses operators have explicitly opted
@@ -30951,10 +31601,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30951
31601
  * tunnel always emits `https://` regardless. */
30952
31602
  scheme: _enum(["http", "https"]).optional(),
30953
31603
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30954
- * an address notification links can be flagged with, not a hub
31604
+ * an address notification taps can be flagged with, not a hub
30955
31605
  * route. Default `false`: racers and rankers never see it. */
30956
31606
  includeAppLink: boolean().optional()
30957
- }), 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, {
30958
31625
  kind: "mutation",
30959
31626
  auth: "admin"
30960
31627
  }), method(object({
@@ -31344,7 +32011,8 @@ object({
31344
32011
  * writes this slice (not even a boot seed), and neither does the runner's
31345
32012
  * phase machine: its phase is "a session is attached" for every on-motion
31346
32013
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
31347
- * 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`).
31348
32016
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
31349
32017
  * imports) — the provider pushes both edges itself, from the upstream
31350
32018
  * system's own state change. That is the sensor's own fact.
@@ -36475,6 +37143,16 @@ DeviceType.Camera, method(object({
36475
37143
  package: array(ZoneRuleSchema).readonly()
36476
37144
  });
36477
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
+ });
36478
37156
  /**
36479
37157
  * Accessory device helpers — shared across drivers.
36480
37158
  *
@@ -39403,12 +40081,24 @@ Object.freeze({
39403
40081
  addonId: null,
39404
40082
  access: "view"
39405
40083
  },
40084
+ "localNetwork.addCustomAddress": {
40085
+ capName: "local-network",
40086
+ capScope: "system",
40087
+ addonId: null,
40088
+ access: "create"
40089
+ },
39406
40090
  "localNetwork.downloadCa": {
39407
40091
  capName: "local-network",
39408
40092
  capScope: "system",
39409
40093
  addonId: null,
39410
40094
  access: "view"
39411
40095
  },
40096
+ "localNetwork.getAddresses": {
40097
+ capName: "local-network",
40098
+ capScope: "system",
40099
+ addonId: null,
40100
+ access: "view"
40101
+ },
39412
40102
  "localNetwork.getAllowedAddresses": {
39413
40103
  capName: "local-network",
39414
40104
  capScope: "system",
@@ -39421,6 +40111,12 @@ Object.freeze({
39421
40111
  addonId: null,
39422
40112
  access: "view"
39423
40113
  },
40114
+ "localNetwork.getHubAddresses": {
40115
+ capName: "local-network",
40116
+ capScope: "system",
40117
+ addonId: null,
40118
+ access: "view"
40119
+ },
39424
40120
  "localNetwork.getNotificationEndpoint": {
39425
40121
  capName: "local-network",
39426
40122
  capScope: "system",
@@ -39457,6 +40153,12 @@ Object.freeze({
39457
40153
  addonId: null,
39458
40154
  access: "create"
39459
40155
  },
40156
+ "localNetwork.removeCustomAddress": {
40157
+ capName: "local-network",
40158
+ capScope: "system",
40159
+ addonId: null,
40160
+ access: "delete"
40161
+ },
39460
40162
  "localNetwork.resetAllowlistToBestMatch": {
39461
40163
  capName: "local-network",
39462
40164
  capScope: "system",
@@ -39469,6 +40171,12 @@ Object.freeze({
39469
40171
  addonId: null,
39470
40172
  access: "create"
39471
40173
  },
40174
+ "localNetwork.setAddressRole": {
40175
+ capName: "local-network",
40176
+ capScope: "system",
40177
+ addonId: null,
40178
+ access: "create"
40179
+ },
39472
40180
  "localNetwork.setAllowedAddresses": {
39473
40181
  capName: "local-network",
39474
40182
  capScope: "system",
@@ -40963,6 +41671,12 @@ Object.freeze({
40963
41671
  addonId: null,
40964
41672
  access: "delete"
40965
41673
  },
41674
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
41675
+ capName: "pipeline-executor",
41676
+ capScope: "system",
41677
+ addonId: null,
41678
+ access: "delete"
41679
+ },
40966
41680
  "pipelineExecutor.deleteModel": {
40967
41681
  capName: "pipeline-executor",
40968
41682
  capScope: "system",
@@ -41179,6 +41893,12 @@ Object.freeze({
41179
41893
  addonId: null,
41180
41894
  access: "view"
41181
41895
  },
41896
+ "pipelineOrchestrator.applyAutoTune": {
41897
+ capName: "pipeline-orchestrator",
41898
+ capScope: "system",
41899
+ addonId: null,
41900
+ access: "create"
41901
+ },
41182
41902
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
41183
41903
  capName: "pipeline-orchestrator",
41184
41904
  capScope: "system",
@@ -41293,6 +42013,12 @@ Object.freeze({
41293
42013
  addonId: null,
41294
42014
  access: "view"
41295
42015
  },
42016
+ "pipelineOrchestrator.getEffectiveShares": {
42017
+ capName: "pipeline-orchestrator",
42018
+ capScope: "system",
42019
+ addonId: null,
42020
+ access: "view"
42021
+ },
41296
42022
  "pipelineOrchestrator.getGlobalMetrics": {
41297
42023
  capName: "pipeline-orchestrator",
41298
42024
  capScope: "system",
@@ -41329,6 +42055,12 @@ Object.freeze({
41329
42055
  addonId: null,
41330
42056
  access: "view"
41331
42057
  },
42058
+ "pipelineOrchestrator.getPlacementStats": {
42059
+ capName: "pipeline-orchestrator",
42060
+ capScope: "system",
42061
+ addonId: null,
42062
+ access: "view"
42063
+ },
41332
42064
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
41333
42065
  capName: "pipeline-orchestrator",
41334
42066
  capScope: "system",
@@ -41353,6 +42085,12 @@ Object.freeze({
41353
42085
  addonId: null,
41354
42086
  access: "create"
41355
42087
  },
42088
+ "pipelineOrchestrator.planAutoTune": {
42089
+ capName: "pipeline-orchestrator",
42090
+ capScope: "system",
42091
+ addonId: null,
42092
+ access: "view"
42093
+ },
41356
42094
  "pipelineOrchestrator.rebalance": {
41357
42095
  capName: "pipeline-orchestrator",
41358
42096
  capScope: "system",
@@ -41413,12 +42151,6 @@ Object.freeze({
41413
42151
  addonId: null,
41414
42152
  access: "create"
41415
42153
  },
41416
- "pipelineOrchestrator.setAgentDetectWeight": {
41417
- capName: "pipeline-orchestrator",
41418
- capScope: "system",
41419
- addonId: null,
41420
- access: "create"
41421
- },
41422
42154
  "pipelineOrchestrator.setAgentInferenceDevices": {
41423
42155
  capName: "pipeline-orchestrator",
41424
42156
  capScope: "system",
@@ -41473,12 +42205,30 @@ Object.freeze({
41473
42205
  addonId: null,
41474
42206
  access: "create"
41475
42207
  },
42208
+ "pipelineOrchestrator.setLoadBalancingShares": {
42209
+ capName: "pipeline-orchestrator",
42210
+ capScope: "system",
42211
+ addonId: null,
42212
+ access: "create"
42213
+ },
41476
42214
  "pipelineOrchestrator.setPipelineDevicePin": {
41477
42215
  capName: "pipeline-orchestrator",
41478
42216
  capScope: "system",
41479
42217
  addonId: null,
41480
42218
  access: "create"
41481
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
+ },
41482
42232
  "pipelineOrchestrator.unassignAudio": {
41483
42233
  capName: "pipeline-orchestrator",
41484
42234
  capScope: "system",
@@ -43723,6 +44473,12 @@ Object.freeze({
43723
44473
  addonId: null,
43724
44474
  access: "create"
43725
44475
  },
44476
+ "webrtcSession.applyDownlinkProbe": {
44477
+ capName: "webrtc-session",
44478
+ capScope: "device",
44479
+ addonId: null,
44480
+ access: "create"
44481
+ },
43726
44482
  "webrtcSession.closeSession": {
43727
44483
  capName: "webrtc-session",
43728
44484
  capScope: "device",
@@ -46769,6 +47525,11 @@ Object.freeze({
46769
47525
  form: "single",
46770
47526
  optional: false
46771
47527
  }],
47528
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
47529
+ name: "deviceIds",
47530
+ form: "array",
47531
+ optional: true
47532
+ }],
46772
47533
  "pipelineExecutor.runPipeline": [{
46773
47534
  name: "deviceId",
46774
47535
  form: "single",
@@ -47645,6 +48406,11 @@ Object.freeze({
47645
48406
  form: "single",
47646
48407
  optional: false
47647
48408
  }],
48409
+ "webrtcSession.applyDownlinkProbe": [{
48410
+ name: "deviceId",
48411
+ form: "single",
48412
+ optional: false
48413
+ }],
47648
48414
  "webrtcSession.closeSession": [{
47649
48415
  name: "deviceId",
47650
48416
  form: "single",
@@ -47874,6 +48640,8 @@ new Map(Object.entries({
47874
48640
  "detection-blind": "device-events",
47875
48641
  "node-online": "system",
47876
48642
  "node-offline": "system",
48643
+ "node-restarting": "system",
48644
+ "node-updating": "system",
47877
48645
  "node-inference-unavailable": "system",
47878
48646
  "addon-crash-loop": "system",
47879
48647
  "addon-update-available": "system",
@@ -47951,6 +48719,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47951
48719
  kinds: [
47952
48720
  "node-offline",
47953
48721
  "node-online",
48722
+ "node-restarting",
47954
48723
  "node-inference-unavailable"
47955
48724
  ]
47956
48725
  },
@@ -47972,6 +48741,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47972
48741
  label: "Server & container updates",
47973
48742
  kinds: [
47974
48743
  "server-update-available",
48744
+ "node-updating",
47975
48745
  "server-updated",
47976
48746
  "wrapper-update-available"
47977
48747
  ]
@@ -48119,6 +48889,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48119
48889
  kinds: [
48120
48890
  "node-offline",
48121
48891
  "node-online",
48892
+ "node-restarting",
48122
48893
  "node-inference-unavailable"
48123
48894
  ]
48124
48895
  },
@@ -48140,6 +48911,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48140
48911
  example: "server 1.2.377 → 1.2.378",
48141
48912
  kinds: [
48142
48913
  "server-update-available",
48914
+ "node-updating",
48143
48915
  "server-updated",
48144
48916
  "wrapper-update-available"
48145
48917
  ]
@@ -48172,7 +48944,7 @@ var STATE_SUMMARY_VARS = [
48172
48944
  {
48173
48945
  name: "summarySection",
48174
48946
  label: "Summary: this section",
48175
- 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.",
48176
48948
  example: "Batterie scariche",
48177
48949
  group: "system",
48178
48950
  families: ["rule"],
@@ -53231,7 +54003,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53231
54003
  type: "select",
53232
54004
  key: "region",
53233
54005
  label: "Skill region",
53234
- 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.",
53235
54007
  options: [
53236
54008
  {
53237
54009
  value: "NA",
@@ -53260,7 +54032,7 @@ var ExportAlexaAddon = class extends BaseAddon {
53260
54032
  type: "text",
53261
54033
  key: "lwaClientId",
53262
54034
  label: "LWA client id (proactive events)",
53263
- 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.",
53264
54036
  default: DEFAULT_CONFIG.lwaClientId
53265
54037
  }),
53266
54038
  this.field({