@camstack/addon-terminal 0.1.119 → 0.1.121

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
@@ -5392,7 +5392,7 @@ var ZodIssueCode = {
5392
5392
  var ZodFirstPartyTypeKind;
5393
5393
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5394
5394
  //#endregion
5395
- //#region ../types/dist/sleep-Bs3xPtSh.mjs
5395
+ //#region ../types/dist/sleep-GU_us3DG.mjs
5396
5396
  /**
5397
5397
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5398
5398
  * window to float samples (D455).
@@ -7882,13 +7882,37 @@ var CameraSwitchGroupSchema = object({
7882
7882
  fetchedAt: number()
7883
7883
  });
7884
7884
  /**
7885
- * The wrapper capability each wrapper-backed switch controls. Named constants
7886
- * because the same strings appear in `legacy-migrations.ts`, in
7887
- * `isCapActiveForDevice` call sites and in the fake harness — a typo in any of
7888
- * them is a switch that silently writes a binding nobody reads.
7885
+ * Every analyser a camera CamStack BUILDS is created with switched off.
7886
+ *
7887
+ * A grid and a Terminal camera are `DeviceType.Camera`, so every wrapper that
7888
+ * declares `defaultActive: true` for a camera binds to them the instant they
7889
+ * exist — the whole analysis family included. There is nothing there to
7890
+ * analyse: a grid's subjects are already counted on the cameras it composes (a
7891
+ * person in the bottom-right cell is a person on THAT camera, not on the grid),
7892
+ * and a Terminal camera shows a shell.
7893
+ *
7894
+ * ONE list, in the package both already depend on, because there were two and
7895
+ * they had already drifted: the Terminal's and the grid's each named three caps
7896
+ * and neither named `pipeline-analytics` — which has no gate of its own except
7897
+ * this binding, so a grid that forwards its sources' motion (so the viewer can
7898
+ * light its tile) would open a motion EPISODE per forwarded event, duplicating
7899
+ * the rows those sources already write.
7900
+ *
7901
+ * `motion-detection` sits first deliberately: it is the one that holds the
7902
+ * decode session open, so its absence is the difference between a derived
7903
+ * camera costing a composition and costing a full decode pipeline.
7904
+ *
7905
+ * Applied ONLY at creation. An operator who deliberately turns analysis back on
7906
+ * for a grid must win, and a reconcile that re-asserted this every pass would
7907
+ * silently overrule them once a minute.
7889
7908
  */
7890
- var DETECTION_PIPELINE_CAP_NAME = "detection-pipeline";
7891
- var AUDIO_ANALYSIS_CAP_NAME = "audio-analysis";
7909
+ var DERIVED_CAMERA_SILENCED_CAP_NAMES = [
7910
+ "motion-detection",
7911
+ "detection-pipeline",
7912
+ "audio-analysis",
7913
+ "pipeline-analytics",
7914
+ "scene-monitor"
7915
+ ];
7892
7916
  /**
7893
7917
  * What the gate decided about a birth, from the CALLER's point of view.
7894
7918
  *
@@ -29070,11 +29094,15 @@ var motionTriggerCapability = {
29070
29094
  *
29071
29095
  * Adding a fifth name to that list would have been the wrong fix twice over:
29072
29096
  * that page is per-camera DETECTION tuning, and a grid's geometry belongs
29073
- * beside PTZ and motion zones on the camera itself — which is exactly where the
29074
- * framework already puts a widget, when the widget is declared on a CAPABILITY.
29075
- * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
29076
- * all use it): the framework emits the structural section and the widget
29077
- * self-persists through the cap's own mutations.
29097
+ * beside PTZ and motion zones on the camera itself. The device page is
29098
+ * BINDING-driven (D12), so the way in is a capability bound to the device —
29099
+ * and this cap carries its section the way `recording` does, by RETURNING it
29100
+ * from `getDeviceSettingsContribution`.
29101
+ *
29102
+ * Seven other widgets are still declared the other way, through a
29103
+ * `deviceConfig.ui` block the framework derives a section from. That route
29104
+ * gives the addon no say in where its own panel lands and no way to decline
29105
+ * for a device the panel does not suit, which is why this one does not use it.
29078
29106
  *
29079
29107
  * ## Why one addon may implement it
29080
29108
  *
@@ -31433,6 +31461,25 @@ var ptzAutotrackCapability = {
31433
31461
  scope: "device",
31434
31462
  deviceNative: true,
31435
31463
  mode: "singleton",
31464
+ /**
31465
+ * Two kinds of provider behind one name, the same shape `snapshot` and
31466
+ * `doorbell` use:
31467
+ *
31468
+ * - **Native**: the camera's own firmware autotrack, registered per device by
31469
+ * the driver when the probe says it exists (Reolink: yes; Hikvision:
31470
+ * model-dependent).
31471
+ * - **Wrapper**: the emulated implementation (`@camstack/system`'s `autotrack` builtin),
31472
+ * which follows a subject with `ptz.move` pulses driven by the detection
31473
+ * pipeline. `defaultActive: false` — the operator binds it per camera in
31474
+ * the bindings UI, exactly as `virtual-doorbell` is bound.
31475
+ *
31476
+ * The binding chooses WHICH implementation answers; `setEnabled` stays the
31477
+ * one switch for the function either way. A camera never has both driving its
31478
+ * head, which is the whole reason this is not a second cap with a second
31479
+ * toggle (D62, D520).
31480
+ */
31481
+ kind: "wrapper",
31482
+ defaultActive: false,
31436
31483
  deviceTypes: [DeviceType.Camera],
31437
31484
  deviceConfig: { ui: {
31438
31485
  kind: "widget",
@@ -44830,17 +44877,13 @@ async function warmNodePty() {
44830
44877
  //#endregion
44831
44878
  //#region src/silence-analysis.ts
44832
44879
  /**
44833
- * Every analyzer a Terminal camera is created with switched OFF.
44880
+ * Every analyser a Terminal camera is created with switched OFF.
44834
44881
  *
44835
- * `motion-detection` sits first deliberately: it is the one that holds the
44836
- * decode session open, so it is the one whose absence is the difference between
44837
- * a terminal costing a screen scrape and costing a decode pipeline.
44882
+ * An alias, not a copy. This list and the grid's were separate and had drifted
44883
+ * — neither named `pipeline-analytics` — so both now read the one in
44884
+ * `@camstack/types`, which is the package they already share.
44838
44885
  */
44839
- var TERMINAL_SILENCED_CAP_NAMES = [
44840
- "motion-detection",
44841
- DETECTION_PIPELINE_CAP_NAME,
44842
- AUDIO_ANALYSIS_CAP_NAME
44843
- ];
44886
+ var TERMINAL_SILENCED_CAP_NAMES = DERIVED_CAMERA_SILENCED_CAP_NAMES;
44844
44887
  /**
44845
44888
  * Resolve the addon currently providing `capName` for this device.
44846
44889
  *
package/dist/addon.mjs CHANGED
@@ -5369,7 +5369,7 @@ var ZodIssueCode = {
5369
5369
  var ZodFirstPartyTypeKind;
5370
5370
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5371
5371
  //#endregion
5372
- //#region ../types/dist/sleep-Bs3xPtSh.mjs
5372
+ //#region ../types/dist/sleep-GU_us3DG.mjs
5373
5373
  /**
5374
5374
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5375
5375
  * window to float samples (D455).
@@ -7859,13 +7859,37 @@ var CameraSwitchGroupSchema = object({
7859
7859
  fetchedAt: number()
7860
7860
  });
7861
7861
  /**
7862
- * The wrapper capability each wrapper-backed switch controls. Named constants
7863
- * because the same strings appear in `legacy-migrations.ts`, in
7864
- * `isCapActiveForDevice` call sites and in the fake harness — a typo in any of
7865
- * them is a switch that silently writes a binding nobody reads.
7862
+ * Every analyser a camera CamStack BUILDS is created with switched off.
7863
+ *
7864
+ * A grid and a Terminal camera are `DeviceType.Camera`, so every wrapper that
7865
+ * declares `defaultActive: true` for a camera binds to them the instant they
7866
+ * exist — the whole analysis family included. There is nothing there to
7867
+ * analyse: a grid's subjects are already counted on the cameras it composes (a
7868
+ * person in the bottom-right cell is a person on THAT camera, not on the grid),
7869
+ * and a Terminal camera shows a shell.
7870
+ *
7871
+ * ONE list, in the package both already depend on, because there were two and
7872
+ * they had already drifted: the Terminal's and the grid's each named three caps
7873
+ * and neither named `pipeline-analytics` — which has no gate of its own except
7874
+ * this binding, so a grid that forwards its sources' motion (so the viewer can
7875
+ * light its tile) would open a motion EPISODE per forwarded event, duplicating
7876
+ * the rows those sources already write.
7877
+ *
7878
+ * `motion-detection` sits first deliberately: it is the one that holds the
7879
+ * decode session open, so its absence is the difference between a derived
7880
+ * camera costing a composition and costing a full decode pipeline.
7881
+ *
7882
+ * Applied ONLY at creation. An operator who deliberately turns analysis back on
7883
+ * for a grid must win, and a reconcile that re-asserted this every pass would
7884
+ * silently overrule them once a minute.
7866
7885
  */
7867
- var DETECTION_PIPELINE_CAP_NAME = "detection-pipeline";
7868
- var AUDIO_ANALYSIS_CAP_NAME = "audio-analysis";
7886
+ var DERIVED_CAMERA_SILENCED_CAP_NAMES = [
7887
+ "motion-detection",
7888
+ "detection-pipeline",
7889
+ "audio-analysis",
7890
+ "pipeline-analytics",
7891
+ "scene-monitor"
7892
+ ];
7869
7893
  /**
7870
7894
  * What the gate decided about a birth, from the CALLER's point of view.
7871
7895
  *
@@ -29047,11 +29071,15 @@ var motionTriggerCapability = {
29047
29071
  *
29048
29072
  * Adding a fifth name to that list would have been the wrong fix twice over:
29049
29073
  * that page is per-camera DETECTION tuning, and a grid's geometry belongs
29050
- * beside PTZ and motion zones on the camera itself — which is exactly where the
29051
- * framework already puts a widget, when the widget is declared on a CAPABILITY.
29052
- * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
29053
- * all use it): the framework emits the structural section and the widget
29054
- * self-persists through the cap's own mutations.
29074
+ * beside PTZ and motion zones on the camera itself. The device page is
29075
+ * BINDING-driven (D12), so the way in is a capability bound to the device —
29076
+ * and this cap carries its section the way `recording` does, by RETURNING it
29077
+ * from `getDeviceSettingsContribution`.
29078
+ *
29079
+ * Seven other widgets are still declared the other way, through a
29080
+ * `deviceConfig.ui` block the framework derives a section from. That route
29081
+ * gives the addon no say in where its own panel lands and no way to decline
29082
+ * for a device the panel does not suit, which is why this one does not use it.
29055
29083
  *
29056
29084
  * ## Why one addon may implement it
29057
29085
  *
@@ -31410,6 +31438,25 @@ var ptzAutotrackCapability = {
31410
31438
  scope: "device",
31411
31439
  deviceNative: true,
31412
31440
  mode: "singleton",
31441
+ /**
31442
+ * Two kinds of provider behind one name, the same shape `snapshot` and
31443
+ * `doorbell` use:
31444
+ *
31445
+ * - **Native**: the camera's own firmware autotrack, registered per device by
31446
+ * the driver when the probe says it exists (Reolink: yes; Hikvision:
31447
+ * model-dependent).
31448
+ * - **Wrapper**: the emulated implementation (`@camstack/system`'s `autotrack` builtin),
31449
+ * which follows a subject with `ptz.move` pulses driven by the detection
31450
+ * pipeline. `defaultActive: false` — the operator binds it per camera in
31451
+ * the bindings UI, exactly as `virtual-doorbell` is bound.
31452
+ *
31453
+ * The binding chooses WHICH implementation answers; `setEnabled` stays the
31454
+ * one switch for the function either way. A camera never has both driving its
31455
+ * head, which is the whole reason this is not a second cap with a second
31456
+ * toggle (D62, D520).
31457
+ */
31458
+ kind: "wrapper",
31459
+ defaultActive: false,
31413
31460
  deviceTypes: [DeviceType.Camera],
31414
31461
  deviceConfig: { ui: {
31415
31462
  kind: "widget",
@@ -44807,17 +44854,13 @@ async function warmNodePty() {
44807
44854
  //#endregion
44808
44855
  //#region src/silence-analysis.ts
44809
44856
  /**
44810
- * Every analyzer a Terminal camera is created with switched OFF.
44857
+ * Every analyser a Terminal camera is created with switched OFF.
44811
44858
  *
44812
- * `motion-detection` sits first deliberately: it is the one that holds the
44813
- * decode session open, so it is the one whose absence is the difference between
44814
- * a terminal costing a screen scrape and costing a decode pipeline.
44859
+ * An alias, not a copy. This list and the grid's were separate and had drifted
44860
+ * — neither named `pipeline-analytics` — so both now read the one in
44861
+ * `@camstack/types`, which is the package they already share.
44815
44862
  */
44816
- var TERMINAL_SILENCED_CAP_NAMES = [
44817
- "motion-detection",
44818
- DETECTION_PIPELINE_CAP_NAME,
44819
- AUDIO_ANALYSIS_CAP_NAME
44820
- ];
44863
+ var TERMINAL_SILENCED_CAP_NAMES = DERIVED_CAMERA_SILENCED_CAP_NAMES;
44821
44864
  /**
44822
44865
  * Resolve the addon currently providing `capName` for this device.
44823
44866
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.119",
3
+ "version": "0.1.121",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",