@tt-a1i/hive 0.6.0-alpha.0

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 (326) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +202 -0
  3. package/README.md +175 -0
  4. package/SECURITY.md +48 -0
  5. package/dist/bin/team +7 -0
  6. package/dist/bin/team.cmd +2 -0
  7. package/dist/src/cli/hive.d.ts +9 -0
  8. package/dist/src/cli/hive.js +104 -0
  9. package/dist/src/cli/hive.js.map +1 -0
  10. package/dist/src/cli/team.d.ts +1 -0
  11. package/dist/src/cli/team.js +137 -0
  12. package/dist/src/cli/team.js.map +1 -0
  13. package/dist/src/server/agent-command-resolver.d.ts +8 -0
  14. package/dist/src/server/agent-command-resolver.js +72 -0
  15. package/dist/src/server/agent-command-resolver.js.map +1 -0
  16. package/dist/src/server/agent-launch-cache.d.ts +20 -0
  17. package/dist/src/server/agent-launch-cache.js +55 -0
  18. package/dist/src/server/agent-launch-cache.js.map +1 -0
  19. package/dist/src/server/agent-manager-support.d.ts +7 -0
  20. package/dist/src/server/agent-manager-support.js +68 -0
  21. package/dist/src/server/agent-manager-support.js.map +1 -0
  22. package/dist/src/server/agent-manager.d.ts +51 -0
  23. package/dist/src/server/agent-manager.js +92 -0
  24. package/dist/src/server/agent-manager.js.map +1 -0
  25. package/dist/src/server/agent-run-bootstrap.d.ts +62 -0
  26. package/dist/src/server/agent-run-bootstrap.js +64 -0
  27. package/dist/src/server/agent-run-bootstrap.js.map +1 -0
  28. package/dist/src/server/agent-run-exit-handler.d.ts +8 -0
  29. package/dist/src/server/agent-run-exit-handler.js +27 -0
  30. package/dist/src/server/agent-run-exit-handler.js.map +1 -0
  31. package/dist/src/server/agent-run-start-context.d.ts +24 -0
  32. package/dist/src/server/agent-run-start-context.js +2 -0
  33. package/dist/src/server/agent-run-start-context.js.map +1 -0
  34. package/dist/src/server/agent-run-starter.d.ts +23 -0
  35. package/dist/src/server/agent-run-starter.js +117 -0
  36. package/dist/src/server/agent-run-starter.js.map +1 -0
  37. package/dist/src/server/agent-run-store.d.ts +47 -0
  38. package/dist/src/server/agent-run-store.js +131 -0
  39. package/dist/src/server/agent-run-store.js.map +1 -0
  40. package/dist/src/server/agent-run-sync.d.ts +10 -0
  41. package/dist/src/server/agent-run-sync.js +25 -0
  42. package/dist/src/server/agent-run-sync.js.map +1 -0
  43. package/dist/src/server/agent-runtime-active-run.d.ts +3 -0
  44. package/dist/src/server/agent-runtime-active-run.js +11 -0
  45. package/dist/src/server/agent-runtime-active-run.js.map +1 -0
  46. package/dist/src/server/agent-runtime-close.d.ts +4 -0
  47. package/dist/src/server/agent-runtime-close.js +15 -0
  48. package/dist/src/server/agent-runtime-close.js.map +1 -0
  49. package/dist/src/server/agent-runtime-contract.d.ts +31 -0
  50. package/dist/src/server/agent-runtime-contract.js +2 -0
  51. package/dist/src/server/agent-runtime-contract.js.map +1 -0
  52. package/dist/src/server/agent-runtime-flow-adapter.d.ts +10 -0
  53. package/dist/src/server/agent-runtime-flow-adapter.js +15 -0
  54. package/dist/src/server/agent-runtime-flow-adapter.js.map +1 -0
  55. package/dist/src/server/agent-runtime-list-runs.d.ts +3 -0
  56. package/dist/src/server/agent-runtime-list-runs.js +19 -0
  57. package/dist/src/server/agent-runtime-list-runs.js.map +1 -0
  58. package/dist/src/server/agent-runtime-ports.d.ts +22 -0
  59. package/dist/src/server/agent-runtime-ports.js +2 -0
  60. package/dist/src/server/agent-runtime-ports.js.map +1 -0
  61. package/dist/src/server/agent-runtime-stop-run.d.ts +4 -0
  62. package/dist/src/server/agent-runtime-stop-run.js +17 -0
  63. package/dist/src/server/agent-runtime-stop-run.js.map +1 -0
  64. package/dist/src/server/agent-runtime-types.d.ts +4 -0
  65. package/dist/src/server/agent-runtime-types.js +2 -0
  66. package/dist/src/server/agent-runtime-types.js.map +1 -0
  67. package/dist/src/server/agent-runtime.d.ts +8 -0
  68. package/dist/src/server/agent-runtime.js +101 -0
  69. package/dist/src/server/agent-runtime.js.map +1 -0
  70. package/dist/src/server/agent-session-store.d.ts +7 -0
  71. package/dist/src/server/agent-session-store.js +52 -0
  72. package/dist/src/server/agent-session-store.js.map +1 -0
  73. package/dist/src/server/agent-startup-instructions.d.ts +13 -0
  74. package/dist/src/server/agent-startup-instructions.js +26 -0
  75. package/dist/src/server/agent-startup-instructions.js.map +1 -0
  76. package/dist/src/server/agent-stdin-dispatcher.d.ts +19 -0
  77. package/dist/src/server/agent-stdin-dispatcher.js +60 -0
  78. package/dist/src/server/agent-stdin-dispatcher.js.map +1 -0
  79. package/dist/src/server/agent-tokens.d.ts +15 -0
  80. package/dist/src/server/agent-tokens.js +26 -0
  81. package/dist/src/server/agent-tokens.js.map +1 -0
  82. package/dist/src/server/app-state-store.d.ts +10 -0
  83. package/dist/src/server/app-state-store.js +15 -0
  84. package/dist/src/server/app-state-store.js.map +1 -0
  85. package/dist/src/server/app.d.ts +14 -0
  86. package/dist/src/server/app.js +118 -0
  87. package/dist/src/server/app.js.map +1 -0
  88. package/dist/src/server/claude-command-defaults.d.ts +1 -0
  89. package/dist/src/server/claude-command-defaults.js +6 -0
  90. package/dist/src/server/claude-command-defaults.js.map +1 -0
  91. package/dist/src/server/claude-session-coordinator.d.ts +10 -0
  92. package/dist/src/server/claude-session-coordinator.js +69 -0
  93. package/dist/src/server/claude-session-coordinator.js.map +1 -0
  94. package/dist/src/server/claude-session-support.d.ts +1 -0
  95. package/dist/src/server/claude-session-support.js +2 -0
  96. package/dist/src/server/claude-session-support.js.map +1 -0
  97. package/dist/src/server/command-preset-defaults.d.ts +11 -0
  98. package/dist/src/server/command-preset-defaults.js +52 -0
  99. package/dist/src/server/command-preset-defaults.js.map +1 -0
  100. package/dist/src/server/command-preset-store.d.ts +49 -0
  101. package/dist/src/server/command-preset-store.js +90 -0
  102. package/dist/src/server/command-preset-store.js.map +1 -0
  103. package/dist/src/server/dispatch-ledger-serializer.d.ts +15 -0
  104. package/dist/src/server/dispatch-ledger-serializer.js +15 -0
  105. package/dist/src/server/dispatch-ledger-serializer.js.map +1 -0
  106. package/dist/src/server/dispatch-ledger-store.d.ts +45 -0
  107. package/dist/src/server/dispatch-ledger-store.js +196 -0
  108. package/dist/src/server/dispatch-ledger-store.js.map +1 -0
  109. package/dist/src/server/env-sync-message.d.ts +9 -0
  110. package/dist/src/server/env-sync-message.js +30 -0
  111. package/dist/src/server/env-sync-message.js.map +1 -0
  112. package/dist/src/server/fs-browse.d.ts +25 -0
  113. package/dist/src/server/fs-browse.js +130 -0
  114. package/dist/src/server/fs-browse.js.map +1 -0
  115. package/dist/src/server/fs-pick-folder.d.ts +25 -0
  116. package/dist/src/server/fs-pick-folder.js +132 -0
  117. package/dist/src/server/fs-pick-folder.js.map +1 -0
  118. package/dist/src/server/fs-sandbox.d.ts +13 -0
  119. package/dist/src/server/fs-sandbox.js +26 -0
  120. package/dist/src/server/fs-sandbox.js.map +1 -0
  121. package/dist/src/server/hive-team-guidance.d.ts +2 -0
  122. package/dist/src/server/hive-team-guidance.js +14 -0
  123. package/dist/src/server/hive-team-guidance.js.map +1 -0
  124. package/dist/src/server/http-errors.d.ts +16 -0
  125. package/dist/src/server/http-errors.js +33 -0
  126. package/dist/src/server/http-errors.js.map +1 -0
  127. package/dist/src/server/live-run-registry.d.ts +21 -0
  128. package/dist/src/server/live-run-registry.js +53 -0
  129. package/dist/src/server/live-run-registry.js.map +1 -0
  130. package/dist/src/server/message-log-store.d.ts +48 -0
  131. package/dist/src/server/message-log-store.js +144 -0
  132. package/dist/src/server/message-log-store.js.map +1 -0
  133. package/dist/src/server/orchestrator-autostart.d.ts +30 -0
  134. package/dist/src/server/orchestrator-autostart.js +103 -0
  135. package/dist/src/server/orchestrator-autostart.js.map +1 -0
  136. package/dist/src/server/orchestrator-launch.d.ts +22 -0
  137. package/dist/src/server/orchestrator-launch.js +75 -0
  138. package/dist/src/server/orchestrator-launch.js.map +1 -0
  139. package/dist/src/server/post-start-input-writer.d.ts +6 -0
  140. package/dist/src/server/post-start-input-writer.js +118 -0
  141. package/dist/src/server/post-start-input-writer.js.map +1 -0
  142. package/dist/src/server/preset-launch-support.d.ts +6 -0
  143. package/dist/src/server/preset-launch-support.js +67 -0
  144. package/dist/src/server/preset-launch-support.js.map +1 -0
  145. package/dist/src/server/pty-output-bus.d.ts +8 -0
  146. package/dist/src/server/pty-output-bus.js +33 -0
  147. package/dist/src/server/pty-output-bus.js.map +1 -0
  148. package/dist/src/server/recovery-summary.d.ts +10 -0
  149. package/dist/src/server/recovery-summary.js +89 -0
  150. package/dist/src/server/recovery-summary.js.map +1 -0
  151. package/dist/src/server/restart-policy-support.d.ts +23 -0
  152. package/dist/src/server/restart-policy-support.js +12 -0
  153. package/dist/src/server/restart-policy-support.js.map +1 -0
  154. package/dist/src/server/restart-policy.d.ts +14 -0
  155. package/dist/src/server/restart-policy.js +42 -0
  156. package/dist/src/server/restart-policy.js.map +1 -0
  157. package/dist/src/server/role-template-store.d.ts +44 -0
  158. package/dist/src/server/role-template-store.js +71 -0
  159. package/dist/src/server/role-template-store.js.map +1 -0
  160. package/dist/src/server/role-templates.d.ts +7 -0
  161. package/dist/src/server/role-templates.js +55 -0
  162. package/dist/src/server/role-templates.js.map +1 -0
  163. package/dist/src/server/route-helpers.d.ts +7 -0
  164. package/dist/src/server/route-helpers.js +48 -0
  165. package/dist/src/server/route-helpers.js.map +1 -0
  166. package/dist/src/server/route-types.d.ts +58 -0
  167. package/dist/src/server/route-types.js +2 -0
  168. package/dist/src/server/route-types.js.map +1 -0
  169. package/dist/src/server/routes-dispatches.d.ts +2 -0
  170. package/dist/src/server/routes-dispatches.js +53 -0
  171. package/dist/src/server/routes-dispatches.js.map +1 -0
  172. package/dist/src/server/routes-fs.d.ts +2 -0
  173. package/dist/src/server/routes-fs.js +25 -0
  174. package/dist/src/server/routes-fs.js.map +1 -0
  175. package/dist/src/server/routes-runtime.d.ts +2 -0
  176. package/dist/src/server/routes-runtime.js +46 -0
  177. package/dist/src/server/routes-runtime.js.map +1 -0
  178. package/dist/src/server/routes-settings.d.ts +2 -0
  179. package/dist/src/server/routes-settings.js +124 -0
  180. package/dist/src/server/routes-settings.js.map +1 -0
  181. package/dist/src/server/routes-tasks.d.ts +2 -0
  182. package/dist/src/server/routes-tasks.js +25 -0
  183. package/dist/src/server/routes-tasks.js.map +1 -0
  184. package/dist/src/server/routes-team.d.ts +2 -0
  185. package/dist/src/server/routes-team.js +50 -0
  186. package/dist/src/server/routes-team.js.map +1 -0
  187. package/dist/src/server/routes-ui.d.ts +2 -0
  188. package/dist/src/server/routes-ui.js +8 -0
  189. package/dist/src/server/routes-ui.js.map +1 -0
  190. package/dist/src/server/routes-workspaces.d.ts +2 -0
  191. package/dist/src/server/routes-workspaces.js +154 -0
  192. package/dist/src/server/routes-workspaces.js.map +1 -0
  193. package/dist/src/server/routes.d.ts +6 -0
  194. package/dist/src/server/routes.js +36 -0
  195. package/dist/src/server/routes.js.map +1 -0
  196. package/dist/src/server/runtime-database.d.ts +2 -0
  197. package/dist/src/server/runtime-database.js +13 -0
  198. package/dist/src/server/runtime-database.js.map +1 -0
  199. package/dist/src/server/runtime-message-builders.d.ts +6 -0
  200. package/dist/src/server/runtime-message-builders.js +52 -0
  201. package/dist/src/server/runtime-message-builders.js.map +1 -0
  202. package/dist/src/server/runtime-restart-policy.d.ts +14 -0
  203. package/dist/src/server/runtime-restart-policy.js +11 -0
  204. package/dist/src/server/runtime-restart-policy.js.map +1 -0
  205. package/dist/src/server/runtime-store-helpers.d.ts +71 -0
  206. package/dist/src/server/runtime-store-helpers.js +174 -0
  207. package/dist/src/server/runtime-store-helpers.js.map +1 -0
  208. package/dist/src/server/runtime-store.d.ts +70 -0
  209. package/dist/src/server/runtime-store.js +82 -0
  210. package/dist/src/server/runtime-store.js.map +1 -0
  211. package/dist/src/server/session-capture-claude.d.ts +11 -0
  212. package/dist/src/server/session-capture-claude.js +78 -0
  213. package/dist/src/server/session-capture-claude.js.map +1 -0
  214. package/dist/src/server/session-capture-codex.d.ts +5 -0
  215. package/dist/src/server/session-capture-codex.js +72 -0
  216. package/dist/src/server/session-capture-codex.js.map +1 -0
  217. package/dist/src/server/session-capture-gemini.d.ts +5 -0
  218. package/dist/src/server/session-capture-gemini.js +80 -0
  219. package/dist/src/server/session-capture-gemini.js.map +1 -0
  220. package/dist/src/server/session-capture-opencode.d.ts +4 -0
  221. package/dist/src/server/session-capture-opencode.js +43 -0
  222. package/dist/src/server/session-capture-opencode.js.map +1 -0
  223. package/dist/src/server/session-capture.d.ts +71 -0
  224. package/dist/src/server/session-capture.js +92 -0
  225. package/dist/src/server/session-capture.js.map +1 -0
  226. package/dist/src/server/settings-store.d.ts +19 -0
  227. package/dist/src/server/settings-store.js +22 -0
  228. package/dist/src/server/settings-store.js.map +1 -0
  229. package/dist/src/server/sqlite-schema-v10.d.ts +2 -0
  230. package/dist/src/server/sqlite-schema-v10.js +14 -0
  231. package/dist/src/server/sqlite-schema-v10.js.map +1 -0
  232. package/dist/src/server/sqlite-schema-v11.d.ts +2 -0
  233. package/dist/src/server/sqlite-schema-v11.js +11 -0
  234. package/dist/src/server/sqlite-schema-v11.js.map +1 -0
  235. package/dist/src/server/sqlite-schema-v12.d.ts +2 -0
  236. package/dist/src/server/sqlite-schema-v12.js +22 -0
  237. package/dist/src/server/sqlite-schema-v12.js.map +1 -0
  238. package/dist/src/server/sqlite-schema-v13.d.ts +2 -0
  239. package/dist/src/server/sqlite-schema-v13.js +5 -0
  240. package/dist/src/server/sqlite-schema-v13.js.map +1 -0
  241. package/dist/src/server/sqlite-schema-v14.d.ts +2 -0
  242. package/dist/src/server/sqlite-schema-v14.js +85 -0
  243. package/dist/src/server/sqlite-schema-v14.js.map +1 -0
  244. package/dist/src/server/sqlite-schema-v5.d.ts +2 -0
  245. package/dist/src/server/sqlite-schema-v5.js +62 -0
  246. package/dist/src/server/sqlite-schema-v5.js.map +1 -0
  247. package/dist/src/server/sqlite-schema-v7.d.ts +2 -0
  248. package/dist/src/server/sqlite-schema-v7.js +71 -0
  249. package/dist/src/server/sqlite-schema-v7.js.map +1 -0
  250. package/dist/src/server/sqlite-schema-v8.d.ts +2 -0
  251. package/dist/src/server/sqlite-schema-v8.js +7 -0
  252. package/dist/src/server/sqlite-schema-v8.js.map +1 -0
  253. package/dist/src/server/sqlite-schema-v9.d.ts +2 -0
  254. package/dist/src/server/sqlite-schema-v9.js +7 -0
  255. package/dist/src/server/sqlite-schema-v9.js.map +1 -0
  256. package/dist/src/server/sqlite-schema.d.ts +3 -0
  257. package/dist/src/server/sqlite-schema.js +185 -0
  258. package/dist/src/server/sqlite-schema.js.map +1 -0
  259. package/dist/src/server/system-message.d.ts +1 -0
  260. package/dist/src/server/system-message.js +2 -0
  261. package/dist/src/server/system-message.js.map +1 -0
  262. package/dist/src/server/tasks-file-watcher.d.ts +8 -0
  263. package/dist/src/server/tasks-file-watcher.js +60 -0
  264. package/dist/src/server/tasks-file-watcher.js.map +1 -0
  265. package/dist/src/server/tasks-file.d.ts +11 -0
  266. package/dist/src/server/tasks-file.js +33 -0
  267. package/dist/src/server/tasks-file.js.map +1 -0
  268. package/dist/src/server/tasks-websocket-server.d.ts +7 -0
  269. package/dist/src/server/tasks-websocket-server.js +72 -0
  270. package/dist/src/server/tasks-websocket-server.js.map +1 -0
  271. package/dist/src/server/team-authz.d.ts +13 -0
  272. package/dist/src/server/team-authz.js +33 -0
  273. package/dist/src/server/team-authz.js.map +1 -0
  274. package/dist/src/server/team-list-serializer.d.ts +8 -0
  275. package/dist/src/server/team-list-serializer.js +8 -0
  276. package/dist/src/server/team-list-serializer.js.map +1 -0
  277. package/dist/src/server/team-operations.d.ts +41 -0
  278. package/dist/src/server/team-operations.js +105 -0
  279. package/dist/src/server/team-operations.js.map +1 -0
  280. package/dist/src/server/terminal-flow-control.d.ts +19 -0
  281. package/dist/src/server/terminal-flow-control.js +117 -0
  282. package/dist/src/server/terminal-flow-control.js.map +1 -0
  283. package/dist/src/server/terminal-protocol.d.ts +29 -0
  284. package/dist/src/server/terminal-protocol.js +42 -0
  285. package/dist/src/server/terminal-protocol.js.map +1 -0
  286. package/dist/src/server/terminal-state-mirror.d.ts +15 -0
  287. package/dist/src/server/terminal-state-mirror.js +47 -0
  288. package/dist/src/server/terminal-state-mirror.js.map +1 -0
  289. package/dist/src/server/terminal-stream-hub.d.ts +9 -0
  290. package/dist/src/server/terminal-stream-hub.js +179 -0
  291. package/dist/src/server/terminal-stream-hub.js.map +1 -0
  292. package/dist/src/server/terminal-ws-server.d.ts +5 -0
  293. package/dist/src/server/terminal-ws-server.js +85 -0
  294. package/dist/src/server/terminal-ws-server.js.map +1 -0
  295. package/dist/src/server/ui-auth-helpers.d.ts +4 -0
  296. package/dist/src/server/ui-auth-helpers.js +23 -0
  297. package/dist/src/server/ui-auth-helpers.js.map +1 -0
  298. package/dist/src/server/ui-auth.d.ts +5 -0
  299. package/dist/src/server/ui-auth.js +13 -0
  300. package/dist/src/server/ui-auth.js.map +1 -0
  301. package/dist/src/server/workspace-store-contract.d.ts +28 -0
  302. package/dist/src/server/workspace-store-contract.js +2 -0
  303. package/dist/src/server/workspace-store-contract.js.map +1 -0
  304. package/dist/src/server/workspace-store-hydration.d.ts +5 -0
  305. package/dist/src/server/workspace-store-hydration.js +64 -0
  306. package/dist/src/server/workspace-store-hydration.js.map +1 -0
  307. package/dist/src/server/workspace-store-mutations.d.ts +13 -0
  308. package/dist/src/server/workspace-store-mutations.js +49 -0
  309. package/dist/src/server/workspace-store-mutations.js.map +1 -0
  310. package/dist/src/server/workspace-store-support.d.ts +29 -0
  311. package/dist/src/server/workspace-store-support.js +25 -0
  312. package/dist/src/server/workspace-store-support.js.map +1 -0
  313. package/dist/src/server/workspace-store.d.ts +5 -0
  314. package/dist/src/server/workspace-store.js +114 -0
  315. package/dist/src/server/workspace-store.js.map +1 -0
  316. package/dist/src/shared/types.d.ts +36 -0
  317. package/dist/src/shared/types.js +2 -0
  318. package/dist/src/shared/types.js.map +1 -0
  319. package/package.json +108 -0
  320. package/scripts/fix-runtime-artifacts.mjs +33 -0
  321. package/web/dist/assets/addon-fit-DX4qG4td.js +1 -0
  322. package/web/dist/assets/index-CjlaoOoA.css +1 -0
  323. package/web/dist/assets/index-CwdRvXrs.js +63 -0
  324. package/web/dist/assets/xterm-B-qIQCd3.js +16 -0
  325. package/web/dist/favicon.svg +58 -0
  326. package/web/dist/index.html +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-operations.js","sourceRoot":"","sources":["../../../src/server/team-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type WebSocket from 'ws';
