@camstack/addon-export-google 0.1.36 → 0.1.37

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.
@@ -6523,6 +6523,21 @@ var CameraStreamSchema = object({
6523
6523
  */
6524
6524
  autoEligible: boolean().optional(),
6525
6525
  /**
6526
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6527
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6528
+ * stream. Consulted by the broker's automatic ranking
6529
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6530
+ * an operator's manual assignment still wins, and an absent hint is the
6531
+ * pixel-ranked default every camera had before this field existed.
6532
+ *
6533
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6534
+ * storage class is written for on its own (`recordings` is high|mid,
6535
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6536
+ * camera's single 720p relay is a `low` in every respect except the slot the
6537
+ * heuristic put it in.
6538
+ */
6539
+ profileHint: CamProfileSchema.optional(),
6540
+ /**
6526
6541
  * Transport-specific opaque metadata. The broker passes it through to
6527
6542
  * the source reader without inspecting it. Currently used by
6528
6543
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -8087,7 +8102,22 @@ var RecordingTriggersSchema = object({
8087
8102
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
8088
8103
  * registrare.
8089
8104
  */
8090
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
8105
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
8106
+ /**
8107
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
8108
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
8109
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
8110
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
8111
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
8112
+ *
8113
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
8114
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
8115
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
8116
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
8117
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
8118
+ * (`holdTrigger` / `releaseTrigger`).
8119
+ */
8120
+ deviceSignal: boolean().optional()
8091
8121
  });
8092
8122
  /**
8093
8123
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11577,6 +11607,8 @@ method(object({
11577
11607
  label: string().optional(),
11578
11608
  deviceFeatures: array(string()).optional(),
11579
11609
  autoEligible: boolean().optional(),
11610
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11611
+ profileHint: CamProfileSchema.optional(),
11580
11612
  metadata: record(string(), unknown()).optional(),
11581
11613
  /** Required when kind === 'derived' — the source camStreamId the
11582
11614
  * derived broker reads its encoded plane from.
@@ -27961,6 +27993,47 @@ method(object({
27961
27993
  auth: "protected"
27962
27994
  });
27963
27995
  /**
27996
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
27997
+ * something it knows about is happening (a robot vacuum cleaning, a machine
27998
+ * running, a gate open) and lowers when it stops.
27999
+ *
28000
+ * It is a level, not an edge. The sensor triggers the recorder already listens
28001
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
28002
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
28003
+ * still happening" cannot be expressed as an edge plus a post-buffer without
28004
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
28005
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
28006
+ * which records the dock for that long after every short one. So the recorder
28007
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
28008
+ * own post-buffer once it falls.
28009
+ *
28010
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
28011
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
28012
+ * writes this slice on every change; consumers subscribe to the kernel's
28013
+ * `DeviceStateChanged` for it and read it back through
28014
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
28015
+ * against the device (D224, D8/D11).
28016
+ *
28017
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
28018
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
28019
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
28020
+ * about the camera, on the camera.
28021
+ */
28022
+ var RecordingSignalStatusSchema = object({
28023
+ /** True while the device asks to be recorded. */
28024
+ active: boolean(),
28025
+ /**
28026
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
28027
+ * …). Free text for the log line and the UI badge; the recorder never
28028
+ * branches on it.
28029
+ */
28030
+ reason: string(),
28031
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
28032
+ lastChangedAt: number()
28033
+ });
28034
+ RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
28035
+ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusSchema);
28036
+ /**
27964
28037
  * scene-monitor — device-scoped reference-region state cap. An operator marks
27965
28038
  * a rect ROI on a camera frame and names one or more states; the engine
27966
28039
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -28333,6 +28406,8 @@ var CamStreamDescriptorSchema = object({
28333
28406
  deviceFeatures: array(string()).optional(),
28334
28407
  /** Eligible for automatic profile assignment. Absent = `true`. */
28335
28408
  autoEligible: boolean().optional(),
28409
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
28410
+ profileHint: CamProfileSchema.optional(),
28336
28411
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
28337
28412
  metadata: record(string(), unknown()).optional()
28338
28413
  });
