@camstack/addon-pipeline 1.2.307 → 1.2.308

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 (31) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-DgdiQtQb.js → default-detection-model-2rHeRf0Y.js} +1 -1
  4. package/dist/{default-detection-model-BV9bIuOo.mjs → default-detection-model-DATyir0t.mjs} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-CyJWk-_f.js → dist-CdRsXAov.js} +79 -1
  8. package/dist/{dist-DdVMFlJ6.mjs → dist-jy-7xoW5.mjs} +74 -2
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-COu_tHy4.mjs → node-NCge1qZM.mjs} +1 -53
  12. package/dist/{node-HsWG5fGp.js → node-pWHpwpBa.js} +1 -53
  13. package/dist/pipeline-runner/index.js +3 -3
  14. package/dist/pipeline-runner/index.mjs +3 -3
  15. package/dist/{process-memory-Bz3oIMzl.mjs → process-memory-4K7QaQab.mjs} +1 -1
  16. package/dist/{process-memory-TQXG7qrJ.js → process-memory-C4ayPnww.js} +1 -1
  17. package/dist/recorder/index.js +82 -15
  18. package/dist/recorder/index.mjs +82 -15
  19. package/dist/{segment-demux-js-BrKa7tpr.js → segment-demux-js-0bM2Anej.js} +22 -4
  20. package/dist/{segment-demux-js-CEJn4BR0.mjs → segment-demux-js-BaI2VdPX.mjs} +17 -5
  21. package/dist/stream-broker/_stub.js +1 -1
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DdYUVQSA.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CkxD__Uy.mjs} +1 -1
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DEPTgXS_.mjs +26 -0
  24. package/dist/stream-broker/demux-worker-child.js +1 -1
  25. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  26. package/dist/stream-broker/{hostInit-D--a9rVM.mjs → hostInit-D56Gr-hD.mjs} +1 -1
  27. package/dist/stream-broker/index.js +305 -95
  28. package/dist/stream-broker/index.mjs +305 -95
  29. package/dist/stream-broker/remoteEntry.js +1 -1
  30. package/package.json +1 -1
  31. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DPHv0v3Q.mjs +0 -26
