@camstack/addon-pipeline 1.2.191 → 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-PQArEi7A.js → dist-HG5geL9t.js} +135 -1
  6. package/dist/{dist-Cjazw3T-.mjs → dist-mYDK58Jp.mjs} +124 -2
  7. package/dist/{lazy-sharp-DfnnPeG5.js → lazy-sharp-DmAwZ0s9.js} +1 -1
  8. package/dist/{local-frame-registry-CrLITJ5O.mjs → local-frame-registry-av9ObDG0.mjs} +1 -1
  9. package/dist/{local-frame-registry-DNVTAOrZ.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-wFmd_eR_.js → node--my8JTOW.js} +1 -1
  13. package/dist/{node-KFUZT2L-.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-BgX9_XQ5.mjs → process-memory-BDHR3lxe.mjs} +1 -1
  17. package/dist/{process-memory-B4o15Ps9.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-C36b7S82.js → segment-demux-js-CBynn9Gh.js} +1 -1
  21. package/dist/{segment-demux-js-Cgz-NlSg.mjs → segment-demux-js-CXvgKfsn.mjs} +1 -1
  22. package/dist/session-decode/decode-worker-child.js +45 -10
  23. package/dist/session-decode/decode-worker-child.mjs +44 -9
  24. package/dist/stream-broker/_stub.js +1 -1
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-YWGmRusr.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-CuZBoqi0.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-n4hf2NsC.mjs → worker-protocol-C0R1DDC0.mjs} +1 -1
  34. package/dist/{worker-protocol-BulRQMSK.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-PQArEi7A.js");
6
- const require_process_memory = require("../process-memory-B4o15Ps9.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-Cjazw3T-.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BgX9_XQ5.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-PQArEi7A.js");
6
- const require_node = require("../node-wFmd_eR_.js");
7
- const require_local_frame_registry = require("../local-frame-registry-DNVTAOrZ.js");
8
- const require_lazy_sharp = require("../lazy-sharp-DfnnPeG5.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-B4o15Ps9.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-Cjazw3T-.mjs";
3
- import { a as readProcessCost } from "../node-KFUZT2L-.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-CrLITJ5O.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-BgX9_XQ5.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 = [
@@ -5429,6 +5429,12 @@ Object.fromEntries([
5429
5429
  icon: "move",
5430
5430
  order: 40
5431
5431
  },
5432
+ {
5433
+ id: "navigation",
5434
+ label: "Navigation",
5435
+ icon: "compass",
5436
+ order: 41
5437
+ },
5432
5438
  {
5433
5439
  id: "consumables",
5434
5440
  label: "Consumables",
@@ -6484,6 +6490,21 @@ var CameraStreamSchema = object({
6484
6490
  */
6485
6491
  autoEligible: boolean().optional(),
6486
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
+ /**
6487
6508
  * Transport-specific opaque metadata. The broker passes it through to
6488
6509
  * the source reader without inspecting it. Currently used by
6489
6510
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -9149,7 +9170,22 @@ var RecordingTriggersSchema = object({
9149
9170
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
9150
9171
  * registrare.
9151
9172
  */
9152
- 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()
9153
9189
  });
9154
9190
  /**
9155
9191
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -12915,6 +12951,8 @@ var streamBrokerCapability = {
12915
12951
  label: string().optional(),
12916
12952
  deviceFeatures: array(string()).optional(),
12917
12953
  autoEligible: boolean().optional(),
12954
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
12955
+ profileHint: CamProfileSchema.optional(),
12918
12956
  metadata: record(string(), unknown()).optional(),
12919
12957
  /** Required when kind === 'derived' — the source camStreamId the
12920
12958
  * derived broker reads its encoded plane from.
@@ -30718,6 +30756,77 @@ var recordingExportCapability = {
30718
30756
  }
30719
30757
  };
30720
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
+ /**
30721
30830
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30722
30831
  * a rect ROI on a camera frame and names one or more states; the engine
30723
30832
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -31090,6 +31199,8 @@ var CamStreamDescriptorSchema = object({
31090
31199
  deviceFeatures: array(string()).optional(),
31091
31200
  /** Eligible for automatic profile assignment. Absent = `true`. */
31092
31201
  autoEligible: boolean().optional(),
31202
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
31203
+ profileHint: CamProfileSchema.optional(),
31093
31204
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
31094
31205
  metadata: record(string(), unknown()).optional()
31095
31206
  });
@@ -37194,6 +37305,12 @@ Object.freeze({
37194
37305
  addonId: null,
37195
37306
  access: "view"
37196
37307
  },
37308
+ "recordingSignal.getStatus": {
37309
+ capName: "recording-signal",
37310
+ capScope: "device",
37311
+ addonId: null,
37312
+ access: "view"
37313
+ },
37197
37314
  "sceneMonitor.captureReference": {
37198
37315
  capName: "scene-monitor",
37199
37316
  capScope: "device",
@@ -40186,6 +40303,11 @@ Object.freeze({
40186
40303
  form: "single",
40187
40304
  optional: true
40188
40305
  }],
40306
+ "recordingSignal.getStatus": [{
40307
+ name: "deviceId",
40308
+ form: "single",
40309
+ optional: false
40310
+ }],
40189
40311
  "sceneMonitor.captureReference": [{
40190
40312
  name: "deviceId",
40191
40313
  form: "single",
@@ -42324,6 +42446,12 @@ Object.defineProperty(exports, "RecordingConfigSchema", {
42324
42446
  return RecordingConfigSchema;
42325
42447
  }
42326
42448
  });
42449
+ Object.defineProperty(exports, "RecordingSignalStatusSchema", {
42450
+ enumerable: true,
42451
+ get: function() {
42452
+ return RecordingSignalStatusSchema;
42453
+ }
42454
+ });
42327
42455
  Object.defineProperty(exports, "RingBuffer", {
42328
42456
  enumerable: true,
42329
42457
  get: function() {
@@ -42714,6 +42842,12 @@ Object.defineProperty(exports, "recordingExportCapability", {
42714
42842
  return recordingExportCapability;
42715
42843
  }
42716
42844
  });
42845
+ Object.defineProperty(exports, "recordingSignalCapability", {
42846
+ enumerable: true,
42847
+ get: function() {
42848
+ return recordingSignalCapability;
42849
+ }
42850
+ });
42717
42851
  Object.defineProperty(exports, "resolveClusterStepModelId", {
42718
42852
  enumerable: true,
42719
42853
  get: function() {
@@ -5406,6 +5406,12 @@ Object.fromEntries([
5406
5406
  icon: "move",
5407
5407
  order: 40
5408
5408
  },
5409
+ {
5410
+ id: "navigation",
5411
+ label: "Navigation",
5412
+ icon: "compass",
5413
+ order: 41
5414
+ },
5409
5415
  {
5410
5416
  id: "consumables",
5411
5417
  label: "Consumables",
@@ -6461,6 +6467,21 @@ var CameraStreamSchema = object({
6461
6467
  */
6462
6468
  autoEligible: boolean().optional(),
6463
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
+ /**
6464
6485
  * Transport-specific opaque metadata. The broker passes it through to
6465
6486
  * the source reader without inspecting it. Currently used by
6466
6487
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -9126,7 +9147,22 @@ var RecordingTriggersSchema = object({
9126
9147
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
9127
9148
  * registrare.
9128
9149
  */
9129
- 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()
9130
9166
  });
9131
9167
  /**
9132
9168
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -12892,6 +12928,8 @@ var streamBrokerCapability = {
12892
12928
  label: string().optional(),
12893
12929
  deviceFeatures: array(string()).optional(),
12894
12930
  autoEligible: boolean().optional(),
12931
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
12932
+ profileHint: CamProfileSchema.optional(),
12895
12933
  metadata: record(string(), unknown()).optional(),
12896
12934
  /** Required when kind === 'derived' — the source camStreamId the
12897
12935
  * derived broker reads its encoded plane from.
@@ -30695,6 +30733,77 @@ var recordingExportCapability = {
30695
30733
  }
30696
30734
  };
30697
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
+ /**
30698
30807
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30699
30808
  * a rect ROI on a camera frame and names one or more states; the engine
30700
30809
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -31067,6 +31176,8 @@ var CamStreamDescriptorSchema = object({
31067
31176
  deviceFeatures: array(string()).optional(),
31068
31177
  /** Eligible for automatic profile assignment. Absent = `true`. */
31069
31178
  autoEligible: boolean().optional(),
31179
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
31180
+ profileHint: CamProfileSchema.optional(),
31070
31181
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
31071
31182
  metadata: record(string(), unknown()).optional()
31072
31183
  });
@@ -37171,6 +37282,12 @@ Object.freeze({
37171
37282
  addonId: null,
37172
37283
  access: "view"
37173
37284
  },
37285
+ "recordingSignal.getStatus": {
37286
+ capName: "recording-signal",
37287
+ capScope: "device",
37288
+ addonId: null,
37289
+ access: "view"
37290
+ },
37174
37291
  "sceneMonitor.captureReference": {
37175
37292
  capName: "scene-monitor",
37176
37293
  capScope: "device",
@@ -40163,6 +40280,11 @@ Object.freeze({
40163
40280
  form: "single",
40164
40281
  optional: true
40165
40282
  }],
40283
+ "recordingSignal.getStatus": [{
40284
+ name: "deviceId",
40285
+ form: "single",
40286
+ optional: false
40287
+ }],
40166
40288
  "sceneMonitor.captureReference": [{
40167
40289
  name: "deviceId",
40168
40290
  form: "single",
@@ -42097,4 +42219,4 @@ function enumerateInferenceDevices(hw) {
42097
42219
  return out;
42098
42220
  }
42099
42221
  //#endregion
42100
- 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-PQArEi7A.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-Cjazw3T-.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-PQArEi7A.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-PQArEi7A.js");
6
- const require_lazy_sharp = require("../lazy-sharp-DfnnPeG5.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-Cjazw3T-.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-PQArEi7A.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-Cjazw3T-.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";