@robota-sdk/agent-transport-webrtc 3.0.0-beta.100

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.
Files changed (84) hide show
  1. package/CHANGELOG.md +694 -0
  2. package/LICENSE +661 -0
  3. package/README.md +111 -0
  4. package/dist/node/index.cjs +1 -0
  5. package/dist/node/index.d.cts +1650 -0
  6. package/dist/node/index.d.cts.map +1 -0
  7. package/dist/node/index.d.ts +1650 -0
  8. package/dist/node/index.d.ts.map +1 -0
  9. package/dist/node/index.js +2 -0
  10. package/dist/node/index.js.map +1 -0
  11. package/package.json +93 -0
  12. package/src/__tests__/admission-secure-by-default.test.ts +63 -0
  13. package/src/__tests__/admission-steps.test.ts +46 -0
  14. package/src/__tests__/device-mesh-relay.test.ts +441 -0
  15. package/src/__tests__/device-mesh.test.ts +682 -0
  16. package/src/__tests__/discovering-mesh-relay.test.ts +234 -0
  17. package/src/__tests__/enrollment-link.test.ts +103 -0
  18. package/src/__tests__/fake-datachannel.ts +83 -0
  19. package/src/__tests__/handoff-grant-gate.test.ts +403 -0
  20. package/src/__tests__/local-peer-proof-gate.test.ts +215 -0
  21. package/src/__tests__/mesh-admission-contract.test.ts +38 -0
  22. package/src/__tests__/mesh-discovery.test.ts +820 -0
  23. package/src/__tests__/mesh-fixtures.ts +148 -0
  24. package/src/__tests__/mesh-internet.test.ts +942 -0
  25. package/src/__tests__/mesh-turn-relay.test.ts +161 -0
  26. package/src/__tests__/negotiated-certificate.test.ts +76 -0
  27. package/src/__tests__/nostr-source-condition.test.ts +27 -0
  28. package/src/__tests__/operator-approval-gate.test.ts +308 -0
  29. package/src/__tests__/outbound-delivery-carrier.test.ts +155 -0
  30. package/src/__tests__/pairing-e2e.test.ts +237 -0
  31. package/src/__tests__/pairing-gate-e3.test.ts +194 -0
  32. package/src/__tests__/pairing-gate-e4.test.ts +110 -0
  33. package/src/__tests__/pairing-gate.test.ts +296 -0
  34. package/src/__tests__/pairing-relay-in-the-middle.test.ts +225 -0
  35. package/src/__tests__/rtc-channel-close.test.ts +52 -0
  36. package/src/__tests__/rtc-peer-candidates.test.ts +61 -0
  37. package/src/__tests__/session-attachment-app-view.test.ts +66 -0
  38. package/src/__tests__/session-attachment-budget.test.ts +136 -0
  39. package/src/__tests__/turn-server-bind.test.ts +59 -0
  40. package/src/__tests__/turn-server.test.ts +335 -0
  41. package/src/__tests__/turn-test-client.ts +256 -0
  42. package/src/__tests__/webrtc-implementation.test.ts +83 -0
  43. package/src/__tests__/webrtc-transport.test.ts +349 -0
  44. package/src/__tests__/ws-mesh-relay-client.test.ts +95 -0
  45. package/src/__tests__/ws-signaling-client.test.ts +108 -0
  46. package/src/admission-steps.ts +55 -0
  47. package/src/channel-delivery.ts +44 -0
  48. package/src/datachannel-loader.ts +86 -0
  49. package/src/device-mesh-node.ts +1019 -0
  50. package/src/discovering-mesh-relay.ts +675 -0
  51. package/src/enrollment-link.ts +465 -0
  52. package/src/handoff-grant-gate.ts +186 -0
  53. package/src/index.ts +139 -0
  54. package/src/local-peer-proof.ts +135 -0
  55. package/src/mainline-dht-store.ts +174 -0
  56. package/src/mesh-dht.ts +446 -0
  57. package/src/mesh-discovery.ts +87 -0
  58. package/src/mesh-item-store.ts +287 -0
  59. package/src/mesh-lan-listener.ts +193 -0
  60. package/src/mesh-mdns.ts +406 -0
  61. package/src/mesh-peer-link.ts +600 -0
  62. package/src/mesh-public-relays.ts +25 -0
  63. package/src/mesh-records.ts +357 -0
  64. package/src/mesh-relay.ts +98 -0
  65. package/src/mesh-signal.ts +116 -0
  66. package/src/mesh-turn-relay.ts +238 -0
  67. package/src/negotiated-certificate.ts +72 -0
  68. package/src/nostr-mesh-relay.ts +391 -0
  69. package/src/pairing-channel-lifecycle.ts +31 -0
  70. package/src/pairing-controllers.ts +81 -0
  71. package/src/pairing-frames.ts +34 -0
  72. package/src/pairing-gate-options.ts +133 -0
  73. package/src/pairing-gate.ts +397 -0
  74. package/src/rtc-peer.ts +429 -0
  75. package/src/session-attachment.ts +96 -0
  76. package/src/signaling.ts +62 -0
  77. package/src/stun-message.ts +341 -0
  78. package/src/transport-lifecycle-error.ts +11 -0
  79. package/src/turn-server.ts +1028 -0
  80. package/src/webrtc-delivery-lifecycle.ts +54 -0
  81. package/src/webrtc-transport-options.ts +87 -0
  82. package/src/webrtc-transport.ts +368 -0
  83. package/src/ws-mesh-relay-client.ts +117 -0
  84. package/src/ws-signaling-client.ts +139 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,694 @@
