@tt-a1i/hive 1.7.0 → 2.0.2

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 (251) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.en.md +73 -11
  3. package/README.md +41 -8
  4. package/dist/src/cli/hive-remote.d.ts +46 -0
  5. package/dist/src/cli/hive-remote.js +257 -0
  6. package/dist/src/cli/hive-update.js +7 -2
  7. package/dist/src/cli/hive.d.ts +6 -0
  8. package/dist/src/cli/hive.js +64 -0
  9. package/dist/src/cli/team.d.ts +22 -0
  10. package/dist/src/cli/team.js +255 -5
  11. package/dist/src/server/agent-command-resolver.js +10 -3
  12. package/dist/src/server/agent-exit-classification.d.ts +6 -0
  13. package/dist/src/server/agent-exit-classification.js +6 -0
  14. package/dist/src/server/agent-manager-support.d.ts +2 -1
  15. package/dist/src/server/agent-manager-support.js +59 -15
  16. package/dist/src/server/agent-manager.d.ts +3 -0
  17. package/dist/src/server/agent-manager.js +22 -7
  18. package/dist/src/server/agent-run-bootstrap.d.ts +14 -0
  19. package/dist/src/server/agent-run-bootstrap.js +11 -4
  20. package/dist/src/server/agent-run-exit-handler.js +14 -8
  21. package/dist/src/server/agent-run-starter.d.ts +3 -1
  22. package/dist/src/server/agent-run-starter.js +22 -5
  23. package/dist/src/server/agent-run-sync.js +13 -5
  24. package/dist/src/server/agent-runtime-types.d.ts +1 -0
  25. package/dist/src/server/agent-runtime.d.ts +2 -1
  26. package/dist/src/server/agent-runtime.js +9 -2
  27. package/dist/src/server/agent-startup-instructions.d.ts +2 -1
  28. package/dist/src/server/agent-startup-instructions.js +8 -4
  29. package/dist/src/server/agent-stdin-dispatcher.d.ts +4 -2
  30. package/dist/src/server/agent-stdin-dispatcher.js +35 -3
  31. package/dist/src/server/command-preset-defaults.d.ts +6 -1
  32. package/dist/src/server/command-preset-defaults.js +56 -0
  33. package/dist/src/server/fs-browse.d.ts +2 -0
  34. package/dist/src/server/fs-browse.js +165 -31
  35. package/dist/src/server/fs-pick-folder.js +6 -69
  36. package/dist/src/server/fs-sandbox.d.ts +5 -3
  37. package/dist/src/server/fs-sandbox.js +5 -3
  38. package/dist/src/server/hive-team-guidance.js +18 -6
  39. package/dist/src/server/machine-name.d.ts +2 -0
  40. package/dist/src/server/machine-name.js +13 -0
  41. package/dist/src/server/open-target-commands.d.ts +1 -0
  42. package/dist/src/server/open-target-commands.js +4 -1
  43. package/dist/src/server/orchestrator-autostart.js +1 -1
  44. package/dist/src/server/platform-path.d.ts +1 -0
  45. package/dist/src/server/platform-path.js +14 -1
  46. package/dist/src/server/post-start-input-writer.js +50 -13
  47. package/dist/src/server/preset-launch-support.js +1 -0
  48. package/dist/src/server/recovery-summary.d.ts +2 -1
  49. package/dist/src/server/recovery-summary.js +2 -1
  50. package/dist/src/server/remote-audit-store.d.ts +51 -0
  51. package/dist/src/server/remote-audit-store.js +108 -0
  52. package/dist/src/server/remote-config-keys.d.ts +17 -0
  53. package/dist/src/server/remote-config-keys.js +27 -0
  54. package/dist/src/server/remote-control-constants.d.ts +30 -0
  55. package/dist/src/server/remote-control-constants.js +29 -0
  56. package/dist/src/server/remote-device-session.d.ts +40 -0
  57. package/dist/src/server/remote-device-session.js +22 -0
  58. package/dist/src/server/remote-device-store.d.ts +36 -0
  59. package/dist/src/server/remote-device-store.js +67 -0
  60. package/dist/src/server/remote-frame-bridge.d.ts +102 -0
  61. package/dist/src/server/remote-frame-bridge.js +791 -0
  62. package/dist/src/server/remote-gateway-client.d.ts +14 -0
  63. package/dist/src/server/remote-gateway-client.js +36 -0
  64. package/dist/src/server/remote-loopback-auth.d.ts +6 -0
  65. package/dist/src/server/remote-loopback-auth.js +112 -0
  66. package/dist/src/server/remote-pairing-tunnel.d.ts +59 -0
  67. package/dist/src/server/remote-pairing-tunnel.js +146 -0
  68. package/dist/src/server/remote-pairing.d.ts +58 -0
  69. package/dist/src/server/remote-pairing.js +237 -0
  70. package/dist/src/server/remote-tunnel.d.ts +113 -0
  71. package/dist/src/server/remote-tunnel.js +514 -0
  72. package/dist/src/server/restart-policy-support.d.ts +4 -1
  73. package/dist/src/server/restart-policy-support.js +3 -1
  74. package/dist/src/server/restart-policy.d.ts +1 -1
  75. package/dist/src/server/restart-policy.js +19 -3
  76. package/dist/src/server/route-types.d.ts +1 -1
  77. package/dist/src/server/routes-dispatches.js +1 -1
  78. package/dist/src/server/routes-fs.js +3 -3
  79. package/dist/src/server/routes-marketplace.js +2 -2
  80. package/dist/src/server/routes-open-workspace.js +1 -1
  81. package/dist/src/server/routes-remote.d.ts +2 -0
  82. package/dist/src/server/routes-remote.js +166 -0
  83. package/dist/src/server/routes-runtime.js +6 -6
  84. package/dist/src/server/routes-settings.js +16 -16
  85. package/dist/src/server/routes-tasks.js +2 -2
  86. package/dist/src/server/routes-team-memory.d.ts +2 -0
  87. package/dist/src/server/routes-team-memory.js +154 -0
  88. package/dist/src/server/routes-team-recall.d.ts +2 -0
  89. package/dist/src/server/routes-team-recall.js +119 -0
  90. package/dist/src/server/routes-team.js +31 -9
  91. package/dist/src/server/routes-ui.js +11 -1
  92. package/dist/src/server/routes-workflow-schedules.js +3 -3
  93. package/dist/src/server/routes-workflows.js +5 -5
  94. package/dist/src/server/routes-workspace-memory-dreams.d.ts +2 -0
  95. package/dist/src/server/routes-workspace-memory-dreams.js +105 -0
  96. package/dist/src/server/routes-workspace-memory.d.ts +2 -0
  97. package/dist/src/server/routes-workspace-memory.js +215 -0
  98. package/dist/src/server/routes-workspaces.js +9 -9
  99. package/dist/src/server/routes.js +10 -0
  100. package/dist/src/server/runtime-database.d.ts +1 -0
  101. package/dist/src/server/runtime-database.js +27 -2
  102. package/dist/src/server/runtime-restart-policy.d.ts +3 -1
  103. package/dist/src/server/runtime-restart-policy.js +2 -1
  104. package/dist/src/server/runtime-store-contract.d.ts +37 -0
  105. package/dist/src/server/runtime-store-dream.d.ts +23 -0
  106. package/dist/src/server/runtime-store-dream.js +16 -0
  107. package/dist/src/server/runtime-store-helpers.d.ts +20 -0
  108. package/dist/src/server/runtime-store-helpers.js +81 -7
  109. package/dist/src/server/runtime-store-memory.d.ts +33 -0
  110. package/dist/src/server/runtime-store-memory.js +37 -0
  111. package/dist/src/server/runtime-store-remote.d.ts +5 -0
  112. package/dist/src/server/runtime-store-remote.js +45 -0
  113. package/dist/src/server/runtime-store-workflows.js +2 -0
  114. package/dist/src/server/runtime-store.js +14 -3
  115. package/dist/src/server/session-capture-claude.d.ts +1 -1
  116. package/dist/src/server/session-capture-claude.js +7 -4
  117. package/dist/src/server/session-capture-codex.js +4 -5
  118. package/dist/src/server/session-capture-gemini.js +4 -5
  119. package/dist/src/server/session-capture-opencode.d.ts +4 -4
  120. package/dist/src/server/session-capture-opencode.js +20 -12
  121. package/dist/src/server/session-capture-qwen.d.ts +5 -0
  122. package/dist/src/server/session-capture-qwen.js +104 -0
  123. package/dist/src/server/session-capture.d.ts +17 -0
  124. package/dist/src/server/session-capture.js +16 -0
  125. package/dist/src/server/sqlite-schema-v23.d.ts +2 -0
  126. package/dist/src/server/sqlite-schema-v23.js +43 -0
  127. package/dist/src/server/sqlite-schema-v24.d.ts +2 -0
  128. package/dist/src/server/sqlite-schema-v24.js +34 -0
  129. package/dist/src/server/sqlite-schema-v25.d.ts +2 -0
  130. package/dist/src/server/sqlite-schema-v25.js +127 -0
  131. package/dist/src/server/sqlite-schema-v26.d.ts +2 -0
  132. package/dist/src/server/sqlite-schema-v26.js +56 -0
  133. package/dist/src/server/sqlite-schema-v27.d.ts +6 -0
  134. package/dist/src/server/sqlite-schema-v27.js +92 -0
  135. package/dist/src/server/sqlite-schema-v28.d.ts +2 -0
  136. package/dist/src/server/sqlite-schema-v28.js +19 -0
  137. package/dist/src/server/sqlite-schema-v29.d.ts +2 -0
  138. package/dist/src/server/sqlite-schema-v29.js +27 -0
  139. package/dist/src/server/sqlite-schema-v30.d.ts +2 -0
  140. package/dist/src/server/sqlite-schema-v30.js +27 -0
  141. package/dist/src/server/sqlite-schema-v31.d.ts +2 -0
  142. package/dist/src/server/sqlite-schema-v31.js +30 -0
  143. package/dist/src/server/sqlite-schema.d.ts +1 -1
  144. package/dist/src/server/sqlite-schema.js +49 -1
  145. package/dist/src/server/startup-command-parser.js +5 -1
  146. package/dist/src/server/tasks-file-watcher.d.ts +2 -0
  147. package/dist/src/server/tasks-file-watcher.js +15 -6
  148. package/dist/src/server/tasks-file.js +30 -5
  149. package/dist/src/server/tasks-websocket-server.js +4 -0
  150. package/dist/src/server/team-authz.d.ts +1 -1
  151. package/dist/src/server/team-authz.js +13 -1
  152. package/dist/src/server/team-list-enrichment.js +3 -1
  153. package/dist/src/server/team-memory-digest.d.ts +52 -0
  154. package/dist/src/server/team-memory-digest.js +200 -0
  155. package/dist/src/server/team-memory-dream-applier.d.ts +5 -0
  156. package/dist/src/server/team-memory-dream-applier.js +234 -0
  157. package/dist/src/server/team-memory-dream-http-serializers.d.ts +13 -0
  158. package/dist/src/server/team-memory-dream-http-serializers.js +12 -0
  159. package/dist/src/server/team-memory-dream-ops.d.ts +40 -0
  160. package/dist/src/server/team-memory-dream-ops.js +153 -0
  161. package/dist/src/server/team-memory-dream-reverter.d.ts +22 -0
  162. package/dist/src/server/team-memory-dream-reverter.js +221 -0
  163. package/dist/src/server/team-memory-dream-run-store.d.ts +23 -0
  164. package/dist/src/server/team-memory-dream-run-store.js +211 -0
  165. package/dist/src/server/team-memory-dream-runner.d.ts +37 -0
  166. package/dist/src/server/team-memory-dream-runner.js +178 -0
  167. package/dist/src/server/team-memory-dream-scheduler.d.ts +32 -0
  168. package/dist/src/server/team-memory-dream-scheduler.js +115 -0
  169. package/dist/src/server/team-memory-dream-store.d.ts +19 -0
  170. package/dist/src/server/team-memory-dream-store.js +16 -0
  171. package/dist/src/server/team-memory-dream-types.d.ts +104 -0
  172. package/dist/src/server/team-memory-dream-types.js +23 -0
  173. package/dist/src/server/team-memory-export.d.ts +22 -0
  174. package/dist/src/server/team-memory-export.js +220 -0
  175. package/dist/src/server/team-memory-feature.d.ts +12 -0
  176. package/dist/src/server/team-memory-feature.js +12 -0
  177. package/dist/src/server/team-memory-http-serializers.d.ts +102 -0
  178. package/dist/src/server/team-memory-http-serializers.js +46 -0
  179. package/dist/src/server/team-memory-injection.d.ts +31 -0
  180. package/dist/src/server/team-memory-injection.js +49 -0
  181. package/dist/src/server/team-memory-store.d.ts +116 -0
  182. package/dist/src/server/team-memory-store.js +513 -0
  183. package/dist/src/server/team-operations.d.ts +5 -1
  184. package/dist/src/server/team-operations.js +46 -16
  185. package/dist/src/server/team-recall-store.d.ts +38 -0
  186. package/dist/src/server/team-recall-store.js +205 -0
  187. package/dist/src/server/terminal-input-profile.d.ts +1 -1
  188. package/dist/src/server/terminal-input-profile.js +18 -0
  189. package/dist/src/server/terminal-ws-server.js +6 -0
  190. package/dist/src/server/ui-auth-helpers.d.ts +1 -1
  191. package/dist/src/server/ui-auth-helpers.js +7 -1
  192. package/dist/src/server/ui-auth.d.ts +3 -0
  193. package/dist/src/server/ui-auth.js +21 -1
  194. package/dist/src/server/workflow-cli-policy.d.ts +2 -3
  195. package/dist/src/server/workflow-cli-policy.js +3 -3
  196. package/dist/src/server/workflow-runner.d.ts +1 -0
  197. package/dist/src/server/workflow-runner.js +9 -4
  198. package/dist/src/server/workspace-path-validation.js +6 -2
  199. package/dist/src/server/workspace-store.d.ts +1 -1
  200. package/dist/src/server/workspace-store.js +35 -9
  201. package/dist/src/shared/fs-browse.d.ts +1 -0
  202. package/dist/src/shared/fs-browse.js +1 -0
  203. package/dist/src/shared/path-input.d.ts +12 -0
  204. package/dist/src/shared/path-input.js +22 -0
  205. package/dist/src/shared/remote-bridge-routing.d.ts +19 -0
  206. package/dist/src/shared/remote-bridge-routing.js +141 -0
  207. package/dist/src/shared/remote-crypto.d.ts +138 -0
  208. package/dist/src/shared/remote-crypto.js +427 -0
  209. package/dist/src/shared/remote-pairing-code.d.ts +7 -0
  210. package/dist/src/shared/remote-pairing-code.js +47 -0
  211. package/dist/src/shared/remote-protocol.d.ts +160 -0
  212. package/dist/src/shared/remote-protocol.js +526 -0
  213. package/dist/src/shared/team-memory.d.ts +11 -0
  214. package/dist/src/shared/team-memory.js +10 -0
  215. package/dist/src/shared/team-recall.d.ts +1 -0
  216. package/dist/src/shared/team-recall.js +1 -0
  217. package/dist/src/shared/types.d.ts +4 -5
  218. package/package.json +12 -5
  219. package/scripts/postinstall-native-artifacts.mjs +113 -0
  220. package/web/dist/assets/AddWorkerDialog-CbV75qUX.js +2 -0
  221. package/web/dist/assets/AddWorkspaceFlow-CwV-7wPx.js +1 -0
  222. package/web/dist/assets/FirstRunWizard-a6PWIK3x.js +1 -0
  223. package/web/dist/assets/MarketplaceDrawer-Dd8WIA8T.js +67 -0
  224. package/web/dist/assets/TaskGraphDrawer-Bk5WFIk_.js +1 -0
  225. package/web/dist/assets/{WhatsNewDialog-CHkZeINH.js → WhatsNewDialog-C2VZaip0.js} +1 -1
  226. package/web/dist/assets/WorkerModal-DucW-9YT.js +1 -0
  227. package/web/dist/assets/WorkflowsDrawer-Bjf4olbR.js +1 -0
  228. package/web/dist/assets/WorkspaceMemoryDrawer-DglCy_5f.js +1 -0
  229. package/web/dist/assets/WorkspaceTaskDrawer-BIWwISvA.js +1 -0
  230. package/web/dist/assets/index-BAiLYajK.css +1 -0
  231. package/web/dist/assets/index-BV2k9Dts.js +73 -0
  232. package/web/dist/assets/search-Bk2HQvO7.js +1 -0
  233. package/web/dist/assets/square-terminal-D93m9hfY.js +1 -0
  234. package/web/dist/cli-icons/agy.png +0 -0
  235. package/web/dist/cli-icons/cursor.ico +0 -0
  236. package/web/dist/cli-icons/grok.ico +0 -0
  237. package/web/dist/cli-icons/qwen.png +0 -0
  238. package/web/dist/index.html +8 -3
  239. package/web/dist/sw.js +1 -1
  240. package/scripts/fix-runtime-artifacts.mjs +0 -33
  241. package/web/dist/assets/AddWorkerDialog-BRUxpa3f.js +0 -2
  242. package/web/dist/assets/AddWorkspaceDialog-D56x5JCb.js +0 -1
  243. package/web/dist/assets/FirstRunWizard-BFVaMIsE.js +0 -1
  244. package/web/dist/assets/MarketplaceDrawer-DeEZ35dN.js +0 -76
  245. package/web/dist/assets/WorkerModal-BBCuMLIa.js +0 -1
  246. package/web/dist/assets/WorkspaceTaskDrawer-CpZHAcj1.js +0 -1
  247. package/web/dist/assets/WorkspaceTerminalPanels-7If2mDyp.js +0 -1
  248. package/web/dist/assets/WorkspaceTerminalPanels-DDGTF8rc.css +0 -1
  249. package/web/dist/assets/index-5zh61jMg.css +0 -1
  250. package/web/dist/assets/index-CxNL0O-C.js +0 -73
  251. package/web/dist/assets/path-join-7MR1s7b1.js +0 -1
