@camstack/addon-pipeline 1.2.624 → 1.2.626

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.
Files changed (54) hide show
  1. package/THIRD_PARTY_MODELS.md +2 -2
  2. package/dist/audio-analyzer/index.js +3 -3
  3. package/dist/audio-analyzer/index.mjs +3 -3
  4. package/dist/{custom-model-catalog-Dx6W1kAo.mjs → custom-model-catalog-CacTUROW.mjs} +6 -6
  5. package/dist/{custom-model-catalog-6zwaRe6H.js → custom-model-catalog-CgxVHzSZ.js} +6 -6
  6. package/dist/detection-pipeline/index.js +16 -16
  7. package/dist/detection-pipeline/index.mjs +16 -16
  8. package/dist/{dist-BK3z-nti.mjs → dist-Bg9whnXR.mjs} +2055 -58
  9. package/dist/{dist-63VVVhpw.js → dist-CtbRj-Dn.js} +2055 -58
  10. package/dist/{model-catalogs-DyOMg-xZ.js → model-catalogs-BQqKruf-.js} +3 -3
  11. package/dist/{model-catalogs-CllYj2Q2.mjs → model-catalogs-D04DNvMI.mjs} +3 -3
  12. package/dist/motion-wasm/index.js +1 -1
  13. package/dist/motion-wasm/index.mjs +1 -1
  14. package/dist/{node-BAcWHimZ.mjs → node-CfgKBxdH.mjs} +2 -2
  15. package/dist/{node-DdaBnHEq.js → node-PivXOnUx.js} +2 -2
  16. package/dist/pipeline-runner/index.js +20 -20
  17. package/dist/pipeline-runner/index.mjs +20 -20
  18. package/dist/{process-memory-CUlknrLl.js → process-memory-68U4DnuZ.js} +1 -1
  19. package/dist/{process-memory-OZwib1pK.mjs → process-memory-Z6v2Fm60.mjs} +1 -1
  20. package/dist/recorder/index.js +26 -1816
  21. package/dist/recorder/index.mjs +26 -1816
  22. package/dist/{restream-intent-DyGmLAU9.mjs → restream-intent-DvzCnthK.mjs} +1 -1
  23. package/dist/{restream-intent-7uDNqMKs.js → restream-intent-DzrZ_EHP.js} +1 -1
  24. package/dist/{segment-demux-js-WNlg0SXP.js → segment-demux-js-BcnG-zVD.js} +1 -1
  25. package/dist/{segment-demux-js-C3rhCLCG.mjs → segment-demux-js-CRzvBMVr.mjs} +1 -1
  26. package/dist/session-decode/decode-worker-main.js +8 -8
  27. package/dist/session-decode/decode-worker-main.mjs +8 -8
  28. package/dist/stream-broker/_stub.js +1 -1
  29. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Di7t7N3r.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B9jSVeoa.mjs} +3 -3
  30. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D-GlPMcf.mjs +26 -0
  31. package/dist/stream-broker/demux-worker-child.js +1 -1
  32. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  33. package/dist/stream-broker/{hostInit-CMDvBrqv.mjs → hostInit-C_J8Mxe2.mjs} +3 -3
  34. package/dist/stream-broker/index.js +34 -34
  35. package/dist/stream-broker/index.mjs +34 -34
  36. package/dist/stream-broker/remoteEntry.js +1 -1
  37. package/package.json +1 -1
  38. package/python/inference_pool.py +3 -3
  39. package/python/postprocessors/ctc.py +1 -1
  40. package/python/postprocessors/plate_slots.py +2 -2
  41. package/python/postprocessors/test_ctc.py +1 -1
  42. package/python/postprocessors/test_plate_slots.py +1 -1
  43. package/python/postprocessors/test_ssd.py +1 -1
  44. package/python/postprocessors/test_yolo_split_dfl.py +3 -3
  45. package/python/postprocessors/test_yolo_split_dfl_numpy.py +5 -5
  46. package/python/postprocessors/test_yolonas.py +5 -5
  47. package/python/postprocessors/test_yolov9_edgetpu_concat.py +3 -3
  48. package/python/postprocessors/testdata/yunet_int8_outputs.json +2 -2
  49. package/python/postprocessors/yolo_split_dfl.py +5 -5
  50. package/python/postprocessors/yolonas.py +3 -3
  51. package/python/test_dequant_edgetpu.py +2 -2
  52. package/python/test_inference_pool_preprocess.py +2 -2
  53. package/python/webgpu_isolated.py +1 -1
  54. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DDRGMoJ1.mjs +0 -26
@@ -9,7 +9,7 @@
9
9
  The package copies (packages/addon-pipeline, packages/addon-post-analysis, packages/addon-ai, packages/addon-model-studio, server/backend) are byte-identical
10
10
  (npm cannot ship a file from outside the package); the Hugging Face mirror receives
11
11
  the same file from hf/camstack-models/upload.sh. Drift fails CI.
