@camstack/addon-post-analysis 1.2.73 → 1.2.74

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.
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-Cv9dO26A.mjs
1
+ //#region ../types/dist/event-category-Bxo5yJjt.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -205,6 +205,33 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
205
205
  EventCategory["PipelineCameraAssigned"] = "pipeline.camera-assigned";
206
206
  EventCategory["PipelineCameraUnassigned"] = "pipeline.camera-unassigned";
207
207
  /**
208
+ * A node the orchestrator would otherwise place cameras on has NO usable
209
+ * inference device: the operator enabled one or more accelerators there and
210
+ * the live probe reports every one of them unavailable. Emitted once per
211
+ * TRANSITION into that state (never per dispatch), and the node is dropped
212
+ * from the placement candidate set for as long as it holds.
213
+ *
214
+ * This exists because the state was previously invisible: little-unraid
215
+ * absorbed 283k inference errors in a day while still being handed cameras,
216
+ * and nothing in the system said so.
217
+ *
218
+ * A node with no accelerators configured at all is NOT this — its devices
219
+ * are `disabled`, not `unavailable`, and the runner's default CPU pool
220
+ * serves it exactly as before.
221
+ */
222
+ EventCategory["PipelineNodeInferenceUnavailable"] = "pipeline.node-inference-unavailable";
223
+ /**
224
+ * A camera has an OPEN detection session and has produced no detection at
225
+ * all for longer than the blind threshold — the camera is being decoded and
226
+ * inferred and is returning nothing. Emitted once per transition into blind,
227
+ * per camera.
228
+ *
229
+ * The failure it reports: a 1h43 detection blackout on the entrance camera
230
+ * that nobody noticed, because "a camera that detects nothing" and "a quiet
231
+ * camera" produce byte-identical silence.
232
+ */
233
+ EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
234
+ /**
208
235
  * Per-camera pipeline config was mutated by the orchestrator
209
236
  * (3-level settings change via `setAgentAddonDefaults` /
210
237
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -14549,6 +14576,8 @@ var NcSystemEventKindSchema = _enum([
14549
14576
  "stream-offline",
14550
14577
  "node-online",
14551
14578
  "node-offline",
14579
+ "node-inference-unavailable",
14580
+ "detection-blind",
14552
14581
  "addon-update-available",
14553
14582
  "server-update-available",
14554
14583
  "alarm-triggered",
@@ -15356,7 +15385,50 @@ var NcRuleInputSchema = object({
15356
15385
  * tests every zone the track visited and a `crossing` condition can no longer
15357
15386
  * be satisfied, because a closed track carries no crossing.
15358
15387
  */
15359
- waitForEnhancement: boolean().optional()
15388
+ waitForEnhancement: boolean().optional(),
15389
+ /**
15390
+ * GROUP a burst of subjects into ONE notification that grows.
15391
+ *
15392
+ * Seconds of quiet after the last matching subject before the burst is
15393
+ * considered over. While it is open, the first subject enqueues immediately —
15394
+ * **exactly as today, with no added latency** — and every real growth (a new
15395
+ * subject, or a name confirmed on one already in it) REPLACES that
15396
+ * notification with an updated one naming everybody. The push carries the
15397
+ * group's own coalescing tag, so the phone replaces rather than stacks.
15398
+ *
15399
+ * `0` / absent = off, and off is today's behaviour byte for byte.
15400
+ *
15401
+ * ### Why an idle cutoff and not a window
15402
+ *
15403
+ * The measured seven-person arrival on device 590 spans 110 s with every
15404
+ * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
15405
+ * idle cutoff holds it as one and ends it when the arrival actually ends.
15406
+ * 30 is Frigate's shipped value for the same decision.
15407
+ *
15408
+ * ### What it replaces
15409
+ *
15410
+ * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
15411
+ * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
15412
+ * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
15413
+ * track that did fire and 7 carrying a confirmed identity nobody heard about.
15414
+ * A group collapses the same volume by MERGING, so the cooldown becomes a
15415
+ * budget over GROUPS — which is what it always meant — and a growth is never
15416
+ * throttled by the window its own first member spent.
15417
+ *
15418
+ * ### Interaction with {@link waitForEnhancement}
15419
+ *
15420
+ * They compose, and the order matters. `waitForEnhancement` defers the rule to
15421
+ * TRACK CLOSE, so with both set the group is opened by the first member to
15422
+ * CLOSE — already carrying its name — and grows as later members close. That
15423
+ * is later, and complete. With grouping alone the group opens on the first
15424
+ * object event and picks up names as they are confirmed, through the growth
15425
+ * path. Neither combination fires twice for one subject.
15426
+ *
15427
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
15428
+ * on the addon cap path, so absent must keep meaning what it meant before this
15429
+ * field existed.
15430
+ */
15431
+ groupIdleSec: number().int().min(0).max(600).optional()
15360
15432
  });
