@camstack/addon-pipeline 1.2.325 → 1.2.326

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 (39) hide show
  1. package/THIRD_PARTY_MODELS.md +6 -30
  2. package/dist/audio-analyzer/index.js +2 -2
  3. package/dist/audio-analyzer/index.mjs +2 -2
  4. package/dist/{default-detection-model-lWMQATmQ.mjs → default-detection-model-Bu4So71h.mjs} +96 -476
  5. package/dist/{default-detection-model-4nJVRIT6.js → default-detection-model-WnGDQAQh.js} +95 -481
  6. package/dist/detection-pipeline/index.js +9 -4
  7. package/dist/detection-pipeline/index.mjs +9 -4
  8. package/dist/{dist-DlgXwnqU.js → dist-BTBbIGSC.js} +31 -49
  9. package/dist/{dist-CbRb0Zyj.mjs → dist-BuU8Y4o1.mjs} +31 -49
  10. package/dist/motion-wasm/index.js +1 -1
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-s3wZnnJg.js → node-UK2v2ZSw.js} +1 -1
  13. package/dist/{node-CZ5DXcvq.mjs → node-inZFYgkm.mjs} +1 -1
  14. package/dist/pipeline-runner/index.js +3 -5
  15. package/dist/pipeline-runner/index.mjs +3 -5
  16. package/dist/{process-memory-C-mZ1LNi.js → process-memory-BfDlwJc4.js} +1 -1
  17. package/dist/{process-memory-CJsA4yRc.mjs → process-memory-DbSOL63T.mjs} +1 -1
  18. package/dist/recorder/index.js +3 -4
  19. package/dist/recorder/index.mjs +3 -4
  20. package/dist/{segment-demux-js-BbM0_Fmz.js → segment-demux-js-C1GXgxZ0.js} +1 -1
  21. package/dist/{segment-demux-js-CuwXgwpj.mjs → segment-demux-js-CMj020zz.mjs} +1 -1
  22. package/dist/stream-broker/_stub.js +1 -1
  23. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BobJEk9e.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-qHD9Dl1z.mjs} +2 -2
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BpXPNINd.mjs +26 -0
  25. package/dist/stream-broker/demux-worker-child.js +1 -1
  26. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  27. package/dist/stream-broker/{hostInit-C_x1pkx-.mjs → hostInit-BgWrKrQn.mjs} +2 -2
  28. package/dist/stream-broker/index.js +3 -3
  29. package/dist/stream-broker/index.mjs +3 -3
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/package.json +1 -1
  32. package/python/edgetpu_dequant.py +55 -0
  33. package/python/inference_pool.py +19 -3
  34. package/python/postprocessors/__init__.py +2 -0
  35. package/python/postprocessors/test_ssd.py +5 -6
  36. package/python/postprocessors/test_yolo_split_dfl.py +135 -0
  37. package/python/postprocessors/yolo_split_dfl.py +255 -0
  38. package/python/test_dequant_edgetpu.py +65 -0
  39. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-mEJkrfvj.mjs +0 -26
