@camstack/addon-export-google 0.1.35 → 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.
@@ -5484,6 +5484,12 @@ Object.fromEntries([
5484
5484
  icon: "move",
5485
5485
  order: 40
5486
5486
  },
5487
+ {
5488
+ id: "navigation",
5489
+ label: "Navigation",
5490
+ icon: "compass",
5491
+ order: 41
5492
+ },
5487
5493
  {
5488
5494
  id: "consumables",
5489
5495
  label: "Consumables",
@@ -6517,6 +6523,21 @@ var CameraStreamSchema = object({
6517
6523
  */
6518
6524
  autoEligible: boolean().optional(),
6519
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
+ /**
6520
6541
  * Transport-specific opaque metadata. The broker passes it through to
6521
6542
  * the source reader without inspecting it. Currently used by
6522
6543
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -8081,7 +8102,22 @@ var RecordingTriggersSchema = object({
8081
8102
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
8082
8103
  * registrare.
8083
8104
  */
8084
- 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()
8085
8121
  });
8086
8122
  /**
8087
8123
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11571,6 +11607,8 @@ method(object({
11571
11607
  label: string().optional(),
11572
11608
  deviceFeatures: array(string()).optional(),
11573
11609
  autoEligible: boolean().optional(),
11610
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11611
+ profileHint: CamProfileSchema.optional(),
11574
11612
  metadata: record(string(), unknown()).optional(),
11575
11613
  /** Required when kind === 'derived' — the source camStreamId the
11576
11614
  * derived broker reads its encoded plane from.
@@ -27955,6 +27993,47 @@ method(object({
27955
27993
  auth: "protected"
27956
27994
  });
27957
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
+ /**
27958
28037
  * scene-monitor — device-scoped reference-region state cap. An operator marks
27959
28038
  * a rect ROI on a camera frame and names one or more states; the engine
27960
28039
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -28327,6 +28406,8 @@ var CamStreamDescriptorSchema = object({
28327
28406
  deviceFeatures: array(string()).optional(),
28328
28407
  /** Eligible for automatic profile assignment. Absent = `true`. */
28329
28408
  autoEligible: boolean().optional(),
28409
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
28410
+ profileHint: CamProfileSchema.optional(),
28330
28411
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
28331
28412
  metadata: record(string(), unknown()).optional()
28332
28413
  });
@@ -34279,6 +34360,12 @@ Object.freeze({
34279
34360
  addonId: null,
34280
34361
  access: "view"
34281
34362
  },
34363
+ "recordingSignal.getStatus": {
34364
+ capName: "recording-signal",
34365
+ capScope: "device",
34366
+ addonId: null,
34367
+ access: "view"
34368
+ },
34282
34369
  "sceneMonitor.captureReference": {
34283
34370
  capName: "scene-monitor",
34284
34371
  capScope: "device",
@@ -37271,6 +37358,11 @@ Object.freeze({
37271
37358
  form: "single",
37272
37359
  optional: true
37273
37360
  }],
37361
+ "recordingSignal.getStatus": [{
37362
+ name: "deviceId",
37363
+ form: "single",
37364
+ optional: false
37365
+ }],
37274
37366
  "sceneMonitor.captureReference": [{
37275
37367
  name: "deviceId",
37276
37368
  form: "single",
@@ -5480,6 +5480,12 @@ Object.fromEntries([
5480
5480
  icon: "move",
5481
5481
  order: 40
5482
5482
  },
5483
+ {
5484
+ id: "navigation",
5485
+ label: "Navigation",
5486
+ icon: "compass",
5487
+ order: 41
5488
+ },
5483
5489
  {
5484
5490
  id: "consumables",
5485
5491
  label: "Consumables",
@@ -6513,6 +6519,21 @@ var CameraStreamSchema = object({
6513
6519
  */
6514
6520
  autoEligible: boolean().optional(),
6515
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
+ /**
6516
6537
  * Transport-specific opaque metadata. The broker passes it through to
6517
6538
  * the source reader without inspecting it. Currently used by
6518
6539
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -8077,7 +8098,22 @@ var RecordingTriggersSchema = object({
8077
8098
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
8078
8099
  * registrare.
8079
8100
  */
8080
- 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()
8081
8117
  });
8082
8118
  /**
8083
8119
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11567,6 +11603,8 @@ method(object({
11567
11603
  label: string().optional(),
11568
11604
  deviceFeatures: array(string()).optional(),
11569
11605
  autoEligible: boolean().optional(),
11606
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11607
+ profileHint: CamProfileSchema.optional(),
11570
11608
  metadata: record(string(), unknown()).optional(),
11571
11609
  /** Required when kind === 'derived' — the source camStreamId the
11572
11610
  * derived broker reads its encoded plane from.
@@ -27951,6 +27989,47 @@ method(object({
27951
27989
  auth: "protected"
27952
27990
  });
27953
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
+ /**
27954
28033
  * scene-monitor — device-scoped reference-region state cap. An operator marks
27955
28034
  * a rect ROI on a camera frame and names one or more states; the engine
27956
28035
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -28323,6 +28402,8 @@ var CamStreamDescriptorSchema = object({
28323
28402
  deviceFeatures: array(string()).optional(),
28324
28403
  /** Eligible for automatic profile assignment. Absent = `true`. */
28325
28404
  autoEligible: boolean().optional(),
28405
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
28406
+ profileHint: CamProfileSchema.optional(),
28326
28407
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
28327
28408
  metadata: record(string(), unknown()).optional()
28328
28409
  });
@@ -34275,6 +34356,12 @@ Object.freeze({
34275
34356
  addonId: null,
34276
34357
  access: "view"
34277
34358
  },
34359
+ "recordingSignal.getStatus": {
34360
+ capName: "recording-signal",
34361
+ capScope: "device",
34362
+ addonId: null,
34363
+ access: "view"
34364
+ },
34278
34365
  "sceneMonitor.captureReference": {
34279
34366
  capName: "scene-monitor",
34280
34367
  capScope: "device",
@@ -37267,6 +37354,11 @@ Object.freeze({
37267
37354
  form: "single",
37268
37355
  optional: true
37269
37356
  }],
37357
+ "recordingSignal.getStatus": [{
37358
+ name: "deviceId",
37359
+ form: "single",
37360
+ optional: false
37361
+ }],
37270
37362
  "sceneMonitor.captureReference": [{
37271
37363
  name: "deviceId",
37272
37364
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-google",
3
- "version": "0.1.35",
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",