@everywheredev/cli 0.0.5 → 0.0.7

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 (307) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +274 -59
  3. package/package.json +3 -2
  4. package/scripts/build.mjs +68 -0
  5. package/dist/agent/agent-loop.d.ts +0 -40
  6. package/dist/agent/agent-loop.d.ts.map +0 -1
  7. package/dist/agent/agent-loop.js +0 -162
  8. package/dist/agent/agent-loop.js.map +0 -1
  9. package/dist/agent/approval.d.ts +0 -38
  10. package/dist/agent/approval.d.ts.map +0 -1
  11. package/dist/agent/approval.js +0 -55
  12. package/dist/agent/approval.js.map +0 -1
  13. package/dist/agent/run-tracker.d.ts +0 -26
  14. package/dist/agent/run-tracker.d.ts.map +0 -1
  15. package/dist/agent/run-tracker.js +0 -43
  16. package/dist/agent/run-tracker.js.map +0 -1
  17. package/dist/auth/device-flow.d.ts +0 -61
  18. package/dist/auth/device-flow.d.ts.map +0 -1
  19. package/dist/auth/device-flow.js +0 -141
  20. package/dist/auth/device-flow.js.map +0 -1
  21. package/dist/auth/hydra-oauth-auth-provider.d.ts +0 -35
  22. package/dist/auth/hydra-oauth-auth-provider.d.ts.map +0 -1
  23. package/dist/auth/hydra-oauth-auth-provider.js +0 -153
  24. package/dist/auth/hydra-oauth-auth-provider.js.map +0 -1
  25. package/dist/auth/keychain.d.ts +0 -42
  26. package/dist/auth/keychain.d.ts.map +0 -1
  27. package/dist/auth/keychain.js +0 -138
  28. package/dist/auth/keychain.js.map +0 -1
  29. package/dist/auth/pkce.d.ts +0 -20
  30. package/dist/auth/pkce.d.ts.map +0 -1
  31. package/dist/auth/pkce.js +0 -44
  32. package/dist/auth/pkce.js.map +0 -1
  33. package/dist/auth/ports.d.ts +0 -25
  34. package/dist/auth/ports.d.ts.map +0 -1
  35. package/dist/auth/ports.js +0 -8
  36. package/dist/auth/ports.js.map +0 -1
  37. package/dist/commands/activity.d.ts +0 -17
  38. package/dist/commands/activity.d.ts.map +0 -1
  39. package/dist/commands/activity.js +0 -54
  40. package/dist/commands/activity.js.map +0 -1
  41. package/dist/commands/agent.d.ts +0 -25
  42. package/dist/commands/agent.d.ts.map +0 -1
  43. package/dist/commands/agent.js +0 -80
  44. package/dist/commands/agent.js.map +0 -1
  45. package/dist/commands/agents.d.ts +0 -9
  46. package/dist/commands/agents.d.ts.map +0 -1
  47. package/dist/commands/agents.js +0 -28
  48. package/dist/commands/agents.js.map +0 -1
  49. package/dist/commands/commits.d.ts +0 -16
  50. package/dist/commands/commits.d.ts.map +0 -1
  51. package/dist/commands/commits.js +0 -39
  52. package/dist/commands/commits.js.map +0 -1
  53. package/dist/commands/diff.d.ts +0 -15
  54. package/dist/commands/diff.d.ts.map +0 -1
  55. package/dist/commands/diff.js +0 -27
  56. package/dist/commands/diff.js.map +0 -1
  57. package/dist/commands/expose.d.ts +0 -15
  58. package/dist/commands/expose.d.ts.map +0 -1
  59. package/dist/commands/expose.js +0 -39
  60. package/dist/commands/expose.js.map +0 -1
  61. package/dist/commands/index.d.ts +0 -7
  62. package/dist/commands/index.d.ts.map +0 -1
  63. package/dist/commands/index.js +0 -12
  64. package/dist/commands/index.js.map +0 -1
  65. package/dist/commands/login.d.ts +0 -9
  66. package/dist/commands/login.d.ts.map +0 -1
  67. package/dist/commands/login.js +0 -27
  68. package/dist/commands/login.js.map +0 -1
  69. package/dist/commands/logout.d.ts +0 -9
  70. package/dist/commands/logout.d.ts.map +0 -1
  71. package/dist/commands/logout.js +0 -24
  72. package/dist/commands/logout.js.map +0 -1
  73. package/dist/commands/me.d.ts +0 -10
  74. package/dist/commands/me.d.ts.map +0 -1
  75. package/dist/commands/me.js +0 -25
  76. package/dist/commands/me.js.map +0 -1
  77. package/dist/commands/open.d.ts +0 -16
  78. package/dist/commands/open.d.ts.map +0 -1
  79. package/dist/commands/open.js +0 -34
  80. package/dist/commands/open.js.map +0 -1
  81. package/dist/commands/ports.d.ts +0 -75
  82. package/dist/commands/ports.d.ts.map +0 -1
  83. package/dist/commands/ports.js +0 -78
  84. package/dist/commands/ports.js.map +0 -1
  85. package/dist/commands/profile.d.ts +0 -21
  86. package/dist/commands/profile.d.ts.map +0 -1
  87. package/dist/commands/profile.js +0 -93
  88. package/dist/commands/profile.js.map +0 -1
  89. package/dist/commands/push.d.ts +0 -18
  90. package/dist/commands/push.d.ts.map +0 -1
  91. package/dist/commands/push.js +0 -116
  92. package/dist/commands/push.js.map +0 -1
  93. package/dist/commands/registry.d.ts +0 -15
  94. package/dist/commands/registry.d.ts.map +0 -1
  95. package/dist/commands/registry.js +0 -45
  96. package/dist/commands/registry.js.map +0 -1
  97. package/dist/commands/request.d.ts +0 -25
  98. package/dist/commands/request.d.ts.map +0 -1
  99. package/dist/commands/request.js +0 -58
  100. package/dist/commands/request.js.map +0 -1
  101. package/dist/commands/resume.d.ts +0 -22
  102. package/dist/commands/resume.d.ts.map +0 -1
  103. package/dist/commands/resume.js +0 -69
  104. package/dist/commands/resume.js.map +0 -1
  105. package/dist/commands/save.d.ts +0 -34
  106. package/dist/commands/save.d.ts.map +0 -1
  107. package/dist/commands/save.js +0 -141
  108. package/dist/commands/save.js.map +0 -1
  109. package/dist/commands/session.d.ts +0 -9
  110. package/dist/commands/session.d.ts.map +0 -1
  111. package/dist/commands/session.js +0 -282
  112. package/dist/commands/session.js.map +0 -1
  113. package/dist/commands/skills/markdown-loader.d.ts +0 -19
  114. package/dist/commands/skills/markdown-loader.d.ts.map +0 -1
  115. package/dist/commands/skills/markdown-loader.js +0 -108
  116. package/dist/commands/skills/markdown-loader.js.map +0 -1
  117. package/dist/commands/skills/registry.d.ts +0 -23
  118. package/dist/commands/skills/registry.d.ts.map +0 -1
  119. package/dist/commands/skills/registry.js +0 -45
  120. package/dist/commands/skills/registry.js.map +0 -1
  121. package/dist/commands/terminal.d.ts +0 -19
  122. package/dist/commands/terminal.d.ts.map +0 -1
  123. package/dist/commands/terminal.js +0 -39
  124. package/dist/commands/terminal.js.map +0 -1
  125. package/dist/commands/tree.d.ts +0 -16
  126. package/dist/commands/tree.d.ts.map +0 -1
  127. package/dist/commands/tree.js +0 -44
  128. package/dist/commands/tree.js.map +0 -1
  129. package/dist/commands/undo.d.ts +0 -18
  130. package/dist/commands/undo.d.ts.map +0 -1
  131. package/dist/commands/undo.js +0 -46
  132. package/dist/commands/undo.js.map +0 -1
  133. package/dist/config/config-store.d.ts +0 -19
  134. package/dist/config/config-store.d.ts.map +0 -1
  135. package/dist/config/config-store.js +0 -199
  136. package/dist/config/config-store.js.map +0 -1
  137. package/dist/config/defaults.d.ts +0 -22
  138. package/dist/config/defaults.d.ts.map +0 -1
  139. package/dist/config/defaults.js +0 -38
  140. package/dist/config/defaults.js.map +0 -1
  141. package/dist/config/ports.d.ts +0 -60
  142. package/dist/config/ports.d.ts.map +0 -1
  143. package/dist/config/ports.js +0 -8
  144. package/dist/config/ports.js.map +0 -1
  145. package/dist/config/profile-constants.d.ts +0 -4
  146. package/dist/config/profile-constants.d.ts.map +0 -1
  147. package/dist/config/profile-constants.js +0 -10
  148. package/dist/config/profile-constants.js.map +0 -1
  149. package/dist/config/profile.d.ts +0 -84
  150. package/dist/config/profile.d.ts.map +0 -1
  151. package/dist/config/profile.js +0 -66
  152. package/dist/config/profile.js.map +0 -1
  153. package/dist/contract/index.d.ts +0 -193
  154. package/dist/contract/index.d.ts.map +0 -1
  155. package/dist/contract/index.js +0 -14
  156. package/dist/contract/index.js.map +0 -1
  157. package/dist/core/app.d.ts +0 -35
  158. package/dist/core/app.d.ts.map +0 -1
  159. package/dist/core/app.js +0 -86
  160. package/dist/core/app.js.map +0 -1
  161. package/dist/core/command-router.d.ts +0 -29
  162. package/dist/core/command-router.d.ts.map +0 -1
  163. package/dist/core/command-router.js +0 -61
  164. package/dist/core/command-router.js.map +0 -1
  165. package/dist/core/errors.d.ts +0 -39
  166. package/dist/core/errors.d.ts.map +0 -1
  167. package/dist/core/errors.js +0 -106
  168. package/dist/core/errors.js.map +0 -1
  169. package/dist/core/preflight.d.ts +0 -16
  170. package/dist/core/preflight.d.ts.map +0 -1
  171. package/dist/core/preflight.js +0 -38
  172. package/dist/core/preflight.js.map +0 -1
  173. package/dist/core/repl.d.ts +0 -18
  174. package/dist/core/repl.d.ts.map +0 -1
  175. package/dist/core/repl.js +0 -128
  176. package/dist/core/repl.js.map +0 -1
  177. package/dist/di/container.d.ts +0 -13
  178. package/dist/di/container.d.ts.map +0 -1
  179. package/dist/di/container.js +0 -160
  180. package/dist/di/container.js.map +0 -1
  181. package/dist/di/tokens.d.ts +0 -20
  182. package/dist/di/tokens.d.ts.map +0 -1
  183. package/dist/di/tokens.js +0 -22
  184. package/dist/di/tokens.js.map +0 -1
  185. package/dist/index.d.ts +0 -9
  186. package/dist/index.d.ts.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/render/ink-renderer.d.ts +0 -28
  189. package/dist/render/ink-renderer.d.ts.map +0 -1
  190. package/dist/render/ink-renderer.js +0 -174
  191. package/dist/render/ink-renderer.js.map +0 -1
  192. package/dist/render/plain-renderer.d.ts +0 -16
  193. package/dist/render/plain-renderer.d.ts.map +0 -1
  194. package/dist/render/plain-renderer.js +0 -38
  195. package/dist/render/plain-renderer.js.map +0 -1
  196. package/dist/render/ports.d.ts +0 -12
  197. package/dist/render/ports.d.ts.map +0 -1
  198. package/dist/render/ports.js +0 -10
  199. package/dist/render/ports.js.map +0 -1
  200. package/dist/render/raw-renderer.d.ts +0 -11
  201. package/dist/render/raw-renderer.d.ts.map +0 -1
  202. package/dist/render/raw-renderer.js +0 -68
  203. package/dist/render/raw-renderer.js.map +0 -1
  204. package/dist/render/repl-input.d.ts +0 -15
  205. package/dist/render/repl-input.d.ts.map +0 -1
  206. package/dist/render/repl-input.js +0 -102
  207. package/dist/render/repl-input.js.map +0 -1
  208. package/dist/session/file-session-store.d.ts +0 -26
  209. package/dist/session/file-session-store.d.ts.map +0 -1
  210. package/dist/session/file-session-store.js +0 -174
  211. package/dist/session/file-session-store.js.map +0 -1
  212. package/dist/session/ports.d.ts +0 -50
  213. package/dist/session/ports.d.ts.map +0 -1
  214. package/dist/session/ports.js +0 -6
  215. package/dist/session/ports.js.map +0 -1
  216. package/dist/sync/git-sync.d.ts +0 -16
  217. package/dist/sync/git-sync.d.ts.map +0 -1
  218. package/dist/sync/git-sync.js +0 -28
  219. package/dist/sync/git-sync.js.map +0 -1
  220. package/dist/sync/git.d.ts +0 -12
  221. package/dist/sync/git.d.ts.map +0 -1
  222. package/dist/sync/git.js +0 -100
  223. package/dist/sync/git.js.map +0 -1
  224. package/dist/sync/reconciler.d.ts +0 -36
  225. package/dist/sync/reconciler.d.ts.map +0 -1
  226. package/dist/sync/reconciler.js +0 -143
  227. package/dist/sync/reconciler.js.map +0 -1
  228. package/dist/sync/walk.d.ts +0 -23
  229. package/dist/sync/walk.d.ts.map +0 -1
  230. package/dist/sync/walk.js +0 -81
  231. package/dist/sync/walk.js.map +0 -1
  232. package/dist/sync/watch.d.ts +0 -13
  233. package/dist/sync/watch.d.ts.map +0 -1
  234. package/dist/sync/watch.js +0 -75
  235. package/dist/sync/watch.js.map +0 -1
  236. package/dist/tools/git-diff.d.ts +0 -16
  237. package/dist/tools/git-diff.d.ts.map +0 -1
  238. package/dist/tools/git-diff.js +0 -25
  239. package/dist/tools/git-diff.js.map +0 -1
  240. package/dist/tools/http-request.d.ts +0 -25
  241. package/dist/tools/http-request.d.ts.map +0 -1
  242. package/dist/tools/http-request.js +0 -41
  243. package/dist/tools/http-request.js.map +0 -1
  244. package/dist/tools/index.d.ts +0 -7
  245. package/dist/tools/index.d.ts.map +0 -1
  246. package/dist/tools/index.js +0 -22
  247. package/dist/tools/index.js.map +0 -1
  248. package/dist/tools/ports.d.ts +0 -58
  249. package/dist/tools/ports.d.ts.map +0 -1
  250. package/dist/tools/ports.js +0 -17
  251. package/dist/tools/ports.js.map +0 -1
  252. package/dist/tools/read-file.d.ts +0 -16
  253. package/dist/tools/read-file.d.ts.map +0 -1
  254. package/dist/tools/read-file.js +0 -24
  255. package/dist/tools/read-file.js.map +0 -1
  256. package/dist/tools/registry.d.ts +0 -10
  257. package/dist/tools/registry.d.ts.map +0 -1
  258. package/dist/tools/registry.js +0 -28
  259. package/dist/tools/registry.js.map +0 -1
  260. package/dist/tools/run-command.d.ts +0 -20
  261. package/dist/tools/run-command.d.ts.map +0 -1
  262. package/dist/tools/run-command.js +0 -65
  263. package/dist/tools/run-command.js.map +0 -1
  264. package/dist/tools/write-file.d.ts +0 -24
  265. package/dist/tools/write-file.d.ts.map +0 -1
  266. package/dist/tools/write-file.js +0 -60
  267. package/dist/tools/write-file.js.map +0 -1
  268. package/dist/transport/composite-transport.d.ts +0 -30
  269. package/dist/transport/composite-transport.d.ts.map +0 -1
  270. package/dist/transport/composite-transport.js +0 -71
  271. package/dist/transport/composite-transport.js.map +0 -1
  272. package/dist/transport/device-browser.d.ts +0 -19
  273. package/dist/transport/device-browser.d.ts.map +0 -1
  274. package/dist/transport/device-browser.js +0 -243
  275. package/dist/transport/device-browser.js.map +0 -1
  276. package/dist/transport/device-git.d.ts +0 -14
  277. package/dist/transport/device-git.d.ts.map +0 -1
  278. package/dist/transport/device-git.js +0 -107
  279. package/dist/transport/device-git.js.map +0 -1
  280. package/dist/transport/device-http.d.ts +0 -10
  281. package/dist/transport/device-http.d.ts.map +0 -1
  282. package/dist/transport/device-http.js +0 -96
  283. package/dist/transport/device-http.js.map +0 -1
  284. package/dist/transport/device-terminal.d.ts +0 -44
  285. package/dist/transport/device-terminal.d.ts.map +0 -1
  286. package/dist/transport/device-terminal.js +0 -140
  287. package/dist/transport/device-terminal.js.map +0 -1
  288. package/dist/transport/http-transport.d.ts +0 -26
  289. package/dist/transport/http-transport.d.ts.map +0 -1
  290. package/dist/transport/http-transport.js +0 -125
  291. package/dist/transport/http-transport.js.map +0 -1
  292. package/dist/transport/ports.d.ts +0 -67
  293. package/dist/transport/ports.d.ts.map +0 -1
  294. package/dist/transport/ports.js +0 -11
  295. package/dist/transport/ports.js.map +0 -1
  296. package/dist/transport/reconnect.d.ts +0 -44
  297. package/dist/transport/reconnect.d.ts.map +0 -1
  298. package/dist/transport/reconnect.js +0 -69
  299. package/dist/transport/reconnect.js.map +0 -1
  300. package/dist/transport/terminal-transport.d.ts +0 -28
  301. package/dist/transport/terminal-transport.d.ts.map +0 -1
  302. package/dist/transport/terminal-transport.js +0 -63
  303. package/dist/transport/terminal-transport.js.map +0 -1
  304. package/dist/transport/ws-stream-transport.d.ts +0 -66
  305. package/dist/transport/ws-stream-transport.d.ts.map +0 -1
  306. package/dist/transport/ws-stream-transport.js +0 -246
  307. package/dist/transport/ws-stream-transport.js.map +0 -1
