@camstack/addon-provider-homeassistant 1.2.36 → 1.2.38
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.
- package/dist/addon.js +1 -1
- package/dist/addon.mjs +1 -1
- package/dist/{dist-B175JmMz.js → dist-3KejG9q2.js} +204 -61
- package/dist/{dist-GYR22fXi.mjs → dist-CJ3sUHKH.mjs} +204 -61
- package/dist/ha-export/ha-export.addon.js +1 -1
- package/dist/ha-export/ha-export.addon.mjs +1 -1
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-3KejG9q2.js");
|
|
3
3
|
let node_crypto = require("node:crypto");
|
|
4
4
|
let node_zlib = require("node:zlib");
|
|
5
5
|
//#region src/ha-device-source.ts
|
package/dist/addon.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as pressureSensorCapability, A as coverCapability, B as imageCapability, C as buttonCapability, Ct as record, D as connectivityCapability, Dt as url, E as colorCapability, Et as unknown, F as fanControlCapability, G as normalizeUnit, H as lockControlCapability, I as floodCapability, J as numericSensorCapability, K as notificationOutputCapability, L as gasCapability, N as enumSensorCapability, O as contactCapability, Ot as EventCategory, P as eventEmitterCapability, Q as presenceCapability, R as humidifierCapability, S as buildAddonRouteProvider, St as object, T as climateControlCapability, Tt as union, U as mediaPlayerCapability, V as lawnMowerControlCapability, W as motionCapability, X as powerMeterCapability, Z as prepareNotification, _ as batteryCapability, _t as _enum, at as updateCapability, b as brightnessCapability, bt as literal, ct as vibrationCapability, d as accessoriesCapability, dt as errMsg, et as scriptRunnerCapability, f as addonRoutesCapability, g as automationControlCapability, gt as createEvent, h as ambientLightSensorCapability, ht as DeviceType, it as temperatureSensorCapability, j as deviceAdoptionCapability, k as controlCapability, lt as waterHeaterCapability, m as alarmPanelCapability, mt as DeviceRole, n as BaseDevice, nt as switchCapability, o as EnumSensorDateTimeFormatSchema, ot as vacuumControlCapability, p as airQualitySensorCapability, pt as DeviceFeature, q as notifierCapability, r as BaseDeviceProvider, rt as tamperCapability, st as valveCapability, tt as smokeCapability, u as TargetSchema, ut as weatherCapability, v as bestLocationMatch, vt as array, w as carbonMonoxideCapability, wt as string, x as brokerCapability, xt as number, y as binaryCapability, yt as discriminatedUnion, z as humiditySensorCapability } from "./dist-
|
|
1
|
+
import { $ as pressureSensorCapability, A as coverCapability, B as imageCapability, C as buttonCapability, Ct as record, D as connectivityCapability, Dt as url, E as colorCapability, Et as unknown, F as fanControlCapability, G as normalizeUnit, H as lockControlCapability, I as floodCapability, J as numericSensorCapability, K as notificationOutputCapability, L as gasCapability, N as enumSensorCapability, O as contactCapability, Ot as EventCategory, P as eventEmitterCapability, Q as presenceCapability, R as humidifierCapability, S as buildAddonRouteProvider, St as object, T as climateControlCapability, Tt as union, U as mediaPlayerCapability, V as lawnMowerControlCapability, W as motionCapability, X as powerMeterCapability, Z as prepareNotification, _ as batteryCapability, _t as _enum, at as updateCapability, b as brightnessCapability, bt as literal, ct as vibrationCapability, d as accessoriesCapability, dt as errMsg, et as scriptRunnerCapability, f as addonRoutesCapability, g as automationControlCapability, gt as createEvent, h as ambientLightSensorCapability, ht as DeviceType, it as temperatureSensorCapability, j as deviceAdoptionCapability, k as controlCapability, lt as waterHeaterCapability, m as alarmPanelCapability, mt as DeviceRole, n as BaseDevice, nt as switchCapability, o as EnumSensorDateTimeFormatSchema, ot as vacuumControlCapability, p as airQualitySensorCapability, pt as DeviceFeature, q as notifierCapability, r as BaseDeviceProvider, rt as tamperCapability, st as valveCapability, tt as smokeCapability, u as TargetSchema, ut as weatherCapability, v as bestLocationMatch, vt as array, w as carbonMonoxideCapability, wt as string, x as brokerCapability, xt as number, y as binaryCapability, yt as discriminatedUnion, z as humiditySensorCapability } from "./dist-CJ3sUHKH.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
|
|
4
4
|
//#region src/ha-device-source.ts
|
|
@@ -7684,7 +7684,7 @@ var RecordingBandSchema = object({
|
|
|
7684
7684
|
postBufferSec: number().min(0).optional()
|
|
7685
7685
|
});
|
|
7686
7686
|
({
|
|
7687
|
-
preBufferSec:
|
|
7687
|
+
preBufferSec: 15,
|
|
7688
7688
|
postBufferSec: 30
|
|
7689
7689
|
}).postBufferSec * 1e3;
|
|
7690
7690
|
/**
|
|
@@ -14056,128 +14056,103 @@ var COCO_TO_MACRO = {
|
|
|
14056
14056
|
var AUDIO_MACRO_LABELS = [
|
|
14057
14057
|
{
|
|
14058
14058
|
id: "speech",
|
|
14059
|
-
name: "Speech"
|
|
14060
|
-
icon: "🗣️"
|
|
14059
|
+
name: "Speech"
|
|
14061
14060
|
},
|
|
14062
14061
|
{
|
|
14063
14062
|
id: "scream",
|
|
14064
|
-
name: "Scream / Shout"
|
|
14065
|
-
icon: "😱"
|
|
14063
|
+
name: "Scream / Shout"
|
|
14066
14064
|
},
|
|
14067
14065
|
{
|
|
14068
14066
|
id: "crying",
|
|
14069
|
-
name: "Crying / Baby"
|
|
14070
|
-
icon: "😢"
|
|
14067
|
+
name: "Crying / Baby"
|
|
14071
14068
|
},
|
|
14072
14069
|
{
|
|
14073
14070
|
id: "laughter",
|
|
14074
|
-
name: "Laughter"
|
|
14075
|
-
icon: "😂"
|
|
14071
|
+
name: "Laughter"
|
|
14076
14072
|
},
|
|
14077
14073
|
{
|
|
14078
14074
|
id: "music",
|
|
14079
|
-
name: "Music"
|
|
14080
|
-
icon: "🎵"
|
|
14075
|
+
name: "Music"
|
|
14081
14076
|
},
|
|
14082
14077
|
{
|
|
14083
14078
|
id: "dog",
|
|
14084
|
-
name: "Dog"
|
|
14085
|
-
icon: "🐕"
|
|
14079
|
+
name: "Dog"
|
|
14086
14080
|
},
|
|
14087
14081
|
{
|
|
14088
14082
|
id: "cat",
|
|
14089
|
-
name: "Cat"
|
|
14090
|
-
icon: "🐈"
|
|
14083
|
+
name: "Cat"
|
|
14091
14084
|
},
|
|
14092
14085
|
{
|
|
14093
14086
|
id: "bird",
|
|
14094
|
-
name: "Bird"
|
|
14095
|
-
icon: "🐦"
|
|
14087
|
+
name: "Bird"
|
|
14096
14088
|
},
|
|
14097
14089
|
{
|
|
14098
14090
|
id: "animal",
|
|
14099
|
-
name: "Animal (other)"
|
|
14100
|
-
icon: "🐾"
|
|
14091
|
+
name: "Animal (other)"
|
|
14101
14092
|
},
|
|
14102
14093
|
{
|
|
14103
14094
|
id: "alarm",
|
|
14104
|
-
name: "Alarm / Siren"
|
|
14105
|
-
icon: "🚨"
|
|
14095
|
+
name: "Alarm / Siren"
|
|
14106
14096
|
},
|
|
14107
14097
|
{
|
|
14108
14098
|
id: "doorbell",
|
|
14109
|
-
name: "Doorbell / Knock"
|
|
14110
|
-
icon: "🔔"
|
|
14099
|
+
name: "Doorbell / Knock"
|
|
14111
14100
|
},
|
|
14112
14101
|
{
|
|
14113
14102
|
id: "glass_breaking",
|
|
14114
|
-
name: "Glass Breaking"
|
|
14115
|
-
icon: "💥"
|
|
14103
|
+
name: "Glass Breaking"
|
|
14116
14104
|
},
|
|
14117
14105
|
{
|
|
14118
14106
|
id: "gunshot",
|
|
14119
|
-
name: "Gunshot / Explosion"
|
|
14120
|
-
icon: "💣"
|
|
14107
|
+
name: "Gunshot / Explosion"
|
|
14121
14108
|
},
|
|
14122
14109
|
{
|
|
14123
14110
|
id: "vehicle",
|
|
14124
|
-
name: "Vehicle"
|
|
14125
|
-
icon: "🚗"
|
|
14111
|
+
name: "Vehicle"
|
|
14126
14112
|
},
|
|
14127
14113
|
{
|
|
14128
14114
|
id: "siren",
|
|
14129
|
-
name: "Emergency Siren"
|
|
14130
|
-
icon: "🚑"
|
|
14115
|
+
name: "Emergency Siren"
|
|
14131
14116
|
},
|
|
14132
14117
|
{
|
|
14133
14118
|
id: "fire",
|
|
14134
|
-
name: "Fire / Smoke"
|
|
14135
|
-
icon: "🔥"
|
|
14119
|
+
name: "Fire / Smoke"
|
|
14136
14120
|
},
|
|
14137
14121
|
{
|
|
14138
14122
|
id: "water",
|
|
14139
|
-
name: "Water"
|
|
14140
|
-
icon: "💧"
|
|
14123
|
+
name: "Water"
|
|
14141
14124
|
},
|
|
14142
14125
|
{
|
|
14143
14126
|
id: "wind",
|
|
14144
|
-
name: "Wind / Weather"
|
|
14145
|
-
icon: "🌬️"
|
|
14127
|
+
name: "Wind / Weather"
|
|
14146
14128
|
},
|
|
14147
14129
|
{
|
|
14148
14130
|
id: "door",
|
|
14149
|
-
name: "Door"
|
|
14150
|
-
icon: "🚪"
|
|
14131
|
+
name: "Door"
|
|
14151
14132
|
},
|
|
14152
14133
|
{
|
|
14153
14134
|
id: "footsteps",
|
|
14154
|
-
name: "Footsteps"
|
|
14155
|
-
icon: "👣"
|
|
14135
|
+
name: "Footsteps"
|
|
14156
14136
|
},
|
|
14157
14137
|
{
|
|
14158
14138
|
id: "crowd",
|
|
14159
|
-
name: "Crowd / Chatter"
|
|
14160
|
-
icon: "👥"
|
|
14139
|
+
name: "Crowd / Chatter"
|
|
14161
14140
|
},
|
|
14162
14141
|
{
|
|
14163
14142
|
id: "telephone",
|
|
14164
|
-
name: "Telephone"
|
|
14165
|
-
icon: "📞"
|
|
14143
|
+
name: "Telephone"
|
|
14166
14144
|
},
|
|
14167
14145
|
{
|
|
14168
14146
|
id: "engine",
|
|
14169
|
-
name: "Engine / Motor"
|
|
14170
|
-
icon: "⚙️"
|
|
14147
|
+
name: "Engine / Motor"
|
|
14171
14148
|
},
|
|
14172
14149
|
{
|
|
14173
14150
|
id: "tools",
|
|
14174
|
-
name: "Tools / Construction"
|
|
14175
|
-
icon: "🔨"
|
|
14151
|
+
name: "Tools / Construction"
|
|
14176
14152
|
},
|
|
14177
14153
|
{
|
|
14178
14154
|
id: "silence",
|
|
14179
|
-
name: "Silence"
|
|
14180
|
-
icon: "🤫"
|
|
14155
|
+
name: "Silence"
|
|
14181
14156
|
}
|
|
14182
14157
|
];
|
|
14183
14158
|
var YAMNET_TO_MACRO = {
|
|
@@ -16685,7 +16660,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16685
16660
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16686
16661
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16687
16662
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16688
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16663
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16689
16664
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16690
16665
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16691
16666
|
* (`getObjectEvents` et al.).
|
|
@@ -16980,6 +16955,35 @@ var TrackSchema = object({
|
|
|
16980
16955
|
*/
|
|
16981
16956
|
hasFace: boolean().optional(),
|
|
16982
16957
|
/**
|
|
16958
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16959
|
+
* face an operator could ASSIGN to an identity.
|
|
16960
|
+
*
|
|
16961
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16962
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16963
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16964
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16965
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16966
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16967
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16968
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16969
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16970
|
+
* operator something to assign and delivers nothing.
|
|
16971
|
+
*
|
|
16972
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16973
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16974
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16975
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16976
|
+
*
|
|
16977
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16978
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16979
|
+
*
|
|
16980
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16981
|
+
* before the column omits it, and so does every server that predates the
|
|
16982
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16983
|
+
* never infer "no assignable face".
|
|
16984
|
+
*/
|
|
16985
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16986
|
+
/**
|
|
16983
16987
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16984
16988
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16985
16989
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -18369,6 +18373,32 @@ var DetailResultSchema = object({
|
|
|
18369
18373
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
18370
18374
|
bbox: NativeCropBboxSchema.optional(),
|
|
18371
18375
|
embedding: string().optional(),
|
|
18376
|
+
/**
|
|
18377
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
18378
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
18379
|
+
* the consuming gate treats as accept — never as reject.
|
|
18380
|
+
*/
|
|
18381
|
+
embeddingMagnitude: number().optional(),
|
|
18382
|
+
/**
|
|
18383
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
18384
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
18385
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
18386
|
+
* the inference this model exists to forbid.
|
|
18387
|
+
*
|
|
18388
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
18389
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
18390
|
+
* its previous assumption instead of refusing.
|
|
18391
|
+
*
|
|
18392
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
18393
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
18394
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
18395
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
18396
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
18397
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
18398
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
18399
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
18400
|
+
*/
|
|
18401
|
+
embeddingModelId: string().optional(),
|
|
18372
18402
|
label: string().optional(),
|
|
18373
18403
|
/**
|
|
18374
18404
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -19244,6 +19274,12 @@ var CameraStatusSchema = object({
|
|
|
19244
19274
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
19245
19275
|
fetchedAt: number()
|
|
19246
19276
|
});
|
|
19277
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
19278
|
+
"disabled",
|
|
19279
|
+
"unavailable",
|
|
19280
|
+
"cannot-host-camera-root",
|
|
19281
|
+
"accelerator-preferred"
|
|
19282
|
+
]);
|
|
19247
19283
|
var NodeInferenceDeviceSchema = object({
|
|
19248
19284
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
19249
19285
|
key: string(),
|
|
@@ -19274,7 +19310,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
19274
19310
|
* available per format; this is the stored selection that becomes the
|
|
19275
19311
|
* default for EVERY camera landing on this accelerator.
|
|
19276
19312
|
*/
|
|
19277
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
19313
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
19314
|
+
/**
|
|
19315
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
19316
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
19317
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
19318
|
+
* never disagree with the election — deriving it in the UI from
|
|
19319
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
19320
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
19321
|
+
* "an accelerator is serving" predicate).
|
|
19322
|
+
*/
|
|
19323
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
19278
19324
|
});
|
|
19279
19325
|
var NodeInferenceDevicesSchema = object({
|
|
19280
19326
|
nodeId: string(),
|
|
@@ -19779,6 +19825,7 @@ DeviceType.Camera, method(object({
|
|
|
19779
19825
|
isBattery: boolean(),
|
|
19780
19826
|
reason: _enum([
|
|
19781
19827
|
"disabled",
|
|
19828
|
+
"offline",
|
|
19782
19829
|
"sleeping",
|
|
19783
19830
|
"unreachable",
|
|
19784
19831
|
"waking"
|
|
@@ -19824,9 +19871,17 @@ targets: array(object({
|
|
|
19824
19871
|
sleeping: boolean(),
|
|
19825
19872
|
/** Current device state rendered over the cached frame. State images
|
|
19826
19873
|
* remain authoritative even when their photographic background is
|
|
19827
|
-
* old; null means the link must carry a current camera frame.
|
|
19874
|
+
* old; null means the link must carry a current camera frame.
|
|
19875
|
+
*
|
|
19876
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19877
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19878
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19879
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19880
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19881
|
+
* state. */
|
|
19828
19882
|
stateReason: _enum([
|
|
19829
19883
|
"disabled",
|
|
19884
|
+
"offline",
|
|
19830
19885
|
"sleeping",
|
|
19831
19886
|
"unreachable",
|
|
19832
19887
|
"waking"
|
|
@@ -24205,7 +24260,12 @@ var ListResultSchema = object({
|
|
|
24205
24260
|
probedAt: number()
|
|
24206
24261
|
});
|
|
24207
24262
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
24208
|
-
|
|
24263
|
+
/**
|
|
24264
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
24265
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
24266
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
24267
|
+
*/
|
|
24268
|
+
var ConnectionEndpointSchema = object({
|
|
24209
24269
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
24210
24270
|
label: string(),
|
|
24211
24271
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -24248,7 +24308,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
24248
24308
|
* ordering between polls.
|
|
24249
24309
|
*/
|
|
24250
24310
|
priority: number()
|
|
24251
|
-
})
|
|
24311
|
+
});
|
|
24312
|
+
/**
|
|
24313
|
+
* Where the advertised local port came from. Ordered most → least
|
|
24314
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
24315
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
24316
|
+
*/
|
|
24317
|
+
var LocalPortSourceEnum = _enum([
|
|
24318
|
+
"server-config",
|
|
24319
|
+
"server-env",
|
|
24320
|
+
"caller-hint",
|
|
24321
|
+
"default"
|
|
24322
|
+
]);
|
|
24323
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
24324
|
+
var AdvertisedLocalPortSchema = object({
|
|
24325
|
+
port: number().int().min(1).max(65535),
|
|
24326
|
+
source: LocalPortSourceEnum
|
|
24327
|
+
});
|
|
24328
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
24329
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
24330
|
+
/**
|
|
24331
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
24332
|
+
* came from.
|
|
24333
|
+
*
|
|
24334
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
24335
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
24336
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
24337
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
24338
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
24339
|
+
* `caller-hint` is the hub's own socket.
|
|
24340
|
+
*
|
|
24341
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
24342
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
24343
|
+
* `caller-hint`.
|
|
24344
|
+
*/
|
|
24345
|
+
localPort: AdvertisedLocalPortSchema
|
|
24346
|
+
});
|
|
24252
24347
|
/**
|
|
24253
24348
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
24254
24349
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -24269,8 +24364,13 @@ var AllowedAddressesSchema = object({
|
|
|
24269
24364
|
*/
|
|
24270
24365
|
addresses: array(string()).readonly() });
|
|
24271
24366
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
24272
|
-
/**
|
|
24273
|
-
|
|
24367
|
+
/**
|
|
24368
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
24369
|
+
* written against the echoing contract keep working; the hub uses it
|
|
24370
|
+
* only when it cannot read its own port, and says so via
|
|
24371
|
+
* `localPort.source === 'caller-hint'`.
|
|
24372
|
+
*/
|
|
24373
|
+
port: number().int().min(1).max(65535).optional(),
|
|
24274
24374
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
24275
24375
|
* candidate. Default `true`. */
|
|
24276
24376
|
includeLoopback: boolean().optional(),
|
|
@@ -37458,7 +37558,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
37458
37558
|
hitPercent: 60,
|
|
37459
37559
|
samplingSeconds: 10
|
|
37460
37560
|
};
|
|
37461
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
37462
37561
|
new Set(["devices", "classes"]);
|
|
37463
37562
|
/** Strip a small, safe subset of Markdown down to plain text. */
|
|
37464
37563
|
function markdownToText(md) {
|
|
@@ -37899,6 +37998,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
37899
37998
|
createdAt: number(),
|
|
37900
37999
|
updatedAt: number()
|
|
37901
38000
|
});
|
|
38001
|
+
Object.freeze(Object.fromEntries([{
|
|
38002
|
+
stepId: "face-embedding",
|
|
38003
|
+
label: "Face recognition model",
|
|
38004
|
+
defaultModelId: "arcface-r100",
|
|
38005
|
+
indexName: "the enrolled face gallery",
|
|
38006
|
+
options: [
|
|
38007
|
+
{
|
|
38008
|
+
id: "arcface-r100",
|
|
38009
|
+
label: "ArcFace (ResNet34)"
|
|
38010
|
+
},
|
|
38011
|
+
{
|
|
38012
|
+
id: "auraface-r100",
|
|
38013
|
+
label: "AuraFace R100"
|
|
38014
|
+
},
|
|
38015
|
+
{
|
|
38016
|
+
id: "inception-resnet-v1",
|
|
38017
|
+
label: "Inception ResNet V1"
|
|
38018
|
+
}
|
|
38019
|
+
]
|
|
38020
|
+
}, {
|
|
38021
|
+
stepId: "clip-embedding",
|
|
38022
|
+
label: "Semantic search model",
|
|
38023
|
+
defaultModelId: "mobileclip-s1",
|
|
38024
|
+
indexName: "the object semantic-search index",
|
|
38025
|
+
options: [{
|
|
38026
|
+
id: "mobileclip-s1",
|
|
38027
|
+
label: "MobileCLIP S1"
|
|
38028
|
+
}, {
|
|
38029
|
+
id: "mobileclip-s2",
|
|
38030
|
+
label: "MobileCLIP S2"
|
|
38031
|
+
}]
|
|
38032
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
38033
|
+
string().min(1);
|
|
37902
38034
|
object({
|
|
37903
38035
|
/**
|
|
37904
38036
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -37919,10 +38051,21 @@ object({
|
|
|
37919
38051
|
*/
|
|
37920
38052
|
square: boolean()
|
|
37921
38053
|
});
|
|
37922
|
-
|
|
38054
|
+
/**
|
|
38055
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
38056
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
38057
|
+
*/
|
|
38058
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
37923
38059
|
paddingRatio: .15,
|
|
37924
38060
|
square: false
|
|
37925
|
-
}
|
|
38061
|
+
};
|
|
38062
|
+
Object.freeze({
|
|
38063
|
+
x: 0,
|
|
38064
|
+
y: 0,
|
|
38065
|
+
w: 1,
|
|
38066
|
+
h: 1
|
|
38067
|
+
});
|
|
38068
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
37926
38069
|
/**
|
|
37927
38070
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
37928
38071
|
*
|
|
@@ -7684,7 +7684,7 @@ var RecordingBandSchema = object({
|
|
|
7684
7684
|
postBufferSec: number().min(0).optional()
|
|
7685
7685
|
});
|
|
7686
7686
|
({
|
|
7687
|
-
preBufferSec:
|
|
7687
|
+
preBufferSec: 15,
|
|
7688
7688
|
postBufferSec: 30
|
|
7689
7689
|
}).postBufferSec * 1e3;
|
|
7690
7690
|
/**
|
|
@@ -14056,128 +14056,103 @@ var COCO_TO_MACRO = {
|
|
|
14056
14056
|
var AUDIO_MACRO_LABELS = [
|
|
14057
14057
|
{
|
|
14058
14058
|
id: "speech",
|
|
14059
|
-
name: "Speech"
|
|
14060
|
-
icon: "🗣️"
|
|
14059
|
+
name: "Speech"
|
|
14061
14060
|
},
|
|
14062
14061
|
{
|
|
14063
14062
|
id: "scream",
|
|
14064
|
-
name: "Scream / Shout"
|
|
14065
|
-
icon: "😱"
|
|
14063
|
+
name: "Scream / Shout"
|
|
14066
14064
|
},
|
|
14067
14065
|
{
|
|
14068
14066
|
id: "crying",
|
|
14069
|
-
name: "Crying / Baby"
|
|
14070
|
-
icon: "😢"
|
|
14067
|
+
name: "Crying / Baby"
|
|
14071
14068
|
},
|
|
14072
14069
|
{
|
|
14073
14070
|
id: "laughter",
|
|
14074
|
-
name: "Laughter"
|
|
14075
|
-
icon: "😂"
|
|
14071
|
+
name: "Laughter"
|
|
14076
14072
|
},
|
|
14077
14073
|
{
|
|
14078
14074
|
id: "music",
|
|
14079
|
-
name: "Music"
|
|
14080
|
-
icon: "🎵"
|
|
14075
|
+
name: "Music"
|
|
14081
14076
|
},
|
|
14082
14077
|
{
|
|
14083
14078
|
id: "dog",
|
|
14084
|
-
name: "Dog"
|
|
14085
|
-
icon: "🐕"
|
|
14079
|
+
name: "Dog"
|
|
14086
14080
|
},
|
|
14087
14081
|
{
|
|
14088
14082
|
id: "cat",
|
|
14089
|
-
name: "Cat"
|
|
14090
|
-
icon: "🐈"
|
|
14083
|
+
name: "Cat"
|
|
14091
14084
|
},
|
|
14092
14085
|
{
|
|
14093
14086
|
id: "bird",
|
|
14094
|
-
name: "Bird"
|
|
14095
|
-
icon: "🐦"
|
|
14087
|
+
name: "Bird"
|
|
14096
14088
|
},
|
|
14097
14089
|
{
|
|
14098
14090
|
id: "animal",
|
|
14099
|
-
name: "Animal (other)"
|
|
14100
|
-
icon: "🐾"
|
|
14091
|
+
name: "Animal (other)"
|
|
14101
14092
|
},
|
|
14102
14093
|
{
|
|
14103
14094
|
id: "alarm",
|
|
14104
|
-
name: "Alarm / Siren"
|
|
14105
|
-
icon: "🚨"
|
|
14095
|
+
name: "Alarm / Siren"
|
|
14106
14096
|
},
|
|
14107
14097
|
{
|
|
14108
14098
|
id: "doorbell",
|
|
14109
|
-
name: "Doorbell / Knock"
|
|
14110
|
-
icon: "🔔"
|
|
14099
|
+
name: "Doorbell / Knock"
|
|
14111
14100
|
},
|
|
14112
14101
|
{
|
|
14113
14102
|
id: "glass_breaking",
|
|
14114
|
-
name: "Glass Breaking"
|
|
14115
|
-
icon: "💥"
|
|
14103
|
+
name: "Glass Breaking"
|
|
14116
14104
|
},
|
|
14117
14105
|
{
|
|
14118
14106
|
id: "gunshot",
|
|
14119
|
-
name: "Gunshot / Explosion"
|
|
14120
|
-
icon: "💣"
|
|
14107
|
+
name: "Gunshot / Explosion"
|
|
14121
14108
|
},
|
|
14122
14109
|
{
|
|
14123
14110
|
id: "vehicle",
|
|
14124
|
-
name: "Vehicle"
|
|
14125
|
-
icon: "🚗"
|
|
14111
|
+
name: "Vehicle"
|
|
14126
14112
|
},
|
|
14127
14113
|
{
|
|
14128
14114
|
id: "siren",
|
|
14129
|
-
name: "Emergency Siren"
|
|
14130
|
-
icon: "🚑"
|
|
14115
|
+
name: "Emergency Siren"
|
|
14131
14116
|
},
|
|
14132
14117
|
{
|
|
14133
14118
|
id: "fire",
|
|
14134
|
-
name: "Fire / Smoke"
|
|
14135
|
-
icon: "🔥"
|
|
14119
|
+
name: "Fire / Smoke"
|
|
14136
14120
|
},
|
|
14137
14121
|
{
|
|
14138
14122
|
id: "water",
|
|
14139
|
-
name: "Water"
|
|
14140
|
-
icon: "💧"
|
|
14123
|
+
name: "Water"
|
|
14141
14124
|
},
|
|
14142
14125
|
{
|
|
14143
14126
|
id: "wind",
|
|
14144
|
-
name: "Wind / Weather"
|
|
14145
|
-
icon: "🌬️"
|
|
14127
|
+
name: "Wind / Weather"
|
|
14146
14128
|
},
|
|
14147
14129
|
{
|
|
14148
14130
|
id: "door",
|
|
14149
|
-
name: "Door"
|
|
14150
|
-
icon: "🚪"
|
|
14131
|
+
name: "Door"
|
|
14151
14132
|
},
|
|
14152
14133
|
{
|
|
14153
14134
|
id: "footsteps",
|
|
14154
|
-
name: "Footsteps"
|
|
14155
|
-
icon: "👣"
|
|
14135
|
+
name: "Footsteps"
|
|
14156
14136
|
},
|
|
14157
14137
|
{
|
|
14158
14138
|
id: "crowd",
|
|
14159
|
-
name: "Crowd / Chatter"
|
|
14160
|
-
icon: "👥"
|
|
14139
|
+
name: "Crowd / Chatter"
|
|
14161
14140
|
},
|
|
14162
14141
|
{
|
|
14163
14142
|
id: "telephone",
|
|
14164
|
-
name: "Telephone"
|
|
14165
|
-
icon: "📞"
|
|
14143
|
+
name: "Telephone"
|
|
14166
14144
|
},
|
|
14167
14145
|
{
|
|
14168
14146
|
id: "engine",
|
|
14169
|
-
name: "Engine / Motor"
|
|
14170
|
-
icon: "⚙️"
|
|
14147
|
+
name: "Engine / Motor"
|
|
14171
14148
|
},
|
|
14172
14149
|
{
|
|
14173
14150
|
id: "tools",
|
|
14174
|
-
name: "Tools / Construction"
|
|
14175
|
-
icon: "🔨"
|
|
14151
|
+
name: "Tools / Construction"
|
|
14176
14152
|
},
|
|
14177
14153
|
{
|
|
14178
14154
|
id: "silence",
|
|
14179
|
-
name: "Silence"
|
|
14180
|
-
icon: "🤫"
|
|
14155
|
+
name: "Silence"
|
|
14181
14156
|
}
|
|
14182
14157
|
];
|
|
14183
14158
|
var YAMNET_TO_MACRO = {
|
|
@@ -16685,7 +16660,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16685
16660
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16686
16661
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16687
16662
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16688
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16663
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16689
16664
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16690
16665
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16691
16666
|
* (`getObjectEvents` et al.).
|
|
@@ -16980,6 +16955,35 @@ var TrackSchema = object({
|
|
|
16980
16955
|
*/
|
|
16981
16956
|
hasFace: boolean().optional(),
|
|
16982
16957
|
/**
|
|
16958
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16959
|
+
* face an operator could ASSIGN to an identity.
|
|
16960
|
+
*
|
|
16961
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16962
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16963
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16964
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16965
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16966
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16967
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16968
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16969
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16970
|
+
* operator something to assign and delivers nothing.
|
|
16971
|
+
*
|
|
16972
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16973
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16974
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16975
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16976
|
+
*
|
|
16977
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16978
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16979
|
+
*
|
|
16980
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16981
|
+
* before the column omits it, and so does every server that predates the
|
|
16982
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16983
|
+
* never infer "no assignable face".
|
|
16984
|
+
*/
|
|
16985
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16986
|
+
/**
|
|
16983
16987
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16984
16988
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16985
16989
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -18369,6 +18373,32 @@ var DetailResultSchema = object({
|
|
|
18369
18373
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
18370
18374
|
bbox: NativeCropBboxSchema.optional(),
|
|
18371
18375
|
embedding: string().optional(),
|
|
18376
|
+
/**
|
|
18377
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
18378
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
18379
|
+
* the consuming gate treats as accept — never as reject.
|
|
18380
|
+
*/
|
|
18381
|
+
embeddingMagnitude: number().optional(),
|
|
18382
|
+
/**
|
|
18383
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
18384
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
18385
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
18386
|
+
* the inference this model exists to forbid.
|
|
18387
|
+
*
|
|
18388
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
18389
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
18390
|
+
* its previous assumption instead of refusing.
|
|
18391
|
+
*
|
|
18392
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
18393
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
18394
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
18395
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
18396
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
18397
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
18398
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
18399
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
18400
|
+
*/
|
|
18401
|
+
embeddingModelId: string().optional(),
|
|
18372
18402
|
label: string().optional(),
|
|
18373
18403
|
/**
|
|
18374
18404
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -19244,6 +19274,12 @@ var CameraStatusSchema = object({
|
|
|
19244
19274
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
19245
19275
|
fetchedAt: number()
|
|
19246
19276
|
});
|
|
19277
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
19278
|
+
"disabled",
|
|
19279
|
+
"unavailable",
|
|
19280
|
+
"cannot-host-camera-root",
|
|
19281
|
+
"accelerator-preferred"
|
|
19282
|
+
]);
|
|
19247
19283
|
var NodeInferenceDeviceSchema = object({
|
|
19248
19284
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
19249
19285
|
key: string(),
|
|
@@ -19274,7 +19310,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
19274
19310
|
* available per format; this is the stored selection that becomes the
|
|
19275
19311
|
* default for EVERY camera landing on this accelerator.
|
|
19276
19312
|
*/
|
|
19277
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
19313
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
19314
|
+
/**
|
|
19315
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
19316
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
19317
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
19318
|
+
* never disagree with the election — deriving it in the UI from
|
|
19319
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
19320
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
19321
|
+
* "an accelerator is serving" predicate).
|
|
19322
|
+
*/
|
|
19323
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
19278
19324
|
});
|
|
19279
19325
|
var NodeInferenceDevicesSchema = object({
|
|
19280
19326
|
nodeId: string(),
|
|
@@ -19779,6 +19825,7 @@ DeviceType.Camera, method(object({
|
|
|
19779
19825
|
isBattery: boolean(),
|
|
19780
19826
|
reason: _enum([
|
|
19781
19827
|
"disabled",
|
|
19828
|
+
"offline",
|
|
19782
19829
|
"sleeping",
|
|
19783
19830
|
"unreachable",
|
|
19784
19831
|
"waking"
|
|
@@ -19824,9 +19871,17 @@ targets: array(object({
|
|
|
19824
19871
|
sleeping: boolean(),
|
|
19825
19872
|
/** Current device state rendered over the cached frame. State images
|
|
19826
19873
|
* remain authoritative even when their photographic background is
|
|
19827
|
-
* old; null means the link must carry a current camera frame.
|
|
19874
|
+
* old; null means the link must carry a current camera frame.
|
|
19875
|
+
*
|
|
19876
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19877
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19878
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19879
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19880
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19881
|
+
* state. */
|
|
19828
19882
|
stateReason: _enum([
|
|
19829
19883
|
"disabled",
|
|
19884
|
+
"offline",
|
|
19830
19885
|
"sleeping",
|
|
19831
19886
|
"unreachable",
|
|
19832
19887
|
"waking"
|
|
@@ -24205,7 +24260,12 @@ var ListResultSchema = object({
|
|
|
24205
24260
|
probedAt: number()
|
|
24206
24261
|
});
|
|
24207
24262
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
24208
|
-
|
|
24263
|
+
/**
|
|
24264
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
24265
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
24266
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
24267
|
+
*/
|
|
24268
|
+
var ConnectionEndpointSchema = object({
|
|
24209
24269
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
24210
24270
|
label: string(),
|
|
24211
24271
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -24248,7 +24308,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
24248
24308
|
* ordering between polls.
|
|
24249
24309
|
*/
|
|
24250
24310
|
priority: number()
|
|
24251
|
-
})
|
|
24311
|
+
});
|
|
24312
|
+
/**
|
|
24313
|
+
* Where the advertised local port came from. Ordered most → least
|
|
24314
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
24315
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
24316
|
+
*/
|
|
24317
|
+
var LocalPortSourceEnum = _enum([
|
|
24318
|
+
"server-config",
|
|
24319
|
+
"server-env",
|
|
24320
|
+
"caller-hint",
|
|
24321
|
+
"default"
|
|
24322
|
+
]);
|
|
24323
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
24324
|
+
var AdvertisedLocalPortSchema = object({
|
|
24325
|
+
port: number().int().min(1).max(65535),
|
|
24326
|
+
source: LocalPortSourceEnum
|
|
24327
|
+
});
|
|
24328
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
24329
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
24330
|
+
/**
|
|
24331
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
24332
|
+
* came from.
|
|
24333
|
+
*
|
|
24334
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
24335
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
24336
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
24337
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
24338
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
24339
|
+
* `caller-hint` is the hub's own socket.
|
|
24340
|
+
*
|
|
24341
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
24342
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
24343
|
+
* `caller-hint`.
|
|
24344
|
+
*/
|
|
24345
|
+
localPort: AdvertisedLocalPortSchema
|
|
24346
|
+
});
|
|
24252
24347
|
/**
|
|
24253
24348
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
24254
24349
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -24269,8 +24364,13 @@ var AllowedAddressesSchema = object({
|
|
|
24269
24364
|
*/
|
|
24270
24365
|
addresses: array(string()).readonly() });
|
|
24271
24366
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
24272
|
-
/**
|
|
24273
|
-
|
|
24367
|
+
/**
|
|
24368
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
24369
|
+
* written against the echoing contract keep working; the hub uses it
|
|
24370
|
+
* only when it cannot read its own port, and says so via
|
|
24371
|
+
* `localPort.source === 'caller-hint'`.
|
|
24372
|
+
*/
|
|
24373
|
+
port: number().int().min(1).max(65535).optional(),
|
|
24274
24374
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
24275
24375
|
* candidate. Default `true`. */
|
|
24276
24376
|
includeLoopback: boolean().optional(),
|
|
@@ -37458,7 +37558,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
37458
37558
|
hitPercent: 60,
|
|
37459
37559
|
samplingSeconds: 10
|
|
37460
37560
|
};
|
|
37461
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
37462
37561
|
new Set(["devices", "classes"]);
|
|
37463
37562
|
/** Strip a small, safe subset of Markdown down to plain text. */
|
|
37464
37563
|
function markdownToText(md) {
|
|
@@ -37899,6 +37998,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
37899
37998
|
createdAt: number(),
|
|
37900
37999
|
updatedAt: number()
|
|
37901
38000
|
});
|
|
38001
|
+
Object.freeze(Object.fromEntries([{
|
|
38002
|
+
stepId: "face-embedding",
|
|
38003
|
+
label: "Face recognition model",
|
|
38004
|
+
defaultModelId: "arcface-r100",
|
|
38005
|
+
indexName: "the enrolled face gallery",
|
|
38006
|
+
options: [
|
|
38007
|
+
{
|
|
38008
|
+
id: "arcface-r100",
|
|
38009
|
+
label: "ArcFace (ResNet34)"
|
|
38010
|
+
},
|
|
38011
|
+
{
|
|
38012
|
+
id: "auraface-r100",
|
|
38013
|
+
label: "AuraFace R100"
|
|
38014
|
+
},
|
|
38015
|
+
{
|
|
38016
|
+
id: "inception-resnet-v1",
|
|
38017
|
+
label: "Inception ResNet V1"
|
|
38018
|
+
}
|
|
38019
|
+
]
|
|
38020
|
+
}, {
|
|
38021
|
+
stepId: "clip-embedding",
|
|
38022
|
+
label: "Semantic search model",
|
|
38023
|
+
defaultModelId: "mobileclip-s1",
|
|
38024
|
+
indexName: "the object semantic-search index",
|
|
38025
|
+
options: [{
|
|
38026
|
+
id: "mobileclip-s1",
|
|
38027
|
+
label: "MobileCLIP S1"
|
|
38028
|
+
}, {
|
|
38029
|
+
id: "mobileclip-s2",
|
|
38030
|
+
label: "MobileCLIP S2"
|
|
38031
|
+
}]
|
|
38032
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
38033
|
+
string().min(1);
|
|
37902
38034
|
object({
|
|
37903
38035
|
/**
|
|
37904
38036
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -37919,10 +38051,21 @@ object({
|
|
|
37919
38051
|
*/
|
|
37920
38052
|
square: boolean()
|
|
37921
38053
|
});
|
|
37922
|
-
|
|
38054
|
+
/**
|
|
38055
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
38056
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
38057
|
+
*/
|
|
38058
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
37923
38059
|
paddingRatio: .15,
|
|
37924
38060
|
square: false
|
|
37925
|
-
}
|
|
38061
|
+
};
|
|
38062
|
+
Object.freeze({
|
|
38063
|
+
x: 0,
|
|
38064
|
+
y: 0,
|
|
38065
|
+
w: 1,
|
|
38066
|
+
h: 1
|
|
38067
|
+
});
|
|
38068
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
37926
38069
|
/**
|
|
37927
38070
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
37928
38071
|
*
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
//#endregion
|
|
6
|
-
const require_dist = require("../dist-
|
|
6
|
+
const require_dist = require("../dist-3KejG9q2.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
//#region src/ha-export/topics.ts
|
|
9
9
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as deviceExportCapability, Ot as EventCategory, S as buildAddonRouteProvider, Y as oauthIntegrationCapability, a as CameraSwitchIdSchema, c as HvacModeSchema, f as addonRoutesCapability, ft as BaseAddon, i as COCO_TO_MACRO, l as MediaPlayerRepeatSchema, s as FanDirectionSchema, t as AlarmArmModeSchema, wt as string } from "../dist-
|
|
1
|
+
import { M as deviceExportCapability, Ot as EventCategory, S as buildAddonRouteProvider, Y as oauthIntegrationCapability, a as CameraSwitchIdSchema, c as HvacModeSchema, f as addonRoutesCapability, ft as BaseAddon, i as COCO_TO_MACRO, l as MediaPlayerRepeatSchema, s as FanDirectionSchema, t as AlarmArmModeSchema, wt as string } from "../dist-CJ3sUHKH.mjs";
|
|
2
2
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
3
3
|
//#region src/ha-export/topics.ts
|
|
4
4
|
/**
|