15361
15433
  /**
15362
15434
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -15543,6 +15615,14 @@ var NC_CONDITION_CATALOG = [
15543
15615
  value: "node-offline",
15544
15616
  label: "Node offline"
15545
15617
  },
15618
+ {
15619
+ value: "node-inference-unavailable",
15620
+ label: "Node has no usable inference device"
15621
+ },
15622
+ {
15623
+ value: "detection-blind",
15624
+ label: "Camera detecting nothing"
15625
+ },
15546
15626
  {
15547
15627
  value: "addon-update-available",
15548
15628
  label: "Addon update available"
@@ -16789,7 +16869,7 @@ var TrackEnvelopeSchema = object({
16789
16869
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
16790
16870
  * keeps every scalar the list surfaces actually render (ids, class(es),
16791
16871
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
16792
- * zonesVisited, bestEventId, envelope, hasFace) and returns `positions` /
16872
+ * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
16793
16873
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
16794
16874
  * `getTrack`. Mirrors the event-store `projection` convention
16795
16875
  * (`getObjectEvents` et al.).
@@ -17076,6 +17156,28 @@ var TrackSchema = object({
17076
17156
  * `=== true` and render nothing otherwise, never infer "no face".
17077
17157
  */
17078
17158
  hasFace: boolean().optional(),
17159
+ /**
17160
+ * This subject CONTAINS a folded rider — a person the rider-pairing step
17161
+ * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
17162
+ * so the passage is tracked once and as a VEHICLE.
17163
+ *
17164
+ * It exists because the fold's record was dishonest. D34 and the code both
17165
+ * said "the person is not lost — it is reported so both entities stay on the
17166
+ * record"; in fact the pair went into a per-processor RAM field behind an
17167
+ * accessor nobody called, and every durable surface said `vehicle`, full
17168
+ * stop. This is the composition note that makes the row true.
17169
+ *
17170
+ * A COMPOSITION, never a class and never a label. "This vehicle contains a
17171
+ * person" is not an answer to "what is this" — both label tiers would refuse
17172
+ * a macro token anyway (D89), and correctly. Nothing here changes what the
17173
+ * subject IS: a cyclist stays one vehicle track, occupancy still counts one,
17174
+ * and a `person` rule still does not fire for someone cycling past.
17175
+ *
17176
+ * **Absent ≠ false**, exactly like {@link hasFace}: every row written before
17177
+ * the column, and every hub that predates the field, omits it. Test
17178
+ * `=== true` and render nothing otherwise — never infer "no rider".
17179
+ */
17180
+ hasRider: boolean().optional(),
17079
17181
  ...TrackFlagFields,
17080
17182
  ...TrackRetrainFields
17081
17183
  });
@@ -29,7 +29,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  enumerable: true
30
30
  }) : target, mod));
31
31
  //#endregion
32
- //#region ../types/dist/event-category-Cv9dO26A.mjs
32
+ //#region ../types/dist/event-category-Bxo5yJjt.mjs
33
33
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
34
34
  EventCategory["SystemBoot"] = "system.boot";