@@ -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-DlgXwnqU.js");
7
- const require_node = require("../node-s3wZnnJg.js");
8
- const require_default_detection_model = require("../default-detection-model-4nJVRIT6.js");
6
+ const require_dist = require("../dist-BTBbIGSC.js");
7
+ const require_node = require("../node-UK2v2ZSw.js");
8
+ const require_default_detection_model = require("../default-detection-model-WnGDQAQh.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-C-mZ1LNi.js");
10
+ const require_process_memory = require("../process-memory-BfDlwJc4.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");
@@ -2387,6 +2387,7 @@ function resolveEffectivePostprocessorForEntry(definition, entry) {
2387
2387
  var NMS_CONSUMING_POSTPROCESSORS = new Set([
2388
2388
  "yolo",
2389
2389
  "yolo-seg",
2390
+ "yolo-split-dfl",
2390
2391
  "rfdetr",
2391
2392
  "scrfd",
2392
2393
  "yunet"
@@ -4403,13 +4404,16 @@ var KNOWN_POSTPROCESSORS = new Set([
4403
4404
  "yolo",
4404
4405
  "ssd",
4405
4406
  "rfdetr",
4407
+ "yolonas",
4406
4408
  "yolo-seg",
4409
+ "yolo-split-dfl",
4407
4410
  "scrfd",
4408
4411
  "yunet",
4409
4412
  "arcface",
4410
4413
  "clip",
4411
4414
  "softmax",
4412
4415
  "ctc",
4416
+ "plate-slots",
4413
4417
  "saliency",
4414
4418
  "yamnet"
4415
4419
  ]);
@@ -8655,6 +8659,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
8655
8659
  }
8656
8660
  async downloadModel(input) {
8657
8661
  const { modelId, format, addonId } = input;
8662
+ await this.customModels.refresh(this.addonCtx?.api, { force: true });
8658
8663
  const modelEntry = await this.resolveModelEntry(addonId, modelId);
8659
8664
  if (!modelEntry) throw new Error(`Model "${modelId}" not found in step "${addonId}" catalog`);
8660
8665
  const formatEntry = modelEntry.formats[format];
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as PoolMemoryWatchdog, An as sleep, At as overlayClusterStepSettings, Dn as parseJsonUnknown, En as nodePin, Ft as pipelineExecutorCapability, Hn as union, Ht as resolveClusterStepModelId, Jt as runtimeDevices$1, Kt as resolvePoolMemoryPolicy, Mn as array, Mt as pickClusterStepSettings, Rn as object, Sn as hydrateSchema, Un as EventCategory, V as YAMNET_TO_MACRO, Vn as string, Yt as stepModelRunsOnFormat, bt as loadContributionCapability, ct as evaluateZoneRules, d as CLUSTER_MODEL_SCOPED_STEPS, en as supportedRuntimes$1, et as defaultDeviceFor$1, fn as errMsg, h as DEFAULT_CLUSTER_STEP_SETTINGS, it as detectionPipelineCapability, mn as BaseAddon, n as APPLE_SA_TO_MACRO, st as enumerateInferenceDevices, vn as createEvent, y as DEVICE_BACKEND_TO_FORMAT } from "../dist-CbRb0Zyj.mjs";
3
- import { s as readProcessCost } from "../node-CZ5DXcvq.mjs";
4
- import { S as resolveModelDefaultConfidence, _ as getStep, a as buildSubtreeCanRun, c as macroGateVerdict, g as getDefaultModelForFormat, h as ALL_STEPS, i as mergeCustomModels, m as ALL_PIPELINE_STEPS, n as resolveDefaultDetectionModel, r as CustomModelCatalog, u as localFrameRegistry, v as getStepDefinition, x as landmarkPrecisionVerdict, y as resolveModelForFormat } from "../default-detection-model-lWMQATmQ.mjs";
2
+ import { A as PoolMemoryWatchdog, An as sleep, At as overlayClusterStepSettings, Dn as parseJsonUnknown, En as nodePin, Ft as pipelineExecutorCapability, Hn as union, Ht as resolveClusterStepModelId, Jt as runtimeDevices$1, Kt as resolvePoolMemoryPolicy, Mn as array, Mt as pickClusterStepSettings, Rn as object, Sn as hydrateSchema, Un as EventCategory, V as YAMNET_TO_MACRO, Vn as string, Yt as stepModelRunsOnFormat, bt as loadContributionCapability, ct as evaluateZoneRules, d as CLUSTER_MODEL_SCOPED_STEPS, en as supportedRuntimes$1, et as defaultDeviceFor$1, fn as errMsg, h as DEFAULT_CLUSTER_STEP_SETTINGS, it as detectionPipelineCapability, mn as BaseAddon, n as APPLE_SA_TO_MACRO, st as enumerateInferenceDevices, vn as createEvent, y as DEVICE_BACKEND_TO_FORMAT } from "../dist-BuU8Y4o1.mjs";
3
+ import { s as readProcessCost } from "../node-inZFYgkm.mjs";
4
+ import { _ as getStep, a as buildSubtreeCanRun, b as landmarkPrecisionVerdict, c as macroGateVerdict, g as getDefaultModelForFormat, h as ALL_STEPS, i as mergeCustomModels, m as ALL_PIPELINE_STEPS, n as resolveDefaultDetectionModel, r as CustomModelCatalog, u as localFrameRegistry, v as getStepDefinition, x as resolveModelDefaultConfidence, y as resolveModelForFormat } from "../default-detection-model-Bu4So71h.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CJsA4yRc.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DbSOL63T.mjs";
7
7
  import * as os from "node:os";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
@@ -2380,6 +2380,7 @@ function resolveEffectivePostprocessorForEntry(definition, entry) {
2380
2380
  var NMS_CONSUMING_POSTPROCESSORS = new Set([
2381
2381
  "yolo",
2382
2382
  "yolo-seg",
2383
+ "yolo-split-dfl",
2383
2384
  "rfdetr",
2384
2385
  "scrfd",
2385
2386
  "yunet"
@@ -4396,13 +4397,16 @@ var KNOWN_POSTPROCESSORS = new Set([
4396
4397
  "yolo",
4397
4398
  "ssd",
4398
4399
  "rfdetr",
4400
+ "yolonas",
4399
4401
  "yolo-seg",
4402
+ "yolo-split-dfl",
4400
4403
  "scrfd",
4401
4404
  "yunet",
4402
4405
  "arcface",
4403
4406
  "clip",
4404
4407
  "softmax",
4405
4408
  "ctc",
4409
+ "plate-slots",
4406
4410
  "saliency",
4407
4411
  "yamnet"
4408
4412
  ]);
@@ -8648,6 +8652,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
8648
8652
  }
8649
8653
  async downloadModel(input) {
8650
8654
  const { modelId, format, addonId } = input;
8655
+ await this.customModels.refresh(this.addonCtx?.api, { force: true });
8651
8656
  const modelEntry = await this.resolveModelEntry(addonId, modelId);
8652
8657
  if (!modelEntry) throw new Error(`Model "${modelId}" not found in step "${addonId}" catalog`);
8653
8658
  const formatEntry = modelEntry.formats[format];
@@ -12669,11 +12669,11 @@ var ModelVariantGroupSchema = object({
12669
12669
  /** Quantization axis. Omit ⇒ the fp32 base build. */
12670
12670
  precision: _enum(["fp32", "int8"]).optional(),
12671
12671
  /**
12672
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
12673
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
12674
- * future performance variants plug into.
12672
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12673
+ * an alternate training of the same family (Scrypted `relu_test`); chip
12674
+ * label is "Test".
12675
12675
  */
12676
- optimization: _enum(["standard", "fast"]).optional(),
12676
+ optimization: _enum(["standard", "test"]).optional(),
12677
12677
  /**
12678
12678
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
12679
12679
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -12709,9 +12709,10 @@ function inferModelProvider(entry) {
12709
12709
  * are per upstream. A persisted custom-model row written when this field was a
12710
12710
  * string still parses — the string is lifted into `{ weights }`.
12711
12711
  *
12712
- * Every licence surface (the admin "Models and licenses" page,
12713
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
12714
- * these records by `scripts/gen-model-licenses.ts` (D661).
12712
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
12713
+ * model table) is GENERATED from these records by
12714
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
12715
+ * `camstack/docs` → `/docs/detection/models`.
12715
12716
  */
12716
12717
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
12717
12718
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -19781,7 +19782,7 @@ method(object({
19781
19782
  timeoutMs: 6e5
19782
19783
  });
19783
19784
  method(object({
19784
- nodeId: string(),
19785
+ targetNodeId: string(),
19785
19786
  modelId: string(),
19786
19787
  format: _enum(MODEL_FORMATS),
19787
19788
  entry: ModelCatalogEntrySchema
@@ -24057,39 +24058,19 @@ var CLUSTER_MODEL_SCOPED_STEPS = [{
24057
24058
  label: "Face recognition model",
24058
24059
  defaultModelId: "auraface-r100",
24059
24060
  indexName: "the enrolled face gallery",
24060
- options: [
24061
- {
24062
- id: "auraface-r100",
24063
- label: "AuraFace R100"
24064
- },
24065
- {
24066
- id: "arcface-r100",
24067
- label: "ArcFace (ResNet34)"
24068
- },
24069
- {
24070
- id: "inception-resnet-v1",
24071
- label: "Inception ResNet V1"
24072
- }
24073
- ]
24061
+ options: [{
24062
+ id: "auraface-r100",
24063
+ label: "AuraFace R100"
24064
+ }]
24074
24065
  }, {
24075
24066
  stepId: "clip-embedding",
24076
24067
  label: "Semantic search model",
24077
- defaultModelId: "mobileclip-s1",
24068
+ defaultModelId: "siglip2-b16-224",
24078
24069
  indexName: "the object semantic-search index",
24079
- options: [
24080
- {
24081
- id: "mobileclip-s1",
24082
- label: "MobileCLIP S1"
24083
- },
24084
- {
24085
- id: "mobileclip-s2",
24086
- label: "MobileCLIP S2"
24087
- },
24088
- {
24089
- id: "siglip2-b16-224",
24090
- label: "SigLIP2 B/16 (Apache-2.0)"
24091
- }
24092
- ]
24070
+ options: [{
24071
+ id: "siglip2-b16-224",
24072
+ label: "SigLIP2 B/16 (Apache-2.0)"
24073
+ }]
24093
24074
  }];
24094
24075
  Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
24095
24076
  function isHydratedField$2(entry) {
@@ -35707,7 +35688,13 @@ var OsdStatusSchema = object({ overlays: array(object({
35707
35688
  */
35708
35689
  availablePositions: array(OsdPositionEnum).readonly(),
35709
35690
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
35710
- readOnly: boolean().optional()
35691
+ readOnly: boolean().optional(),
35692
+ /**
35693
+ * Firmware text ceiling for this overlay. Absent = no known limit.
35694
+ * The OSD manager truncates here on every write — never stores its own
35695
+ * copy on the binding.
35696
+ */
35697
+ maxCharacters: number().int().positive().optional()
35711
35698
  })).readonly() });
35712
35699
  var OsdOverlayPatchSchema = object({
35713
35700
  enabled: boolean().optional(),
@@ -35758,7 +35745,9 @@ var OsdTemplateBindingSchema = object({
35758
35745
  valuePath: string().min(1).max(64),
35759
35746
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
35760
35747
  displayUnit: string().max(16).optional(),
35761
- maxDecimals: number().int().min(0).max(4).default(1)
35748
+ maxDecimals: number().int().min(0).max(4).default(1),
35749
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
35750
+ valueMap: record(string(), string()).optional()
35762
35751
  });
35763
35752
  /**
35764
35753
  * A named template: bindings (alias → leaf field) + a parser that
@@ -35808,18 +35797,11 @@ var OsdSlotBindingSchema = object({
35808
35797
  source: OsdSourceSchema,
35809
35798
  /** `${value}` and `${unit}` are substituted; every occurrence. */
35810
35799
  template: string().max(96).default("${value}"),
35811
- /** Truncate with an ellipsis past this length. Absent = no limit. */
35812
- maxCharacters: number().int().min(4).max(64).optional(),
35813
35800
  /**
35814
35801
  * Decimal places for a numeric value. `0` yields an integer — the
35815
35802
  * documented workaround for firmwares that reject `.` in overlay text.
35816
35803
  */
35817
35804
  maxDecimals: number().int().min(0).max(4).default(1),
35818
- /**
35819
- * Appended via `${unit}` when no unit conversion produces a label.
35820
- * Prefer `source.displayUnit` for converted device-state values.
35821
- */
35822
- unitLabel: string().max(8).optional(),
35823
35805
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
35824
35806
  valueMap: record(string(), string()).optional(),
35825
35807
  /** Time windows in which the slot is shown. Absent = always. */
@@ -35828,9 +35810,7 @@ var OsdSlotBindingSchema = object({
35828
35810
  * Display gate, in the notification centre's condition vocabulary.
35829
35811
  * Only the keys reported by `getConditionSupport` are accepted.
35830
35812
  */
35831
- conditions: NcConditionsSchema.optional(),
35832
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
35833
- fallbackText: string().max(64).default("")
35813
+ conditions: NcConditionsSchema.optional()
35834
35814
  });
35835
35815
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
35836
35816
  var OsdSlotViewSchema = object({
@@ -52391,6 +52371,8 @@ var STATE_SUMMARY_VARS = [
52391
52371
  [...RULE_TEXT],
52392
52372
  [...RULE_TEXT],
52393
52373
  [...RULE_TEXT],
52374
+ [...RULE_TEXT],
52375
+ [...RULE_TEXT],
52394
52376
  ...STATE_SUMMARY_VARS
52395
52377
  ];
52396
52378
  new Set([
@@ -12669,11 +12669,11 @@ var ModelVariantGroupSchema = object({
12669
12669
  /** Quantization axis. Omit ⇒ the fp32 base build. */
12670
12670
  precision: _enum(["fp32", "int8"]).optional(),
12671
12671
  /**
12672
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
12673
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
12674
- * future performance variants plug into.
12672
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12673
+ * an alternate training of the same family (Scrypted `relu_test`); chip
12674
+ * label is "Test".
12675
12675
  */
12676
- optimization: _enum(["standard", "fast"]).optional(),
12676
+ optimization: _enum(["standard", "test"]).optional(),
12677
12677
  /**
12678
12678
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
12679
12679
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -12709,9 +12709,10 @@ function inferModelProvider(entry) {
12709
12709
  * are per upstream. A persisted custom-model row written when this field was a
12710
12710
  * string still parses — the string is lifted into `{ weights }`.
12711
12711
  *
12712
- * Every licence surface (the admin "Models and licenses" page,
12713
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
12714
- * these records by `scripts/gen-model-licenses.ts` (D661).
12712
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
12713
+ * model table) is GENERATED from these records by
12714
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
12715
+ * `camstack/docs` → `/docs/detection/models`.
12715
12716
  */
12716
12717
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
12717
12718
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -19781,7 +19782,7 @@ method(object({
19781
19782
  timeoutMs: 6e5
19782
19783
  });
19783
19784
  method(object({
19784
- nodeId: string(),
19785
+ targetNodeId: string(),
19785
19786
  modelId: string(),
19786
19787
  format: _enum(MODEL_FORMATS),
19787
19788
  entry: ModelCatalogEntrySchema
@@ -24057,39 +24058,19 @@ var CLUSTER_MODEL_SCOPED_STEPS = [{
24057
24058
  label: "Face recognition model",
24058
24059
  defaultModelId: "auraface-r100",
24059
24060
  indexName: "the enrolled face gallery",
24060
- options: [
24061
- {
24062
- id: "auraface-r100",
24063
- label: "AuraFace R100"
24064
- },
24065
- {
24066
- id: "arcface-r100",
24067
- label: "ArcFace (ResNet34)"
24068
- },
24069
- {
24070
- id: "inception-resnet-v1",
24071
- label: "Inception ResNet V1"
24072
- }
24073
- ]
24061
+ options: [{
24062
+ id: "auraface-r100",
24063
+ label: "AuraFace R100"
24064
+ }]
24074
24065
  }, {
24075
24066
  stepId: "clip-embedding",
24076
24067
  label: "Semantic search model",
24077
- defaultModelId: "mobileclip-s1",
24068
+ defaultModelId: "siglip2-b16-224",
24078
24069
  indexName: "the object semantic-search index",
24079
- options: [
24080
- {
24081
- id: "mobileclip-s1",
24082
- label: "MobileCLIP S1"
24083
- },
24084
- {
24085
- id: "mobileclip-s2",
24086
- label: "MobileCLIP S2"
24087
- },
24088
- {
24089
- id: "siglip2-b16-224",
24090
- label: "SigLIP2 B/16 (Apache-2.0)"
24091
- }
24092
- ]
24070
+ options: [{
24071
+ id: "siglip2-b16-224",
24072
+ label: "SigLIP2 B/16 (Apache-2.0)"
24073
+ }]
24093
24074
  }];
24094
24075
  Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
24095
24076
  function isHydratedField$2(entry) {
@@ -35707,7 +35688,13 @@ var OsdStatusSchema = object({ overlays: array(object({
35707
35688
  */
35708
35689
  availablePositions: array(OsdPositionEnum).readonly(),
35709
35690
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
35710
- readOnly: boolean().optional()
35691
+ readOnly: boolean().optional(),
35692
+ /**
35693
+ * Firmware text ceiling for this overlay. Absent = no known limit.
35694
+ * The OSD manager truncates here on every write — never stores its own
35695
+ * copy on the binding.
35696
+ */
35697
+ maxCharacters: number().int().positive().optional()
35711
35698
  })).readonly() });
35712
35699
  var OsdOverlayPatchSchema = object({
35713
35700
  enabled: boolean().optional(),
@@ -35758,7 +35745,9 @@ var OsdTemplateBindingSchema = object({
35758
35745
  valuePath: string().min(1).max(64),
35759
35746
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
35760
35747
  displayUnit: string().max(16).optional(),
35761
- maxDecimals: number().int().min(0).max(4).default(1)
35748
+ maxDecimals: number().int().min(0).max(4).default(1),
35749
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
35750
+ valueMap: record(string(), string()).optional()
35762
35751
  });
35763
35752
  /**
35764
35753
  * A named template: bindings (alias → leaf field) + a parser that
@@ -35808,18 +35797,11 @@ var OsdSlotBindingSchema = object({
35808
35797
  source: OsdSourceSchema,
35809
35798
  /** `${value}` and `${unit}` are substituted; every occurrence. */
35810
35799
  template: string().max(96).default("${value}"),
35811
- /** Truncate with an ellipsis past this length. Absent = no limit. */
35812
- maxCharacters: number().int().min(4).max(64).optional(),
35813
35800
  /**
35814
35801
  * Decimal places for a numeric value. `0` yields an integer — the
35815
35802
  * documented workaround for firmwares that reject `.` in overlay text.
35816
35803
  */
35817
35804
  maxDecimals: number().int().min(0).max(4).default(1),
35818
- /**
35819
- * Appended via `${unit}` when no unit conversion produces a label.
35820
- * Prefer `source.displayUnit` for converted device-state values.
35821
- */
35822
- unitLabel: string().max(8).optional(),
35823
35805
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
35824
35806
  valueMap: record(string(), string()).optional(),
35825
35807
  /** Time windows in which the slot is shown. Absent = always. */
@@ -35828,9 +35810,7 @@ var OsdSlotBindingSchema = object({
35828
35810
  * Display gate, in the notification centre's condition vocabulary.
35829
35811
  * Only the keys reported by `getConditionSupport` are accepted.
35830
35812
  */
35831
- conditions: NcConditionsSchema.optional(),
35832
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
35833
- fallbackText: string().max(64).default("")
35813
+ conditions: NcConditionsSchema.optional()
35834
35814
  });
35835
35815
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
35836
35816
  var OsdSlotViewSchema = object({
@@ -52391,6 +52371,8 @@ var STATE_SUMMARY_VARS = [
52391
52371
  [...RULE_TEXT],
52392
52372
  [...RULE_TEXT],
52393
52373
  [...RULE_TEXT],
52374
+ [...RULE_TEXT],
52375
+ [...RULE_TEXT],
52394
52376
  ...STATE_SUMMARY_VARS
52395
52377
  ];
52396
52378
  new Set([
@@ -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-DlgXwnqU.js");
5
+ const require_dist = require("../dist-BTBbIGSC.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Sn as hydrateSchema, ct as evaluateZoneRules, dn as DeviceType, kt as motionDetectionCapability, mn as BaseAddon } from "../dist-CbRb0Zyj.mjs";
1
+ import { Sn as hydrateSchema, ct as evaluateZoneRules, dn as DeviceType, kt as motionDetectionCapability, mn as BaseAddon } from "../dist-BuU8Y4o1.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-DlgXwnqU.js");
2
+ const require_dist = require("./dist-BTBbIGSC.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);
@@ -1,4 +1,4 @@
1
- import { an as Fmp4BoxSplitter, fn as errMsg, ln as isSoftwareDecode, on as buildFfmpegArgs } from "./dist-CbRb0Zyj.mjs";
1
+ import { an as Fmp4BoxSplitter, fn as errMsg, ln as isSoftwareDecode, on as buildFfmpegArgs } from "./dist-BuU8Y4o1.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -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-DlgXwnqU.js");
7
- const require_node = require("../node-s3wZnnJg.js");
8
- const require_default_detection_model = require("../default-detection-model-4nJVRIT6.js");
6
+ const require_dist = require("../dist-BTBbIGSC.js");
7
+ const require_node = require("../node-UK2v2ZSw.js");
8
+ const require_default_detection_model = require("../default-detection-model-WnGDQAQh.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
10
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
11
11
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
@@ -6738,7 +6738,6 @@ var PipelineRunner = class {
6738
6738
  //#endregion
6739
6739
  //#region src/pipeline-runner/stateless-step.ts
6740
6740
  function modelServability(step, modelId, format) {
6741
- if (require_default_detection_model.RETIRED_MODEL_IDS[step.id]?.includes(modelId) === true) return { kind: "retired" };
6742
6741
  const entry = step.models.find((m) => m.id === modelId);
6743
6742
  if (entry === void 0) return { kind: "custom-model" };
6744
6743
  if (entry.formats[format] !== void 0) return { kind: "catalog-build" };
@@ -6783,7 +6782,6 @@ async function runStatelessStep(deps, input) {
6783
6782
  const format = await deps.executionFormat();
6784
6783
  if (format === null) return refuse(deps, input, "model-not-servable", "this node could not report the engine format it would dispatch on, so the model pin cannot be verified — running anyway would risk a silent format substitution");
6785
6784
  const servability = modelServability(definition, input.modelId, format);
6786
- if (servability.kind === "retired") return refuse(deps, input, "model-not-servable", `model "${input.modelId}" was retired from the ${definition.id} catalog — this node would have substituted the step default`);
6787
6785
  if (servability.kind === "no-build") return refuse(deps, input, "model-not-servable", `model "${input.modelId}" has no ${format} build (catalog ships: ${servability.availableFormats.join(", ") || "none"}) — this node would have substituted the ${format} default`);
6788
6786
  let decodeError = null;
6789
6787
  const crop = await cutFromFullFrame(input.frameJpeg, {
@@ -1,6 +1,6 @@
1
- import { D as NativeLeaseAdmissionSchema, En as nodePin, Fn as lazy, In as literal, It as pipelineRunnerCapability, Ln as number, Mn as array, Nn as boolean, Nt as pickDetailCropConvention, O as NativeLeaseSettingsSchema, Pt as pickNativeLeaseOverride, Rn as object, Un as EventCategory, Vn as string, a as BackgroundRunRegistry, bn as defineCustomActions, bt as loadContributionCapability, fn as errMsg, ft as failureContributionCapability, g as DEFAULT_DETAIL_CROP_CONVENTION, jn as _enum, mn as BaseAddon, nt as deriveDetailCropRect, q as cameraOwnsMotionViaSensor, v as DEFAULT_NATIVE_LEASE_SETTINGS, vn as createEvent, w as FailureCounters, yn as customAction } from "../dist-CbRb0Zyj.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-CZ5DXcvq.mjs";
3
- import { b as RETIRED_MODEL_IDS, c as macroGateVerdict, d as isSessionDecodeReadGone, f as createSessionDecodeCoordinator, l as rootObjectGate, o as placeDetailStep, p as resolveFrameViewGeometry, r as CustomModelCatalog, s as stepsForElectedPool, u as localFrameRegistry, v as getStepDefinition } from "../default-detection-model-lWMQATmQ.mjs";
1
+ import { D as NativeLeaseAdmissionSchema, En as nodePin, Fn as lazy, In as literal, It as pipelineRunnerCapability, Ln as number, Mn as array, Nn as boolean, Nt as pickDetailCropConvention, O as NativeLeaseSettingsSchema, Pt as pickNativeLeaseOverride, Rn as object, Un as EventCategory, Vn as string, a as BackgroundRunRegistry, bn as defineCustomActions, bt as loadContributionCapability, fn as errMsg, ft as failureContributionCapability, g as DEFAULT_DETAIL_CROP_CONVENTION, jn as _enum, mn as BaseAddon, nt as deriveDetailCropRect, q as cameraOwnsMotionViaSensor, v as DEFAULT_NATIVE_LEASE_SETTINGS, vn as createEvent, w as FailureCounters, yn as customAction } from "../dist-BuU8Y4o1.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-inZFYgkm.mjs";
3
+ import { c as macroGateVerdict, d as isSessionDecodeReadGone, f as createSessionDecodeCoordinator, l as rootObjectGate, o as placeDetailStep, p as resolveFrameViewGeometry, r as CustomModelCatalog, s as stepsForElectedPool, u as localFrameRegistry, v as getStepDefinition } from "../default-detection-model-Bu4So71h.mjs";
4
4
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
6
  import { c as withDetectionIntent, o as preRollRequestOf, t as DETECTION_PRE_ROLL_REQUEST_MS } from "../restream-intent-DyGmLAU9.mjs";
@@ -6730,7 +6730,6 @@ var PipelineRunner = class {
6730
6730
  //#endregion
6731
6731
  //#region src/pipeline-runner/stateless-step.ts
6732
6732
  function modelServability(step, modelId, format) {
6733
- if (RETIRED_MODEL_IDS[step.id]?.includes(modelId) === true) return { kind: "retired" };
6734
6733
  const entry = step.models.find((m) => m.id === modelId);
6735
6734
  if (entry === void 0) return { kind: "custom-model" };
6736
6735
  if (entry.formats[format] !== void 0) return { kind: "catalog-build" };
@@ -6775,7 +6774,6 @@ async function runStatelessStep(deps, input) {
6775
6774
  const format = await deps.executionFormat();
6776
6775
  if (format === null) return refuse(deps, input, "model-not-servable", "this node could not report the engine format it would dispatch on, so the model pin cannot be verified — running anyway would risk a silent format substitution");
6777
6776
  const servability = modelServability(definition, input.modelId, format);
6778
- if (servability.kind === "retired") return refuse(deps, input, "model-not-servable", `model "${input.modelId}" was retired from the ${definition.id} catalog — this node would have substituted the step default`);
6779
6777
  if (servability.kind === "no-build") return refuse(deps, input, "model-not-servable", `model "${input.modelId}" has no ${format} build (catalog ships: ${servability.availableFormats.join(", ") || "none"}) — this node would have substituted the ${format} default`);
6780
6778
  let decodeError = null;
6781
6779
  const crop = await cutFromFullFrame(input.frameJpeg, {
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-DlgXwnqU.js");
2
+ const require_dist = require("./dist-BTBbIGSC.js");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_chunk.__toESM(node_fs);
5
5
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { jt as parseProcStatus } from "./dist-CbRb0Zyj.mjs";
1
+ import { jt as parseProcStatus } from "./dist-BuU8Y4o1.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } from "node:child_process";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -3,8 +3,8 @@ 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-DlgXwnqU.js");
7
- const require_node = require("../node-s3wZnnJg.js");
6
+ const require_dist = require("../dist-BTBbIGSC.js");
7
+ const require_node = require("../node-UK2v2ZSw.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
9
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
10
10
  const require_retire_root_keys = require("../retire-root-keys-Csb8z2f3.js");
@@ -6029,8 +6029,7 @@ Object.freeze({
6029
6029
  "setSlotBinding": { "binding": { "__nested__": {
6030
6030
  "enabled": true,
6031
6031
  "template": "${value}",
6032
- "maxDecimals": 1,
6033
- "fallbackText": ""
6032
+ "maxDecimals": 1
6034
6033
  } } },
6035
6034
  "upsertTemplate": { "template": { "__nested__": {
6036
6035
  "bindings": [],
@@ -1,5 +1,5 @@
1
- import { $t as stripRetiredBandPreBufferSec, An as sleep$1, B as VISIT_MERGE_GAP_MS, Bn as record, Bt as recordingExportCapability, C as ExportRecordSchema, Dt as migrateLegacyDeviceSignalConfig, En as nodePin, Et as memoizePinnedFfmpeg, F as RECORDING_SOURCE_CAMSTACK_ADDON, Gt as resolveLocationMode, I as RecordingConfigSchema, K as batteryCapability, L as RecordingSignalStatusSchema, Ln as number, Mn as array, N as RECORDING_EXPORT_MAX_READ_BYTES, Nn as boolean, Ot as modeMayWrite, P as RECORDING_SOURCE_CAMSTACK, Rn as object, Rt as recordingArchiveCapability, Sn as hydrateSchema, Tt as mayWriteToLocation, Un as EventCategory, Ut as resolveCreateExportSubject, Vn as string, Vt as recordingSignalCapability, X as clipExportFailureOf, Xt as storageEvictableCapability, Y as clipExportFailure, Zt as storageOccupancyCapability, _ as DEFAULT_EVENTS_BAND_BUFFER_SEC, b as EVENT_OWNER_TYPES, bn as defineCustomActions, bt as loadContributionCapability, dn as DeviceType, dt as exportSubjectOf, fn as errMsg$1, jn as _enum, k as OpsLogEntrySchema, kn as selectAssignedProfileSlots, lt as evictionPolicyForMode, mn as BaseAddon, mt as gbToBytes, o as BatteryStatusSchema, qt as resolveRecordingProfiles, rt as deriveRecordingMode, s as CLIP_BROKER_PACED_RATES, sn as evaluateSensorEdge, tn as videoclipsCapability, tt as deriveBatteryPresence, un as DeviceFeature, ut as evictionPolicyOfLocation, wt as mayReadLocation, x as EVENT_PAD_MS, yn as customAction, yt as isFirstLevelMacroClass, z as VIDEOCLIPS_MAX_OFFER_BYTES, zn as preprocess, zt as recordingCapability } from "../dist-CbRb0Zyj.mjs";
2
- import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-CZ5DXcvq.mjs";
1
+ import { $t as stripRetiredBandPreBufferSec, An as sleep$1, B as VISIT_MERGE_GAP_MS, Bn as record, Bt as recordingExportCapability, C as ExportRecordSchema, Dt as migrateLegacyDeviceSignalConfig, En as nodePin, Et as memoizePinnedFfmpeg, F as RECORDING_SOURCE_CAMSTACK_ADDON, Gt as resolveLocationMode, I as RecordingConfigSchema, K as batteryCapability, L as RecordingSignalStatusSchema, Ln as number, Mn as array, N as RECORDING_EXPORT_MAX_READ_BYTES, Nn as boolean, Ot as modeMayWrite, P as RECORDING_SOURCE_CAMSTACK, Rn as object, Rt as recordingArchiveCapability, Sn as hydrateSchema, Tt as mayWriteToLocation, Un as EventCategory, Ut as resolveCreateExportSubject, Vn as string, Vt as recordingSignalCapability, X as clipExportFailureOf, Xt as storageEvictableCapability, Y as clipExportFailure, Zt as storageOccupancyCapability, _ as DEFAULT_EVENTS_BAND_BUFFER_SEC, b as EVENT_OWNER_TYPES, bn as defineCustomActions, bt as loadContributionCapability, dn as DeviceType, dt as exportSubjectOf, fn as errMsg$1, jn as _enum, k as OpsLogEntrySchema, kn as selectAssignedProfileSlots, lt as evictionPolicyForMode, mn as BaseAddon, mt as gbToBytes, o as BatteryStatusSchema, qt as resolveRecordingProfiles, rt as deriveRecordingMode, s as CLIP_BROKER_PACED_RATES, sn as evaluateSensorEdge, tn as videoclipsCapability, tt as deriveBatteryPresence, un as DeviceFeature, ut as evictionPolicyOfLocation, wt as mayReadLocation, x as EVENT_PAD_MS, yn as customAction, yt as isFirstLevelMacroClass, z as VIDEOCLIPS_MAX_OFFER_BYTES, zn as preprocess, zt as recordingCapability } from "../dist-BuU8Y4o1.mjs";
2
+ import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-inZFYgkm.mjs";
3
3
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
4
4
  import { d as PREBUFFER_MAX_MS, l as withRecordingIntent, r as RECORDING_PRE_ROLL_REQUEST_MS } from "../restream-intent-DyGmLAU9.mjs";
5
5
  import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DZvlso2l.mjs";
@@ -6021,8 +6021,7 @@ Object.freeze({
6021
6021
  "setSlotBinding": { "binding": { "__nested__": {
6022
6022
  "enabled": true,
6023
6023
  "template": "${value}",
6024
- "maxDecimals": 1,
6025
- "fallbackText": ""
6024
+ "maxDecimals": 1
6026
6025
  } } },
6027
6026
  "upsertTemplate": { "template": { "__nested__": {
6028
6027
  "bindings": [],
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-DlgXwnqU.js");
2
+ const require_dist = require("./dist-BTBbIGSC.js");
3
3
  let node_child_process = require("node:child_process");
4
4
  //#region src/stream-broker/recorded/avcc-annexb.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { r as __toESM, t as __commonJSMin } from "./chunk-DnnnRqeS.mjs";
2
- import { fn as errMsg } from "./dist-CbRb0Zyj.mjs";
2
+ import { fn as errMsg } from "./dist-BuU8Y4o1.mjs";
3
3
  import { spawn } from "node:child_process";
4
4
  //#region src/stream-broker/recorded/avcc-annexb.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-mEJkrfvj.mjs";
1
+ import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BpXPNINd.mjs";
2
2
  import { a as p, i as m, n as h, o as g, r as _, t as v } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.js-C9j-2lBe.mjs";
3
3
  import { n as y, r as b, t as x } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-XO0-Pyu6.mjs";
4
4
  import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-NkeMtp-v.mjs";
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.303",
21
+ version: "1.2.304",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_stream_broker_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.230",
36
+ version: "1.2.231",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_stream_broker_widgets",