2
+ export declare const FLOW_CONTROL: {
3
+ readonly BATCH_INTERVAL_MS: 4;
4
+ readonly LOW_LATENCY_THRESHOLD_BYTES: 256;
5
+ readonly WS_BUFFERED_HIGH_WATER: number;
6
+ readonly WS_BUFFERED_LOW_WATER: number;
7
+ readonly UNACKED_HIGH_WATER: number;
8
+ readonly UNACKED_LOW_WATER: number;
9
+ };
10
+ interface TerminalOutputFlowOptions {
11
+ onBackpressureChange: (backpressured: boolean) => void;
12
+ }
13
+ export interface TerminalOutputFlow {
14
+ ack: (bytes: number) => void;
15
+ close: () => void;
16
+ enqueue: (chunk: string) => void;
17
+ }
18
+ export declare const createTerminalOutputFlow: (ws: WebSocket, { onBackpressureChange }: TerminalOutputFlowOptions) => TerminalOutputFlow;
19
+ export {};
@@ -0,0 +1,117 @@
1
+ export const FLOW_CONTROL = {
2
+ BATCH_INTERVAL_MS: 4,
3
+ LOW_LATENCY_THRESHOLD_BYTES: 256,
4
+ WS_BUFFERED_HIGH_WATER: 16 * 1024,
5
+ WS_BUFFERED_LOW_WATER: 8 * 1024,
6
+ UNACKED_HIGH_WATER: 100 * 1024,
7
+ UNACKED_LOW_WATER: 50 * 1024,
8
+ };
9
+ const LOW_LATENCY_IDLE_WINDOW_MS = 5;
10
+ const RESUME_CHECK_INTERVAL_MS = 16;
11
+ const getTransportSocket = (ws) => {
12
+ return (ws._socket ?? null);
13
+ };
14
+ const byteLength = (chunk) => Buffer.byteLength(chunk, 'utf8');
15
+ export const createTerminalOutputFlow = (ws, { onBackpressureChange }) => {
16
+ let closed = false;
17
+ let flushTimer = null;
18
+ let lastSentAt = 0;
19
+ let pendingChunks = [];
20
+ let resumeCheckTimer = null;
21
+ let paused = false;
22
+ let unackedBytes = 0;
23
+ const shouldPause = () => {
24
+ return (ws.bufferedAmount >= FLOW_CONTROL.WS_BUFFERED_HIGH_WATER ||
25
+ unackedBytes >= FLOW_CONTROL.UNACKED_HIGH_WATER);
26
+ };
27
+ const canResume = () => {
28
+ return (ws.bufferedAmount < FLOW_CONTROL.WS_BUFFERED_LOW_WATER &&
29
+ unackedBytes < FLOW_CONTROL.UNACKED_LOW_WATER);
30
+ };
31
+ const clearResumeCheck = () => {
32
+ if (resumeCheckTimer)
33
+ clearTimeout(resumeCheckTimer);
34
+ resumeCheckTimer = null;
35
+ getTransportSocket(ws)?.removeListener('drain', checkResume);
36
+ };
37
+ const scheduleResumeCheck = () => {
38
+ if (!paused || closed)
39
+ return;
40
+ clearResumeCheck();
41
+ getTransportSocket(ws)?.once('drain', checkResume);
42
+ resumeCheckTimer = setTimeout(checkResume, RESUME_CHECK_INTERVAL_MS);
43
+ };
44
+ const checkResume = () => {
45
+ if (!paused || closed) {
46
+ clearResumeCheck();
47
+ return;
48
+ }
49
+ if (canResume()) {
50
+ paused = false;
51
+ clearResumeCheck();
52
+ onBackpressureChange(false);
53
+ return;
54
+ }
55
+ scheduleResumeCheck();
56
+ };
57
+ const afterSend = (bytes) => {
58
+ if (closed || paused)
59
+ return;
60
+ unackedBytes += bytes;
61
+ if (shouldPause()) {
62
+ paused = true;
63
+ onBackpressureChange(true);
64
+ scheduleResumeCheck();
65
+ }
66
+ };
67
+ const sendChunk = (chunk) => {
68
+ if (closed || ws.readyState !== ws.OPEN)
69
+ return;
70
+ ws.send(chunk);
71
+ lastSentAt = Date.now();
72
+ afterSend(byteLength(chunk));
73
+ };
74
+ const flush = () => {
75
+ flushTimer = null;
76
+ if (pendingChunks.length === 0)
77
+ return;
78
+ const chunk = pendingChunks.join('');
79
+ pendingChunks = [];
80
+ sendChunk(chunk);
81
+ };
82
+ return {
83
+ ack(bytes) {
84
+ unackedBytes = Math.max(0, unackedBytes - Math.max(0, Math.floor(bytes)));
85
+ checkResume();
86
+ },
87
+ close() {
88
+ closed = true;
89
+ if (flushTimer)
90
+ clearTimeout(flushTimer);
91
+ flushTimer = null;
92
+ clearResumeCheck();
93
+ if (paused) {
94
+ paused = false;
95
+ onBackpressureChange(false);
96
+ }
97
+ pendingChunks = [];
98
+ },
99
+ enqueue(chunk) {
100
+ if (closed)
101
+ return;
102
+ const now = Date.now();
103
+ const isLowLatency = pendingChunks.length === 0 &&
104
+ flushTimer === null &&
105
+ byteLength(chunk) < FLOW_CONTROL.LOW_LATENCY_THRESHOLD_BYTES &&
106
+ now - lastSentAt >= LOW_LATENCY_IDLE_WINDOW_MS;
107
+ if (isLowLatency) {
108
+ sendChunk(chunk);
109
+ return;
110
+ }
111
+ pendingChunks.push(chunk);
112
+ if (!flushTimer)
113
+ flushTimer = setTimeout(flush, FLOW_CONTROL.BATCH_INTERVAL_MS);
114
+ },
115
+ };
116
+ };
117
+ //# sourceMappingURL=terminal-flow-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-flow-control.js","sourceRoot":"","sources":["../../../src/server/terminal-flow-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ type TerminalControlClientMessage = {
2
+ type: 'output_ack';
3
+ bytes: number;
4
+ } | {
5
+ type: 'resize';
6
+ cols: number;
7
+ rows: number;
8
+ pixelWidth?: number;
9
+ pixelHeight?: number;
10
+ } | {
11
+ type: 'restore_complete';
12
+ } | {
13
+ type: 'stop';
14
+ };
15
+ type TerminalControlServerMessage = {
16
+ type: 'error';
17
+ message: string;
18
+ } | {
19
+ type: 'exit';
20
+ code: number | null;
21
+ } | {
22
+ type: 'restore';
23
+ snapshot: string;
24
+ };
25
+ export declare const parseTerminalControlMessage: (raw: Buffer | string) => TerminalControlClientMessage;
26
+ export declare const serializeTerminalError: (message: string) => string;
27
+ export declare const serializeTerminalExit: (code: number | null) => string;
28
+ export declare const serializeTerminalRestore: (snapshot: string) => string;
29
+ export type { TerminalControlClientMessage, TerminalControlServerMessage };
@@ -0,0 +1,42 @@
1
+ const asInteger = (value) => {
2
+ return typeof value === 'number' && Number.isInteger(value) ? value : undefined;
3
+ };
4
+ export const parseTerminalControlMessage = (raw) => {
5
+ const parsed = JSON.parse(raw.toString());
6
+ const { bytes, cols, rows, pixelHeight, pixelWidth } = parsed;
7
+ if (parsed.type === 'stop')
8
+ return { type: 'stop' };
9
+ if (parsed.type === 'restore_complete')
10
+ return { type: 'restore_complete' };
11
+ const ackBytes = asInteger(bytes);
12
+ if (parsed.type === 'output_ack' && ackBytes !== undefined && ackBytes >= 0) {
13
+ return { type: 'output_ack', bytes: ackBytes };
14
+ }
15
+ const resizeCols = asInteger(cols);
16
+ const resizeRows = asInteger(rows);
17
+ if (parsed.type === 'resize' && resizeCols !== undefined && resizeRows !== undefined) {
18
+ const message = {
19
+ type: 'resize',
20
+ cols: resizeCols,
21
+ rows: resizeRows,
22
+ };
23
+ const parsedPixelWidth = asInteger(pixelWidth);
24
+ const parsedPixelHeight = asInteger(pixelHeight);
25
+ if (parsedPixelWidth !== undefined)
26
+ message.pixelWidth = parsedPixelWidth;
27
+ if (parsedPixelHeight !== undefined)
28
+ message.pixelHeight = parsedPixelHeight;
29
+ return message;
30
+ }
31
+ throw new Error('Invalid terminal control message');
32
+ };
33
+ export const serializeTerminalError = (message) => {
34
+ return JSON.stringify({ type: 'error', message });
35
+ };
36
+ export const serializeTerminalExit = (code) => {
37
+ return JSON.stringify({ type: 'exit', code });
38
+ };
39
+ export const serializeTerminalRestore = (snapshot) => {
40
+ return JSON.stringify({ type: 'restore', snapshot });
41
+ };
42
+ //# sourceMappingURL=terminal-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-protocol.js","sourceRoot":"","sources":["../../../src/server/terminal-protocol.ts"],"names":[],"mappings":"AAWA,MAAM,SAAS,GAAG,CAAC,KAAc,EAAsB,EAAE;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACjF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAoB,EAAgC,EAAE;IAChG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAA+C,CAAA;IACvF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACnD,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB;QAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAA;IAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;IAChD,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACrF,MAAM,OAAO,GAAiC;YAC5C,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;SACjB,CAAA;QACD,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,iBAAiB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,gBAAgB,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAA;QACzE,IAAI,iBAAiB,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,GAAG,iBAAiB,CAAA;QAC5E,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAU,EAAE;IAChE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAyC,CAAC,CAAA;AAC1F,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAmB,EAAU,EAAE;IACnE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAyC,CAAC,CAAA;AACtF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACnE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAyC,CAAC,CAAA;AAC7F,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ export declare const TERMINAL_SCROLLBACK = 10000;
2
+ export interface TerminalMirrorSize {
3
+ cols: number;
4
+ rows: number;
5
+ }
6
+ export declare class TerminalStateMirror {
7
+ private readonly serializeAddon;
8
+ private readonly terminal;
9
+ private operationQueue;
10
+ constructor(size?: TerminalMirrorSize);
11
+ dispose(): void;
12
+ getSnapshot(): Promise<string>;
13
+ resize(cols: number, rows: number): void;
14
+ write(chunk: string): void;
15
+ }
@@ -0,0 +1,47 @@
1
+ import serializeAddonModule from '@xterm/addon-serialize';
2
+ import headlessTerminalModule from '@xterm/headless';
3
+ const { SerializeAddon } = serializeAddonModule;
4
+ const { Terminal } = headlessTerminalModule;
5
+ export const TERMINAL_SCROLLBACK = 10_000;
6
+ const normalizeTerminalSize = ({ cols, rows }) => ({
7
+ cols: Math.max(1, Math.floor(cols)),
8
+ rows: Math.max(1, Math.floor(rows)),
9
+ });
10
+ export class TerminalStateMirror {
11
+ serializeAddon = new SerializeAddon();
12
+ terminal;
13
+ operationQueue = Promise.resolve();
14
+ constructor(size = { cols: 80, rows: 24 }) {
15
+ const normalized = normalizeTerminalSize(size);
16
+ this.terminal = new Terminal({
17
+ allowProposedApi: true,
18
+ cols: normalized.cols,
19
+ rows: normalized.rows,
20
+ scrollback: TERMINAL_SCROLLBACK,
21
+ });
22
+ this.terminal.loadAddon(this.serializeAddon);
23
+ }
24
+ dispose() {
25
+ this.terminal.dispose();
26
+ }
27
+ async getSnapshot() {
28
+ await this.operationQueue;
29
+ return this.serializeAddon.serialize();
30
+ }
31
+ resize(cols, rows) {
32
+ const normalized = normalizeTerminalSize({ cols, rows });
33
+ this.operationQueue = this.operationQueue
34
+ .catch(() => undefined)
35
+ .then(() => {
36
+ this.terminal.resize(normalized.cols, normalized.rows);
37
+ });
38
+ }
39
+ write(chunk) {
40
+ this.operationQueue = this.operationQueue
41
+ .catch(() => undefined)
42
+ .then(() => new Promise((resolve) => {
43
+ this.terminal.write(chunk, () => resolve());
44
+ }));
45
+ }
46
+ }
47
+ //# sourceMappingURL=terminal-state-mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-state-mirror.js","sourceRoot":"","sources":["../../../src/server/terminal-state-mirror.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,wBAAwB,CAAA;AACzD,OAAO,sBAAsB,MAAM,iBAAiB,CAAA;AAEpD,MAAM,EAAE,cAAc,EAAE,GAAG,oBAA+D,CAAA;AAC1F,MAAM,EAAE,QAAQ,EAAE,GAAG,sBAA0D,CAAA;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAOzC,MAAM,qBAAqB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAsB,EAAsB,EAAE,CAAC,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC,CAAA;AAEF,MAAM,OAAO,mBAAmB;IACb,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;IACrC,QAAQ,CAA+B;IAChD,cAAc,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IAEzD,YAAY,OAA2B,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC3B,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,UAAU,EAAE,mBAAmB;SAChC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,cAAc,CAAA;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;aACtC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;aACtC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,IAAI,CACH,GAAG,EAAE,CACH,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7C,CAAC,CAAC,CACL,CAAA;IACL,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type WebSocket from 'ws';
2
+ import type { RuntimeStore } from './runtime-store.js';
3
+ import { type TerminalMirrorSize } from './terminal-state-mirror.js';
4
+ export interface TerminalStreamHub {
5
+ attachControl: (runId: string, clientId: string, socket: WebSocket, initialSize?: TerminalMirrorSize) => void;
6
+ attachIo: (runId: string, clientId: string, socket: WebSocket, initialSize?: TerminalMirrorSize) => void;
7
+ close: () => void;
8
+ }
9
+ export declare const createTerminalStreamHub: (store: RuntimeStore) => TerminalStreamHub;
@@ -0,0 +1,179 @@
1
+ import { createTerminalOutputFlow } from './terminal-flow-control.js';
2
+ import { parseTerminalControlMessage, serializeTerminalError, serializeTerminalExit, serializeTerminalRestore, } from './terminal-protocol.js';
3
+ import { TerminalStateMirror } from './terminal-state-mirror.js';
4
+ export const createTerminalStreamHub = (store) => {
5
+ const runStates = new Map();
6
+ const maybeResumeRun = (runId, state, clientId) => {
7
+ if (!state.backpressuredViewerIds.delete(clientId))
8
+ return;
9
+ if (state.backpressuredViewerIds.size === 0)
10
+ store.resumeTerminalRun(runId);
11
+ };
12
+ const cleanupRun = (runId) => {
13
+ const state = runStates.get(runId);
14
+ if (!state?.exited || state.viewers.size > 0)
15
+ return;
16
+ state.outputUnsubscribe?.();
17
+ if (state.exitInterval)
18
+ clearInterval(state.exitInterval);
19
+ state.mirror.dispose();
20
+ runStates.delete(runId);
21
+ };
22
+ const getOrCreateViewer = (state, clientId) => {
23
+ let viewer = state.viewers.get(clientId);
24
+ if (!viewer) {
25
+ viewer = { clientId, controlSocket: null, flowState: null, ioSocket: null };
26
+ state.viewers.set(clientId, viewer);
27
+ }
28
+ return viewer;
29
+ };
30
+ const getOrCreateState = (runId, initialSize) => {
31
+ let state = runStates.get(runId);
32
+ if (!state) {
33
+ state = {
34
+ backpressuredViewerIds: new Set(),
35
+ exited: false,
36
+ exitInterval: null,
37
+ // runId is globally unique, so it is semantically equivalent to workspaceId:runId.
38
+ mirror: new TerminalStateMirror(initialSize),
39
+ outputUnsubscribe: null,
40
+ viewers: new Map(),
41
+ };
42
+ runStates.set(runId, state);
43
+ const liveRun = store.getLiveRun(runId);
44
+ if (liveRun.output.length > 0)
45
+ state.mirror.write(liveRun.output);
46
+ const nextState = state;
47
+ nextState.outputUnsubscribe = store.getPtyOutputBus().subscribe(runId, (chunk) => {
48
+ nextState.mirror.write(chunk);
49
+ for (const viewer of nextState.viewers.values())
50
+ viewer.flowState?.enqueue(chunk);
51
+ });
52
+ }
53
+ else if (initialSize) {
54
+ state.mirror.resize(initialSize.cols, initialSize.rows);
55
+ }
56
+ return state;
57
+ };
58
+ const cleanupViewer = (runId, state, clientId) => {
59
+ const viewer = state.viewers.get(clientId);
60
+ if (!viewer || viewer.controlSocket || viewer.ioSocket)
61
+ return;
62
+ state.viewers.delete(clientId);
63
+ maybeResumeRun(runId, state, clientId);
64
+ cleanupRun(runId);
65
+ };
66
+ const startExitWatcher = (runId, state) => {
67
+ if (state.exitInterval)
68
+ return;
69
+ state.exitInterval = setInterval(() => {
70
+ try {
71
+ const run = store.getLiveRun(runId);
72
+ if (run.status !== 'exited' && run.status !== 'error')
73
+ return;
74
+ state.exited = true;
75
+ state.outputUnsubscribe?.();
76
+ state.outputUnsubscribe = null;
77
+ const payload = serializeTerminalExit(run.exitCode);
78
+ for (const viewer of state.viewers.values()) {
79
+ const controlSocket = viewer.controlSocket;
80
+ if (controlSocket && controlSocket.readyState === controlSocket.OPEN)
81
+ controlSocket.send(payload);
82
+ }
83
+ if (state.exitInterval)
84
+ clearInterval(state.exitInterval);
85
+ state.exitInterval = null;
86
+ cleanupRun(runId);
87
+ }
88
+ catch {
89
+ if (state.exitInterval)
90
+ clearInterval(state.exitInterval);
91
+ state.exitInterval = null;
92
+ }
93
+ }, 25);
94
+ };
95
+ return {
96
+ attachControl(runId, clientId, socket, initialSize) {
97
+ const state = getOrCreateState(runId, initialSize);
98
+ const viewer = getOrCreateViewer(state, clientId);
99
+ viewer.controlSocket = socket;
100
+ startExitWatcher(runId, state);
101
+ void state.mirror
102
+ .getSnapshot()
103
+ .then((snapshot) => {
104
+ if (socket.readyState === socket.OPEN)
105
+ socket.send(serializeTerminalRestore(snapshot));
106
+ })
107
+ .catch(() => {
108
+ if (socket.readyState === socket.OPEN)
109
+ socket.send(serializeTerminalRestore(''));
110
+ });
111
+ socket.on('message', (raw) => {
112
+ try {
113
+ const message = parseTerminalControlMessage(raw);
114
+ if (message.type === 'output_ack')
115
+ viewer.flowState?.ack(message.bytes);
116
+ if (message.type === 'resize') {
117
+ state.mirror.resize(message.cols, message.rows);
118
+ store.resizeAgentRun(runId, message.cols, message.rows);
119
+ }
120
+ if (message.type === 'stop')
121
+ store.stopAgentRun(runId);
122
+ if (message.type === 'restore_complete')
123
+ return;
124
+ }
125
+ catch (error) {
126
+ socket.send(serializeTerminalError(error instanceof Error ? error.message : 'Invalid control message'));
127
+ }
128
+ });
129
+ socket.on('close', () => {
130
+ if (viewer.controlSocket === socket)
131
+ viewer.controlSocket = null;
132
+ cleanupViewer(runId, state, clientId);
133
+ });
134
+ },
135
+ attachIo(runId, clientId, socket, initialSize) {
136
+ const state = getOrCreateState(runId, initialSize);
137
+ const viewer = getOrCreateViewer(state, clientId);
138
+ viewer.ioSocket = socket;
139
+ viewer.flowState?.close();
140
+ viewer.flowState = createTerminalOutputFlow(socket, {
141
+ onBackpressureChange(backpressured) {
142
+ if (backpressured) {
143
+ const wasEmpty = state.backpressuredViewerIds.size === 0;
144
+ state.backpressuredViewerIds.add(clientId);
145
+ if (wasEmpty)
146
+ store.pauseTerminalRun(runId);
147
+ return;
148
+ }
149
+ maybeResumeRun(runId, state, clientId);
150
+ },
151
+ });
152
+ socket.on('message', (raw) => {
153
+ store.writeRunInput(runId, raw.toString());
154
+ });
155
+ socket.on('close', () => {
156
+ if (viewer.ioSocket === socket)
157
+ viewer.ioSocket = null;
158
+ viewer.flowState?.close();
159
+ viewer.flowState = null;
160
+ cleanupViewer(runId, state, clientId);
161
+ });
162
+ },
163
+ close() {
164
+ for (const [runId, state] of runStates) {
165
+ state.outputUnsubscribe?.();
166
+ if (state.exitInterval)
167
+ clearInterval(state.exitInterval);
168
+ state.mirror.dispose();
169
+ for (const viewer of state.viewers.values()) {
170
+ viewer.flowState?.close();
171
+ viewer.ioSocket?.close();
172
+ viewer.controlSocket?.close();
173
+ }
174
+ runStates.delete(runId);
175
+ }
176
+ },
177
+ };
178
+ };
179
+ //# sourceMappingURL=terminal-stream-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-stream-hub.js","sourceRoot":"","sources":["../../../src/server/terminal-stream-hub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Server } from 'node:http';
2
+ import type { RuntimeStore } from './runtime-store.js';
3
+ export declare const createTerminalWebSocketServer: (server: Server, store: RuntimeStore) => {
4
+ close: () => void;
5
+ };
@@ -0,0 +1,85 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { createTasksWebSocketServer } from './tasks-websocket-server.js';
3
+ import { createTerminalStreamHub } from './terminal-stream-hub.js';
4
+ import { readCookie } from './ui-auth-helpers.js';
5
+ const matchTerminalPath = (pathname) => {
6
+ const match = /^\/ws\/terminal\/(?<runId>[^/]+)\/(?<channel>io|control)$/.exec(pathname);
7
+ const groups = match?.groups;
8
+ if (!groups?.runId || !groups.channel)
9
+ return null;
10
+ return {
11
+ channel: groups.channel,
12
+ runId: decodeURIComponent(groups.runId),
13
+ };
14
+ };
15
+ const getClientId = (url) => {
16
+ return url.searchParams.get('clientId')?.trim() || 'legacy';
17
+ };
18
+ const getInitialSize = (url) => {
19
+ const cols = Number(url.searchParams.get('cols'));
20
+ const rows = Number(url.searchParams.get('rows'));
21
+ if (!Number.isInteger(cols) || !Number.isInteger(rows) || cols <= 0 || rows <= 0) {
22
+ return undefined;
23
+ }
24
+ return { cols, rows };
25
+ };
26
+ const rejectUpgrade = (socket, status) => {
27
+ socket.write(`HTTP/1.1 ${status}\r\n\r\n`);
28
+ socket.destroy();
29
+ };
30
+ export const createTerminalWebSocketServer = (server, store) => {
31
+ const ioWss = new WebSocketServer({ noServer: true });
32
+ const controlWss = new WebSocketServer({ noServer: true });
33
+ const tasksWss = createTasksWebSocketServer(server, store);
34
+ const hub = createTerminalStreamHub(store);
35
+ const disposeTasksListener = store.registerTasksListener((workspaceId, content) => {
36
+ tasksWss.publish(workspaceId, content);
37
+ });
38
+ const validateUpgradeSession = (request) => {
39
+ const cookieHeader = Array.isArray(request.headers.cookie)
40
+ ? request.headers.cookie.join('; ')
41
+ : request.headers.cookie;
42
+ const token = readCookie(cookieHeader, 'hive_ui_token');
43
+ return store.validateUiToken(token);
44
+ };
45
+ server.on('upgrade', (request, socket, head) => {
46
+ const url = new URL(request.url ?? '/', 'http://127.0.0.1');
47
+ const pathname = url.pathname;
48
+ const match = matchTerminalPath(pathname);
49
+ if (!match) {
50
+ if (/^\/ws\/tasks\/.+/.test(pathname)) {
51
+ return;
52
+ }
53
+ rejectUpgrade(socket, '404 Not Found');
54
+ return;
55
+ }
56
+ if (!validateUpgradeSession(request)) {
57
+ rejectUpgrade(socket, '401 Unauthorized');
58
+ return;
59
+ }
60
+ try {
61
+ store.getLiveRun(match.runId);
62
+ }
63
+ catch {
64
+ rejectUpgrade(socket, '404 Not Found');
65
+ return;
66
+ }
67
+ const wss = match.channel === 'io' ? ioWss : controlWss;
68
+ wss.handleUpgrade(request, socket, head, (ws) => {
69
+ const clientId = getClientId(url);
70
+ if (match.channel === 'io')
71
+ hub.attachIo(match.runId, clientId, ws, getInitialSize(url));
72
+ else
73
+ hub.attachControl(match.runId, clientId, ws, getInitialSize(url));
74
+ });
75
+ });
76
+ server.on('close', () => {
77
+ disposeTasksListener();
78
+ hub.close();
79
+ ioWss.close();
80
+ controlWss.close();
81
+ tasksWss.close();
82
+ });
83
+ return { close: () => hub.close() };
84
+ };
85
+ //# sourceMappingURL=terminal-ws-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-ws-server.js","sourceRoot":"","sources":["../../../src/server/terminal-ws-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+ import type { RuntimeStore } from './runtime-store.js';
3
+ export declare const readCookie: (cookieHeader: string | undefined, name: string) => string | undefined;
4
+ export declare const requireUiTokenFromRequest: (request: IncomingMessage, validateUiToken: RuntimeStore["validateUiToken"]) => void;
@@ -0,0 +1,23 @@
1
+ import { ForbiddenError } from './http-errors.js';
2
+ export const readCookie = (cookieHeader, name) => {
3
+ if (!cookieHeader) {
4
+ return undefined;
5
+ }
6
+ for (const part of cookieHeader.split(';')) {
7
+ const [key, value] = part.trim().split('=');
8
+ if (key === name) {
9
+ return value;
10
+ }
11
+ }
12
+ return undefined;
13
+ };
14
+ export const requireUiTokenFromRequest = (request, validateUiToken) => {
15
+ const cookieHeader = Array.isArray(request.headers.cookie)
16
+ ? request.headers.cookie.join('; ')
17
+ : request.headers.cookie;
18
+ const token = readCookie(cookieHeader, 'hive_ui_token');
19
+ if (!validateUiToken(token)) {
20
+ throw new ForbiddenError('UI endpoint requires valid UI token');
21
+ }
22
+ };
23
+ //# sourceMappingURL=ui-auth-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-auth-helpers.js","sourceRoot":"","sources":["../../../src/server/ui-auth-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGjD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,YAAgC,EAAE,IAAY,EAAE,EAAE;IAC3E,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAwB,EACxB,eAAgD,EAChD,EAAE;IACF,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QACxD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAA;IAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;IACvD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,cAAc,CAAC,qCAAqC,CAAC,CAAA;IACjE,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export interface UiAuth {
2
+ getToken: () => string;
3
+ validate: (token: string | undefined) => boolean;
4
+ }
5
+ export declare const createUiAuth: () => UiAuth;