@camstack/addon-provider-rademacher 0.2.40 → 0.2.41

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
@@ -25927,6 +25927,33 @@ var intercomCapability = {
25927
25927
  deviceNative: true,
25928
25928
  mode: "singleton",
25929
25929
  deviceTypes: [DeviceType.Camera],
25930
+ /**
25931
+ * **Auth tier: `protected` on every method — deliberate, and load-bearing.**
25932
+ *
25933
+ * Talking through a camera is an OPERATE action, not a CONFIGURE one. This
25934
+ * cap has no configuration surface at all: all six methods open, feed and
25935
+ * close one live audio session against one `deviceId`. That is the same
25936
+ * authority as `ptz.move` or `snapshot.getSnapshot`, both `protected` — and
25937
+ * the opposite of `ptz.savePreset` / `snapshot.invalidateCache`, which are
25938
+ * `admin` because they change what the device IS.
25939
+ *
25940
+ * `protected` does not mean ungated: `protectedProcedure` runs the
25941
+ * `METHOD_ACCESS_MAP` scope check, and every method here is `scope: 'device'`
25942
+ * with `access: 'create'` and a `deviceId` in its input. So a caller needs a
25943
+ * grant that covers THAT camera at `create` — a `camera-viewer` (`view`
25944
+ * only) still cannot talk, and a grant on camera 5 cannot talk through
25945
+ * camera 7.
25946
+ *
25947
+ * Every method was `auth: 'admin'` from the initial commit, which made the
25948
+ * cap unreachable by every non-admin principal — `adminProcedure` throws
25949
+ * `FORBIDDEN: Admin required` BEFORE the scope check runs, so the scope
25950
+ * machinery generated for this cap (`METHOD_ACCESS_MAP`,
25951
+ * `DEVICE_SCOPED_CAPS`, `METHOD_DEVICE_SELECTORS`) was complete and dead. The
25952
+ * `camera-operator` scope preset has promised "PTZ control, intercom,
25953
+ * snapshots" since that same commit; the promise could not be kept. Recorded
25954
+ * as D289; `scripts/check-scope-preset-promises.ts` now fails the build if a
25955
+ * preset promises a cap no row of that preset can reach.
25956
+ */
25930
25957
  methods: {
25931
25958
  /**
25932
25959
  * Open a server-side WebRTC audio-only session. Returns an SDP
@@ -25939,7 +25966,7 @@ var intercomCapability = {
25939
25966
  sdpOffer: string()
25940
25967
  }), {
25941
25968
  kind: "mutation",
25942
- auth: "admin"
25969
+ auth: "protected"
25943
25970
  }),
25944
25971
  handleAnswer: method(object({
25945
25972
  deviceId: number(),
@@ -25947,7 +25974,7 @@ var intercomCapability = {
25947
25974
  sdpAnswer: string()
25948
25975
  }), _void(), {
25949
25976
  kind: "mutation",
25950
- auth: "admin"
25977
+ auth: "protected"
25951
25978
  }),
25952
25979
  /** Close explicitly. Server also auto-closes on 30s idle. */
25953
25980
  stopSession: method(object({
@@ -25955,7 +25982,7 @@ var intercomCapability = {
25955
25982
  sessionId: string()
25956
25983
  }), _void(), {
25957
25984
  kind: "mutation",
25958
- auth: "admin"
25985
+ auth: "protected"
25959
25986
  }),
25960
25987
  /**
25961
25988
  * Open a raw-PCM talk session (no WebRTC SDP plumbing). Used by
@@ -25968,7 +25995,7 @@ var intercomCapability = {
25968
25995
  */
25969
25996
  startTalkSession: method(object({ deviceId: number() }), object({ sessionId: string() }), {
25970
25997
  kind: "mutation",
25971
- auth: "admin"
25998
+ auth: "protected"
25972
25999
  }),
25973
26000
  /**
25974
26001
  * Push one chunk of talk-back audio onto the active talk session.
@@ -26003,12 +26030,12 @@ var intercomCapability = {
26003
26030
  sequenceNumber: number().int()
26004
26031
  }), object({ accepted: boolean() }), {
26005
26032
  kind: "mutation",
26006
- auth: "admin"
26033
+ auth: "protected"
26007
26034
  }),
26008
26035
  /** Close the raw-PCM talk session. Idempotent. */
26009
26036
  endTalkSession: method(object({ deviceId: number() }), _void(), {
26010
26037
  kind: "mutation",
26011
- auth: "admin"
26038
+ auth: "protected"
26012
26039
  })
26013
26040
  },
26014
26041
  events: { onStatusChanged: { data: object({
package/dist/addon.mjs CHANGED
@@ -25926,6 +25926,33 @@ var intercomCapability = {
25926
25926
  deviceNative: true,
25927
25927
  mode: "singleton",
25928
25928
  deviceTypes: [DeviceType.Camera],
25929
+ /**
25930
+ * **Auth tier: `protected` on every method — deliberate, and load-bearing.**
25931
+ *
25932
+ * Talking through a camera is an OPERATE action, not a CONFIGURE one. This
25933
+ * cap has no configuration surface at all: all six methods open, feed and
25934
+ * close one live audio session against one `deviceId`. That is the same
25935
+ * authority as `ptz.move` or `snapshot.getSnapshot`, both `protected` — and
25936
+ * the opposite of `ptz.savePreset` / `snapshot.invalidateCache`, which are
25937
+ * `admin` because they change what the device IS.
25938
+ *
25939
+ * `protected` does not mean ungated: `protectedProcedure` runs the
25940
+ * `METHOD_ACCESS_MAP` scope check, and every method here is `scope: 'device'`
25941
+ * with `access: 'create'` and a `deviceId` in its input. So a caller needs a
25942
+ * grant that covers THAT camera at `create` — a `camera-viewer` (`view`
25943
+ * only) still cannot talk, and a grant on camera 5 cannot talk through
25944
+ * camera 7.
25945
+ *
25946
+ * Every method was `auth: 'admin'` from the initial commit, which made the
25947
+ * cap unreachable by every non-admin principal — `adminProcedure` throws
25948
+ * `FORBIDDEN: Admin required` BEFORE the scope check runs, so the scope
25949
+ * machinery generated for this cap (`METHOD_ACCESS_MAP`,
25950
+ * `DEVICE_SCOPED_CAPS`, `METHOD_DEVICE_SELECTORS`) was complete and dead. The
25951
+ * `camera-operator` scope preset has promised "PTZ control, intercom,
25952
+ * snapshots" since that same commit; the promise could not be kept. Recorded
25953
+ * as D289; `scripts/check-scope-preset-promises.ts` now fails the build if a
25954
+ * preset promises a cap no row of that preset can reach.
25955
+ */
25929
25956
  methods: {
25930
25957
  /**
25931
25958
  * Open a server-side WebRTC audio-only session. Returns an SDP
@@ -25938,7 +25965,7 @@ var intercomCapability = {
25938
25965
  sdpOffer: string()
25939
25966
  }), {
25940
25967
  kind: "mutation",
25941
- auth: "admin"
25968
+ auth: "protected"
25942
25969
  }),
25943
25970
  handleAnswer: method(object({
25944
25971
  deviceId: number(),
@@ -25946,7 +25973,7 @@ var intercomCapability = {
25946
25973
  sdpAnswer: string()
25947
25974
  }), _void(), {
25948
25975
  kind: "mutation",
25949
- auth: "admin"
25976
+ auth: "protected"
25950
25977
  }),
25951
25978
  /** Close explicitly. Server also auto-closes on 30s idle. */
25952
25979
  stopSession: method(object({
@@ -25954,7 +25981,7 @@ var intercomCapability = {
25954
25981
  sessionId: string()
25955
25982
  }), _void(), {
25956
25983
  kind: "mutation",
25957
- auth: "admin"
25984
+ auth: "protected"
25958
25985
  }),
25959
25986
  /**
25960
25987
  * Open a raw-PCM talk session (no WebRTC SDP plumbing). Used by
@@ -25967,7 +25994,7 @@ var intercomCapability = {
25967
25994
  */
25968
25995
  startTalkSession: method(object({ deviceId: number() }), object({ sessionId: string() }), {
25969
25996
  kind: "mutation",
25970
- auth: "admin"
25997
+ auth: "protected"
25971
25998
  }),
25972
25999
  /**
25973
26000
  * Push one chunk of talk-back audio onto the active talk session.
@@ -26002,12 +26029,12 @@ var intercomCapability = {
26002
26029
  sequenceNumber: number().int()
26003
26030
  }), object({ accepted: boolean() }), {
26004
26031
  kind: "mutation",
26005
- auth: "admin"
26032
+ auth: "protected"
26006
26033
  }),
26007
26034
  /** Close the raw-PCM talk session. Idempotent. */
26008
26035
  endTalkSession: method(object({ deviceId: number() }), _void(), {
26009
26036
  kind: "mutation",
26010
- auth: "admin"
26037
+ auth: "protected"
26011
26038
  })
26012
26039
  },
26013
26040
  events: { onStatusChanged: { data: object({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.40",
3
+ "version": "0.2.41",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",