@@ -34285,6 +34360,12 @@ Object.freeze({
34285
34360
  addonId: null,
34286
34361
  access: "view"
34287
34362
  },
34363
+ "recordingSignal.getStatus": {
34364
+ capName: "recording-signal",
34365
+ capScope: "device",
34366
+ addonId: null,
34367
+ access: "view"
34368
+ },
34288
34369
  "sceneMonitor.captureReference": {
34289
34370
  capName: "scene-monitor",
34290
34371
  capScope: "device",
@@ -37277,6 +37358,11 @@ Object.freeze({
37277
37358
  form: "single",
37278
37359
  optional: true
37279
37360
  }],
37361
+ "recordingSignal.getStatus": [{
37362
+ name: "deviceId",
37363
+ form: "single",
37364
+ optional: false
37365
+ }],
37280
37366
  "sceneMonitor.captureReference": [{
37281
37367
  name: "deviceId",
37282
37368
  form: "single",
@@ -6519,6 +6519,21 @@ var CameraStreamSchema = object({
6519
6519
  */
6520
6520
  autoEligible: boolean().optional(),
6521
6521
  /**
6522
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6523
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6524
+ * stream. Consulted by the broker's automatic ranking
6525
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6526
+ * an operator's manual assignment still wins, and an absent hint is the
6527
+ * pixel-ranked default every camera had before this field existed.
6528
+ *
6529
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6530
+ * storage class is written for on its own (`recordings` is high|mid,
6531
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6532
+ * camera's single 720p relay is a `low` in every respect except the slot the
6533
+ * heuristic put it in.
6534
+ */
6535
+ profileHint: CamProfileSchema.optional(),
6536
+ /**
6522
6537
  * Transport-specific opaque metadata. The broker passes it through to
6523
6538
  * the source reader without inspecting it. Currently used by
6524
6539
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -8083,7 +8098,22 @@ var RecordingTriggersSchema = object({
8083
8098
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
8084
8099
  * registrare.
8085
8100
  */
8086
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
8101
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
8102
+ /**
8103
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
8104
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
8105
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
8106
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
8107
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
8108
+ *
8109
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
8110
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
8111
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
8112
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
8113
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
8114
+ * (`holdTrigger` / `releaseTrigger`).
8115
+ */
8116
+ deviceSignal: boolean().optional()
8087
8117
  });
8088
8118
  /**
8089
8119
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11573,6 +11603,8 @@ method(object({
11573
11603
  label: string().optional(),
11574
11604
  deviceFeatures: array(string()).optional(),
11575
11605
  autoEligible: boolean().optional(),
11606
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11607
+ profileHint: CamProfileSchema.optional(),
11576
11608
  metadata: record(string(), unknown()).optional(),
11577
11609
  /** Required when kind === 'derived' — the source camStreamId the
11578
11610
  * derived broker reads its encoded plane from.
@@ -27957,6 +27989,47 @@ method(object({
27957
27989
  auth: "protected"
27958
27990
  });
27959
27991
  /**
27992
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
27993
+ * something it knows about is happening (a robot vacuum cleaning, a machine
27994
+ * running, a gate open) and lowers when it stops.
27995
+ *
27996
+ * It is a level, not an edge. The sensor triggers the recorder already listens
27997
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
27998
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
27999
+ * still happening" cannot be expressed as an edge plus a post-buffer without
28000
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
28001
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
28002
+ * which records the dock for that long after every short one. So the recorder
28003
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
28004
+ * own post-buffer once it falls.
28005
+ *
28006
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
28007
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
28008
+ * writes this slice on every change; consumers subscribe to the kernel's
28009
+ * `DeviceStateChanged` for it and read it back through
28010
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
28011
+ * against the device (D224, D8/D11).
28012
+ *
28013
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
28014
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
28015
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
28016
+ * about the camera, on the camera.
28017
+ */
28018
+ var RecordingSignalStatusSchema = object({
28019
+ /** True while the device asks to be recorded. */
28020
+ active: boolean(),
28021
+ /**
28022
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
28023
+ * …). Free text for the log line and the UI badge; the recorder never
28024
+ * branches on it.
28025
+ */
28026
+ reason: string(),
28027
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
28028
+ lastChangedAt: number()
28029
+ });
28030
+ RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
28031
+ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusSchema);
28032
+ /**
27960
28033
  * scene-monitor — device-scoped reference-region state cap. An operator marks
27961
28034
  * a rect ROI on a camera frame and names one or more states; the engine
27962
28035
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -28329,6 +28402,8 @@ var CamStreamDescriptorSchema = object({
28329
28402
  deviceFeatures: array(string()).optional(),
28330
28403
  /** Eligible for automatic profile assignment. Absent = `true`. */
28331
28404
  autoEligible: boolean().optional(),
28405
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
28406
+ profileHint: CamProfileSchema.optional(),
28332
28407
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
28333
28408
  metadata: record(string(), unknown()).optional()
28334
28409
  });
@@ -34281,6 +34356,12 @@ Object.freeze({
34281
34356
  addonId: null,
34282
34357
  access: "view"
34283
34358
  },
34359
+ "recordingSignal.getStatus": {
34360
+ capName: "recording-signal",
34361
+ capScope: "device",
34362
+ addonId: null,
34363
+ access: "view"
34364
+ },
34284
34365
  "sceneMonitor.captureReference": {
34285
34366
  capName: "scene-monitor",
34286
34367
  capScope: "device",
@@ -37273,6 +37354,11 @@ Object.freeze({
37273
37354
  form: "single",
37274
37355
  optional: true
37275
37356
  }],
37357
+ "recordingSignal.getStatus": [{
37358
+ name: "deviceId",
37359
+ form: "single",
37360
+ optional: false
37361
+ }],
37276
37362
  "sceneMonitor.captureReference": [{
37277
37363
  name: "deviceId",
37278
37364
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-google",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "description": "Google Home export — hub-side smart-home fulfillment (SYNC / QUERY / EXECUTE / DISCONNECT) for the non-camera fleet, served over the hub's own OAuth account link. No Google credential is stored, sent or required.",
5
5
  "keywords": [
6
6
  "camstack",