@@ -1,67 +0,0 @@
1
- import type { ClientEvent, ClientEventMap, ServerEvent, ServerEventMap } from "../contract/index.js";
2
- /** Cancels a subscription registered via `on`/`onData`/`onExit`. Idempotent. */
3
- export type Unsubscribe = () => void;
4
- /**
5
- * REST surface (docs §8). Mirrors the frozen /api/* contract. Methods carry
6
- * `Authorization: Bearer <token>` from the injected AuthProvider and map non-2xx to CliError.
7
- */
8
- export interface HttpPort {
9
- get<T>(path: string, query?: Record<string, string | number | undefined>, headers?: Record<string, string>): Promise<T>;
10
- put<T>(path: string, body: unknown, headers?: Record<string, string>): Promise<T>;
11
- post<T>(path: string, body: unknown, headers?: Record<string, string>): Promise<T>;
12
- del<T>(path: string, headers?: Record<string, string>): Promise<T>;
13
- /** POST a raw binary body (octet-stream) — e.g. a .git bundle. */
14
- postRaw<T>(path: string, body: Uint8Array, headers?: Record<string, string>): Promise<T>;
15
- }
16
- /**
17
- * Native-WebSocket event stream (docs §8). Event names + payloads are frozen by the contract
18
- * (`ServerEventMap` / `ClientEventMap`). `resume` re-subscribes after a drop/rollover.
19
- */
20
- export interface StreamPort {
21
- /** Open the socket (idempotent; resolves once the upgrade + first frame succeed). */
22
- connect(): Promise<void>;
23
- /** Subscribe to a server→client event. Returns an unsubscribe handle. */
24
- on<E extends ServerEvent>(event: E, fn: (payload: ServerEventMap[E]) => void): Unsubscribe;
25
- /** Send a client→server event. No-ops (buffered) until connected, then flushed in order. */
26
- send<E extends ClientEvent>(event: E, payload: ClientEventMap[E]): void;
27
- /** Close the socket and drop all subscriptions. */
28
- close(): Promise<void>;
29
- /** Re-establish + replay subscriptions/state after a reconnect. */
30
- resume(state: ResumeState): Promise<void>;
31
- /** True while the underlying socket is OPEN. */
32
- readonly connected: boolean;
33
- }
34
- /**
35
- * Terminal (PTY) surface (docs §13). A thin role interface implemented over `StreamPort`'s
36
- * terminal:* events so the RawRenderer can pipe bytes without ever touching the React tree.
37
- */
38
- export interface TerminalPort {
39
- create(opts: {
40
- cols?: number;
41
- rows?: number;
42
- }): Promise<{
43
- id: string;
44
- }>;
45
- input(data: string): void;
46
- resize(cols: number, rows: number): void;
47
- onData(fn: (chunk: string) => void): Unsubscribe;
48
- onExit(fn: (code: number) => void): Unsubscribe;
49
- }
50
- /** Composite façade injected where all three ports are needed together (e.g. the AgentLoop host). */
51
- export interface Transport extends HttpPort, StreamPort, TerminalPort {
52
- }
53
- /**
54
- * State replayed on reconnect (docs §14). Keyed by terminal id + in-flight agent runIds so the
55
- * reconnect layer can re-create the PTY and re-filter agent:* envelopes after a pod drain.
56
- */
57
- export interface ResumeState {
58
- /** Open PTY to re-create after reconnect, with its last known viewport. */
59
- terminal?: {
60
- id: string;
61
- cols: number;
62
- rows: number;
63
- };
64
- /** Agent runs still streaming when the socket dropped; resume by filtering on these ids. */
65
- runIds: readonly string[];
66
- }
67
- //# sourceMappingURL=ports.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/transport/ports.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- // Transport ports — the frozen client⇄host contract, split into narrow role interfaces.
2
- //
3
- // ISP: the transport is deliberately three interfaces (HttpPort + StreamPort + TerminalPort) instead
4
- // of one fat "client". A command that only reads files depends on `HttpPort` alone; the terminal UX
5
- // depends on `TerminalPort`; the agent loop depends on `StreamPort`. `Transport` is a composite
6
- // façade injected only where all three are genuinely needed together.
7
- //
8
- // DIP: these are pure abstractions over the wire contract. Concretes (undici/fetch, `ws`) are bound
9
- // once at the DI root and are auth-agnostic (they ask an `AuthProvider` for the Bearer header).
10
- export {};
11
- //# sourceMappingURL=ports.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/transport/ports.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,EAAE;AACF,qGAAqG;AACrG,oGAAoG;AACpG,gGAAgG;AAChG,sEAAsE;AACtE,EAAE;AACF,oGAAoG;AACpG,gGAAgG"}
@@ -1,44 +0,0 @@
1
- import type { ResumeState } from "./ports.js";
2
- export interface BackoffOptions {
3
- /** First delay in ms. */
4
- baseMs?: number;
5
- /** Hard ceiling for a single delay in ms. */
6
- maxMs?: number;
7
- /** Multiplier applied each attempt. */
8
- factor?: number;
9
- /** Fractional jitter (0..1) applied symmetrically to spread reconnect storms. */
10
- jitter?: number;
11
- /** Max attempts before giving up; Infinity = retry forever (default for long sessions). */
12
- maxAttempts?: number;
13
- }
14
- /** Stateful exponential backoff with jitter. */
15
- export declare class Backoff {
16
- private attempt;
17
- private readonly baseMs;
18
- private readonly maxMs;
19
- private readonly factor;
20
- private readonly jitter;
21
- private readonly maxAttempts;
22
- constructor(opts?: BackoffOptions);
23
- /** True if another attempt is permitted. */
24
- get canRetry(): boolean;
25
- /** Compute the next delay (ms) and advance the attempt counter. */
26
- next(): number;
27
- /** Reset after a successful connection. */
28
- reset(): void;
29
- }
30
- /**
31
- * Tracks the state to replay on reconnect (docs §14). The transport updates it as terminals open and
32
- * agent runs start/stop; on reconnect it hands the snapshot to `StreamPort.resume`.
33
- */
34
- export declare class ResumeTracker {
35
- private terminal?;
36
- private readonly runIds;
37
- setTerminal(id: string, cols: number, rows: number): void;
38
- resizeTerminal(cols: number, rows: number): void;
39
- clearTerminal(): void;
40
- addRun(runId: string): void;
41
- endRun(runId: string): void;
42
- snapshot(): ResumeState;
43
- }
44
- //# sourceMappingURL=reconnect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconnect.d.ts","sourceRoot":"","sources":["../../src/transport/reconnect.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gDAAgD;AAChD,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,IAAI,GAAE,cAAmB;IAQrC,4CAA4C;IAC5C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,mEAAmE;IACnE,IAAI,IAAI,MAAM;IASd,2CAA2C;IAC3C,KAAK,IAAI,IAAI;CAGd;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAA6C;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzD,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhD,aAAa,IAAI,IAAI;IAIrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B,QAAQ,IAAI,WAAW;CAMxB"}
@@ -1,69 +0,0 @@
1
- // Reconnect policy — exponential backoff with jitter, plus a ResumeState holder.
2
- //
3
- // SRP: pure reconnection math + bookkeeping; it does not own a socket. WsStreamTransport composes
4
- // this to decide *when* to retry and *what* to replay (open terminal id + in-flight runIds), keeping
5
- // the socket class focused on framing. OCP: swap the policy without touching the transport.
6
- /** Stateful exponential backoff with jitter. */
7
- export class Backoff {
8
- attempt = 0;
9
- baseMs;
10
- maxMs;
11
- factor;
12
- jitter;
13
- maxAttempts;
14
- constructor(opts = {}) {
15
- this.baseMs = opts.baseMs ?? 500;
16
- this.maxMs = opts.maxMs ?? 30_000;
17
- this.factor = opts.factor ?? 2;
18
- this.jitter = opts.jitter ?? 0.2;
19
- this.maxAttempts = opts.maxAttempts ?? Number.POSITIVE_INFINITY;
20
- }
21
- /** True if another attempt is permitted. */
22
- get canRetry() {
23
- return this.attempt < this.maxAttempts;
24
- }
25
- /** Compute the next delay (ms) and advance the attempt counter. */
26
- next() {
27
- const raw = this.baseMs * this.factor ** this.attempt;
28
- const capped = Math.min(raw, this.maxMs);
29
- this.attempt += 1;
30
- const delta = capped * this.jitter;
31
- // Symmetric jitter in [-delta, +delta].
32
- return Math.max(0, Math.round(capped + (Math.random() * 2 - 1) * delta));
33
- }
34
- /** Reset after a successful connection. */
35
- reset() {
36
- this.attempt = 0;
37
- }
38
- }
39
- /**
40
- * Tracks the state to replay on reconnect (docs §14). The transport updates it as terminals open and
41
- * agent runs start/stop; on reconnect it hands the snapshot to `StreamPort.resume`.
42
- */
43
- export class ResumeTracker {
44
- terminal;
45
- runIds = new Set();
46
- setTerminal(id, cols, rows) {
47
- this.terminal = { id, cols, rows };
48
- }
49
- resizeTerminal(cols, rows) {
50
- if (this.terminal)
51
- this.terminal = { ...this.terminal, cols, rows };
52
- }
53
- clearTerminal() {
54
- this.terminal = undefined;
55
- }
56
- addRun(runId) {
57
- this.runIds.add(runId);
58
- }
59
- endRun(runId) {
60
- this.runIds.delete(runId);
61
- }
62
- snapshot() {
63
- return {
64
- terminal: this.terminal,
65
- runIds: [...this.runIds],
66
- };
67
- }
68
- }
69
- //# sourceMappingURL=reconnect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../../src/transport/reconnect.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,kGAAkG;AAClG,qGAAqG;AACrG,4FAA4F;AAiB5F,gDAAgD;AAChD,MAAM,OAAO,OAAO;IACV,OAAO,GAAG,CAAC,CAAC;IACH,MAAM,CAAS;IACf,KAAK,CAAS;IACd,MAAM,CAAS;IACf,MAAM,CAAS;IACf,WAAW,CAAS;IAErC,YAAY,OAAuB,EAAE;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAClE,CAAC;IAED,4CAA4C;IAC5C,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,mEAAmE;IACnE,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACnC,wCAAwC;QACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,QAAQ,CAA8C;IAC7C,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,WAAW,CAAC,EAAU,EAAE,IAAY,EAAE,IAAY;QAChD,IAAI,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,IAAY;QACvC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtE,CAAC;IAED,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;SACzB,CAAC;IACJ,CAAC;CACF"}
@@ -1,28 +0,0 @@
1
- import type { ResumeTracker } from "./reconnect.js";
2
- import type { StreamPort, TerminalPort, Unsubscribe } from "./ports.js";
3
- export declare class TerminalTransport implements TerminalPort {
4
- private readonly stream;
5
- /** Optional: when present, terminal lifecycle is recorded for reconnect/resume. */
6
- private readonly resume?;
7
- private id?;
8
- private cols;
9
- private rows;
10
- constructor(stream: StreamPort,
11
- /** Optional: when present, terminal lifecycle is recorded for reconnect/resume. */
12
- resume?: ResumeTracker | undefined);
13
- /**
14
- * Open a PTY. Sends `terminal:create` and resolves with the id from the first `terminal:ready`.
15
- * Subsequent input/resize target this PTY (the frozen contract is single-terminal per stream).
16
- */
17
- create(opts: {
18
- cols?: number;
19
- rows?: number;
20
- }): Promise<{
21
- id: string;
22
- }>;
23
- input(data: string): void;
24
- resize(cols: number, rows: number): void;
25
- onData(fn: (chunk: string) => void): Unsubscribe;
26
- onExit(fn: (code: number) => void): Unsubscribe;
27
- }
28
- //# sourceMappingURL=terminal-transport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-transport.d.ts","sourceRoot":"","sources":["../../src/transport/terminal-transport.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMxE,qBAAa,iBAAkB,YAAW,YAAY;IAMlD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,OAAO,CAAC,EAAE,CAAC,CAAS;IACpB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,IAAI,CAAgB;gBAGT,MAAM,EAAE,UAAU;IACnC,mFAAmF;IAClE,MAAM,CAAC,EAAE,aAAa,YAAA;IAGzC;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAkB7E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOxC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAIhD,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;CAOhD"}
@@ -1,63 +0,0 @@
1
- // TerminalTransport — the TerminalPort implemented over a StreamPort.
2
- //
3
- // SRP/ISP: this is a thin role adapter. It translates the narrow TerminalPort surface (create/input/
4
- // resize/onData/onExit) into the frozen terminal:* envelopes on the underlying StreamPort, and feeds
5
- // the WsStreamTransport's ResumeTracker so a PTY survives reconnects. It holds NO rendering logic —
6
- // the RawRenderer pipes onData→stdout and stdin→input strictly outside the React tree (docs §13).
7
- //
8
- // DIP: depends on `StreamPort` only; works identically over a real WS or a FakeStreamPort in tests.
9
- /** Default PTY viewport per the frozen contract (80×24). */
10
- const DEFAULT_COLS = 80;
11
- const DEFAULT_ROWS = 24;
12
- export class TerminalTransport {
13
- stream;
14
- resume;
15
- id;
16
- cols = DEFAULT_COLS;
17
- rows = DEFAULT_ROWS;
18
- constructor(stream,
19
- /** Optional: when present, terminal lifecycle is recorded for reconnect/resume. */
20
- resume) {
21
- this.stream = stream;
22
- this.resume = resume;
23
- }
24
- /**
25
- * Open a PTY. Sends `terminal:create` and resolves with the id from the first `terminal:ready`.
26
- * Subsequent input/resize target this PTY (the frozen contract is single-terminal per stream).
27
- */
28
- async create(opts) {
29
- await this.stream.connect();
30
- this.cols = opts.cols ?? DEFAULT_COLS;
31
- this.rows = opts.rows ?? DEFAULT_ROWS;
32
- const ready = new Promise((resolve) => {
33
- const off = this.stream.on("terminal:ready", (payload) => {
34
- off();
35
- this.id = payload.id;
36
- this.resume?.setTerminal(payload.id, this.cols, this.rows);
37
- resolve({ id: payload.id });
38
- });
39
- });
40
- this.stream.send("terminal:create", { cols: this.cols, rows: this.rows });
41
- return ready;
42
- }
43
- input(data) {
44
- this.stream.send("terminal:input", data);
45
- }
46
- resize(cols, rows) {
47
- this.cols = cols;
48
- this.rows = rows;
49
- this.resume?.resizeTerminal(cols, rows);
50
- this.stream.send("terminal:resize", { cols, rows });
51
- }
52
- onData(fn) {
53
- return this.stream.on("terminal:data", fn);
54
- }
55
- onExit(fn) {
56
- return this.stream.on("terminal:exit", (code) => {
57
- this.id = undefined;
58
- this.resume?.clearTerminal();
59
- fn(code);
60
- });
61
- }
62
- }
63
- //# sourceMappingURL=terminal-transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-transport.js","sourceRoot":"","sources":["../../src/transport/terminal-transport.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,qGAAqG;AACrG,qGAAqG;AACrG,oGAAoG;AACpG,kGAAkG;AAClG,EAAE;AACF,oGAAoG;AAKpG,4DAA4D;AAC5D,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,MAAM,OAAO,iBAAiB;IAMT;IAEA;IAPX,EAAE,CAAU;IACZ,IAAI,GAAG,YAAY,CAAC;IACpB,IAAI,GAAG,YAAY,CAAC;IAE5B,YACmB,MAAkB;IACnC,mFAAmF;IAClE,MAAsB;QAFtB,WAAM,GAAN,MAAM,CAAY;QAElB,WAAM,GAAN,MAAM,CAAgB;IACtC,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,IAAsC;QACjD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;QAEtC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;YACpD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;gBACvD,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3D,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,EAA2B;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAA0B;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9C,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;YAC7B,EAAE,CAAC,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,66 +0,0 @@
1
- import { WebSocket } from "ws";
2
- import type { AuthProvider } from "../auth/ports.js";
3
- import type { Profile } from "../config/ports.js";
4
- import type { ClientEvent, ClientEventMap, ServerEvent, ServerEventMap } from "../contract/index.js";
5
- import type { ResumeState, StreamPort, Unsubscribe } from "./ports.js";
6
- import { ResumeTracker } from "./reconnect.js";
7
- type WsFactory = (url: string, headers: Record<string, string>) => WebSocket;
8
- export declare class WsStreamTransport implements StreamPort {
9
- private readonly auth;
10
- private readonly wsFactory;
11
- /** Scope the socket to a project (`?project=`) and, for ephemeral sessions, mark it `?ephemeral=1`
12
- * so the host reaps the project when this connection drops. `onStatus` surfaces auto-reconnect
13
- * transitions so a long-lived command (e.g. the session) can show "reconnecting…/reconnected". */
14
- private readonly opts;
15
- private ws?;
16
- private readonly url;
17
- private readonly handlers;
18
- private readonly outbox;
19
- private nextId;
20
- private closing;
21
- private reconnecting;
22
- private connectPromise?;
23
- private readonly backoff;
24
- /** Public so the TerminalPort façade (and resume) can record terminal/run state. */
25
- readonly resumeTracker: ResumeTracker;
26
- constructor(profile: Profile, auth: AuthProvider, wsFactory?: WsFactory,
27
- /** Scope the socket to a project (`?project=`) and, for ephemeral sessions, mark it `?ephemeral=1`
28
- * so the host reaps the project when this connection drops. `onStatus` surfaces auto-reconnect
29
- * transitions so a long-lived command (e.g. the session) can show "reconnecting…/reconnected". */
30
- opts?: {
31
- project?: string;
32
- ephemeral?: boolean;
33
- /** Register this connection as the project's PTY provider (`?role=device`): the host routes the
34
- * dashboard's terminals to a real shell spawned HERE (so the user's local tools work). */
35
- role?: "device";
36
- onStatus?: (s: "reconnecting" | "reconnected") => void;
37
- });
38
- get connected(): boolean;
39
- connect(): Promise<void>;
40
- on<E extends ServerEvent>(event: E, fn: (payload: ServerEventMap[E]) => void): Unsubscribe;
41
- /** Subscribe to an event by raw string name (escape hatch outside the frozen ServerEventMap). Used
42
- * for the device:terminal:* relay leg, which is intentionally NOT in the frozen contract. */
43
- onRaw(event: string, fn: (payload: unknown) => void): Unsubscribe;
44
- /** Send an event by raw string name (escape hatch; see onRaw). Same buffering as send(). */
45
- sendRaw(event: string, payload: unknown): void;
46
- send<E extends ClientEvent>(event: E, payload: ClientEventMap[E]): void;
47
- /** Fire-and-forget write. MUST NOT throw: a socket that drops mid-send (common in the relay, e.g. a
48
- * device responder replying as the peer disconnects) would otherwise reject the caller's promise and —
49
- * with these handlers registered as `void` — crash the process, killing reconnection. On any failure we
50
- * buffer for the next flush instead. */
51
- private enqueue;
52
- /** Write one envelope to the socket; returns false (never throws) if the socket is closed/erroring. */
53
- private rawSend;
54
- close(): Promise<void>;
55
- /** Re-establish the socket and replay open terminal + in-flight runs (docs §14). */
56
- resume(state: ResumeState): Promise<void>;
57
- private open;
58
- private handleClose;
59
- private reconnect;
60
- private dispatch;
61
- private flushOutbox;
62
- private bearer;
63
- private appendToken;
64
- }
65
- export {};
66
- //# sourceMappingURL=ws-stream-transport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-stream-transport.d.ts","sourceRoot":"","sources":["../../src/transport/ws-stream-transport.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAgB,MAAM,IAAI,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EAEd,WAAW,EACX,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAW,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGxD,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC;AAE7E,qBAAa,iBAAkB,YAAW,UAAU;IAehD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B;;uGAEmG;IACnG,OAAO,CAAC,QAAQ,CAAC,IAAI;IAnBvB,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,oFAAoF;IACpF,QAAQ,CAAC,aAAa,gBAAuB;gBAG3C,OAAO,EAAE,OAAO,EACC,IAAI,EAAE,YAAY,EAClB,SAAS,GAAE,SAA4B;IACxD;;uGAEmG;IAClF,IAAI,GAAE;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB;mGAC2F;QAC3F,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,GAAG,aAAa,KAAK,IAAI,CAAC;KACnD;IAKR,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW;IAU1F;kGAC8F;IAC9F,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,WAAW;IAUjE,4FAA4F;IAC5F,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAI9C,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAIvE;;;6CAGyC;IACzC,OAAO,CAAC,OAAO;IAMf,uGAAuG;IACvG,OAAO,CAAC,OAAO;IAST,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,oFAAoF;IAC9E,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAYjC,IAAI;IAiClB,OAAO,CAAC,WAAW;YAeL,SAAS;IAavB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,WAAW;YASL,MAAM;IAMpB,OAAO,CAAC,WAAW;CAQpB"}
@@ -1,246 +0,0 @@
1
- // WsStreamTransport — the native-WebSocket StreamPort.
2
- //
3
- // SRP: speaks the frozen Envelope wire protocol over a single `ws` socket — connect, frame
4
- // encode/decode, typed pub/sub, send, and reconnect-with-resume. It does not interpret events
5
- // (terminal vs agent semantics live in higher layers); it only routes `{event,data,id}` envelopes to
6
- // registered handlers by event name.
7
- //
8
- // DIP: the Bearer token comes from the injected AuthProvider (carried in the handshake header AND as
9
- // `?token=` for proxies that strip Authorization on upgrade — both are accepted by the host per the
10
- // frozen contract). Auth-agnostic: identical for LOCAL PAT and REMOTE Hydra JWT.
11
- //
12
- // Reconnect: composes `Backoff` + `ResumeTracker` (reconnect.ts). On an unexpected close it backs off
13
- // and re-opens, then replays ResumeState so terminals/agent runs continue across pod drains.
14
- import { WebSocket } from "ws";
15
- import { wsUrlFor } from "../config/profile.js";
16
- import { CliError } from "../core/errors.js";
17
- import { Backoff, ResumeTracker } from "./reconnect.js";
18
- export class WsStreamTransport {
19
- auth;
20
- wsFactory;
21
- opts;
22
- ws;
23
- url;
24
- handlers = new Map();
25
- outbox = [];
26
- nextId = 1;
27
- closing = false;
28
- reconnecting = false;
29
- connectPromise;
30
- backoff = new Backoff();
31
- /** Public so the TerminalPort façade (and resume) can record terminal/run state. */
32
- resumeTracker = new ResumeTracker();
33
- constructor(profile, auth, wsFactory = defaultWsFactory,
34
- /** Scope the socket to a project (`?project=`) and, for ephemeral sessions, mark it `?ephemeral=1`
35
- * so the host reaps the project when this connection drops. `onStatus` surfaces auto-reconnect
36
- * transitions so a long-lived command (e.g. the session) can show "reconnecting…/reconnected". */
37
- opts = {}) {
38
- this.auth = auth;
39
- this.wsFactory = wsFactory;
40
- this.opts = opts;
41
- this.url = wsUrlFor(profile);
42
- }
43
- get connected() {
44
- return this.ws?.readyState === WebSocket.OPEN;
45
- }
46
- async connect() {
47
- if (this.connected)
48
- return;
49
- if (this.connectPromise)
50
- return this.connectPromise;
51
- this.closing = false;
52
- this.connectPromise = this.open().finally(() => {
53
- this.connectPromise = undefined;
54
- });
55
- return this.connectPromise;
56
- }
57
- on(event, fn) {
58
- const set = this.handlers.get(event) ?? new Set();
59
- set.add(fn);
60
- this.handlers.set(event, set);
61
- return () => {
62
- set.delete(fn);
63
- if (set.size === 0)
64
- this.handlers.delete(event);
65
- };
66
- }
67
- /** Subscribe to an event by raw string name (escape hatch outside the frozen ServerEventMap). Used
68
- * for the device:terminal:* relay leg, which is intentionally NOT in the frozen contract. */
69
- onRaw(event, fn) {
70
- const set = this.handlers.get(event) ?? new Set();
71
- set.add(fn);
72
- this.handlers.set(event, set);
73
- return () => {
74
- set.delete(fn);
75
- if (set.size === 0)
76
- this.handlers.delete(event);
77
- };
78
- }
79
- /** Send an event by raw string name (escape hatch; see onRaw). Same buffering as send(). */
80
- sendRaw(event, payload) {
81
- this.enqueue({ event, data: payload, id: this.nextId++ });
82
- }
83
- send(event, payload) {
84
- this.enqueue({ event, data: payload, id: this.nextId++ });
85
- }
86
- /** Fire-and-forget write. MUST NOT throw: a socket that drops mid-send (common in the relay, e.g. a
87
- * device responder replying as the peer disconnects) would otherwise reject the caller's promise and —
88
- * with these handlers registered as `void` — crash the process, killing reconnection. On any failure we
89
- * buffer for the next flush instead. */
90
- enqueue(envelope) {
91
- if (this.connected && this.rawSend(envelope))
92
- return;
93
- this.outbox.push(envelope);
94
- if (!this.connected)
95
- void this.connect();
96
- }
97
- /** Write one envelope to the socket; returns false (never throws) if the socket is closed/erroring. */
98
- rawSend(env) {
99
- try {
100
- this.ws.send(JSON.stringify(env));
101
- return true;
102
- }
103
- catch {
104
- return false;
105
- }
106
- }
107
- async close() {
108
- this.closing = true;
109
- this.handlers.clear();
110
- this.outbox.length = 0;
111
- const ws = this.ws;
112
- this.ws = undefined;
113
- if (!ws)
114
- return;
115
- await new Promise((resolve) => {
116
- ws.once("close", () => resolve());
117
- try {
118
- ws.close(1000, "client-close");
119
- }
120
- catch {
121
- resolve();
122
- }
123
- });
124
- }
125
- /** Re-establish the socket and replay open terminal + in-flight runs (docs §14). */
126
- async resume(state) {
127
- await this.connect();
128
- if (state.terminal) {
129
- // Re-create the PTY; the frozen contract has no "attach by id", so we re-open (events.md).
130
- this.send("terminal:create", { cols: state.terminal.cols, rows: state.terminal.rows });
131
- }
132
- // Agent runs resume implicitly by continuing to filter agent:* envelopes for the runIds; the
133
- // ResumeTracker already holds them so higher layers keep their subscriptions.
134
- }
135
- // ── socket lifecycle ─────────────────────────────────────────────────────────
136
- async open() {
137
- const token = await this.bearer();
138
- // Token in BOTH the handshake header and the query (?token=) per the frozen contract, so it works
139
- // whether or not an intermediary preserves the Authorization header on the WS upgrade.
140
- const urlWithToken = this.appendToken(this.url, token);
141
- const ws = this.wsFactory(urlWithToken, { authorization: `Bearer ${token}` });
142
- this.ws = ws;
143
- await new Promise((resolve, reject) => {
144
- const onOpen = () => {
145
- this.backoff.reset();
146
- this.flushOutbox();
147
- cleanup();
148
- resolve();
149
- };
150
- const onError = (err) => {
151
- cleanup();
152
- reject(CliError.network(`WebSocket connection to ${this.url} failed.`, err));
153
- };
154
- const cleanup = () => {
155
- ws.off("open", onOpen);
156
- ws.off("error", onError);
157
- };
158
- ws.once("open", onOpen);
159
- ws.once("error", onError);
160
- });
161
- ws.on("message", (raw) => this.dispatch(raw));
162
- ws.on("close", () => this.handleClose());
163
- // Swallow post-open errors here; the close handler drives reconnect.
164
- ws.on("error", () => undefined);
165
- }
166
- handleClose() {
167
- this.ws = undefined;
168
- if (this.closing)
169
- return;
170
- if (!this.backoff.canRetry)
171
- return;
172
- if (!this.reconnecting) {
173
- this.reconnecting = true;
174
- this.opts.onStatus?.("reconnecting");
175
- }
176
- const delay = this.backoff.next();
177
- setTimeout(() => {
178
- if (this.closing)
179
- return;
180
- void this.reconnect();
181
- }, delay).unref?.();
182
- }
183
- async reconnect() {
184
- try {
185
- await this.open();
186
- this.reconnecting = false;
187
- this.opts.onStatus?.("reconnected");
188
- // Replay state captured by the tracker (open terminal, in-flight runs).
189
- await this.resume(this.resumeTracker.snapshot());
190
- }
191
- catch {
192
- // open() failure already schedules nothing; trigger the backoff loop again.
193
- this.handleClose();
194
- }
195
- }
196
- dispatch(raw) {
197
- let envelope;
198
- try {
199
- envelope = JSON.parse(raw.toString());
200
- }
201
- catch {
202
- return; // ignore malformed frames rather than crash the stream
203
- }
204
- const set = this.handlers.get(envelope.event);
205
- if (!set)
206
- return;
207
- for (const fn of set) {
208
- try {
209
- fn(envelope.data);
210
- }
211
- catch {
212
- // A faulty handler must not tear down the socket or starve other subscribers.
213
- }
214
- }
215
- }
216
- flushOutbox() {
217
- if (!this.connected)
218
- return;
219
- while (this.outbox.length) {
220
- // Stop on the first failed write (socket died again) — keep the rest buffered for the next reconnect.
221
- if (!this.rawSend(this.outbox[0]))
222
- break;
223
- this.outbox.shift();
224
- }
225
- }
226
- async bearer() {
227
- // Reuse the header logic but strip the scheme; AuthProvider may refresh here.
228
- const header = await this.auth.getAuthHeader();
229
- return header.replace(/^Bearer\s+/i, "");
230
- }
231
- appendToken(url, token) {
232
- const u = new URL(url);
233
- u.searchParams.set("token", token);
234
- if (this.opts.project)
235
- u.searchParams.set("project", this.opts.project);
236
- if (this.opts.ephemeral)
237
- u.searchParams.set("ephemeral", "1");
238
- if (this.opts.role)
239
- u.searchParams.set("role", this.opts.role);
240
- return u.toString();
241
- }
242
- }
243
- function defaultWsFactory(url, headers) {
244
- return new WebSocket(url, { headers });
245
- }
246
- //# sourceMappingURL=ws-stream-transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-stream-transport.js","sourceRoot":"","sources":["../../src/transport/ws-stream-transport.ts"],"names":[],"mappings":"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"}