12
- Facts: docs/superpowers/specs/2026-09-26-model-license-compliance.md. Not legal advice.
12
+ Facts: planning repo superpowers/specs/2026-09-26-model-license-compliance.md. Not legal advice.
13
13
  -->
14
14
 
15
15
  # Third-party models
@@ -218,6 +218,6 @@ object-detection catalogs) on request. They are downloaded from their
218
218
  publishers, are not hosted or redistributed by CamStack, and keep their
219
219
  publishers' licences; Model Studio shows the licence where the source declares
220
220
  one. A model you upload or convert
221
- yourself, or pull from your own Frigate+ account, likewise keeps whatever
221
+ yourself, or pull from your own plus catalog account, likewise keeps whatever
222
222
  licence its author published. CamStack does not change it and does not record
223
223
  it.
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-63VVVhpw.js");
7
- const require_model_catalogs = require("../model-catalogs-DyOMg-xZ.js");
8
- const require_process_memory = require("../process-memory-CUlknrLl.js");
6
+ const require_dist = require("../dist-CtbRj-Dn.js");
7
+ const require_model_catalogs = require("../model-catalogs-BQqKruf-.js");
8
+ const require_process_memory = require("../process-memory-68U4DnuZ.js");
9
9
  let node_fs = require("node:fs");
10
10
  node_fs = require_chunk.__toESM(node_fs);
11
11
  let node_path = require("node:path");
@@ -1,7 +1,7 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { Er as EventCategory, Gn as BaseAddon, Gt as mapAudioLabelToMacro, I as PoolMemoryWatchdog, Un as errMsg, Xn as audioChunkBytesPerSample, h as DEFAULT_AUDIO_ANALYZER_CONFIG, lr as nodePin, nt as audioAnalyzerCapability, r as AUDIO_BACKEND_CHOICES, rr as hydrateSchema, tr as expandAudioChunkToF32le, tt as audioAnalysisCapability, yn as resolvePoolMemoryPolicy } from "../dist-BK3z-nti.mjs";
3
- import { n as AUDIO_CLASSIFIER_MODELS } from "../model-catalogs-CllYj2Q2.mjs";
4
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-OZwib1pK.mjs";
2
+ import { Er as EventCategory, Gn as BaseAddon, Gt as mapAudioLabelToMacro, I as PoolMemoryWatchdog, Un as errMsg, Xn as audioChunkBytesPerSample, h as DEFAULT_AUDIO_ANALYZER_CONFIG, lr as nodePin, nt as audioAnalyzerCapability, r as AUDIO_BACKEND_CHOICES, rr as hydrateSchema, tr as expandAudioChunkToF32le, tt as audioAnalysisCapability, yn as resolvePoolMemoryPolicy } from "../dist-Bg9whnXR.mjs";
3
+ import { n as AUDIO_CLASSIFIER_MODELS } from "../model-catalogs-D04DNvMI.mjs";
4
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Z6v2Fm60.mjs";
5
5
  import * as fs from "node:fs";
6
6
  import * as path$1 from "node:path";
7
7
  import { ensureModel } from "@camstack/system/addon-utils";
@@ -1,5 +1,5 @@
1
- import { En as stepModelRunsOnFormat, N as OBJECT_DETECTION_STEP_ID, b as DEVICE_BACKEND_TO_FORMAT, f as COCO_80_LABELS, i as AUDIO_MACRO_LABELS, k as LABEL_SUPPLY_VOCABULARIES, p as COCO_TO_MACRO, rt as audioKindId, zt as inferModelProvider } from "./dist-BK3z-nti.mjs";
2
- import { a as FACE_DETECTION_MODELS, c as OBJECT_DETECTION_MODELS, d as PLATE_OCR_MODELS, f as SEGMENTATION_REFINER_MODELS, i as CLIP_EMBEDDING_MODELS, l as PACKAGE_DETECTION_MODELS, n as AUDIO_CLASSIFIER_MODELS, o as FACE_EMBEDDING_MODELS, p as VEHICLE_CLASSIFIER_MODELS, r as BIRD_CLASSIFIER_MODELS, s as INSTANCE_SEGMENTATION_MODELS, t as ANIMAL_CLASSIFIER_MODELS, u as PLATE_DETECTION_MODELS } from "./model-catalogs-CllYj2Q2.mjs";
1
+ import { En as stepModelRunsOnFormat, N as OBJECT_DETECTION_STEP_ID, b as DEVICE_BACKEND_TO_FORMAT, f as COCO_80_LABELS, i as AUDIO_MACRO_LABELS, k as LABEL_SUPPLY_VOCABULARIES, p as COCO_TO_MACRO, rt as audioKindId, zt as inferModelProvider } from "./dist-Bg9whnXR.mjs";
2
+ import { a as FACE_DETECTION_MODELS, c as OBJECT_DETECTION_MODELS, d as PLATE_OCR_MODELS, f as SEGMENTATION_REFINER_MODELS, i as CLIP_EMBEDDING_MODELS, l as PACKAGE_DETECTION_MODELS, n as AUDIO_CLASSIFIER_MODELS, o as FACE_EMBEDDING_MODELS, p as VEHICLE_CLASSIFIER_MODELS, r as BIRD_CLASSIFIER_MODELS, s as INSTANCE_SEGMENTATION_MODELS, t as ANIMAL_CLASSIFIER_MODELS, u as PLATE_DETECTION_MODELS } from "./model-catalogs-D04DNvMI.mjs";
3
3
  import { t as isWorkerReply } from "./worker-protocol-_avq7y8O.mjs";
