@camstack/addon-provider-rtsp 1.2.71 → 1.2.73

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.
package/dist/addon.js CHANGED
@@ -5430,6 +5430,12 @@ Object.fromEntries([
5430
5430
  icon: "move",
5431
5431
  order: 40
5432
5432
  },
5433
+ {
5434
+ id: "navigation",
5435
+ label: "Navigation",
5436
+ icon: "compass",
5437
+ order: 41
5438
+ },
5433
5439
  {
5434
5440
  id: "consumables",
5435
5441
  label: "Consumables",
@@ -6463,6 +6469,21 @@ var CameraStreamSchema = object({
6463
6469
  */
6464
6470
  autoEligible: boolean().optional(),
6465
6471
  /**
6472
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6473
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6474
+ * stream. Consulted by the broker's automatic ranking
6475
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6476
+ * an operator's manual assignment still wins, and an absent hint is the
6477
+ * pixel-ranked default every camera had before this field existed.
6478
+ *
6479
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6480
+ * storage class is written for on its own (`recordings` is high|mid,
6481
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6482
+ * camera's single 720p relay is a `low` in every respect except the slot the
6483
+ * heuristic put it in.
6484
+ */
6485
+ profileHint: CamProfileSchema.optional(),
6486
+ /**
6466
6487
  * Transport-specific opaque metadata. The broker passes it through to
6467
6488
  * the source reader without inspecting it. Currently used by
6468
6489
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -7944,7 +7965,22 @@ var RecordingTriggersSchema = object({
7944
7965
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
7945
7966
  * registrare.
7946
7967
  */
7947
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
7968
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
7969
+ /**
7970
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
7971
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
7972
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
7973
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
7974
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
7975
+ *
7976
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
7977
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
7978
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
7979
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
7980
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
7981
+ * (`holdTrigger` / `releaseTrigger`).
7982
+ */
7983
+ deviceSignal: boolean().optional()
7948
7984
  });
7949
7985
  /**
7950
7986
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11408,6 +11444,8 @@ method(object({
11408
11444
  label: string().optional(),
11409
11445
  deviceFeatures: array(string()).optional(),
11410
11446
  autoEligible: boolean().optional(),
11447
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11448
+ profileHint: CamProfileSchema.optional(),
11411
11449
  metadata: record(string(), unknown()).optional(),
11412
11450
  /** Required when kind === 'derived' — the source camStreamId the
11413
11451
  * derived broker reads its encoded plane from.
@@ -30045,6 +30083,77 @@ method(object({
30045
30083
  auth: "protected"
30046
30084
  });
30047
30085
  /**
30086
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
30087
+ * something it knows about is happening (a robot vacuum cleaning, a machine
30088
+ * running, a gate open) and lowers when it stops.
30089
+ *
30090
+ * It is a level, not an edge. The sensor triggers the recorder already listens
30091
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
30092
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
30093
+ * still happening" cannot be expressed as an edge plus a post-buffer without
30094
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
30095
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
30096
+ * which records the dock for that long after every short one. So the recorder
30097
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
30098
+ * own post-buffer once it falls.
30099
+ *
30100
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
30101
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
30102
+ * writes this slice on every change; consumers subscribe to the kernel's
30103
+ * `DeviceStateChanged` for it and read it back through
30104
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
30105
+ * against the device (D224, D8/D11).
30106
+ *
30107
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
30108
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
30109
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
30110
+ * about the camera, on the camera.
30111
+ */
30112
+ var RecordingSignalStatusSchema = object({
30113
+ /** True while the device asks to be recorded. */
30114
+ active: boolean(),
30115
+ /**
30116
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
30117
+ * …). Free text for the log line and the UI badge; the recorder never
30118
+ * branches on it.
30119
+ */
30120
+ reason: string(),
30121
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
30122
+ lastChangedAt: number()
30123
+ });
30124
+ /** The runtime-state slice: the status plus the clock every slice carries. */
30125
+ var RecordingSignalRuntimeStateSchema = RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
30126
+ var recordingSignalCapability = {
30127
+ name: "recording-signal",
30128
+ scope: "device",
30129
+ deviceNative: true,
30130
+ mode: "singleton",
30131
+ deviceTypes: [DeviceType.Camera],
30132
+ methods: {
30133
+ /** The current level, straight from the slice the provider keeps fresh. */
30134
+ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) },
30135
+ status: {
30136
+ schema: RecordingSignalStatusSchema,
30137
+ kind: "push",
30138
+ empty: {
30139
+ active: false,
30140
+ reason: "unknown",
30141
+ lastChangedAt: 0
30142
+ }
30143
+ },
30144
+ runtimeState: RecordingSignalRuntimeStateSchema,
30145
+ /**
30146
+ * Runtime-state durability: **session** — a restored `active: true` from
30147
+ * before a restart is exactly the stale level the recorder's reconcile bound
30148
+ * exists to end, and the provider re-derives the true level on activation
30149
+ * anyway. Nothing is lost by forgetting it; a lie is avoided.
30150
+ *
30151
+ * See `RuntimeStateDurability`. Enforced by
30152
+ * `scripts/check-runtime-state-durability.ts`.
30153
+ */
30154
+ durability: "session"
30155
+ };
30156
+ /**
30048
30157
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30049
30158
  * a rect ROI on a camera frame and names one or more states; the engine
30050
30159
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -30542,6 +30651,8 @@ var CamStreamDescriptorSchema = object({
30542
30651
  deviceFeatures: array(string()).optional(),
30543
30652
  /** Eligible for automatic profile assignment. Absent = `true`. */
30544
30653
  autoEligible: boolean().optional(),
30654
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
30655
+ profileHint: CamProfileSchema.optional(),
30545
30656
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
30546
30657
  metadata: record(string(), unknown()).optional()
30547
30658
  });