@@ -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-CyJWk-_f.js");
7
- const require_process_memory = require("../process-memory-TQXG7qrJ.js");
6
+ const require_dist = require("../dist-CdRsXAov.js");
7
+ const require_process_memory = require("../process-memory-C4ayPnww.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
10
10
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as PoolMemoryWatchdog, T as HF_BASE_URL, U as audioAnalysisCapability, Vn as EventCategory, W as audioAnalyzerCapability, Wt as resolvePoolMemoryPolicy, bn as hydrateSchema, fn as BaseAddon, hn as audioChunkBytesPerSample, n as AUDIO_BACKEND_CHOICES, p as DEFAULT_AUDIO_ANALYZER_CONFIG, un as errMsg, wn as nodePin, xt as mapAudioLabelToMacro, yn as expandAudioChunkToF32le } from "../dist-DdVMFlJ6.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Bz3oIMzl.mjs";
2
+ import { A as PoolMemoryWatchdog, Gt as resolvePoolMemoryPolicy, Hn as EventCategory, T as HF_BASE_URL, Tn as nodePin, U as audioAnalysisCapability, W as audioAnalyzerCapability, bn as expandAudioChunkToF32le, dn as errMsg, gn as audioChunkBytesPerSample, n as AUDIO_BACKEND_CHOICES, p as DEFAULT_AUDIO_ANALYZER_CONFIG, pn as BaseAddon, xn as hydrateSchema, xt as mapAudioLabelToMacro } from "../dist-jy-7xoW5.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-4K7QaQab.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CyJWk-_f.js");
1
+ const require_dist = require("./dist-CdRsXAov.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/registry/effective-confidence.ts
4
4
  /** The default in force: the model's own floor, else the step's. */
@@ -1,4 +1,4 @@
1
- import { G as audioKindId, _t as inferModelProvider, d as COCO_80_LABELS, f as COCO_TO_MACRO, gt as hfModelUrl, qt as stepModelRunsOnFormat, r as AUDIO_MACRO_LABELS, v as DEVICE_BACKEND_TO_FORMAT } from "./dist-DdVMFlJ6.mjs";
1
+ import { G as audioKindId, Jt as stepModelRunsOnFormat, _t as inferModelProvider, d as COCO_80_LABELS, f as COCO_TO_MACRO, gt as hfModelUrl, r as AUDIO_MACRO_LABELS, v as DEVICE_BACKEND_TO_FORMAT } from "./dist-jy-7xoW5.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/registry/effective-confidence.ts
4
4
  /** The default in force: the model's own floor, else the step's. */
@@ -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-CyJWk-_f.js");
7
- const require_node = require("../node-HsWG5fGp.js");
8
- const require_default_detection_model = require("../default-detection-model-DgdiQtQb.js");
6
+ const require_dist = require("../dist-CdRsXAov.js");
7
+ const require_node = require("../node-pWHpwpBa.js");
8
+ const require_default_detection_model = require("../default-detection-model-2rHeRf0Y.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-TQXG7qrJ.js");
10
+ const require_process_memory = require("../process-memory-C4ayPnww.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");
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $ as defaultDeviceFor$1, A as PoolMemoryWatchdog, An as array, At as pickClusterStepSettings, Bn as union, Bt as resolveClusterStepModelId, In as object, Kt as runtimeDevices$1, Nt as pipelineExecutorCapability, On as sleep, Ot as overlayClusterStepSettings, Qt as supportedRuntimes$1, Tn as parseJsonUnknown, V as YAMNET_TO_MACRO, Vn as EventCategory, Wt as resolvePoolMemoryPolicy, bn as hydrateSchema, fn as BaseAddon, gn as createEvent, m as DEFAULT_CLUSTER_STEP_SETTINGS, ot as enumerateInferenceDevices, qt as stepModelRunsOnFormat, rt as detectionPipelineCapability, st as evaluateZoneRules, t as APPLE_SA_TO_MACRO, u as CLUSTER_MODEL_SCOPED_STEPS, un as errMsg, v as DEVICE_BACKEND_TO_FORMAT, wn as nodePin, yt as loadContributionCapability, zn as string } from "../dist-DdVMFlJ6.mjs";
3
- import { s as readProcessCost } from "../node-COu_tHy4.mjs";
4
- import { _ as resolveModelForFormat, a as buildSubtreeCanRun, b as resolveModelDefaultConfidence, c as macroGateVerdict, f as ALL_PIPELINE_STEPS, g as getStepDefinition, h as getStep, i as mergeCustomModels, m as getDefaultModelForFormat, n as resolveDefaultDetectionModel, p as ALL_STEPS, r as CustomModelCatalog, u as localFrameRegistry, y as landmarkPrecisionVerdict } from "../default-detection-model-BV9bIuOo.mjs";
2
+ import { $ as defaultDeviceFor$1, $t as supportedRuntimes$1, A as PoolMemoryWatchdog, Bn as string, En as parseJsonUnknown, Gt as resolvePoolMemoryPolicy, Hn as EventCategory, Jt as stepModelRunsOnFormat, Ln as object, Pt as pipelineExecutorCapability, Tn as nodePin, V as YAMNET_TO_MACRO, Vn as union, Vt as resolveClusterStepModelId, _n as createEvent, dn as errMsg, jn as array, jt as pickClusterStepSettings, kn as sleep, kt as overlayClusterStepSettings, m as DEFAULT_CLUSTER_STEP_SETTINGS, ot as enumerateInferenceDevices, pn as BaseAddon, qt as runtimeDevices$1, rt as detectionPipelineCapability, st as evaluateZoneRules, t as APPLE_SA_TO_MACRO, u as CLUSTER_MODEL_SCOPED_STEPS, v as DEVICE_BACKEND_TO_FORMAT, xn as hydrateSchema, yt as loadContributionCapability } from "../dist-jy-7xoW5.mjs";
3
+ import { s as readProcessCost } from "../node-NCge1qZM.mjs";
4
+ import { _ as resolveModelForFormat, a as buildSubtreeCanRun, b as resolveModelDefaultConfidence, c as macroGateVerdict, f as ALL_PIPELINE_STEPS, g as getStepDefinition, h as getStep, i as mergeCustomModels, m as getDefaultModelForFormat, n as resolveDefaultDetectionModel, p as ALL_STEPS, r as CustomModelCatalog, u as localFrameRegistry, y as landmarkPrecisionVerdict } from "../default-detection-model-DATyir0t.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Bz3oIMzl.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-4K7QaQab.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";
@@ -7684,7 +7684,7 @@ function errMsg(err) {
7684
7684
  return String(err);
7685
7685
  }
7686
7686
  //#endregion