35
35
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -236,6 +236,33 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
236
236
  EventCategory["PipelineCameraAssigned"] = "pipeline.camera-assigned";
237
237
  EventCategory["PipelineCameraUnassigned"] = "pipeline.camera-unassigned";
238
238
  /**
239
+ * A node the orchestrator would otherwise place cameras on has NO usable
240
+ * inference device: the operator enabled one or more accelerators there and
241
+ * the live probe reports every one of them unavailable. Emitted once per
242
+ * TRANSITION into that state (never per dispatch), and the node is dropped
243
+ * from the placement candidate set for as long as it holds.
244
+ *
245
+ * This exists because the state was previously invisible: little-unraid
246
+ * absorbed 283k inference errors in a day while still being handed cameras,
247
+ * and nothing in the system said so.
248
+ *
249
+ * A node with no accelerators configured at all is NOT this — its devices
250
+ * are `disabled`, not `unavailable`, and the runner's default CPU pool
251
+ * serves it exactly as before.
252
+ */
253
+ EventCategory["PipelineNodeInferenceUnavailable"] = "pipeline.node-inference-unavailable";
254
+ /**
255
+ * A camera has an OPEN detection session and has produced no detection at
256
+ * all for longer than the blind threshold — the camera is being decoded and
257
+ * inferred and is returning nothing. Emitted once per transition into blind,
258
+ * per camera.
259
+ *
260
+ * The failure it reports: a 1h43 detection blackout on the entrance camera
261
+ * that nobody noticed, because "a camera that detects nothing" and "a quiet
262
+ * camera" produce byte-identical silence.
263
+ */
264
+ EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
265
+ /**
239
266
  * Per-camera pipeline config was mutated by the orchestrator
240
267
  * (3-level settings change via `setAgentAddonDefaults` /
241
268
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -14580,6 +14607,8 @@ var NcSystemEventKindSchema = _enum([
14580
14607
  "stream-offline",
14581
14608
  "node-online",
14582
14609
  "node-offline",
14610
+ "node-inference-unavailable",
14611
+ "detection-blind",
14583
14612
  "addon-update-available",
14584
14613
  "server-update-available",
14585
14614
  "alarm-triggered",
@@ -15387,7 +15416,50 @@ var NcRuleInputSchema = object({
15387
15416
  * tests every zone the track visited and a `crossing` condition can no longer
15388
15417
  * be satisfied, because a closed track carries no crossing.
15389
15418
  */
15390
- waitForEnhancement: boolean().optional()
15419
+ waitForEnhancement: boolean().optional(),
15420
+ /**
15421
+ * GROUP a burst of subjects into ONE notification that grows.
15422
+ *
15423
+ * Seconds of quiet after the last matching subject before the burst is
15424
+ * considered over. While it is open, the first subject enqueues immediately —
15425
+ * **exactly as today, with no added latency** — and every real growth (a new
15426
+ * subject, or a name confirmed on one already in it) REPLACES that
15427
+ * notification with an updated one naming everybody. The push carries the
15428
+ * group's own coalescing tag, so the phone replaces rather than stacks.
15429
+ *
15430
+ * `0` / absent = off, and off is today's behaviour byte for byte.
15431
+ *
15432
+ * ### Why an idle cutoff and not a window
15433
+ *
15434
+ * The measured seven-person arrival on device 590 spans 110 s with every
15435
+ * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
15436
+ * idle cutoff holds it as one and ends it when the arrival actually ends.
15437
+ * 30 is Frigate's shipped value for the same decision.
15438
+ *
15439
+ * ### What it replaces
15440
+ *
15441
+ * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
15442
+ * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
15443
+ * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
15444
+ * track that did fire and 7 carrying a confirmed identity nobody heard about.
15445
+ * A group collapses the same volume by MERGING, so the cooldown becomes a
15446
+ * budget over GROUPS — which is what it always meant — and a growth is never
15447
+ * throttled by the window its own first member spent.
15448
+ *
15449
+ * ### Interaction with {@link waitForEnhancement}
15450
+ *
15451
+ * They compose, and the order matters. `waitForEnhancement` defers the rule to
15452
+ * TRACK CLOSE, so with both set the group is opened by the first member to
15453
+ * CLOSE — already carrying its name — and grows as later members close. That
15454
+ * is later, and complete. With grouping alone the group opens on the first
15455
+ * object event and picks up names as they are confirmed, through the growth
15456
+ * path. Neither combination fires twice for one subject.
15457
+ *
15458
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
15459
+ * on the addon cap path, so absent must keep meaning what it meant before this
15460
+ * field existed.
15461
+ */
15462
+ groupIdleSec: number().int().min(0).max(600).optional()
15391
15463
  });
