@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,55 @@
1
+ import { TASKS_RELATIVE_PATH } from './tasks-file.js';
2
+ export const ORCHESTRATOR_ROLE_DESCRIPTION = [
3
+ '你是 Hive 的 Orchestrator,负责直接响应用户并组织右侧真实成员协作。',
4
+ '工作方式:',
5
+ '- 澄清目标,把需求拆成可派发的小任务。',
6
+ `- 维护 ${TASKS_RELATIVE_PATH},让当前计划、进度和阻塞可追踪。`,
7
+ '- 根据成员汇报推进下一步,不把选择题无谓丢回给用户。',
8
+ ].join('\n');
9
+ export const CODER_ROLE_DESCRIPTION = [
10
+ '你是实现型 Coder,负责把明确任务落成最小正确代码改动。',
11
+ '工作方式:',
12
+ '- 先阅读相关文件和现有模式,再动手。',
13
+ '- 优先小步修改,避免无关重构和范围扩张。',
14
+ '- 改动后运行能覆盖风险的验证命令;不能验证时说明原因。',
15
+ '交付说明要包含:改动文件、验证结果、剩余风险或阻塞。',
16
+ ].join('\n');
17
+ export const REVIEWER_ROLE_DESCRIPTION = [
18
+ '你是监工型 Reviewer,负责质量审查,不替代 Orchestrator,也不默认改代码。',
19
+ '工作方式:',
20
+ '- 优先找真实 bug、回归风险、边界条件和测试缺口。',
21
+ '- 发现问题时给出严重度、文件/行号、触发条件和最小修复建议。',
22
+ '- 没有高风险问题时明确说清剩余风险和未验证范围。',
23
+ '交付说明按严重度排序,先列 blocking 问题。',
24
+ ].join('\n');
25
+ export const TESTER_ROLE_DESCRIPTION = [
26
+ '你是验证型 Tester,负责复现、测试和证据化验证。',
27
+ '工作方式:',
28
+ '- 先明确要验证的行为、入口和失败条件。',
29
+ '- 优先跑真实命令或真实链路;必要时补充最小测试。',
30
+ '- 记录命令、结果、关键输出和不能覆盖的场景。',
31
+ '交付说明要区分通过、失败、未验证和建议下一步。',
32
+ ].join('\n');
33
+ export const CUSTOM_ROLE_DESCRIPTION = [
34
+ '你是自定义成员。请把这段改成该成员的行为契约。',
35
+ '建议包含:',
36
+ '- 目标:这个成员主要负责什么。',
37
+ '- 边界:哪些事可以做,哪些事不要做。',
38
+ '- 工作方式:如何调查、修改、验证或审查。',
39
+ '- 完成标准:交付时需要说明哪些结果、风险和阻塞。',
40
+ ].join('\n');
41
+ export const getDefaultRoleDescription = (role) => {
42
+ switch (role) {
43
+ case 'orchestrator':
44
+ return ORCHESTRATOR_ROLE_DESCRIPTION;
45
+ case 'coder':
46
+ return CODER_ROLE_DESCRIPTION;
47
+ case 'reviewer':
48
+ return REVIEWER_ROLE_DESCRIPTION;
49
+ case 'tester':
50
+ return TESTER_ROLE_DESCRIPTION;
51
+ case 'custom':
52
+ return CUSTOM_ROLE_DESCRIPTION;
53
+ }
54
+ };
55
+ //# sourceMappingURL=role-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-templates.js","sourceRoot":"","sources":["../../../src/server/role-templates.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,6CAA6C;IAC7C,OAAO;IACP,sBAAsB;IACtB,QAAQ,mBAAmB,kBAAkB;IAC7C,6BAA6B;CAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,gCAAgC;IAChC,OAAO;IACP,qBAAqB;IACrB,uBAAuB;IACvB,8BAA8B;IAC9B,4BAA4B;CAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,iDAAiD;IACjD,OAAO;IACP,6BAA6B;IAC7B,iCAAiC;IACjC,2BAA2B;IAC3B,4BAA4B;CAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,6BAA6B;IAC7B,OAAO;IACP,sBAAsB;IACtB,2BAA2B;IAC3B,yBAAyB;IACzB,yBAAyB;CAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,yBAAyB;IACzB,OAAO;IACP,kBAAkB;IAClB,qBAAqB;IACrB,uBAAuB;IACvB,2BAA2B;CAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAiC,EAAE,EAAE;IAC7E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,cAAc;YACjB,OAAO,6BAA6B,CAAA;QACtC,KAAK,OAAO;YACV,OAAO,sBAAsB,CAAA;QAC/B,KAAK,UAAU;YACb,OAAO,yBAAyB,CAAA;QAClC,KAAK,QAAQ;YACX,OAAO,uBAAuB,CAAA;QAChC,KAAK,QAAQ;YACX,OAAO,uBAAuB,CAAA;IAClC,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { RouteDefinition } from './route-types.js';
3
+ export declare const sendJson: (response: ServerResponse, statusCode: number, body: unknown) => void;
4
+ export declare const readJsonBody: <T>(request: IncomingMessage) => Promise<T>;
5
+ export declare const getRequiredParam: (response: ServerResponse, params: Record<string, string>, key: string, error: string) => string | null;
6
+ export declare const route: (method: string, path: string, handler: RouteDefinition["handler"]) => RouteDefinition;
7
+ export declare const matchPath: (pattern: string, pathname: string) => Record<string, string> | null;
@@ -0,0 +1,48 @@
1
+ export const sendJson = (response, statusCode, body) => {
2
+ response.statusCode = statusCode;
3
+ response.setHeader('content-type', 'application/json; charset=utf-8');
4
+ response.end(JSON.stringify(body));
5
+ };
6
+ export const readJsonBody = async (request) => {
7
+ const chunks = [];
8
+ for await (const chunk of request) {
9
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
10
+ }
11
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
12
+ };
13
+ export const getRequiredParam = (response, params, key, error) => {
14
+ const value = params[key];
15
+ if (value) {
16
+ return value;
17
+ }
18
+ sendJson(response, 400, { error });
19
+ return null;
20
+ };
21
+ export const route = (method, path, handler) => ({
22
+ method,
23
+ path,
24
+ handler,
25
+ });
26
+ export const matchPath = (pattern, pathname) => {
27
+ const patternParts = pattern.split('/').filter(Boolean);
28
+ const pathParts = pathname.split('/').filter(Boolean);
29
+ if (patternParts.length !== pathParts.length) {
30
+ return null;
31
+ }
32
+ const params = {};
33
+ for (const [index, patternPart] of patternParts.entries()) {
34
+ const pathPart = pathParts[index];
35
+ if (!pathPart) {
36
+ return null;
37
+ }
38
+ if (patternPart.startsWith(':')) {
39
+ params[patternPart.slice(1)] = decodeURIComponent(pathPart);
40
+ continue;
41
+ }
42
+ if (patternPart !== pathPart) {
43
+ return null;
44
+ }
45
+ }
46
+ return params;
47
+ };
48
+ //# sourceMappingURL=route-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../../src/server/route-helpers.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAE,UAAkB,EAAE,IAAa,EAAE,EAAE;IACtF,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAA;IACrE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAK,OAAwB,EAAc,EAAE;IAC5E,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACrE,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAM,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,QAAwB,EACxB,MAA8B,EAC9B,GAAW,EACX,KAAa,EACb,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAA;IACd,CAAC;IAED,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAClC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,MAAc,EACd,IAAY,EACZ,OAAmC,EAClB,EAAE,CAAC,CAAC;IACrB,MAAM;IACN,IAAI;IACJ,OAAO;CACR,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAE,EAAE;IAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAErD,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;YAC3D,SAAQ;QACV,CAAC;QAED,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,58 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { WorkerRole } from '../shared/types.js';
3
+ import type { PickFolderResponse } from './fs-pick-folder.js';
4
+ import type { RuntimeStore } from './runtime-store.js';
5
+ import type { TasksFileService } from './tasks-file.js';
6
+ export interface SendTaskBody {
7
+ hive_port?: string;
8
+ project_id: string;
9
+ from_agent_id: string;
10
+ token?: string;
11
+ to: string;
12
+ text: string;
13
+ }
14
+ export interface ReportTaskBody {
15
+ project_id: string;
16
+ from_agent_id: string;
17
+ token?: string;
18
+ result: string;
19
+ status?: string;
20
+ artifacts?: unknown[];
21
+ }
22
+ export interface CreateWorkspaceBody {
23
+ path: string;
24
+ name: string;
25
+ /** Default true. When false, skip orchestrator PTY spawn after creation. */
26
+ autostart_orchestrator?: boolean;
27
+ /** Optional command preset to use for the initial orchestrator launch. */
28
+ command_preset_id?: string | null;
29
+ }
30
+ export interface CreateWorkerBody {
31
+ autostart?: boolean;
32
+ command_preset_id?: string | null;
33
+ description?: string;
34
+ name: string;
35
+ role: WorkerRole;
36
+ }
37
+ export interface UserInputBody {
38
+ text: string;
39
+ }
40
+ export interface ConfigureAgentLaunchBody {
41
+ command: string;
42
+ args?: string[];
43
+ command_preset_id?: string | null;
44
+ }
45
+ export interface RouteContext {
46
+ request: IncomingMessage;
47
+ response: ServerResponse;
48
+ store: RuntimeStore;
49
+ tasksFileService: TasksFileService;
50
+ pickFolderService: () => Promise<PickFolderResponse>;
51
+ params: Record<string, string>;
52
+ }
53
+ export interface RouteDefinition {
54
+ method: string;
55
+ path: string;
56
+ handler: (context: RouteContext) => Promise<void> | void;
57
+ }
58
+ export type { WorkerRole };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=route-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-types.js","sourceRoot":"","sources":["../../../src/server/route-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const dispatchRoutes: RouteDefinition[];
@@ -0,0 +1,53 @@
1
+ import { serializeDispatchRecord } from './dispatch-ledger-serializer.js';
2
+ import { getRequiredParam, route, sendJson } from './route-helpers.js';
3
+ import { requireUiTokenFromRequest } from './ui-auth-helpers.js';
4
+ const DISPATCH_STATUSES = new Set(['queued', 'submitted', 'reported']);
5
+ const MAX_DISPATCH_LIMIT = 100;
6
+ const MAX_DISPATCH_OFFSET = 100_000;
7
+ const readBoundedInt = (response, value, name, fallback, max) => {
8
+ if (value === null)
9
+ return fallback;
10
+ if (!/^(0|[1-9][0-9]*)$/.test(value)) {
11
+ sendJson(response, 400, { error: `${name} must be a non-negative integer` });
12
+ return null;
13
+ }
14
+ const parsed = Number(value);
15
+ if (!Number.isSafeInteger(parsed) || parsed > max) {
16
+ sendJson(response, 400, { error: `${name} must be between 0 and ${max}` });
17
+ return null;
18
+ }
19
+ return parsed;
20
+ };
21
+ const isDispatchStatus = (value) => DISPATCH_STATUSES.has(value);
22
+ export const dispatchRoutes = [
23
+ route('GET', '/api/ui/workspaces/:workspaceId/dispatches', ({ params, request, response, store }) => {
24
+ const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
25
+ if (!workspaceId) {
26
+ return;
27
+ }
28
+ requireUiTokenFromRequest(request, store.validateUiToken);
29
+ const url = new URL(request.url ?? '/', 'http://127.0.0.1');
30
+ if (url.searchParams.has('status')) {
31
+ sendJson(response, 400, { error: 'Use state instead of status for dispatch filtering' });
32
+ return;
33
+ }
34
+ const state = url.searchParams.get('state');
35
+ if (state !== null && !isDispatchStatus(state)) {
36
+ sendJson(response, 400, { error: 'state must be queued, submitted, or reported' });
37
+ return;
38
+ }
39
+ const limit = readBoundedInt(response, url.searchParams.get('limit'), 'limit', MAX_DISPATCH_LIMIT, MAX_DISPATCH_LIMIT);
40
+ if (limit === null)
41
+ return;
42
+ const offset = readBoundedInt(response, url.searchParams.get('offset'), 'offset', 0, MAX_DISPATCH_OFFSET);
43
+ if (offset === null)
44
+ return;
45
+ const options = {
46
+ limit,
47
+ offset,
48
+ ...(state ? { status: state } : {}),
49
+ };
50
+ sendJson(response, 200, store.listDispatches(workspaceId, options).map(serializeDispatchRecord));
51
+ }),
52
+ ];
53
+ //# sourceMappingURL=routes-dispatches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-dispatches.js","sourceRoot":"","sources":["../../../src/server/routes-dispatches.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const fsRoutes: RouteDefinition[];
@@ -0,0 +1,25 @@
1
+ import { browseDirectory, probeDirectory } from './fs-browse.js';
2
+ import { route, sendJson } from './route-helpers.js';
3
+ import { requireUiTokenFromRequest } from './ui-auth-helpers.js';
4
+ const readPathParam = (request) => {
5
+ const url = new URL(request.url ?? '/', 'http://127.0.0.1');
6
+ return url.searchParams.get('path') ?? '';
7
+ };
8
+ export const fsRoutes = [
9
+ route('GET', '/api/fs/browse', async ({ request, response, store }) => {
10
+ requireUiTokenFromRequest(request, store.validateUiToken);
11
+ const body = await browseDirectory(readPathParam(request));
12
+ sendJson(response, body.ok ? 200 : 400, body);
13
+ }),
14
+ route('GET', '/api/fs/probe', async ({ request, response, store }) => {
15
+ requireUiTokenFromRequest(request, store.validateUiToken);
16
+ const body = await probeDirectory(readPathParam(request));
17
+ sendJson(response, 200, body);
18
+ }),
19
+ route('POST', '/api/fs/pick-folder', async ({ pickFolderService, request, response, store }) => {
20
+ requireUiTokenFromRequest(request, store.validateUiToken);
21
+ const body = await pickFolderService();
22
+ sendJson(response, 200, body);
23
+ }),
24
+ ];
25
+ //# sourceMappingURL=routes-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-fs.js","sourceRoot":"","sources":["../../../src/server/routes-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,MAAM,aAAa,GAAG,CAAC,OAAqC,EAAU,EAAE;IACtE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC3D,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAsB;IACzC,KAAK,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACpE,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;QAC1D,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC/C,CAAC,CAAC;IACF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACnE,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;QACzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC,CAAC;IACF,KAAK,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7F,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAA;QACtC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC,CAAC;CACH,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const runtimeRoutes: RouteDefinition[];
@@ -0,0 +1,46 @@
1
+ import { getRequiredParam, readJsonBody, route, sendJson } from './route-helpers.js';
2
+ import { requireUiTokenFromRequest } from './ui-auth-helpers.js';
3
+ export const runtimeRoutes = [
4
+ route('GET', '/api/ui/workspaces/:workspaceId/runs', ({ params, request, response, store }) => {
5
+ const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
6
+ if (!workspaceId) {
7
+ return;
8
+ }
9
+ requireUiTokenFromRequest(request, store.validateUiToken);
10
+ sendJson(response, 200, store.listTerminalRuns(workspaceId));
11
+ }),
12
+ route('POST', '/api/workspaces/:workspaceId/agents/:agentId/config', async ({ params, request, response, store }) => {
13
+ const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id and agent id are required');
14
+ const agentId = getRequiredParam(response, params, 'agentId', 'Workspace id and agent id are required');
15
+ if (!workspaceId || !agentId) {
16
+ return;
17
+ }
18
+ requireUiTokenFromRequest(request, store.validateUiToken);
19
+ const body = await readJsonBody(request);
20
+ store.configureAgentLaunch(workspaceId, agentId, {
21
+ command: body.command,
22
+ commandPresetId: body.command_preset_id ?? null,
23
+ ...(body.args ? { args: body.args } : {}),
24
+ });
25
+ response.statusCode = 204;
26
+ response.end();
27
+ }),
28
+ route('POST', '/api/runtime/runs/:runId/stop', ({ params, request, response, store }) => {
29
+ const runId = getRequiredParam(response, params, 'runId', 'Run id is required');
30
+ if (!runId) {
31
+ return;
32
+ }
33
+ requireUiTokenFromRequest(request, store.validateUiToken);
34
+ store.stopAgentRun(runId);
35
+ sendJson(response, 202, { ok: true });
36
+ }),
37
+ route('GET', '/api/runtime/runs/:runId', ({ params, request, response, store }) => {
38
+ const runId = getRequiredParam(response, params, 'runId', 'Run id is required');
39
+ if (!runId) {
40
+ return;
41
+ }
42
+ requireUiTokenFromRequest(request, store.validateUiToken);
43
+ sendJson(response, 200, store.getLiveRun(runId));
44
+ }),
45
+ ];
46
+ //# sourceMappingURL=routes-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-runtime.js","sourceRoot":"","sources":["../../../src/server/routes-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAEpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,KAAK,CAAC,KAAK,EAAE,sCAAsC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5F,MAAM,WAAW,GAAG,gBAAgB,CAClC,QAAQ,EACR,MAAM,EACN,aAAa,EACb,0BAA0B,CAC3B,CAAA;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAEzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC;IACF,KAAK,CACH,MAAM,EACN,qDAAqD,EACrD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7C,MAAM,WAAW,GAAG,gBAAgB,CAClC,QAAQ,EACR,MAAM,EACN,aAAa,EACb,wCAAwC,CACzC,CAAA;QACD,MAAM,OAAO,GAAG,gBAAgB,CAC9B,QAAQ,EACR,MAAM,EACN,SAAS,EACT,wCAAwC,CACzC,CAAA;QACD,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAM;QACR,CAAC;QAED,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAEzD,MAAM,IAAI,GAAG,MAAM,YAAY,CAA2B,OAAO,CAAC,CAAA;QAClE,KAAK,CAAC,oBAAoB,CAAC,WAAW,EAAE,OAAO,EAAE;YAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;YAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAA;QACF,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAA;QACzB,QAAQ,CAAC,GAAG,EAAE,CAAA;IAChB,CAAC,CACF;IACD,KAAK,CAAC,MAAM,EAAE,+BAA+B,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACtF,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAA;QAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAEzD,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QACzB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC;IACF,KAAK,CAAC,KAAK,EAAE,0BAA0B,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAChF,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAA;QAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAEzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC;CACH,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const settingsRoutes: RouteDefinition[];
@@ -0,0 +1,124 @@
1
+ import { getRequiredParam, readJsonBody, route, sendJson } from './route-helpers.js';
2
+ import { requireUiTokenFromRequest } from './ui-auth-helpers.js';
3
+ const serializeCommandPreset = (preset) => ({
4
+ id: preset.id,
5
+ display_name: preset.displayName,
6
+ command: preset.command,
7
+ args: preset.args,
8
+ env: preset.env,
9
+ resume_args_template: preset.resumeArgsTemplate,
10
+ session_id_capture: preset.sessionIdCapture,
11
+ yolo_args_template: preset.yoloArgsTemplate,
12
+ is_builtin: preset.isBuiltin,
13
+ });
14
+ const serializeRoleTemplate = (template) => ({
15
+ id: template.id,
16
+ name: template.name,
17
+ role_type: template.roleType,
18
+ description: template.description,
19
+ default_command: template.defaultCommand,
20
+ default_args: template.defaultArgs,
21
+ default_env: template.defaultEnv,
22
+ is_builtin: template.isBuiltin,
23
+ });
24
+ const readCommandPresetBody = async (request) => {
25
+ const body = await readJsonBody(request);
26
+ return {
27
+ displayName: body.display_name ?? '',
28
+ command: body.command ?? '',
29
+ args: body.args ?? [],
30
+ env: body.env ?? {},
31
+ resumeArgsTemplate: body.resume_args_template ?? null,
32
+ sessionIdCapture: body.session_id_capture ?? null,
33
+ yoloArgsTemplate: body.yolo_args_template ?? null,
34
+ };
35
+ };
36
+ const readRoleTemplateBody = async (request) => {
37
+ const body = await readJsonBody(request);
38
+ return {
39
+ name: body.name ?? '',
40
+ roleType: body.role_type ?? 'custom',
41
+ description: body.description ?? '',
42
+ defaultCommand: body.default_command ?? '',
43
+ defaultArgs: body.default_args ?? [],
44
+ defaultEnv: body.default_env ?? {},
45
+ };
46
+ };
47
+ export const settingsRoutes = [
48
+ route('GET', '/api/settings/command-presets', ({ request, response, store }) => {
49
+ requireUiTokenFromRequest(request, store.validateUiToken);
50
+ sendJson(response, 200, store.settings.listCommandPresets().map(serializeCommandPreset));
51
+ }),
52
+ route('POST', '/api/settings/command-presets', async ({ request, response, store }) => {
53
+ requireUiTokenFromRequest(request, store.validateUiToken);
54
+ sendJson(response, 201, serializeCommandPreset(store.settings.createCommandPreset(await readCommandPresetBody(request))));
55
+ }),
56
+ route('PATCH', '/api/settings/command-presets/:presetId', async ({ params, request, response, store }) => {
57
+ requireUiTokenFromRequest(request, store.validateUiToken);
58
+ const presetId = getRequiredParam(response, params, 'presetId', 'Preset id is required');
59
+ if (!presetId)
60
+ return;
61
+ const current = store.settings.listCommandPresets().find((preset) => preset.id === presetId);
62
+ if (!current)
63
+ throw new Error(`Command preset not found: ${presetId}`);
64
+ const next = { ...current, ...(await readCommandPresetBody(request)) };
65
+ sendJson(response, 200, serializeCommandPreset(store.settings.updateCommandPreset(presetId, next)));
66
+ }),
67
+ route('DELETE', '/api/settings/command-presets/:presetId', ({ params, request, response, store }) => {
68
+ requireUiTokenFromRequest(request, store.validateUiToken);
69
+ const presetId = getRequiredParam(response, params, 'presetId', 'Preset id is required');
70
+ if (!presetId)
71
+ return;
72
+ store.settings.deleteCommandPreset(presetId);
73
+ response.statusCode = 204;
74
+ response.end();
75
+ }),
76
+ route('GET', '/api/settings/role-templates', ({ request, response, store }) => {
77
+ requireUiTokenFromRequest(request, store.validateUiToken);
78
+ sendJson(response, 200, store.settings.listRoleTemplates().map(serializeRoleTemplate));
79
+ }),
80
+ route('POST', '/api/settings/role-templates', async ({ request, response, store }) => {
81
+ requireUiTokenFromRequest(request, store.validateUiToken);
82
+ sendJson(response, 201, serializeRoleTemplate(store.settings.createRoleTemplate(await readRoleTemplateBody(request))));
83
+ }),
84
+ route('PATCH', '/api/settings/role-templates/:templateId', async ({ params, request, response, store }) => {
85
+ requireUiTokenFromRequest(request, store.validateUiToken);
86
+ const templateId = getRequiredParam(response, params, 'templateId', 'Template id is required');
87
+ if (!templateId)
88
+ return;
89
+ const current = store.settings
90
+ .listRoleTemplates()
91
+ .find((template) => template.id === templateId);
92
+ if (!current)
93
+ throw new Error(`Role template not found: ${templateId}`);
94
+ const next = { ...current, ...(await readRoleTemplateBody(request)) };
95
+ sendJson(response, 200, serializeRoleTemplate(store.settings.updateRoleTemplate(templateId, next)));
96
+ }),
97
+ route('DELETE', '/api/settings/role-templates/:templateId', ({ params, request, response, store }) => {
98
+ requireUiTokenFromRequest(request, store.validateUiToken);
99
+ const templateId = getRequiredParam(response, params, 'templateId', 'Template id is required');
100
+ if (!templateId)
101
+ return;
102
+ store.settings.deleteRoleTemplate(templateId);
103
+ response.statusCode = 204;
104
+ response.end();
105
+ }),
106
+ route('GET', '/api/settings/app-state/:key', ({ params, request, response, store }) => {
107
+ requireUiTokenFromRequest(request, store.validateUiToken);
108
+ const key = getRequiredParam(response, params, 'key', 'App state key is required');
109
+ if (!key)
110
+ return;
111
+ sendJson(response, 200, store.settings.getAppState(key) ?? { key, value: null });
112
+ }),
113
+ route('PUT', '/api/settings/app-state/:key', async ({ params, request, response, store }) => {
114
+ requireUiTokenFromRequest(request, store.validateUiToken);
115
+ const key = getRequiredParam(response, params, 'key', 'App state key is required');
116
+ if (!key)
117
+ return;
118
+ const body = await readJsonBody(request);
119
+ store.settings.setAppState(key, body.value);
120
+ response.statusCode = 204;
121
+ response.end();
122
+ }),
123
+ ];
124
+ //# sourceMappingURL=routes-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-settings.js","sourceRoot":"","sources":["../../../src/server/routes-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const taskRoutes: RouteDefinition[];
@@ -0,0 +1,25 @@
1
+ import { getRequiredParam, readJsonBody, route, sendJson } from './route-helpers.js';
2
+ import { requireUiTokenFromRequest } from './ui-auth-helpers.js';
3
+ export const taskRoutes = [
4
+ route('GET', '/api/workspaces/:workspaceId/tasks', ({ params, request, response, store, tasksFileService }) => {
5
+ const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
6
+ if (!workspaceId) {
7
+ return;
8
+ }
9
+ requireUiTokenFromRequest(request, store.validateUiToken);
10
+ const workspace = store.getWorkspaceSnapshot(workspaceId);
11
+ sendJson(response, 200, { content: tasksFileService.readTasks(workspace.summary.path) });
12
+ }),
13
+ route('PUT', '/api/workspaces/:workspaceId/tasks', async ({ params, request, response, store, tasksFileService }) => {
14
+ const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
15
+ if (!workspaceId) {
16
+ return;
17
+ }
18
+ requireUiTokenFromRequest(request, store.validateUiToken);
19
+ const body = await readJsonBody(request);
20
+ const workspace = store.getWorkspaceSnapshot(workspaceId);
21
+ tasksFileService.writeTasks(workspace.summary.path, body.content);
22
+ sendJson(response, 200, { content: body.content });
23
+ }),
24
+ ];
25
+ //# sourceMappingURL=routes-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-tasks.js","sourceRoot":"","sources":["../../../src/server/routes-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAEpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C,KAAK,CACH,KAAK,EACL,oCAAoC,EACpC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE;QACzD,MAAM,WAAW,GAAG,gBAAgB,CAClC,QAAQ,EACR,MAAM,EACN,aAAa,EACb,0BAA0B,CAC3B,CAAA;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAEzD,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAA;QACzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC1F,CAAC,CACF;IACD,KAAK,CACH,KAAK,EACL,oCAAoC,EACpC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE;QAC/D,MAAM,WAAW,GAAG,gBAAgB,CAClC,QAAQ,EACR,MAAM,EACN,aAAa,EACb,0BAA0B,CAC3B,CAAA;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;QAEzD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAsB,OAAO,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAA;QACzD,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACjE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IACpD,CAAC,CACF;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const teamRoutes: RouteDefinition[];
@@ -0,0 +1,50 @@
1
+ import { readJsonBody, route, sendJson } from './route-helpers.js';
2
+ import { authenticateCliAgent, requireCommandForRole } from './team-authz.js';
3
+ export const teamRoutes = [
4
+ route('POST', '/api/team/send', async ({ request, response, store }) => {
5
+ const body = await readJsonBody(request);
6
+ const agent = authenticateCliAgent({
7
+ fromAgentId: body.from_agent_id,
8
+ getAgent: store.getAgent,
9
+ token: body.token,
10
+ validateToken: store.validateAgentToken,
11
+ workspaceId: body.project_id,
12
+ });
13
+ requireCommandForRole(agent, 'send');
14
+ const dispatch = await store.dispatchTaskByWorkerName(body.project_id, body.to, body.text, {
15
+ fromAgentId: body.from_agent_id,
16
+ hivePort: String(request.socket.localPort ?? ''),
17
+ });
18
+ sendJson(response, 202, { dispatch_id: dispatch.id, ok: true });
19
+ }),
20
+ route('POST', '/api/team/report', async ({ request, response, store }) => {
21
+ const body = await readJsonBody(request);
22
+ const agent = authenticateCliAgent({
23
+ fromAgentId: body.from_agent_id,
24
+ getAgent: store.getAgent,
25
+ token: body.token,
26
+ validateToken: store.validateAgentToken,
27
+ workspaceId: body.project_id,
28
+ });
29
+ requireCommandForRole(agent, 'report');
30
+ const reportInput = {
31
+ artifacts: (body.artifacts ?? []).filter((item) => typeof item === 'string'),
32
+ requireActiveRun: true,
33
+ text: body.result,
34
+ };
35
+ if (typeof body.status === 'string') {
36
+ const dispatch = store.reportTask(body.project_id, body.from_agent_id, {
37
+ ...reportInput,
38
+ status: body.status,
39
+ });
40
+ sendJson(response, 202, { dispatch_id: dispatch.id, ok: true });
41
+ return;
42
+ }
43
+ else {
44
+ const dispatch = store.reportTask(body.project_id, body.from_agent_id, reportInput);
45
+ sendJson(response, 202, { dispatch_id: dispatch.id, ok: true });
46
+ return;
47
+ }
48
+ }),
49
+ ];
50
+ //# sourceMappingURL=routes-team.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-team.js","sourceRoot":"","sources":["../../../src/server/routes-team.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const uiRoutes: RouteDefinition[];
@@ -0,0 +1,8 @@
1
+ import { route, sendJson } from './route-helpers.js';
2
+ export const uiRoutes = [
3
+ route('GET', '/api/ui/session', ({ response, store }) => {
4
+ response.setHeader('set-cookie', `hive_ui_token=${store.getUiToken()}; Path=/; HttpOnly; SameSite=Strict`);
5
+ sendJson(response, 200, { ok: true });
6
+ }),
7
+ ];
8
+ //# sourceMappingURL=routes-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-ui.js","sourceRoot":"","sources":["../../../src/server/routes-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGpD,MAAM,CAAC,MAAM,QAAQ,GAAsB;IACzC,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QACtD,QAAQ,CAAC,SAAS,CAChB,YAAY,EACZ,iBAAiB,KAAK,CAAC,UAAU,EAAE,qCAAqC,CACzE,CAAA;QACD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC;CACH,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { RouteDefinition } from './route-types.js';
2
+ export declare const workspaceRoutes: RouteDefinition[];