7687
- //#region ../types/dist/composition-BK-GTFYb.mjs
7687
+ //#region ../types/dist/composition-Dq42XWp0.mjs
7688
7688
  var AUDIO_ENCODER_BY_CODEC = {
7689
7689
  opus: "libopus",
7690
7690
  aac: "aac",
@@ -8393,6 +8393,58 @@ function replaceWithSortedKeys(_key, value) {
8393
8393
  return value;
8394
8394
  }
8395
8395
  /**
8396
+ * The ffmpeg build every CamStack node downloads, per platform and arch.
8397
+ *
8398
+ * ## Why a download, on every node, including the container
8399
+ *
8400
+ * The version of ffmpeg used to be CODE: baked into the image, changeable only
8401
+ * by rebuilding and rolling it. Now it is DATA — this file states the release,
8402
+ * and a node that boots with a different one downloads it. Changing ffmpeg is a
8403
+ * framework bump, not an image rebuild.
8404
+ *
8405
+ * It also settles the licence question by removing it. FFmpeg's licence is
8406
+ * chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
8407
+ * (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
8408
+ * makes the result undistributable. These are GPL v3 builds, and we do not
8409
+ * distribute them: the user's own node fetches the archive from the project
8410
+ * that publishes it, so we convey no GPL work and inherit none of the
8411
+ * obligations that come with conveying one. That is the whole reason the image
8412
+ * no longer installs ffmpeg at all — not a technical preference.
8413
+ *
8414
+ * ## Why jellyfin-ffmpeg
8415
+ *
8416
+ * One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
8417
+ * from one release, with the widest hardware surface of anything maintained:
8418
+ * VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
8419
+ * MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
8420
+ * so the binary is not linked against a driver stack it may not find.
8421
+ *
8422
+ * **What it still needs from the host, measured 2026-09-19.** On the Unraid
8423
+ * HOST, which has no libva, `-vaapi_device` aborts the process outright —
8424
+ * `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
8425
+ * "Assertion in generated code"' failed`. Inside our container, which installs
8426
+ * libva plus the iHD driver, the same command encodes: verified end to end with
8427
+ * `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
8428
+ * KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
8429
+ *
8430
+ * ## Why each artifact carries a checksum and a claim
8431
+ *
8432
+ * The download is now the only source, so `sha256` is verified before anything
8433
+ * is extracted — jellyfin publishes no checksums on its release assets, so
8434
+ * these are ours, taken at the version bump. And `expectedHwaccels` is what the
8435
+ * build is supposed to be able to do: a binary that probes short of its own
8436
+ * claim is a source that changed under us, which is precisely what went
8437
+ * unnoticed for months when a static build turned out to carry no VAAPI at all
8438
+ * (D536).
8439
+ */
8440
+ /** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
8441
+ var FFMPEG_RELEASE = "8.1.2-5";
8442
+ var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
8443
+ function portable(target) {
8444
+ return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
8445
+ }
8446
+ portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
8447
+ /**
8396
8448
  * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
8397
8449
  * valutatore puro del suo FRONTE.
8398
8450
  *
@@ -9777,6 +9829,26 @@ function egressTranscodeSharingKey(request, delivery = egressTransportFromReques
9777
9829
  return `egress:${canonicalHash(canonicalEgressPlan(request, delivery))}`;
9778
9830
  }
9779
9831
  /**
9832
+ * Memoize `ensure` on SUCCESS only.
9833
+ *
9834
+ * A failure is not remembered: the next caller asks again, so a node whose
9835
+ * first download failed (no network at boot) recovers on the next spawn that
9836
+ * needs it — with no timer and no retry loop, because the ask is driven by
9837
+ * work that actually wants the binary.
9838
+ */
9839
+ function memoizePinnedFfmpeg(ensure) {
9840
+ let pending = null;
9841
+ return () => {
9842
+ if (pending !== null) return pending;
9843
+ const attempt = ensure();
9844
+ pending = attempt;
9845
+ attempt.catch(() => {
9846
+ if (pending === attempt) pending = null;
9847
+ });
9848
+ return attempt;
9849
+ };
9850
+ }
9851
+ /**
9780
9852
  * Deep wiring healthcheck — snapshot of active reachability probes across
9781
9853
  * every declared capability + widget of every installed plugin, on every
9782
9854
  * node. Produced by the backend `WiringHealthService` and surfaced via
@@ -52880,6 +52952,12 @@ Object.defineProperty(exports, "mayWriteToLocation", {
52880
52952
  return mayWriteToLocation;
52881
52953
  }
52882
52954
  });
52955
+ Object.defineProperty(exports, "memoizePinnedFfmpeg", {
52956
+ enumerable: true,
52957
+ get: function() {
52958
+ return memoizePinnedFfmpeg;
52959
+ }
52960
+ });
52883
52961
  Object.defineProperty(exports, "migrateLegacyDeviceSignalConfig", {
52884
52962
  enumerable: true,
52885
52963
  get: function() {
@@ -7684,7 +7684,7 @@ function errMsg(err) {
7684
7684
  return String(err);
7685
7685
  }
7686
7686
  //#endregion
7687
- //#region ../types/dist/composition-BK-GTFYb.mjs
7687
+ //#region ../types/dist/composition-Dq42XWp0.mjs
7688
7688
  var AUDIO_ENCODER_BY_CODEC = {
7689
7689
  opus: "libopus",
7690
7690
  aac: "aac",
@@ -8393,6 +8393,58 @@ function replaceWithSortedKeys(_key, value) {
8393
8393
  return value;
8394
8394
  }
8395
8395
  /**
8396
+ * The ffmpeg build every CamStack node downloads, per platform and arch.
8397
+ *
8398
+ * ## Why a download, on every node, including the container
8399
+ *
8400
+ * The version of ffmpeg used to be CODE: baked into the image, changeable only
8401
+ * by rebuilding and rolling it. Now it is DATA — this file states the release,
8402
+ * and a node that boots with a different one downloads it. Changing ffmpeg is a
8403
+ * framework bump, not an image rebuild.
8404
+ *
8405
+ * It also settles the licence question by removing it. FFmpeg's licence is
8406
+ * chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
8407
+ * (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
8408
+ * makes the result undistributable. These are GPL v3 builds, and we do not
8409
+ * distribute them: the user's own node fetches the archive from the project
8410
+ * that publishes it, so we convey no GPL work and inherit none of the
8411
+ * obligations that come with conveying one. That is the whole reason the image
8412
+ * no longer installs ffmpeg at all — not a technical preference.
8413
+ *
8414
+ * ## Why jellyfin-ffmpeg
8415
+ *
8416
+ * One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
8417
+ * from one release, with the widest hardware surface of anything maintained:
8418
+ * VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
8419
+ * MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
8420
+ * so the binary is not linked against a driver stack it may not find.
8421
+ *
8422
+ * **What it still needs from the host, measured 2026-09-19.** On the Unraid
8423
+ * HOST, which has no libva, `-vaapi_device` aborts the process outright —
8424
+ * `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
8425
+ * "Assertion in generated code"' failed`. Inside our container, which installs
8426
+ * libva plus the iHD driver, the same command encodes: verified end to end with
8427
+ * `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
8428
+ * KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
8429
+ *
8430
+ * ## Why each artifact carries a checksum and a claim
8431
+ *
8432
+ * The download is now the only source, so `sha256` is verified before anything
8433
+ * is extracted — jellyfin publishes no checksums on its release assets, so
8434
+ * these are ours, taken at the version bump. And `expectedHwaccels` is what the
8435
+ * build is supposed to be able to do: a binary that probes short of its own
8436
+ * claim is a source that changed under us, which is precisely what went
8437
+ * unnoticed for months when a static build turned out to carry no VAAPI at all
8438
+ * (D536).
8439
+ */
8440
+ /** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
8441
+ var FFMPEG_RELEASE = "8.1.2-5";
8442
+ var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
8443
+ function portable(target) {
8444
+ return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
8445
+ }
8446
+ portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
8447
+ /**
8396
8448
  * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
8397
8449
  * valutatore puro del suo FRONTE.
8398
8450
  *
@@ -9777,6 +9829,26 @@ function egressTranscodeSharingKey(request, delivery = egressTransportFromReques
9777
9829
  return `egress:${canonicalHash(canonicalEgressPlan(request, delivery))}`;
9778
9830
  }
9779
9831
  /**
9832
+ * Memoize `ensure` on SUCCESS only.
9833
+ *
9834
+ * A failure is not remembered: the next caller asks again, so a node whose
9835
+ * first download failed (no network at boot) recovers on the next spawn that
9836
+ * needs it — with no timer and no retry loop, because the ask is driven by
9837
+ * work that actually wants the binary.
9838
+ */
9839
+ function memoizePinnedFfmpeg(ensure) {
9840
+ let pending = null;
9841
+ return () => {
9842
+ if (pending !== null) return pending;
9843
+ const attempt = ensure();
9844
+ pending = attempt;
9845
+ attempt.catch(() => {
9846
+ if (pending === attempt) pending = null;
9847
+ });
9848
+ return attempt;
9849
+ };
9850
+ }
9851
+ /**
9780
9852
  * Deep wiring healthcheck — snapshot of active reachability probes across
9781
9853
  * every declared capability + widget of every installed plugin, on every
9782
9854
  * node. Produced by the backend `WiringHealthService` and surfaced via
@@ -52232,4 +52304,4 @@ function enumerateInferenceDevices(hw) {
52232
52304
  return out;
52233
52305
  }
52234
52306
  //#endregion
52235
- export { defaultDeviceFor as $, videoclipsCapability as $t, PoolMemoryWatchdog as A, array as An, pickClusterStepSettings as At, VISIT_MERGE_GAP_MS as B, union as Bn, resolveClusterStepModelId as Bt, FailureCounters as C, makeSourceBrokerId as Cn, mayReadLocation as Ct, NativeLeaseAdmissionSchema as D, selectAssignedProfileSlots as Dn, motionDetectionCapability as Dt, MOTION_CLOSE_AFTER_MS as E, parseProfileBrokerId as En, modeMayWrite as Et, RECORDING_SOURCE_CAMSTACK_ADDON as F, number as Fn, rankStreams as Ft, audioKindId as G, resolveRecordingProfiles as Gt, addonWidgetsSourceCapability as H, resolveEgressDecodeHwAccel as Ht, RecordingConfigSchema as I, object as In, recordingArchiveCapability as It, clipExportFailure as J, storageEvictableCapability as Jt, batteryCapability as K, runtimeDevices as Kt, RecordingSignalStatusSchema as L, preprocess as Ln, recordingCapability as Lt, RATE_CONTROL_TIGHT as M, discriminatedUnion as Mn, pickNativeLeaseOverride as Mt, RECORDING_EXPORT_MAX_READ_BYTES as N, lazy as Nn, pipelineExecutorCapability as Nt, NativeLeaseSettingsSchema as O, sleep as On, overlayClusterStepSettings as Ot, RECORDING_SOURCE_CAMSTACK as P, literal as Pn, pipelineRunnerCapability as Pt, declareLogChannel as Q, supportedRuntimes as Qt, RingBuffer as R, record as Rn, recordingExportCapability as Rt, ExportRecordSchema as S, makeProfileBrokerId as Sn, maskUrlCredentials as St, HF_BASE_URL as T, parseJsonUnknown as Tn, migrateLegacyDeviceSignalConfig as Tt, audioAnalysisCapability as U, resolveLocationMode as Ut, YAMNET_TO_MACRO as V, EventCategory as Vn, resolveCreateExportSubject as Vt, audioAnalyzerCapability as W, resolvePoolMemoryPolicy as Wt, createHwAccelCache as X, streamBrokerCapability as Xt, clipExportFailureOf as Y, storageOccupancyCapability as Yt, createLogChannelsProvider as Z, stripRetiredBandPreBufferSec as Zt, DEFAULT_NATIVE_LEASE_SETTINGS as _, customAction as _n, inferModelProvider as _t, BatteryStatusSchema as a, evaluateSensorEdge as an, egressTransportFromRequest as at, EVENT_PAD_MS as b, hydrateSchema as bn, logChannelsCapability as bt, CLIP_STILL_REASON_HEADER as c, DeviceFeature as cn, evictionPolicyForMode as ct, COCO_80_LABELS as d, BOOT_RECOVERY_BACKOFF_MS as dn, failureContributionCapability as dt, webrtcSessionCapability as en, deriveBatteryPresence as et, COCO_TO_MACRO as f, BaseAddon as fn, ffmpegRate as ft, DEFAULT_EVENTS_BAND_BUFFER_SEC as g, createEvent as gn, hfModelUrl as gt, DEFAULT_DETAIL_CROP_CONVENTION as h, audioChunkBytesPerSample as hn, gifFromMp4Args as ht, BackgroundRunRegistry as i, buildFfmpegArgs as in, egressTranscodeSharingKey as it, RATE_CONTROL_RELAXED as j, boolean as jn, pickDetailCropConvention as jt, OpsLogEntrySchema as k, _enum as kn, parseProcStatus as kt, CLIP_STREAM_TRANSPORT_HEADER as l, DeviceType as ln, evictionPolicyOfLocation as lt, DEFAULT_CLUSTER_STEP_SETTINGS as m, CamProfileSchema as mn, gifDeriveSpeed as mt, AUDIO_BACKEND_CHOICES as n, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as nn, deriveRecordingMode as nt, CLIP_BROKER_PACED_RATES as o, invocationFromEncodeProfile as on, enumerateInferenceDevices as ot, DEFAULT_AUDIO_ANALYZER_CONFIG as p, CAM_PROFILE_ORDER as pn, gbToBytes as pt, cameraStreamsCapability as q, stepModelRunsOnFormat as qt, AUDIO_MACRO_LABELS as r, Fmp4BoxSplitter as rn, detectionPipelineCapability as rt, CLIP_STILL_REASON_CODE_HEADER as s, isSoftwareDecode as sn, evaluateZoneRules as st, APPLE_SA_TO_MACRO as t, AUDIO_PRESETS as tn, deriveDetailCropRect as tt, CLUSTER_MODEL_SCOPED_STEPS as u, errMsg as un, exportSubjectOf as ut, DEVICE_BACKEND_TO_FORMAT as v, defineCustomActions as vn, isFirstLevelMacroClass as vt, G711_SCALE_CORRECTION_DB as w, nodePin as wn, mayWriteToLocation as wt, EncodeProfileSchema as x, isEvent as xn, mapAudioLabelToMacro as xt, EVENT_OWNER_TYPES as y, expandAudioChunkToF32le as yn, loadContributionCapability as yt, VIDEOCLIPS_MAX_OFFER_BYTES as z, string as zn, recordingSignalCapability as zt };
52307
+ export { defaultDeviceFor as $, supportedRuntimes as $t, PoolMemoryWatchdog as A, _enum as An, parseProcStatus as At, VISIT_MERGE_GAP_MS as B, string as Bn, recordingSignalCapability as Bt, FailureCounters as C, makeProfileBrokerId as Cn, mayReadLocation as Ct, NativeLeaseAdmissionSchema as D, parseProfileBrokerId as Dn, modeMayWrite as Dt, MOTION_CLOSE_AFTER_MS as E, parseJsonUnknown as En, migrateLegacyDeviceSignalConfig as Et, RECORDING_SOURCE_CAMSTACK_ADDON as F, literal as Fn, pipelineRunnerCapability as Ft, audioKindId as G, resolvePoolMemoryPolicy as Gt, addonWidgetsSourceCapability as H, EventCategory as Hn, resolveCreateExportSubject as Ht, RecordingConfigSchema as I, number as In, rankStreams as It, clipExportFailure as J, stepModelRunsOnFormat as Jt, batteryCapability as K, resolveRecordingProfiles as Kt, RecordingSignalStatusSchema as L, object as Ln, recordingArchiveCapability as Lt, RATE_CONTROL_TIGHT as M, boolean as Mn, pickDetailCropConvention as Mt, RECORDING_EXPORT_MAX_READ_BYTES as N, discriminatedUnion as Nn, pickNativeLeaseOverride as Nt, NativeLeaseSettingsSchema as O, selectAssignedProfileSlots as On, motionDetectionCapability as Ot, RECORDING_SOURCE_CAMSTACK as P, lazy as Pn, pipelineExecutorCapability as Pt, declareLogChannel as Q, stripRetiredBandPreBufferSec as Qt, RingBuffer as R, preprocess as Rn, recordingCapability as Rt, ExportRecordSchema as S, isEvent as Sn, maskUrlCredentials as St, HF_BASE_URL as T, nodePin as Tn, memoizePinnedFfmpeg as Tt, audioAnalysisCapability as U, resolveEgressDecodeHwAccel as Ut, YAMNET_TO_MACRO as V, union as Vn, resolveClusterStepModelId as Vt, audioAnalyzerCapability as W, resolveLocationMode as Wt, createHwAccelCache as X, storageOccupancyCapability as Xt, clipExportFailureOf as Y, storageEvictableCapability as Yt, createLogChannelsProvider as Z, streamBrokerCapability as Zt, DEFAULT_NATIVE_LEASE_SETTINGS as _, createEvent as _n, inferModelProvider as _t, BatteryStatusSchema as a, buildFfmpegArgs as an, egressTransportFromRequest as at, EVENT_PAD_MS as b, expandAudioChunkToF32le as bn, logChannelsCapability as bt, CLIP_STILL_REASON_HEADER as c, isSoftwareDecode as cn, evictionPolicyForMode as ct, COCO_80_LABELS as d, errMsg as dn, failureContributionCapability as dt, videoclipsCapability as en, deriveBatteryPresence as et, COCO_TO_MACRO as f, BOOT_RECOVERY_BACKOFF_MS as fn, ffmpegRate as ft, DEFAULT_EVENTS_BAND_BUFFER_SEC as g, audioChunkBytesPerSample as gn, hfModelUrl as gt, DEFAULT_DETAIL_CROP_CONVENTION as h, CamProfileSchema as hn, gifFromMp4Args as ht, BackgroundRunRegistry as i, Fmp4BoxSplitter as in, egressTranscodeSharingKey as it, RATE_CONTROL_RELAXED as j, array as jn, pickClusterStepSettings as jt, OpsLogEntrySchema as k, sleep as kn, overlayClusterStepSettings as kt, CLIP_STREAM_TRANSPORT_HEADER as l, DeviceFeature as ln, evictionPolicyOfLocation as lt, DEFAULT_CLUSTER_STEP_SETTINGS as m, CAM_PROFILE_ORDER as mn, gifDeriveSpeed as mt, AUDIO_BACKEND_CHOICES as n, AUDIO_PRESETS as nn, deriveRecordingMode as nt, CLIP_BROKER_PACED_RATES as o, evaluateSensorEdge as on, enumerateInferenceDevices as ot, DEFAULT_AUDIO_ANALYZER_CONFIG as p, BaseAddon as pn, gbToBytes as pt, cameraStreamsCapability as q, runtimeDevices as qt, AUDIO_MACRO_LABELS as r, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as rn, detectionPipelineCapability as rt, CLIP_STILL_REASON_CODE_HEADER as s, invocationFromEncodeProfile as sn, evaluateZoneRules as st, APPLE_SA_TO_MACRO as t, webrtcSessionCapability as tn, deriveDetailCropRect as tt, CLUSTER_MODEL_SCOPED_STEPS as u, DeviceType as un, exportSubjectOf as ut, DEVICE_BACKEND_TO_FORMAT as v, customAction as vn, isFirstLevelMacroClass as vt, G711_SCALE_CORRECTION_DB as w, makeSourceBrokerId as wn, mayWriteToLocation as wt, EncodeProfileSchema as x, hydrateSchema as xn, mapAudioLabelToMacro as xt, EVENT_OWNER_TYPES as y, defineCustomActions as yn, loadContributionCapability as yt, VIDEOCLIPS_MAX_OFFER_BYTES as z, record as zn, recordingExportCapability as zt };
@@ -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-CyJWk-_f.js");
5
+ const require_dist = require("../dist-CdRsXAov.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 { Dt as motionDetectionCapability, bn as hydrateSchema, fn as BaseAddon, ln as DeviceType, st as evaluateZoneRules } from "../dist-DdVMFlJ6.mjs";
1
+ import { Ot as motionDetectionCapability, pn as BaseAddon, st as evaluateZoneRules, un as DeviceType, xn as hydrateSchema } from "../dist-jy-7xoW5.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,4 +1,4 @@
1
- import { in as buildFfmpegArgs, rn as Fmp4BoxSplitter, sn as isSoftwareDecode, un as errMsg } from "./dist-DdVMFlJ6.mjs";
1
+ import { an as buildFfmpegArgs, cn as isSoftwareDecode, dn as errMsg, in as Fmp4BoxSplitter } from "./dist-jy-7xoW5.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -112,58 +112,6 @@ async function probeFfmpegBinary(path) {
112
112
  ]);
113
113
  return parseFfmpegCapabilities(path, versionOut, hwaccelOut, encoderOut);
114
114
  }
115
- /**
116
- * The ffmpeg build every CamStack node downloads, per platform and arch.
117
- *
118
- * ## Why a download, on every node, including the container
119
- *
120
- * The version of ffmpeg used to be CODE: baked into the image, changeable only
121
- * by rebuilding and rolling it. Now it is DATA — this file states the release,
122
- * and a node that boots with a different one downloads it. Changing ffmpeg is a
123
- * framework bump, not an image rebuild.
124
- *
125
- * It also settles the licence question by removing it. FFmpeg's licence is
126
- * chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
127
- * (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
128
- * makes the result undistributable. These are GPL v3 builds, and we do not
129
- * distribute them: the user's own node fetches the archive from the project
130
- * that publishes it, so we convey no GPL work and inherit none of the
131
- * obligations that come with conveying one. That is the whole reason the image
132
- * no longer installs ffmpeg at all — not a technical preference.
133
- *
134
- * ## Why jellyfin-ffmpeg
135
- *
136
- * One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
137
- * from one release, with the widest hardware surface of anything maintained:
138
- * VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
139
- * MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
140
- * so the binary is not linked against a driver stack it may not find.
141
- *
142
- * **What it still needs from the host, measured 2026-09-19.** On the Unraid
143
- * HOST, which has no libva, `-vaapi_device` aborts the process outright —
144
- * `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
145
- * "Assertion in generated code"' failed`. Inside our container, which installs
146
- * libva plus the iHD driver, the same command encodes: verified end to end with
147
- * `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
148
- * KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
149
- *
150
- * ## Why each artifact carries a checksum and a claim
151
- *
152
- * The download is now the only source, so `sha256` is verified before anything
153
- * is extracted — jellyfin publishes no checksums on its release assets, so
154
- * these are ours, taken at the version bump. And `expectedHwaccels` is what the
155
- * build is supposed to be able to do: a binary that probes short of its own
156
- * claim is a source that changed under us, which is precisely what went
157
- * unnoticed for months when a static build turned out to carry no VAAPI at all
158
- * (D536).
159
- */
160
- /** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
161
- var FFMPEG_RELEASE = "8.1.2-5";
162
- var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
163
- function portable(target) {
164
- return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
165
- }
166
- portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
167
115
  var DEFAULT_FIRST_UNIT_TIMEOUT_MS = 12e3;
168
116
  /** Heartbeat cadence — ~2 minutes of 4 s fragments. */
169
117
  var FRAGMENT_LOG_EVERY = 30;
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-CyJWk-_f.js");
2
+ const require_dist = require("./dist-CdRsXAov.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);
@@ -115,58 +115,6 @@ async function probeFfmpegBinary(path) {
115
115
  ]);
116
116
  return parseFfmpegCapabilities(path, versionOut, hwaccelOut, encoderOut);
117
117
  }
