@camstack/addon-pipeline 1.2.192 → 1.2.193

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 (35) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/detection-pipeline/index.js +7 -7
  4. package/dist/detection-pipeline/index.mjs +5 -5
  5. package/dist/{dist-CXO_Fmx6.js → dist-HG5geL9t.js} +129 -1
  6. package/dist/{dist-B8J7wrtY.mjs → dist-mYDK58Jp.mjs} +118 -2
  7. package/dist/{lazy-sharp-o-aNNXuz.js → lazy-sharp-DmAwZ0s9.js} +1 -1
  8. package/dist/{local-frame-registry-BDeDpYQk.mjs → local-frame-registry-av9ObDG0.mjs} +1 -1
  9. package/dist/{local-frame-registry-P7tSfvaY.js → local-frame-registry-x3m6SNqf.js} +1 -1
  10. package/dist/motion-wasm/index.js +2 -2
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-DF98pVP7.js → node--my8JTOW.js} +1 -1
  13. package/dist/{node-BSbB0or0.mjs → node-xRsaPwBa.mjs} +1 -1
  14. package/dist/pipeline-runner/index.js +255 -221
  15. package/dist/pipeline-runner/index.mjs +253 -219
  16. package/dist/{process-memory-BZTgJyE8.mjs → process-memory-BDHR3lxe.mjs} +1 -1
  17. package/dist/{process-memory-BVMk3gfY.js → process-memory-CoCSce63.js} +1 -1
  18. package/dist/recorder/index.js +319 -8
  19. package/dist/recorder/index.mjs +319 -8
  20. package/dist/{segment-demux-js-CLaSHw0n.js → segment-demux-js-CBynn9Gh.js} +1 -1
  21. package/dist/{segment-demux-js-0L1EF4Fg.mjs → segment-demux-js-CXvgKfsn.mjs} +1 -1
  22. package/dist/session-decode/decode-worker-child.js +2 -2
  23. package/dist/session-decode/decode-worker-child.mjs +1 -1
  24. package/dist/stream-broker/_stub.js +1 -1
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BmNfrv_U.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CUjbLOm9.mjs} +3 -3
  26. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D8AK-_F6.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B_NVJXAy.mjs} +1 -1
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-DQLtjntf.mjs → hostInit-DnBCyuSA.mjs} +3 -3
  30. package/dist/stream-broker/index.js +93 -43
  31. package/dist/stream-broker/index.mjs +93 -43
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/dist/{worker-protocol-WiXU2VuW.mjs → worker-protocol-C0R1DDC0.mjs} +1 -1
  34. package/dist/{worker-protocol-BJzhw3t0.js → worker-protocol-DCsi4YS1.js} +1 -1
  35. package/package.json +1 -1
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CXO_Fmx6.js");
6
- const require_process_memory = require("../process-memory-BVMk3gfY.js");
5
+ const require_dist = require("../dist-HG5geL9t.js");
6
+ const require_process_memory = require("../process-memory-CoCSce63.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_dist.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-B8J7wrtY.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BZTgJyE8.mjs";
2
+ import { Et as errMsg, M as audioAnalyzerCapability, Nt as BaseAddon, Rt as hydrateSchema, S as PoolMemoryWatchdog, j as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, rt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, yt as resolvePoolMemoryPolicy } from "../dist-mYDK58Jp.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BDHR3lxe.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";
@@ -2,12 +2,14 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CXO_Fmx6.js");
6
- const require_node = require("../node-DF98pVP7.js");
7
- const require_local_frame_registry = require("../local-frame-registry-P7tSfvaY.js");
8
- const require_lazy_sharp = require("../lazy-sharp-o-aNNXuz.js");
5
+ const require_dist = require("../dist-HG5geL9t.js");
6
+ const require_node = require("../node--my8JTOW.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-x3m6SNqf.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-DmAwZ0s9.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-BVMk3gfY.js");
10
+ const require_process_memory = require("../process-memory-CoCSce63.js");
11
+ let node_os = require("node:os");
12
+ node_os = require_dist.__toESM(node_os);
11
13
  let node_fs = require("node:fs");
12
14
  node_fs = require_dist.__toESM(node_fs);
13
15
  let node_path = require("node:path");
@@ -15,8 +17,6 @@ node_path = require_dist.__toESM(node_path);
15
17
  let node_child_process = require("node:child_process");
16
18
  let sharp = require("sharp");
17
19
  sharp = require_dist.__toESM(sharp);
18
- let node_os = require("node:os");
19
- node_os = require_dist.__toESM(node_os);
20
20
  let _camstack_system_addon_utils = require("@camstack/system/addon-utils");
21
21
  //#region src/detection-pipeline/runtimes.ts
22
22
  var KNOWN_PLATFORMS = [
@@ -1,16 +1,16 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-B8J7wrtY.mjs";
3
- import { a as readProcessCost } from "../node-BSbB0or0.mjs";
4
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-BDeDpYQk.mjs";
2
+ import { $ as inferModelProvider, B as defaultDeviceFor$1, Et as errMsg, G as detectionPipelineCapability, Ht as nodePin, J as enumerateInferenceDevices, Jt as array, Kt as sleep, Lt as createEvent, Nt as BaseAddon, Rt as hydrateSchema, S as PoolMemoryWatchdog, Ut as parseJsonUnknown, X as evaluateZoneRules, _t as resolveClusterStepModelId, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepModels, en as object, ft as pipelineExecutorCapability, in as EventCategory, k as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, lt as pickClusterStepSettings, m as DEVICE_BACKEND_TO_FORMAT, nn as string, ot as overlayClusterStepSettings, rn as union, t as APPLE_SA_TO_MACRO, tt as loadContributionCapability, wt as supportedRuntimes$1, xt as runtimeDevices$1, yt as resolvePoolMemoryPolicy } from "../dist-mYDK58Jp.mjs";
3
+ import { a as readProcessCost } from "../node-xRsaPwBa.mjs";
4
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-av9ObDG0.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
6
  import { n as startEventLoopStallMonitor } from "../event-loop-stall-monitor-DXLNBMkY.mjs";
7
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BZTgJyE8.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BDHR3lxe.mjs";
8
+ import * as os from "node:os";
8
9
  import * as fs from "node:fs";
9
10
  import * as path$1 from "node:path";
10
11
  import { dirname, join } from "node:path";
11
12
  import { spawn } from "node:child_process";
12
13
  import sharp from "sharp";
13
- import * as os from "node:os";
14
14
  import { deleteModelFromDisk, ensureModel, isModelDownloaded } from "@camstack/system/addon-utils";
15
15
  //#region src/detection-pipeline/runtimes.ts
16
16
  var KNOWN_PLATFORMS = [
@@ -6490,6 +6490,21 @@ var CameraStreamSchema = object({
6490
6490
  */
6491
6491
  autoEligible: boolean().optional(),
6492
6492
  /**
6493
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6494
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6495
+ * stream. Consulted by the broker's automatic ranking
6496
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6497
+ * an operator's manual assignment still wins, and an absent hint is the
6498
+ * pixel-ranked default every camera had before this field existed.
6499
+ *
6500
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6501
+ * storage class is written for on its own (`recordings` is high|mid,
6502
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6503
+ * camera's single 720p relay is a `low` in every respect except the slot the
6504
+ * heuristic put it in.
6505
+ */
6506
+ profileHint: CamProfileSchema.optional(),
6507
+ /**
6493
6508
  * Transport-specific opaque metadata. The broker passes it through to
6494
6509
  * the source reader without inspecting it. Currently used by
6495
6510
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -9155,7 +9170,22 @@ var RecordingTriggersSchema = object({
9155
9170
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
9156
9171
  * registrare.
9157
9172
  */
9158
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9173
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
9174
+ /**
9175
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
9176
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
9177
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
9178
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
9179
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
9180
+ *
9181
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
9182
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
9183
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
9184
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
9185
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
9186
+ * (`holdTrigger` / `releaseTrigger`).
9187
+ */
9188
+ deviceSignal: boolean().optional()
9159
9189
  });
9160
9190
  /**
9161
9191
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -12921,6 +12951,8 @@ var streamBrokerCapability = {
12921
12951
  label: string().optional(),
12922
12952
  deviceFeatures: array(string()).optional(),
12923
12953
  autoEligible: boolean().optional(),
12954
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
12955
+ profileHint: CamProfileSchema.optional(),
12924
12956
  metadata: record(string(), unknown()).optional(),
12925
12957
  /** Required when kind === 'derived' — the source camStreamId the
12926
12958
  * derived broker reads its encoded plane from.
@@ -30724,6 +30756,77 @@ var recordingExportCapability = {
30724
30756
  }
30725
30757
  };
30726
30758
  /**
30759
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
30760
+ * something it knows about is happening (a robot vacuum cleaning, a machine
30761
+ * running, a gate open) and lowers when it stops.
30762
+ *
30763
+ * It is a level, not an edge. The sensor triggers the recorder already listens
30764
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
30765
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
30766
+ * still happening" cannot be expressed as an edge plus a post-buffer without
30767
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
30768
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
30769
+ * which records the dock for that long after every short one. So the recorder
30770
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
30771
+ * own post-buffer once it falls.
30772
+ *
30773
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
30774
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
30775
+ * writes this slice on every change; consumers subscribe to the kernel's
30776
+ * `DeviceStateChanged` for it and read it back through
30777
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
30778
+ * against the device (D224, D8/D11).
30779
+ *
30780
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
30781
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
30782
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
30783
+ * about the camera, on the camera.
30784
+ */
30785
+ var RecordingSignalStatusSchema = object({
30786
+ /** True while the device asks to be recorded. */
30787
+ active: boolean(),
30788
+ /**
30789
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
30790
+ * …). Free text for the log line and the UI badge; the recorder never
30791
+ * branches on it.
30792
+ */
30793
+ reason: string(),
30794
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
30795
+ lastChangedAt: number()
30796
+ });
30797
+ /** The runtime-state slice: the status plus the clock every slice carries. */
30798
+ var RecordingSignalRuntimeStateSchema = RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
30799
+ var recordingSignalCapability = {
30800
+ name: "recording-signal",
30801
+ scope: "device",
30802
+ deviceNative: true,
30803
+ mode: "singleton",
30804
+ deviceTypes: [DeviceType.Camera],
30805
+ methods: {
30806
+ /** The current level, straight from the slice the provider keeps fresh. */
30807
+ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) },
30808
+ status: {
30809
+ schema: RecordingSignalStatusSchema,
30810
+ kind: "push",
30811
+ empty: {
30812
+ active: false,
30813
+ reason: "unknown",
30814
+ lastChangedAt: 0
30815
+ }
30816
+ },
30817
+ runtimeState: RecordingSignalRuntimeStateSchema,
30818
+ /**
30819
+ * Runtime-state durability: **session** — a restored `active: true` from
30820
+ * before a restart is exactly the stale level the recorder's reconcile bound
30821
+ * exists to end, and the provider re-derives the true level on activation
30822
+ * anyway. Nothing is lost by forgetting it; a lie is avoided.
30823
+ *
30824
+ * See `RuntimeStateDurability`. Enforced by
30825
+ * `scripts/check-runtime-state-durability.ts`.
30826
+ */
30827
+ durability: "session"
30828
+ };
30829
+ /**
30727
30830
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30728
30831
  * a rect ROI on a camera frame and names one or more states; the engine
30729
30832
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -31096,6 +31199,8 @@ var CamStreamDescriptorSchema = object({
31096
31199
  deviceFeatures: array(string()).optional(),
31097
31200
  /** Eligible for automatic profile assignment. Absent = `true`. */
31098
31201
  autoEligible: boolean().optional(),
31202
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
31203
+ profileHint: CamProfileSchema.optional(),
31099
31204
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
31100
31205
  metadata: record(string(), unknown()).optional()
31101
31206
  });