1
+ # @robota-sdk/agent-transport-webrtc
2
+
3
+ ## 3.0.0-beta.100
4
+ ### Patch Changes
5
+
6
+ - @robota-sdk/agent-interface-session@3.0.0-beta.100
7
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.100
8
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.100
9
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.100
10
+ - @robota-sdk/agent-transport@3.0.0-beta.100
11
+
12
+ ## 3.0.0-beta.99
13
+ ### Patch Changes
14
+
15
+ - @robota-sdk/agent-interface-session@3.0.0-beta.99
16
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.99
17
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.99
18
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.99
19
+ - @robota-sdk/agent-transport@3.0.0-beta.99
20
+
21
+ ## 3.0.0-beta.98
22
+ ### Patch Changes
23
+
24
+ - @robota-sdk/agent-interface-session@3.0.0-beta.98
25
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.98
26
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.98
27
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.98
28
+ - @robota-sdk/agent-transport@3.0.0-beta.98
29
+
30
+ ## 3.0.0-beta.97
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies [c207a31]
34
+ - Updated dependencies [7911a7d]
35
+ - @robota-sdk/agent-transport@3.0.0-beta.97
36
+ - @robota-sdk/agent-interface-session@3.0.0-beta.97
37
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.97
38
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.97
39
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.97
40
+
41
+ ## 3.0.0-beta.96
42
+ ### Patch Changes
43
+
44
+ - @robota-sdk/agent-interface-session@3.0.0-beta.96
45
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.96
46
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.96
47
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.96
48
+ - @robota-sdk/agent-transport@3.0.0-beta.96
49
+
50
+ ## 3.0.0-beta.95
51
+ ### Patch Changes
52
+
53
+ - Updated dependencies [c967c57]
54
+ - Updated dependencies [60f3965]
55
+ - Updated dependencies [115e104]
56
+ - Updated dependencies [04719a9]
57
+ - Updated dependencies [04a6de4]
58
+ - Updated dependencies [0ba247b]
59
+ - @robota-sdk/agent-transport@3.0.0-beta.95
60
+ - @robota-sdk/agent-interface-session@3.0.0-beta.95
61
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.95
62
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.95
63
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.95
64
+
65
+ ## 3.0.0-beta.94
66
+ ### Patch Changes
67
+
68
+ - @robota-sdk/agent-interface-session@3.0.0-beta.94
69
+ - @robota-sdk/agent-transport@3.0.0-beta.94
70
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.94
71
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.94
72
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.94
73
+
74
+ ## 3.0.0-beta.93
75
+ ### Patch Changes
76
+
77
+ - @robota-sdk/agent-interface-session@3.0.0-beta.93
78
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.93
79
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.93
80
+ - @robota-sdk/agent-transport@3.0.0-beta.93
81
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.93
82
+
83
+ ## 3.0.0-beta.92
84
+ ### Patch Changes
85
+
86
+ - @robota-sdk/agent-interface-session@3.0.0-beta.92
87
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.92
88
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.92
89
+ - @robota-sdk/agent-transport@3.0.0-beta.92
90
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.92
91
+
92
+ ## 3.0.0-beta.91
93
+ ### Patch Changes
94
+
95
+ - @robota-sdk/agent-interface-session@3.0.0-beta.91
96
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.91
97
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.91
98
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.91
99
+ - @robota-sdk/agent-transport@3.0.0-beta.91
100
+
101
+ ## 3.0.0-beta.90
102
+ ### Patch Changes
103
+
104
+ - @robota-sdk/agent-interface-session@3.0.0-beta.90
105
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.90
106
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.90
107
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.90
108
+ - @robota-sdk/agent-transport@3.0.0-beta.90
109
+
110
+ ## 3.0.0-beta.89
111
+ ### Patch Changes
112
+
113
+ - Updated dependencies [3427887]
114
+ - @robota-sdk/agent-transport@3.0.0-beta.89
115
+ - @robota-sdk/agent-interface-session@3.0.0-beta.89
116
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.89
117
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.89
118
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.89
119
+
120
+ ## 3.0.0-beta.88
121
+
122
+ ### Patch Changes
123
+
124
+ - @robota-sdk/agent-interface-session@3.0.0-beta.88
125
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.88
126
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.88
127
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.88
128
+ - @robota-sdk/agent-transport@3.0.0-beta.88
129
+
130
+ ## 3.0.0-beta.87
131
+
132
+ ### Patch Changes
133
+
134
+ - Release the migrated Robota product with its public SDK namespace, robota command, compatible SDK exports, internal product configuration, and verified CLI startup and delivery corrections.
135
+ - Updated dependencies
136
+ - Updated dependencies [7d9cc66]
137
+ - @robota-sdk/agent-interface-session@3.0.0-beta.87
138
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.87
139
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.87
140
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.87
141
+ - @robota-sdk/agent-transport@3.0.0-beta.87
142
+
143
+ ## 3.0.0-beta.86
144
+
145
+ ### Patch Changes
146
+
147
+ - @robota-sdk/agent-interface-session@3.0.0-beta.86
148
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.86
149
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.86
150
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.86
151
+ - @robota-sdk/agent-transport@3.0.0-beta.86
152
+
153
+ ## 3.0.0-beta.85
154
+
155
+ ### Patch Changes
156
+
157
+ - Updated dependencies [9a01e78]
158
+ - @robota-sdk/agent-transport@3.0.0-beta.85
159
+ - @robota-sdk/agent-interface-session@3.0.0-beta.85
160
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.85
161
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.85
162
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.85
163
+
164
+ ## 3.0.0-beta.84
165
+
166
+ ### Patch Changes
167
+
168
+ - 9c6a8db: The wire protocol gained several request/reply pairs so a GUI never has to scrape command output for
169
+ data it can read directly.
170
+
171
+ `get-settings`/`update-settings` read and write the Settings screen; a patch applies through the same
172
+ function its matching slash command uses, so the two paths cannot drift. `list-models` returns the
173
+ configured models grouped by provider profile, with the current profile and model. `get-agent-definitions`
174
+ returns the agent switcher's roster and current selection. `project-status`, `project-diff` and
175
+ `project-memory` back the Project panel's git status, one file's diff, and project memory; a host
176
+ without this capability answers `protocol_error` instead of hanging. `rename-session` and
177
+ `delete-session` rename or remove a stored session from the list, current or not, each with its own
178
+ success/failure reply.
179
+
180
+ The `messages` frame gained an optional `display` field — the same history projected into display
181
+ segments (text runs and finished tool calls, diffs included) — and the connection's own `driverId`, so
182
+ a reload, reconnect or resume shows tool rows and tells a co-driver's turns from its own. The `error`
183
+ frame gained optional `code`, `provider`, `retryAfterSeconds` and `model` fields so a renderer can say
184
+ what kind of failure happened (`auth`, `rate_limit`, `model_unavailable`, `network`, `provider`) instead
185
+ of showing only raw text; a session error this classification does not recognize is unchanged.
186
+
187
+ `TCommandSurfaceLocality` names whether a `'remote'`-sourced command is provably on this machine. The
188
+ WebRTC/device-mesh transport now forwards `'remote'` for it (it proves no locality, the same rule
189
+ already applied to pairing), and both the WS and WebRTC transports forward it into the Settings
190
+ read/write path, so a command that refuses a remote surface (installing a plugin) refuses identically
191
+ regardless of which transport carried it.
192
+
193
+ - Updated dependencies [e8d70ac]
194
+ - Updated dependencies [9c6a8db]
195
+ - @robota-sdk/agent-interface-session@3.0.0-beta.84
196
+ - @robota-sdk/agent-transport@3.0.0-beta.84
197
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.84
198
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.84
199
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.84
200
+
201
+ ## 3.0.0-beta.83
202
+
203
+ ### Minor Changes
204
+
205
+ - 28fa8a7: `/devices add` and `/devices join` enrol a new device into your devices.
206
+
207
+ - On a device that holds the signing key, `/devices add` shows a one-time code on the terminal. It
208
+ works once, for five minutes.
209
+ - On the new device, `/devices join [name]` asks for the code on the terminal, creates the device's
210
+ keys, and meets the other device through the signaling relay in
211
+ `transports.webrtc.options.relayUrl`. Both devices need that setting.
212
+ - The new device proves the code over the WebRTC connection's DTLS fingerprints before anything else
213
+ crosses, so a relay in the middle cannot enrol anyone.
214
+ - Both devices then show the same six digits, and both operators compare them and confirm. Someone
215
+ who saw the code cannot choose the digits: the new device commits to its part before it sees the
216
+ existing device's.
217
+ - Only when both operators say yes does the existing device certify the new one and issue a new
218
+ roster. The new device keeps its identity only once the chain it receives verifies.
219
+ - A wrong, expired or already used code is refused. So is a code after a few failed attempts. When
220
+ either operator declines, nothing is issued or kept.
221
+ - The code appears only on the two terminals. It never reaches history, transcripts or the model. A
222
+ code typed as a command argument is refused. Both commands stay user-only and refuse remote
223
+ surfaces.
224
+ - `agent-remote-pairing`: enrollment codes, the enrollment proof, the signed request with its
225
+ commitment, the short authentication string and the frame decoder.
226
+ - `agent-transport-webrtc`: `dialEnrollment` and `listenForEnrollment` provide a data channel bound to
227
+ the negotiated fingerprints.
228
+
229
+ - 963a4e0: Where no direct path joins two of one user's devices, a TURN relay on one of the user's own devices carries the
230
+ connection.
231
+
232
+ - `agent-transport-webrtc` — `TurnServer`, a pure-JavaScript TURN server over UDP (Allocate, Refresh,
233
+ CreatePermission, ChannelBind, Send/Data indications, ChannelData, long-term credentials) with quotas for
234
+ allocations per owner and in all, relayed bytes per second per owner, and allocation lifetime, and an optional
235
+ relayed-port range for a relay behind a NAT. Only what MESSAGE-INTEGRITY covers is read. Requests nobody has
236
+ authenticated are answered at a limited rate (per source and in all) and never with more bytes than they
237
+ carried, and forwarding into private ranges can be turned off (`allowPrivatePeers`). `MeshTurnRelay` runs it
238
+ for the devices of the roster: each pair derives a short-lived credential of its own (`meshRelayCredential`), a
239
+ device the lists drop or revoke can no longer allocate and loses its allocations. `DeviceMeshNode` takes
240
+ `relays` (the relays paired devices advertise, then configured TURN servers, and `relayOnly`) and
241
+ `relayServer`; a connection that needs a relay and has none is refused with `MeshRelayNeededError`, which says
242
+ why a relay was needed and carries the direct attempt's failure. `MeshDht` publishes this device's relay
243
+ endpoints in the sealed hints records (`relayEndpoints`) and reads the peers' (`relayAdverts`). DTLS stays end
244
+ to end; the relay only forwards it.
245
+ - `agent-remote-pairing` — the pair rendezvous derives a `relay-user` tag and `relayPassword`, the relay
246
+ credential's password for one direction and username.
247
+ - `agent-cli` — `transports.mesh.options` takes `relay` (`serve`, `port`, `host`, `publicAddress`, `relayPorts`,
248
+ `allowPrivatePeers`), `turnServers` and `relayOnly`. When the mesh is on, the session's mesh runs the relay,
249
+ advertises it to paired devices only, and uses the fallback order; `/devices` names the relays, and a device
250
+ that needs a relay is reported once with why. Running a relay, or relay-only without TURN servers, needs the
251
+ DHT or pkarr relays, which carry a relay's address to the other devices; a setting that could not work is
252
+ refused, naming it.
253
+
254
+ ### Patch Changes
255
+
256
+ - 6e4c6ee: Device mesh discovery holds up better against endpoints and peers that misbehave.
257
+
258
+ - A direct path's admission deadline starts only from a `hello`, `offer` or `answer`, so ICE candidates
259
+ that trail an admitted connection no longer set a working path aside.
260
+ - An endpoint or signaling carrier that keeps failing is set aside for longer each time it fails
261
+ again, until a connection over it is admitted.
262
+ - An mDNS lookup keeps listening briefly after the first matching answer, so a faster answer from
263
+ another host cannot hide the peer's own.
264
+ - The device lists read from public records are bounded per paired device, each device's newest
265
+ before any device's next, and the chunks of one list carry a shared version, so a read that finds
266
+ chunks of two versions yields no list. Records written before this change are not read as lists.
267
+ - CLI processes that share `$PRODUCT_USER_STATE_DIR/devices/address-cache.json` apply each change to the file as it
268
+ is on disk, so one process no longer overwrites what another learned.
269
+
270
+ - 4241fc5: Device mesh follow-ups.
271
+
272
+ - A device with no identity is pointed to `/devices add` on one of the user's devices and `/devices join`
273
+ here, as well as to `/devices init`. The message says that `init` is for the first device only,
274
+ because it creates a separate identity that can never link to the user's other devices. The `/devices`
275
+ description and the `init` subcommand say the same.
276
+ - An identity created mid-session (`/devices init`, or a successful `/devices join`) opens the mesh
277
+ without a restart when `transports.mesh.enabled` is on.
278
+ - If a session stalls for longer than the mesh lock's stale window (for example while the machine
279
+ sleeps), another session can take the mesh over. The stalled session now notices this on its next
280
+ lock refresh, closes its own mesh, and says why. Two sessions no longer run it together.
281
+ `holdExclusiveFileLock` has a new `onLost` option for this.
282
+ - `/peers` and `/handoff` still list and reach linked mesh devices when local same-host peer discovery
283
+ fails. `/peers` says why sessions on this host are not listed. `ICommandLocalPeersAdapter` has a new
284
+ optional `localDiscoveryOff` field for this.
285
+ - `agent-transport-webrtc`: when lists become newer on a node (reissued, revoked, or adopted from a
286
+ peer), the node sends them over every admitted connection instead of waiting for the next handshake.
287
+ Reissues, revocations and enrolments in the CLI take effect this way at once. A receiver adopts a
288
+ pushed list only if it is newer, issued by this user's signing key, and verifies. The push does not
289
+ depend on the peer's capabilities, and it never reaches the application's message handlers.
290
+
291
+ - 05d5391: The embedded TURN relay says why it cannot listen — the port is taken, the host is not an address of
292
+ this machine, or the port needs privileges — and keeps the bind error as `cause`; the CLI names the
293
+ relay setting that cause asks you to change. Mesh options are no longer checked while
294
+ `transports.mesh.enabled` is off, so a mistake in them does not report that the mesh could not start.
295
+ - 598b180: A WebRTC peer hands out its own ICE candidates only once it holds the remote description, so an answerer can no
296
+ longer reach the offerer while the answer is still being applied and have its certificate refused. A data channel
297
+ closed right after a send no longer loses that send: it reads closed at once and its stream is reset after a
298
+ grace. A LAN probe answered with anything but a valid proof is dropped at once.
299
+ - 57280bf: Every published package now declares `"engines": { "node": ">=22.12.0" }`. Before, 27 of the 38
300
+ packages declared no floor (`agent-core`, `agent-tools` and every provider among them),
301
+ `agent-session` and `agent-file-authority` declared `>=20.19.0`, and the other nine declared
302
+ `>=22.0.0`, so a consumer on Node 20 saw at most a warning from a transitive dependency.
303
+
304
+ Why 22.12: `agent-cli` and `agent-ui-terminal` need Node 22 through `ink` 7, and the CommonJS entries
305
+ of `agent-tools` and its dependents, `agent-transport`/`node` and its dependents, and
306
+ `agent-ui-terminal` `require()` ESM-only dependencies (`p-limit`, `jose`, `chalk`), which Node 22
307
+ supports unflagged only from 22.12. `engines` is advisory unless the consumer enables `engine-strict`.
308
+
309
+ No code changes: `tsdown` now reads `node22.12.0` as its build target from the field.
310
+
311
+ - 18c0d5c: Every published package now exports `./package.json`, so `require('<package>/package.json')` and
312
+ `import('<package>/package.json', { with: { type: 'json' } })` work instead of failing with
313
+ `ERR_PACKAGE_PATH_NOT_EXPORTED`, and each tarball now ships the package's `CHANGELOG.md`.
314
+ - Updated dependencies [724fabb]
315
+ - Updated dependencies [d877de2]
316
+ - Updated dependencies [d61e159]
317
+ - Updated dependencies [bfe8ed5]
318
+ - Updated dependencies [28fa8a7]
319
+ - Updated dependencies [963a4e0]
320
+ - Updated dependencies [7b72344]
321
+ - Updated dependencies [6ae3f28]
322
+ - Updated dependencies [57f57f5]
323
+ - Updated dependencies [ba822c1]
324
+ - Updated dependencies [6e6b06b]
325
+ - Updated dependencies [57280bf]
326
+ - Updated dependencies [18c0d5c]
327
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.83
328
+ - @robota-sdk/agent-transport@3.0.0-beta.83
329
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.83
330
+ - @robota-sdk/agent-interface-session@3.0.0-beta.83
331
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.83
332
+
333
+ ## 3.0.0-beta.82
334
+
335
+ ### Minor Changes
336
+
337
+ - e15e22b: Two of one user's devices can connect to each other over WebRTC, admitted by the device handshake.
338
+
339
+ - `agent-transport-webrtc` — `DeviceMeshNode` keeps one connection per device pair, in either role: the
340
+ device with the lower id offers and the other answers, so concurrent attempts resolve by rule. Both
341
+ roles bind the handshake to the certificate the DTLS layer verified and take one remote description
342
+ with exactly one fingerprint; before admission only handshake frames cross, and a connection counts
343
+ as admitted only once both sides admitted each other. Each connection gets its own DTLS certificate
344
+ (`createDtlsKeys`). A new attempt never displaces an admitted connection until it is admitted
345
+ itself, and attempts per pair are paced. Lists adopted in a handshake, or handed over through
346
+ `refresh`, apply at once, and a device they revoke loses its connection. Signaling runs through
347
+ `IMeshRelay`: `WsMeshRelayClient` for the self-hosted relay's `presence` / `message` frames
348
+ (topics capped per source and relay-wide), `createInMemoryMeshRelayHub` for tests.
349
+ - `agent-remote-pairing` — the pair's two relay inbox topics, one per direction, come from their
350
+ pairwise secret (`derivePairRendezvous(...).relayInbox()`).
351
+ - `agent-cli` — a device holding the signing key reissues its roster and revocation list before they
352
+ expire while an interactive session runs. The host can open this device's mesh endpoint from the
353
+ identity under `$PRODUCT_USER_STATE_DIR/devices`, saving newer lists a peer hands over; no command starts it yet.
354
+ - `agent-command` — `/devices add|join` still reports that enrolment is not available yet.
355
+
356
+ - e15e22b: The Node WebRTC transport runs on `node-datachannel` (libdatachannel, DTLS by OpenSSL). The DTLS stack
357
+ verifies handshake signatures, so a channel binding names the party that holds the certificate's key.
358
+ It is an optional dependency with a prebuilt binary per platform; where it cannot load, the WebRTC
359
+ transport reports itself unavailable instead of falling back to another implementation.
360
+
361
+ - `agent-transport-webrtc` — `RtcPeer` / `RtcChannel` wrap one connection; `loadDataChannel` replaces
362
+ `loadWerift` (and the `loadWerift` option becomes `loadDataChannel`). Every connection has its own DTLS
363
+ certificate, no ICE server is contacted unless configured, and `werift` is no longer a peer dependency.
364
+ A pairing peer that finishes the handshake first and speaks at once no longer has that frame dropped: it
365
+ is held until this side accepts, and discarded if it does not.
366
+ - `agent-cli` — depends on `node-datachannel` (optional) instead of `werift`.
367
+
368
+ - c7f9203: Connected sessions can send each other files.
369
+
370
+ - `/peers send-file <session-id> <path>` sends a copy of any file the operator can read to another
371
+ live session on this host.
372
+ - The model sends a file only through the `peer_send_file` tool. Every call asks the user, showing
373
+ the path, size, hash and destination; no permission mode, rule or remembered consent answers it.
374
+ The tool reaches only files inside the workspace whose path does not look like it holds secrets
375
+ (`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
376
+ - The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
377
+ under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
378
+ The conversation is told only its name, size and sha256. A name that leaves that directory is
379
+ refused, a symbolic link is never written through, and nothing is overwritten.
380
+ - Transfers travel on a channel of their own (a separate connection on this host, a separate data
381
+ channel between devices), in chunks the receiver paces, up to 32 MiB, and are kept only when the
382
+ whole content matches the offered sha256. A transfer that ends early is discarded; there is no
383
+ resume.
384
+
385
+ **API**
386
+
387
+ - `agent-interface-session-mobility`: the `file` capability, which asks the operator for every
388
+ request; `ConnectionAuthority.authorizeFile`; `IFileOffer` and `IFileFrameChannel`.
389
+ - `agent-transport/node`: `sendFileOverChannel` and `receiveFileOverChannel`, the carrier over any
390
+ `IFileFrameChannel`; `DEFAULT_MAX_FILE_BYTES`.
391
+ - `agent-transport-webrtc`: `IDeviceMeshLink.openFileChannel` and `onFileChannel`.
392
+ - `agent-remote-pairing`: `file` joins `DEVICE_CAPABILITIES`. A device certificate that names it is
393
+ refused as malformed by an earlier version.
394
+ - `agent-core`: `IToolPermissionProfile.notInPeerTurn` withholds a tool from a turn a peer's message
395
+ started.
396
+ - `agent-framework`: `ICommandLocalPeersAdapter.prepareFile`.
397
+
398
+ - 004fe7f: `/handoff` moves a session over a real connection.
399
+
400
+ - `/handoff <session-id>` pushes this conversation to another Robota session on this machine. The
401
+ same carrier also runs between two of the user's devices over their mesh connection; no command
402
+ opens that connection yet.
403
+ - A hand-off is push-only: only the operator of the session that holds it starts one. A session or
404
+ device that asks another for its session is refused.
405
+ - The source signs a grant for that one transfer over that one channel with its device key, so a
406
+ hand-off needs the device identity from `/devices init`. The receiving side checks it against the
407
+ sender's certificate, then asks its own operator; without a yes nothing is sent.
408
+ - The session travels on the file-transfer carrier, is kept aside until it matches the manifest, and
409
+ is saved without being started. The operator there resumes it with `robota --resume <id>`.
410
+ - The source gives the session up, and ends, only once the receiving side confirms it saved it.
411
+ Every other outcome leaves the session where it was; if the confirmation is lost, `/handoff` to the
412
+ same session again resends the same transfer, which the receiver settles without saving it twice.
413
+ Peer attribution (`driverId`, `turnSource`)
414
+ travels with it.
415
+ - `/handoff` stays user-only. Its description tells the model to suggest the command to the user.
416
+ - `agent-transport-webrtc`: an admitted mesh link exposes the DTLS fingerprints it is bound to, and
417
+ `judgeHandoffGrant` is exported.
418
+ - `agent-interface-session-mobility`: a hand-off carrier may move the sealed payload whole
419
+ (`sendPayload`), the destination verifies it with `receivePayload`, and the source can report its
420
+ open transfer (`status`) and abandon it for any refusal the destination names.
421
+
422
+ - 189c21e: The device mesh can find and signal a peer device beyond the local network, through public
423
+ infrastructure that sees only signed ciphertext.
424
+
425
+ - **Rendezvous records (BEP 44):** each device publishes, per peer, its connection hints and the newest
426
+ device revocation lists it holds as mutable items on the BitTorrent Mainline DHT (`bittorrent-dht`,
427
+ directly over UDP), or through pkarr relays (`createPkarrRelayStore`, for clients that cannot reach
428
+ the DHT). Every record is signed by a one-time key of the pair, direction, epoch and purpose, stored
429
+ under a rotating salt, AEAD-sealed and padded to a fixed size; publish times are jittered per pair.
430
+ Lookups read the peer's records at the current and adjacent epochs and reject anything that does not
431
+ verify or open for the pair. Lists too large for one record are split into fixed-size chunks.
432
+ `MeshDht` is the candidate source and publisher, and its `latestLists` feeds the freshness lookup
433
+ before a remote admission with every list candidate found, newest first.
434
+ - **Nostr signaling:** `NostrMeshRelay` carries live SDP/ICE as ephemeral events on several relays,
435
+ under per-epoch, per-direction keys and kinds, with our own AEAD over the payload and no tags.
436
+ - **Order:** `DiscoveringMeshRelay` tries the address cache, mDNS, then DHT records for candidates,
437
+ and when none answers the signaling carriers in order — Nostr, then the self-hosted relay. A
438
+ carrier that carries no admission in time is set aside for the next one.
439
+ - **Defaults:** `DEFAULT_NOSTR_RELAYS` and `DEFAULT_PKARR_RELAYS` list well-known relays of several
440
+ operators; `transports.mesh.options` (`dht`, `pkarrRelays`, `nostrRelays`) replaces them, parsed by
441
+ the CLI's `parseMeshInternetSettings`, and `openDeviceMesh` takes them as `internet`. No command
442
+ starts the mesh yet.
443
+ - `agent-remote-pairing`: `signingSeed`, `sealRecord` and `openRecord` take a record purpose
444
+ (`hints`, the default and unchanged; `revocation`; `signal`), and two tag purposes are added. The
445
+ device handshake's `fetchLatestLists` may return several candidates per list kind; each is verified
446
+ and the newest that verifies counts, so a forged "newer" list cannot hide a real one.
447
+ - `agent-cli` declares the mesh's runtime dependencies (`bittorrent-dht`, `nostr-tools`,
448
+ `multicast-dns`), which its bundle leaves external.
449
+
450
+ **Breaking (pre-release, hence minor):** `IDiscoveringMeshRelayOptions.advertiser` becomes
451
+ `advertisers` (a list).
452
+
453
+ - 5e924ee: Two of one user's devices can find each other on the local network before the relay.
454
+
455
+ - `agent-remote-pairing` — `derivePairRendezvous` derives every place a device pair meets from their
456
+ pairwise secret, separated by direction: rotating tags (hourly epochs, looked up one epoch either
457
+ way), the seed of each epoch's one-time signing key, sealed connection-hint records, and the relay
458
+ inbox topics. It takes the lists in force and refuses a device they do not name with the same
459
+ key-agreement key, or revoke, so a rotated or revoked key stops deriving.
460
+ - `agent-transport-webrtc` — `startLanMeshRelay` / `DiscoveringMeshRelay` look for a peer in the
461
+ address cache, then with mDNS (`MeshMdns`, over `multicast-dns`), then on the self-hosted relay, and
462
+ carry signals to the peer's direct endpoint (`startMeshLanListener`) on rotating pairwise topics,
463
+ sent only as hashes. An endpoint must prove it holds the pair's topic before it carries signals,
464
+ and is set aside when no admission follows. The mDNS announcement names no product, device or
465
+ host, pads its instance count with names that hold for the epoch, and answers queries at a bounded
466
+ rate. Discovery yields candidates only: admission is still the device handshake, and an address is
467
+ remembered only after an admission it carried.
468
+ - `agent-cli` — the device mesh endpoint can look on the local network (`lan` option), remembering
469
+ the addresses that worked in an owner-only `$PRODUCT_USER_STATE_DIR/devices/address-cache.json`; no command starts
470
+ it yet.
471
+
472
+ ### Patch Changes
473
+
474
+ - Updated dependencies [e15e22b]
475
+ - Updated dependencies [e15e22b]
476
+ - Updated dependencies [c7f9203]
477
+ - Updated dependencies [004fe7f]
478
+ - Updated dependencies [189c21e]
479
+ - Updated dependencies [5e924ee]
480
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.82
481
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.82
482
+ - @robota-sdk/agent-transport@3.0.0-beta.82
483
+ - @robota-sdk/agent-interface-session@3.0.0-beta.82
484
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.82
485
+
486
+ ## 3.0.0-beta.81
487
+
488
+ ### Minor Changes
489
+
490
+ - 007fd90: Authority per connection: pairing stays with the local operator, and driving needs the operator's yes.
491
+
492
+ - `agent-interface-session-mobility` — `ConnectionAuthority` decides what one connection may do.
493
+ `presence` and `message` are allowed; `delegate` and `handoff` ask the receiving operator for every
494
+ request; `observe` and `drive` ask once per connection. With no `IOperatorApprover` the answer is
495
+ no. `authorizeDelegation` turns an approved task into a peer turn from where admission placed the
496
+ peer, ignoring anything else on the request, so the receiver's policy decides what it may do.
497
+ - `agent-transport-webrtc` — `connectionApproval` asks the operator before a connection reaches the
498
+ session, after every proof has run. Frames the peer sends meanwhile are held (bounded) and delivered
499
+ only after a yes. A channel that closes first withdraws the question (the approval context carries
500
+ an `AbortSignal`), and a later answer admits nothing. A first-pairing device is pinned for
501
+ reconnect only once it is admitted.
502
+ - `agent-command` — `/remote-control enable` and `revoke` from a connected surface are refused, and
503
+ `status` never shows a connected surface the pairing link.
504
+ - `agent-framework` — the `remote-control-enable` host action runs only for the operator's own
505
+ command, whichever command asked for it.
506
+ - `agent-cli` — every remote-control connection, a returning trusted device included, is put to the
507
+ operator on the host terminal; without an interactive terminal it is refused.
508
+
509
+ ### Patch Changes
510
+
511
+ - Updated dependencies [3038eb7]
512
+ - Updated dependencies [b2e0afe]
513
+ - Updated dependencies [44fc732]
514
+ - Updated dependencies [007fd90]
515
+ - @robota-sdk/agent-interface-session@3.0.0-beta.81
516
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.81
517
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.81
518
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.81
519
+ - @robota-sdk/agent-transport@3.0.0-beta.81
520
+
521
+ ## 3.0.0-beta.80
522
+
523
+ ### Major Changes
524
+
525
+ - e82215f: **ARCH-011: replace the ambiguous transport lifecycle stub with executable conformance.**
526
+
527
+ `ITransportAdapter` now requires a frozen `service | runner` lifecycle descriptor. `start()` resolves
528
+ at the concrete transport's documented readiness boundary; start before attach and repeated active
529
+ start reject a stable lifecycle error, repeated stop is safe, and stopped adapters can reattach and
530
+ restart.
531
+
532
+ Runner adapters launch separately and expose a typed terminal outcome through
533
+ `waitForCompletion()`. The registry accepts base adapters, rejects duplicate names, keeps
534
+ configuration as an optional capability, returns complete ordered records whose pending slots become
535
+ registry-owned `abandoned` outcomes on stop/rollback, and exposes a real-runner-only first-failure
536
+ wait. It serializes startup/stop, rejects active restart before mutation, and reverses partial startup
537
+ from the currently failing adapter with typed safe rollback details. Runtime host and serve mode
538
+ propagate real nonzero runner results without treating normal shutdown abandonment as failure.
539
+
540
+ HTTP, MCP, both WebSocket adapters, WebRTC, and headless invoke one shared public conformance kit.
541
+ The former `TuiTransport` export is removed because it ignored the attached session; use `renderApp`
542
+ or `TuiInteractionChannel`, which honestly own their session lifecycle.
543
+
544
+ ### Minor Changes
545
+
546
+ - 9db63ee: Add named session capability roles and explicit capability-host queries while preserving the legacy
547
+ `IInteractiveSession` interface shape. HTTP, MCP, protocol, WS, WebRTC, and headless transports now
548
+ declare only the session roles they consume, and the direct aggregate-cast floor is zero.
549
+ - 2ebff01: Emit the complete persisted checkpoint and branch lifecycle, forward plan, context-refresh, and
550
+ branch events through protocol transports, and render deterministic bounded notices in the TUI.
551
+ Transport-owned delivery failures now enter the owning carrier cleanup lifecycle without reversing
552
+ an already-committed session operation.
553
+ - 94cc355: REMOTE-002 Stage A: extract the transport-neutral session bridge + wire protocol into a new
554
+ `@robota-sdk/agent-transport-protocol` package (`createWsHandler`, `TClientMessage`/`TServerMessage`); repoint
555
+ `agent-transport-ws` and `agent-web-ui` at it (no pass-through re-export). Add a new
556
+ `@robota-sdk/agent-transport-webrtc` package: a `WebRtcTransport` (`IConfigurableTransport`, `defaultEnabled:false`)
557
+ that carries an `IInteractiveSession` over an `RTCDataChannel` reusing the shared handler, with a lazily-loaded
558
+ optional `werift` peer dependency that throws an explicit "WebRTC transport unavailable" error on absence (never a
559
+ silent no-op). No user-facing enable path and no auth in Stage A (that lands in Stage B); the transport is proven
560
+ by an in-process loopback data-channel round-trip only.
561
+
562
+ (Bump target corrected during REL-023 triage: `@robota-sdk/agent-web-ui` was dissolved by GUI-006 (#1141, 2026-07-12) before this work was ever published; its protocol-consumer role now lives in `@robota-sdk/agent-transport-webrtc-web`.)
563
+
564
+ - 2c69a3f: REMOTE-004 Stage B2: production WebRTC signaling + relay abuse-hardening (still no user-facing enable path).
565
+
566
+ - Add `WsSignalingClient` — a production `ISignalingClient` over a `ws` socket to the `@robota-sdk/remote-signaling`
567
+ relay (Node host-side): joins a rendezvous, buffers signals produced before the socket opens and flushes them,
568
+ and surfaces relay/socket errors through an explicit `onError` (no silent degrade). An `onReady` callback fires
569
+ once the rendezvous join is confirmed.
570
+ - Expose opt-in `forceTurn` on `IWebRtcTransportOptions` (relay-only ICE) as defense-in-depth.
571
+ - The private `@robota-sdk/remote-signaling` relay is hardened in-layer (safe by default): a per-source
572
+ token-bucket bounds join floods, rendezvous ids are single-use (a distinct third peer is refused for the id's
573
+ lifetime, even after one of the pair leaves), a half-open rendezvous expires after a TTL, and concurrent
574
+ rendezvous are capped — all with injected clock/scheduler for deterministic tests.
575
+ - `CVE-2024-29415` (werift-transitive `ip` SSRF) is discharged as a reviewed re-accept: werift never calls the
576
+ vulnerable `ip.isPublic`/`isPrivate`/`address` (verified + guarded by a regression test), so the
577
+ `ignoreCves` entry is retained with a documented non-reachability rationale.
578
+
579
+ - 92bf33e: Add the pairing gate to the WebRTC transport (REMOTE-008 Step 1, security milestone). When a pairing
580
+ `secret` is configured, the data channel is phase-separated: pre-accept it carries only pairing frames
581
+ (routed to the directional-HMAC handshake bound to the DTLS fingerprints; any non-pairing frame is
582
+ dropped), and only after the handshake accepts is the session bridge built — fail closed on
583
+ mismatch/timeout (channel closed, session never exposed). Without a `secret` the channel is exposed
584
+ immediately, unchanged. Introduces a dependency on the zero-dep `@robota-sdk/agent-remote-pairing` leaf
585
+ (the gate must live where the SDP fingerprints and channel frames are visible).
586
+ - 9f602df: Add user-supplied TURN fallback for remote control (REMOTE-010 / Stage E1) so P2P works behind symmetric
587
+ NAT / restrictive firewalls. The host reads + validates `transports.webrtc.options.iceServers`/`forceTurn`
588
+ at the agent-cli composition root (a fail-closed validator narrowing the untyped value → `IIceServer[]`;
589
+ `IWebRtcTransportOptions.iceServers` widened to carry TURN `username`/`credential`), and the browser reads a
590
+ validated `ice`/`forceTurn` pairing-URL query param (fail-closed decoder for the attacker-influenceable value;
591
+ `forceTurn` → `iceTransportPolicy: 'relay'`) — both threaded into their `RTCPeerConnection`. `forceTurn` without
592
+ a TURN server fails closed (else ICE gathers no candidates and silently never connects). Absent ICE config ⇒
593
+ host-candidate-only, unchanged.
594
+
595
+ (Bump target corrected during REL-023 triage: `@robota-sdk/agent-web-ui` was dissolved by GUI-006 (#1141, 2026-07-12) before this work was ever published; the browser-side ICE/`forceTurn` handling described here now lives in `@robota-sdk/agent-transport-webrtc-web`.)
596
+
597
+ ### Patch Changes
598
+
599
+ - 235da81: **BREAKING — ARCH-030: `createWsHandler` takes the carrier's delivery boundary, not a raw `send`.**
600
+
601
+ `createWsHandler` had two outbound semantics on one connection. The session-event fan-out went through
602
+ a guard that reported carrier failures through `onDeliveryError`; every reply to an inbound frame got
603
+ the raw `send`. Eleven reply families were unguarded — five resolving from a Promise continuation, so a
604
+ reply landing after a disconnect escaped as an **unhandled rejection** while the carrier's cleanup was
605
+ never notified, and six synchronous ones that threw into the carrier's inbound listener instead.
606
+
607
+ `IWsHandlerOptions` now takes a single `deliver: TOutboundDeliver` in place of `send` and
608
+ `onDeliveryError`. **The carrier builds the boundary** from its own sink and its own failure policy and
609
+ passes it down — not the reverse, because a protocol layer handed a raw sink so it can hand a wrapper
610
+ back leaves the raw sink reachable, which is how the twelfth reply family gets added unguarded.
611
+
612
+ ```ts
613
+ // before
614
+ const { onMessage, cleanup } = createWsHandler({
615
+ session,
616
+ send: (msg) => ws.send(JSON.stringify(msg)),
617
+ onDeliveryError: (error) => ws.close(1011, error.message),
618
+ });
619
+
620
+ // after
621
+ const deliver = createOutboundDelivery(
622
+ (msg) => ws.send(JSON.stringify(msg)),
623
+ (error) => ws.close(1011, error.message),
624
+ );
625
+ const { onMessage, cleanup } = createWsHandler({ session, deliver });
626
+ ```
627
+
628
+ `TOutboundDeliver` is branded and `createOutboundDelivery` is its only producer, so a plain
629
+ `(message: TServerMessage) => void` is refused by the compiler wherever a boundary is required.
630
+
631
+ **The boundary latches:** it reports at most one delivery failure per connection, after which frames are
632
+ dropped without a further report. All three carriers already treated a delivery failure as terminal and
633
+ each had grown its own latch; it belongs upstream of all three. `SessionResumeBridge` builds a fresh
634
+ boundary per `attach`, which is what un-latches the session after a reconnect, and buffers a frame
635
+ before the boundary so a dropped one still replays.
636
+
637
+ **`ISubscribeSessionEventsOptions` is no longer exported** from the package barrel. It is the options bag
638
+ of `subscribeSessionEvents`, which is package-internal, and it was already absent from the SPEC's public
639
+ API table. Its `onDeliveryError` member is gone regardless — carrier-failure containment is the
640
+ boundary's job now.
641
+
642
+ `agent-transport-ws` and `agent-transport-webrtc` are `patch`: `WsSessionDelivery` (whose raw `send` is
643
+ now private, with `deliver` the only public sink) and `PairingGate` are not on their packages' barrels,
644
+ and every barrel export of both packages keeps its signature.
645
+
646
+ - 4f3c075: Assemble complete, verified package generations before switching build output; preserve the previous generation on build failure and pack only verified regular-file images. Include copied CLI web assets in affected-build ordering and artifact transfer. Preserve the CLI version in managed build paths. Public runtime contracts remain compatible (patch).
647
+ - 2db1b97: Remote-control pairing binds to the negotiated DTLS certificate.
648
+
649
+ - The Node host reads the remote fingerprint from the certificate the DTLS layer verified, not from the answer's
650
+ SDP text, and builds the pairing gate once the DTLS handshake completes.
651
+ - An SDP must advertise exactly one DTLS fingerprint. `extractDtlsFingerprint` now throws when two different
652
+ fingerprints are present, and `extractDtlsFingerprintAttribute` returns the algorithm with the value.
653
+ - A start takes one answer (host) and a connection takes one offer (browser client); a later description is
654
+ ignored.
655
+
656
+ - Updated dependencies [37b4bd7]
657
+ - Updated dependencies [50d2c9f]
658
+ - Updated dependencies [a5961c9]
659
+ - Updated dependencies [4dd45cc]
660
+ - Updated dependencies [040f31f]
661
+ - Updated dependencies [4c5148e]
662
+ - Updated dependencies [0116a29]
663
+ - Updated dependencies [e82215f]
664
+ - Updated dependencies [52b7346]
665
+ - Updated dependencies [9db63ee]
666
+ - Updated dependencies [b078afa]
667
+ - Updated dependencies [2ebff01]
668
+ - Updated dependencies [9db63ee]
669
+ - Updated dependencies [2ebff01]
670
+ - Updated dependencies [4772067]
671
+ - Updated dependencies [0f98419]
672
+ - Updated dependencies [64ba748]
673
+ - Updated dependencies [d312755]
674
+ - Updated dependencies [3244fb8]
675
+ - Updated dependencies [1e3f91a]
676
+ - Updated dependencies [4f3c075]
677
+ - Updated dependencies [1e40b5b]
678
+ - Updated dependencies [7669851]
679
+ - Updated dependencies [4b76cfa]
680
+ - Updated dependencies [2db1b97]
681
+ - Updated dependencies [07b627f]
682
+ - Updated dependencies [1f45110]
683
+ - Updated dependencies [9665c6e]
684
+ - Updated dependencies [44393be]
685
+ - Updated dependencies [c7fa299]
686
+ - Updated dependencies [5134b3b]
687
+ - Updated dependencies [833afe1]
688
+ - Updated dependencies [5c5ff23]
689
+ - Updated dependencies [9814afc]
690
+ - @robota-sdk/agent-interface-session@3.0.0-beta.80
691
+ - @robota-sdk/agent-interface-transport@3.0.0-beta.80
692
+ - @robota-sdk/agent-transport@3.0.0-beta.80
693
+ - @robota-sdk/agent-interface-session-mobility@3.0.0-beta.80
694
+ - @robota-sdk/agent-remote-pairing@3.0.0-beta.80