118
- /**
119
- * The ffmpeg build every CamStack node downloads, per platform and arch.
120
- *
121
- * ## Why a download, on every node, including the container
122
- *
123
- * The version of ffmpeg used to be CODE: baked into the image, changeable only
124
- * by rebuilding and rolling it. Now it is DATA — this file states the release,
125
- * and a node that boots with a different one downloads it. Changing ffmpeg is a
126
- * framework bump, not an image rebuild.
127
- *
128
- * It also settles the licence question by removing it. FFmpeg's licence is
129
- * chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
130
- * (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
131
- * makes the result undistributable. These are GPL v3 builds, and we do not
132
- * distribute them: the user's own node fetches the archive from the project
133
- * that publishes it, so we convey no GPL work and inherit none of the
134
- * obligations that come with conveying one. That is the whole reason the image
135
- * no longer installs ffmpeg at all — not a technical preference.
136
- *
137
- * ## Why jellyfin-ffmpeg
138
- *
139
- * One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
140
- * from one release, with the widest hardware surface of anything maintained:
141
- * VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
142
- * MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
143
- * so the binary is not linked against a driver stack it may not find.
144
- *
145
- * **What it still needs from the host, measured 2026-09-19.** On the Unraid
146
- * HOST, which has no libva, `-vaapi_device` aborts the process outright —
147
- * `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
148
- * "Assertion in generated code"' failed`. Inside our container, which installs
149
- * libva plus the iHD driver, the same command encodes: verified end to end with
150
- * `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
151
- * KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
152
- *
153
- * ## Why each artifact carries a checksum and a claim
154
- *
155
- * The download is now the only source, so `sha256` is verified before anything
156
- * is extracted — jellyfin publishes no checksums on its release assets, so
157
- * these are ours, taken at the version bump. And `expectedHwaccels` is what the
158
- * build is supposed to be able to do: a binary that probes short of its own
159
- * claim is a source that changed under us, which is precisely what went
160
- * unnoticed for months when a static build turned out to carry no VAAPI at all
161
- * (D536).
162
- */
163
- /** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
164
- var FFMPEG_RELEASE = "8.1.2-5";
165
- var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
166
- function portable(target) {
167
- return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
168
- }
169
- portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
170
118
  var DEFAULT_FIRST_UNIT_TIMEOUT_MS = 12e3;
171
119
  /** Heartbeat cadence — ~2 minutes of 4 s fragments. */