@@ -0,0 +1,67 @@
1
+ import { fromBase64Url, toBase64Url } from '../shared/remote-crypto.js';
2
+ const toRecord = (row) => ({
3
+ id: row.id,
4
+ name: row.name,
5
+ createdAt: row.created_at,
6
+ lastActive: row.last_active,
7
+ revokedAt: row.revoked_at,
8
+ });
9
+ const toSession = (row) => ({
10
+ deviceId: row.id,
11
+ keys: { d2p: fromBase64Url(row.key_d2p), p2d: fromBase64Url(row.key_p2d) },
12
+ });
13
+ export const createRemoteDeviceStore = (db) => {
14
+ const insertStmt = db.prepare(`INSERT INTO remote_devices
15
+ (id, name, key_d2p, key_p2d, device_pubkey, created_at, last_active, revoked_at)
16
+ VALUES (?, ?, ?, ?, ?, ?, NULL, NULL)`);
17
+ // Note: the SELECT projections for the metadata path deliberately OMIT key_d2p/key_p2d/device_pubkey
18
+ // so key material can never escape through list()/get() (invariant 7).
19
+ const getMetaStmt = db.prepare(`SELECT id, name, created_at, last_active, revoked_at FROM remote_devices WHERE id = ?`);
20
+ const listStmt = db.prepare(`SELECT id, name, created_at, last_active, revoked_at
21
+ FROM remote_devices
22
+ ORDER BY created_at DESC, id DESC`);
23
+ const listActiveStmt = db.prepare(`SELECT id, name, created_at, last_active, revoked_at
24
+ FROM remote_devices
25
+ WHERE revoked_at IS NULL
26
+ ORDER BY created_at DESC, id DESC`);
27
+ const liveSessionStmt = db.prepare(`SELECT id, key_d2p, key_p2d FROM remote_devices WHERE id = ? AND revoked_at IS NULL`);
28
+ const liveSessionsStmt = db.prepare(`SELECT id, key_d2p, key_p2d FROM remote_devices WHERE revoked_at IS NULL`);
29
+ // revoke only flips a row that is not already revoked, so a second call changes 0 rows -> false,
30
+ // and the original revoked_at timestamp is never overwritten.
31
+ const revokeStmt = db.prepare(`UPDATE remote_devices SET revoked_at = ? WHERE id = ? AND revoked_at IS NULL`);
32
+ const touchStmt = db.prepare(`UPDATE remote_devices SET last_active = ? WHERE id = ? AND revoked_at IS NULL`);
33
+ return {
34
+ insert(input, now = Date.now()) {
35
+ insertStmt.run(input.id, input.name, toBase64Url(input.keys.d2p), toBase64Url(input.keys.p2d), toBase64Url(input.devicePublicKey), now);
36
+ return { id: input.id, name: input.name, createdAt: now, lastActive: null, revokedAt: null };
37
+ },
38
+ getLiveSession(deviceId) {
39
+ const row = liveSessionStmt.get(deviceId);
40
+ return row ? toSession(row) : null;
41
+ },
42
+ liveSessions() {
43
+ return liveSessionsStmt.all().map(toSession);
44
+ },
45
+ list(includeRevoked = false) {
46
+ const rows = (includeRevoked ? listStmt : listActiveStmt).all();
47
+ return rows.map(toRecord);
48
+ },
49
+ get(deviceId) {
50
+ const row = getMetaStmt.get(deviceId);
51
+ return row ? toRecord(row) : null;
52
+ },
53
+ revoke(deviceId, now = Date.now()) {
54
+ return revokeStmt.run(now, deviceId).changes > 0;
55
+ },
56
+ touchActive(deviceId, now = Date.now()) {
57
+ touchStmt.run(now, deviceId);
58
+ },
59
+ };
60
+ };
61
+ // Persistent DeviceSessionProvider — no cache. get()/candidates() read the store live, so a revoke()
62
+ // write makes the next inbound frame fail in the M3 bridge (resolveAndOpen -> get null / candidate
63
+ // gone -> drop + audit 'no_session'). Zero bridge change for the persistence half (invariant 5).
64
+ export const createPersistentDeviceSessionProvider = (store) => ({
65
+ get: (deviceId) => store.getLiveSession(deviceId),
66
+ candidates: () => store.liveSessions(),
67
+ });
@@ -0,0 +1,102 @@
1
+ import { type Direction } from '../shared/remote-crypto.js';
2
+ import { type HttpResponseHead } from '../shared/remote-protocol.js';
3
+ import type { RemoteAuditStore } from './remote-audit-store.js';
4
+ import { type DeviceSessionProvider } from './remote-device-session.js';
5
+ /** A loopback HTTP request in flight. The bridge feeds it body chunks then end()s it. */
6
+ export interface LoopbackHttpRequest {
7
+ onData(chunk: Uint8Array): void;
8
+ onEnd(): void;
9
+ abort(): void;
10
+ }
11
+ export interface LoopbackHttpHandlers {
12
+ onHead(head: HttpResponseHead): void;
13
+ onBody(chunk: Uint8Array): void;
14
+ onEnd(): void;
15
+ onError(err: Error): void;
16
+ }
17
+ /** A loopback WS connection in flight. */
18
+ export interface LoopbackWsConnection {
19
+ onData(data: Uint8Array, isText: boolean): void;
20
+ onClose(): void;
21
+ abort(): void;
22
+ }
23
+ export interface LoopbackWsHandlers {
24
+ onOpen(): void;
25
+ onMessage(data: Uint8Array, isText: boolean): void;
26
+ onClose(): void;
27
+ onError(err: Error): void;
28
+ }
29
+ export interface LoopbackTransports {
30
+ openHttp(args: {
31
+ port: number;
32
+ method: string;
33
+ path: string;
34
+ headers: Record<string, string>;
35
+ }, handlers: LoopbackHttpHandlers): LoopbackHttpRequest;
36
+ openWs(args: {
37
+ port: number;
38
+ path: string;
39
+ headers: Record<string, string>;
40
+ }, handlers: LoopbackWsHandlers): LoopbackWsConnection;
41
+ }
42
+ export interface FrameBridgeContext {
43
+ loopbackPort: number;
44
+ loopbackSecret: string;
45
+ deviceSessions: DeviceSessionProvider;
46
+ audit: RemoteAuditStore;
47
+ /**
48
+ * The daemon's own id (config.getDaemonId()). M6.1: it is bound into the per-connection HKDF info,
49
+ * so it MUST be the SAME value the phone put in its HandshakeIds.daemonId — a mismatch diverges the
50
+ * info strings and EVERY Hello fails to open (total outage). Sourced at socket-open time in
51
+ * remote-tunnel.ts (guarded non-null; the tunnel can't be online without it).
52
+ */
53
+ daemonId: string;
54
+ /**
55
+ * Injected loopback transports. Production omits this and gets the real node:http / ws clients;
56
+ * unit tests pass a stub so a single bridged request is observable without real I/O. Carried on
57
+ * the context (not a separate arg) so the tunnel's `createBridge: (ctx) => createFrameBridge(ctx)`
58
+ * wiring is untouched and a test can simply add the field.
59
+ */
60
+ loopbackTransports?: LoopbackTransports;
61
+ /**
62
+ * Seam: the per-connection daemon salt source. Defaults to the crypto export; a test injects a
63
+ * deterministic-but-distinct generator so it can recompute the connKey + nonce. NOT a mock — the
64
+ * real HKDF still runs over whatever bytes this returns.
65
+ */
66
+ generateConnSalt?: () => Uint8Array;
67
+ /**
68
+ * Observation hook (NOT a mock): fires for every daemon->phone seal with the REAL AEAD key + REAL
69
+ * 12-byte header. Lets the no-(key,nonce)-reuse + no-downgrade invariants be mutation-tested by a
70
+ * recorder; the production sealNext still runs unchanged.
71
+ */
72
+ onSeal?: (rec: {
73
+ key: Uint8Array;
74
+ direction: Direction;
75
+ headerBytes: Uint8Array;
76
+ }) => void;
77
+ }
78
+ export interface FrameBridge {
79
+ attachSocket(send: (frame: Uint8Array) => void): void;
80
+ onInbound(frame: ArrayBuffer | Uint8Array): void;
81
+ /**
82
+ * Tear down every in-flight stream. `keepSink` distinguishes the two callers:
83
+ * - socket teardown (onSocketDown / revokeAndStop / close): the outbound socket is gone, so we
84
+ * also null the sink (keepSink omitted/false) and audit a session_close.
85
+ * - gateway 'peer-offline' control: the daemon socket STAYS OPEN (the gateway just told us the
86
+ * phone dropped its streams). We reset the in-flight streams but MUST keep `send` live so the
87
+ * phone can re-establish streams on the same socket after 'peer-online'. Audited as a
88
+ * stream-reset, not a session_close.
89
+ */
90
+ resetAllStreams(reason: string, opts?: {
91
+ keepSink?: boolean;
92
+ }): void;
93
+ /**
94
+ * Close ONE device's in-flight streams (M4 revoke closed loop). Unlike resetAllStreams this leaves
95
+ * other devices + the outbound sink untouched, so revoking device A never tears down device B. The
96
+ * per-device opener/sealer is dropped too, so a re-pair of the same id starts from clean crypto
97
+ * state. The persistent provider's revoke (the security-load-bearing half) already makes NEW frames
98
+ * fail with no_session; this is the best-effort liveness half that kills an ALREADY-open stream now.
99
+ */
100
+ closeDevice(deviceId: string, reason: string): void;
101
+ }
102
+ export declare const createFrameBridge: (ctx: FrameBridgeContext) => FrameBridge;