@camstack/addon-remote-storage 1.2.70 → 1.2.72

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/s3.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DiZPvkCY.js");
5
+ const require_shared = require("./shared-DorYC8t5.js");
6
6
  let node_stream = require("node:stream");
7
7
  let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
8
8
  let _aws_sdk_lib_storage = require("@aws-sdk/lib-storage");
package/dist/s3.addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-Dg4Fpj1Q.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-DkdzfmAe.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { Upload } from "@aws-sdk/lib-storage";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DiZPvkCY.js");
5
+ const require_shared = require("./shared-DorYC8t5.js");
6
6
  let ssh2 = require("ssh2");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-Dg4Fpj1Q.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DkdzfmAe.mjs";
2
2
  import { Client } from "ssh2";
3
3
  import * as path from "node:path";
4
4
  //#region src/providers/sftp/sftp-config-schema.ts
@@ -5407,6 +5407,12 @@ Object.fromEntries([
5407
5407
  icon: "move",
5408
5408
  order: 40
5409
5409
  },
5410
+ {
5411
+ id: "navigation",
5412
+ label: "Navigation",
5413
+ icon: "compass",
5414
+ order: 41
5415
+ },
5410
5416
  {
5411
5417
  id: "consumables",
5412
5418
  label: "Consumables",
@@ -6440,6 +6446,21 @@ var CameraStreamSchema = object({
6440
6446
  */
6441
6447
  autoEligible: boolean().optional(),
6442
6448
  /**
6449
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6450
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6451
+ * stream. Consulted by the broker's automatic ranking
6452
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6453
+ * an operator's manual assignment still wins, and an absent hint is the
6454
+ * pixel-ranked default every camera had before this field existed.
6455
+ *
6456
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6457
+ * storage class is written for on its own (`recordings` is high|mid,
6458
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6459
+ * camera's single 720p relay is a `low` in every respect except the slot the
6460
+ * heuristic put it in.
6461
+ */
6462
+ profileHint: CamProfileSchema.optional(),
6463
+ /**
6443
6464
  * Transport-specific opaque metadata. The broker passes it through to
6444
6465
  * the source reader without inspecting it. Currently used by
6445
6466
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -7873,7 +7894,22 @@ var RecordingTriggersSchema = object({
7873
7894
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
7874
7895
  * registrare.
7875
7896
  */
7876
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
7897
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
7898
+ /**
7899
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
7900
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
7901
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
7902
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
7903
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
7904
+ *
7905
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
7906
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
7907
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
7908
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
7909
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
7910
+ * (`holdTrigger` / `releaseTrigger`).
7911
+ */
7912
+ deviceSignal: boolean().optional()
7877
7913
  });
7878
7914
  /**
7879
7915
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11337,6 +11373,8 @@ method(object({
11337
11373
  label: string().optional(),
11338
11374
  deviceFeatures: array(string()).optional(),
11339
11375
  autoEligible: boolean().optional(),
11376
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11377
+ profileHint: CamProfileSchema.optional(),
11340
11378
  metadata: record(string(), unknown()).optional(),
11341
11379
  /** Required when kind === 'derived' — the source camStreamId the
11342
11380
  * derived broker reads its encoded plane from.
@@ -27706,6 +27744,47 @@ method(object({
27706
27744
  auth: "protected"
27707
27745
  });
27708
27746
  /**
27747
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
27748
+ * something it knows about is happening (a robot vacuum cleaning, a machine
27749
+ * running, a gate open) and lowers when it stops.
27750
+ *
27751
+ * It is a level, not an edge. The sensor triggers the recorder already listens
27752
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
27753
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
27754
+ * still happening" cannot be expressed as an edge plus a post-buffer without
27755
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
27756
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
27757
+ * which records the dock for that long after every short one. So the recorder
27758
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
27759
+ * own post-buffer once it falls.
27760
+ *
27761
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
27762
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
27763
+ * writes this slice on every change; consumers subscribe to the kernel's
27764
+ * `DeviceStateChanged` for it and read it back through
27765
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
27766
+ * against the device (D224, D8/D11).
27767
+ *
27768
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
27769
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
27770
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
27771
+ * about the camera, on the camera.
27772
+ */
27773
+ var RecordingSignalStatusSchema = object({
27774
+ /** True while the device asks to be recorded. */
27775
+ active: boolean(),
27776
+ /**
27777
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
27778
+ * …). Free text for the log line and the UI badge; the recorder never
27779
+ * branches on it.
27780
+ */
27781
+ reason: string(),
27782
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
27783
+ lastChangedAt: number()
27784
+ });
27785
+ RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
27786
+ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusSchema);
27787
+ /**
27709
27788
  * scene-monitor — device-scoped reference-region state cap. An operator marks
27710
27789
  * a rect ROI on a camera frame and names one or more states; the engine
27711
27790
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -28078,6 +28157,8 @@ var CamStreamDescriptorSchema = object({
28078
28157
  deviceFeatures: array(string()).optional(),
28079
28158
  /** Eligible for automatic profile assignment. Absent = `true`. */
28080
28159
  autoEligible: boolean().optional(),
28160
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
28161
+ profileHint: CamProfileSchema.optional(),
28081
28162
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
28082
28163
  metadata: record(string(), unknown()).optional()
28083
28164
  });
