@camstack/addon-post-analysis 1.2.110 → 1.2.115

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.
@@ -14979,12 +14979,15 @@ var NcOccupancyConditionSchema = object({
14979
14979
  * there is no second switch that can disagree with the first and every rule
14980
14980
  * authored before the decision migrates for free (`audioModeOf`):
14981
14981
  *
14982
- * - **LABEL mode — `labels` present.** The rule fires on the FIRST frame the
14983
- * classifier labels with one of them. No window, no percentage:
14984
- * `hitPercent` and `samplingSeconds` are ignored, and the rule's own
14985
- * `throttle` cooldown is the only brake. The per-label confidence floor is
14986
- * the analyzer's (`classificationMinScore`, per device) — a label only
14987
- * reaches this condition if the classifier was already confident enough.
14982
+ * - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
14983
+ * labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
14984
+ * `hitPercent` and `samplingSeconds` are still ignored — a percentage of
14985
+ * frames is the wrong question for a classifier that labels 1–3 frames
14986
+ * per episode. The count window is the brake that drops a single-frame
14987
+ * false positive; the rule's own `throttle` cooldown is the other. The
14988
+ * per-label confidence floor is the analyzer's (`classificationMinScore`,
14989
+ * per device) — a label only reaches this condition if the classifier was
14990
+ * already confident enough. `confirmHits: 1` restores first-frame fire.
14988
14991
  * - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
14989
14992
  * the condition: at least `hitPercent`% of the samples over
14990
14993
  * `samplingSeconds` must be at or above `dbThreshold` dBFS (see
@@ -15011,14 +15014,22 @@ var NcOccupancyConditionSchema = object({
15011
15014
  * an operator who typed `dog` mean the same thing.
15012
15015
  */
15013
15016
  var NcAudioConditionSchema = object({
15014
- /** LABEL MODE: audio macro labels. Present ⇒ fires on the first labelled frame. */
15017
+ /** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
15015
15018
  labels: array(string().min(1)).min(1).optional(),
15016
15019
  /** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
15017
15020
  dbThreshold: number().min(-96).max(0).optional(),
15018
15021
  /** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
15019
15022
  hitPercent: number().int().min(1).max(100).default(60),
15020
15023
  /** LEVEL MODE ONLY: length of the sampling window in seconds. */
15021
- samplingSeconds: number().int().min(1).max(300).default(10)
15024
+ samplingSeconds: number().int().min(1).max(300).default(10),
15025
+ /**
15026
+ * LABEL MODE: how many labelled frames must land inside
15027
+ * {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
15028
+ * Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
15029
+ */
15030
+ confirmHits: number().int().min(1).max(20).optional(),
15031
+ /** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
15032
+ confirmWindowSec: number().int().min(1).max(60).optional()
15022
15033
  });
15023
15034
  /**
15024
15035
  * Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
@@ -18013,7 +18024,9 @@ var TrackCascadeCountsSchema = object({
18013
18024
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18014
18025
  plates: number().int(),
18015
18026
  /** Per-track CLIP search vectors removed (best-effort). */
18016
- embeddings: number().int()
18027
+ embeddings: number().int(),
18028
+ /** Group membership + group rows removed with their last member (best-effort). */
18029
+ groups: number().int()
18017
18030
  });
18018
18031
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18019
18032
  var DiskReconcileCountsSchema = object({
@@ -15010,12 +15010,15 @@ var NcOccupancyConditionSchema = object({
15010
15010
  * there is no second switch that can disagree with the first and every rule
15011
15011
  * authored before the decision migrates for free (`audioModeOf`):
15012
15012
  *
15013
- * - **LABEL mode — `labels` present.** The rule fires on the FIRST frame the
15014
- * classifier labels with one of them. No window, no percentage:
15015
- * `hitPercent` and `samplingSeconds` are ignored, and the rule's own
15016
- * `throttle` cooldown is the only brake. The per-label confidence floor is
15017
- * the analyzer's (`classificationMinScore`, per device) — a label only
15018
- * reaches this condition if the classifier was already confident enough.
15013
+ * - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
15014
+ * labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
15015
+ * `hitPercent` and `samplingSeconds` are still ignored — a percentage of
15016
+ * frames is the wrong question for a classifier that labels 1–3 frames
15017
+ * per episode. The count window is the brake that drops a single-frame
15018
+ * false positive; the rule's own `throttle` cooldown is the other. The
15019
+ * per-label confidence floor is the analyzer's (`classificationMinScore`,
15020
+ * per device) — a label only reaches this condition if the classifier was
15021
+ * already confident enough. `confirmHits: 1` restores first-frame fire.
15019
15022
  * - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
15020
15023
  * the condition: at least `hitPercent`% of the samples over
15021
15024
  * `samplingSeconds` must be at or above `dbThreshold` dBFS (see
@@ -15042,14 +15045,22 @@ var NcOccupancyConditionSchema = object({
15042
15045
  * an operator who typed `dog` mean the same thing.
15043
15046
  */
15044
15047
  var NcAudioConditionSchema = object({
15045
- /** LABEL MODE: audio macro labels. Present ⇒ fires on the first labelled frame. */
15048
+ /** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
15046
15049
  labels: array(string().min(1)).min(1).optional(),
15047
15050
  /** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
15048
15051
  dbThreshold: number().min(-96).max(0).optional(),
15049
15052
  /** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
15050
15053
  hitPercent: number().int().min(1).max(100).default(60),
15051
15054
  /** LEVEL MODE ONLY: length of the sampling window in seconds. */
15052
- samplingSeconds: number().int().min(1).max(300).default(10)
15055
+ samplingSeconds: number().int().min(1).max(300).default(10),
15056
+ /**
15057
+ * LABEL MODE: how many labelled frames must land inside
15058
+ * {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
15059
+ * Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
15060
+ */
15061
+ confirmHits: number().int().min(1).max(20).optional(),
15062
+ /** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
15063
+ confirmWindowSec: number().int().min(1).max(60).optional()
15053
15064
  });
15054
15065
  /**
15055
15066
  * Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
@@ -18044,7 +18055,9 @@ var TrackCascadeCountsSchema = object({
18044
18055
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18045
18056
  plates: number().int(),
18046
18057
  /** Per-track CLIP search vectors removed (best-effort). */
18047
- embeddings: number().int()
18058
+ embeddings: number().int(),
18059
+ /** Group membership + group rows removed with their last member (best-effort). */
18060
+ groups: number().int()
18048
18061
  });
18049
18062
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18050
18063
  var DiskReconcileCountsSchema = object({
@@ -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-RzJseCJP.js");
5
+ const require_dist = require("../dist-C0uPGtBv.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 { A as PoolMemoryWatchdog, St as BaseAddon, ct as parseProcStatus, et as embeddingEncoderCapability, mt as resolvePoolMemoryPolicy, rt as hfModelUrl } from "../dist-BtpxOtGv.mjs";
1
+ import { A as PoolMemoryWatchdog, St as BaseAddon, ct as parseProcStatus, et as embeddingEncoderCapability, mt as resolvePoolMemoryPolicy, rt as hfModelUrl } from "../dist-B13sFjR2.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.99",
21
+ version: "1.2.100",
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.99",
39
+ version: "1.2.100",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,