4
4
  import { randomUUID } from "node:crypto";
5
5
  //#region src/detection-pipeline/registry/effective-confidence.ts
@@ -309,7 +309,7 @@ var AnimalClassifierStep = class {
309
309
  * Why it exists: the 0.5 floor lived only in `definition.defaultConfidence`,
310
310
  * which is forwarded to the Python pool and reachable from no operator surface
311
311
  * (the catalog carries `configSchema` to the admin-ui; an empty schema renders
312
- * no form). Camera 615 reported a DOORMAT at 0.5669 on 2026-08-07, and the
312
+ * no form). Camera 101 reported a DOORMAT at 0.5669 on 2026-08-07, and the
313
313
  * model's own benchmark had already noted a doormat near-FP at 0.49 — the
314
314
  * shipped floor sat 0.01 above a known false positive with no way to move it.
315
315
  *
@@ -324,7 +324,7 @@ var PackageDetectionStep = class extends PipelineStepBase {
324
324
  type: "slider",
325
325
  key: "minConfidencePackage",
326
326
  label: "Min Confidence — Package",
327
- description: "Drop package predictions below this score. NOTE: raising it does NOT fix a recurring static false positive — measured on device 615, the false object (a streetlight light patch) scored up to 0.877 while the one real parcel scored 0.885, so no threshold separates them. The lever that does is the package SIZE ceiling in the camera’s Package detection settings (the false object covers 8–9.5% of the frame, real parcels 1–2%).",
327
+ description: "Drop package predictions below this score. NOTE: raising it does NOT fix a recurring static false positive — measured on device 101, the false object (a streetlight light patch) scored up to 0.877 while the one real parcel scored 0.885, so no threshold separates them. The lever that does is the package SIZE ceiling in the camera’s Package detection settings (the false object covers 8–9.5% of the frame, real parcels 1–2%).",
328
328
  min: 0,
329
329
  max: 1,
330
330
  step: .05,
@@ -831,7 +831,7 @@ var DEFAULT_FIRST_FRAME_TIMEOUT_MS = 2e4;
831
831
  * Hard ceiling on the TOTAL wait for the FIRST frame of a dial.
832
832
  *
833
833
  * The first decodable frame is not a fixed cost: it is one IDR interval plus
834
- * every GOP the decoder has to discard. Measured on device 618 (2560x1440
834
+ * every GOP the decoder has to discard. Measured on device 108 (2560x1440
835
835
  * h264, `Invalid NAL unit` / `corrupt decoded frame` in its bitstream), dial →
836
836
  * first decoded frame over the broker's own muted restream was 1.8 / 6.5 / 7.0
837
837
  * / 7.2 / 9.2 / 10.0 / 10.8 / 12.9 / 14.9 / 20.0 / 30.3 / >40 s across 12
@@ -859,7 +859,7 @@ var DEFAULT_FIRST_FRAME_TIMEOUT_MS = 2e4;
859
859
  * Abandoning at 20 s was therefore not a timeout, it was a coin flip, and the
860
860
  * recovery made it worse: ending the session RE-DIALS, which throws the
861
861
  * accumulated wait away and re-pays the RTSP setup + probe from zero, and two
862
- * ends inside 60 s DETACH the camera. That loop cost 618 25.9% of its assigned
862
+ * ends inside 60 s DETACH the camera. That loop cost 108 25.9% of its assigned
863
863
  * decode airtime in one day (325 of 1257 ten-second windows delivered nothing).
864
864
  *
865
865
  * The wait is bounded instead of deadlined: the worker keeps the outstanding
@@ -1,5 +1,5 @@
1
- const require_dist = require("./dist-63VVVhpw.js");
2
- const require_model_catalogs = require("./model-catalogs-DyOMg-xZ.js");
1
+ const require_dist = require("./dist-CtbRj-Dn.js");
2
+ const require_model_catalogs = require("./model-catalogs-BQqKruf-.js");
3
3
  const require_worker_protocol = require("./worker-protocol-DngGEAT2.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  //#region src/detection-pipeline/registry/effective-confidence.ts
@@ -309,7 +309,7 @@ var AnimalClassifierStep = class {
309
309
  * Why it exists: the 0.5 floor lived only in `definition.defaultConfidence`,
310
310
  * which is forwarded to the Python pool and reachable from no operator surface
311
311
  * (the catalog carries `configSchema` to the admin-ui; an empty schema renders
312
- * no form). Camera 615 reported a DOORMAT at 0.5669 on 2026-08-07, and the
312
+ * no form). Camera 101 reported a DOORMAT at 0.5669 on 2026-08-07, and the
313
313
  * model's own benchmark had already noted a doormat near-FP at 0.49 — the
314
314
  * shipped floor sat 0.01 above a known false positive with no way to move it.
315
315
  *
@@ -324,7 +324,7 @@ var PackageDetectionStep = class extends PipelineStepBase {
324
324
  type: "slider",
325
325
  key: "minConfidencePackage",
326
326
  label: "Min Confidence — Package",
327
- description: "Drop package predictions below this score. NOTE: raising it does NOT fix a recurring static false positive — measured on device 615, the false object (a streetlight light patch) scored up to 0.877 while the one real parcel scored 0.885, so no threshold separates them. The lever that does is the package SIZE ceiling in the camera’s Package detection settings (the false object covers 8–9.5% of the frame, real parcels 1–2%).",
327
+ description: "Drop package predictions below this score. NOTE: raising it does NOT fix a recurring static false positive — measured on device 101, the false object (a streetlight light patch) scored up to 0.877 while the one real parcel scored 0.885, so no threshold separates them. The lever that does is the package SIZE ceiling in the camera’s Package detection settings (the false object covers 8–9.5% of the frame, real parcels 1–2%).",
328
328
  min: 0,
329
329
  max: 1,
330
330
  step: .05,
@@ -831,7 +831,7 @@ var DEFAULT_FIRST_FRAME_TIMEOUT_MS = 2e4;
831
831
  * Hard ceiling on the TOTAL wait for the FIRST frame of a dial.
832
832
  *
833
833
  * The first decodable frame is not a fixed cost: it is one IDR interval plus
834
- * every GOP the decoder has to discard. Measured on device 618 (2560x1440
834
+ * every GOP the decoder has to discard. Measured on device 108 (2560x1440
835
835
  * h264, `Invalid NAL unit` / `corrupt decoded frame` in its bitstream), dial →
836
836
  * first decoded frame over the broker's own muted restream was 1.8 / 6.5 / 7.0
837
837
  * / 7.2 / 9.2 / 10.0 / 10.8 / 12.9 / 14.9 / 20.0 / 30.3 / >40 s across 12
@@ -859,7 +859,7 @@ var DEFAULT_FIRST_FRAME_TIMEOUT_MS = 2e4;
859
859
  * Abandoning at 20 s was therefore not a timeout, it was a coin flip, and the
860
860
  * recovery made it worse: ending the session RE-DIALS, which throws the
861
861
  * accumulated wait away and re-pays the RTSP setup + probe from zero, and two
862
- * ends inside 60 s DETACH the camera. That loop cost 618 25.9% of its assigned
862
+ * ends inside 60 s DETACH the camera. That loop cost 108 25.9% of its assigned
863
863
  * decode airtime in one day (325 of 1257 ten-second windows delivered nothing).
864
864
  *
865
865
  * The wait is bounded instead of deadlined: the worker keeps the outstanding
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-63VVVhpw.js");
7
- const require_node = require("../node-DdaBnHEq.js");
8
- const require_custom_model_catalog = require("../custom-model-catalog-6zwaRe6H.js");
6
+ const require_dist = require("../dist-CtbRj-Dn.js");
7
+ const require_node = require("../node-PivXOnUx.js");
8
+ const require_custom_model_catalog = require("../custom-model-catalog-CgxVHzSZ.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-CUlknrLl.js");
10
+ const require_process_memory = require("../process-memory-68U4DnuZ.js");
11
11
  let node_os = require("node:os");
12
12
  node_os = require_chunk.__toESM(node_os);
13
13
  let node_fs = require("node:fs");
@@ -873,7 +873,7 @@ var POOL_POISON_DRAIN_SLACK_MS = 1e3;
873
873
  * Max inference requests outstanding to ONE worker before new ones are SHED.
874
874
  *
875
875
  * Without this the camera dies permanently the first time the worker gets
876
- * slow, and it did: device 615 produced nothing for 52 minutes on 2026-07-31.
876
+ * slow, and it did: device 101 produced nothing for 52 minutes on 2026-07-31.
877
877
  * The worker was neither dead nor deadlocked — it was replying at full rate,
878
878
  * about a minute behind, and every reply landed after {@link
879
879
  * POOL_INFER_TIMEOUT_MS} had already abandoned its request. The proof is in the
@@ -2380,7 +2380,7 @@ function resolveEffectivePostprocessor(definition, modelId) {
2380
2380
  * Entry-based variant for callers that already hold the `ModelCatalogEntry` —
2381
2381
  * required for CUSTOM (operator-registered) models, which are NOT in
2382
2382
  * `definition.models` and would otherwise silently fall back to the step
2383
- * default decode (a Frigate `yolonas` model decoded as `yolo` produces no
2383
+ * default decode (a plus catalog `yolonas` model decoded as `yolo` produces no
2384
2384
  * error anywhere, just zero detections).
2385
2385
  */
2386
2386
  function resolveEffectivePostprocessorForEntry(definition, entry) {
@@ -4993,7 +4993,7 @@ function normalizeOutput(output) {
4993
4993
  * how rare full-frame phantoms are, which is the point: if this floods, that is
4994
4994
  * itself the finding."*
4995
4995
  *
4996
- * It flooded. Camera 615 emits a persistent full-frame `vehicle` phantom
4996
+ * It flooded. Camera 101 emits a persistent full-frame `vehicle` phantom
4997
4997
  * (score ~0.62, areaRatio 0.949) and the guard was writing **dozens of INFO
4998
4998
  * lines a second** on 2026-08-02. So the finding stands — that camera has a
4999
4999
  * standing phantom worth investigating — but the log volume is now costing more
@@ -5474,7 +5474,7 @@ async function alignFaceCrop(fullFrameJpeg, faceBbox, landmarksImageSpace, image
5474
5474
  * Detection score at/above which a near-full-frame box is trusted as a REAL
5475
5475
  * close subject rather than a phantom. Below this bar a full-frame box is
5476
5476
  * dropped; at/above it survives (a full-frame crop of a genuine close subject
5477
- * beats a phantom occupancy chip). The observed cam-615 phantom scored 0.52,
5477
+ * beats a phantom occupancy chip). The observed cam-101 phantom scored 0.52,
5478
5478
  * comfortably under this 0.70 bar; a genuine object right under the lens
5479
5479
  * (doorbell close-ups) commonly scores 0.65-0.85 — 0.70 keeps the legit band
5480
5480
  * above the bar while holding a wide margin over observed phantoms (~0.52).
@@ -5520,7 +5520,7 @@ function isUsableHardAreaCut(ratio) {
5520
5520
  * edge-to-edge in one axis) but SURVIVES because its score cleared the
5521
5521
  * confidence bar.
5522
5522
  *
5523
- * These are the ones worth counting: on 2026-07-30 device 615 produced six
5523
+ * These are the ones worth counting: on 2026-07-30 device 101 produced six
5524
5524
  * such boxes in a day, at 0.710-0.787, and they were only found by an offline
5525
5525
  * sweep of stored events — nothing in production reported them. Arming the
5526
5526
  * hard-area cut on a camera should be a decision made from this count, not
@@ -5613,7 +5613,7 @@ async function nativeChildCrop(provider, bbox, imageWidth, imageHeight, maxWidth
5613
5613
  * Plate-crop DESKEW — rotation rectification for oblique licence-plate crops.
5614
5614
  *
5615
5615
  * Plate crops reach the CTC recognizer as an axis-aligned bbox tile with NO
5616
- * geometric correction. On steeply oblique cameras (cam 617) the plate text is
5616
+ * geometric correction. On steeply oblique cameras (cam 102) the plate text is
5617
5617
  * skewed, and CTC collapses beyond ~10-15° of baseline tilt. This module
5618
5618
  * estimates the plate's dominant rotation from the crop ALONE (no plate quad is
5619
5619
  * available) and rotates the tile so the text baseline is horizontal before OCR.
@@ -5973,13 +5973,13 @@ var PLATE_OCR_CROP_POLICIES = {
5973
5973
  }
5974
5974
  };
5975
5975
  /**
5976
- * The margin around a plate box drawn by the ROOT model (D730) — a Frigate+
5976
+ * The margin around a plate box drawn by the ROOT model (D730) — a plus catalog
5977
5977
  * `license_plate` read in place of `plate-detection`'s own box.
5978
5978
  *
5979
5979
  * The margin is a property of the box's detector (see above), and this
5980
5980
  * detector's boxes have never been measured against the plate readers: 0.15 is
5981
5981
  * the value that served a TIGHT detector box (the deleted `yolov8n-plate`,
5982
- * 7/7 Kia reads at 0.13–0.16), on the assumption that Frigate+ boxes are
5982
+ * 7/7 Kia reads at 0.13–0.16), on the assumption that plus catalog boxes are
5983
5983
  * tight as well. It is uncalibrated and needs measuring on a ground-truth set
5984
5984
  * of root-supplied plates before it is trusted; until then it applies to every
5985
5985
  * reader alike, replacing the reader's own detector-specific margin.
@@ -6106,7 +6106,7 @@ function attachRootChildBoxes(candidates, parents, modelId, idGen) {
6106
6106
  * camera, is a rotated trapezoid inside it. Two things then destroy the read,
6107
6107
  * and neither is a resolution problem:
6108
6108
  *
6109
- * 1. **Aspect.** A German plate is 4.7 : 1. The boxes cam 617 produces measure
6109
+ * 1. **Aspect.** A German plate is 4.7 : 1. The boxes cam 102 produces measure
6110
6110
  * 1.3 – 2.0 : 1 — the box is 2-3× too tall because it circumscribes a
6111
6111
  * tilted rectangle. The recognizer resizes its input to a fixed 64px height
6112
6112
  * preserving aspect, so a 1.5 : 1 tile becomes ~96px wide: seven glyphs get
@@ -6123,7 +6123,7 @@ function attachRootChildBoxes(candidates, parents, modelId, idGen) {
6123
6123
  * OpenCV, no new dependency — sharp only decodes and re-encodes, exactly as
6124
6124
  * `plate-deskew.ts` and `native-child-crop.ts` do.
6125
6125
  *
6126
- * MEASURED on 21 ground-truthed cam-617 plate crops (9 distinct vehicles,
6126
+ * MEASURED on 21 ground-truthed cam-102 plate crops (9 distinct vehicles,
6127
6127
  * 2026-08-20 offline replay against the production `vgg_english_g2` weights and
6128
6128
  * the production CTC postprocessor):
6129
6129
  *
@@ -8673,7 +8673,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
8673
8673
  *
8674
8674
  * That false positive is not cosmetic. It is a readiness gate answering yes
8675
8675
  * on another machine's evidence, and it is exactly the log line that made a
8676
- * node with NO platform-probe addon at all (little-unraid, 2026-08-07: its
8676
+ * node with NO platform-probe addon at all (agent-a, 2026-08-07: its
8677
8677
  * `@camstack/system` package had been renamed out of `/data/addons`) look
8678
8678
  * like a node with a lossy event path. The pin makes the answer local: an
8679
8679
  * inline `nodeId` is the routing pin that survives the forked-addon → parent
@@ -9899,7 +9899,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
9899
9899
  }
9900
9900
  /**
9901
9901
  * Resolve a dispatch's step tree against its target engine, with the
9902
- * CAPABILITY GATE + node-local engine fallback (cam-615, 2026-08-01;
9902
+ * CAPABILITY GATE + node-local engine fallback (cam-101, 2026-08-01;
9903
9903
  * per-step split 2026-08-01 evening).
9904
9904
  *
9905
9905
  * A per-call `deviceKey` (orchestrator device routing / detail-plane step
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $ as applyModelBoundSettings, Cn as runtimeDevices$1, Dt as enumerateInferenceDevices, En as stepModelRunsOnFormat, Er as EventCategory, Gn as BaseAddon, I as PoolMemoryWatchdog, O as LABEL_SUPPLY_MACRO, Ot as evaluateZoneRules, Qt as overlayClusterStepSettings, Sn as rootSuppliesOf, Tr as union, Un as errMsg, Ut as loadContributionCapability, Vt as linkedLabelStepId, Y as YAMNET_TO_MACRO, Zn as createEvent, d as CLUSTER_MODEL_SCOPED_STEPS, dt as containingParentIndex, en as pickClusterStepSettings, fr as sleep, g as DEFAULT_CLUSTER_STEP_SETTINGS, gt as defaultDeviceFor$1, hr as array, jn as supportedRuntimes$1, lr as nodePin, mn as resolveClusterStepModelId, n as APPLE_SA_TO_MACRO, nr as hfModelUrl, rn as pipelineExecutorCapability, rr as hydrateSchema, ut as collectModelBoundKeys, wr as string, wt as edgetpuDelegateDevice, xr as object, xt as detectionPipelineCapability, yn as resolvePoolMemoryPolicy } from "../dist-BK3z-nti.mjs";
3
- import { c as readProcessCost } from "../node-BAcWHimZ.mjs";
4
- import { S as resolveModelDefaultConfidence, _ as getDefaultModelForFormat, b as resolveModelForFormat, c as resolveDefaultDetectionModel, d as localFrameRegistry, g as ALL_STEPS, h as ALL_PIPELINE_STEPS, l as macroGateVerdict, n as mergeCustomModels, o as deviceKeyOf, r as buildSubtreeCanRun, s as resolveDeviceEngine, t as CustomModelCatalog, v as getStep, x as landmarkPrecisionVerdict, y as getStepDefinition } from "../custom-model-catalog-Dx6W1kAo.mjs";
2
+ import { $ as applyModelBoundSettings, Cn as runtimeDevices$1, Dt as enumerateInferenceDevices, En as stepModelRunsOnFormat, Er as EventCategory, Gn as BaseAddon, I as PoolMemoryWatchdog, O as LABEL_SUPPLY_MACRO, Ot as evaluateZoneRules, Qt as overlayClusterStepSettings, Sn as rootSuppliesOf, Tr as union, Un as errMsg, Ut as loadContributionCapability, Vt as linkedLabelStepId, Y as YAMNET_TO_MACRO, Zn as createEvent, d as CLUSTER_MODEL_SCOPED_STEPS, dt as containingParentIndex, en as pickClusterStepSettings, fr as sleep, g as DEFAULT_CLUSTER_STEP_SETTINGS, gt as defaultDeviceFor$1, hr as array, jn as supportedRuntimes$1, lr as nodePin, mn as resolveClusterStepModelId, n as APPLE_SA_TO_MACRO, nr as hfModelUrl, rn as pipelineExecutorCapability, rr as hydrateSchema, ut as collectModelBoundKeys, wr as string, wt as edgetpuDelegateDevice, xr as object, xt as detectionPipelineCapability, yn as resolvePoolMemoryPolicy } from "../dist-Bg9whnXR.mjs";
3
+ import { c as readProcessCost } from "../node-CfgKBxdH.mjs";
4
+ import { S as resolveModelDefaultConfidence, _ as getDefaultModelForFormat, b as resolveModelForFormat, c as resolveDefaultDetectionModel, d as localFrameRegistry, g as ALL_STEPS, h as ALL_PIPELINE_STEPS, l as macroGateVerdict, n as mergeCustomModels, o as deviceKeyOf, r as buildSubtreeCanRun, s as resolveDeviceEngine, t as CustomModelCatalog, v as getStep, x as landmarkPrecisionVerdict, y as getStepDefinition } from "../custom-model-catalog-CacTUROW.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-OZwib1pK.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Z6v2Fm60.mjs";
7
7
  import * as os$1 from "node:os";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
@@ -866,7 +866,7 @@ var POOL_POISON_DRAIN_SLACK_MS = 1e3;
866
866
  * Max inference requests outstanding to ONE worker before new ones are SHED.
867
867
  *
868
868
  * Without this the camera dies permanently the first time the worker gets
869
- * slow, and it did: device 615 produced nothing for 52 minutes on 2026-07-31.
869
+ * slow, and it did: device 101 produced nothing for 52 minutes on 2026-07-31.
870
870
  * The worker was neither dead nor deadlocked — it was replying at full rate,
871
871
  * about a minute behind, and every reply landed after {@link
872
872
  * POOL_INFER_TIMEOUT_MS} had already abandoned its request. The proof is in the
@@ -2373,7 +2373,7 @@ function resolveEffectivePostprocessor(definition, modelId) {
2373
2373
  * Entry-based variant for callers that already hold the `ModelCatalogEntry` —
2374
2374
  * required for CUSTOM (operator-registered) models, which are NOT in
2375
2375
  * `definition.models` and would otherwise silently fall back to the step
2376
- * default decode (a Frigate `yolonas` model decoded as `yolo` produces no
2376
+ * default decode (a plus catalog `yolonas` model decoded as `yolo` produces no
2377
2377
  * error anywhere, just zero detections).
2378
2378
  */
2379
2379
  function resolveEffectivePostprocessorForEntry(definition, entry) {
@@ -4986,7 +4986,7 @@ function normalizeOutput(output) {
4986
4986
  * how rare full-frame phantoms are, which is the point: if this floods, that is
4987
4987
  * itself the finding."*
4988
4988
  *
4989
- * It flooded. Camera 615 emits a persistent full-frame `vehicle` phantom
4989
+ * It flooded. Camera 101 emits a persistent full-frame `vehicle` phantom
4990
4990
  * (score ~0.62, areaRatio 0.949) and the guard was writing **dozens of INFO
4991
4991
  * lines a second** on 2026-08-02. So the finding stands — that camera has a
4992
4992
  * standing phantom worth investigating — but the log volume is now costing more
@@ -5467,7 +5467,7 @@ async function alignFaceCrop(fullFrameJpeg, faceBbox, landmarksImageSpace, image
5467
5467
  * Detection score at/above which a near-full-frame box is trusted as a REAL
5468
5468
  * close subject rather than a phantom. Below this bar a full-frame box is
5469
5469
  * dropped; at/above it survives (a full-frame crop of a genuine close subject
5470
- * beats a phantom occupancy chip). The observed cam-615 phantom scored 0.52,
5470
+ * beats a phantom occupancy chip). The observed cam-101 phantom scored 0.52,
5471
5471
  * comfortably under this 0.70 bar; a genuine object right under the lens
5472
5472
  * (doorbell close-ups) commonly scores 0.65-0.85 — 0.70 keeps the legit band
5473
5473
  * above the bar while holding a wide margin over observed phantoms (~0.52).
@@ -5513,7 +5513,7 @@ function isUsableHardAreaCut(ratio) {
5513
5513
  * edge-to-edge in one axis) but SURVIVES because its score cleared the
5514
5514
  * confidence bar.
5515
5515
  *
5516
- * These are the ones worth counting: on 2026-07-30 device 615 produced six
5516
+ * These are the ones worth counting: on 2026-07-30 device 101 produced six
5517
5517
  * such boxes in a day, at 0.710-0.787, and they were only found by an offline
5518
5518
  * sweep of stored events — nothing in production reported them. Arming the
5519
5519
  * hard-area cut on a camera should be a decision made from this count, not
@@ -5606,7 +5606,7 @@ async function nativeChildCrop(provider, bbox, imageWidth, imageHeight, maxWidth
5606
5606
  * Plate-crop DESKEW — rotation rectification for oblique licence-plate crops.
5607
5607
  *
5608
5608
  * Plate crops reach the CTC recognizer as an axis-aligned bbox tile with NO
5609
- * geometric correction. On steeply oblique cameras (cam 617) the plate text is
5609
+ * geometric correction. On steeply oblique cameras (cam 102) the plate text is
5610
5610
  * skewed, and CTC collapses beyond ~10-15° of baseline tilt. This module
5611
5611
  * estimates the plate's dominant rotation from the crop ALONE (no plate quad is
5612
5612
  * available) and rotates the tile so the text baseline is horizontal before OCR.
@@ -5966,13 +5966,13 @@ var PLATE_OCR_CROP_POLICIES = {
5966
5966
  }
5967
5967
  };
5968
5968
  /**
5969
- * The margin around a plate box drawn by the ROOT model (D730) — a Frigate+
5969
+ * The margin around a plate box drawn by the ROOT model (D730) — a plus catalog
5970
5970
  * `license_plate` read in place of `plate-detection`'s own box.
5971
5971
  *
5972
5972
  * The margin is a property of the box's detector (see above), and this
5973
5973
  * detector's boxes have never been measured against the plate readers: 0.15 is
5974
5974
  * the value that served a TIGHT detector box (the deleted `yolov8n-plate`,
5975
- * 7/7 Kia reads at 0.13–0.16), on the assumption that Frigate+ boxes are
5975
+ * 7/7 Kia reads at 0.13–0.16), on the assumption that plus catalog boxes are
5976
5976
  * tight as well. It is uncalibrated and needs measuring on a ground-truth set
5977
5977
  * of root-supplied plates before it is trusted; until then it applies to every
5978
5978
  * reader alike, replacing the reader's own detector-specific margin.
@@ -6099,7 +6099,7 @@ function attachRootChildBoxes(candidates, parents, modelId, idGen) {
6099
6099
  * camera, is a rotated trapezoid inside it. Two things then destroy the read,
6100
6100
  * and neither is a resolution problem:
6101
6101
  *
6102
- * 1. **Aspect.** A German plate is 4.7 : 1. The boxes cam 617 produces measure
6102
+ * 1. **Aspect.** A German plate is 4.7 : 1. The boxes cam 102 produces measure
6103
6103
  * 1.3 – 2.0 : 1 — the box is 2-3× too tall because it circumscribes a
6104
6104
  * tilted rectangle. The recognizer resizes its input to a fixed 64px height
6105
6105
  * preserving aspect, so a 1.5 : 1 tile becomes ~96px wide: seven glyphs get
@@ -6116,7 +6116,7 @@ function attachRootChildBoxes(candidates, parents, modelId, idGen) {
6116
6116
  * OpenCV, no new dependency — sharp only decodes and re-encodes, exactly as
6117
6117
  * `plate-deskew.ts` and `native-child-crop.ts` do.
6118
6118
  *
6119
- * MEASURED on 21 ground-truthed cam-617 plate crops (9 distinct vehicles,
6119
+ * MEASURED on 21 ground-truthed cam-102 plate crops (9 distinct vehicles,
6120
6120
  * 2026-08-20 offline replay against the production `vgg_english_g2` weights and
6121
6121
  * the production CTC postprocessor):
6122
6122
  *
@@ -8666,7 +8666,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
8666
8666
  *
8667
8667
  * That false positive is not cosmetic. It is a readiness gate answering yes
8668
8668
  * on another machine's evidence, and it is exactly the log line that made a
8669
- * node with NO platform-probe addon at all (little-unraid, 2026-08-07: its
8669
+ * node with NO platform-probe addon at all (agent-a, 2026-08-07: its
8670
8670
  * `@camstack/system` package had been renamed out of `/data/addons`) look
8671
8671
  * like a node with a lossy event path. The pin makes the answer local: an
8672
8672
  * inline `nodeId` is the routing pin that survives the forked-addon → parent
@@ -9892,7 +9892,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
9892
9892
  }
9893
9893
  /**
9894
9894
  * Resolve a dispatch's step tree against its target engine, with the
9895
- * CAPABILITY GATE + node-local engine fallback (cam-615, 2026-08-01;
9895
+ * CAPABILITY GATE + node-local engine fallback (cam-101, 2026-08-01;
9896
9896
  * per-step split 2026-08-01 evening).
9897
9897
  *
9898
9898
  * A per-call `deviceKey` (orchestrator device routing / detail-plane step