15392
15464
  /**
15393
15465
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -15574,6 +15646,14 @@ var NC_CONDITION_CATALOG = [
15574
15646
  value: "node-offline",
15575
15647
  label: "Node offline"
15576
15648
  },
15649
+ {
15650
+ value: "node-inference-unavailable",
15651
+ label: "Node has no usable inference device"
15652
+ },
15653
+ {
15654
+ value: "detection-blind",
15655
+ label: "Camera detecting nothing"
15656
+ },
15577
15657
  {
15578
15658
  value: "addon-update-available",
15579
15659
  label: "Addon update available"
@@ -16820,7 +16900,7 @@ var TrackEnvelopeSchema = object({
16820
16900
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
16821
16901
  * keeps every scalar the list surfaces actually render (ids, class(es),
16822
16902
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
16823
- * zonesVisited, bestEventId, envelope, hasFace) and returns `positions` /
16903
+ * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
16824
16904
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
16825
16905
  * `getTrack`. Mirrors the event-store `projection` convention
16826
16906
  * (`getObjectEvents` et al.).
@@ -17107,6 +17187,28 @@ var TrackSchema = object({
17107
17187
  * `=== true` and render nothing otherwise, never infer "no face".
17108
17188
  */
17109
17189
  hasFace: boolean().optional(),
17190
+ /**
17191
+ * This subject CONTAINS a folded rider — a person the rider-pairing step
17192
+ * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
17193
+ * so the passage is tracked once and as a VEHICLE.
17194
+ *
17195
+ * It exists because the fold's record was dishonest. D34 and the code both
17196
+ * said "the person is not lost — it is reported so both entities stay on the
17197
+ * record"; in fact the pair went into a per-processor RAM field behind an
17198
+ * accessor nobody called, and every durable surface said `vehicle`, full
17199
+ * stop. This is the composition note that makes the row true.
17200
+ *
17201
+ * A COMPOSITION, never a class and never a label. "This vehicle contains a
17202
+ * person" is not an answer to "what is this" — both label tiers would refuse
17203
+ * a macro token anyway (D89), and correctly. Nothing here changes what the
17204
+ * subject IS: a cyclist stays one vehicle track, occupancy still counts one,
17205
+ * and a `person` rule still does not fire for someone cycling past.
17206
+ *
17207
+ * **Absent ≠ false**, exactly like {@link hasFace}: every row written before
17208
+ * the column, and every hub that predates the field, omits it. Test
17209
+ * `=== true` and render nothing otherwise — never infer "no rider".
17210
+ */
17211
+ hasRider: boolean().optional(),
17110
17212
  ...TrackFlagFields,
17111
17213
  ...TrackRetrainFields
17112
17214
  });
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DDv-TKUR.js");
5
+ const require_dist = require("../dist-Cy8lyywE.js");
6
6
  let node_fs = require("node:fs");
7
7
  let node_fs$1 = require_dist.__toESM(node_fs, 1);
8
8
  node_fs = require_dist.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { W as embeddingEncoderCapability, q as hfModelUrl, st as BaseAddon } from "../dist-_D0jdUh4.mjs";
1
+ import { W as embeddingEncoderCapability, q as hfModelUrl, st as BaseAddon } from "../dist-CvWsGsxP.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import "node:fs";
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.70",
21
+ version: "1.2.71",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.70",
39
+ version: "1.2.71",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,