172
120
  var FRAGMENT_LOG_EVERY = 30;
@@ -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-CyJWk-_f.js");
7
- const require_node = require("../node-HsWG5fGp.js");
8
- const require_default_detection_model = require("../default-detection-model-DgdiQtQb.js");
6
+ const require_dist = require("../dist-CdRsXAov.js");
7
+ const require_node = require("../node-pWHpwpBa.js");
8
+ const require_default_detection_model = require("../default-detection-model-2rHeRf0Y.js");
9
9
  const require_worker_protocol = require("../worker-protocol-C-G8qmye.js");
10
10
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
11
11
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
@@ -1,6 +1,6 @@
1
- import { An as array, C as FailureCounters, D as NativeLeaseAdmissionSchema, E as MOTION_CLOSE_AFTER_MS, Fn as number, In as object, Mt as pickNativeLeaseOverride, Nn as lazy, O as NativeLeaseSettingsSchema, Pn as literal, Pt as pipelineRunnerCapability, Vn as EventCategory, _ as DEFAULT_NATIVE_LEASE_SETTINGS, _n as customAction, dt as failureContributionCapability, fn as BaseAddon, gn as createEvent, h as DEFAULT_DETAIL_CROP_CONVENTION, i as BackgroundRunRegistry, jn as boolean, jt as pickDetailCropConvention, kn as _enum, tt as deriveDetailCropRect, un as errMsg, vn as defineCustomActions, wn as nodePin, yt as loadContributionCapability, zn as string } from "../dist-DdVMFlJ6.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-COu_tHy4.mjs";
3
- import { c as macroGateVerdict, d as resolveFrameViewGeometry, g as getStepDefinition, l as rootObjectGate, o as placeDetailStep, r as CustomModelCatalog, s as stepsForElectedPool, u as localFrameRegistry, v as RETIRED_MODEL_IDS } from "../default-detection-model-BV9bIuOo.mjs";
1
+ import { An as _enum, Bn as string, C as FailureCounters, D as NativeLeaseAdmissionSchema, E as MOTION_CLOSE_AFTER_MS, Fn as literal, Ft as pipelineRunnerCapability, Hn as EventCategory, In as number, Ln as object, Mn as boolean, Mt as pickDetailCropConvention, Nt as pickNativeLeaseOverride, O as NativeLeaseSettingsSchema, Pn as lazy, Tn as nodePin, _ as DEFAULT_NATIVE_LEASE_SETTINGS, _n as createEvent, dn as errMsg, dt as failureContributionCapability, h as DEFAULT_DETAIL_CROP_CONVENTION, i as BackgroundRunRegistry, jn as array, pn as BaseAddon, tt as deriveDetailCropRect, vn as customAction, yn as defineCustomActions, yt as loadContributionCapability } from "../dist-jy-7xoW5.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-NCge1qZM.mjs";
3
+ import { c as macroGateVerdict, d as resolveFrameViewGeometry, g as getStepDefinition, l as rootObjectGate, o as placeDetailStep, r as CustomModelCatalog, s as stepsForElectedPool, u as localFrameRegistry, v as RETIRED_MODEL_IDS } from "../default-detection-model-DATyir0t.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-D_NzPcnh.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
@@ -1,4 +1,4 @@
1
- import { kt as parseProcStatus } from "./dist-DdVMFlJ6.mjs";
1
+ import { At as parseProcStatus } from "./dist-jy-7xoW5.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
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-CyJWk-_f.js");
2
+ const require_dist = require("./dist-CdRsXAov.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");