@@ -34023,6 +34104,12 @@ Object.freeze({
34023
34104
  addonId: null,
34024
34105
  access: "view"
34025
34106
  },
34107
+ "recordingSignal.getStatus": {
34108
+ capName: "recording-signal",
34109
+ capScope: "device",
34110
+ addonId: null,
34111
+ access: "view"
34112
+ },
34026
34113
  "sceneMonitor.captureReference": {
34027
34114
  capName: "scene-monitor",
34028
34115
  capScope: "device",
@@ -37015,6 +37102,11 @@ Object.freeze({
37015
37102
  form: "single",
37016
37103
  optional: true
37017
37104
  }],
37105
+ "recordingSignal.getStatus": [{
37106
+ name: "deviceId",
37107
+ form: "single",
37108
+ optional: false
37109
+ }],
37018
37110
  "sceneMonitor.captureReference": [{
37019
37111
  name: "deviceId",
37020
37112
  form: "single",
@@ -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
@@ -7896,7 +7917,22 @@ var RecordingTriggersSchema = object({
7896
7917
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
7897
7918
  * registrare.
7898
7919
  */
7899
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
7920
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
7921
+ /**
7922
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
7923
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
7924
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
7925
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
7926
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
7927
+ *
7928
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
7929
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
7930
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
7931
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
7932
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
7933
+ * (`holdTrigger` / `releaseTrigger`).
7934
+ */
7935
+ deviceSignal: boolean().optional()
7900
7936
  });
7901
7937
  /**
7902
7938
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11360,6 +11396,8 @@ method(object({
11360
11396
  label: string().optional(),
11361
11397
  deviceFeatures: array(string()).optional(),
11362
11398
  autoEligible: boolean().optional(),
11399
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11400
+ profileHint: CamProfileSchema.optional(),
11363
11401
  metadata: record(string(), unknown()).optional(),
11364
11402
  /** Required when kind === 'derived' — the source camStreamId the
11365
11403
  * derived broker reads its encoded plane from.
@@ -27729,6 +27767,47 @@ method(object({
27729
27767
  auth: "protected"
27730
27768
  });
27731
27769
  /**
27770
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
27771
+ * something it knows about is happening (a robot vacuum cleaning, a machine
27772
+ * running, a gate open) and lowers when it stops.
27773
+ *
27774
+ * It is a level, not an edge. The sensor triggers the recorder already listens
27775
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
27776
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
27777
+ * still happening" cannot be expressed as an edge plus a post-buffer without
27778
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
27779
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
27780
+ * which records the dock for that long after every short one. So the recorder
27781
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
27782
+ * own post-buffer once it falls.
27783
+ *
27784
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
27785
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
27786
+ * writes this slice on every change; consumers subscribe to the kernel's
27787
+ * `DeviceStateChanged` for it and read it back through
27788
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
27789
+ * against the device (D224, D8/D11).
27790
+ *
27791
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
27792
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
27793
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
27794
+ * about the camera, on the camera.
27795
+ */
27796
+ var RecordingSignalStatusSchema = object({
27797
+ /** True while the device asks to be recorded. */
27798
+ active: boolean(),
27799
+ /**
27800
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
27801
+ * …). Free text for the log line and the UI badge; the recorder never
27802
+ * branches on it.
27803
+ */
27804
+ reason: string(),
27805
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
27806
+ lastChangedAt: number()
27807
+ });
27808
+ RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
27809
+ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusSchema);
27810
+ /**
27732
27811
  * scene-monitor — device-scoped reference-region state cap. An operator marks
27733
27812
  * a rect ROI on a camera frame and names one or more states; the engine
27734
27813
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -28101,6 +28180,8 @@ var CamStreamDescriptorSchema = object({
28101
28180
  deviceFeatures: array(string()).optional(),
28102
28181
  /** Eligible for automatic profile assignment. Absent = `true`. */
28103
28182
  autoEligible: boolean().optional(),
28183
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
28184
+ profileHint: CamProfileSchema.optional(),
28104
28185
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
28105
28186
  metadata: record(string(), unknown()).optional()
28106
28187
  });
@@ -34046,6 +34127,12 @@ Object.freeze({
34046
34127
  addonId: null,
34047
34128
  access: "view"
34048
34129
  },
34130
+ "recordingSignal.getStatus": {
34131
+ capName: "recording-signal",
34132
+ capScope: "device",
34133
+ addonId: null,
34134
+ access: "view"
34135
+ },
34049
34136
  "sceneMonitor.captureReference": {
34050
34137
  capName: "scene-monitor",
34051
34138
  capScope: "device",
@@ -37038,6 +37125,11 @@ Object.freeze({
37038
37125
  form: "single",
37039
37126
  optional: true
37040
37127
  }],
37128
+ "recordingSignal.getStatus": [{
37129
+ name: "deviceId",
37130
+ form: "single",
37131
+ optional: false
37132
+ }],
37041
37133
  "sceneMonitor.captureReference": [{
37042
37134
  name: "deviceId",
37043
37135
  form: "single",
package/dist/smb.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DiZPvkCY.js");
5
+ const require_shared = require("./shared-DorYC8t5.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-Dg4Fpj1Q.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-DkdzfmAe.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as path from "node:path";
4
4
  import * as fsp from "node:fs/promises";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DiZPvkCY.js");
5
+ const require_shared = require("./shared-DorYC8t5.js");
6
6
  let node_stream = require("node:stream");
7
7
  let webdav = require("webdav");
8
8
  //#region src/providers/webdav/webdav-config-schema.ts
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-Dg4Fpj1Q.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DkdzfmAe.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { AuthType, createClient } from "webdav";
4
4
  //#region src/providers/webdav/webdav-config-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-remote-storage",
3
- "version": "1.2.70",
3
+ "version": "1.2.72",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV, SMB) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",