@camstack/addon-post-analysis 1.2.634 → 1.2.636
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/THIRD_PARTY_MODELS.md +1 -1
- package/dist/{clip-model-registry-BP3Klg3J.mjs → clip-model-registry-BV-RBus_.mjs} +6344 -10603
- package/dist/{clip-model-registry-3bxa67Bp.js → clip-model-registry-DgRbne5j.js} +6349 -10602
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +2 -2
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BVWmFXOZ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Coin4M0B.mjs} +3 -3
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-j6sD2jfA.mjs +26 -0
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Bcrs7B9G.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-DdkLvWFM.mjs → hostInit-c7viEcQt.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +166 -1957
- package/dist/pipeline-analytics/index.mjs +165 -1956
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +7 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DhEtuamJ.mjs +0 -26
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-MOlfkem8.mjs +0 -26
|
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const require_clip_model_registry = require("../clip-model-registry-
|
|
5
|
+
const require_clip_model_registry = require("../clip-model-registry-DgRbne5j.js");
|
|
6
6
|
let node_fs = require("node:fs");
|
|
7
7
|
node_fs = require_clip_model_registry.__toESM(node_fs, 1);
|
|
8
8
|
let node_path = require("node:path");
|
|
@@ -314,7 +314,7 @@ function buildArmAnnouncement(coverage, deviceName, bypassed = []) {
|
|
|
314
314
|
};
|
|
315
315
|
}
|
|
316
316
|
/**
|
|
317
|
-
* "Attivi: Porta retro, Cancello — Bypassati: Finestra
|
|
317
|
+
* "Attivi: Porta retro, Cancello — Bypassati: Finestra porch."
|
|
318
318
|
*
|
|
319
319
|
* Both halves are named: the bypassed sensors are why the operator pressed
|
|
320
320
|
* Arm anyway, and the remaining ones are what is still promised. An
|
|
@@ -351,7 +351,7 @@ function armedWithBypass(coverage, bypassed, deviceName) {
|
|
|
351
351
|
};
|
|
352
352
|
}
|
|
353
353
|
/**
|
|
354
|
-
* "Aperti: Finestra
|
|
354
|
+
* "Aperti: Finestra porch, Porta retro" + where the Arm anyway is.
|
|
355
355
|
*
|
|
356
356
|
* The one alarm sentence about something that did not happen, so it has to
|
|
357
357
|
* carry both halves an operator needs to act: WHICH devices are open, and —
|
|
@@ -479,7 +479,7 @@ function buildArmingAnnouncement(coverage, seconds, deviceName, bypassed = []) {
|
|
|
479
479
|
};
|
|
480
480
|
}
|
|
481
481
|
/**
|
|
482
|
-
* "Attivi: Porta retro, Cancello — Bypassati: Finestra
|
|
482
|
+
* "Attivi: Porta retro, Cancello — Bypassati: Finestra porch" while the exit
|
|
483
483
|
* delay still runs — same halves as {@link armedWithBypass}, with `seconds`
|
|
484
484
|
* frozen for the title.
|
|
485
485
|
*/
|
|
@@ -1622,7 +1622,7 @@ function artifactRowBody(record, ownerUserId) {
|
|
|
1622
1622
|
*
|
|
1623
1623
|
* Every node runs this addon, so every node resolved that path and tried to
|
|
1624
1624
|
* create it. On the Mac agent `/media-fast` does not exist (`ENOENT`); on
|
|
1625
|
-
* `
|
|
1625
|
+
* `agent-a` it exists and is not ours (`EACCES`). Both logged
|
|
1626
1626
|
* `nc-artifact data-plane failed to serve` on a loop, and the EACCES one is the
|
|
1627
1627
|
* worse of the two: a path of the same name on another machine is not the same
|
|
1628
1628
|
* directory, and `mkdir -p` of somebody else's mount point is precisely the
|
|
@@ -6764,7 +6764,7 @@ function patchDisplayLabel(patch) {
|
|
|
6764
6764
|
* machine step and the operator override of each family are listed, because a
|
|
6765
6765
|
* hand-assigned identity is still an identity.
|
|
6766
6766
|
*
|
|
6767
|
-
* Callers use it to pick a SENTENCE: "
|
|
6767
|
+
* Callers use it to pick a SENTENCE: "Alice è arrivato" and "Veicolo AB123CD"
|
|
6768
6768
|
* are different keys in the notification text catalog, and a single
|
|
6769
6769
|
* `{{label}}` slot cannot word both.
|
|
6770
6770
|
*/
|
|
@@ -10699,7 +10699,7 @@ var LABEL_MAX_CHARS = 32;
|
|
|
10699
10699
|
* A camera name, reduced to a LABEL.
|
|
10700
10700
|
*
|
|
10701
10701
|
* Looser than {@link plainVocabulary} — two words survive instead of one, so
|
|
10702
|
-
* "
|
|
10702
|
+
* "Front door cancello" and "Front door" still read as themselves — and that
|
|
10703
10703
|
* looseness is the whole design question, because a device name is only
|
|
10704
10704
|
* SEMI-trusted: the operator can rename a camera, but the name it was adopted
|
|
10705
10705
|
* with came from the camera itself.
|
|
@@ -11467,7 +11467,7 @@ function stateToRow(key, state, updatedAt) {
|
|
|
11467
11467
|
* That is not a corner case, it is the ORDINARY way a rule begins: an operator
|
|
11468
11468
|
* writes an occupancy rule about a thing they can see, which means the thing is
|
|
11469
11469
|
* usually there when they press save. Live on 2026-08-12 a became-occupied rule
|
|
11470
|
-
* on zone "
|
|
11470
|
+
* on zone "Parking pat'" (device 102, class `car`) was authored with the car
|
|
11471
11471
|
* already parked, and the next analysis pass would have announced its arrival.
|
|
11472
11472
|
*
|
|
11473
11473
|
* The invariant, stated once: AN EDGE MAY ONLY ARISE FROM A TRANSITION BETWEEN
|
|
@@ -12544,7 +12544,7 @@ var NcSummaryFiltersSchema = require_clip_model_registry.object({
|
|
|
12544
12544
|
* summaries still include an enormous number of stationary tracks". Since
|
|
12545
12545
|
* D161 a track promoted to the stationary registry is persisted rather than
|
|
12546
12546
|
* dropped (it owns media the retention sweep has to reach), so the car parked
|
|
12547
|
-
* in front of camera
|
|
12547
|
+
* in front of camera 102 now enters every window it overlaps and, ranked on
|
|
12548
12548
|
* importance and dwell, wins tiles from the passages the digest is about. The
|
|
12549
12549
|
* measured effect on the live hub was 1-2 tiles becoming 10.
|
|
12550
12550
|
*
|
|
@@ -12965,7 +12965,7 @@ var NcTestEventInputSchema = require_clip_model_registry.object({
|
|
|
12965
12965
|
*/
|
|
12966
12966
|
systemEvent: require_clip_model_registry.object({
|
|
12967
12967
|
kind: require_clip_model_registry.NcSystemEventKindSchema,
|
|
12968
|
-
/** The dedup subject (`device:
|
|
12968
|
+
/** The dedup subject (`device:102`, `node:agent-1`, …). */
|
|
12969
12969
|
subject: require_clip_model_registry.string().min(1),
|
|
12970
12970
|
titleKey: require_clip_model_registry.string().min(1),
|
|
12971
12971
|
bodyKey: require_clip_model_registry.string().min(1),
|
|
@@ -15019,7 +15019,7 @@ function isRetentionExemptOwnerKind(kind) {
|
|
|
15019
15019
|
* ## What happened
|
|
15020
15020
|
*
|
|
15021
15021
|
* On 2026-08-02 media writes started failing with
|
|
15022
|
-
* `ENOSPC: no space left on device, mkdir '/recordings/
|
|
15022
|
+
* `ENOSPC: no space left on device, mkdir '/recordings/102/events/track/…'`.
|
|
15023
15023
|
* For roughly five hours every new track was recorded with positions, a class,
|
|
15024
15024
|
* a `bestEventId` and **zero snapshots** — a track that looks complete in the
|
|
15025
15025
|
* list and has no picture behind it. The operator found it by noticing the
|
|
@@ -15156,7 +15156,7 @@ var OWNER_KINDS = [
|
|
|
15156
15156
|
* already documents two paragraphs up, verbatim, one owner kind later — and
|
|
15157
15157
|
* D476 moved it to `'object'`, its own docblock flagging the choice as
|
|
15158
15158
|
* pragmatic. Both are ids in a namespace the writer does not own, and the
|
|
15159
|
-
* consequence was measured: 675 delivered mosaics (271 MiB on camera
|
|
15159
|
+
* consequence was measured: 675 delivered mosaics (271 MiB on camera 101, one
|
|
15160
15160
|
* rule, growing ~27 MiB/day) that no probe could resolve and no sweep could
|
|
15161
15161
|
* ever collect.
|
|
15162
15162
|
*
|
|
@@ -17866,7 +17866,7 @@ var MAX_CENSUS_SITES = 200;
|
|
|
17866
17866
|
/**
|
|
17867
17867
|
* How many evidence candidates one camera may return.
|
|
17868
17868
|
*
|
|
17869
|
-
* A device is capped at `EVIDENCE_MAX_CANDIDATES_PER_DEVICE` (512) and
|
|
17869
|
+
* A device is capped at `EVIDENCE_MAX_CANDIDATES_PER_DEVICE` (512) and 102 was
|
|
17870
17870
|
* carrying ~497 of them when the mis-binding was found, so the default has to
|
|
17871
17871
|
* be a page, not the archive.
|
|
17872
17872
|
*/
|
|
@@ -18277,7 +18277,7 @@ var DEBUG_RETENTION_NOTE = "A `debug` mark does not pin retention. A track with
|
|
|
18277
18277
|
function debugArchiveFilename(nowMs) {
|
|
18278
18278
|
return `camstack-debug-${new Date(nowMs).toISOString().replace(/[:.]/g, "-")}.zip`.replace(/[\r\n"]/g, "");
|
|
18279
18279
|
}
|
|
18280
|
-
/** Parse `?deviceIds=
|
|
18280
|
+
/** Parse `?deviceIds=101,102` — empty means every camera. */
|
|
18281
18281
|
function parseDebugDeviceIds(url) {
|
|
18282
18282
|
const query = url.includes("?") ? url.slice(url.indexOf("?") + 1) : "";
|
|
18283
18283
|
const raw = new URLSearchParams(query).get("deviceIds");
|
|
@@ -19488,7 +19488,7 @@ var TrackIdsSchema = require_clip_model_registry.array(require_clip_model_regist
|
|
|
19488
19488
|
* True when the SQLite settings backend would hand `text` back DECODED: it
|
|
19489
19489
|
* parses any TEXT that starts with `[` or `{` and is valid JSON
|
|
19490
19490
|
* (`decodeColumnValue` decodes by content, not by declared type). Free text
|
|
19491
|
-
* like that cannot round-trip through a TEXT column (follow-up
|
|
19491
|
+
* like that cannot round-trip through a TEXT column (follow-up 102, review M2).
|
|
19492
19492
|
*/
|
|
19493
19493
|
function decodesAsJson(text) {
|
|
19494
19494
|
if (!(text.startsWith("[") || text.startsWith("{"))) return false;
|
|
@@ -19513,7 +19513,7 @@ function freeText(raw) {
|
|
|
19513
19513
|
* that starts with `[` on read (`decodeColumnValue`), so the store sees the
|
|
19514
19514
|
* ARRAY it wrote; a string is parsed here only for a backend (or an old row)
|
|
19515
19515
|
* that hands the text back as written. `JSON.parse(String(array))` threw on the
|
|
19516
|
-
* decoded array and every promoted row was skipped as malformed (follow-up
|
|
19516
|
+
* decoded array and every promoted row was skipped as malformed (follow-up 102).
|
|
19517
19517
|
* `null` = unreadable, absent included (the column is NOT NULL, so absence is
|
|
19518
19518
|
* corruption) — the row is reported, never repaired.
|
|
19519
19519
|
*/
|
|
@@ -19633,7 +19633,7 @@ var TapeStatusOutputSchema = require_clip_model_registry.object({ cameras: requi
|
|
|
19633
19633
|
var TapeLightingInputSchema = require_clip_model_registry._enum(["day", "ir"]);
|
|
19634
19634
|
/**
|
|
19635
19635
|
* Free text the settings store would hand back decoded is refused by name
|
|
19636
|
-
* (follow-up
|
|
19636
|
+
* (follow-up 102, review M2): whole JSON array/object text in a TEXT column
|
|
19637
19637
|
* comes back as an array or object, and the index could not read the row.
|
|
19638
19638
|
*/
|
|
19639
19639
|
var NOT_JSON_TEXT = "must not be JSON array/object text — the settings store would hand it back decoded";
|
|
@@ -20695,7 +20695,7 @@ var FACE_ALIGNMENT_SCRFD_V2 = "scrfd-v2";
|
|
|
20695
20695
|
/**
|
|
20696
20696
|
* The moment every node was running the fixed detector.
|
|
20697
20697
|
*
|
|
20698
|
-
* `addon-pipeline` landed on the hub at 12:08:18Z and on
|
|
20698
|
+
* `addon-pipeline` landed on the hub at 12:08:18Z and on agent-a at
|
|
20699
20699
|
* 12:08:27Z on 2026-09-26 (package.json mtimes, read 2026-09-26); the Mac agent
|
|
20700
20700
|
* was deployed in the same run. 12:30Z leaves margin for the Mac and for a
|
|
20701
20701
|
* runner respawn.
|
|
@@ -22139,7 +22139,7 @@ function embeddingMagnitudeVerdict(magnitude, bound) {
|
|
|
22139
22139
|
* A photograph has no camera, and `MediaStore.put` requires a number for the
|
|
22140
22140
|
* blob path. `0` is the ABSENCE of a camera, not a camera — so it appears in a
|
|
22141
22141
|
* media path and never in `tags: { deviceId }`, which is the key that answers
|
|
22142
|
-
* "why is
|
|
22142
|
+
* "why is 102 worse than 101?" and which a photo cannot answer.
|
|
22143
22143
|
*/
|
|
22144
22144
|
var PHOTO_ENROLL_DEVICE_ID = 0;
|
|
22145
22145
|
/** The step tree analysis runs: a face detector ROOT with the embedder nested. */
|
|
@@ -24652,7 +24652,7 @@ var FaceStore = class {
|
|
|
24652
24652
|
*
|
|
24653
24653
|
* This exists because the loss it reports ran for weeks without a single log
|
|
24654
24654
|
* line: the prune only ever logged an aggregate count with no `deviceId`, so
|
|
24655
|
-
* "why did camera
|
|
24655
|
+
* "why did camera 108 forget the person it asked me about" could not be asked
|
|
24656
24656
|
* of the logs at all. One line per camera (not per row) keeps the volume sane
|
|
24657
24657
|
* while still answering the per-camera question.
|
|
24658
24658
|
*
|
|
@@ -25284,7 +25284,7 @@ var FaceStore = class {
|
|
|
25284
25284
|
* which is what a mis-enrolment actually looks like.
|
|
25285
25285
|
*
|
|
25286
25286
|
* `suspicion` is the EXCESS — `bestForeign − selfMean` — because that is the
|
|
25287
|
-
* only one of the two that discriminates on real data. Measured on
|
|
25287
|
+
* only one of the two that discriminates on real data. Measured on Bob's
|
|
25288
25288
|
* 106 samples, 2026-09-08: `selfMean` has a median of 0.188 and a p90 of 0.235,
|
|
25289
25289
|
* so ANY absolute reading of "does not look like itself" fires on the whole
|
|
25290
25290
|
* gallery. The first version of this module scored `(1 − selfMean) / 2` and
|
|
@@ -27673,7 +27673,7 @@ function intersection(a, b) {
|
|
|
27673
27673
|
* consumer that cuts pixels from `TrackedDetectionOut.bbox` — the best-shot
|
|
27674
27674
|
* thumbnail, `wideCentralSquareLayout`'s central square, the close-time
|
|
27675
27675
|
* keyFrame→thumbnail derive — framed a motorcycle with its rider's head cut
|
|
27676
|
-
* off. Operator, device
|
|
27676
|
+
* off. Operator, device 102, tracks `7f50622b` and `9cbc4791`, three minutes
|
|
27677
27677
|
* apart: "motocicli e veicoli a due ruote devono includere il conducente nel
|
|
27678
27678
|
* keyframe" [motorcycles and two-wheeled vehicles must include the rider in the keyframe] (D407).
|
|
27679
27679
|
*
|
|
@@ -27761,7 +27761,7 @@ var MAX_PREDICTION_MS = 1e3;
|
|
|
27761
27761
|
/**
|
|
27762
27762
|
* A frame more than `maxMissedMs` behind the latest is a CLOCK STEP only as
|
|
27763
27763
|
* the K-th such frame in a row, each in order with the one before (follow-up
|
|
27764
|
-
*
|
|
27764
|
+
* 102, fix round 3; D49: a read that would destroy work needs another to
|
|
27765
27765
|
* agree). A step ends every track on the camera; one stray timestamp — a
|
|
27766
27766
|
* backlog spike 4.5 s late — or two runner clocks delivering interleaved
|
|
27767
27767
|
* (a camera migrating between runners) must not. Three is the least that a
|
|
@@ -27910,7 +27910,7 @@ var SpawnRefusalSampler = class {
|
|
|
27910
27910
|
* How far back the "did this thing actually go anywhere" question looks.
|
|
27911
27911
|
*
|
|
27912
27912
|
* Long enough to span several breaths of a flickering box (the measured cycle
|
|
27913
|
-
* on
|
|
27913
|
+
* on 102 runs about five analysed frames), short enough that a car which stops
|
|
27914
27914
|
* is called stopped while the operator is still watching it.
|
|
27915
27915
|
*/
|
|
27916
27916
|
var DEFAULT_STILL_WINDOW_MS = 6e3;
|
|
@@ -27918,7 +27918,7 @@ var DEFAULT_STILL_WINDOW_MS = 6e3;
|
|
|
27918
27918
|
* The span the centroid may wander inside that window and still count as
|
|
27919
27919
|
* still, as a fraction of the subject's smaller side.
|
|
27920
27920
|
*
|
|
27921
|
-
* Measured on
|
|
27921
|
+
* Measured on 102: the parked car's centroid band is 105 px on a 461x536 box —
|
|
27922
27922
|
* 0.23 of the short side. A car crossing the frame covers roughly 1.8 box
|
|
27923
27923
|
* widths in the same window. 0.35 sits in the gap with room on both sides, and
|
|
27924
27924
|
* scaling by the subject means one number serves a 40 px person and a 461 px
|
|
@@ -28662,7 +28662,7 @@ var arcKey = (from, to) => `${from}\u0000${to}`;
|
|
|
28662
28662
|
/**
|
|
28663
28663
|
* The rejections that mean "geometry or appearance said no to a plausible
|
|
28664
28664
|
* continuation" of a confirmed predecessor — a track the operator sees break
|
|
28665
|
-
* (follow-up
|
|
28665
|
+
* (follow-up 102, F5). Every one of them is past `hardRejection`, so the
|
|
28666
28666
|
* predecessor is confirmed. NOT here (fix round 1): `unconfirmed`;
|
|
28667
28667
|
* `has-successor` (continued elsewhere); `concurrent` and `identity-conflict`
|
|
28668
28668
|
* (two subjects — the normal case, and the most frequent); `dropped` (an
|
|
@@ -28766,7 +28766,7 @@ var DeferredLinker = class {
|
|
|
28766
28766
|
else seen.add(p.identity);
|
|
28767
28767
|
}
|
|
28768
28768
|
/**
|
|
28769
|
-
* A clock step (follow-up
|
|
28769
|
+
* A clock step (follow-up 102, fix round 2): every piece still undecided is
|
|
28770
28770
|
* decided `new`, so nothing that existed before the step can be absorbed
|
|
28771
28771
|
* across it — whatever was ready was committed just before. The facade
|
|
28772
28772
|
* rebases its clock past `LINK_MAX_GAP_MS`, so no later piece can continue
|
|
@@ -29540,7 +29540,7 @@ var Tracklet = class {
|
|
|
29540
29540
|
* frames reach the tracker out of capture order, up to 1.2 s back) is
|
|
29541
29541
|
* `stale`: it changes nothing. A rewound tracklet would be measured from a
|
|
29542
29542
|
* box its subject left a second ago, and L2 refused a link by reach on
|
|
29543
|
-
* exactly that (follow-up
|
|
29543
|
+
* exactly that (follow-up 102, F1). The caller reports it.
|
|
29544
29544
|
*/
|
|
29545
29545
|
observeConfident(det, t, faceBearing) {
|
|
29546
29546
|
if (t < this.lastSeenAt) return "stale";
|
|
@@ -30002,7 +30002,7 @@ var TrackerV2 = class {
|
|
|
30002
30002
|
return step.emissions.map((e) => this.emit(e, t));
|
|
30003
30003
|
}
|
|
30004
30004
|
/**
|
|
30005
|
-
* A frame stamped before the latest one already taken (follow-up
|
|
30005
|
+
* A frame stamped before the latest one already taken (follow-up 102, F1;
|
|
30006
30006
|
* ~1 % of frames, up to 1.2 s back). It is decided ONCE, for the whole
|
|
30007
30007
|
* frame (fix round 1, H1): matched against the tracklets' NEWEST boxes, a
|
|
30008
30008
|
* stale box can land on another subject — a walker's old box on the walker
|
|
@@ -31602,7 +31602,7 @@ var UPDATE_MIN_CROP_AREA_GROWTH = .15;
|
|
|
31602
31602
|
* the async detail plane and writes it to the row (`applyLabelCandidate`) —
|
|
31603
31603
|
* never into a frame patch — so a signal reading only the patch can never
|
|
31604
31604
|
* fire the identity trigger for a recognised face. Measured on the live hub
|
|
31605
|
-
* (2026-09-05, device
|
|
31605
|
+
* (2026-09-05, device 104): six of six face identities reached Home
|
|
31606
31606
|
* Assistant only on the `end` event at track close + sweep (~lastSeen+33 s),
|
|
31607
31607
|
* zero during the track's life, while the subject was still on camera.
|
|
31608
31608
|
*/
|
|
@@ -32461,8 +32461,8 @@ var TrackCloser = class {
|
|
|
32461
32461
|
*
|
|
32462
32462
|
* One message, one `reason` field, so the rate is a single Loki query and the
|
|
32463
32463
|
* breakdown is a `sum by (reason)` rather than five differently-worded lines
|
|
32464
|
-
* nobody thinks to correlate. Always tagged with the device: "why is
|
|
32465
|
-
* worse than
|
|
32464
|
+
* nobody thinks to correlate. Always tagged with the device: "why is 102
|
|
32465
|
+
* worse than 101" is the only form this question has ever been asked in.
|
|
32466
32466
|
*/
|
|
32467
32467
|
logNoThumbnailAtClose(t, reason, extra) {
|
|
32468
32468
|
this.deps.logger.info("track closed with no thumbnail (last preview chance missed)", {
|
|
@@ -32699,7 +32699,7 @@ function trackProvenanceOf(frame) {
|
|
|
32699
32699
|
*
|
|
32700
32700
|
* ×1.2 → ×1.05 (operator, 2026-09-03: "riduci e proviamo"). The complaint was
|
|
32701
32701
|
* that a best shot carries too much surrounding scene, and the measurement says
|
|
32702
|
-
* where it goes. On 26 148 person samples from camera
|
|
32702
|
+
* where it goes. On 26 148 person samples from camera 102 the median bbox is
|
|
32703
32703
|
* 1.44× taller than wide, so the square is driven by HEIGHT and half its width
|
|
32704
32704
|
* is empty before the 16:9 extension adds any:
|
|
32705
32705
|
*
|
|
@@ -32778,7 +32778,7 @@ function squareSubjectCropRegion(bbox, frame) {
|
|
|
32778
32778
|
* appears in the lateral thirds. It is deliberately given up in ONE case: a
|
|
32779
32779
|
* subject against the edge of the SCENE, whose square is clamped by the frame
|
|
32780
32780
|
* border. There the slack is zero, no crop can both contain and avoid a fill,
|
|
32781
|
-
* and the operator ruled (2026-07-31, device
|
|
32781
|
+
* and the operator ruled (2026-07-31, device 102, a pram) that real pixels
|
|
32782
32782
|
* off-centre beat a synthesized blurred band. The full history of that bound —
|
|
32783
32783
|
* imposed, dropped, and re-imposed with this exception on 2026-08-20 after
|
|
32784
32784
|
* 7.7% of best shots measured mis-framed — is written at the slide itself.
|
|
@@ -32907,7 +32907,7 @@ function wideCentralSquareLayout(bbox, frame, options = {}) {
|
|
|
32907
32907
|
* {@link deliveredWideCentralSquareLayout} (when the whole track never offered
|
|
32908
32908
|
* one, delivery falls back to the contained layout). Measured 2026-08-21 over
|
|
32909
32909
|
* 48h / 2133 tracks: 3.4% of best shots fell under this line, 23% on the worst
|
|
32910
|
-
* camera (
|
|
32910
|
+
* camera (102) — and the operator-reported track carried 6.8%.
|
|
32911
32911
|
*/
|
|
32912
32912
|
var CENTRAL_SQUARE_CONTAINMENT_MIN = .5;
|
|
32913
32913
|
/**
|
|
@@ -34572,7 +34572,7 @@ var TrackerSweep = class {
|
|
|
34572
34572
|
* The gate ALREADY logs every decision. `logs.query` is an in-memory ring that
|
|
34573
34573
|
* measured 40 000 entries covering 38 MINUTES of fleet traffic on 2026-09-08 —
|
|
34574
34574
|
* so a fourteenth field on that line answers nothing the next morning, and the
|
|
34575
|
-
* questions this data exists for ("what fraction of births on
|
|
34575
|
+
* questions this data exists for ("what fraction of births on 102 were decided
|
|
34576
34576
|
* on a coasted frame, over the week the operator complained about") are all
|
|
34577
34577
|
* multi-day. A previous investigation in this repo was blocked for exactly
|
|
34578
34578
|
* this.
|
|
@@ -40829,7 +40829,7 @@ function isAfterCursor(row, cursor) {
|
|
|
40829
40829
|
* few to accumulate the repeated evidence a stationary ENTRY needs, so nothing
|
|
40830
40830
|
* suppresses them. Events reads `listRecentTracks`, which hides only
|
|
40831
40831
|
* `closedReason = stationary-promotion`. Stamping that reason on THIS class of
|
|
40832
|
-
* close is what keeps the six
|
|
40832
|
+
* close is what keeps the six 102/3829 re-fires out of the gallery.
|
|
40833
40833
|
*
|
|
40834
40834
|
* Net displacement, not walk: `1e073359` walked 6 px of jitter and was labelled
|
|
40835
40835
|
* moving; its start→end net was 0.5 px. Walk is the wrong "did it go anywhere".
|
|
@@ -43282,7 +43282,7 @@ var TrackStore = class {
|
|
|
43282
43282
|
* and the store has no column projection, so each row carries its ~8.5 KB
|
|
43283
43283
|
* `positions`/`snapshots` JSON through the sort. PER PAGE. Draining 17 940
|
|
43284
43284
|
* rows took 36 such pages: measured on a copy of the live database, 36 full
|
|
43285
|
-
* scans, and on the hub itself single statements of 1 196–1
|
|
43285
|
+
* scans, and on the hub itself single statements of 1 196–1 101 ms each,
|
|
43286
43286
|
* every one of them blocking the one synchronous thread the whole cluster
|
|
43287
43287
|
* reads configuration through. `listDeviceIds` has ~10 callers.
|
|
43288
43288
|
*
|
|
@@ -45105,8 +45105,8 @@ var StillnessSettingsSchema = require_clip_model_registry.object({
|
|
|
45105
45105
|
* The camera's "not travelling" bar: centroid speed as a fraction of the
|
|
45106
45106
|
* SUBJECT's own box diagonal, per second. `0` = not calibrated (see above).
|
|
45107
45107
|
*
|
|
45108
|
-
* Measured p50 on the live hub 2026-09-19, for scale: 0.0136 (device
|
|
45109
|
-
* close view, mostly parked subjects) to 0.3081 (device
|
|
45108
|
+
* Measured p50 on the live hub 2026-09-19, for scale: 0.0136 (device 107,
|
|
45109
|
+
* close view, mostly parked subjects) to 0.3081 (device 101, far view, only
|
|
45110
45110
|
* transits).
|
|
45111
45111
|
*/
|
|
45112
45112
|
stillnessSpeedFracPerSec: require_clip_model_registry.number().min(0).max(STILLNESS_BAR_MAX).default(0),
|
|
@@ -47493,7 +47493,7 @@ function describeTapeStatus(input) {
|
|
|
47493
47493
|
/**
|
|
47494
47494
|
* Long side of the gif.
|
|
47495
47495
|
*
|
|
47496
|
-
* 640, against the 480 the notification used to ask for. Measured on a real
|
|
47496
|
+
* 640, against the 480 the notification used to ask for. Measured on a real 101
|
|
47497
47497
|
* clip: 480 px at 8 fps is 195 KB and 640 px is 324 KB — both far under the
|
|
47498
47498
|
* smallest cap any notifier declares (pushover's 5 MiB), and the difference is
|
|
47499
47499
|
* the one an operator notices on a phone.
|
|
@@ -47530,7 +47530,7 @@ var NC_GIF_SPEED = 4;
|
|
|
47530
47530
|
* copied — it is a `libx264` burst. The OPERATOR priced that and took it. It is
|
|
47531
47531
|
* one encode per event over a ~12 s window, not a permanent transcode child
|
|
47532
47532
|
* ([D84](../../../../../../docs/decisions/adr-0084.md) is about the latter), and
|
|
47533
|
-
* it was measured on a real
|
|
47533
|
+
* it was measured on a real 101 720p cut before being chosen: **0.23 s of
|
|
47534
47534
|
* encode, 254 KB out**, against the 922 KB the copy of the same window carried.
|
|
47535
47535
|
* The re-encode is smaller than what it replaces.
|
|
47536
47536
|
*
|
|
@@ -48322,7 +48322,7 @@ function checkTimelapsePacing(input) {
|
|
|
48322
48322
|
* listed, before anything is rendered.
|
|
48323
48323
|
*
|
|
48324
48324
|
* Every log line here carries `tags: { deviceId }`. A miss is always asked
|
|
48325
|
-
* per-camera ("why is 1441 worse than
|
|
48325
|
+
* per-camera ("why is 1441 worse than 101?") and a line without the tag cannot
|
|
48326
48326
|
* answer it.
|
|
48327
48327
|
*/
|
|
48328
48328
|
/** `part / whole` to two decimals — the shape a log line is read in. An empty
|
|
@@ -50928,7 +50928,7 @@ function observeLevel(state, sample, cfg) {
|
|
|
50928
50928
|
* ON by default (`enabled` defaults to TRUE). An earlier version of this line
|
|
50929
50929
|
* said "Ships DORMANT: `enabled` defaults to `false`" — that was stale, and on
|
|
50930
50930
|
* 2026-07-30 it nearly produced the conclusion that the gate was not running at
|
|
50931
|
-
* all. It is: it suppressed several phantom births on device
|
|
50931
|
+
* all. It is: it suppressed several phantom births on device 101 that same day.
|
|
50932
50932
|
* Read the schema, not this paragraph.
|
|
50933
50933
|
*
|
|
50934
50934
|
* The gate is fail-DEFERRED, not fail-open (changed 2026-08-01). Anything that
|
|
@@ -51585,7 +51585,7 @@ var EmbeddingDispatcher = class {
|
|
|
51585
51585
|
*
|
|
51586
51586
|
* The line is deliberately NOT tagged with a single `deviceId`: it is not
|
|
51587
51587
|
* about one camera, it is about all of them at once. The per-camera question
|
|
51588
|
-
* the tag exists to answer ("why is
|
|
51588
|
+
* the tag exists to answer ("why is 102 different from 101?") is answered by
|
|
51589
51589
|
* `meta.perDevice`, which carries the numeric id and count for every camera
|
|
51590
51590
|
* in the window.
|
|
51591
51591
|
*/
|
|
@@ -52532,7 +52532,7 @@ function deriveSuggestionMinCosine(similarityThreshold) {
|
|
|
52532
52532
|
*
|
|
52533
52533
|
* `bufferMaxPerDevice` evicts oldest-first, and a row the recognizer put a
|
|
52534
52534
|
* `suggestedIdentityId` on was exempt from nothing. Measured 2026-08-25: 15 of
|
|
52535
|
-
* 24 live cameras sat at EXACTLY the cap, and on camera
|
|
52535
|
+
* 24 live cameras sat at EXACTLY the cap, and on camera 108 (59 faces in 25 h)
|
|
52536
52536
|
* a suggestion survived roughly one day. A question the system asked was
|
|
52537
52537
|
* deleted before the operator could answer it, silently.
|
|
52538
52538
|
*
|
|
@@ -52658,7 +52658,7 @@ function planStoredMinFaceConfidencePurge(raw) {
|
|
|
52658
52658
|
* Both come from the live hub, 2026-09-07, three hours, 20 cameras with gate
|
|
52659
52659
|
* traffic:
|
|
52660
52660
|
*
|
|
52661
|
-
* - `BIRTH_EVIDENCE_SLOTS_PER_CAMERA = 8`. The busiest camera (`
|
|
52661
|
+
* - `BIRTH_EVIDENCE_SLOTS_PER_CAMERA = 8`. The busiest camera (`hall`, 369
|
|
52662
52662
|
* gate verdicts) held at most FIVE distinct birth candidates in any 4 s
|
|
52663
52663
|
* window; the next busiest held four. Eight is that worst case with margin.
|
|
52664
52664
|
* - `BIRTH_EVIDENCE_TTL_MS = 4 000`. `confirmationGateMaxDeferralMs` defaults
|
|
@@ -53082,7 +53082,7 @@ var SUPPRESS_IOU = .6;
|
|
|
53082
53082
|
* rather than a DIFFERENT vehicle. Below this floor a detection can neither
|
|
53083
53083
|
* confirm nor wake the entry (it is a different object).
|
|
53084
53084
|
*
|
|
53085
|
-
* This overlap gate is the fix for the
|
|
53085
|
+
* This overlap gate is the fix for the 102 parking-lot flood: the previous
|
|
53086
53086
|
* wake test used a centroid-distance radius of half the frame diagonal, so any
|
|
53087
53087
|
* other vehicle merely PRESENT in the lot (a car driving through, or a second
|
|
53088
53088
|
* car parked ~120px away) satisfied "near + moved" and retired the parked
|
|
@@ -53098,7 +53098,7 @@ var WAKE_ASSOC_IOU = .1;
|
|
|
53098
53098
|
* long IS a parked object" — and it was measuring the wrong thing: it rewarded
|
|
53099
53099
|
* an object seen well and often, while the parked cars that actually need
|
|
53100
53100
|
* suppressing are re-discovered as dozens of short tracks that never live this
|
|
53101
|
-
* long (device
|
|
53101
|
+
* long (device 102: 140 tracks for one car, median life 6.8 s). Birth moved to
|
|
53102
53102
|
* repetition — see `stationary-evidence.ts`.
|
|
53103
53103
|
*
|
|
53104
53104
|
* The stillness test survives because it was doing TWO jobs and only one of
|
|
@@ -53108,7 +53108,7 @@ var WAKE_ASSOC_IOU = .1;
|
|
|
53108
53108
|
* closes early and the next motion re-opens it — so one recent stillness read
|
|
53109
53109
|
* is the right amount of proof. Without this valve, removing promotion would
|
|
53110
53110
|
* leave every session containing a parked car pinned to `maxSessionHoldMs`
|
|
53111
|
-
* (120 s) forever:
|
|
53111
|
+
* (120 s) forever: 102 measured 504 sessions in 24 h, which is 70% detection
|
|
53112
53112
|
* uptime on one camera, and three cameras are already above 50%.
|
|
53113
53113
|
*/
|
|
53114
53114
|
var SESSION_STILLNESS_WINDOW_MS = 3e4;
|
|
@@ -53124,7 +53124,7 @@ var ENTRY_TTL_MS = 5 * 6e4;
|
|
|
53124
53124
|
* D49 says a destructive one-shot needs a second read that agrees. Until
|
|
53125
53125
|
* 2026-08-28 this registry satisfied that by counting to two, and the two reads
|
|
53126
53126
|
* it counted were consecutive frames of the SAME optical event — which is one
|
|
53127
|
-
* read reported twice. Measured on device
|
|
53127
|
+
* read reported twice. Measured on device 102 that day: the same two parked
|
|
53128
53128
|
* cars were promoted five times in 17 minutes and retired three times as
|
|
53129
53129
|
* `departed`, while the stored images prove neither car moved.
|
|
53130
53130
|
*
|
|
@@ -53172,7 +53172,7 @@ var DEPARTURE_STRIKE_TTL_MS = 3e4;
|
|
|
53172
53172
|
* absence may confirm a pending departure.
|
|
53173
53173
|
*
|
|
53174
53174
|
* A miss is not a read of the object; it is the absence of one, and on this
|
|
53175
|
-
* fleet it is the single most common non-signal — media capture on
|
|
53175
|
+
* fleet it is the single most common non-signal — media capture on 102 fails
|
|
53176
53176
|
* ~25% of the time, the detector drops boxes at night, and the pipeline has a
|
|
53177
53177
|
* whole dropout-skip mechanism because detector dropouts come in bursts. So an
|
|
53178
53178
|
* absence confirms only when it is SUSTAINED: five consecutive unassociated
|
|
@@ -53190,7 +53190,7 @@ var DEPARTURE_ABSENCE_MIN_READS = 5;
|
|
|
53190
53190
|
*
|
|
53191
53191
|
* At 5.9–7.9 fps a 5 s gap is 30–40 missing frames, far beyond any dropout
|
|
53192
53192
|
* hiccup, and far below the minutes that separate two motion sessions on a
|
|
53193
|
-
* session-dispatch camera (the observed re-promotions on
|
|
53193
|
+
* session-dispatch camera (the observed re-promotions on 102 were 2–6 min
|
|
53194
53194
|
* apart). Crossing it resets the warm-up and discards every pending strike:
|
|
53195
53195
|
* evidence gathered in one session may not settle a question raised in another.
|
|
53196
53196
|
*/
|
|
@@ -53200,7 +53200,7 @@ var GATE_SESSION_GAP_MS = 5e3;
|
|
|
53200
53200
|
*
|
|
53201
53201
|
* The first frames of a session are the least trustworthy pixels the pipeline
|
|
53202
53202
|
* ever sees — a cold h265 decoder emits loose, half-built boxes — and one of the
|
|
53203
|
-
* three observed
|
|
53203
|
+
* three observed 102 retirements fired on the session's first two frames, which
|
|
53204
53204
|
* were **0.9 s apart**. Two seconds is more than twice that, and at the ~1.1 fps
|
|
53205
53205
|
* those cold frames actually arrived it covers the first two or three of them.
|
|
53206
53206
|
*
|
|
@@ -53235,7 +53235,7 @@ var DEFAULT_MATCH_CONFIG = {
|
|
|
53235
53235
|
* EVERY detection on a live parked object is suppressed, not just the one
|
|
53236
53236
|
* the entry matched best (D275) — the operator's requirement is stated over
|
|
53237
53237
|
* detections ("a detection matching type AND box must not open a track"),
|
|
53238
|
-
* and the entry-driven reading of it leaked 13 of 23 tracks on device
|
|
53238
|
+
* and the entry-driven reading of it leaked 13 of 23 tracks on device 102.
|
|
53239
53239
|
*
|
|
53240
53240
|
* 2. `trackIsStill` — given a track's recent centroid path, decides whether it
|
|
53241
53241
|
* has stopped moving. Reuses the static-track-gate metrics (net
|
|
@@ -53316,14 +53316,14 @@ function centroidInside(b, p) {
|
|
|
53316
53316
|
* 0.30, down from the 0.55 that was measured against 3829's SUV (~0.78 of 4K,
|
|
53317
53317
|
* where centroid-inside is true for almost every vehicle in view). The SUV is
|
|
53318
53318
|
* far above both numbers and is unaffected. What sits in the band [0.30, 0.55)
|
|
53319
|
-
* on this fleet is
|
|
53319
|
+
* on this fleet is 102's own parked car at 0.36 — and the dawn "envelope
|
|
53320
53320
|
* exploded" ghost at 0.361 that ate a genuinely different parked motorcycle
|
|
53321
53321
|
* as a "fragment" of itself (D495, D497). D497 answered that by refusing the
|
|
53322
53322
|
* BIRTH on area, which cannot separate the car from the ghost (0.360 against
|
|
53323
53323
|
* 0.361, twelve refusals of the car in twelve hours). This answers it where
|
|
53324
53324
|
* the damage is: an oversize entry may be born, and may not REACH.
|
|
53325
53325
|
*
|
|
53326
|
-
* The cost was measured before the number moved.
|
|
53326
|
+
* The cost was measured before the number moved. 102, 2026-09-16, 03:26 to
|
|
53327
53327
|
* 06:50, with the 0.353 car as the camera's only entry: 1 717 detections
|
|
53328
53328
|
* absorbed and `continuable: 0` — not one weak hold. Every read of an oversize
|
|
53329
53329
|
* parked object is strong, so it loses nothing by being held that way; the
|
|
@@ -53365,7 +53365,7 @@ function detectionSwallowsEntry(det, parked) {
|
|
|
53365
53365
|
* entry and sitting (almost) wholly inside it.
|
|
53366
53366
|
*
|
|
53367
53367
|
* The mirror of {@link detectionSwallowsEntry}, and the case neither IoU
|
|
53368
|
-
* threshold can see. Measured on
|
|
53368
|
+
* threshold can see. Measured on 102: a 34x137 box inside a 452x420 parked
|
|
53369
53369
|
* motorcycle scores IoU 0.024 — BELOW `wakeAssocIou` (0.1), so the filter read
|
|
53370
53370
|
* it as "no detection overlaps this entry" and let it open a track, accumulate
|
|
53371
53371
|
* its own evidence and promote into a registry entry of its own. The camera
|
|
@@ -53426,7 +53426,7 @@ function bboxMatchesParkedEntry(bbox, className, entries, suppressIou = SUPPRESS
|
|
|
53426
53426
|
* It is deliberately the same predicate the per-frame filter uses
|
|
53427
53427
|
* ({@link parkedEntryHoldsDetection}): a box the filter would suppress as a
|
|
53428
53428
|
* parked object's own must not be able to become a second parked object. Device
|
|
53429
|
-
*
|
|
53429
|
+
* 102 held four rows for one car and a fifth for a fragment of a motorcycle
|
|
53430
53430
|
* because the birth path asked nothing at all.
|
|
53431
53431
|
*/
|
|
53432
53432
|
function findParkedOccupant(entries, className, bbox, suppressIou = SUPPRESS_IOU, wakeAssocIou = WAKE_ASSOC_IOU) {
|
|
@@ -53459,7 +53459,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53459
53459
|
*
|
|
53460
53460
|
* Matching is ASSOCIATION-GATED by box overlap so an entry can only ever be
|
|
53461
53461
|
* confirmed or woken by ITS OWN object — never by a different same-class
|
|
53462
|
-
* vehicle merely present elsewhere in the frame (the
|
|
53462
|
+
* vehicle merely present elsewhere in the frame (the 102 parking-lot flood:
|
|
53463
53463
|
* passing/neighbouring cars used to retire parked entries, forcing endless
|
|
53464
53464
|
* re-spawns). Per entry, over the best-overlapping same-class detection:
|
|
53465
53465
|
*
|
|
@@ -53484,7 +53484,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53484
53484
|
* requires a second read that agrees — and until 2026-08-28 this file satisfied
|
|
53485
53485
|
* that requirement while completely defeating it, because the two reads it
|
|
53486
53486
|
* counted were **consecutive frames of the same optical event**. One retirement
|
|
53487
|
-
* on device
|
|
53487
|
+
* on device 102 fired on the session's first two frames, 0.9 s apart, off a
|
|
53488
53488
|
* cold h265 decode; another off a passing car occluding the parked one (IoU
|
|
53489
53489
|
* 0.36, centroid outside — a textbook departing read, twice, 150 ms apart).
|
|
53490
53490
|
* Correlated evidence is not confirmation. The result: the same two parked cars
|
|
@@ -53534,7 +53534,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53534
53534
|
* absorbed ONE detection per frame and released every other detection sitting on
|
|
53535
53535
|
* the very same parked box to the tracker, where it opened a track — precisely
|
|
53536
53536
|
* the operator's report ("many tracks on parked cars") and precisely the
|
|
53537
|
-
* measurement: over 2 h on device
|
|
53537
|
+
* measurement: over 2 h on device 102, **13 of 23 tracks sat on one of the three
|
|
53538
53538
|
* stationary boxes at IoU ≥ 0.5**. IoU 0.5 clears the association floor (0.1)
|
|
53539
53539
|
* and the centroid test, so those detections were eligible for suppression by
|
|
53540
53540
|
* every geometric criterion in this file, and were released anyway.
|
|
@@ -53549,7 +53549,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53549
53549
|
*
|
|
53550
53550
|
* D275 predicted that a moving vehicle overlapping a parked one "loses a frame
|
|
53551
53551
|
* or two while it passes" and coasts through on `maxAge`. Measured on device
|
|
53552
|
-
*
|
|
53552
|
+
* 102 on 2026-09-08 it lost the whole pass: the parked cars sit at the frame
|
|
53553
53553
|
* edge, so a car driving across their front is held on every frame from the
|
|
53554
53554
|
* first overlap to the moment it leaves the frame, and the tracker — which had
|
|
53555
53555
|
* followed it for 5–10 frames — coasts `maxMissedMs` on nothing and drops it.
|
|
@@ -53758,7 +53758,7 @@ function trackIsStill(input) {
|
|
|
53758
53758
|
*
|
|
53759
53759
|
* The generic `StationaryObjectRegistry` used to promote a track that recorded
|
|
53760
53760
|
* 4 positions inside a 30 s window — a criterion built for a car parking in
|
|
53761
|
-
* device
|
|
53761
|
+
* device 102's lot and observed on EVERY frame. (It has since moved to repeated
|
|
53762
53762
|
* evidence across many sightings, `stationary-evidence.ts`; the impossibility
|
|
53763
53763
|
* below is what forced this path to exist, and the class SKIP in the generic
|
|
53764
53764
|
* loop is what keeps it separate now.)
|
|
@@ -53770,7 +53770,7 @@ function trackIsStill(input) {
|
|
|
53770
53770
|
* why `PackageDropDetector` never fired once in its life (0 `pa-pkg-*` rows on
|
|
53771
53771
|
* every camera, ever, verified 2026-08-13).
|
|
53772
53772
|
*
|
|
53773
|
-
* Measured on device
|
|
53773
|
+
* Measured on device 101 (the only camera that has ever produced a `package`
|
|
53774
53774
|
* box): three separate tracks at 02:01:08, 02:03:14 and 02:05:29, each alive
|
|
53775
53775
|
* for 4–5 s, each carrying TWO frames ~1.2 s apart, each on a NEW trackId. The
|
|
53776
53776
|
* facts to accommodate are therefore:
|
|
@@ -53784,7 +53784,7 @@ function trackIsStill(input) {
|
|
|
53784
53784
|
* is given (IoU re-association across looks, not tracker minHits);
|
|
53785
53785
|
* - a settle burst of three frames ~400 ms apart is still three hits in
|
|
53786
53786
|
* tests and when the step runs that often; at governor cadence each look
|
|
53787
|
-
* is one hit. Device
|
|
53787
|
+
* is one hit. Device 101 2026-08-24 13:40: a real parcel expired at
|
|
53788
53788
|
* rounds=1 / dwell 1458 ms vs 15 s — the 5 s round-gap plus 15 s dwell
|
|
53789
53789
|
* were the miss.
|
|
53790
53790
|
*
|
|
@@ -53814,7 +53814,7 @@ function trackIsStill(input) {
|
|
|
53814
53814
|
* and re-sights a parcel that is still there before the expiry is judged.
|
|
53815
53815
|
*
|
|
53816
53816
|
* `sweep` judges the same TTL off a timer, so a pick-up is not held until the
|
|
53817
|
-
* next frame happens to arrive (
|
|
53817
|
+
* next frame happens to arrive (101, 2026-09-30: 29 s). It concludes ONLY a
|
|
53818
53818
|
* promoted parcel with an ABSENCE READ since its last sighting — a frame on
|
|
53819
53819
|
* which the package step LOOKED (`looked`) and found no box at that place,
|
|
53820
53820
|
* with no person or vehicle box over it (`occluders`). A parcel nobody looked
|
|
@@ -53837,14 +53837,14 @@ var PACKAGE_STILLNESS_ROUND_GAP_MS = 5e3;
|
|
|
53837
53837
|
/**
|
|
53838
53838
|
* How long a candidate survives without being re-associated, in OBSERVED time.
|
|
53839
53839
|
* Must comfortably outlast several governor polls — the real inter-round gap
|
|
53840
|
-
* measured on
|
|
53840
|
+
* measured on 101 was ~2 minutes, not the nominal 45 s, because a
|
|
53841
53841
|
* session-dispatch camera decodes nothing between motion sessions.
|
|
53842
53842
|
*/
|
|
53843
53843
|
var PACKAGE_STILLNESS_TTL_MS = 5 * 6e4;
|
|
53844
53844
|
/**
|
|
53845
53845
|
* Association floor. Deliberately looser than the registry's `SUPPRESS_IOU`
|
|
53846
53846
|
* (0.6): a box re-detected minutes later by a fresh track jitters more than one
|
|
53847
|
-
* confirmed frame-to-frame. Measured jitter on
|
|
53847
|
+
* confirmed frame-to-frame. Measured jitter on 101's doormat across 4 minutes
|
|
53848
53848
|
* was IoU ≈ 0.98, so 0.3 is generous without being meaningless.
|
|
53849
53849
|
*/
|
|
53850
53850
|
var PACKAGE_STILLNESS_ASSOC_IOU = .3;
|
|
@@ -54320,7 +54320,7 @@ function injectSecondarySubjects(frame, pending) {
|
|
|
54320
54320
|
* Memory of births whose ritual has already RUN, per device+source.
|
|
54321
54321
|
*
|
|
54322
54322
|
* A birth is a decision, and a decision is taken once. Until 2026-09-07 it
|
|
54323
|
-
* could be taken twice, on camera
|
|
54323
|
+
* could be taken twice, on camera 101 it routinely was, and the second vote
|
|
54324
54324
|
* won:
|
|
54325
54325
|
*
|
|
54326
54326
|
* 04:59:38.335Z confirmation gate: birth confirmed {trackId=f585b2ee…
|
|
@@ -54403,7 +54403,7 @@ var RETIRED_REJECTIONS_PER_DEVICE = 256;
|
|
|
54403
54403
|
* resurrection. So a rejected birth has already been written by the time the
|
|
54404
54404
|
* verdict exists. It correctly gets no `start`, no media and no notification —
|
|
54405
54405
|
* but the record stayed, and surfaced in `listRecentTracks`. On 2026-07-31 six
|
|
54406
|
-
* full-frame phantoms on device
|
|
54406
|
+
* full-frame phantoms on device 101 in nine minutes were every one of them
|
|
54407
54407
|
* suppressed AND listed.
|
|
54408
54408
|
*
|
|
54409
54409
|
* Retracting once is not enough. The tracker keeps carrying a rejected id for
|
|
@@ -54951,8 +54951,8 @@ function openRetrainUploadSink(target) {
|
|
|
54951
54951
|
* set of paths under one `cwd`. This is a different job. A track's media lives
|
|
54952
54952
|
* across several storage LOCATION roots (`eventMedia` and whatever else the
|
|
54953
54953
|
* operator relocated to), under paths that encode nothing a training set wants —
|
|
54954
|
-
* `
|
|
54955
|
-
* the way in, to `tracks/
|
|
54954
|
+
* `101/events/track/<uuid>/keyFrame.jpg` — and every entry has to be RENAMED on
|
|
54955
|
+
* the way in, to `tracks/101/<trackId>/keyFrame.jpg`. `tar.create` takes a list
|
|
54956
54956
|
* of paths relative to a single cwd and gives no rename hook, so using it would
|
|
54957
54957
|
* mean staging a whole shadow tree on disk first: a full second copy of the
|
|
54958
54958
|
* dataset, written and then deleted, to avoid writing 100 lines.
|
|
@@ -56372,7 +56372,7 @@ async function reembedFaceGallery(deps, options) {
|
|
|
56372
56372
|
* Per IDENTITY and not just in total, because the total is the number that
|
|
56373
56373
|
* misleads: a gallery 80% re-embedded can still have one person at zero, and
|
|
56374
56374
|
* `minIdentitySamples` means that person simply stops being recognised. On
|
|
56375
|
-
* 2026-08-20 that person would have been
|
|
56375
|
+
* 2026-08-20 that person would have been Carol, with 64 recognitions that day.
|
|
56376
56376
|
* Pure — the operator surface reads it, the pass does not.
|
|
56377
56377
|
*
|
|
56378
56378
|
* ## Why `unrecoverable` is an INPUT and not derived here
|
|
@@ -57054,14 +57054,14 @@ var OverlayDetailStateStore = class {
|
|
|
57054
57054
|
* docs/superpowers/specs/2026-07-17-detection-config-exposure-design.md
|
|
57055
57055
|
* (surface C). Confirmation is N frames (default 3); dwell default is 0
|
|
57056
57056
|
* (an extra bar). The 15 s dwell plus a 5 s round-gap missed a real
|
|
57057
|
-
* parcel on device
|
|
57057
|
+
* parcel on device 101 (2026-08-24 13:40).
|
|
57058
57058
|
*/
|
|
57059
57059
|
var PackageDropSettingsSchema = require_clip_model_registry.object({
|
|
57060
57060
|
/**
|
|
57061
57061
|
* Explicit per-camera OFF. **On by default: the ZONE RULE is what enables
|
|
57062
57062
|
* package detection**, not a second switch.
|
|
57063
57063
|
*
|
|
57064
|
-
* As an opt-in default-false this was a parallel source of truth. Device
|
|
57064
|
+
* As an opt-in default-false this was a parallel source of truth. Device 101
|
|
57065
57065
|
* on 2026-07-30 had the zone (`Uscio`), an enabled `package`-stage zone rule
|
|
57066
57066
|
* (`Pacchetti`, classFilter `['package']`), and a notification rule on
|
|
57067
57067
|
* `delivery: 'package-event'` — three layers of operator intent, all defeated
|
|
@@ -57079,7 +57079,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
|
|
|
57079
57079
|
* Same bar as tracker `minHits`: one frame is a flicker, two can still
|
|
57080
57080
|
* be a passer-by's bag, three is "it stayed". A settle burst of three
|
|
57081
57081
|
* frames in ~1 s is enough; no second governor round after the courier
|
|
57082
|
-
* left. Device
|
|
57082
|
+
* left. Device 101 2026-08-24 13:40 expired at 1 round / 1.5 s dwell.
|
|
57083
57083
|
*/
|
|
57084
57084
|
packageDropMinFrames: require_clip_model_registry.number().int().min(1).max(20).default(3),
|
|
57085
57085
|
/**
|
|
@@ -57094,7 +57094,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
|
|
|
57094
57094
|
/**
|
|
57095
57095
|
* Reject near-scene-sized blobs: MAX bbox area as a fraction of the frame.
|
|
57096
57096
|
*
|
|
57097
|
-
* Measured on device
|
|
57097
|
+
* Measured on device 101 (2026-08-21 analysis): 348/350 package false
|
|
57098
57098
|
* positives were ONE static object — the streetlight's light wedge on the
|
|
57099
57099
|
* granite paving — at 7.96–9.47% of the frame, scoring up to 0.877.
|
|
57100
57100
|
* Confidence cannot separate it (the one true parcel scored 0.885); area
|
|
@@ -57109,7 +57109,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
|
|
|
57109
57109
|
* package step spanning ≥ 10 s that found the doormat empty and unoccluded,
|
|
57110
57110
|
* with somebody in the drop-off zone around the disappearance — instead of
|
|
57111
57111
|
* waiting out the 300 s TTL. OFF by default: the one pick-up the stored data
|
|
57112
|
-
* could replay (
|
|
57112
|
+
* could replay (101, 2026-09-30) is no sample to judge the false-departure
|
|
57113
57113
|
* risk by. Silence always keeps the TTL.
|
|
57114
57114
|
*/
|
|
57115
57115
|
packageDropEarlyPickupEnabled: require_clip_model_registry.boolean().default(false),
|
|
@@ -57120,7 +57120,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
|
|
|
57120
57120
|
* box first appeared — and a departure only counts as `picked-up` with
|
|
57121
57121
|
* somebody in that zone around the disappearance. Whole-camera motion (a
|
|
57122
57122
|
* walker at the far gate) does not count. 0 disables both gates. Device
|
|
57123
|
-
*
|
|
57123
|
+
* 101's streetlight wedge cycled delivered→picked-up ~23×/night with
|
|
57124
57124
|
* nobody in the drop-off zone. Default 300 s: wide enough to absorb the
|
|
57125
57125
|
* motion-settle governor's cadence (the box is often first SEEN minutes
|
|
57126
57126
|
* after the courier left).
|
|
@@ -57322,7 +57322,7 @@ function shouldSkipDropoutFrame(activeTrackCount, detectionCount, consecutiveSki
|
|
|
57322
57322
|
*
|
|
57323
57323
|
* Until D665 the skip counted `frame.detections` only, so a frame whose sole
|
|
57324
57324
|
* box was a person at 0.5 read as a detector glitch and never reached the
|
|
57325
|
-
* tracker — on camera
|
|
57325
|
+
* tracker — on camera 104 more than half the frames of a re-split gap were
|
|
57326
57326
|
* dropout-skipped. A frame with a continuable box is not empty; `floor` is the
|
|
57327
57327
|
* camera's low-score floor, `null` when the tier is off.
|
|
57328
57328
|
*/
|
|
@@ -59037,7 +59037,7 @@ var NEAR_FULL_DIMENSION = .95;
|
|
|
59037
59037
|
/**
|
|
59038
59038
|
* Detection score at/above which a near-full-frame box is trusted as a REAL
|
|
59039
59039
|
* close subject rather than an exploded envelope/artifact. Live evidence
|
|
59040
|
-
* 2026-07-23 (
|
|
59040
|
+
* 2026-07-23 (dev101, near-top-down driveway camera): cars passing diagonally
|
|
59041
59041
|
* right under the lens produce GENUINE 0,0→640,341 boxes at score 0.45-0.9 —
|
|
59042
59042
|
* the size-only guard rejected every frame of every such track, so those
|
|
59043
59043
|
* tracks never landed a best `thumbnail` or `keyFrame` at all. The observed
|
|
@@ -59096,7 +59096,7 @@ function isPlausibleRetryBox(current, bestSeen, minFractionOfBest = RETRY_MIN_FR
|
|
|
59096
59096
|
* burst. Both are gone, for measured reasons:
|
|
59097
59097
|
*
|
|
59098
59098
|
* - The area bar separated nothing. The operator's own parked car on device
|
|
59099
|
-
*
|
|
59099
|
+
* 102 measures 0.360 of the frame; the dawn "envelope exploded" ghost that
|
|
59100
59100
|
* motivated the bar measured 0.361. Twelve refusals in twelve hours were
|
|
59101
59101
|
* the car, in a band nine thousandths wide.
|
|
59102
59102
|
* - The burst door was built on a mislabel. The runner filed every LIVE
|
|
@@ -59112,7 +59112,7 @@ function isPlausibleRetryBox(current, bestSeen, minFractionOfBest = RETRY_MIN_FR
|
|
|
59112
59112
|
* (D495's loss). That is answered where the reach is decided: at or above
|
|
59113
59113
|
* `OVERSIZE_AREA_FRAC` (`stationary-match.ts`) an entry holds a detection on a
|
|
59114
59114
|
* STRONG read only — no jitter hold, no fragment hold — exactly as the
|
|
59115
|
-
* scene-sized SUV on 3829 always has. Measured on
|
|
59115
|
+
* scene-sized SUV on 3829 always has. Measured on 102 between 03:26 and 06:50
|
|
59116
59116
|
* on 2026-09-16, with the 0.353 car as the only entry: 1 717 detections
|
|
59117
59117
|
* absorbed, `continuable: 0` — every read of an oversize parked car is strong,
|
|
59118
59118
|
* so the object loses nothing by being held that way.
|
|
@@ -59150,7 +59150,7 @@ function isPlausibleStationaryBirthBox(bbox, frameWidth, frameHeight) {
|
|
|
59150
59150
|
//#endregion
|
|
59151
59151
|
//#region src/pipeline-analytics/pipeline/stationary/stationary-evidence.ts
|
|
59152
59152
|
/**
|
|
59153
|
-
* `vehicle` and its kin. Every number below is read off device
|
|
59153
|
+
* `vehicle` and its kin. Every number below is read off device 102 over 24 h
|
|
59154
59154
|
* (18 402 vehicle observations, 290 tracks) with the three parked cars the
|
|
59155
59155
|
* operator can see out of the window as the bench.
|
|
59156
59156
|
*
|
|
@@ -59161,7 +59161,7 @@ function isPlausibleStationaryBirthBox(bbox, frameWidth, frameHeight) {
|
|
|
59161
59161
|
* - `minAgreementRatio` **0.6** — the measured gap is [0.29, 0.90]; 0.6 is the
|
|
59162
59162
|
* middle of it. Raising it to 0.95 starts dropping real parked cars.
|
|
59163
59163
|
* - `minAgreed` **8** — a floor, not a discriminator: sweeping it 3→60 changes
|
|
59164
|
-
* nothing on
|
|
59164
|
+
* nothing on 102 (the smallest true positive promotes with N=15). Set well
|
|
59165
59165
|
* below that so a rarely-seen object is never excluded for being rare, which
|
|
59166
59166
|
* is the entire point of using a ratio.
|
|
59167
59167
|
* - `minSpanMs` **120 000** — the real discriminator. True positives span
|
|
@@ -59178,7 +59178,7 @@ var VEHICLE_EVIDENCE_POLICY = {
|
|
|
59178
59178
|
* strictest numbers in the file, because these are MEASURED, not cautious.
|
|
59179
59179
|
*
|
|
59180
59180
|
* This is not caution, it is a measurement. Replaying 24 h of person
|
|
59181
|
-
* observations from devices
|
|
59181
|
+
* observations from devices 102, 111, 104 and 107 through this exact ledger:
|
|
59182
59182
|
*
|
|
59183
59183
|
* | ratio | minAgreed | minSpanMs | promotions / 24 h across 4 cameras |
|
|
59184
59184
|
* | ----- | --------- | --------- | ---------------------------------- |
|
|
@@ -59186,9 +59186,9 @@ var VEHICLE_EVIDENCE_POLICY = {
|
|
|
59186
59186
|
* | 0.95 | 40 | 1800 s | 10 |
|
|
59187
59187
|
* | 0.99 | 80 | 1800 s | **6** |
|
|
59188
59188
|
*
|
|
59189
|
-
* There is no setting that reaches zero. Device
|
|
59189
|
+
* There is no setting that reaches zero. Device 104 holds a person-shaped thing
|
|
59190
59190
|
* that agrees with itself 1292 times out of 1654 (0.78) across 26 tracks over
|
|
59191
|
-
* ten hours, and device
|
|
59191
|
+
* ten hours, and device 107 produced eleven candidates at ratio 1.00 between
|
|
59192
59192
|
* 02:00 and 05:00 — a statue, a poster, an IR artifact; the ledger cannot tell
|
|
59193
59193
|
* those from a person standing still, because they look identical to it.
|
|
59194
59194
|
*
|
|
@@ -59225,7 +59225,7 @@ function evidencePolicyFor(className) {
|
|
|
59225
59225
|
* How long a candidate survives without being touched.
|
|
59226
59226
|
*
|
|
59227
59227
|
* Six hours. Derived from the WORST case this criterion has to serve — a camera
|
|
59228
|
-
* whose only producer is occasion A. The busiest parking spot on
|
|
59228
|
+
* whose only producer is occasion A. The busiest parking spot on 102 is
|
|
59229
59229
|
* rediscovered ~0.5 times per hour at night, so evidence has to survive a
|
|
59230
59230
|
* multi-hour gap between sessions or it can never accumulate at all.
|
|
59231
59231
|
*
|
|
@@ -59235,7 +59235,7 @@ function evidencePolicyFor(className) {
|
|
|
59235
59235
|
*/
|
|
59236
59236
|
var EVIDENCE_WINDOW_MS = 360 * 6e4;
|
|
59237
59237
|
/** Per-device candidate cap. A camera producing detections in novel places
|
|
59238
|
-
* forever must not decide how much of hub-main's heap this uses.
|
|
59238
|
+
* forever must not decide how much of hub-main's heap this uses. 102, the
|
|
59239
59239
|
* busiest lot in the fleet, holds 8. */
|
|
59240
59240
|
var EVIDENCE_MAX_CANDIDATES_PER_DEVICE = 512;
|
|
59241
59241
|
/**
|
|
@@ -59245,7 +59245,7 @@ var EVIDENCE_MAX_CANDIDATES_PER_DEVICE = 512;
|
|
|
59245
59245
|
* A track binds at its first emitted frame and, until 2026-08-28, never
|
|
59246
59246
|
* re-bound. A track emitted on a settling box therefore captured whichever of
|
|
59247
59247
|
* a device's ~497 accumulated candidates it happened to touch first and stayed
|
|
59248
|
-
* there for its whole life. The arithmetic from the
|
|
59248
|
+
* there for its whole life. The arithmetic from the 102 audit: a promotion
|
|
59249
59249
|
* carried `agreed: 240 / seen: 240` — exactly one track's 239 observations plus
|
|
59250
59250
|
* the candidate's birth — while a second track's **267 observations of the same
|
|
59251
59251
|
* spot** were folded into a different row entirely. Had they landed together
|
|
@@ -59263,7 +59263,7 @@ var EVIDENCE_REBIND_MAX_BOUND_OVERLAP = .05;
|
|
|
59263
59263
|
* these, sliding.
|
|
59264
59264
|
*
|
|
59265
59265
|
* Fifteen minutes, chosen against the two failure modes it sits between. Too
|
|
59266
|
-
* short and a parked car that nobody observes for a while —
|
|
59266
|
+
* short and a parked car that nobody observes for a while — 102's busiest spot
|
|
59267
59267
|
* is rediscovered ~0.5 times an hour at night — arrives at an empty window and
|
|
59268
59268
|
* cannot answer at all. Too long and it becomes the lifetime counter it is
|
|
59269
59269
|
* replacing. Fifteen minutes holds several motion sessions on a daytime camera
|
|
@@ -59419,7 +59419,7 @@ function stillnessVerdictFor(source, trackState) {
|
|
|
59419
59419
|
* `stationaryThresholdSec` had not elapsed — `moving` in name only. On a
|
|
59420
59420
|
* session-dispatched camera those frames are a third of every 36 s track, and
|
|
59421
59421
|
* a session cut short by a passer-by is made of nothing else. Measured on
|
|
59422
|
-
* device
|
|
59422
|
+
* device 102 (DNRG309, 2026-09-19 20:32 → 09-20 07:53): 13 of the 21 tracks
|
|
59423
59423
|
* bound to the candidate never reached `idle`, the ledger's ratio was 0.493
|
|
59424
59424
|
* against 0.6, and a parked car took 11.3 h and 19 tracks to be censused.
|
|
59425
59425
|
*
|
|
@@ -59651,8 +59651,8 @@ function computeStationaryEntryZones(entry, zones, minOverlap) {
|
|
|
59651
59651
|
*
|
|
59652
59652
|
* It used to be `source === 'pipeline'`, in five places, each explaining that
|
|
59653
59653
|
* the gate "runs on that plane". The reason given was WHERE the flood it was
|
|
59654
|
-
* written for had been measured (
|
|
59655
|
-
* firmware's boxes were unfit. The cost of the accident, on device
|
|
59654
|
+
* written for had been measured (102, the ML plane), never an argument that the
|
|
59655
|
+
* firmware's boxes were unfit. The cost of the accident, on device 106: a still
|
|
59656
59656
|
* object is never promoted, so it holds `hasLiveTrack` true for as long as it
|
|
59657
59657
|
* sits there, and every detection session runs to its 120 s cap instead of
|
|
59658
59658
|
* closing on cooldown — `closed at the max-hold cap with a subject still
|
|
@@ -61805,7 +61805,7 @@ var StationaryEvidenceLedger = class {
|
|
|
61805
61805
|
/**
|
|
61806
61806
|
* Which candidate each of a device's live tracks is bound to.
|
|
61807
61807
|
*
|
|
61808
|
-
* The
|
|
61808
|
+
* The 102 audit could not answer this — the binding map was private, and the
|
|
61809
61809
|
* whole D280 defect is invisible without it: a promotion's `agreed`/`seen`
|
|
61810
61810
|
* tell you a row was fed, never WHICH track fed it or which track went
|
|
61811
61811
|
* somewhere else. Read-only, and the only reason it is public.
|
|
@@ -62084,7 +62084,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62084
62084
|
* so it confirms and never re-anchors. Letting a weak box move the anchor would
|
|
62085
62085
|
* let a passing lorry drag a parked car's reference across the frame.
|
|
62086
62086
|
*
|
|
62087
|
-
* It has one failure mode, and device
|
|
62087
|
+
* It has one failure mode, and device 102 sat in it for eight and a half hours.
|
|
62088
62088
|
* Entry `02e6bf01` was anchored, at promotion, on its source track's last box:
|
|
62089
62089
|
* **406x1103**. The car's real reading is **399x814** — same object, same
|
|
62090
62090
|
* place, a box inflated by a merged frame. IoU ≈ 0.58 against a `suppressIou`
|
|
@@ -62098,7 +62098,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62098
62098
|
* - worse, a weak hold is CONTINUABLE, so a passer-by's coasting track latches
|
|
62099
62099
|
* onto the parked car's box, its velocity drops below the still threshold,
|
|
62100
62100
|
* and the predicted box freezes there. Measured over 12 h: 18 198 weak holds
|
|
62101
|
-
* on
|
|
62101
|
+
* on 102 of which **1 330 were consumed by a confirmed track**, against
|
|
62102
62102
|
* **0** on a healthy camera. Four moving vehicles were provably captured
|
|
62103
62103
|
* this way, each sitting 33-35 s of its 35-38 s life on the parked car's box.
|
|
62104
62104
|
*
|
|
@@ -62117,7 +62117,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62117
62117
|
* How much the repeated box must still OVERLAP the anchor it is correcting.
|
|
62118
62118
|
*
|
|
62119
62119
|
* The time bound alone is not enough, and the first hour in production proved
|
|
62120
|
-
* it: on `
|
|
62120
|
+
* it: on `Camera studio` a `person` entry of 236x568 was re-anchored onto
|
|
62121
62121
|
* a 1094x1406 box — eleven times the area, IoU 0.087. That is not an anchor
|
|
62122
62122
|
* that is slightly wrong, it is a different object standing in front of the
|
|
62123
62123
|
* entry long enough to steal it. The rule this replaces refused exactly that,
|
|
@@ -62126,7 +62126,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62126
62126
|
* So the correction is bounded at BOTH ends. Above `suppressIou` (0.60) a read
|
|
62127
62127
|
* already re-anchors on the spot and needs none of this. Below this floor the
|
|
62128
62128
|
* two boxes are not the same object and no amount of patience makes them one.
|
|
62129
|
-
* 0.45 sits between: it admits
|
|
62129
|
+
* 0.45 sits between: it admits 102's 0.58 — the two-hundredths case this exists
|
|
62130
62130
|
* for — and refuses the 0.087 that broke the studio.
|
|
62131
62131
|
*/
|
|
62132
62132
|
var STALE_ANCHOR_MIN_IOU = .45;
|
|
@@ -62324,7 +62324,7 @@ var StationaryObjectRegistry = class {
|
|
|
62324
62324
|
* produced plenty and none of them was this car. The first says nothing
|
|
62325
62325
|
* about the object; the second says it is gone.
|
|
62326
62326
|
*
|
|
62327
|
-
* Measured on device
|
|
62327
|
+
* Measured on device 102: a motorcycle parked for 29 HOURS was retired by TTL
|
|
62328
62328
|
* after 6.2 minutes of observed time without a confirmation, while it was
|
|
62329
62329
|
* still physically there — a debug-flagged track two hours later sat on its
|
|
62330
62330
|
* exact spot with a median centroid displacement of 0.0 px. Losing the entry
|
|
@@ -62607,7 +62607,7 @@ var StationaryObjectRegistry = class {
|
|
|
62607
62607
|
* predicate the per-frame filter uses (`findParkedOccupant`): a box the
|
|
62608
62608
|
* filter would suppress as a parked object's own can never become a second
|
|
62609
62609
|
* parked object. Until 2026-09-14 this method minted whatever it was handed,
|
|
62610
|
-
* and device
|
|
62610
|
+
* and device 102 reported EIGHT parked vehicles — four of them one car, the
|
|
62611
62611
|
* same box to the decimal, promoted again roughly once an hour because the
|
|
62612
62612
|
* weak-continuation path (D410) keeps feeding the ledger from a track riding
|
|
62613
62613
|
* a parked object. The re-promotion is not the anomaly and is not worth
|
|
@@ -62615,7 +62615,7 @@ var StationaryObjectRegistry = class {
|
|
|
62615
62615
|
* still there. It just must not produce a neighbour.
|
|
62616
62616
|
*
|
|
62617
62617
|
* A merge never DOWNGRADES the tenant: it advances the clock and adopts an
|
|
62618
|
-
* identity the tenant lacks (the
|
|
62618
|
+
* identity the tenant lacks (the 102 duplicates arrived unlabelled while the
|
|
62619
62619
|
* row they belonged to was already `Car`), and it never overwrites one it
|
|
62620
62620
|
* has.
|
|
62621
62621
|
*/
|
|
@@ -62694,8 +62694,8 @@ var StationaryObjectRegistry = class {
|
|
|
62694
62694
|
* ONLY for the cameras this node analyses ({@link analyses}). Every node runs
|
|
62695
62695
|
* this addon and every node hydrates the SAME table in {@link load}, so a
|
|
62696
62696
|
* sweep over every hydrated device judges — and mutates — cameras it has no
|
|
62697
|
-
* frames for. Measured 2026-09-14: the duplicate collapse for device
|
|
62698
|
-
* logged by `MacMiniAgent.localdomain` and by `
|
|
62697
|
+
* frames for. Measured 2026-09-14: the duplicate collapse for device 102 was
|
|
62698
|
+
* logged by `MacMiniAgent.localdomain` and by `agent-a`, the same
|
|
62699
62699
|
* rows, seven seconds apart.
|
|
62700
62700
|
*
|
|
62701
62701
|
* Expiry is measured against the device's latest processed-frame timestamp
|
|
@@ -64551,7 +64551,7 @@ function buildOrphanScopes(collections = auditableCollections()) {
|
|
|
64551
64551
|
/**
|
|
64552
64552
|
* Deliberately unhurried. One hour of grace is ~24× the shortest measured
|
|
64553
64553
|
* retention window's resolution and far under the shortest window itself
|
|
64554
|
-
* (1 day on
|
|
64554
|
+
* (1 day on 104), so it can protect the write/index race without ever
|
|
64555
64555
|
* shadowing a real prune.
|
|
64556
64556
|
*/
|
|
64557
64557
|
var DEFAULT_ORPHAN_LIMITS = {
|
|
@@ -65832,7 +65832,7 @@ var RetentionSweepRunner = class {
|
|
|
65832
65832
|
* every entity the track owns goes with it.
|
|
65833
65833
|
*
|
|
65834
65834
|
* **One sweep does not mean one cutoff.** Retention is per device and that is
|
|
65835
|
-
* deliberate: measured 1 day on
|
|
65835
|
+
* deliberate: measured 1 day on 104 against 7 on 101/102. What is singular is
|
|
65836
65836
|
* the SELECTION — one entity kind, one clock, one cascade — not the number.
|
|
65837
65837
|
*
|
|
65838
65838
|
* `deviceIds` is passed in so the whole pass shares one device set and one
|
|
@@ -67074,7 +67074,7 @@ var FAMILY_PLATE_OCR = "plate-ocr";
|
|
|
67074
67074
|
* The "failure" here is NOT suppressed and must not be — a person standing over
|
|
67075
67075
|
* a car is a real person, and this repo will not trade that away for a cleaner
|
|
67076
67076
|
* count (D275 made the same choice for stationary suppression). It is counted so
|
|
67077
|
-
* the phantom rate is a number instead of an impression: 4 of 23 on camera
|
|
67077
|
+
* the phantom rate is a number instead of an impression: 4 of 23 on camera 102
|
|
67078
67078
|
* in two hours, measured by hand on 2026-08-28.
|
|
67079
67079
|
*/
|
|
67080
67080
|
var FAMILY_PERSON_BIRTH = "person-birth";
|
|
@@ -67350,7 +67350,7 @@ function isFullFrameBbox(bbox) {
|
|
|
67350
67350
|
var NATIVE_CROP_METRIC_INTERVAL_MS = 3e4;
|
|
67351
67351
|
/**
|
|
67352
67352
|
* Above this `maxWidth`, a full-frame fetch is a NATIVE full frame (~1–1.5 MB
|
|
67353
|
-
* on a 4K camera) rather than a boxed timeline tile or a pinned ≤
|
|
67353
|
+
* on a 4K camera) rather than a boxed timeline tile or a pinned ≤106 detection
|
|
67354
67354
|
* frame (tens of kB). The two belong in different counters or the window line
|
|
67355
67355
|
* says "full frames" and means two payload classes three orders of magnitude
|
|
67356
67356
|
* apart. (D470) No caller asks for that rung since D422 (the key frame) and
|
|
@@ -68372,7 +68372,7 @@ var CameraIndexUnknownDrops = class {
|
|
|
68372
68372
|
* Mapped sensor/control caps that a CAMERA must NOT contribute for ITSELF.
|
|
68373
68373
|
*
|
|
68374
68374
|
* A sensor cap bound on a camera makes the camera both the source and the
|
|
68375
|
-
* subject — a composed doorbell on camera
|
|
68375
|
+
* subject — a composed doorbell on camera 101 (D671), a native Reolink
|
|
68376
68376
|
* doorbell, a camera-side button. Those have no other route into the per-camera event
|
|
68377
68377
|
* substrate, so the camera includes itself.
|
|
68378
68378
|
*
|
|
@@ -68643,9 +68643,9 @@ var LinkedCamerasCache = class {
|
|
|
68643
68643
|
* every consumer of a device-event attributes it to the same cameras.
|
|
68644
68644
|
*
|
|
68645
68645
|
* It is shared on purpose. The self-camera half (a doorbell bound on camera
|
|
68646
|
-
*
|
|
68646
|
+
* 101 makes 101 both source and subject) was added to the history-row
|
|
68647
68647
|
* ingest on 2026-08-07 and NOT to the synthetic-track projection beside it,
|
|
68648
|
-
* which kept resolving `camerasFor` alone. The result: camera
|
|
68648
|
+
* which kept resolving `camerasFor` alone. The result: camera 101's real
|
|
68649
68649
|
* doorbell press on 2026-08-08 06:59Z produced a `SensorEvent` row and no
|
|
68650
68650
|
* timeline marker, for weeks, with the divergence invisible in both codepaths.
|
|
68651
68651
|
* Two derivations of "which cameras" is one too many.
|
|
@@ -68732,7 +68732,7 @@ function isSliceRecord(slice) {
|
|
|
68732
68732
|
* One `DeviceStateChanged` → N history rows, one per camera the event belongs
|
|
68733
68733
|
* to: the emitting device's LINKED cameras, plus the emitting device ITSELF
|
|
68734
68734
|
* when it is a camera carrying the sensor cap (a doorbell bound on camera
|
|
68735
|
-
*
|
|
68735
|
+
* 101 — see `SELF_CAMERA_EXCLUDED_CAPS` for the one cap that is not
|
|
68736
68736
|
* self-ingested). The EVENT_KIND_BY_CAP gate exits first so non-sensor cap
|
|
68737
68737
|
* churn costs one map lookup. Returns the number of rows inserted (0 when
|
|
68738
68738
|
* unmapped, or when no camera takes a row for the device — a non-camera
|
|
@@ -69947,9 +69947,9 @@ var EventMediaDispatcher = class {
|
|
|
69947
69947
|
* `camerasFor` alone — LINKED cameras only — while the history-row ingest
|
|
69948
69948
|
* beside it had gained the self-camera half on 2026-08-07. A doorbell can be
|
|
69949
69949
|
* served on the CAMERA itself (a composed doorbell, D671, writes the `doorbell`
|
|
69950
|
-
* slice onto camera
|
|
69951
|
-
* `camerasFor(
|
|
69952
|
-
* projection returned on a `debug` line nobody runs at. Camera
|
|
69950
|
+
* slice onto camera 101; Reolink registers it at camera level), so
|
|
69951
|
+
* `camerasFor(101)` answered `[]` and the
|
|
69952
|
+
* projection returned on a `debug` line nobody runs at. Camera 101's real
|
|
69953
69953
|
* press at 2026-08-08 06:59Z therefore produced a `SensorEvent` row, a HomeKit
|
|
69954
69954
|
* ring, an Alexa post and a matched notification rule — and no track. Both
|
|
69955
69955
|
* halves now derive their cameras from {@link resolveSensorEventCameras}.
|
|
@@ -69965,7 +69965,7 @@ var EventMediaDispatcher = class {
|
|
|
69965
69965
|
* **Nothing here is silent.** A marker that lands emits one `info` line; every
|
|
69966
69966
|
* branch that lands none emits one line carrying the reason. Both carry
|
|
69967
69967
|
* `tags: { deviceId }` with the CAMERA id, because the question always arrives
|
|
69968
|
-
* as "why did
|
|
69968
|
+
* as "why did 102 get a marker and 101 not".
|
|
69969
69969
|
*
|
|
69970
69970
|
* **The marker is also the notification's PICTURE.** A doorbell press has no
|
|
69971
69971
|
* detection behind it, so nothing else on the notification path owns a frame of
|
|
@@ -69983,7 +69983,7 @@ var EventMediaDispatcher = class {
|
|
|
69983
69983
|
/**
|
|
69984
69984
|
* The bound a sensor marker's snapshot gets: 2.5 s.
|
|
69985
69985
|
*
|
|
69986
|
-
* Measured rather than guessed — a `snapshot.getSnapshot` on camera
|
|
69986
|
+
* Measured rather than guessed — a `snapshot.getSnapshot` on camera 101 answers
|
|
69987
69987
|
* in ~0.6 s end-to-end from OUTSIDE the hub (the cap serves a ≤10 s cached
|
|
69988
69988
|
* frame; `force` is never set here). 2.5 s leaves four times the observed cost
|
|
69989
69989
|
* and still bounds what the doorbell notification waits for.
|
|
@@ -70402,1797 +70402,6 @@ Object.freeze({
|
|
|
70402
70402
|
"readClipBytes"
|
|
70403
70403
|
]
|
|
70404
70404
|
});
|
|
70405
|
-
/** cap name -> the numeric state field whose strict advance IS the cap's one-shot event. */
|
|
70406
|
-
var CAP_ADVANCE_FIELDS = Object.freeze({ "doorbell": "lastPressedAt" });
|
|
70407
|
-
Object.freeze({
|
|
70408
|
-
"air-quality-sensor": [
|
|
70409
|
-
{
|
|
70410
|
-
"path": "co2Ppm",
|
|
70411
|
-
"valueType": "number"
|
|
70412
|
-
},
|
|
70413
|
-
{
|
|
70414
|
-
"path": "vocPpb",
|
|
70415
|
-
"valueType": "number"
|
|
70416
|
-
},
|
|
70417
|
-
{
|
|
70418
|
-
"path": "pm25",
|
|
70419
|
-
"valueType": "number"
|
|
70420
|
-
},
|
|
70421
|
-
{
|
|
70422
|
-
"path": "pm10",
|
|
70423
|
-
"valueType": "number"
|
|
70424
|
-
},
|
|
70425
|
-
{
|
|
70426
|
-
"path": "aqi",
|
|
70427
|
-
"valueType": "number"
|
|
70428
|
-
},
|
|
70429
|
-
{
|
|
70430
|
-
"path": "unit",
|
|
70431
|
-
"valueType": "string"
|
|
70432
|
-
},
|
|
70433
|
-
{
|
|
70434
|
-
"path": "precision",
|
|
70435
|
-
"valueType": "number"
|
|
70436
|
-
}
|
|
70437
|
-
],
|
|
70438
|
-
"alarm-panel": [
|
|
70439
|
-
{
|
|
70440
|
-
"path": "state",
|
|
70441
|
-
"valueType": "enum",
|
|
70442
|
-
"enumValues": [
|
|
70443
|
-
"disarmed",
|
|
70444
|
-
"armed_home",
|
|
70445
|
-
"armed_away",
|
|
70446
|
-
"armed_night",
|
|
70447
|
-
"armed_vacation",
|
|
70448
|
-
"armed_custom_bypass",
|
|
70449
|
-
"arming",
|
|
70450
|
-
"disarming",
|
|
70451
|
-
"pending",
|
|
70452
|
-
"triggered"
|
|
70453
|
-
]
|
|
70454
|
-
},
|
|
70455
|
-
{
|
|
70456
|
-
"path": "targetMode",
|
|
70457
|
-
"valueType": "enum",
|
|
70458
|
-
"enumValues": [
|
|
70459
|
-
"home",
|
|
70460
|
-
"away",
|
|
70461
|
-
"night",
|
|
70462
|
-
"vacation",
|
|
70463
|
-
"custom_bypass"
|
|
70464
|
-
]
|
|
70465
|
-
},
|
|
70466
|
-
{
|
|
70467
|
-
"path": "requiresCode",
|
|
70468
|
-
"valueType": "boolean"
|
|
70469
|
-
}
|
|
70470
|
-
],
|
|
70471
|
-
"ambient-light-sensor": [
|
|
70472
|
-
{
|
|
70473
|
-
"path": "lux",
|
|
70474
|
-
"valueType": "number"
|
|
70475
|
-
},
|
|
70476
|
-
{
|
|
70477
|
-
"path": "unit",
|
|
70478
|
-
"valueType": "string"
|
|
70479
|
-
},
|
|
70480
|
-
{
|
|
70481
|
-
"path": "precision",
|
|
70482
|
-
"valueType": "number"
|
|
70483
|
-
}
|
|
70484
|
-
],
|
|
70485
|
-
"audio-metrics": [
|
|
70486
|
-
{
|
|
70487
|
-
"path": "ts",
|
|
70488
|
-
"valueType": "number"
|
|
70489
|
-
},
|
|
70490
|
-
{
|
|
70491
|
-
"path": "windowSec",
|
|
70492
|
-
"valueType": "number"
|
|
70493
|
-
},
|
|
70494
|
-
{
|
|
70495
|
-
"path": "level.rms",
|
|
70496
|
-
"valueType": "number"
|
|
70497
|
-
},
|
|
70498
|
-
{
|
|
70499
|
-
"path": "level.dbfs",
|
|
70500
|
-
"valueType": "number"
|
|
70501
|
-
},
|
|
70502
|
-
{
|
|
70503
|
-
"path": "peakDbfs",
|
|
70504
|
-
"valueType": "number"
|
|
70505
|
-
},
|
|
70506
|
-
{
|
|
70507
|
-
"path": "avgDbfs",
|
|
70508
|
-
"valueType": "number"
|
|
70509
|
-
},
|
|
70510
|
-
{
|
|
70511
|
-
"path": "current.className",
|
|
70512
|
-
"valueType": "string"
|
|
70513
|
-
},
|
|
70514
|
-
{
|
|
70515
|
-
"path": "current.score",
|
|
70516
|
-
"valueType": "number"
|
|
70517
|
-
},
|
|
70518
|
-
{
|
|
70519
|
-
"path": "current.timestamp",
|
|
70520
|
-
"valueType": "number"
|
|
70521
|
-
}
|
|
70522
|
-
],
|
|
70523
|
-
"automation-control": [
|
|
70524
|
-
{
|
|
70525
|
-
"path": "enabled",
|
|
70526
|
-
"valueType": "boolean"
|
|
70527
|
-
},
|
|
70528
|
-
{
|
|
70529
|
-
"path": "isRunning",
|
|
70530
|
-
"valueType": "boolean"
|
|
70531
|
-
},
|
|
70532
|
-
{
|
|
70533
|
-
"path": "lastTriggeredAt",
|
|
70534
|
-
"valueType": "number"
|
|
70535
|
-
},
|
|
70536
|
-
{
|
|
70537
|
-
"path": "lastError",
|
|
70538
|
-
"valueType": "string"
|
|
70539
|
-
}
|
|
70540
|
-
],
|
|
70541
|
-
"battery": [
|
|
70542
|
-
{
|
|
70543
|
-
"path": "percentage",
|
|
70544
|
-
"valueType": "number"
|
|
70545
|
-
},
|
|
70546
|
-
{
|
|
70547
|
-
"path": "charging",
|
|
70548
|
-
"valueType": "enum",
|
|
70549
|
-
"enumValues": [
|
|
70550
|
-
"dc",
|
|
70551
|
-
"solar",
|
|
70552
|
-
"none",
|
|
70553
|
-
"unknown"
|
|
70554
|
-
]
|
|
70555
|
-
},
|
|
70556
|
-
{
|
|
70557
|
-
"path": "sleeping",
|
|
70558
|
-
"valueType": "boolean"
|
|
70559
|
-
},
|
|
70560
|
-
{
|
|
70561
|
-
"path": "lastUpdated",
|
|
70562
|
-
"valueType": "number"
|
|
70563
|
-
},
|
|
70564
|
-
{
|
|
70565
|
-
"path": "lastContactAt",
|
|
70566
|
-
"valueType": "number"
|
|
70567
|
-
},
|
|
70568
|
-
{
|
|
70569
|
-
"path": "lastFullRefreshAt",
|
|
70570
|
-
"valueType": "number"
|
|
70571
|
-
},
|
|
70572
|
-
{
|
|
70573
|
-
"path": "binary",
|
|
70574
|
-
"valueType": "boolean"
|
|
70575
|
-
}
|
|
70576
|
-
],
|
|
70577
|
-
"binary": [{
|
|
70578
|
-
"path": "on",
|
|
70579
|
-
"valueType": "boolean"
|
|
70580
|
-
}],
|
|
70581
|
-
"brightness": [{
|
|
70582
|
-
"path": "percentage",
|
|
70583
|
-
"valueType": "number"
|
|
70584
|
-
}],
|
|
70585
|
-
"broker": [{
|
|
70586
|
-
"path": "brokerCount",
|
|
70587
|
-
"valueType": "number"
|
|
70588
|
-
}, {
|
|
70589
|
-
"path": "connectedCount",
|
|
70590
|
-
"valueType": "number"
|
|
70591
|
-
}],
|
|
70592
|
-
"camera-credentials": [
|
|
70593
|
-
{
|
|
70594
|
-
"path": "host",
|
|
70595
|
-
"valueType": "string"
|
|
70596
|
-
},
|
|
70597
|
-
{
|
|
70598
|
-
"path": "port",
|
|
70599
|
-
"valueType": "number"
|
|
70600
|
-
},
|
|
70601
|
-
{
|
|
70602
|
-
"path": "onvifPort",
|
|
70603
|
-
"valueType": "number"
|
|
70604
|
-
},
|
|
70605
|
-
{
|
|
70606
|
-
"path": "rtspPort",
|
|
70607
|
-
"valueType": "number"
|
|
70608
|
-
},
|
|
70609
|
-
{
|
|
70610
|
-
"path": "https",
|
|
70611
|
-
"valueType": "boolean"
|
|
70612
|
-
},
|
|
70613
|
-
{
|
|
70614
|
-
"path": "hasUsername",
|
|
70615
|
-
"valueType": "boolean"
|
|
70616
|
-
},
|
|
70617
|
-
{
|
|
70618
|
-
"path": "hasPassword",
|
|
70619
|
-
"valueType": "boolean"
|
|
70620
|
-
},
|
|
70621
|
-
{
|
|
70622
|
-
"path": "onvifProfile",
|
|
70623
|
-
"valueType": "string"
|
|
70624
|
-
}
|
|
70625
|
-
],
|
|
70626
|
-
"camera-streams": [
|
|
70627
|
-
{
|
|
70628
|
-
"path": "online",
|
|
70629
|
-
"valueType": "boolean"
|
|
70630
|
-
},
|
|
70631
|
-
{
|
|
70632
|
-
"path": "slotStatuses.high",
|
|
70633
|
-
"valueType": "enum",
|
|
70634
|
-
"enumValues": [
|
|
70635
|
-
"unassigned",
|
|
70636
|
-
"idle",
|
|
70637
|
-
"connecting",
|
|
70638
|
-
"streaming",
|
|
70639
|
-
"error"
|
|
70640
|
-
]
|
|
70641
|
-
},
|
|
70642
|
-
{
|
|
70643
|
-
"path": "slotStatuses.mid",
|
|
70644
|
-
"valueType": "enum",
|
|
70645
|
-
"enumValues": [
|
|
70646
|
-
"unassigned",
|
|
70647
|
-
"idle",
|
|
70648
|
-
"connecting",
|
|
70649
|
-
"streaming",
|
|
70650
|
-
"error"
|
|
70651
|
-
]
|
|
70652
|
-
},
|
|
70653
|
-
{
|
|
70654
|
-
"path": "slotStatuses.low",
|
|
70655
|
-
"valueType": "enum",
|
|
70656
|
-
"enumValues": [
|
|
70657
|
-
"unassigned",
|
|
70658
|
-
"idle",
|
|
70659
|
-
"connecting",
|
|
70660
|
-
"streaming",
|
|
70661
|
-
"error"
|
|
70662
|
-
]
|
|
70663
|
-
},
|
|
70664
|
-
{
|
|
70665
|
-
"path": "slotErrors.high",
|
|
70666
|
-
"valueType": "string"
|
|
70667
|
-
},
|
|
70668
|
-
{
|
|
70669
|
-
"path": "slotErrors.mid",
|
|
70670
|
-
"valueType": "string"
|
|
70671
|
-
},
|
|
70672
|
-
{
|
|
70673
|
-
"path": "slotErrors.low",
|
|
70674
|
-
"valueType": "string"
|
|
70675
|
-
}
|
|
70676
|
-
],
|
|
70677
|
-
"carbon-monoxide": [{
|
|
70678
|
-
"path": "detected",
|
|
70679
|
-
"valueType": "boolean"
|
|
70680
|
-
}],
|
|
70681
|
-
"climate-control": [
|
|
70682
|
-
{
|
|
70683
|
-
"path": "mode",
|
|
70684
|
-
"valueType": "enum",
|
|
70685
|
-
"enumValues": [
|
|
70686
|
-
"off",
|
|
70687
|
-
"heat",
|
|
70688
|
-
"cool",
|
|
70689
|
-
"auto",
|
|
70690
|
-
"heat_cool",
|
|
70691
|
-
"fan_only",
|
|
70692
|
-
"dry"
|
|
70693
|
-
]
|
|
70694
|
-
},
|
|
70695
|
-
{
|
|
70696
|
-
"path": "fanMode",
|
|
70697
|
-
"valueType": "string"
|
|
70698
|
-
},
|
|
70699
|
-
{
|
|
70700
|
-
"path": "preset",
|
|
70701
|
-
"valueType": "string"
|
|
70702
|
-
},
|
|
70703
|
-
{
|
|
70704
|
-
"path": "target",
|
|
70705
|
-
"valueType": "number"
|
|
70706
|
-
},
|
|
70707
|
-
{
|
|
70708
|
-
"path": "targetHigh",
|
|
70709
|
-
"valueType": "number"
|
|
70710
|
-
},
|
|
70711
|
-
{
|
|
70712
|
-
"path": "targetLow",
|
|
70713
|
-
"valueType": "number"
|
|
70714
|
-
},
|
|
70715
|
-
{
|
|
70716
|
-
"path": "targetHumidity",
|
|
70717
|
-
"valueType": "number"
|
|
70718
|
-
},
|
|
70719
|
-
{
|
|
70720
|
-
"path": "currentTemp",
|
|
70721
|
-
"valueType": "number"
|
|
70722
|
-
},
|
|
70723
|
-
{
|
|
70724
|
-
"path": "currentHumidity",
|
|
70725
|
-
"valueType": "number"
|
|
70726
|
-
},
|
|
70727
|
-
{
|
|
70728
|
-
"path": "swingVertical",
|
|
70729
|
-
"valueType": "boolean"
|
|
70730
|
-
},
|
|
70731
|
-
{
|
|
70732
|
-
"path": "swingHorizontal",
|
|
70733
|
-
"valueType": "boolean"
|
|
70734
|
-
},
|
|
70735
|
-
{
|
|
70736
|
-
"path": "minTemp",
|
|
70737
|
-
"valueType": "number"
|
|
70738
|
-
},
|
|
70739
|
-
{
|
|
70740
|
-
"path": "maxTemp",
|
|
70741
|
-
"valueType": "number"
|
|
70742
|
-
},
|
|
70743
|
-
{
|
|
70744
|
-
"path": "tempStep",
|
|
70745
|
-
"valueType": "number"
|
|
70746
|
-
}
|
|
70747
|
-
],
|
|
70748
|
-
"color": [
|
|
70749
|
-
{
|
|
70750
|
-
"path": "mode",
|
|
70751
|
-
"valueType": "enum",
|
|
70752
|
-
"enumValues": [
|
|
70753
|
-
"rgb",
|
|
70754
|
-
"hsv",
|
|
70755
|
-
"mired"
|
|
70756
|
-
]
|
|
70757
|
-
},
|
|
70758
|
-
{
|
|
70759
|
-
"path": "rgb.r",
|
|
70760
|
-
"valueType": "number"
|
|
70761
|
-
},
|
|
70762
|
-
{
|
|
70763
|
-
"path": "rgb.g",
|
|
70764
|
-
"valueType": "number"
|
|
70765
|
-
},
|
|
70766
|
-
{
|
|
70767
|
-
"path": "rgb.b",
|
|
70768
|
-
"valueType": "number"
|
|
70769
|
-
},
|
|
70770
|
-
{
|
|
70771
|
-
"path": "hsv.h",
|
|
70772
|
-
"valueType": "number"
|
|
70773
|
-
},
|
|
70774
|
-
{
|
|
70775
|
-
"path": "hsv.s",
|
|
70776
|
-
"valueType": "number"
|
|
70777
|
-
},
|
|
70778
|
-
{
|
|
70779
|
-
"path": "hsv.v",
|
|
70780
|
-
"valueType": "number"
|
|
70781
|
-
},
|
|
70782
|
-
{
|
|
70783
|
-
"path": "mireds",
|
|
70784
|
-
"valueType": "number"
|
|
70785
|
-
}
|
|
70786
|
-
],
|
|
70787
|
-
"connectivity": [{
|
|
70788
|
-
"path": "connected",
|
|
70789
|
-
"valueType": "boolean"
|
|
70790
|
-
}],
|
|
70791
|
-
"contact": [{
|
|
70792
|
-
"path": "entryOpen",
|
|
70793
|
-
"valueType": "boolean"
|
|
70794
|
-
}],
|
|
70795
|
-
"control": [
|
|
70796
|
-
{
|
|
70797
|
-
"path": "kind",
|
|
70798
|
-
"valueType": "enum",
|
|
70799
|
-
"enumValues": [
|
|
70800
|
-
"numeric",
|
|
70801
|
-
"select",
|
|
70802
|
-
"text",
|
|
70803
|
-
"datetime"
|
|
70804
|
-
]
|
|
70805
|
-
},
|
|
70806
|
-
{
|
|
70807
|
-
"path": "unit",
|
|
70808
|
-
"valueType": "string"
|
|
70809
|
-
},
|
|
70810
|
-
{
|
|
70811
|
-
"path": "min",
|
|
70812
|
-
"valueType": "number"
|
|
70813
|
-
},
|
|
70814
|
-
{
|
|
70815
|
-
"path": "max",
|
|
70816
|
-
"valueType": "number"
|
|
70817
|
-
},
|
|
70818
|
-
{
|
|
70819
|
-
"path": "step",
|
|
70820
|
-
"valueType": "number"
|
|
70821
|
-
},
|
|
70822
|
-
{
|
|
70823
|
-
"path": "precision",
|
|
70824
|
-
"valueType": "number"
|
|
70825
|
-
},
|
|
70826
|
-
{
|
|
70827
|
-
"path": "format",
|
|
70828
|
-
"valueType": "enum",
|
|
70829
|
-
"enumValues": [
|
|
70830
|
-
"date",
|
|
70831
|
-
"time",
|
|
70832
|
-
"datetime"
|
|
70833
|
-
]
|
|
70834
|
-
}
|
|
70835
|
-
],
|
|
70836
|
-
"cover": [
|
|
70837
|
-
{
|
|
70838
|
-
"path": "state",
|
|
70839
|
-
"valueType": "enum",
|
|
70840
|
-
"enumValues": [
|
|
70841
|
-
"open",
|
|
70842
|
-
"opening",
|
|
70843
|
-
"closing",
|
|
70844
|
-
"closed",
|
|
70845
|
-
"stopped"
|
|
70846
|
-
]
|
|
70847
|
-
},
|
|
70848
|
-
{
|
|
70849
|
-
"path": "position",
|
|
70850
|
-
"valueType": "number"
|
|
70851
|
-
},
|
|
70852
|
-
{
|
|
70853
|
-
"path": "tiltPosition",
|
|
70854
|
-
"valueType": "number"
|
|
70855
|
-
}
|
|
70856
|
-
],
|
|
70857
|
-
"day-night": [
|
|
70858
|
-
{
|
|
70859
|
-
"path": "mode",
|
|
70860
|
-
"valueType": "enum",
|
|
70861
|
-
"enumValues": [
|
|
70862
|
-
"auto",
|
|
70863
|
-
"day",
|
|
70864
|
-
"night",
|
|
70865
|
-
"schedule"
|
|
70866
|
-
]
|
|
70867
|
-
},
|
|
70868
|
-
{
|
|
70869
|
-
"path": "sensitivity",
|
|
70870
|
-
"valueType": "number"
|
|
70871
|
-
},
|
|
70872
|
-
{
|
|
70873
|
-
"path": "switchDelaySec",
|
|
70874
|
-
"valueType": "number"
|
|
70875
|
-
}
|
|
70876
|
-
],
|
|
70877
|
-
"device-adoption": [
|
|
70878
|
-
{
|
|
70879
|
-
"path": "lastDiscoveryAt",
|
|
70880
|
-
"valueType": "number"
|
|
70881
|
-
},
|
|
70882
|
-
{
|
|
70883
|
-
"path": "candidateCount",
|
|
70884
|
-
"valueType": "number"
|
|
70885
|
-
},
|
|
70886
|
-
{
|
|
70887
|
-
"path": "adoptedCount",
|
|
70888
|
-
"valueType": "number"
|
|
70889
|
-
},
|
|
70890
|
-
{
|
|
70891
|
-
"path": "lastError",
|
|
70892
|
-
"valueType": "string"
|
|
70893
|
-
}
|
|
70894
|
-
],
|
|
70895
|
-
"device-discovery": [{
|
|
70896
|
-
"path": "lastDiscoveryAt",
|
|
70897
|
-
"valueType": "number"
|
|
70898
|
-
}, {
|
|
70899
|
-
"path": "lastError",
|
|
70900
|
-
"valueType": "string"
|
|
70901
|
-
}],
|
|
70902
|
-
"device-export": [
|
|
70903
|
-
{
|
|
70904
|
-
"path": "linkState",
|
|
70905
|
-
"valueType": "enum",
|
|
70906
|
-
"enumValues": [
|
|
70907
|
-
"unlinked",
|
|
70908
|
-
"linked",
|
|
70909
|
-
"error"
|
|
70910
|
-
]
|
|
70911
|
-
},
|
|
70912
|
-
{
|
|
70913
|
-
"path": "exposedDeviceCount",
|
|
70914
|
-
"valueType": "number"
|
|
70915
|
-
},
|
|
70916
|
-
{
|
|
70917
|
-
"path": "error",
|
|
70918
|
-
"valueType": "string"
|
|
70919
|
-
},
|
|
70920
|
-
{
|
|
70921
|
-
"path": "setup.qr",
|
|
70922
|
-
"valueType": "string"
|
|
70923
|
-
},
|
|
70924
|
-
{
|
|
70925
|
-
"path": "setup.note",
|
|
70926
|
-
"valueType": "string"
|
|
70927
|
-
}
|
|
70928
|
-
],
|
|
70929
|
-
"device-status": [{
|
|
70930
|
-
"path": "online",
|
|
70931
|
-
"valueType": "boolean"
|
|
70932
|
-
}],
|
|
70933
|
-
"dishwasher": [
|
|
70934
|
-
{
|
|
70935
|
-
"path": "availability",
|
|
70936
|
-
"valueType": "enum",
|
|
70937
|
-
"enumValues": [
|
|
70938
|
-
"available",
|
|
70939
|
-
"offline",
|
|
70940
|
-
"description-missing"
|
|
70941
|
-
]
|
|
70942
|
-
},
|
|
70943
|
-
{
|
|
70944
|
-
"path": "state",
|
|
70945
|
-
"valueType": "enum",
|
|
70946
|
-
"enumValues": [
|
|
70947
|
-
"idle",
|
|
70948
|
-
"running",
|
|
70949
|
-
"paused",
|
|
70950
|
-
"finished",
|
|
70951
|
-
"error",
|
|
70952
|
-
"unavailable"
|
|
70953
|
-
]
|
|
70954
|
-
},
|
|
70955
|
-
{
|
|
70956
|
-
"path": "operationState",
|
|
70957
|
-
"valueType": "enum",
|
|
70958
|
-
"enumValues": [
|
|
70959
|
-
"Inactive",
|
|
70960
|
-
"Ready",
|
|
70961
|
-
"DelayedStart",
|
|
70962
|
-
"Run",
|
|
70963
|
-
"Pause",
|
|
70964
|
-
"ActionRequired",
|
|
70965
|
-
"Finished",
|
|
70966
|
-
"Error",
|
|
70967
|
-
"Aborting"
|
|
70968
|
-
]
|
|
70969
|
-
},
|
|
70970
|
-
{
|
|
70971
|
-
"path": "program",
|
|
70972
|
-
"valueType": "string"
|
|
70973
|
-
},
|
|
70974
|
-
{
|
|
70975
|
-
"path": "selectedProgram",
|
|
70976
|
-
"valueType": "string"
|
|
70977
|
-
},
|
|
70978
|
-
{
|
|
70979
|
-
"path": "remainingSeconds",
|
|
70980
|
-
"valueType": "number"
|
|
70981
|
-
},
|
|
70982
|
-
{
|
|
70983
|
-
"path": "delayedStartSeconds",
|
|
70984
|
-
"valueType": "number"
|
|
70985
|
-
},
|
|
70986
|
-
{
|
|
70987
|
-
"path": "progressPercent",
|
|
70988
|
-
"valueType": "number"
|
|
70989
|
-
},
|
|
70990
|
-
{
|
|
70991
|
-
"path": "doorOpen",
|
|
70992
|
-
"valueType": "boolean"
|
|
70993
|
-
},
|
|
70994
|
-
{
|
|
70995
|
-
"path": "doorLocked",
|
|
70996
|
-
"valueType": "boolean"
|
|
70997
|
-
},
|
|
70998
|
-
{
|
|
70999
|
-
"path": "remoteStartAllowed",
|
|
71000
|
-
"valueType": "boolean"
|
|
71001
|
-
},
|
|
71002
|
-
{
|
|
71003
|
-
"path": "remoteControlActive",
|
|
71004
|
-
"valueType": "boolean"
|
|
71005
|
-
},
|
|
71006
|
-
{
|
|
71007
|
-
"path": "localControlActive",
|
|
71008
|
-
"valueType": "boolean"
|
|
71009
|
-
},
|
|
71010
|
-
{
|
|
71011
|
-
"path": "powerOn",
|
|
71012
|
-
"valueType": "boolean"
|
|
71013
|
-
},
|
|
71014
|
-
{
|
|
71015
|
-
"path": "powerState",
|
|
71016
|
-
"valueType": "string"
|
|
71017
|
-
},
|
|
71018
|
-
{
|
|
71019
|
-
"path": "filterCleaningDue",
|
|
71020
|
-
"valueType": "boolean"
|
|
71021
|
-
},
|
|
71022
|
-
{
|
|
71023
|
-
"path": "machineCareDue",
|
|
71024
|
-
"valueType": "boolean"
|
|
71025
|
-
},
|
|
71026
|
-
{
|
|
71027
|
-
"path": "machineCareRemainingRuns",
|
|
71028
|
-
"valueType": "number"
|
|
71029
|
-
},
|
|
71030
|
-
{
|
|
71031
|
-
"path": "halfLoad",
|
|
71032
|
-
"valueType": "boolean"
|
|
71033
|
-
},
|
|
71034
|
-
{
|
|
71035
|
-
"path": "hygienePlus",
|
|
71036
|
-
"valueType": "boolean"
|
|
71037
|
-
},
|
|
71038
|
-
{
|
|
71039
|
-
"path": "extraDry",
|
|
71040
|
-
"valueType": "boolean"
|
|
71041
|
-
},
|
|
71042
|
-
{
|
|
71043
|
-
"path": "intensiveZone",
|
|
71044
|
-
"valueType": "boolean"
|
|
71045
|
-
},
|
|
71046
|
-
{
|
|
71047
|
-
"path": "varioSpeedPlus",
|
|
71048
|
-
"valueType": "boolean"
|
|
71049
|
-
},
|
|
71050
|
-
{
|
|
71051
|
-
"path": "childLock",
|
|
71052
|
-
"valueType": "boolean"
|
|
71053
|
-
},
|
|
71054
|
-
{
|
|
71055
|
-
"path": "errorCode",
|
|
71056
|
-
"valueType": "number"
|
|
71057
|
-
},
|
|
71058
|
-
{
|
|
71059
|
-
"path": "errorLabel",
|
|
71060
|
-
"valueType": "string"
|
|
71061
|
-
}
|
|
71062
|
-
],
|
|
71063
|
-
"doorbell": [{
|
|
71064
|
-
"path": "lastPressedAt",
|
|
71065
|
-
"valueType": "number"
|
|
71066
|
-
}, {
|
|
71067
|
-
"path": "pressCountSinceStart",
|
|
71068
|
-
"valueType": "number"
|
|
71069
|
-
}],
|
|
71070
|
-
"enum-sensor": [{
|
|
71071
|
-
"path": "value",
|
|
71072
|
-
"valueType": "string"
|
|
71073
|
-
}, {
|
|
71074
|
-
"path": "format",
|
|
71075
|
-
"valueType": "enum",
|
|
71076
|
-
"enumValues": [
|
|
71077
|
-
"date",
|
|
71078
|
-
"time",
|
|
71079
|
-
"datetime"
|
|
71080
|
-
]
|
|
71081
|
-
}],
|
|
71082
|
-
"event-emitter": [
|
|
71083
|
-
{
|
|
71084
|
-
"path": "lastEvent.deviceId",
|
|
71085
|
-
"valueType": "number"
|
|
71086
|
-
},
|
|
71087
|
-
{
|
|
71088
|
-
"path": "lastEvent.eventType",
|
|
71089
|
-
"valueType": "string"
|
|
71090
|
-
},
|
|
71091
|
-
{
|
|
71092
|
-
"path": "lastEvent.timestamp",
|
|
71093
|
-
"valueType": "number"
|
|
71094
|
-
},
|
|
71095
|
-
{
|
|
71096
|
-
"path": "lastEvent.seq",
|
|
71097
|
-
"valueType": "number"
|
|
71098
|
-
},
|
|
71099
|
-
{
|
|
71100
|
-
"path": "eventCountSinceStart",
|
|
71101
|
-
"valueType": "number"
|
|
71102
|
-
}
|
|
71103
|
-
],
|
|
71104
|
-
"fan-control": [
|
|
71105
|
-
{
|
|
71106
|
-
"path": "percentage",
|
|
71107
|
-
"valueType": "number"
|
|
71108
|
-
},
|
|
71109
|
-
{
|
|
71110
|
-
"path": "percentageStep",
|
|
71111
|
-
"valueType": "number"
|
|
71112
|
-
},
|
|
71113
|
-
{
|
|
71114
|
-
"path": "preset",
|
|
71115
|
-
"valueType": "string"
|
|
71116
|
-
},
|
|
71117
|
-
{
|
|
71118
|
-
"path": "direction",
|
|
71119
|
-
"valueType": "enum",
|
|
71120
|
-
"enumValues": ["forward", "reverse"]
|
|
71121
|
-
},
|
|
71122
|
-
{
|
|
71123
|
-
"path": "oscillating",
|
|
71124
|
-
"valueType": "boolean"
|
|
71125
|
-
}
|
|
71126
|
-
],
|
|
71127
|
-
"feature-probe": [
|
|
71128
|
-
{
|
|
71129
|
-
"path": "deviceType",
|
|
71130
|
-
"valueType": "string"
|
|
71131
|
-
},
|
|
71132
|
-
{
|
|
71133
|
-
"path": "model",
|
|
71134
|
-
"valueType": "string"
|
|
71135
|
-
},
|
|
71136
|
-
{
|
|
71137
|
-
"path": "channelCount",
|
|
71138
|
-
"valueType": "number"
|
|
71139
|
-
},
|
|
71140
|
-
{
|
|
71141
|
-
"path": "lastProbedAt",
|
|
71142
|
-
"valueType": "number"
|
|
71143
|
-
}
|
|
71144
|
-
],
|
|
71145
|
-
"flood": [{
|
|
71146
|
-
"path": "flooded",
|
|
71147
|
-
"valueType": "boolean"
|
|
71148
|
-
}],
|
|
71149
|
-
"gas": [{
|
|
71150
|
-
"path": "detected",
|
|
71151
|
-
"valueType": "boolean"
|
|
71152
|
-
}],
|
|
71153
|
-
"heating-valve": [{
|
|
71154
|
-
"path": "position",
|
|
71155
|
-
"valueType": "number"
|
|
71156
|
-
}],
|
|
71157
|
-
"humidifier": [
|
|
71158
|
-
{
|
|
71159
|
-
"path": "on",
|
|
71160
|
-
"valueType": "boolean"
|
|
71161
|
-
},
|
|
71162
|
-
{
|
|
71163
|
-
"path": "currentHumidity",
|
|
71164
|
-
"valueType": "number"
|
|
71165
|
-
},
|
|
71166
|
-
{
|
|
71167
|
-
"path": "targetHumidity",
|
|
71168
|
-
"valueType": "number"
|
|
71169
|
-
},
|
|
71170
|
-
{
|
|
71171
|
-
"path": "mode",
|
|
71172
|
-
"valueType": "string"
|
|
71173
|
-
},
|
|
71174
|
-
{
|
|
71175
|
-
"path": "action",
|
|
71176
|
-
"valueType": "string"
|
|
71177
|
-
},
|
|
71178
|
-
{
|
|
71179
|
-
"path": "minHumidity",
|
|
71180
|
-
"valueType": "number"
|
|
71181
|
-
},
|
|
71182
|
-
{
|
|
71183
|
-
"path": "maxHumidity",
|
|
71184
|
-
"valueType": "number"
|
|
71185
|
-
}
|
|
71186
|
-
],
|
|
71187
|
-
"humidity-sensor": [
|
|
71188
|
-
{
|
|
71189
|
-
"path": "percent",
|
|
71190
|
-
"valueType": "number"
|
|
71191
|
-
},
|
|
71192
|
-
{
|
|
71193
|
-
"path": "unit",
|
|
71194
|
-
"valueType": "string"
|
|
71195
|
-
},
|
|
71196
|
-
{
|
|
71197
|
-
"path": "precision",
|
|
71198
|
-
"valueType": "number"
|
|
71199
|
-
}
|
|
71200
|
-
],
|
|
71201
|
-
"image": [{
|
|
71202
|
-
"path": "url",
|
|
71203
|
-
"valueType": "string"
|
|
71204
|
-
}, {
|
|
71205
|
-
"path": "lastUpdated",
|
|
71206
|
-
"valueType": "number"
|
|
71207
|
-
}],
|
|
71208
|
-
"image-settings": [
|
|
71209
|
-
{
|
|
71210
|
-
"path": "brightness",
|
|
71211
|
-
"valueType": "number"
|
|
71212
|
-
},
|
|
71213
|
-
{
|
|
71214
|
-
"path": "contrast",
|
|
71215
|
-
"valueType": "number"
|
|
71216
|
-
},
|
|
71217
|
-
{
|
|
71218
|
-
"path": "saturation",
|
|
71219
|
-
"valueType": "number"
|
|
71220
|
-
},
|
|
71221
|
-
{
|
|
71222
|
-
"path": "sharpness",
|
|
71223
|
-
"valueType": "number"
|
|
71224
|
-
},
|
|
71225
|
-
{
|
|
71226
|
-
"path": "mirror",
|
|
71227
|
-
"valueType": "boolean"
|
|
71228
|
-
},
|
|
71229
|
-
{
|
|
71230
|
-
"path": "flip",
|
|
71231
|
-
"valueType": "boolean"
|
|
71232
|
-
},
|
|
71233
|
-
{
|
|
71234
|
-
"path": "rotate",
|
|
71235
|
-
"valueType": "enum",
|
|
71236
|
-
"enumValues": [
|
|
71237
|
-
"0",
|
|
71238
|
-
"90",
|
|
71239
|
-
"180",
|
|
71240
|
-
"270"
|
|
71241
|
-
]
|
|
71242
|
-
},
|
|
71243
|
-
{
|
|
71244
|
-
"path": "whiteBalance",
|
|
71245
|
-
"valueType": "enum",
|
|
71246
|
-
"enumValues": ["auto", "manual"]
|
|
71247
|
-
},
|
|
71248
|
-
{
|
|
71249
|
-
"path": "warmth",
|
|
71250
|
-
"valueType": "number"
|
|
71251
|
-
},
|
|
71252
|
-
{
|
|
71253
|
-
"path": "exposureMode",
|
|
71254
|
-
"valueType": "enum",
|
|
71255
|
-
"enumValues": ["auto", "manual"]
|
|
71256
|
-
},
|
|
71257
|
-
{
|
|
71258
|
-
"path": "backlightMode",
|
|
71259
|
-
"valueType": "enum",
|
|
71260
|
-
"enumValues": [
|
|
71261
|
-
"off",
|
|
71262
|
-
"blc",
|
|
71263
|
-
"wdr",
|
|
71264
|
-
"hlc"
|
|
71265
|
-
]
|
|
71266
|
-
}
|
|
71267
|
-
],
|
|
71268
|
-
"intercom": [
|
|
71269
|
-
{
|
|
71270
|
-
"path": "talking",
|
|
71271
|
-
"valueType": "boolean"
|
|
71272
|
-
},
|
|
71273
|
-
{
|
|
71274
|
-
"path": "lastSessionAt",
|
|
71275
|
-
"valueType": "number"
|
|
71276
|
-
},
|
|
71277
|
-
{
|
|
71278
|
-
"path": "ability.sampleRate",
|
|
71279
|
-
"valueType": "number"
|
|
71280
|
-
},
|
|
71281
|
-
{
|
|
71282
|
-
"path": "ability.duplex",
|
|
71283
|
-
"valueType": "enum",
|
|
71284
|
-
"enumValues": ["half", "full"]
|
|
71285
|
-
},
|
|
71286
|
-
{
|
|
71287
|
-
"path": "ability.maxBacklogMs",
|
|
71288
|
-
"valueType": "number"
|
|
71289
|
-
}
|
|
71290
|
-
],
|
|
71291
|
-
"lawn-mower-control": [
|
|
71292
|
-
{
|
|
71293
|
-
"path": "activity",
|
|
71294
|
-
"valueType": "enum",
|
|
71295
|
-
"enumValues": [
|
|
71296
|
-
"idle",
|
|
71297
|
-
"mowing",
|
|
71298
|
-
"paused",
|
|
71299
|
-
"docked",
|
|
71300
|
-
"error"
|
|
71301
|
-
]
|
|
71302
|
-
},
|
|
71303
|
-
{
|
|
71304
|
-
"path": "batteryLevel",
|
|
71305
|
-
"valueType": "number"
|
|
71306
|
-
},
|
|
71307
|
-
{
|
|
71308
|
-
"path": "progressPercent",
|
|
71309
|
-
"valueType": "number"
|
|
71310
|
-
},
|
|
71311
|
-
{
|
|
71312
|
-
"path": "currentCode",
|
|
71313
|
-
"valueType": "number"
|
|
71314
|
-
},
|
|
71315
|
-
{
|
|
71316
|
-
"path": "currentCodeLabel",
|
|
71317
|
-
"valueType": "string"
|
|
71318
|
-
},
|
|
71319
|
-
{
|
|
71320
|
-
"path": "severity",
|
|
71321
|
-
"valueType": "enum",
|
|
71322
|
-
"enumValues": [
|
|
71323
|
-
"info",
|
|
71324
|
-
"warning",
|
|
71325
|
-
"error"
|
|
71326
|
-
]
|
|
71327
|
-
}
|
|
71328
|
-
],
|
|
71329
|
-
"lock-control": [{
|
|
71330
|
-
"path": "state",
|
|
71331
|
-
"valueType": "enum",
|
|
71332
|
-
"enumValues": [
|
|
71333
|
-
"locked",
|
|
71334
|
-
"unlocked",
|
|
71335
|
-
"locking",
|
|
71336
|
-
"unlocking",
|
|
71337
|
-
"jammed"
|
|
71338
|
-
]
|
|
71339
|
-
}],
|
|
71340
|
-
"media-player": [
|
|
71341
|
-
{
|
|
71342
|
-
"path": "state",
|
|
71343
|
-
"valueType": "enum",
|
|
71344
|
-
"enumValues": [
|
|
71345
|
-
"off",
|
|
71346
|
-
"on",
|
|
71347
|
-
"idle",
|
|
71348
|
-
"playing",
|
|
71349
|
-
"paused",
|
|
71350
|
-
"buffering",
|
|
71351
|
-
"standby"
|
|
71352
|
-
]
|
|
71353
|
-
},
|
|
71354
|
-
{
|
|
71355
|
-
"path": "volumeLevel",
|
|
71356
|
-
"valueType": "number"
|
|
71357
|
-
},
|
|
71358
|
-
{
|
|
71359
|
-
"path": "isMuted",
|
|
71360
|
-
"valueType": "boolean"
|
|
71361
|
-
},
|
|
71362
|
-
{
|
|
71363
|
-
"path": "source",
|
|
71364
|
-
"valueType": "string"
|
|
71365
|
-
},
|
|
71366
|
-
{
|
|
71367
|
-
"path": "currentMedia.type",
|
|
71368
|
-
"valueType": "string"
|
|
71369
|
-
},
|
|
71370
|
-
{
|
|
71371
|
-
"path": "currentMedia.title",
|
|
71372
|
-
"valueType": "string"
|
|
71373
|
-
},
|
|
71374
|
-
{
|
|
71375
|
-
"path": "currentMedia.artist",
|
|
71376
|
-
"valueType": "string"
|
|
71377
|
-
},
|
|
71378
|
-
{
|
|
71379
|
-
"path": "currentMedia.album",
|
|
71380
|
-
"valueType": "string"
|
|
71381
|
-
},
|
|
71382
|
-
{
|
|
71383
|
-
"path": "currentMedia.imageUrl",
|
|
71384
|
-
"valueType": "string"
|
|
71385
|
-
},
|
|
71386
|
-
{
|
|
71387
|
-
"path": "positionMs",
|
|
71388
|
-
"valueType": "number"
|
|
71389
|
-
},
|
|
71390
|
-
{
|
|
71391
|
-
"path": "durationMs",
|
|
71392
|
-
"valueType": "number"
|
|
71393
|
-
},
|
|
71394
|
-
{
|
|
71395
|
-
"path": "shuffle",
|
|
71396
|
-
"valueType": "boolean"
|
|
71397
|
-
},
|
|
71398
|
-
{
|
|
71399
|
-
"path": "repeat",
|
|
71400
|
-
"valueType": "enum",
|
|
71401
|
-
"enumValues": [
|
|
71402
|
-
"off",
|
|
71403
|
-
"all",
|
|
71404
|
-
"one"
|
|
71405
|
-
]
|
|
71406
|
-
}
|
|
71407
|
-
],
|
|
71408
|
-
"motion": [
|
|
71409
|
-
{
|
|
71410
|
-
"path": "detected",
|
|
71411
|
-
"valueType": "boolean"
|
|
71412
|
-
},
|
|
71413
|
-
{
|
|
71414
|
-
"path": "lastDetectedAt",
|
|
71415
|
-
"valueType": "number"
|
|
71416
|
-
},
|
|
71417
|
-
{
|
|
71418
|
-
"path": "autoClearAfterMs",
|
|
71419
|
-
"valueType": "number"
|
|
71420
|
-
}
|
|
71421
|
-
],
|
|
71422
|
-
"motion-trigger": [{
|
|
71423
|
-
"path": "enabled",
|
|
71424
|
-
"valueType": "boolean"
|
|
71425
|
-
}],
|
|
71426
|
-
"motion-zones": [{
|
|
71427
|
-
"path": "enabled",
|
|
71428
|
-
"valueType": "boolean"
|
|
71429
|
-
}, {
|
|
71430
|
-
"path": "sensitivity",
|
|
71431
|
-
"valueType": "number"
|
|
71432
|
-
}],
|
|
71433
|
-
"mqtt-broker": [{
|
|
71434
|
-
"path": "brokerCount",
|
|
71435
|
-
"valueType": "number"
|
|
71436
|
-
}, {
|
|
71437
|
-
"path": "embeddedRunning",
|
|
71438
|
-
"valueType": "boolean"
|
|
71439
|
-
}],
|
|
71440
|
-
"native-object-detection": [{
|
|
71441
|
-
"path": "enabled",
|
|
71442
|
-
"valueType": "boolean"
|
|
71443
|
-
}],
|
|
71444
|
-
"navigation": [
|
|
71445
|
-
{
|
|
71446
|
-
"path": "mode",
|
|
71447
|
-
"valueType": "enum",
|
|
71448
|
-
"enumValues": [
|
|
71449
|
-
"idle",
|
|
71450
|
-
"cleaning",
|
|
71451
|
-
"spot",
|
|
71452
|
-
"following",
|
|
71453
|
-
"goto",
|
|
71454
|
-
"returning",
|
|
71455
|
-
"paused",
|
|
71456
|
-
"unknown"
|
|
71457
|
-
]
|
|
71458
|
-
},
|
|
71459
|
-
{
|
|
71460
|
-
"path": "following",
|
|
71461
|
-
"valueType": "boolean"
|
|
71462
|
-
},
|
|
71463
|
-
{
|
|
71464
|
-
"path": "flash",
|
|
71465
|
-
"valueType": "boolean"
|
|
71466
|
-
},
|
|
71467
|
-
{
|
|
71468
|
-
"path": "lightMode",
|
|
71469
|
-
"valueType": "enum",
|
|
71470
|
-
"enumValues": ["auto", "manual"]
|
|
71471
|
-
},
|
|
71472
|
-
{
|
|
71473
|
-
"path": "lightLevel",
|
|
71474
|
-
"valueType": "number"
|
|
71475
|
-
}
|
|
71476
|
-
],
|
|
71477
|
-
"network-link": [
|
|
71478
|
-
{
|
|
71479
|
-
"path": "type",
|
|
71480
|
-
"valueType": "enum",
|
|
71481
|
-
"enumValues": [
|
|
71482
|
-
"wifi",
|
|
71483
|
-
"ethernet",
|
|
71484
|
-
"cellular",
|
|
71485
|
-
"unknown"
|
|
71486
|
-
]
|
|
71487
|
-
},
|
|
71488
|
-
{
|
|
71489
|
-
"path": "signalPercent",
|
|
71490
|
-
"valueType": "number"
|
|
71491
|
-
},
|
|
71492
|
-
{
|
|
71493
|
-
"path": "rssiDbm",
|
|
71494
|
-
"valueType": "number"
|
|
71495
|
-
},
|
|
71496
|
-
{
|
|
71497
|
-
"path": "ssid",
|
|
71498
|
-
"valueType": "string"
|
|
71499
|
-
},
|
|
71500
|
-
{
|
|
71501
|
-
"path": "lastUpdated",
|
|
71502
|
-
"valueType": "number"
|
|
71503
|
-
}
|
|
71504
|
-
],
|
|
71505
|
-
"notifier": [
|
|
71506
|
-
{
|
|
71507
|
-
"path": "lastSentAt",
|
|
71508
|
-
"valueType": "number"
|
|
71509
|
-
},
|
|
71510
|
-
{
|
|
71511
|
-
"path": "lastError",
|
|
71512
|
-
"valueType": "string"
|
|
71513
|
-
},
|
|
71514
|
-
{
|
|
71515
|
-
"path": "queueDepth",
|
|
71516
|
-
"valueType": "number"
|
|
71517
|
-
},
|
|
71518
|
-
{
|
|
71519
|
-
"path": "supports.image",
|
|
71520
|
-
"valueType": "boolean"
|
|
71521
|
-
},
|
|
71522
|
-
{
|
|
71523
|
-
"path": "supports.priority",
|
|
71524
|
-
"valueType": "boolean"
|
|
71525
|
-
},
|
|
71526
|
-
{
|
|
71527
|
-
"path": "supports.data",
|
|
71528
|
-
"valueType": "boolean"
|
|
71529
|
-
},
|
|
71530
|
-
{
|
|
71531
|
-
"path": "supports.actions",
|
|
71532
|
-
"valueType": "boolean"
|
|
71533
|
-
},
|
|
71534
|
-
{
|
|
71535
|
-
"path": "supports.recipients",
|
|
71536
|
-
"valueType": "boolean"
|
|
71537
|
-
}
|
|
71538
|
-
],
|
|
71539
|
-
"numeric-sensor": [
|
|
71540
|
-
{
|
|
71541
|
-
"path": "value",
|
|
71542
|
-
"valueType": "number"
|
|
71543
|
-
},
|
|
71544
|
-
{
|
|
71545
|
-
"path": "unit",
|
|
71546
|
-
"valueType": "string"
|
|
71547
|
-
},
|
|
71548
|
-
{
|
|
71549
|
-
"path": "precision",
|
|
71550
|
-
"valueType": "number"
|
|
71551
|
-
}
|
|
71552
|
-
],
|
|
71553
|
-
"pet-feeder": [
|
|
71554
|
-
{
|
|
71555
|
-
"path": "foodLevel",
|
|
71556
|
-
"valueType": "number"
|
|
71557
|
-
},
|
|
71558
|
-
{
|
|
71559
|
-
"path": "food1",
|
|
71560
|
-
"valueType": "number"
|
|
71561
|
-
},
|
|
71562
|
-
{
|
|
71563
|
-
"path": "food2",
|
|
71564
|
-
"valueType": "number"
|
|
71565
|
-
},
|
|
71566
|
-
{
|
|
71567
|
-
"path": "lowFood",
|
|
71568
|
-
"valueType": "boolean"
|
|
71569
|
-
},
|
|
71570
|
-
{
|
|
71571
|
-
"path": "batteryPower",
|
|
71572
|
-
"valueType": "number"
|
|
71573
|
-
},
|
|
71574
|
-
{
|
|
71575
|
-
"path": "desiccantLeftDays",
|
|
71576
|
-
"valueType": "number"
|
|
71577
|
-
},
|
|
71578
|
-
{
|
|
71579
|
-
"path": "feeding",
|
|
71580
|
-
"valueType": "boolean"
|
|
71581
|
-
},
|
|
71582
|
-
{
|
|
71583
|
-
"path": "status",
|
|
71584
|
-
"valueType": "enum",
|
|
71585
|
-
"enumValues": [
|
|
71586
|
-
"normal",
|
|
71587
|
-
"offline",
|
|
71588
|
-
"on_batteries"
|
|
71589
|
-
]
|
|
71590
|
-
},
|
|
71591
|
-
{
|
|
71592
|
-
"path": "error",
|
|
71593
|
-
"valueType": "string"
|
|
71594
|
-
},
|
|
71595
|
-
{
|
|
71596
|
-
"path": "errorCode",
|
|
71597
|
-
"valueType": "number"
|
|
71598
|
-
},
|
|
71599
|
-
{
|
|
71600
|
-
"path": "isDualHopper",
|
|
71601
|
-
"valueType": "boolean"
|
|
71602
|
-
},
|
|
71603
|
-
{
|
|
71604
|
-
"path": "childLock",
|
|
71605
|
-
"valueType": "boolean"
|
|
71606
|
-
},
|
|
71607
|
-
{
|
|
71608
|
-
"path": "indicatorLight",
|
|
71609
|
-
"valueType": "boolean"
|
|
71610
|
-
},
|
|
71611
|
-
{
|
|
71612
|
-
"path": "feedSound",
|
|
71613
|
-
"valueType": "boolean"
|
|
71614
|
-
},
|
|
71615
|
-
{
|
|
71616
|
-
"path": "volume",
|
|
71617
|
-
"valueType": "number"
|
|
71618
|
-
}
|
|
71619
|
-
],
|
|
71620
|
-
"power-meter": [
|
|
71621
|
-
{
|
|
71622
|
-
"path": "watts",
|
|
71623
|
-
"valueType": "number"
|
|
71624
|
-
},
|
|
71625
|
-
{
|
|
71626
|
-
"path": "kwhTotal",
|
|
71627
|
-
"valueType": "number"
|
|
71628
|
-
},
|
|
71629
|
-
{
|
|
71630
|
-
"path": "volts",
|
|
71631
|
-
"valueType": "number"
|
|
71632
|
-
},
|
|
71633
|
-
{
|
|
71634
|
-
"path": "amps",
|
|
71635
|
-
"valueType": "number"
|
|
71636
|
-
},
|
|
71637
|
-
{
|
|
71638
|
-
"path": "va",
|
|
71639
|
-
"valueType": "number"
|
|
71640
|
-
},
|
|
71641
|
-
{
|
|
71642
|
-
"path": "powerFactor",
|
|
71643
|
-
"valueType": "number"
|
|
71644
|
-
},
|
|
71645
|
-
{
|
|
71646
|
-
"path": "unit",
|
|
71647
|
-
"valueType": "string"
|
|
71648
|
-
},
|
|
71649
|
-
{
|
|
71650
|
-
"path": "precision",
|
|
71651
|
-
"valueType": "number"
|
|
71652
|
-
}
|
|
71653
|
-
],
|
|
71654
|
-
"presence": [
|
|
71655
|
-
{
|
|
71656
|
-
"path": "state",
|
|
71657
|
-
"valueType": "string"
|
|
71658
|
-
},
|
|
71659
|
-
{
|
|
71660
|
-
"path": "location",
|
|
71661
|
-
"valueType": "string"
|
|
71662
|
-
},
|
|
71663
|
-
{
|
|
71664
|
-
"path": "gps.latitude",
|
|
71665
|
-
"valueType": "number"
|
|
71666
|
-
},
|
|
71667
|
-
{
|
|
71668
|
-
"path": "gps.longitude",
|
|
71669
|
-
"valueType": "number"
|
|
71670
|
-
},
|
|
71671
|
-
{
|
|
71672
|
-
"path": "gps.accuracyMeters",
|
|
71673
|
-
"valueType": "number"
|
|
71674
|
-
},
|
|
71675
|
-
{
|
|
71676
|
-
"path": "batteryPercent",
|
|
71677
|
-
"valueType": "number"
|
|
71678
|
-
}
|
|
71679
|
-
],
|
|
71680
|
-
"pressure-sensor": [
|
|
71681
|
-
{
|
|
71682
|
-
"path": "hpa",
|
|
71683
|
-
"valueType": "number"
|
|
71684
|
-
},
|
|
71685
|
-
{
|
|
71686
|
-
"path": "unit",
|
|
71687
|
-
"valueType": "string"
|
|
71688
|
-
},
|
|
71689
|
-
{
|
|
71690
|
-
"path": "precision",
|
|
71691
|
-
"valueType": "number"
|
|
71692
|
-
}
|
|
71693
|
-
],
|
|
71694
|
-
"privacy-mask": [{
|
|
71695
|
-
"path": "enabled",
|
|
71696
|
-
"valueType": "boolean"
|
|
71697
|
-
}, {
|
|
71698
|
-
"path": "audioEnabled",
|
|
71699
|
-
"valueType": "boolean"
|
|
71700
|
-
}],
|
|
71701
|
-
"ptz": [
|
|
71702
|
-
{
|
|
71703
|
-
"path": "pan",
|
|
71704
|
-
"valueType": "number"
|
|
71705
|
-
},
|
|
71706
|
-
{
|
|
71707
|
-
"path": "tilt",
|
|
71708
|
-
"valueType": "number"
|
|
71709
|
-
},
|
|
71710
|
-
{
|
|
71711
|
-
"path": "zoom",
|
|
71712
|
-
"valueType": "number"
|
|
71713
|
-
},
|
|
71714
|
-
{
|
|
71715
|
-
"path": "autofocus",
|
|
71716
|
-
"valueType": "boolean"
|
|
71717
|
-
}
|
|
71718
|
-
],
|
|
71719
|
-
"ptz-autotrack": [
|
|
71720
|
-
{
|
|
71721
|
-
"path": "enabled",
|
|
71722
|
-
"valueType": "boolean"
|
|
71723
|
-
},
|
|
71724
|
-
{
|
|
71725
|
-
"path": "currentSettings.targetType",
|
|
71726
|
-
"valueType": "string"
|
|
71727
|
-
},
|
|
71728
|
-
{
|
|
71729
|
-
"path": "currentSettings.stopDelaySeconds",
|
|
71730
|
-
"valueType": "number"
|
|
71731
|
-
},
|
|
71732
|
-
{
|
|
71733
|
-
"path": "currentSettings.disappearDelaySeconds",
|
|
71734
|
-
"valueType": "number"
|
|
71735
|
-
}
|
|
71736
|
-
],
|
|
71737
|
-
"recording-archive": [
|
|
71738
|
-
{
|
|
71739
|
-
"path": "deviceId",
|
|
71740
|
-
"valueType": "number"
|
|
71741
|
-
},
|
|
71742
|
-
{
|
|
71743
|
-
"path": "enabled",
|
|
71744
|
-
"valueType": "boolean"
|
|
71745
|
-
},
|
|
71746
|
-
{
|
|
71747
|
-
"path": "activeMode",
|
|
71748
|
-
"valueType": "enum",
|
|
71749
|
-
"enumValues": [
|
|
71750
|
-
"off",
|
|
71751
|
-
"events",
|
|
71752
|
-
"continuous",
|
|
71753
|
-
"on-device-decision"
|
|
71754
|
-
]
|
|
71755
|
-
},
|
|
71756
|
-
{
|
|
71757
|
-
"path": "nodeId",
|
|
71758
|
-
"valueType": "string"
|
|
71759
|
-
},
|
|
71760
|
-
{
|
|
71761
|
-
"path": "storageBytes",
|
|
71762
|
-
"valueType": "number"
|
|
71763
|
-
}
|
|
71764
|
-
],
|
|
71765
|
-
"recording-onboard": [
|
|
71766
|
-
{
|
|
71767
|
-
"path": "primaryTrackId",
|
|
71768
|
-
"valueType": "string"
|
|
71769
|
-
},
|
|
71770
|
-
{
|
|
71771
|
-
"path": "enabled",
|
|
71772
|
-
"valueType": "boolean"
|
|
71773
|
-
},
|
|
71774
|
-
{
|
|
71775
|
-
"path": "overwriteWhenFull",
|
|
71776
|
-
"valueType": "boolean"
|
|
71777
|
-
},
|
|
71778
|
-
{
|
|
71779
|
-
"path": "preRecordSec",
|
|
71780
|
-
"valueType": "number"
|
|
71781
|
-
},
|
|
71782
|
-
{
|
|
71783
|
-
"path": "postRecordSec",
|
|
71784
|
-
"valueType": "number"
|
|
71785
|
-
},
|
|
71786
|
-
{
|
|
71787
|
-
"path": "segmentMinutes",
|
|
71788
|
-
"valueType": "number"
|
|
71789
|
-
},
|
|
71790
|
-
{
|
|
71791
|
-
"path": "unreadableWindows",
|
|
71792
|
-
"valueType": "number"
|
|
71793
|
-
},
|
|
71794
|
-
{
|
|
71795
|
-
"path": "recordingToNowhere",
|
|
71796
|
-
"valueType": "boolean"
|
|
71797
|
-
}
|
|
71798
|
-
],
|
|
71799
|
-
"recording-signal": [{
|
|
71800
|
-
"path": "active",
|
|
71801
|
-
"valueType": "boolean"
|
|
71802
|
-
}, {
|
|
71803
|
-
"path": "reason",
|
|
71804
|
-
"valueType": "string"
|
|
71805
|
-
}],
|
|
71806
|
-
"running-state": [
|
|
71807
|
-
{
|
|
71808
|
-
"path": "running",
|
|
71809
|
-
"valueType": "boolean"
|
|
71810
|
-
},
|
|
71811
|
-
{
|
|
71812
|
-
"path": "since",
|
|
71813
|
-
"valueType": "number"
|
|
71814
|
-
},
|
|
71815
|
-
{
|
|
71816
|
-
"path": "source",
|
|
71817
|
-
"valueType": "enum",
|
|
71818
|
-
"enumValues": ["native", "assigned"]
|
|
71819
|
-
},
|
|
71820
|
-
{
|
|
71821
|
-
"path": "phase",
|
|
71822
|
-
"valueType": "string"
|
|
71823
|
-
}
|
|
71824
|
-
],
|
|
71825
|
-
"script-runner": [
|
|
71826
|
-
{
|
|
71827
|
-
"path": "isRunning",
|
|
71828
|
-
"valueType": "boolean"
|
|
71829
|
-
},
|
|
71830
|
-
{
|
|
71831
|
-
"path": "lastRunAt",
|
|
71832
|
-
"valueType": "number"
|
|
71833
|
-
},
|
|
71834
|
-
{
|
|
71835
|
-
"path": "lastRunSuccess",
|
|
71836
|
-
"valueType": "boolean"
|
|
71837
|
-
},
|
|
71838
|
-
{
|
|
71839
|
-
"path": "lastError",
|
|
71840
|
-
"valueType": "string"
|
|
71841
|
-
}
|
|
71842
|
-
],
|
|
71843
|
-
"smoke": [{
|
|
71844
|
-
"path": "detected",
|
|
71845
|
-
"valueType": "boolean"
|
|
71846
|
-
}],
|
|
71847
|
-
"snapshot": [
|
|
71848
|
-
{
|
|
71849
|
-
"path": "lastCapturedAt",
|
|
71850
|
-
"valueType": "number"
|
|
71851
|
-
},
|
|
71852
|
-
{
|
|
71853
|
-
"path": "cacheAgeMs",
|
|
71854
|
-
"valueType": "number"
|
|
71855
|
-
},
|
|
71856
|
-
{
|
|
71857
|
-
"path": "lastBytes",
|
|
71858
|
-
"valueType": "number"
|
|
71859
|
-
},
|
|
71860
|
-
{
|
|
71861
|
-
"path": "lastStreamId",
|
|
71862
|
-
"valueType": "string"
|
|
71863
|
-
}
|
|
71864
|
-
],
|
|
71865
|
-
"stream-params": [
|
|
71866
|
-
{
|
|
71867
|
-
"path": "main.width",
|
|
71868
|
-
"valueType": "number"
|
|
71869
|
-
},
|
|
71870
|
-
{
|
|
71871
|
-
"path": "main.height",
|
|
71872
|
-
"valueType": "number"
|
|
71873
|
-
},
|
|
71874
|
-
{
|
|
71875
|
-
"path": "main.codec",
|
|
71876
|
-
"valueType": "enum",
|
|
71877
|
-
"enumValues": ["h264", "h265"]
|
|
71878
|
-
},
|
|
71879
|
-
{
|
|
71880
|
-
"path": "main.framerate",
|
|
71881
|
-
"valueType": "number"
|
|
71882
|
-
},
|
|
71883
|
-
{
|
|
71884
|
-
"path": "main.bitrate",
|
|
71885
|
-
"valueType": "number"
|
|
71886
|
-
},
|
|
71887
|
-
{
|
|
71888
|
-
"path": "main.bitrateMode",
|
|
71889
|
-
"valueType": "enum",
|
|
71890
|
-
"enumValues": ["vbr", "cbr"]
|
|
71891
|
-
},
|
|
71892
|
-
{
|
|
71893
|
-
"path": "main.encoderProfile",
|
|
71894
|
-
"valueType": "enum",
|
|
71895
|
-
"enumValues": [
|
|
71896
|
-
"high",
|
|
71897
|
-
"main",
|
|
71898
|
-
"baseline"
|
|
71899
|
-
]
|
|
71900
|
-
},
|
|
71901
|
-
{
|
|
71902
|
-
"path": "main.gop",
|
|
71903
|
-
"valueType": "number"
|
|
71904
|
-
},
|
|
71905
|
-
{
|
|
71906
|
-
"path": "main.audio",
|
|
71907
|
-
"valueType": "boolean"
|
|
71908
|
-
},
|
|
71909
|
-
{
|
|
71910
|
-
"path": "sub.width",
|
|
71911
|
-
"valueType": "number"
|
|
71912
|
-
},
|
|
71913
|
-
{
|
|
71914
|
-
"path": "sub.height",
|
|
71915
|
-
"valueType": "number"
|
|
71916
|
-
},
|
|
71917
|
-
{
|
|
71918
|
-
"path": "sub.codec",
|
|
71919
|
-
"valueType": "enum",
|
|
71920
|
-
"enumValues": ["h264", "h265"]
|
|
71921
|
-
},
|
|
71922
|
-
{
|
|
71923
|
-
"path": "sub.framerate",
|
|
71924
|
-
"valueType": "number"
|
|
71925
|
-
},
|
|
71926
|
-
{
|
|
71927
|
-
"path": "sub.bitrate",
|
|
71928
|
-
"valueType": "number"
|
|
71929
|
-
},
|
|
71930
|
-
{
|
|
71931
|
-
"path": "sub.bitrateMode",
|
|
71932
|
-
"valueType": "enum",
|
|
71933
|
-
"enumValues": ["vbr", "cbr"]
|
|
71934
|
-
},
|
|
71935
|
-
{
|
|
71936
|
-
"path": "sub.encoderProfile",
|
|
71937
|
-
"valueType": "enum",
|
|
71938
|
-
"enumValues": [
|
|
71939
|
-
"high",
|
|
71940
|
-
"main",
|
|
71941
|
-
"baseline"
|
|
71942
|
-
]
|
|
71943
|
-
},
|
|
71944
|
-
{
|
|
71945
|
-
"path": "sub.gop",
|
|
71946
|
-
"valueType": "number"
|
|
71947
|
-
},
|
|
71948
|
-
{
|
|
71949
|
-
"path": "sub.audio",
|
|
71950
|
-
"valueType": "boolean"
|
|
71951
|
-
},
|
|
71952
|
-
{
|
|
71953
|
-
"path": "ext.width",
|
|
71954
|
-
"valueType": "number"
|
|
71955
|
-
},
|
|
71956
|
-
{
|
|
71957
|
-
"path": "ext.height",
|
|
71958
|
-
"valueType": "number"
|
|
71959
|
-
},
|
|
71960
|
-
{
|
|
71961
|
-
"path": "ext.codec",
|
|
71962
|
-
"valueType": "enum",
|
|
71963
|
-
"enumValues": ["h264", "h265"]
|
|
71964
|
-
},
|
|
71965
|
-
{
|
|
71966
|
-
"path": "ext.framerate",
|
|
71967
|
-
"valueType": "number"
|
|
71968
|
-
},
|
|
71969
|
-
{
|
|
71970
|
-
"path": "ext.bitrate",
|
|
71971
|
-
"valueType": "number"
|
|
71972
|
-
},
|
|
71973
|
-
{
|
|
71974
|
-
"path": "ext.bitrateMode",
|
|
71975
|
-
"valueType": "enum",
|
|
71976
|
-
"enumValues": ["vbr", "cbr"]
|
|
71977
|
-
},
|
|
71978
|
-
{
|
|
71979
|
-
"path": "ext.encoderProfile",
|
|
71980
|
-
"valueType": "enum",
|
|
71981
|
-
"enumValues": [
|
|
71982
|
-
"high",
|
|
71983
|
-
"main",
|
|
71984
|
-
"baseline"
|
|
71985
|
-
]
|
|
71986
|
-
},
|
|
71987
|
-
{
|
|
71988
|
-
"path": "ext.gop",
|
|
71989
|
-
"valueType": "number"
|
|
71990
|
-
},
|
|
71991
|
-
{
|
|
71992
|
-
"path": "ext.audio",
|
|
71993
|
-
"valueType": "boolean"
|
|
71994
|
-
}
|
|
71995
|
-
],
|
|
71996
|
-
"switch": [{
|
|
71997
|
-
"path": "on",
|
|
71998
|
-
"valueType": "boolean"
|
|
71999
|
-
}],
|
|
72000
|
-
"tamper": [{
|
|
72001
|
-
"path": "tampered",
|
|
72002
|
-
"valueType": "boolean"
|
|
72003
|
-
}],
|
|
72004
|
-
"temperature-sensor": [
|
|
72005
|
-
{
|
|
72006
|
-
"path": "celsius",
|
|
72007
|
-
"valueType": "number"
|
|
72008
|
-
},
|
|
72009
|
-
{
|
|
72010
|
-
"path": "unit",
|
|
72011
|
-
"valueType": "string"
|
|
72012
|
-
},
|
|
72013
|
-
{
|
|
72014
|
-
"path": "precision",
|
|
72015
|
-
"valueType": "number"
|
|
72016
|
-
}
|
|
72017
|
-
],
|
|
72018
|
-
"update": [
|
|
72019
|
-
{
|
|
72020
|
-
"path": "currentVersion",
|
|
72021
|
-
"valueType": "string"
|
|
72022
|
-
},
|
|
72023
|
-
{
|
|
72024
|
-
"path": "availableVersion",
|
|
72025
|
-
"valueType": "string"
|
|
72026
|
-
},
|
|
72027
|
-
{
|
|
72028
|
-
"path": "updatable",
|
|
72029
|
-
"valueType": "boolean"
|
|
72030
|
-
},
|
|
72031
|
-
{
|
|
72032
|
-
"path": "state",
|
|
72033
|
-
"valueType": "string"
|
|
72034
|
-
},
|
|
72035
|
-
{
|
|
72036
|
-
"path": "inProgress",
|
|
72037
|
-
"valueType": "boolean"
|
|
72038
|
-
}
|
|
72039
|
-
],
|
|
72040
|
-
"vacuum-control": [
|
|
72041
|
-
{
|
|
72042
|
-
"path": "state",
|
|
72043
|
-
"valueType": "enum",
|
|
72044
|
-
"enumValues": [
|
|
72045
|
-
"idle",
|
|
72046
|
-
"cleaning",
|
|
72047
|
-
"paused",
|
|
72048
|
-
"returning",
|
|
72049
|
-
"docked",
|
|
72050
|
-
"drying",
|
|
72051
|
-
"error"
|
|
72052
|
-
]
|
|
72053
|
-
},
|
|
72054
|
-
{
|
|
72055
|
-
"path": "batteryLevel",
|
|
72056
|
-
"valueType": "number"
|
|
72057
|
-
},
|
|
72058
|
-
{
|
|
72059
|
-
"path": "fanSpeed",
|
|
72060
|
-
"valueType": "string"
|
|
72061
|
-
},
|
|
72062
|
-
{
|
|
72063
|
-
"path": "progressPercent",
|
|
72064
|
-
"valueType": "number"
|
|
72065
|
-
},
|
|
72066
|
-
{
|
|
72067
|
-
"path": "errorCode",
|
|
72068
|
-
"valueType": "number"
|
|
72069
|
-
},
|
|
72070
|
-
{
|
|
72071
|
-
"path": "errorLabel",
|
|
72072
|
-
"valueType": "string"
|
|
72073
|
-
}
|
|
72074
|
-
],
|
|
72075
|
-
"valve": [{
|
|
72076
|
-
"path": "state",
|
|
72077
|
-
"valueType": "enum",
|
|
72078
|
-
"enumValues": [
|
|
72079
|
-
"open",
|
|
72080
|
-
"opening",
|
|
72081
|
-
"closing",
|
|
72082
|
-
"closed",
|
|
72083
|
-
"stopped"
|
|
72084
|
-
]
|
|
72085
|
-
}, {
|
|
72086
|
-
"path": "position",
|
|
72087
|
-
"valueType": "number"
|
|
72088
|
-
}],
|
|
72089
|
-
"vibration": [{
|
|
72090
|
-
"path": "detected",
|
|
72091
|
-
"valueType": "boolean"
|
|
72092
|
-
}],
|
|
72093
|
-
"water-heater": [
|
|
72094
|
-
{
|
|
72095
|
-
"path": "currentTemp",
|
|
72096
|
-
"valueType": "number"
|
|
72097
|
-
},
|
|
72098
|
-
{
|
|
72099
|
-
"path": "targetTemp",
|
|
72100
|
-
"valueType": "number"
|
|
72101
|
-
},
|
|
72102
|
-
{
|
|
72103
|
-
"path": "operationMode",
|
|
72104
|
-
"valueType": "string"
|
|
72105
|
-
},
|
|
72106
|
-
{
|
|
72107
|
-
"path": "away",
|
|
72108
|
-
"valueType": "boolean"
|
|
72109
|
-
},
|
|
72110
|
-
{
|
|
72111
|
-
"path": "minTemp",
|
|
72112
|
-
"valueType": "number"
|
|
72113
|
-
},
|
|
72114
|
-
{
|
|
72115
|
-
"path": "maxTemp",
|
|
72116
|
-
"valueType": "number"
|
|
72117
|
-
}
|
|
72118
|
-
],
|
|
72119
|
-
"weather": [
|
|
72120
|
-
{
|
|
72121
|
-
"path": "condition",
|
|
72122
|
-
"valueType": "string"
|
|
72123
|
-
},
|
|
72124
|
-
{
|
|
72125
|
-
"path": "temperature",
|
|
72126
|
-
"valueType": "number"
|
|
72127
|
-
},
|
|
72128
|
-
{
|
|
72129
|
-
"path": "temperatureUnit",
|
|
72130
|
-
"valueType": "string"
|
|
72131
|
-
},
|
|
72132
|
-
{
|
|
72133
|
-
"path": "humidity",
|
|
72134
|
-
"valueType": "number"
|
|
72135
|
-
},
|
|
72136
|
-
{
|
|
72137
|
-
"path": "pressure",
|
|
72138
|
-
"valueType": "number"
|
|
72139
|
-
},
|
|
72140
|
-
{
|
|
72141
|
-
"path": "pressureUnit",
|
|
72142
|
-
"valueType": "string"
|
|
72143
|
-
},
|
|
72144
|
-
{
|
|
72145
|
-
"path": "windSpeed",
|
|
72146
|
-
"valueType": "number"
|
|
72147
|
-
},
|
|
72148
|
-
{
|
|
72149
|
-
"path": "windSpeedUnit",
|
|
72150
|
-
"valueType": "string"
|
|
72151
|
-
},
|
|
72152
|
-
{
|
|
72153
|
-
"path": "windBearing",
|
|
72154
|
-
"valueType": "number"
|
|
72155
|
-
}
|
|
72156
|
-
],
|
|
72157
|
-
"zone-analytics": [
|
|
72158
|
-
{
|
|
72159
|
-
"path": "ts",
|
|
72160
|
-
"valueType": "number"
|
|
72161
|
-
},
|
|
72162
|
-
{
|
|
72163
|
-
"path": "frameWidth",
|
|
72164
|
-
"valueType": "number"
|
|
72165
|
-
},
|
|
72166
|
-
{
|
|
72167
|
-
"path": "frameHeight",
|
|
72168
|
-
"valueType": "number"
|
|
72169
|
-
},
|
|
72170
|
-
{
|
|
72171
|
-
"path": "frame.totalObjects",
|
|
72172
|
-
"valueType": "number"
|
|
72173
|
-
},
|
|
72174
|
-
{
|
|
72175
|
-
"path": "frame.standingObjects",
|
|
72176
|
-
"valueType": "number"
|
|
72177
|
-
},
|
|
72178
|
-
{
|
|
72179
|
-
"path": "frame.transientObjects",
|
|
72180
|
-
"valueType": "number"
|
|
72181
|
-
},
|
|
72182
|
-
{
|
|
72183
|
-
"path": "unzoned.totalObjects",
|
|
72184
|
-
"valueType": "number"
|
|
72185
|
-
},
|
|
72186
|
-
{
|
|
72187
|
-
"path": "unzoned.standingObjects",
|
|
72188
|
-
"valueType": "number"
|
|
72189
|
-
},
|
|
72190
|
-
{
|
|
72191
|
-
"path": "unzoned.transientObjects",
|
|
72192
|
-
"valueType": "number"
|
|
72193
|
-
}
|
|
72194
|
-
]
|
|
72195
|
-
});
|
|
72196
70405
|
//#endregion
|
|
72197
70406
|
//#region src/pipeline-analytics/services/sensor-transition-gate.ts
|
|
72198
70407
|
/**
|
|
@@ -72209,7 +70418,7 @@ Object.freeze({
|
|
|
72209
70418
|
* and downstream it became a `SensorEvent` row and a synthetic `contact` track
|
|
72210
70419
|
* on the linked camera's timeline.
|
|
72211
70420
|
*
|
|
72212
|
-
* Measured on camera
|
|
70421
|
+
* Measured on camera 101 / contact sensor 4131, 2026-08-29→30: **30 of 35**
|
|
72213
70422
|
* contact events were one of two non-events.
|
|
72214
70423
|
*
|
|
72215
70424
|
* - The RECOVERY family. The Zigbee entity flaps `off → unavailable → off`
|
|
@@ -72252,7 +70461,7 @@ Object.freeze({
|
|
|
72252
70461
|
* ten that have a boolean whose edge means something. `button`, `presence`,
|
|
72253
70462
|
* `enum-sensor` and `event-emitter` are NOT levels — their ARRIVAL is the
|
|
72254
70463
|
* event, and three presses in a row are three markers. Gating them would
|
|
72255
|
-
* re-ship the failure of 2026-08-08, when camera
|
|
70464
|
+
* re-ship the failure of 2026-08-08, when camera 101's press produced a row, a
|
|
72256
70465
|
* ring, a matched rule and no marker. (`doorbell` is not a level either, but
|
|
72257
70466
|
* it is not "arrival" any more: three presses are three ADVANCES of its stamp
|
|
72258
70467
|
* — see "A press is a stamp that ADVANCES" below.)
|
|
@@ -72262,7 +70471,7 @@ Object.freeze({
|
|
|
72262
70471
|
* "Arrival is the event" held only while every emission of a `doorbell` slice
|
|
72263
70472
|
* was a press. It is not: the slice is restored durable state (the cap's
|
|
72264
70473
|
* `durability: 'restored'`), and it is re-emitted by everything that rebuilds
|
|
72265
|
-
* or re-claims it. Camera
|
|
70474
|
+
* or re-claims it. Camera 101's composed doorbell (D670, HA
|
|
72266
70475
|
* `switch.doorbell_bussano`) rang on 2026-10-04 19:22:46 and 2026-10-06
|
|
72267
70476
|
* 08:10:56 with `{ lastPressedAt: null, pressCountSinceStart: <unchanged> }`:
|
|
72268
70477
|
* the HA provider was being redeployed, the composer marked the field
|
|
@@ -72383,7 +70592,7 @@ var WORD_LEVEL_INACTIVE = {
|
|
|
72383
70592
|
* which inlined every cap's Zod schema into the addon (~+100 MB heap per
|
|
72384
70593
|
* post-analysis runner, D28).
|
|
72385
70594
|
*/
|
|
72386
|
-
var ADVANCE_FIELD = CAP_ADVANCE_FIELDS;
|
|
70595
|
+
var ADVANCE_FIELD = require_clip_model_registry.CAP_ADVANCE_FIELDS;
|
|
72387
70596
|
/** Default drop-summary window: one line per device per ten minutes, at most. */
|
|
72388
70597
|
var DEFAULT_DROP_SUMMARY_WINDOW_MS = 6e5;
|
|
72389
70598
|
var SensorTransitionGate = class {
|
|
@@ -72543,7 +70752,7 @@ var StationarySettingsSchema = require_clip_model_registry.object({
|
|
|
72543
70752
|
suppressIou: require_clip_model_registry.number().min(.3).max(.9).default(SUPPRESS_IOU),
|
|
72544
70753
|
/** Minimum IoU for a detection to be ASSOCIATED with an entry (confirm or
|
|
72545
70754
|
* wake it) — the overlap gate that stops a different vehicle from waking a
|
|
72546
|
-
* parked entry (the
|
|
70755
|
+
* parked entry (the 102 flood fix). `WAKE_ASSOC_IOU`. */
|
|
72547
70756
|
wakeAssocIou: require_clip_model_registry.number().min(.02).max(.5).default(WAKE_ASSOC_IOU),
|
|
72548
70757
|
/** Recent-window stillness after which a track stops holding its motion
|
|
72549
70758
|
* session open (also the minimum track age). Creates nothing — birth is
|
|
@@ -77593,7 +75802,7 @@ var NcAlarmPanelDevice = class extends require_clip_model_registry.BaseDevice {
|
|
|
77593
75802
|
}
|
|
77594
75803
|
/**
|
|
77595
75804
|
* What became of a match that pressed the panel during its entry delay (D705).
|
|
77596
|
-
* Tagged with the CAMERA the match was about — "why is
|
|
75805
|
+
* Tagged with the CAMERA the match was about — "why is 101 not in the alarm
|
|
77597
75806
|
* picture" is asked per camera. A kept follower and a dropped one are both
|
|
77598
75807
|
* stated: the drop is work the operator would otherwise never see go missing.
|
|
77599
75808
|
*/
|
|
@@ -79766,7 +77975,7 @@ var TrackDetailDispatcher = class {
|
|
|
79766
77975
|
*
|
|
79767
77976
|
* Per camera and per interval rather than per frame: a coasting track offers
|
|
79768
77977
|
* one of these several times a second, and the question this answers is
|
|
79769
|
-
* always "why is
|
|
77978
|
+
* always "why is 102 worse than 101?".
|
|
79770
77979
|
*/
|
|
79771
77980
|
reportCoasted(deviceId, dev, now) {
|
|
79772
77981
|
const ignored = dev.coastedFramesIgnored - dev.coastedReportedAt.count;
|
|
@@ -81451,7 +79660,7 @@ function discardedSystemEvent(event, lookup) {
|
|
|
81451
79660
|
* `reason` is the verdict itself: `seeded` (the first observation of a
|
|
81452
79661
|
* subject — the state was recorded, nothing was said) or `no-flip` (the
|
|
81453
79662
|
* subject is already in this state). Both are answers to the operator's
|
|
81454
|
-
* question "why did
|
|
79663
|
+
* question "why did 102 not notify", and neither may be silent — a boot that
|
|
81455
79664
|
* suppressed fifteen notifications and logged nothing would be
|
|
81456
79665
|
* indistinguishable from a notification centre that had stopped working.
|
|
81457
79666
|
*/
|
|
@@ -82399,7 +80608,7 @@ function unique(values) {
|
|
|
82399
80608
|
* The COMBINED row's two keys, or null when this transition is not one.
|
|
82400
80609
|
*
|
|
82401
80610
|
* D706 (2026-10-06) changed the BODY: a rule-caused trigger now says WHERE the intrusion
|
|
82402
|
-
* went — `alarm.intrusion.body`, "Intrusion:
|
|
80611
|
+
* went — `alarm.intrusion.body`, "Intrusion: Front door, Hallway, Hall", the locations of
|
|
82403
80612
|
* the source and of every follower (D705), frozen as `{{locations}}`. The paragraphs below
|
|
82404
80613
|
* describe the D126 title, which stands; the detection sentence they defend is now the
|
|
82405
80614
|
* body of the alarm rules' own INTRUSION pushes (titled with the location) instead.
|
|
@@ -82412,14 +80621,14 @@ function unique(values) {
|
|
|
82412
80621
|
* class, identity and zones.
|
|
82413
80622
|
*
|
|
82414
80623
|
* The alarm used to write its own prose here ("The alarm was triggered by
|
|
82415
|
-
* Person at gate on
|
|
80624
|
+
* Person at gate on Front door"), which made the one notification that matters
|
|
82416
80625
|
* the only one in the system that did not look like the rule's others: no
|
|
82417
80626
|
* identity, no zone, a different subject. The prefix carries the severity; the
|
|
82418
80627
|
* familiar line carries the meaning.
|
|
82419
80628
|
*
|
|
82420
80629
|
* **Gated on the detection vocabulary, not on the source.** `detection.body`
|
|
82421
80630
|
* renders `{{subject}}`, and a fire ref with no class composes it from the
|
|
82422
|
-
* system event's dedup slot — "alarm:42 su
|
|
80631
|
+
* system event's dedup slot — "alarm:42 su Front door". A source without a class
|
|
82423
80632
|
* therefore keeps the alarm's own sentence, which is also what every row
|
|
82424
80633
|
* enqueued before this deploy carries.
|
|
82425
80634
|
*/
|
|
@@ -82490,7 +80699,7 @@ function alarmSubjectDevice(transition, panelDeviceId) {
|
|
|
82490
80699
|
* **WHOSE event it is.** With no attribution the event is about the PANEL —
|
|
82491
80700
|
* an operator pressed a button, and the panel is the only device involved.
|
|
82492
80701
|
* With one, it is about the CAMERA that set it off: that is the media owner,
|
|
82493
|
-
* the name the body reads out ("ALLARME —
|
|
80702
|
+
* the name the body reads out ("ALLARME — Front door"), and the device a rule
|
|
82494
80703
|
* scoping `deviceIds` means. One sentence, and both halves of it are testable.
|
|
82495
80704
|
* A SENSOR BYPASS is about the sensor — its name is the title.
|
|
82496
80705
|
*/
|
|
@@ -83426,7 +81635,7 @@ function providerSupplyReading(item) {
|
|
|
83426
81635
|
* recheck's own lag (D279). Its clip is therefore anchored well in the past,
|
|
83427
81636
|
* and the other source cannot take that moment over yet: measured against
|
|
83428
81637
|
* `recording.getAvailability` for a 10 s window at several anchors, full
|
|
83429
|
-
* coverage arrived at −18 s on device
|
|
81638
|
+
* coverage arrived at −18 s on device 104 and −26 s on 101 and 102 — the
|
|
83430
81639
|
* recordings' edge is a PHASE of the 10-second segment cycle, not a number. So
|
|
83431
81640
|
* the ring has to bridge from the event to the point the recordings can serve
|
|
83432
81641
|
* it: the worst measured phase (26 s) plus the confirmation lag (29 s) is 55 s,
|
|
@@ -85209,7 +83418,7 @@ var NODE_UPDATE_KINDS = new Set(["server-update-available", "wrapper-update-avai
|
|
|
85209
83418
|
* because "did it really come back, and what did it do while it was gone" is
|
|
85210
83419
|
* an action and the page that answers it is the one the down-notification
|
|
85211
83420
|
* already opened. On 2026-08-30 the operator's phone showed "Il dispositivo
|
|
85212
|
-
*
|
|
83421
|
+
* Camera sala feste è online" with `tapAction.value: null` — the same
|
|
85213
83422
|
* camera's `device-offline` an hour earlier opened the Stream Broker tab, and
|
|
85214
83423
|
* the recovery opened nothing, purely because `device-online` had no entry
|
|
85215
83424
|
* here.
|
|
@@ -85430,8 +83639,8 @@ async function downscaleFullFrameJpeg(jpeg, maxWidth = FULL_FRAME_MAX_WIDTH, max
|
|
|
85430
83639
|
* emptied zone ten seconds apart are two claims about one scene.
|
|
85431
83640
|
*
|
|
85432
83641
|
* Nothing here is silent: a capture that lands and a camera that refuses each
|
|
85433
|
-
* emit one line carrying `tags: { deviceId }`, because "why did
|
|
85434
|
-
* and
|
|
83642
|
+
* emit one line carrying `tags: { deviceId }`, because "why did 102 get a photo
|
|
83643
|
+
* and 101 not" is the only form that question is ever asked in.
|
|
85435
83644
|
*/
|
|
85436
83645
|
/**
|
|
85437
83646
|
* The owner-id namespace. It is what routes a lookup here instead of to the
|
|
@@ -85680,7 +83889,7 @@ var TITLE_MIN_PX = 16;
|
|
|
85680
83889
|
* number and the same reasoning as `preview-frame.ts#fitTitle` — deliberately
|
|
85681
83890
|
* GENEROUS, because a label that shrank slightly more than it had to is
|
|
85682
83891
|
* invisible and one that overflowed runs into the tile beside it. The first
|
|
85683
|
-
* live mosaic did exactly that: `
|
|
83892
|
+
* live mosaic did exactly that: `Camera cortile · 07:49 · animal` was cut
|
|
85684
83893
|
* to `…· anima` at the tile edge, mid-word.
|
|
85685
83894
|
*/
|
|
85686
83895
|
var GLYPH_ADVANCE = .56;
|
|
@@ -87556,7 +85765,7 @@ var NcNotificationImageStage = class {
|
|
|
87556
85765
|
* Below, and not above as the digest does it, and the difference is what gets
|
|
87557
85766
|
* truncated. A digest's counts are the part you check afterwards, so its
|
|
87558
85767
|
* sentence leads. A detection body's first line is the fact ("Persona su
|
|
87559
|
-
*
|
|
85768
|
+
* Front door") and a lock screen cuts from the end — putting a paragraph in front
|
|
87560
85769
|
* of it would push the fact off the screen on exactly the notifications that
|
|
87561
85770
|
* matter most.
|
|
87562
85771
|
*/
|
|
@@ -87608,7 +85817,7 @@ var NC_CLIP_RING_RETENTION_SEC = 20;
|
|
|
87608
85817
|
*
|
|
87609
85818
|
* The notification is HELD for this: a notifier is one-shot, so the footage
|
|
87610
85819
|
* rides the single message or does not ride at all. Measured on the
|
|
87611
|
-
* 2026-09-30 pick-up on
|
|
85820
|
+
* 2026-09-30 pick-up on 101: export 1 s, derive 262 ms — so the bound is
|
|
87612
85821
|
* almost never reached, and when it is the render is queued behind something
|
|
87613
85822
|
* that holds the recorder's one ffmpeg lane for minutes (a timelapse), which
|
|
87614
85823
|
* no wait worth holding a notification for would outlast.
|
|
@@ -87626,7 +85835,7 @@ var NC_RECORDED_FOOTAGE_WAIT_MS = 3e4;
|
|
|
87626
85835
|
/**
|
|
87627
85836
|
* The bounded wait for a still when the rule asked for NO footage.
|
|
87628
85837
|
*
|
|
87629
|
-
* Track media lands 1.5–5.5 s after the trigger (device
|
|
85838
|
+
* Track media lands 1.5–5.5 s after the trigger (device 101, 2026-08-12), so a
|
|
87630
85839
|
* notification built at the instant of the trigger routinely resolves nothing.
|
|
87631
85840
|
* A rule that also wants footage gets this for free — the render already blocks
|
|
87632
85841
|
* 7–8 s and the still is re-resolved after it. A rule that wants only a picture
|
|
@@ -87652,7 +85861,7 @@ var NC_STILL_WAIT_INTERVAL_MS = 500;
|
|
|
87652
85861
|
*
|
|
87653
85862
|
* It is NOT the ladder's top rung that has to be in band — that rung is the
|
|
87654
85863
|
* native keyFrame, whose capture misses and retries (36 misses over 105 track
|
|
87655
|
-
* starts on device
|
|
85864
|
+
* starts on device 101 in 6 h), so it is in band only 46% of the time. Holding
|
|
87656
85865
|
* out for the KIND the rule asked for would wait for the late frame. The gate
|
|
87657
85866
|
* is the instant; the ladder then runs among the frames that are about it.
|
|
87658
85867
|
*/
|
|
@@ -89004,7 +87213,7 @@ var NcDispatcher = class {
|
|
|
89004
87213
|
* A notifier is one-shot. The earlier design (D682) sent the alert first and
|
|
89005
87214
|
* the recorded footage as a SECOND send with the same `tag`, on the promise
|
|
89006
87215
|
* that "a phone collapses the two" — Zentik honours no tag, so every such
|
|
89007
|
-
* row reached the operator as two messages (
|
|
87216
|
+
* row reached the operator as two messages (101, 2026-09-30). A moment that
|
|
89008
87217
|
* reaches this path is already older than the ring (a pick-up is concluded
|
|
89009
87218
|
* minutes after it happened), so waiting a few more seconds costs nothing;
|
|
89010
87219
|
* a second message costs the operator a duplicate every time.
|
|
@@ -91567,7 +89776,7 @@ var DeviceLivenessHoldoff = class {
|
|
|
91567
89776
|
var NC_LIVENESS_COLLECTION = "notification-center:liveness";
|
|
91568
89777
|
var NC_LIVENESS_COLUMNS = [
|
|
91569
89778
|
(
|
|
91570
|
-
/** The subject the intake minted (`device:
|
|
89779
|
+
/** The subject the intake minted (`device:102`, `node:agent-1`) — one row
|
|
91571
89780
|
* each, so the two families can never collide on a key. */
|
|
91572
89781
|
{
|
|
91573
89782
|
name: "subject",
|
|
@@ -91585,7 +89794,7 @@ var NC_LIVENESS_COLUMNS = [
|
|
|
91585
89794
|
}),
|
|
91586
89795
|
(
|
|
91587
89796
|
/** The kind that last wrote the row. Telemetry: it makes the table readable
|
|
91588
|
-
* when someone asks "why did
|
|
89797
|
+
* when someone asks "why did 102 not notify". */
|
|
91589
89798
|
{
|
|
91590
89799
|
name: "kind",
|
|
91591
89800
|
type: "TEXT",
|
|
@@ -91723,7 +89932,7 @@ var NcLivenessLedger = class {
|
|
|
91723
89932
|
* all, so its FIRST observation ever seeds silently — and if that first
|
|
91724
89933
|
* observation is the camera DYING, the outage is thrown away. Live cost,
|
|
91725
89934
|
* 2026-08-13 21:36 CEST: the operator unplugged four cameras and received two
|
|
91726
|
-
* notifications. `device:
|
|
89935
|
+
* notifications. `device:103` and `device:112` had never spoken; their
|
|
91727
89936
|
* unplugging was recorded and never announced. A camera that is quiet until
|
|
91728
89937
|
* it dies is a camera whose death is silent, indefinitely.
|
|
91729
89938
|
*
|
|
@@ -95151,7 +93360,7 @@ function findNextWindowOpen(input) {
|
|
|
95151
93360
|
*
|
|
95152
93361
|
* ## Why this exists
|
|
95153
93362
|
*
|
|
95154
|
-
* Measured on
|
|
93363
|
+
* Measured on 102 the night of 2026-09-16, on the stills actually sent: every
|
|
95155
93364
|
* one of them contained a SECOND vehicle, and nothing in the image or the
|
|
95156
93365
|
* prompt said which one was the subject. The model did what anyone would — it
|
|
95157
93366
|
* invented the relationship between them ("passing a parked car"). The
|
|
@@ -95536,7 +93745,7 @@ function buildSummaryOutboxInputs(input) {
|
|
|
95536
93745
|
* This is not a movement heuristic and deliberately so: `totalDistance` and
|
|
95537
93746
|
* `state` were both measured against live traffic and both hide real passages.
|
|
95538
93747
|
* What they cannot see is the shape this gate is for — a row whose whole life
|
|
95539
|
-
* is one or two frames. Measured on device
|
|
93748
|
+
* is one or two frames. Measured on device 102 (2026-08-19 04:12): two rows,
|
|
95540
93749
|
* `closedReason` NULL so the parked pass is blind to them, dwell 53 ms,
|
|
95541
93750
|
* `totalDistance` 0, two recorded sightings each. And `minImportance` cannot
|
|
95542
93751
|
* cover it either, structurally: the static-track gate that demotes a frozen
|
|
@@ -95704,7 +93913,7 @@ function remainingSummaryCandidates(kept, taken, rank) {
|
|
|
95704
93913
|
* clean whole scene (`keyFrame` → `keyFrameSmall` → `fullFrame`).
|
|
95705
93914
|
*
|
|
95706
93915
|
* ⚠ The whole-scene rungs are a FALLBACK and stay on the ladder. Measured on
|
|
95707
|
-
* 60 real tracks (
|
|
93916
|
+
* 60 real tracks (101/102, 24 h): 52 carry a crop, 43 carry a scene rung, and
|
|
95708
93917
|
* 2 carry a scene rung and NO crop — dropping the fallback would delete those
|
|
95709
93918
|
* two tiles for nothing. A track with neither is dropped, never drawn as an
|
|
95710
93919
|
* empty cell (see `NcSummaryProducer.loadTiles`).
|
|
@@ -97521,7 +95730,7 @@ function timelapseTemplateVars(input) {
|
|
|
97521
95730
|
* **No coverage sentence.** It used to end with one whenever the window was
|
|
97522
95731
|
* short, and it was removed on the operator's instruction: the clause fired on
|
|
97523
95732
|
* every night the recorder had stumbled at all — including once at a printed
|
|
97524
|
-
* *100%* (2026-08-12, device
|
|
95733
|
+
* *100%* (2026-08-12, device 101: 141 s missing out of 10 h, so the window was
|
|
97525
95734
|
* incomplete while the rounded figure was 100) — and a line that cries wolf is
|
|
97526
95735
|
* a line the reader skips, which costs the clauses beside it too. The figure
|
|
97527
95736
|
* is not lost: it rides the `timelapse produced` log line as `coveragePct`,
|
|
@@ -97754,7 +95963,7 @@ var TimelapseScheduler = class {
|
|
|
97754
95963
|
* Eligibility is scanned under a short `scanning` lock so two ticks do not
|
|
97755
95964
|
* double-launch the same pair. Renders themselves are started together —
|
|
97756
95965
|
* awaiting them one-by-one made camera B wait for camera A's ffmpeg
|
|
97757
|
-
* (live: 1441 until 08:39,
|
|
95966
|
+
* (live: 1441 until 08:39, 101 until 08:46, both windows closed at 07:00).
|
|
97758
95967
|
* A later tick that meets a pair already in `inFlight` counts it and
|
|
97759
95968
|
* moves on, so a 30-minute render does not make the producer go deaf.
|
|
97760
95969
|
*/
|
|
@@ -104148,7 +102357,7 @@ function observeAudio(host, deviceId, sample) {
|
|
|
104148
102357
|
* {@link reportOccupancyWatch}, which the audio side simply never had.
|
|
104149
102358
|
*
|
|
104150
102359
|
* Two shapes, deliberately. The summary answers "what does this hub listen
|
|
104151
|
-
* for at all"; the per-camera line answers "why is
|
|
102360
|
+
* for at all"; the per-camera line answers "why is 102 not notifying" — and
|
|
104152
102361
|
* that question is ALWAYS asked per camera, so the line carries
|
|
104153
102362
|
* `tags.deviceId` and a rule scoped to no camera is reported as watching
|
|
104154
102363
|
* every one rather than silently omitted — every one EXCEPT its
|
|
@@ -104199,7 +102408,7 @@ function reportAudioWatch(host, entries) {
|
|
|
104199
102408
|
* sustain: ask the orchestrator for ONE look then. The session that armed
|
|
104200
102409
|
* it often closes first (a car drives off, motion clears) and the next
|
|
104201
102410
|
* sample would otherwise be the 300 s parked-object cadence — 4 min 52 s
|
|
104202
|
-
* late on
|
|
102411
|
+
* late on 102, 2026-10-01. Fire-and-forget: a refusal or a failure costs
|
|
104203
102412
|
* the early commit, never the edge (the cadence still commits it), and is
|
|
104204
102413
|
* said per camera.
|
|
104205
102414
|
*/
|
|
@@ -104342,7 +102551,7 @@ async function persistOccupancyRow(host, row, now) {
|
|
|
104342
102551
|
* **Only an edge that owns NOBODY.** `chooseOccupancyMediaOwner` names a
|
|
104343
102552
|
* member track whenever the scope holds one, and that picture is of the
|
|
104344
102553
|
* counted object itself; a photograph is strictly the stand-in for not having
|
|
104345
|
-
* one. The case this exists for is "posto libero" (camera
|
|
102554
|
+
* one. The case this exists for is "posto libero" (camera 102): the vehicle
|
|
104346
102555
|
* whose departure IS the notification has left, so the scope is empty, the
|
|
104347
102556
|
* ladder resolves nothing and the delivery logged `no still could be resolved
|
|
104348
102557
|
* … owners=[]`. A became-free edge has no owner BY CONSTRUCTION, and a
|
|
@@ -106675,7 +104884,7 @@ function onAlarmPublish(host, report) {
|
|
|
106675
104884
|
*
|
|
106676
104885
|
* `tags.deviceId` carries the SUBJECT's numeric device id (the system
|
|
106677
104886
|
* subject's own `deviceId` is the sentinel {@link NC_SYSTEM_DEVICE_ID}), so
|
|
106678
|
-
* "why is
|
|
104887
|
+
* "why is 102 louder than 2018?" is answerable by grouping. A node- or
|
|
106679
104888
|
* package-scoped exclusion is about no device and carries no tag.
|
|
106680
104889
|
*/
|
|
106681
104890
|
function reportSystemFilterExclusion(host, rule, subject, filter) {
|
|
@@ -109415,7 +107624,7 @@ var NC_TRACKS_AT_INSTANT_LIMIT = 25;
|
|
|
109415
107624
|
* The box TOLERANCE (`toleranceMs`, 750 ms) is about how sparse a trail is —
|
|
109416
107625
|
* a live track keeps a position every few frames — and it must never stretch
|
|
109417
107626
|
* a LIFE. A track born after the frame was not on it: on 2026-10-22 the
|
|
109418
|
-
* tracker split a dog on camera
|
|
107627
|
+
* tracker split a dog on camera 101 and the second piece, born 676 ms after
|
|
109419
107628
|
* the key frame, was drawn at its first box as a second box on the dog. One
|
|
109420
107629
|
* tick (~110–150 ms at that camera's detection rate, rounded up) absorbs the
|
|
109421
107630
|
* gap between a frame and the detection that confirmed it, and nothing more.
|
|
@@ -112563,7 +110772,7 @@ var ObjectEmbeddingStore = class {
|
|
|
112563
110772
|
* own. Both were wrong in the same way, and the second only less obviously:
|
|
112564
110773
|
* a vector's row id IS the trackId — exactly one row per track — so a vector
|
|
112565
110774
|
* is owned by its track completely, and giving it a second clock could only
|
|
112566
|
-
* ever produce disagreement. It did: measured on device
|
|
110775
|
+
* ever produce disagreement. It did: measured on device 104, events back 1.0
|
|
112567
110776
|
* day and embeddings back 22.1, with 1,446 of 2,222 rows pointing at nothing
|
|
112568
110777
|
* that could be rendered.
|
|
112569
110778
|
*
|
|
@@ -116670,7 +114879,7 @@ var SyntheticTrackMaterializer = class {
|
|
|
116670
114879
|
* Like {@link materialize}, but a call inside an open window answers the
|
|
116671
114880
|
* window's OWN marker (awaiting it while it is still landing) with kind
|
|
116672
114881
|
* `debounced`. Two state changes of one doorbell press are one event: the
|
|
116673
|
-
* second must name the same media owner, not none (2026-09-29, camera
|
|
114882
|
+
* second must name the same media owner, not none (2026-09-29, camera 101 —
|
|
116674
114883
|
* the notification that won the rule was the debounced one, and shipped
|
|
116675
114884
|
* without a still).
|
|
116676
114885
|
*/
|
|
@@ -118090,7 +116299,7 @@ var TITLE_LINE_HEIGHT = 1.18;
|
|
|
118090
116299
|
* written — so the fit has to be estimated. It is deliberately generous: a
|
|
118091
116300
|
* title that shrinks slightly more than it had to is invisible, one that
|
|
118092
116301
|
* over-estimates its fit runs off the edge, which is exactly what the first
|
|
118093
|
-
* live preview did (`Timelapse
|
|
116302
|
+
* live preview did (`Timelapse Camera front door 21:00→07:00` touched the
|
|
118094
116303
|
* frame border at 640 px).
|
|
118095
116304
|
*/
|
|
118096
116305
|
var TITLE_GLYPH_ADVANCE = .62;
|
|
@@ -118827,7 +117036,7 @@ var BuildNotificationPorts = class extends BuildNotificationPortsBase {
|
|
|
118827
117036
|
* gates destroy a track before it is written — the confirmation gate
|
|
118828
117037
|
* retracting a suspected false birth, stationary promotion dropping a
|
|
118829
117038
|
* parked object, zero-media suppression cascading a thumbnail-less track
|
|
118830
|
-
* away — and on 2026-08-13 they left camera
|
|
117039
|
+
* away — and on 2026-08-13 they left camera 101 with zero persisted tracks
|
|
118831
117040
|
* across a ten-hour night that held a person pass at 23:31. These rows
|
|
118832
117041
|
* survive all three.
|
|
118833
117042
|
*
|
|
@@ -121294,7 +119503,7 @@ async function streamDataset(deps) {
|
|
|
121294
119503
|
//#region src/pipeline-analytics/training-export/training-export-handler.ts
|
|
121295
119504
|
var TRAINING_EXPORT_PREFIX = "training-export";
|
|
121296
119505
|
/**
|
|
121297
|
-
* Parse `?deviceIds=
|
|
119506
|
+
* Parse `?deviceIds=101,102` into a device list. An absent or unparseable value
|
|
121298
119507
|
* yields `[]`, which the caller reads as "every device with marked tracks" —
|
|
121299
119508
|
* stated here rather than left to the reader because the empty array is doing
|
|
121300
119509
|
* two jobs and only one of them is obvious.
|
|
@@ -121660,7 +119869,7 @@ var TRACKER_FACT_LOG_SAMPLE_EVERY = 10;
|
|
|
121660
119869
|
* positive spawns (review M1: ~1 750 `new` decisions per camera per hour) —
|
|
121661
119870
|
* are sampled harder; the per-minute summary carries their exact counts. */
|
|
121662
119871
|
var TRACKER_PIECE_LOG_SAMPLE_EVERY = 50;
|
|
121663
|
-
/** Out-of-order frames (follow-up
|
|
119872
|
+
/** Out-of-order frames (follow-up 102, F1: ~1 % of frames) log the first N,
|
|
121664
119873
|
* then one in this many — every line carries the count; the per-minute
|
|
121665
119874
|
* summary carries the exact `outOfOrderFrames`. */
|
|
121666
119875
|
var TRACKER_OUT_OF_ORDER_LOG_SAMPLE_EVERY = 50;
|
|
@@ -122410,7 +120619,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
122410
120619
|
* The zone catalogue every OCCUPANCY path reads (live frames, snapshot
|
|
122411
120620
|
* hydration, the parked-object baseline sampler). Mirror-first with a
|
|
122412
120621
|
* capability fallback — see `device-zone-resolver.ts` for why the mirror
|
|
122413
|
-
* alone is not enough (device
|
|
120622
|
+
* alone is not enough (device 102 had a zone the mirror had never heard of).
|
|
122414
120623
|
*/
|
|
122415
120624
|
deviceZones = new DeviceZoneResolver({
|
|
122416
120625
|
readMirror: (deviceId) => this.proxies.get(deviceId)?.state.zones.value?.zones,
|
|
@@ -126661,7 +124870,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
126661
124870
|
*
|
|
126662
124871
|
* The stationary registry answers a different question (is this object parked,
|
|
126663
124872
|
* and should it be suppressed?). This one raises a spawn bar. The dead
|
|
126664
|
-
* ornamental grass on device
|
|
124873
|
+
* ornamental grass on device 101 produced tracks of 3.8 s,
|
|
126665
124874
|
* 4.1 s, 6.5 s and 19.0 s with 0-2.5 px of total displacement, roughly
|
|
126666
124875
|
* fifteen of them in a day, all at the same spot. Each one is individually
|
|
126667
124876
|
* innocent; the RECURRENCE is the signal, and nothing survives a track death
|
|
@@ -128365,8 +126574,8 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
128365
126574
|
* read, then goes through the SAME resolver the live frame path uses.
|
|
128366
126575
|
*
|
|
128367
126576
|
* `readSliceOnce(proxy.state.zones)` used to be the whole body, and it is
|
|
128368
|
-
* exactly what could not answer for device
|
|
128369
|
-
* hub-side (`deviceState.getCapSlice {
|
|
126577
|
+
* exactly what could not answer for device 102: the mirror slice was absent
|
|
126578
|
+
* hub-side (`deviceState.getCapSlice {102,'zones'}` → `null`), so the one
|
|
128370
126579
|
* permitted refresh brought back nothing and hydration fell to `[]` forever.
|
|
128371
126580
|
*/
|
|
128372
126581
|
async resolveDeviceZones(deviceId) {
|
|
@@ -128877,7 +127086,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
128877
127086
|
*
|
|
128878
127087
|
* - `camera-native-cap` is EVERY camera's `motion` slice. Every provider
|
|
128879
127088
|
* binds a native `motion` cap on the camera device and motion churns
|
|
128880
|
-
* continuously (camera
|
|
127089
|
+
* continuously (camera 104 flaps at ~2 Hz), so an `info` here would be a
|
|
128881
127090
|
* log flood measured in millions of lines a day — its own outage.
|
|
128882
127091
|
* - `no-camera` is every sensor in the fleet that no camera links. Since
|
|
128883
127092
|
* D630 §6 it is still EVALUATED by the notification rules (through
|
|
@@ -128886,7 +127095,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
128886
127095
|
*
|
|
128887
127096
|
* What must never happen again is the branch being INVISIBLE: a doorbell
|
|
128888
127097
|
* press that ingested nothing produced not one line for months. A debug line
|
|
128889
|
-
* carrying `deviceId`, `capName`, `kind` and `reason` answers "why is
|
|
127098
|
+
* carrying `deviceId`, `capName`, `kind` and `reason` answers "why is 101
|
|
128890
127099
|
* dark" the moment anyone asks it.
|
|
128891
127100
|
*/
|
|
128892
127101
|
logSensorIngestDrop(data, reason, kind) {
|