@@ -32681,6 +32792,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
32681
32792
  pressureSensor: pressureSensorCapability,
32682
32793
  privacyMask: privacyMaskCapability,
32683
32794
  ptzAutotrack: ptzAutotrackCapability,
32795
+ recordingSignal: recordingSignalCapability,
32684
32796
  sceneMonitor: sceneMonitorCapability,
32685
32797
  scriptRunner: scriptRunnerCapability,
32686
32798
  smoke: smokeCapability,
@@ -38494,6 +38606,12 @@ Object.freeze({
38494
38606
  addonId: null,
38495
38607
  access: "view"
38496
38608
  },
38609
+ "recordingSignal.getStatus": {
38610
+ capName: "recording-signal",
38611
+ capScope: "device",
38612
+ addonId: null,
38613
+ access: "view"
38614
+ },
38497
38615
  "sceneMonitor.captureReference": {
38498
38616
  capName: "scene-monitor",
38499
38617
  capScope: "device",
@@ -41486,6 +41604,11 @@ Object.freeze({
41486
41604
  form: "single",
41487
41605
  optional: true
41488
41606
  }],
41607
+ "recordingSignal.getStatus": [{
41608
+ name: "deviceId",
41609
+ form: "single",
41610
+ optional: false
41611
+ }],
41489
41612
  "sceneMonitor.captureReference": [{
41490
41613
  name: "deviceId",
41491
41614
  form: "single",
package/dist/addon.mjs CHANGED
@@ -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",
@@ -6439,6 +6445,21 @@ var CameraStreamSchema = object({
6439
6445
  */
6440
6446
  autoEligible: boolean().optional(),
6441
6447
  /**
6448
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6449
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6450
+ * stream. Consulted by the broker's automatic ranking
6451
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6452
+ * an operator's manual assignment still wins, and an absent hint is the
6453
+ * pixel-ranked default every camera had before this field existed.
6454
+ *
6455
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6456
+ * storage class is written for on its own (`recordings` is high|mid,
6457
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6458
+ * camera's single 720p relay is a `low` in every respect except the slot the
6459
+ * heuristic put it in.
6460
+ */
6461
+ profileHint: CamProfileSchema.optional(),
6462
+ /**
6442
6463
  * Transport-specific opaque metadata. The broker passes it through to
6443
6464
  * the source reader without inspecting it. Currently used by
6444
6465
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -7920,7 +7941,22 @@ var RecordingTriggersSchema = object({
7920
7941
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
7921
7942
  * registrare.
7922
7943
  */
7923
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
7944
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
7945
+ /**
7946
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
7947
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
7948
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
7949
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
7950
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
7951
+ *
7952
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
7953
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
7954
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
7955
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
7956
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
7957
+ * (`holdTrigger` / `releaseTrigger`).
7958
+ */
7959
+ deviceSignal: boolean().optional()
7924
7960
  });
7925
7961
  /**
7926
7962
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11384,6 +11420,8 @@ method(object({
11384
11420
  label: string().optional(),
11385
11421
  deviceFeatures: array(string()).optional(),
11386
11422
  autoEligible: boolean().optional(),
11423
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11424
+ profileHint: CamProfileSchema.optional(),
11387
11425
  metadata: record(string(), unknown()).optional(),
11388
11426
  /** Required when kind === 'derived' — the source camStreamId the
11389
11427
  * derived broker reads its encoded plane from.
@@ -30021,6 +30059,77 @@ method(object({
30021
30059
  auth: "protected"
30022
30060
  });
30023
30061
  /**
30062
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
30063
+ * something it knows about is happening (a robot vacuum cleaning, a machine
30064
+ * running, a gate open) and lowers when it stops.
30065
+ *
30066
+ * It is a level, not an edge. The sensor triggers the recorder already listens
30067
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
30068
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
30069
+ * still happening" cannot be expressed as an edge plus a post-buffer without
30070
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
30071
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
30072
+ * which records the dock for that long after every short one. So the recorder
30073
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
30074
+ * own post-buffer once it falls.
30075
+ *
30076
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
30077
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
30078
+ * writes this slice on every change; consumers subscribe to the kernel's
30079
+ * `DeviceStateChanged` for it and read it back through
30080
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
30081
+ * against the device (D224, D8/D11).
30082
+ *
30083
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
30084
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
30085
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
30086
+ * about the camera, on the camera.
30087
+ */
30088
+ var RecordingSignalStatusSchema = object({
30089
+ /** True while the device asks to be recorded. */
30090
+ active: boolean(),
30091
+ /**
30092
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
30093
+ * …). Free text for the log line and the UI badge; the recorder never
30094
+ * branches on it.
30095
+ */
30096
+ reason: string(),
30097
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
30098
+ lastChangedAt: number()
30099
+ });
30100
+ /** The runtime-state slice: the status plus the clock every slice carries. */
30101
+ var RecordingSignalRuntimeStateSchema = RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
30102
+ var recordingSignalCapability = {
30103
+ name: "recording-signal",
30104
+ scope: "device",
30105
+ deviceNative: true,
30106
+ mode: "singleton",
30107
+ deviceTypes: [DeviceType.Camera],
30108
+ methods: {
30109
+ /** The current level, straight from the slice the provider keeps fresh. */
30110
+ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) },
30111
+ status: {
30112
+ schema: RecordingSignalStatusSchema,
30113
+ kind: "push",
30114
+ empty: {
30115
+ active: false,
30116
+ reason: "unknown",
30117
+ lastChangedAt: 0
30118
+ }
30119
+ },
30120
+ runtimeState: RecordingSignalRuntimeStateSchema,
30121
+ /**
30122
+ * Runtime-state durability: **session** — a restored `active: true` from
30123
+ * before a restart is exactly the stale level the recorder's reconcile bound
30124
+ * exists to end, and the provider re-derives the true level on activation
30125
+ * anyway. Nothing is lost by forgetting it; a lie is avoided.
30126
+ *
30127
+ * See `RuntimeStateDurability`. Enforced by
30128
+ * `scripts/check-runtime-state-durability.ts`.
30129
+ */
30130
+ durability: "session"
30131
+ };
30132
+ /**
30024
30133
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30025
30134
  * a rect ROI on a camera frame and names one or more states; the engine
30026
30135
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -30518,6 +30627,8 @@ var CamStreamDescriptorSchema = object({
30518
30627
  deviceFeatures: array(string()).optional(),
30519
30628
  /** Eligible for automatic profile assignment. Absent = `true`. */
30520
30629
  autoEligible: boolean().optional(),
30630
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
30631
+ profileHint: CamProfileSchema.optional(),
30521
30632
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
30522
30633
  metadata: record(string(), unknown()).optional()
30523
30634
  });
@@ -32657,6 +32768,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
32657
32768
  pressureSensor: pressureSensorCapability,
32658
32769
  privacyMask: privacyMaskCapability,
32659
32770
  ptzAutotrack: ptzAutotrackCapability,
32771
+ recordingSignal: recordingSignalCapability,
32660
32772
  sceneMonitor: sceneMonitorCapability,
32661
32773
  scriptRunner: scriptRunnerCapability,
32662
32774
  smoke: smokeCapability,
@@ -38470,6 +38582,12 @@ Object.freeze({
38470
38582
  addonId: null,
38471
38583
  access: "view"
38472
38584
  },
38585
+ "recordingSignal.getStatus": {
38586
+ capName: "recording-signal",
38587
+ capScope: "device",
38588
+ addonId: null,
38589
+ access: "view"
38590
+ },
38473
38591
  "sceneMonitor.captureReference": {
38474
38592
  capName: "scene-monitor",
38475
38593
  capScope: "device",
@@ -41462,6 +41580,11 @@ Object.freeze({
41462
41580
  form: "single",
41463
41581
  optional: true
41464
41582
  }],
41583
+ "recordingSignal.getStatus": [{
41584
+ name: "deviceId",
41585
+ form: "single",
41586
+ optional: false
41587
+ }],
41465
41588
  "sceneMonitor.captureReference": [{
41466
41589
  name: "deviceId",
41467
41590
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.71",
3
+ "version": "1.2.73",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",