@@ -37200,6 +37305,12 @@ Object.freeze({
37200
37305
  addonId: null,
37201
37306
  access: "view"
37202
37307
  },
37308
+ "recordingSignal.getStatus": {
37309
+ capName: "recording-signal",
37310
+ capScope: "device",
37311
+ addonId: null,
37312
+ access: "view"
37313
+ },
37203
37314
  "sceneMonitor.captureReference": {
37204
37315
  capName: "scene-monitor",
37205
37316
  capScope: "device",
@@ -40192,6 +40303,11 @@ Object.freeze({
40192
40303
  form: "single",
40193
40304
  optional: true
40194
40305
  }],
40306
+ "recordingSignal.getStatus": [{
40307
+ name: "deviceId",
40308
+ form: "single",
40309
+ optional: false
40310
+ }],
40195
40311
  "sceneMonitor.captureReference": [{
40196
40312
  name: "deviceId",
40197
40313
  form: "single",
@@ -42330,6 +42446,12 @@ Object.defineProperty(exports, "RecordingConfigSchema", {
42330
42446
  return RecordingConfigSchema;
42331
42447
  }
42332
42448
  });
42449
+ Object.defineProperty(exports, "RecordingSignalStatusSchema", {
42450
+ enumerable: true,
42451
+ get: function() {
42452
+ return RecordingSignalStatusSchema;
42453
+ }
42454
+ });
42333
42455
  Object.defineProperty(exports, "RingBuffer", {
42334
42456
  enumerable: true,
42335
42457
  get: function() {
@@ -42720,6 +42842,12 @@ Object.defineProperty(exports, "recordingExportCapability", {
42720
42842
  return recordingExportCapability;
42721
42843
  }
42722
42844
  });
42845
+ Object.defineProperty(exports, "recordingSignalCapability", {
42846
+ enumerable: true,
42847
+ get: function() {
42848
+ return recordingSignalCapability;
42849
+ }
42850
+ });
42723
42851
  Object.defineProperty(exports, "resolveClusterStepModelId", {
42724
42852
  enumerable: true,
42725
42853
  get: function() {
@@ -6467,6 +6467,21 @@ var CameraStreamSchema = object({
6467
6467
  */
6468
6468
  autoEligible: boolean().optional(),
6469
6469
  /**
6470
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6471
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6472
+ * stream. Consulted by the broker's automatic ranking
6473
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6474
+ * an operator's manual assignment still wins, and an absent hint is the
6475
+ * pixel-ranked default every camera had before this field existed.
6476
+ *
6477
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6478
+ * storage class is written for on its own (`recordings` is high|mid,
6479
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6480
+ * camera's single 720p relay is a `low` in every respect except the slot the
6481
+ * heuristic put it in.
6482
+ */
6483
+ profileHint: CamProfileSchema.optional(),
6484
+ /**
6470
6485
  * Transport-specific opaque metadata. The broker passes it through to
6471
6486
  * the source reader without inspecting it. Currently used by
6472
6487
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -9132,7 +9147,22 @@ var RecordingTriggersSchema = object({
9132
9147
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
9133
9148
  * registrare.
9134
9149
  */
9135
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9150
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
9151
+ /**
9152
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
9153
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
9154
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
9155
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
9156
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
9157
+ *
9158
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
9159
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
9160
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
9161
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
9162
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
9163
+ * (`holdTrigger` / `releaseTrigger`).
9164
+ */
9165
+ deviceSignal: boolean().optional()
9136
9166
  });
9137
9167
  /**
9138
9168
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -12898,6 +12928,8 @@ var streamBrokerCapability = {
12898
12928
  label: string().optional(),
12899
12929
  deviceFeatures: array(string()).optional(),
12900
12930
  autoEligible: boolean().optional(),
12931
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
12932
+ profileHint: CamProfileSchema.optional(),
12901
12933
  metadata: record(string(), unknown()).optional(),
12902
12934
  /** Required when kind === 'derived' — the source camStreamId the
12903
12935
  * derived broker reads its encoded plane from.
@@ -30701,6 +30733,77 @@ var recordingExportCapability = {
30701
30733
  }
30702
30734
  };
30703
30735
  /**
30736
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
30737
+ * something it knows about is happening (a robot vacuum cleaning, a machine
30738
+ * running, a gate open) and lowers when it stops.
30739
+ *
30740
+ * It is a level, not an edge. The sensor triggers the recorder already listens
30741
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
30742
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
30743
+ * still happening" cannot be expressed as an edge plus a post-buffer without
30744
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
30745
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
30746
+ * which records the dock for that long after every short one. So the recorder
30747
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
30748
+ * own post-buffer once it falls.
30749
+ *
30750
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
30751
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
30752
+ * writes this slice on every change; consumers subscribe to the kernel's
30753
+ * `DeviceStateChanged` for it and read it back through
30754
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
30755
+ * against the device (D224, D8/D11).
30756
+ *
30757
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
30758
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
30759
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
30760
+ * about the camera, on the camera.
30761
+ */
30762
+ var RecordingSignalStatusSchema = object({
30763
+ /** True while the device asks to be recorded. */
30764
+ active: boolean(),
30765
+ /**
30766
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
30767
+ * …). Free text for the log line and the UI badge; the recorder never
30768
+ * branches on it.
30769
+ */
30770
+ reason: string(),
30771
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
30772
+ lastChangedAt: number()
30773
+ });
30774
+ /** The runtime-state slice: the status plus the clock every slice carries. */
30775
+ var RecordingSignalRuntimeStateSchema = RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
30776
+ var recordingSignalCapability = {
30777
+ name: "recording-signal",
30778
+ scope: "device",
30779
+ deviceNative: true,
30780
+ mode: "singleton",
30781
+ deviceTypes: [DeviceType.Camera],
30782
+ methods: {
30783
+ /** The current level, straight from the slice the provider keeps fresh. */
30784
+ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) },
30785
+ status: {
30786
+ schema: RecordingSignalStatusSchema,
30787
+ kind: "push",
30788
+ empty: {
30789
+ active: false,
30790
+ reason: "unknown",
30791
+ lastChangedAt: 0
30792
+ }
30793
+ },
30794
+ runtimeState: RecordingSignalRuntimeStateSchema,
30795
+ /**
30796
+ * Runtime-state durability: **session** — a restored `active: true` from
30797
+ * before a restart is exactly the stale level the recorder's reconcile bound
30798
+ * exists to end, and the provider re-derives the true level on activation
30799
+ * anyway. Nothing is lost by forgetting it; a lie is avoided.
30800
+ *
30801
+ * See `RuntimeStateDurability`. Enforced by
30802
+ * `scripts/check-runtime-state-durability.ts`.
30803
+ */
30804
+ durability: "session"
30805
+ };
30806
+ /**
30704
30807
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30705
30808
  * a rect ROI on a camera frame and names one or more states; the engine
30706
30809
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -31073,6 +31176,8 @@ var CamStreamDescriptorSchema = object({
31073
31176
  deviceFeatures: array(string()).optional(),
31074
31177
  /** Eligible for automatic profile assignment. Absent = `true`. */
31075
31178
  autoEligible: boolean().optional(),
31179
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
31180
+ profileHint: CamProfileSchema.optional(),
31076
31181
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
31077
31182
  metadata: record(string(), unknown()).optional()
31078
31183
  });
@@ -37177,6 +37282,12 @@ Object.freeze({
37177
37282
  addonId: null,
37178
37283
  access: "view"
37179
37284
  },
37285
+ "recordingSignal.getStatus": {
37286
+ capName: "recording-signal",
37287
+ capScope: "device",
37288
+ addonId: null,
37289
+ access: "view"
37290
+ },
37180
37291
  "sceneMonitor.captureReference": {
37181
37292
  capName: "scene-monitor",
37182
37293
  capScope: "device",
@@ -40169,6 +40280,11 @@ Object.freeze({
40169
40280
  form: "single",
40170
40281
  optional: true
40171
40282
  }],
40283
+ "recordingSignal.getStatus": [{
40284
+ name: "deviceId",
40285
+ form: "single",
40286
+ optional: false
40287
+ }],
40172
40288
  "sceneMonitor.captureReference": [{
40173
40289
  name: "deviceId",
40174
40290
  form: "single",
@@ -42103,4 +42219,4 @@ function enumerateInferenceDevices(hw) {
42103
42219
  return out;
42104
42220
  }
42105
42221
  //#endregion
42106
- export { isFirstLevelMacroClass as $, record as $t, audioAnalysisCapability as A, BOOT_RECOVERY_BACKOFF_MS as At, defineCustomActions as B, nodePin as Bt, RATE_CONTROL_RELAXED as C, webrtcSessionCapability as Ct, RingBuffer as D, buildFfmpegArgs as Dt, RecordingConfigSchema as E, Fmp4BoxSplitter as Et, createHwAccelCache as F, createEvent as Ft, egressTranscodeSharingKey as G, _enum as Gt, deriveDetailCropRect as H, parseProfileBrokerId as Ht, createLogChannelsProvider as I, hydrateSchema as It, evaluateSensorEdge as J, discriminatedUnion as Jt, egressTransportFromRequest as K, array as Kt, customAction as L, isEvent as Lt, audioKindId as M, CAM_PROFILE_ORDER as Mt, batteryCapability as N, DeviceFeature as Nt, YAMNET_TO_MACRO as O, invocationFromEncodeProfile as Ot, cameraStreamsCapability as P, DeviceType as Pt, inferModelProvider as Q, object as Qt, declareLogChannel as R, makeProfileBrokerId as Rt, PoolMemoryWatchdog as S, supportedRuntimes as St, RECORDING_EXPORT_MAX_READ_BYTES as T, AUDIO_PRESETS as Tt, deriveRecordingMode as U, selectAssignedProfileSlots as Ut, deriveBatteryPresence as V, parseJsonUnknown as Vt, detectionPipelineCapability as W, sleep as Wt, failureContributionCapability as X, literal as Xt, evaluateZoneRules as Y, lazy as Yt, hfModelUrl as Z, number as Zt, FailureCounters as _, resolvePoolMemoryPolicy as _t, COCO_80_LABELS as a, overlayClusterStepSettings as at, NativeLeaseSettingsSchema as b, storageEvictableCapability as bt, DEFAULT_CLUSTER_STEP_MODELS as c, pickClusterStepSettings as ct, DEFAULT_EVENTS_BAND_BUFFER_SEC as d, pipelineExecutorCapability as dt, string as en, loadContributionCapability as et, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as f, pipelineRunnerCapability as ft, ExportRecordSchema as g, resolveEgressDecodeHwAccel as gt, EncodeProfileSchema as h, resolveClusterStepModelId as ht, BatteryStatusSchema as i, motionDetectionCapability as it, audioAnalyzerCapability as j, BaseAddon as jt, addonWidgetsSourceCapability as k, isSoftwareDecode as kt, DEFAULT_CLUSTER_STEP_SETTINGS as l, pickDetailCropConvention as lt, DEVICE_BACKEND_TO_FORMAT as m, recordingExportCapability as mt, AUDIO_BACKEND_CHOICES as n, EventCategory as nn, mapAudioLabelToMacro as nt, COCO_TO_MACRO as o, parseProcStatus as ot, DEFAULT_NATIVE_LEASE_SETTINGS as p, recordingCapability as pt, enumerateInferenceDevices as q, boolean as qt, AUDIO_MACRO_LABELS as r, maskUrlCredentials as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, pickClusterStepModels as st, APPLE_SA_TO_MACRO as t, union as tn, logChannelsCapability as tt, DEFAULT_DETAIL_CROP_CONVENTION as u, pickNativeLeaseOverride as ut, HF_BASE_URL as v, resolveRecordingProfiles as vt, RATE_CONTROL_TIGHT as w, errMsg as wt, OpsLogEntrySchema as x, streamBrokerCapability as xt, NativeLeaseAdmissionSchema as y, runtimeDevices as yt, defaultDeviceFor as z, makeSourceBrokerId as zt };
42222
+ export { inferModelProvider as $, number as $t, addonWidgetsSourceCapability as A, invocationFromEncodeProfile as At, defaultDeviceFor as B, makeProfileBrokerId as Bt, RATE_CONTROL_RELAXED as C, streamBrokerCapability as Ct, RecordingSignalStatusSchema as D, AUDIO_PRESETS as Dt, RecordingConfigSchema as E, errMsg as Et, cameraStreamsCapability as F, DeviceFeature as Ft, detectionPipelineCapability as G, selectAssignedProfileSlots as Gt, deriveBatteryPresence as H, nodePin as Ht, createHwAccelCache as I, DeviceType as It, enumerateInferenceDevices as J, array as Jt, egressTranscodeSharingKey as K, sleep as Kt, createLogChannelsProvider as L, createEvent as Lt, audioAnalyzerCapability as M, BOOT_RECOVERY_BACKOFF_MS as Mt, audioKindId as N, BaseAddon as Nt, RingBuffer as O, Fmp4BoxSplitter as Ot, batteryCapability as P, CAM_PROFILE_ORDER as Pt, hfModelUrl as Q, literal as Qt, customAction as R, hydrateSchema as Rt, PoolMemoryWatchdog as S, storageEvictableCapability as St, RECORDING_EXPORT_MAX_READ_BYTES as T, webrtcSessionCapability as Tt, deriveDetailCropRect as U, parseJsonUnknown as Ut, defineCustomActions as V, makeSourceBrokerId as Vt, deriveRecordingMode as W, parseProfileBrokerId as Wt, evaluateZoneRules as X, discriminatedUnion as Xt, evaluateSensorEdge as Y, boolean as Yt, failureContributionCapability as Z, lazy as Zt, FailureCounters as _, resolveClusterStepModelId as _t, COCO_80_LABELS as a, motionDetectionCapability as at, NativeLeaseSettingsSchema as b, resolveRecordingProfiles as bt, DEFAULT_CLUSTER_STEP_MODELS as c, pickClusterStepModels as ct, DEFAULT_EVENTS_BAND_BUFFER_SEC as d, pickNativeLeaseOverride as dt, object as en, isFirstLevelMacroClass as et, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as f, pipelineExecutorCapability as ft, ExportRecordSchema as g, recordingSignalCapability as gt, EncodeProfileSchema as h, recordingExportCapability as ht, BatteryStatusSchema as i, EventCategory as in, maskUrlCredentials as it, audioAnalysisCapability as j, isSoftwareDecode as jt, YAMNET_TO_MACRO as k, buildFfmpegArgs as kt, DEFAULT_CLUSTER_STEP_SETTINGS as l, pickClusterStepSettings as lt, DEVICE_BACKEND_TO_FORMAT as m, recordingCapability as mt, AUDIO_BACKEND_CHOICES as n, string as nn, logChannelsCapability as nt, COCO_TO_MACRO as o, overlayClusterStepSettings as ot, DEFAULT_NATIVE_LEASE_SETTINGS as p, pipelineRunnerCapability as pt, egressTransportFromRequest as q, _enum as qt, AUDIO_MACRO_LABELS as r, union as rn, mapAudioLabelToMacro as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, parseProcStatus as st, APPLE_SA_TO_MACRO as t, record as tn, loadContributionCapability as tt, DEFAULT_DETAIL_CROP_CONVENTION as u, pickDetailCropConvention as ut, HF_BASE_URL as v, resolveEgressDecodeHwAccel as vt, RATE_CONTROL_TIGHT as w, supportedRuntimes as wt, OpsLogEntrySchema as x, runtimeDevices as xt, NativeLeaseAdmissionSchema as y, resolvePoolMemoryPolicy as yt, declareLogChannel as z, isEvent as zt };
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CXO_Fmx6.js");
1
+ const require_dist = require("./dist-HG5geL9t.js");
2
2
  let node_path = require("node:path");
3
3
  node_path = require_dist.__toESM(node_path);
4
4
  let node_url = require("node:url");
@@ -1,4 +1,4 @@
1
- import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-B8J7wrtY.mjs";
1
+ import { N as audioKindId, Q as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-mYDK58Jp.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CXO_Fmx6.js");
1
+ const require_dist = require("./dist-HG5geL9t.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CXO_Fmx6.js");
6
- const require_lazy_sharp = require("../lazy-sharp-o-aNNXuz.js");
5
+ const require_dist = require("../dist-HG5geL9t.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-DmAwZ0s9.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-B8J7wrtY.mjs";
1
+ import { It as DeviceType, Nt as BaseAddon, Rt as hydrateSchema, X as evaluateZoneRules, at as motionDetectionCapability } from "../dist-mYDK58Jp.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
- const require_dist = require("./dist-CXO_Fmx6.js");
1
+ const require_dist = require("./dist-HG5geL9t.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_dist.__toESM(node_fs, 1);
@@ -1,4 +1,4 @@
1
- import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-B8J7wrtY.mjs";
1
+ import { Et as errMsg, Ot as Fmp4BoxSplitter, jt as isSoftwareDecode, kt as buildFfmpegArgs } from "./dist-mYDK58Jp.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import "node:fs";
4
4
  import "node:path";