@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,13 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export const createUiAuth = () => {
3
+ const token = randomUUID();
4
+ return {
5
+ getToken() {
6
+ return token;
7
+ },
8
+ validate(input) {
9
+ return input === token;
10
+ },
11
+ };
12
+ };
13
+ //# sourceMappingURL=ui-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-auth.js","sourceRoot":"","sources":["../../../src/server/ui-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE;IACvC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;IAE1B,OAAO;QACL,QAAQ;YACN,OAAO,KAAK,CAAA;QACd,CAAC;QACD,QAAQ,CAAC,KAAK;YACZ,OAAO,KAAK,KAAK,KAAK,CAAA;QACxB,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import type { AgentSummary, TeamListItem, WorkerRole, WorkspaceSummary } from '../shared/types.js';
2
+ export interface WorkspaceRecord {
3
+ summary: WorkspaceSummary;
4
+ agents: AgentSummary[];
5
+ }
6
+ export interface WorkerInput {
7
+ description?: string;
8
+ name: string;
9
+ role: WorkerRole;
10
+ }
11
+ export interface WorkspaceStore {
12
+ addWorker: (workspaceId: string, input: WorkerInput) => AgentSummary;
13
+ createWorkspace: (path: string, name: string) => WorkspaceSummary;
14
+ deleteWorkspace: (workspaceId: string) => void;
15
+ deleteWorker: (workspaceId: string, workerId: string) => void;
16
+ renameWorker: (workspaceId: string, workerId: string, name: string) => AgentSummary;
17
+ getAgent: (workspaceId: string, agentId: string) => AgentSummary;
18
+ getWorker: (workspaceId: string, workerId: string) => AgentSummary;
19
+ getWorkerByName: (workspaceId: string, workerName: string) => AgentSummary;
20
+ getWorkspaceSnapshot: (workspaceId: string) => WorkspaceRecord;
21
+ hasAgent: (workspaceId: string, agentId: string) => boolean;
22
+ listWorkers: (workspaceId: string) => TeamListItem[];
23
+ listWorkspaces: () => WorkspaceSummary[];
24
+ markAgentStarted: (workspaceId: string, agentId: string) => void;
25
+ markAgentStopped: (workspaceId: string, agentId: string) => void;
26
+ markTaskDispatched: (workspaceId: string, workerId: string) => void;
27
+ markTaskReported: (workspaceId: string, workerId: string) => void;
28
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workspace-store-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-store-contract.js","sourceRoot":"","sources":["../../../src/server/workspace-store-contract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { Database } from 'better-sqlite3';
2
+ import type { WorkspaceRecord } from './workspace-store-contract.js';
3
+ import { type MessageKindRecord } from './workspace-store-support.js';
4
+ export declare const hydrateWorkspaceFromDb: (db: Database | undefined, workspaces: Map<string, WorkspaceRecord>, messageKinds: MessageKindRecord[], workspaceId: string) => void;
5
+ export declare const seedWorkspacesFromDb: (db: Database | undefined, workspaces: Map<string, WorkspaceRecord>, messageKinds: MessageKindRecord[]) => void;
@@ -0,0 +1,64 @@
1
+ import { getDefaultRoleDescription } from './role-templates.js';
2
+ import { applyPendingTaskCount, createOrchestrator, isWorkerAgent, } from './workspace-store-support.js';
3
+ const createWorkerSummary = (workspaceId, row) => ({
4
+ id: row.id,
5
+ workspaceId,
6
+ name: row.name,
7
+ description: row.description ?? getDefaultRoleDescription(row.role),
8
+ role: row.role,
9
+ status: 'stopped',
10
+ pendingTaskCount: 0,
11
+ });
12
+ const applyMessageKinds = (workspaces, messageKinds, workspaceId) => {
13
+ for (const row of messageKinds) {
14
+ if (workspaceId && row.workspace_id !== workspaceId) {
15
+ continue;
16
+ }
17
+ const worker = workspaces
18
+ .get(row.workspace_id)
19
+ ?.agents.find((agent) => agent.id === row.worker_id);
20
+ if (!worker || !isWorkerAgent(worker)) {
21
+ continue;
22
+ }
23
+ applyPendingTaskCount(worker, row.type, true);
24
+ }
25
+ };
26
+ export const hydrateWorkspaceFromDb = (db, workspaces, messageKinds, workspaceId) => {
27
+ if (!db || workspaces.has(workspaceId)) {
28
+ return;
29
+ }
30
+ const row = db.prepare('SELECT id, name, path FROM workspaces WHERE id = ?').get(workspaceId);
31
+ if (!row) {
32
+ return;
33
+ }
34
+ workspaces.set(row.id, {
35
+ summary: { id: row.id, name: row.name, path: row.path },
36
+ agents: [createOrchestrator(row.id)],
37
+ });
38
+ for (const workerRow of db
39
+ .prepare('SELECT id, workspace_id, name, description, role FROM workers WHERE workspace_id = ? ORDER BY created_at ASC')
40
+ .all(workspaceId)) {
41
+ workspaces.get(workspaceId)?.agents.push(createWorkerSummary(workerRow.workspace_id, workerRow));
42
+ }
43
+ applyMessageKinds(workspaces, messageKinds, workspaceId);
44
+ };
45
+ export const seedWorkspacesFromDb = (db, workspaces, messageKinds) => {
46
+ if (!db) {
47
+ return;
48
+ }
49
+ for (const row of db
50
+ .prepare('SELECT id, name, path FROM workspaces ORDER BY created_at ASC')
51
+ .all()) {
52
+ workspaces.set(row.id, {
53
+ summary: { id: row.id, name: row.name, path: row.path },
54
+ agents: [createOrchestrator(row.id)],
55
+ });
56
+ }
57
+ for (const row of db
58
+ .prepare('SELECT id, workspace_id, name, description, role FROM workers ORDER BY created_at ASC')
59
+ .all()) {
60
+ workspaces.get(row.workspace_id)?.agents.push(createWorkerSummary(row.workspace_id, row));
61
+ }
62
+ applyMessageKinds(workspaces, messageKinds);
63
+ };
64
+ //# sourceMappingURL=workspace-store-hydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-store-hydration.js","sourceRoot":"","sources":["../../../src/server/workspace-store-hydration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AgentSummary, WorkerRole } from '../shared/types.js';
2
+ import type { WorkspaceRecord } from './workspace-store-contract.js';
3
+ type WorkspaceMap = Map<string, WorkspaceRecord>;
4
+ export declare const getAgentRecord: (workspaces: WorkspaceMap, workspaceId: string, agentId: string) => AgentSummary;
5
+ export declare const getWorkerRecord: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => AgentSummary & {
6
+ role: WorkerRole;
7
+ };
8
+ export declare const getWorkerByNameRecord: (workspaces: WorkspaceMap, workspaceId: string, workerName: string) => AgentSummary;
9
+ export declare const markAgentStarted: (workspaces: WorkspaceMap, workspaceId: string, agentId: string) => void;
10
+ export declare const markAgentStopped: (workspaces: WorkspaceMap, workspaceId: string, agentId: string) => void;
11
+ export declare const markTaskDispatched: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => void;
12
+ export declare const markTaskReported: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => void;
13
+ export {};
@@ -0,0 +1,49 @@
1
+ import { getStatusFromPendingCount, isWorkerAgent } from './workspace-store-support.js';
2
+ const getWorkspaceRecord = (workspaces, workspaceId) => {
3
+ const workspace = workspaces.get(workspaceId);
4
+ if (!workspace)
5
+ throw new Error(`Workspace not found: ${workspaceId}`);
6
+ return workspace;
7
+ };
8
+ export const getAgentRecord = (workspaces, workspaceId, agentId) => {
9
+ const agent = getWorkspaceRecord(workspaces, workspaceId).agents.find((item) => item.id === agentId);
10
+ if (!agent)
11
+ throw new Error(`Agent not found: ${agentId}`);
12
+ return agent;
13
+ };
14
+ export const getWorkerRecord = (workspaces, workspaceId, workerId) => {
15
+ const worker = getAgentRecord(workspaces, workspaceId, workerId);
16
+ if (!isWorkerAgent(worker))
17
+ throw new Error(`Worker not found: ${workerId}`);
18
+ return worker;
19
+ };
20
+ export const getWorkerByNameRecord = (workspaces, workspaceId, workerName) => {
21
+ const worker = getWorkspaceRecord(workspaces, workspaceId).agents.find((item) => item.name === workerName && isWorkerAgent(item));
22
+ if (!worker)
23
+ throw new Error(`Worker not found: ${workerName}`);
24
+ return worker;
25
+ };
26
+ export const markAgentStarted = (workspaces, workspaceId, agentId) => {
27
+ const pendingTaskCount = getAgentRecord(workspaces, workspaceId, agentId).pendingTaskCount;
28
+ getAgentRecord(workspaces, workspaceId, agentId).status =
29
+ getStatusFromPendingCount(pendingTaskCount);
30
+ };
31
+ export const markAgentStopped = (workspaces, workspaceId, agentId) => {
32
+ getAgentRecord(workspaces, workspaceId, agentId).status = 'stopped';
33
+ };
34
+ export const markTaskDispatched = (workspaces, workspaceId, workerId) => {
35
+ const worker = getWorkerRecord(workspaces, workspaceId, workerId);
36
+ worker.pendingTaskCount += 1;
37
+ // spec §3.6.4: a stopped worker may accumulate queued tasks; PTY isn't
38
+ // running so it can't be `working`. Stay stopped until restart (mirrors
39
+ // markTaskReported's stopped guard below).
40
+ if (worker.status !== 'stopped')
41
+ worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
42
+ };
43
+ export const markTaskReported = (workspaces, workspaceId, workerId) => {
44
+ const worker = getWorkerRecord(workspaces, workspaceId, workerId);
45
+ worker.pendingTaskCount = Math.max(0, worker.pendingTaskCount - 1);
46
+ if (worker.status !== 'stopped')
47
+ worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
48
+ };
49
+ //# sourceMappingURL=workspace-store-mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-store-mutations.js","sourceRoot":"","sources":["../../../src/server/workspace-store-mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { AgentStatus, AgentSummary, WorkerRole } from '../shared/types.js';
2
+ export interface MessageKindRecord {
3
+ type: 'send' | 'report';
4
+ worker_id: string;
5
+ workspace_id: string;
6
+ }
7
+ export interface WorkspaceRow {
8
+ id: string;
9
+ name: string;
10
+ path: string;
11
+ }
12
+ export interface WorkerRow {
13
+ id: string;
14
+ workspace_id: string;
15
+ name: string;
16
+ description: string | null;
17
+ role: WorkerRole;
18
+ }
19
+ export interface WorkspaceSummaryRow extends WorkspaceRow {
20
+ }
21
+ export declare const getOrchestratorId: (workspaceId: string) => string;
22
+ export declare const createOrchestrator: (workspaceId: string) => AgentSummary;
23
+ export declare const isWorkerAgent: (agent: AgentSummary) => agent is AgentSummary & {
24
+ role: WorkerRole;
25
+ };
26
+ export declare const getStatusFromPendingCount: (pendingTaskCount: number) => AgentStatus;
27
+ export declare const applyPendingTaskCount: (worker: AgentSummary & {
28
+ role: WorkerRole;
29
+ }, type: MessageKindRecord["type"], preserveStoppedStatus: boolean) => void;
@@ -0,0 +1,25 @@
1
+ import { getDefaultRoleDescription } from './role-templates.js';
2
+ export const getOrchestratorId = (workspaceId) => `${workspaceId}:orchestrator`;
3
+ export const createOrchestrator = (workspaceId) => ({
4
+ id: getOrchestratorId(workspaceId),
5
+ workspaceId,
6
+ name: 'Orchestrator',
7
+ description: getDefaultRoleDescription('orchestrator'),
8
+ role: 'orchestrator',
9
+ status: 'idle',
10
+ pendingTaskCount: 0,
11
+ });
12
+ export const isWorkerAgent = (agent) => {
13
+ return agent.role !== 'orchestrator';
14
+ };
15
+ export const getStatusFromPendingCount = (pendingTaskCount) => {
16
+ return pendingTaskCount > 0 ? 'working' : 'idle';
17
+ };
18
+ export const applyPendingTaskCount = (worker, type, preserveStoppedStatus) => {
19
+ worker.pendingTaskCount =
20
+ type === 'send' ? worker.pendingTaskCount + 1 : Math.max(0, worker.pendingTaskCount - 1);
21
+ if (!preserveStoppedStatus) {
22
+ worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
23
+ }
24
+ };
25
+ //# sourceMappingURL=workspace-store-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-store-support.js","sourceRoot":"","sources":["../../../src/server/workspace-store-support.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAwB/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,GAAG,WAAW,eAAe,CAAA;AAEvF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAmB,EAAgB,EAAE,CAAC,CAAC;IACxE,EAAE,EAAE,iBAAiB,CAAC,WAAW,CAAC;IAClC,WAAW;IACX,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,yBAAyB,CAAC,cAAc,CAAC;IACtD,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,MAAM;IACd,gBAAgB,EAAE,CAAC;CACpB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAmB,EAC2B,EAAE;IAChD,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,gBAAwB,EAAe,EAAE;IACjF,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAA2C,EAC3C,IAA+B,EAC/B,qBAA8B,EAC9B,EAAE;IACF,MAAM,CAAC,gBAAgB;QACrB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAA;IAC1F,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACpE,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { Database } from 'better-sqlite3';
2
+ import type { WorkerInput, WorkspaceRecord, WorkspaceStore } from './workspace-store-contract.js';
3
+ import { type MessageKindRecord } from './workspace-store-support.js';
4
+ export type { WorkerInput, WorkspaceRecord, WorkspaceStore };
5
+ export declare const createWorkspaceStore: (db: Database | undefined, messageKinds: MessageKindRecord[]) => WorkspaceStore;
@@ -0,0 +1,114 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { ConflictError } from './http-errors.js';
3
+ import { getDefaultRoleDescription } from './role-templates.js';
4
+ import { hydrateWorkspaceFromDb, seedWorkspacesFromDb } from './workspace-store-hydration.js';
5
+ import { getAgentRecord, getWorkerByNameRecord, getWorkerRecord, markAgentStarted, markAgentStopped, markTaskDispatched, markTaskReported, } from './workspace-store-mutations.js';
6
+ import { createOrchestrator, isWorkerAgent, } from './workspace-store-support.js';
7
+ export const createWorkspaceStore = (db, messageKinds) => {
8
+ const workspaces = new Map();
9
+ seedWorkspacesFromDb(db, workspaces, messageKinds);
10
+ const getWorkspace = (workspaceId) => {
11
+ hydrateWorkspaceFromDb(db, workspaces, messageKinds, workspaceId);
12
+ const workspace = workspaces.get(workspaceId);
13
+ if (!workspace)
14
+ throw new Error(`Workspace not found: ${workspaceId}`);
15
+ return workspace;
16
+ };
17
+ return {
18
+ addWorker(workspaceId, input) {
19
+ const workspace = getWorkspace(workspaceId);
20
+ if (workspace.agents.some((agent) => agent.name === input.name && isWorkerAgent(agent))) {
21
+ throw new ConflictError(`Worker name already exists: ${input.name}`);
22
+ }
23
+ const worker = {
24
+ id: randomUUID(),
25
+ workspaceId,
26
+ name: input.name,
27
+ description: input.description ?? getDefaultRoleDescription(input.role),
28
+ role: input.role,
29
+ status: 'stopped',
30
+ pendingTaskCount: 0,
31
+ };
32
+ db?.prepare('INSERT INTO workers (id, workspace_id, name, description, role, created_at) VALUES (?, ?, ?, ?, ?, ?)').run(worker.id, workspaceId, worker.name, worker.description, worker.role, Date.now());
33
+ workspace.agents.push(worker);
34
+ return worker;
35
+ },
36
+ createWorkspace(path, name) {
37
+ const summary = { id: randomUUID(), name, path };
38
+ db?.prepare('INSERT INTO workspaces (id, name, path, created_at) VALUES (?, ?, ?, ?)').run(summary.id, name, path, Date.now());
39
+ workspaces.set(summary.id, { summary, agents: [createOrchestrator(summary.id)] });
40
+ return summary;
41
+ },
42
+ deleteWorkspace(workspaceId) {
43
+ const workspace = getWorkspace(workspaceId);
44
+ const agentIds = workspace.agents.map((agent) => agent.id);
45
+ db?.transaction(() => {
46
+ db.prepare('DELETE FROM messages WHERE workspace_id = ?').run(workspaceId);
47
+ db.prepare('DELETE FROM agent_launch_configs WHERE workspace_id = ?').run(workspaceId);
48
+ db.prepare('DELETE FROM agent_sessions WHERE workspace_id = ?').run(workspaceId);
49
+ const deleteAgentRuns = db.prepare('DELETE FROM agent_runs WHERE agent_id = ?');
50
+ for (const agentId of agentIds)
51
+ deleteAgentRuns.run(agentId);
52
+ db.prepare('DELETE FROM workers WHERE workspace_id = ?').run(workspaceId);
53
+ db.prepare('DELETE FROM workspaces WHERE id = ?').run(workspaceId);
54
+ })();
55
+ workspaces.delete(workspaceId);
56
+ },
57
+ renameWorker(workspaceId, workerId, name) {
58
+ const worker = getWorkerRecord(workspaces, workspaceId, workerId);
59
+ const trimmed = name.trim();
60
+ if (!trimmed)
61
+ throw new Error('Worker name must not be empty');
62
+ if (trimmed.length > 64)
63
+ throw new Error('Worker name must be 64 characters or fewer');
64
+ if (trimmed === worker.name)
65
+ return worker;
66
+ const workspace = getWorkspace(workspaceId);
67
+ if (workspace.agents.some((agent) => agent.id !== workerId && agent.name === trimmed && isWorkerAgent(agent))) {
68
+ throw new ConflictError(`Worker name already exists: ${trimmed}`);
69
+ }
70
+ db?.prepare('UPDATE workers SET name = ? WHERE workspace_id = ? AND id = ?').run(trimmed, workspaceId, workerId);
71
+ worker.name = trimmed;
72
+ return worker;
73
+ },
74
+ deleteWorker(workspaceId, workerId) {
75
+ const workspace = getWorkspace(workspaceId);
76
+ getWorkerRecord(workspaces, workspaceId, workerId);
77
+ db?.transaction(() => {
78
+ db.prepare('DELETE FROM messages WHERE workspace_id = ? AND worker_id = ?').run(workspaceId, workerId);
79
+ db.prepare('DELETE FROM agent_launch_configs WHERE workspace_id = ? AND agent_id = ?').run(workspaceId, workerId);
80
+ db.prepare('DELETE FROM agent_sessions WHERE workspace_id = ? AND agent_id = ?').run(workspaceId, workerId);
81
+ db.prepare('DELETE FROM agent_runs WHERE agent_id = ?').run(workerId);
82
+ db.prepare('DELETE FROM workers WHERE workspace_id = ? AND id = ?').run(workspaceId, workerId);
83
+ })();
84
+ workspace.agents = workspace.agents.filter((agent) => agent.id !== workerId);
85
+ },
86
+ getAgent: (workspaceId, agentId) => getAgentRecord(workspaces, workspaceId, agentId),
87
+ getWorker: (workspaceId, workerId) => getWorkerRecord(workspaces, workspaceId, workerId),
88
+ getWorkerByName: (workspaceId, workerName) => getWorkerByNameRecord(workspaces, workspaceId, workerName),
89
+ getWorkspaceSnapshot: getWorkspace,
90
+ hasAgent(workspaceId, agentId) {
91
+ hydrateWorkspaceFromDb(db, workspaces, messageKinds, workspaceId);
92
+ return workspaces.get(workspaceId)?.agents.some((agent) => agent.id === agentId) ?? false;
93
+ },
94
+ listWorkers(workspaceId) {
95
+ return getWorkspace(workspaceId)
96
+ .agents.filter(isWorkerAgent)
97
+ .map(({ id, name, role, status, pendingTaskCount }) => ({
98
+ id,
99
+ name,
100
+ role,
101
+ status,
102
+ pendingTaskCount,
103
+ }));
104
+ },
105
+ listWorkspaces() {
106
+ return Array.from(workspaces.values(), (workspace) => workspace.summary);
107
+ },
108
+ markAgentStarted: (workspaceId, agentId) => markAgentStarted(workspaces, workspaceId, agentId),
109
+ markAgentStopped: (workspaceId, agentId) => markAgentStopped(workspaces, workspaceId, agentId),
110
+ markTaskDispatched: (workspaceId, workerId) => markTaskDispatched(workspaces, workspaceId, workerId),
111
+ markTaskReported: (workspaceId, workerId) => markTaskReported(workspaces, workspaceId, workerId),
112
+ };
113
+ };
114
+ //# sourceMappingURL=workspace-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-store.js","sourceRoot":"","sources":["../../../src/server/workspace-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export declare const agentStatuses: readonly ["idle", "working", "stopped"];
2
+ export type AgentStatus = (typeof agentStatuses)[number];
3
+ export type WorkerRole = 'coder' | 'reviewer' | 'tester' | 'custom';
4
+ export interface WorkspaceSummary {
5
+ id: string;
6
+ name: string;
7
+ path: string;
8
+ }
9
+ export interface AgentSummary {
10
+ id: string;
11
+ workspaceId: string;
12
+ name: string;
13
+ description: string;
14
+ role: WorkerRole | 'orchestrator';
15
+ status: AgentStatus;
16
+ pendingTaskCount: number;
17
+ }
18
+ export interface TeamListItem {
19
+ id: string;
20
+ name: string;
21
+ role: WorkerRole;
22
+ status: AgentStatus;
23
+ pendingTaskCount: number;
24
+ }
25
+ /**
26
+ * Wire payload shape for /api/workspaces/:id/team and worker-creation responses.
27
+ * Per AGENTS.md §8 + spec §3.3 line 162-179, HTTP JSON is snake_case.
28
+ * Internal TS code uses TeamListItem (camelCase); serializers/deserializers convert.
29
+ */
30
+ export interface TeamListItemPayload {
31
+ id: string;
32
+ name: string;
33
+ role: WorkerRole;
34
+ status: AgentStatus;
35
+ pending_task_count: number;
36
+ }
@@ -0,0 +1,2 @@
1
+ export const agentStatuses = ['idle', 'working', 'stopped'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAU,CAAA"}
package/package.json ADDED
@@ -0,0 +1,108 @@
1
+ {
2
+ "name": "@tt-a1i/hive",
3
+ "version": "0.6.0-alpha.0",
4
+ "description": "Local multi-agent workspace for coordinating CLI coding agents through a web UI.",
5
+ "type": "module",
6
+ "packageManager": "pnpm@10.30.3",
7
+ "license": "Apache-2.0",
8
+ "keywords": [
9
+ "ai-agents",
10
+ "cli",
11
+ "coding-agent",
12
+ "collaboration",
13
+ "local-first",
14
+ "multi-agent",
15
+ "pty",
16
+ "workspace"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/tt-a1i/hive.git"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/tt-a1i/hive/issues"
24
+ },
25
+ "homepage": "https://github.com/tt-a1i/hive#readme",
26
+ "engines": {
27
+ "node": ">=22"
28
+ },
29
+ "files": [
30
+ "CHANGELOG.md",
31
+ "LICENSE",
32
+ "README.md",
33
+ "SECURITY.md",
34
+ "dist/bin/",
35
+ "dist/src/",
36
+ "web/dist/",
37
+ "scripts/fix-runtime-artifacts.mjs"
38
+ ],
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "bin": {
43
+ "hive": "dist/src/cli/hive.js"
44
+ },
45
+ "scripts": {
46
+ "clean": "node scripts/clean-build.mjs",
47
+ "dev": "pnpm dev:all",
48
+ "dev:all": "concurrently \"pnpm dev:runtime\" \"pnpm dev:web\"",
49
+ "dev:runtime": "tsx src/cli/hive.ts --port 4010",
50
+ "dev:web": "vite --config web/vite.config.ts",
51
+ "build": "pnpm clean && tsc -p tsconfig.build.json && node scripts/prepare-build-artifacts.mjs && pnpm build:web",
52
+ "build:web": "vite build --config web/vite.config.ts",
53
+ "check": "pnpm exec biome check .",
54
+ "format": "pnpm exec biome format --write .",
55
+ "pack:check": "npm pack --dry-run --json",
56
+ "pack:smoke": "node scripts/pack-smoke.mjs",
57
+ "postinstall": "node scripts/fix-runtime-artifacts.mjs",
58
+ "release:dry": "pnpm check && pnpm build && pnpm test && pnpm pack:check && pnpm pack:smoke",
59
+ "test": "vitest run",
60
+ "test:windows": "vitest run tests/unit/agent-command-resolver.test.ts tests/unit/session-capture-multi-cli.test.ts tests/unit/claude-session-support.test.ts tests/unit/worker-name-generator.test.ts tests/server/fs-pick-folder.test.ts tests/server/fs-browse.test.ts tests/server/schema-version.test.ts tests/server/runtime-rehydration.test.ts tests/web/workspace-picker.test.tsx tests/web/confirm-dialog.test.tsx tests/web/toast.test.tsx --no-file-parallelism --maxWorkers=1 --testTimeout=30000 --hookTimeout=30000",
61
+ "test:watch": "vitest"
62
+ },
63
+ "dependencies": {
64
+ "@radix-ui/react-dialog": "^1.1.15",
65
+ "@radix-ui/react-slot": "^1.2.4",
66
+ "@radix-ui/react-tooltip": "^1.2.8",
67
+ "@tailwindcss/vite": "^4.2.2",
68
+ "@xterm/addon-fit": "^0.11.0",
69
+ "@xterm/addon-serialize": "^0.14.0",
70
+ "@xterm/headless": "^6.0.0",
71
+ "@xterm/xterm": "^6.0.0",
72
+ "better-sqlite3": "^12.9.0",
73
+ "chokidar": "^5.0.0",
74
+ "class-variance-authority": "^0.7.1",
75
+ "clsx": "^2.1.1",
76
+ "commander": "^14.0.0",
77
+ "lucide-react": "^1.8.0",
78
+ "node-pty": "^1.1.0",
79
+ "react": "^19.1.0",
80
+ "react-dom": "^19.1.0",
81
+ "tailwind-merge": "^3.5.0",
82
+ "tailwindcss": "^4.2.2",
83
+ "ws": "^8.20.0"
84
+ },
85
+ "devDependencies": {
86
+ "@biomejs/biome": "2.4.12",
87
+ "@testing-library/jest-dom": "^6.6.3",
88
+ "@testing-library/react": "^16.1.0",
89
+ "@types/better-sqlite3": "^7.6.13",
90
+ "@types/node": "^24.6.0",
91
+ "@types/react": "^19.1.13",
92
+ "@types/react-dom": "^19.1.9",
93
+ "@types/ws": "^8.18.1",
94
+ "concurrently": "^9.1.2",
95
+ "jsdom": "^26.1.0",
96
+ "tsx": "^4.20.6",
97
+ "typescript": "^5.9.3",
98
+ "vite": "^7.1.10",
99
+ "vitest": "^3.2.4"
100
+ },
101
+ "pnpm": {
102
+ "onlyBuiltDependencies": [
103
+ "better-sqlite3",
104
+ "esbuild",
105
+ "node-pty"
106
+ ]
107
+ }
108
+ }
@@ -0,0 +1,33 @@
1
+ import { chmodSync, existsSync, readdirSync } from 'node:fs'
2
+ import { createRequire } from 'node:module'
3
+ import { dirname, join } from 'node:path'
4
+
5
+ const executablePaths = [
6
+ 'bin/team',
7
+ 'bin/team.cmd',
8
+ 'dist/bin/team',
9
+ 'dist/bin/team.cmd',
10
+ 'node_modules/.pnpm/node-pty@1.1.0/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper',
11
+ ]
12
+
13
+ const require = createRequire(import.meta.url)
14
+
15
+ try {
16
+ const nodePtyPackageJson = require.resolve('node-pty/package.json')
17
+ const nodePtyRoot = dirname(nodePtyPackageJson)
18
+ const prebuildsDir = join(nodePtyRoot, 'prebuilds')
19
+
20
+ for (const entry of existsSync(prebuildsDir) ? readdirSync(prebuildsDir) : []) {
21
+ executablePaths.push(join(prebuildsDir, entry, 'spawn-helper'))
22
+ }
23
+ } catch {
24
+ // node-pty may not be installed when this script runs in partial dev setups.
25
+ }
26
+
27
+ for (const filePath of executablePaths) {
28
+ if (!existsSync(filePath)) {
29
+ continue
30
+ }
31
+
32
+ chmodSync(filePath, 0o755)
33
+ }
@@ -0,0 +1 @@
1
+ var p=2,c=1,d=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let i=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(i._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let i=this._terminal.options.scrollback===0?0:this._terminal.options.overviewRuler?.width||14,s=window.getComputedStyle(this._terminal.element.parentElement),l=parseInt(s.getPropertyValue("height")),o=Math.max(0,parseInt(s.getPropertyValue("width"))),t=window.getComputedStyle(this._terminal.element),r={top:parseInt(t.getPropertyValue("padding-top")),bottom:parseInt(t.getPropertyValue("padding-bottom")),right:parseInt(t.getPropertyValue("padding-right")),left:parseInt(t.getPropertyValue("padding-left"))},a=r.top+r.bottom,n=r.right+r.left,h=l-a,m=o-n-i;return{cols:Math.max(p,Math.floor(m/e.css.cell.width)),rows:Math.max(c,Math.floor(h/e.css.cell.height))}}};export{d as FitAddon};