@camstack/types 1.2.414 → 1.2.415
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +4 -1798
- package/dist/addon.mjs +2 -1796
- package/dist/capabilities/camera-grid-layout.cap.d.ts +1 -1
- package/dist/capabilities/device-history.cap.d.ts +1 -1
- package/dist/capabilities/device-manager.cap.d.ts +2 -2
- package/dist/capabilities/notification-rules.cap.d.ts +2 -2
- package/dist/capabilities/osd-manager.cap.d.ts +1 -1
- package/dist/capabilities/pipeline-analytics.cap.d.ts +1 -1
- package/dist/capabilities/pipeline-runner.cap.d.ts +1 -1
- package/dist/capabilities/ptz.cap.d.ts +3 -3
- package/dist/capabilities/recording-export.cap.d.ts +1 -1
- package/dist/capabilities/scene-monitor.cap.d.ts +1 -1
- package/dist/capabilities/stream-signals.cap.d.ts +1 -1
- package/dist/capabilities/videoclips.cap.d.ts +2 -2
- package/dist/capabilities/viewer-ui.cap.d.ts +1 -1
- package/dist/catalogs/index.d.ts +1 -1
- package/dist/catalogs/{frigate-plus-classmap.d.ts → plus-catalog-classmap.d.ts} +25 -25
- package/dist/catalogs/root-model-supply.d.ts +3 -3
- package/dist/client.js +22 -22
- package/dist/client.mjs +22 -22
- package/dist/composition/cards/__fixtures__/stored-compositions.d.ts +2 -2
- package/dist/composition/customize/__fixtures__/refs.d.ts +1 -1
- package/dist/{composition-CSLSFGTO.js → composition-DsmkwP9-.js} +1 -1
- package/dist/{composition-BJ8iAZb3.mjs → composition-kEl9mevu.mjs} +1 -1
- package/dist/device/base-device-provider.d.ts +1 -1
- package/dist/device/device-state-handle.d.ts +1 -1
- package/dist/device/location-icon.d.ts +1 -1
- package/dist/device/site-zone.d.ts +2 -2
- package/dist/enums/event-category.d.ts +1 -1
- package/dist/enums.js +1 -1
- package/dist/enums.mjs +1 -1
- package/dist/{event-category-Ceif8n-v.mjs → event-category-DHXxB8t9.mjs} +1 -1
- package/dist/{event-category-DG6Vir8Z.js → event-category-DXZ3f9Q5.js} +1 -1
- package/dist/ffmpeg/fmp4-fragment-plane.d.ts +1 -1
- package/dist/ffmpeg/gif-derive.d.ts +1 -1
- package/dist/ffmpeg/process.d.ts +1 -1
- package/dist/generated/addon-cap-facts.d.ts +2 -0
- package/dist/geometry/subject-path.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1516 -1516
- package/dist/index.mjs +1510 -1510
- package/dist/interfaces/addon-peer-bytes.d.ts +1 -1
- package/dist/interfaces/agent.d.ts +1 -1
- package/dist/interfaces/birth-decision-ledger.d.ts +1 -1
- package/dist/interfaces/debug-note-archive.d.ts +1 -1
- package/dist/interfaces/inference-engine.d.ts +1 -1
- package/dist/interfaces/logging.d.ts +1 -1
- package/dist/metrics/failure-counters.d.ts +2 -2
- package/dist/node.js +2 -2
- package/dist/node.mjs +2 -2
- package/dist/notification/timelapse-rule.d.ts +1 -1
- package/dist/pipeline/root-face-crop.d.ts +1 -1
- package/dist/pipeline/second-pass/motion-crop-plan.d.ts +1 -1
- package/dist/pipeline/second-pass/small-subject-recovery.d.ts +4 -4
- package/dist/process/child-cost-registry.d.ts +1 -1
- package/dist/{sleep-CYfIZzGv.mjs → sleep-BErAxhul.mjs} +1982 -4
- package/dist/{sleep-UP964hNP.js → sleep-BPQ2ZyaI.js} +1999 -3
- package/dist/types/detection.d.ts +2 -2
- package/dist/types/models.d.ts +3 -3
- package/dist/types/overlay-layer.d.ts +1 -1
- package/dist/utils/addon-id.d.ts +1 -1
- package/package.json +1 -1
|
@@ -78,7 +78,7 @@ declare const GridLayoutCellSchema: z.ZodObject<{
|
|
|
78
78
|
*
|
|
79
79
|
* A grid's `high` composes its sources' `high` and its `low` their `low`, so a
|
|
80
80
|
* profile is on offer only when EVERY source can serve it. The refusal NAMES
|
|
81
|
-
* the sources, because "this grid has no low" is not a finding — "
|
|
81
|
+
* the sources, because "this grid has no low" is not a finding — "101 has no
|
|
82
82
|
* low" is, and it is the one an operator can act on.
|
|
83
83
|
*/
|
|
84
84
|
declare const GridProfileOfferSchema: z.ZodObject<{
|
|
@@ -385,7 +385,7 @@ export declare const deviceHistoryCapability: {
|
|
|
385
385
|
}, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
|
|
386
386
|
/**
|
|
387
387
|
* A NODE's series. The subject is `forNodeId`, never `nodeId`: a top-level
|
|
388
|
-
* `nodeId` is the cap ROUTING key, and `nodeId: '
|
|
388
|
+
* `nodeId` is the cap ROUTING key, and `nodeId: 'agent-a'` sent the
|
|
389
389
|
* read to that agent, which hosts no device-history.
|
|
390
390
|
*/
|
|
391
391
|
readonly listNodeSeries: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
|
|
@@ -790,7 +790,7 @@ export declare const deviceManagerCapability: {
|
|
|
790
790
|
* The room's ICON travels with the rename, including when `from` was
|
|
791
791
|
* never registered — otherwise it orphans on a key no location carries
|
|
792
792
|
* any more. A merge keeps the TARGET's icon when it has one: renaming
|
|
793
|
-
* "Sala" into "
|
|
793
|
+
* "Sala" into "Hall" moves devices into Hall, it does not restyle
|
|
794
794
|
* it. */
|
|
795
795
|
readonly renameLocation: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
|
|
796
796
|
from: z.ZodString;
|
|
@@ -861,7 +861,7 @@ export declare const deviceManagerCapability: {
|
|
|
861
861
|
description: z.ZodNullable<z.ZodString>;
|
|
862
862
|
}, z.core.$strip>, z.ZodVoid, "mutation">;
|
|
863
863
|
/** Every SITE ZONE — a named part of the property that groups locations
|
|
864
|
-
* ("
|
|
864
|
+
* ("Night zone" holds the bedrooms). One call answers the whole picture:
|
|
865
865
|
* key, the label as typed, the icon, and the locations inside.
|
|
866
866
|
*
|
|
867
867
|
* Together, because a surface that asked for membership separately could
|
|
@@ -4476,8 +4476,8 @@ export type NcAlarmSensors = z.infer<typeof NcAlarmSensorsSchema>;
|
|
|
4476
4476
|
* own `sustainSeconds` (29 s on this hub), so its clip is anchored well in the
|
|
4477
4477
|
* past — and the other source, the recordings, cannot cover a recent moment:
|
|
4478
4478
|
* measured against `recording.getAvailability` for a 10 s window at several
|
|
4479
|
-
* anchors, full coverage arrived at −18 s on device
|
|
4480
|
-
*
|
|
4479
|
+
* anchors, full coverage arrived at −18 s on device 104 and −26 s on 101 and
|
|
4480
|
+
* 102. That edge is a PHASE of the 10-second segment cycle, not a number. The
|
|
4481
4481
|
* ring therefore has to hold the moment until the recordings can take it over:
|
|
4482
4482
|
* the worst measured phase (26 s) plus the confirmation lag (29 s) is 55 s, and
|
|
4483
4483
|
* 60 is the round number above it.
|
|
@@ -11,7 +11,7 @@ import { type InferProvider } from './capability-definition.js';
|
|
|
11
11
|
* This cap owns the other half: a per-(camera, slot) BINDING that says
|
|
12
12
|
* which value feeds the slot, how it is formatted, and under which
|
|
13
13
|
* conditions it is shown at all. Named TEMPLATES combine many device
|
|
14
|
-
* fields into one overlay string (
|
|
14
|
+
* fields into one overlay string (plugin catalog OSD Manager parity).
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
17
17
|
* How a parser token expands one binding. Not stored on the binding —
|
|
@@ -7470,7 +7470,7 @@ export declare const pipelineAnalyticsCapability: {
|
|
|
7470
7470
|
* audio, stopping at the first hit — so on the live hub, where object
|
|
7471
7471
|
* events own no media of their own and 299 883 of 300 559 media rows are
|
|
7472
7472
|
* motion-owned, EVERY object event resolved to its motion namesake. A
|
|
7473
|
-
* track from 17:34 on camera
|
|
7473
|
+
* track from 17:34 on camera 101 was served a snapshot from 22:35 eleven
|
|
7474
7474
|
* days earlier, silently.
|
|
7475
7475
|
*
|
|
7476
7476
|
* D476 had already disambiguated the KEY (`motion:` vs `object:`); this is
|
|
@@ -931,7 +931,7 @@ export declare const pipelineRunnerCapability: {
|
|
|
931
931
|
*
|
|
932
932
|
* The periodic recheck (`occupancyRecheckSec`, 300 s) exists to watch a
|
|
933
933
|
* still scene. It is the wrong instrument for a QUESTION that has just been
|
|
934
|
-
* asked: on device
|
|
934
|
+
* asked: on device 102 a parked car's departure was observed, a departure
|
|
935
935
|
* strike was armed — and then the motion session ended, the strike decayed
|
|
936
936
|
* after its 30 s TTL, and the next periodic look arrived up to five minutes
|
|
937
937
|
* later with nothing left to confirm. Every one of those departures was
|
|
@@ -110,9 +110,9 @@ declare const PtzOptionsSchema: z.ZodObject<{
|
|
|
110
110
|
* Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
|
|
111
111
|
* not one of the three cameras honours its own:
|
|
112
112
|
*
|
|
113
|
-
*
|
|
114
|
-
* 1438
|
|
115
|
-
* 3836
|
|
113
|
+
* 107 Camera camera Carol (reolink) preset 0 holds "stanza"
|
|
114
|
+
* 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
|
|
115
|
+
* 3836 Camera studio (amcrest) preset 1 holds "Preset1"
|
|
116
116
|
*
|
|
117
117
|
* So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
|
|
118
118
|
* and two of the three swallowed the failure in a bare `catch`. For autotrack
|
|
@@ -31,7 +31,7 @@ export declare const ExportSpeedSchema: z.ZodNumber;
|
|
|
31
31
|
* on a 10 h window holding 29,393 s of footage every range landed late by the
|
|
32
32
|
* gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
|
|
33
33
|
* the video was a uniform timelapse, and the log line reported the five ranges
|
|
34
|
-
* that had been ASKED for (2026-08-13, export `57d14363`, camera
|
|
34
|
+
* that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
|
|
35
35
|
*
|
|
36
36
|
* Relative and not absolute epoch, because an absolute epoch would make every
|
|
37
37
|
* call site responsible for the same subtraction.
|
|
@@ -13,7 +13,7 @@ import { type InferNativeProvider } from './capability-definition.js';
|
|
|
13
13
|
* which put a "Scenes" tab on one camera's detail page. That is the wrong shape
|
|
14
14
|
* for the thing: a scene is a standing question about the property ("is the bin
|
|
15
15
|
* still out"), and the operator's question is "which of my scenes have tripped",
|
|
16
|
-
* across every camera at once — not "what does camera
|
|
16
|
+
* across every camera at once — not "what does camera 102 think". Buried one
|
|
17
17
|
* camera deep it also could not be found. The surface is now a top-level admin
|
|
18
18
|
* page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
|
|
19
19
|
* picks the camera inside the create flow, the same shape Events and Faces have.
|
|
@@ -5,7 +5,7 @@ import { DeviceType } from '../device/device-type.js';
|
|
|
5
5
|
* The signals a device can emit to WAKE its own stream.
|
|
6
6
|
*
|
|
7
7
|
* A camera whose stream is built on demand sleeps until something asks for it,
|
|
8
|
-
* and "something" cannot be a consumer that is merely attached — a
|
|
8
|
+
* and "something" cannot be a consumer that is merely attached — a external-catalog
|
|
9
9
|
* puller holds a session open for ever, and treating that as demand would keep
|
|
10
10
|
* a battery camera awake for ever, which is the whole thing the battery is for
|
|
11
11
|
* (D173). So the wake has to come from the CAMERA: an event it noticed by
|
|
@@ -19,7 +19,7 @@ import { type InferProvider } from './capability-definition.js';
|
|
|
19
19
|
* device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
|
|
20
20
|
* what says a provider serves this camera, never the set of addons that
|
|
21
21
|
* happen to have registered the capability somewhere in the cluster. That is
|
|
22
|
-
* what stopped one addon appearing three times on
|
|
22
|
+
* what stopped one addon appearing three times on 107 — as the device's
|
|
23
23
|
* native provider, as the hub-local registration and as an
|
|
24
24
|
* `<addonId>@<nodeId>` one (D554 amended 2026-09-20).
|
|
25
25
|
*
|
|
@@ -203,7 +203,7 @@ export type ClipPlayback = z.infer<typeof ClipPlaybackSchema>;
|
|
|
203
203
|
* camera has no recordings", which is the defect this whole line of work is
|
|
204
204
|
* about: a battery camera nobody woke (`sleeping`), a camera that could not be
|
|
205
205
|
* reached at all (`unreachable`, also what a provider that THREW reports), a
|
|
206
|
-
* camera whose SD card is not mounted (`no-storage`, measured on
|
|
206
|
+
* camera whose SD card is not mounted (`no-storage`, measured on 106 —
|
|
207
207
|
* `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
|
|
208
208
|
* camera whose OWN index disagrees with its OWN calendar (`index-empty`,
|
|
209
209
|
* measured on 618: the calendar marks 3–20 September, days 6–20 list zero
|
|
@@ -20,7 +20,7 @@ export declare const viewerUiCapability: {
|
|
|
20
20
|
* `getStaticDir` leaks a hub filesystem path.
|
|
21
21
|
*
|
|
22
22
|
* ⚠ Checked before gating: the VIEWER app IS used by a non-admin user
|
|
23
|
-
* (`
|
|
23
|
+
* (`bob`), but it never calls `viewerUi.*` over tRPC. The static SPA
|
|
24
24
|
* it loads is served by the plain `GET /viewer/*` Fastify route in
|
|
25
25
|
* `main.ts`, which reads `staticDir`/`indexPath` from a module-level
|
|
26
26
|
* cache populated ONCE at boot via `capRegistry.getSingletonForNode`
|
package/dist/catalogs/index.d.ts
CHANGED
|
@@ -3,11 +3,11 @@ import type { RootStepSupply } from '../types/models.js';
|
|
|
3
3
|
/** A macro a detection catalog classMap may resolve to. */
|
|
4
4
|
export type ClassMapMacroTarget = (typeof CLASS_MAP_MACRO_TARGETS)[number];
|
|
5
5
|
/**
|
|
6
|
-
* Raw
|
|
7
|
-
*
|
|
8
|
-
* here or in {@link
|
|
6
|
+
* Raw plus catalog label → detection macro. Every label of the documented
|
|
7
|
+
* plus catalog base set (docs.frigate.video/plus, verified 2026-08-21) is either
|
|
8
|
+
* here or in {@link PLUS_CATALOG_UNMAPPED_LABELS}, with the reason it is not.
|
|
9
9
|
*
|
|
10
|
-
* Why this exists: a
|
|
10
|
+
* Why this exists: a plus catalog import used to carry NO classMap, so it inherited
|
|
11
11
|
* the step's `COCO_TO_MACRO` (`preserveOriginal: false`) and the executor
|
|
12
12
|
* dropped every label COCO does not name — deer, raccoon, fox, squirrel, goat,
|
|
13
13
|
* rabbit, skunk, kangaroo, possum, rodent, school_bus, garbage_truck and even
|
|
@@ -15,11 +15,11 @@ export type ClassMapMacroTarget = (typeof CLASS_MAP_MACRO_TARGETS)[number];
|
|
|
15
15
|
* label as `originalClass` whenever the map resolves it, so the fine identity
|
|
16
16
|
* survives under the macro.
|
|
17
17
|
*/
|
|
18
|
-
export declare const
|
|
18
|
+
export declare const PLUS_CATALOG_TO_MACRO: Readonly<Record<string, ClassMapMacroTarget>>;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* plus catalog labels deliberately left OUT of {@link PLUS_CATALOG_TO_MACRO}.
|
|
21
21
|
*
|
|
22
|
-
* - `attribute`:
|
|
22
|
+
* - `attribute`: plus catalog emits these INSIDE a parent box (a face inside a
|
|
23
23
|
* person, a plate or a carrier logo on a vehicle). Mapping one to its
|
|
24
24
|
* parent's macro would spawn a second, overlapping track for the same
|
|
25
25
|
* subject. `face` and `license_plate` are instead declared as CROP supplies
|
|
@@ -27,46 +27,46 @@ export declare const FRIGATE_PLUS_TO_MACRO: Readonly<Record<string, ClassMapMacr
|
|
|
27
27
|
* it, when the face / plate step uses the root model.
|
|
28
28
|
* - `no-macro`: an object with no detection macro to live under.
|
|
29
29
|
*/
|
|
30
|
-
export declare const
|
|
30
|
+
export declare const PLUS_CATALOG_UNMAPPED_LABELS: Readonly<Record<string, 'attribute' | 'no-macro'>>;
|
|
31
31
|
/**
|
|
32
|
-
* The per-model classMap for a
|
|
33
|
-
* labelmap: each label resolves through {@link
|
|
34
|
-
* then `COCO_TO_MACRO` (
|
|
32
|
+
* The per-model classMap for a plus catalog / plus catalog detector, derived from ITS
|
|
33
|
+
* labelmap: each label resolves through {@link PLUS_CATALOG_TO_MACRO} first,
|
|
34
|
+
* then `COCO_TO_MACRO` (plus catalog's default model ships the COCO-91 labelmap, so
|
|
35
35
|
* a preset import may carry either vocabulary). A label neither knows is left
|
|
36
36
|
* out, and `preserveOriginal: false` drops it in the executor — the same
|
|
37
|
-
* contract as the COCO map, now with the
|
|
37
|
+
* contract as the COCO map, now with the plus catalog vocabulary in it.
|
|
38
38
|
*/
|
|
39
|
-
export declare function
|
|
40
|
-
/** The label-derived fields of a
|
|
41
|
-
export interface
|
|
39
|
+
export declare function buildPlusCatalogClassMap(labels: readonly string[]): DetectionCatalogClassMap;
|
|
40
|
+
/** The label-derived fields of a plus catalog catalog entry. */
|
|
41
|
+
export interface PlusCatalogLabelFields {
|
|
42
42
|
readonly classMap: DetectionCatalogClassMap;
|
|
43
43
|
readonly suppliesSteps?: readonly RootStepSupply[];
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
* Everything a
|
|
46
|
+
* Everything a plus catalog / plus catalog entry derives from ITS OWN labelmap: the
|
|
47
47
|
* classMap and the steps it can supply (D730) — label and crop kinds alike.
|
|
48
|
-
* Every
|
|
48
|
+
* Every plus catalog builder spreads this at import, so the two cannot be derived
|
|
49
49
|
* from different label lists, and no family is assumed to carry a label it
|
|
50
50
|
* does not list.
|
|
51
51
|
*/
|
|
52
|
-
export declare function
|
|
52
|
+
export declare function plusCatalogLabelFields(labels: readonly string[]): PlusCatalogLabelFields;
|
|
53
53
|
/**
|
|
54
|
-
* Per-class confidence-floor defaults of an imported stock
|
|
54
|
+
* Per-class confidence-floor defaults of an imported stock plus catalog detector
|
|
55
55
|
* (D738): its per-detection `min_score` default, 0.5, for every class. Its
|
|
56
56
|
* track-level `threshold` (the median of a track's recent scores) has no
|
|
57
57
|
* counterpart in CamStack's per-detection floors and is not carried.
|
|
58
58
|
*/
|
|
59
|
-
export declare const
|
|
59
|
+
export declare const PLUS_CATALOG_STOCK_CLASS_FLOORS: Readonly<Record<string, number>>;
|
|
60
60
|
/**
|
|
61
|
-
* Per-class floor defaults of an imported
|
|
62
|
-
* documented starting `min_score` values for
|
|
61
|
+
* Per-class floor defaults of an imported plus catalog detector (D738): the
|
|
62
|
+
* documented starting `min_score` values for plus catalog models, which score
|
|
63
63
|
* higher than the stock ones (person 0.65, car 0.65, cat 0.65, dog 0.70). The
|
|
64
64
|
* macro `animal` takes the lower of its classes, so no class is cut above its
|
|
65
65
|
* documented value.
|
|
66
66
|
*/
|
|
67
|
-
export declare const
|
|
67
|
+
export declare const PLUS_CATALOG_CLASS_FLOORS: Readonly<Record<string, number>>;
|
|
68
68
|
/**
|
|
69
|
-
* The `defaultClassFloors` an imported
|
|
69
|
+
* The `defaultClassFloors` an imported plus catalog entry carries: the import's
|
|
70
70
|
* own, when it states them, else the defaults of its kind. A fresh object.
|
|
71
71
|
*/
|
|
72
|
-
export declare function
|
|
72
|
+
export declare function plusCatalogDefaultClassFloors(kind: 'stock' | 'plus', carried?: Readonly<Record<string, number>>): Record<string, number>;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* detector can supply from its own output, how, and whether the camera uses it.
|
|
4
4
|
*
|
|
5
5
|
* A root detector's labels can already be the effect a step exists to produce:
|
|
6
|
-
* a
|
|
6
|
+
* a plus catalog model emits `deer`, `car`, `package`, a COCO model emits `dog`,
|
|
7
7
|
* `bus`. Some also emit the CHILD boxes a detail step exists to find: a
|
|
8
|
-
*
|
|
8
|
+
* plus catalog `license_plate` inside a car, a `face` inside a person. Every root
|
|
9
9
|
* model DECLARES what it can supply (`ModelCatalogEntry.suppliesSteps`),
|
|
10
10
|
* derived from its own labelmap and classMap by {@link deriveRootSupplies} —
|
|
11
11
|
* never assumed per family. Whether a camera USES that is the step's own
|
|
@@ -128,7 +128,7 @@ export interface SupplyClassMap {
|
|
|
128
128
|
* - label kind: a label counts for a step only when the classMap sends it to
|
|
129
129
|
* that step's macro AND it names a vocabulary entry. Every root is judged
|
|
130
130
|
* the same way — a COCO model supplies the animal classifier with the six
|
|
131
|
-
* species COCO names, exactly as a
|
|
131
|
+
* species COCO names, exactly as a plus catalog model supplies seven.
|
|
132
132
|
* - crop kind: the labelmap carries one of the step's root labels. Those
|
|
133
133
|
* labels are deliberately left out of the classMap, so they never make a
|
|
134
134
|
* track of their own.
|
package/dist/client.js
CHANGED
|
@@ -23243,7 +23243,7 @@ var NcConditionsSchema = zod.z.object({
|
|
|
23243
23243
|
* with the list under it is worse than no switch (D62).
|
|
23244
23244
|
*
|
|
23245
23245
|
* MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
|
|
23246
|
-
* renameable, and a rule authored on "
|
|
23246
|
+
* renameable, and a rule authored on "Alice" went silently dark the moment
|
|
23247
23247
|
* the operator fixed the spelling. The id reaches the record on
|
|
23248
23248
|
* `LabelAttribution.identityId`; the name is what the editor shows and what
|
|
23249
23249
|
* `{{label}}` renders.
|
|
@@ -23807,7 +23807,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
|
|
|
23807
23807
|
* A rule scoped to one camera and one zone silently became a rule that
|
|
23808
23808
|
* matches EVERY event on EVERY camera, and lost its `media` policy
|
|
23809
23809
|
* (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
|
|
23810
|
-
* live on 2026-08-12: a rule scoped to device
|
|
23810
|
+
* live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
|
|
23811
23811
|
* within a minute of a two-field patch.
|
|
23812
23812
|
*
|
|
23813
23813
|
* So every defaulted field is re-declared here WITHOUT its default. The
|
|
@@ -25002,7 +25002,7 @@ var ClipSchema = zod.z.object({
|
|
|
25002
25002
|
* {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
|
|
25003
25003
|
*
|
|
25004
25004
|
* Bounded because it is not a payload the surface pages through: one visit on
|
|
25005
|
-
* device
|
|
25005
|
+
* device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
|
|
25006
25006
|
* camera-day. Read {@link eventCount} for the true total.
|
|
25007
25007
|
*/
|
|
25008
25008
|
eventIds: zod.z.array(zod.z.string()).optional(),
|
|
@@ -25147,7 +25147,7 @@ var ClipPlaybackSchema = zod.z.object({
|
|
|
25147
25147
|
* camera has no recordings", which is the defect this whole line of work is
|
|
25148
25148
|
* about: a battery camera nobody woke (`sleeping`), a camera that could not be
|
|
25149
25149
|
* reached at all (`unreachable`, also what a provider that THREW reports), a
|
|
25150
|
-
* camera whose SD card is not mounted (`no-storage`, measured on
|
|
25150
|
+
* camera whose SD card is not mounted (`no-storage`, measured on 106 —
|
|
25151
25151
|
* `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
|
|
25152
25152
|
* camera whose OWN index disagrees with its OWN calendar (`index-empty`,
|
|
25153
25153
|
* measured on 618: the calendar marks 3–20 September, days 6–20 list zero
|
|
@@ -25461,7 +25461,7 @@ DeviceType.Camera, method(zod.z.object({
|
|
|
25461
25461
|
*
|
|
25462
25462
|
* It was optional, documented as "absent means the device's BOUND
|
|
25463
25463
|
* provider, which is CamStack on every camera". No code implemented
|
|
25464
|
-
* that. Measured on the live hub 2026-09-20 — device
|
|
25464
|
+
* that. Measured on the live hub 2026-09-20 — device 107, bound to
|
|
25465
25465
|
* `recorder` AND `provider-reolink` — a bare call with `limit: 3`
|
|
25466
25466
|
* answered SIX rows, three from each source, merged newest-first:
|
|
25467
25467
|
* `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
|
|
@@ -25854,7 +25854,7 @@ var ExportSpeedSchema = zod.z.number().min(.25).max(32);
|
|
|
25854
25854
|
* on a 10 h window holding 29,393 s of footage every range landed late by the
|
|
25855
25855
|
* gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
|
|
25856
25856
|
* the video was a uniform timelapse, and the log line reported the five ranges
|
|
25857
|
-
* that had been ASKED for (2026-08-13, export `57d14363`, camera
|
|
25857
|
+
* that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
|
|
25858
25858
|
*
|
|
25859
25859
|
* Relative and not absolute epoch, because an absolute epoch would make every
|
|
25860
25860
|
* call site responsible for the same subtraction.
|
|
@@ -28943,7 +28943,7 @@ var LABEL_CONDITION_IDS = new Set(["sensorKinds"]);
|
|
|
28943
28943
|
* maps COCO onto the macro and drops the rest). A sub-type therefore names a key
|
|
28944
28944
|
* that does not exist — the counter is 0 forever and the rule cannot fire.
|
|
28945
28945
|
*
|
|
28946
|
-
* Live cost, 2026-08-12: two rules on device
|
|
28946
|
+
* Live cost, 2026-08-12: two rules on device 102 were authored with `car`
|
|
28947
28947
|
* because this picker offered the whole taxonomy. They were silent for a day.
|
|
28948
28948
|
*/
|
|
28949
28949
|
var COUNT_CLASS_CONDITION_IDS = new Set(["occupancy"]);
|
|
@@ -30305,7 +30305,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
30305
30305
|
{
|
|
30306
30306
|
name: "summaryStreams",
|
|
30307
30307
|
label: "Summary: streams offline",
|
|
30308
|
-
example: "
|
|
30308
|
+
example: "Front door (high) — since 06:40",
|
|
30309
30309
|
kinds: ["stream-offline", "stream-online"]
|
|
30310
30310
|
},
|
|
30311
30311
|
{
|
|
@@ -30323,13 +30323,13 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
30323
30323
|
{
|
|
30324
30324
|
name: "summaryDetection",
|
|
30325
30325
|
label: "Summary: cameras detecting nothing",
|
|
30326
|
-
example: "
|
|
30326
|
+
example: "Front door — since 05:10",
|
|
30327
30327
|
kinds: ["detection-blind"]
|
|
30328
30328
|
},
|
|
30329
30329
|
{
|
|
30330
30330
|
name: "summaryNodes",
|
|
30331
30331
|
label: "Summary: nodes",
|
|
30332
|
-
example: "
|
|
30332
|
+
example: "agent-a — offline since 03:00",
|
|
30333
30333
|
kinds: [
|
|
30334
30334
|
"node-offline",
|
|
30335
30335
|
"node-online",
|
|
@@ -30413,7 +30413,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30413
30413
|
{
|
|
30414
30414
|
name: "camera",
|
|
30415
30415
|
label: "Camera",
|
|
30416
|
-
example: "
|
|
30416
|
+
example: "Front door",
|
|
30417
30417
|
group: "subject",
|
|
30418
30418
|
families: ["rule", "timelapse"],
|
|
30419
30419
|
systemEventKinds: [...DEVICE_EVENTS, "export-completed"]
|
|
@@ -30581,7 +30581,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30581
30581
|
{
|
|
30582
30582
|
name: "rule",
|
|
30583
30583
|
label: "Rule name",
|
|
30584
|
-
example: "
|
|
30584
|
+
example: "Front door notte",
|
|
30585
30585
|
group: "rule",
|
|
30586
30586
|
families: [
|
|
30587
30587
|
"rule",
|
|
@@ -30682,7 +30682,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30682
30682
|
{
|
|
30683
30683
|
name: "deviceName",
|
|
30684
30684
|
label: "Device",
|
|
30685
|
-
example: "
|
|
30685
|
+
example: "Front door",
|
|
30686
30686
|
group: "system",
|
|
30687
30687
|
families: ["rule"],
|
|
30688
30688
|
fields: [...RULE_TEXT],
|
|
@@ -30692,7 +30692,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30692
30692
|
{
|
|
30693
30693
|
name: "locations",
|
|
30694
30694
|
label: "Intrusion locations",
|
|
30695
|
-
example: "
|
|
30695
|
+
example: "Front door, Hallway, Hall",
|
|
30696
30696
|
group: "system",
|
|
30697
30697
|
families: ["rule"],
|
|
30698
30698
|
fields: [...RULE_TEXT],
|
|
@@ -30702,7 +30702,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30702
30702
|
{
|
|
30703
30703
|
name: "deviceId",
|
|
30704
30704
|
label: "Device id",
|
|
30705
|
-
example: "
|
|
30705
|
+
example: "102",
|
|
30706
30706
|
group: "system",
|
|
30707
30707
|
families: ["rule"],
|
|
30708
30708
|
fields: [...RULE_TEXT],
|
|
@@ -30790,7 +30790,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30790
30790
|
{
|
|
30791
30791
|
name: "nodeName",
|
|
30792
30792
|
label: "Node name",
|
|
30793
|
-
example: "
|
|
30793
|
+
example: "agent-a",
|
|
30794
30794
|
group: "system",
|
|
30795
30795
|
families: ["rule"],
|
|
30796
30796
|
fields: [...RULE_TEXT],
|
|
@@ -30811,7 +30811,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
30811
30811
|
name: "devices",
|
|
30812
30812
|
label: "Devices",
|
|
30813
30813
|
description: "node-inference-unavailable: the affected cameras, comma-joined. Alarm arm / arming / refusal: HOW MANY devices are armed (or open).",
|
|
30814
|
-
example: "
|
|
30814
|
+
example: "Front door, Garage",
|
|
30815
30815
|
group: "system",
|
|
30816
30816
|
families: ["rule"],
|
|
30817
30817
|
fields: [...RULE_TEXT],
|
|
@@ -31012,7 +31012,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
31012
31012
|
name: "nodes",
|
|
31013
31013
|
label: "Nodes",
|
|
31014
31014
|
description: "Comma-joined node ids, when an update spans more than one — the single-node case names it through {{nodeId}} instead. `incomingFromUpdateAvailable` (event-intake.ts) fills `nodes` from ONE shared textParams object for both addon- and server-update-available, exactly like packageName/currentVersion/latestVersion/count — only the shipped TEXT (system.server-update-available.body.onNodes) reads it today, but the var is real on both kinds.",
|
|
31015
|
-
example: "hub,
|
|
31015
|
+
example: "hub, agent-a",
|
|
31016
31016
|
group: "system",
|
|
31017
31017
|
families: ["rule"],
|
|
31018
31018
|
fields: [...RULE_TEXT],
|
|
@@ -31123,7 +31123,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
31123
31123
|
{
|
|
31124
31124
|
name: "title",
|
|
31125
31125
|
label: "Export or alert title",
|
|
31126
|
-
example: "
|
|
31126
|
+
example: "Front door 08:00",
|
|
31127
31127
|
group: "system",
|
|
31128
31128
|
families: ["rule"],
|
|
31129
31129
|
fields: [...RULE_TEXT],
|
|
@@ -31237,7 +31237,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
31237
31237
|
name: "names",
|
|
31238
31238
|
label: "Device names",
|
|
31239
31239
|
description: "Armed / arming: the Active devices (or every skipped name when none are Active). Refusal: the open sensors.",
|
|
31240
|
-
example: "
|
|
31240
|
+
example: "Front door, Garage",
|
|
31241
31241
|
group: "system",
|
|
31242
31242
|
families: ["rule"],
|
|
31243
31243
|
fields: [...RULE_TEXT],
|
|
@@ -31285,7 +31285,7 @@ var NC_TEMPLATE_VARS = [
|
|
|
31285
31285
|
name: "bypassedNames",
|
|
31286
31286
|
label: "Bypassed sensors",
|
|
31287
31287
|
description: "Sensors the operator armed around because they were open.",
|
|
31288
|
-
example: "Finestra
|
|
31288
|
+
example: "Finestra porch",
|
|
31289
31289
|
group: "system",
|
|
31290
31290
|
families: ["rule"],
|
|
31291
31291
|
fields: [...RULE_TEXT],
|
|
@@ -32102,7 +32102,7 @@ var TimelapseRuleInputSchema = zod.z.object({
|
|
|
32102
32102
|
* The caption a rule that never set one gets.
|
|
32103
32103
|
*
|
|
32104
32104
|
* Rendered through the ordinary `{{var}}` pass at delivery, so a rule created
|
|
32105
|
-
* before this field existed still reads "Timelapse
|
|
32105
|
+
* before this field existed still reads "Timelapse Camera front door" and
|
|
32106
32106
|
* not the literal braces.
|
|
32107
32107
|
*/
|
|
32108
32108
|
var DEFAULT_TIMELAPSE_PREVIEW_TEXT = "Timelapse {{camera}}";
|