@cluesmith/codev 2.0.0-rc.9 → 2.0.1

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 (537) hide show
  1. package/bin/af.js +2 -2
  2. package/bin/consult.js +1 -1
  3. package/dashboard/dist/assets/index-4n9zpWLY.css +32 -0
  4. package/dashboard/dist/assets/index-b38SaXk5.js +136 -0
  5. package/dashboard/dist/assets/index-b38SaXk5.js.map +1 -0
  6. package/dashboard/dist/index.html +14 -0
  7. package/dist/agent-farm/cli.d.ts.map +1 -1
  8. package/dist/agent-farm/cli.js +179 -104
  9. package/dist/agent-farm/cli.js.map +1 -1
  10. package/dist/agent-farm/commands/architect.d.ts +3 -3
  11. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  12. package/dist/agent-farm/commands/architect.js +20 -147
  13. package/dist/agent-farm/commands/architect.js.map +1 -1
  14. package/dist/agent-farm/commands/attach.d.ts +13 -0
  15. package/dist/agent-farm/commands/attach.d.ts.map +1 -0
  16. package/dist/agent-farm/commands/attach.js +144 -0
  17. package/dist/agent-farm/commands/attach.js.map +1 -0
  18. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  19. package/dist/agent-farm/commands/cleanup.js +35 -19
  20. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  21. package/dist/agent-farm/commands/consult.d.ts +3 -4
  22. package/dist/agent-farm/commands/consult.d.ts.map +1 -1
  23. package/dist/agent-farm/commands/consult.js +27 -37
  24. package/dist/agent-farm/commands/consult.js.map +1 -1
  25. package/dist/agent-farm/commands/index.d.ts +2 -2
  26. package/dist/agent-farm/commands/index.d.ts.map +1 -1
  27. package/dist/agent-farm/commands/index.js +2 -2
  28. package/dist/agent-farm/commands/index.js.map +1 -1
  29. package/dist/agent-farm/commands/open.d.ts +4 -2
  30. package/dist/agent-farm/commands/open.d.ts.map +1 -1
  31. package/dist/agent-farm/commands/open.js +33 -83
  32. package/dist/agent-farm/commands/open.js.map +1 -1
  33. package/dist/agent-farm/commands/send.d.ts +1 -1
  34. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  35. package/dist/agent-farm/commands/send.js +70 -79
  36. package/dist/agent-farm/commands/send.js.map +1 -1
  37. package/dist/agent-farm/commands/shell.d.ts +15 -0
  38. package/dist/agent-farm/commands/shell.d.ts.map +1 -0
  39. package/dist/agent-farm/commands/shell.js +50 -0
  40. package/dist/agent-farm/commands/shell.js.map +1 -0
  41. package/dist/agent-farm/commands/spawn-roles.d.ts +80 -0
  42. package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -0
  43. package/dist/agent-farm/commands/spawn-roles.js +278 -0
  44. package/dist/agent-farm/commands/spawn-roles.js.map +1 -0
  45. package/dist/agent-farm/commands/spawn-worktree.d.ts +96 -0
  46. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -0
  47. package/dist/agent-farm/commands/spawn-worktree.js +305 -0
  48. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -0
  49. package/dist/agent-farm/commands/spawn.d.ts +5 -1
  50. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  51. package/dist/agent-farm/commands/spawn.js +241 -561
  52. package/dist/agent-farm/commands/spawn.js.map +1 -1
  53. package/dist/agent-farm/commands/start.d.ts +10 -20
  54. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  55. package/dist/agent-farm/commands/start.js +45 -449
  56. package/dist/agent-farm/commands/start.js.map +1 -1
  57. package/dist/agent-farm/commands/status.d.ts +2 -0
  58. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  59. package/dist/agent-farm/commands/status.js +75 -24
  60. package/dist/agent-farm/commands/status.js.map +1 -1
  61. package/dist/agent-farm/commands/stop.d.ts +6 -0
  62. package/dist/agent-farm/commands/stop.d.ts.map +1 -1
  63. package/dist/agent-farm/commands/stop.js +49 -109
  64. package/dist/agent-farm/commands/stop.js.map +1 -1
  65. package/dist/agent-farm/commands/tower-cloud.d.ts +48 -0
  66. package/dist/agent-farm/commands/tower-cloud.d.ts.map +1 -0
  67. package/dist/agent-farm/commands/tower-cloud.js +293 -0
  68. package/dist/agent-farm/commands/tower-cloud.js.map +1 -0
  69. package/dist/agent-farm/commands/tower.d.ts +9 -0
  70. package/dist/agent-farm/commands/tower.d.ts.map +1 -1
  71. package/dist/agent-farm/commands/tower.js +59 -19
  72. package/dist/agent-farm/commands/tower.js.map +1 -1
  73. package/dist/agent-farm/db/index.d.ts +6 -2
  74. package/dist/agent-farm/db/index.d.ts.map +1 -1
  75. package/dist/agent-farm/db/index.js +301 -19
  76. package/dist/agent-farm/db/index.js.map +1 -1
  77. package/dist/agent-farm/db/migrate.d.ts +0 -4
  78. package/dist/agent-farm/db/migrate.d.ts.map +1 -1
  79. package/dist/agent-farm/db/migrate.js +6 -55
  80. package/dist/agent-farm/db/migrate.js.map +1 -1
  81. package/dist/agent-farm/db/schema.d.ts +3 -3
  82. package/dist/agent-farm/db/schema.d.ts.map +1 -1
  83. package/dist/agent-farm/db/schema.js +25 -19
  84. package/dist/agent-farm/db/schema.js.map +1 -1
  85. package/dist/agent-farm/db/types.d.ts +3 -13
  86. package/dist/agent-farm/db/types.d.ts.map +1 -1
  87. package/dist/agent-farm/db/types.js +3 -11
  88. package/dist/agent-farm/db/types.js.map +1 -1
  89. package/dist/agent-farm/hq-connector.d.ts +2 -6
  90. package/dist/agent-farm/hq-connector.d.ts.map +1 -1
  91. package/dist/agent-farm/hq-connector.js +2 -17
  92. package/dist/agent-farm/hq-connector.js.map +1 -1
  93. package/dist/agent-farm/lib/cloud-config.d.ts +59 -0
  94. package/dist/agent-farm/lib/cloud-config.d.ts.map +1 -0
  95. package/dist/agent-farm/lib/cloud-config.js +143 -0
  96. package/dist/agent-farm/lib/cloud-config.js.map +1 -0
  97. package/dist/agent-farm/lib/device-name.d.ts +25 -0
  98. package/dist/agent-farm/lib/device-name.d.ts.map +1 -0
  99. package/dist/agent-farm/lib/device-name.js +46 -0
  100. package/dist/agent-farm/lib/device-name.js.map +1 -0
  101. package/dist/agent-farm/lib/nonce-store.d.ts +28 -0
  102. package/dist/agent-farm/lib/nonce-store.d.ts.map +1 -0
  103. package/dist/agent-farm/lib/nonce-store.js +60 -0
  104. package/dist/agent-farm/lib/nonce-store.js.map +1 -0
  105. package/dist/agent-farm/lib/token-exchange.d.ts +18 -0
  106. package/dist/agent-farm/lib/token-exchange.d.ts.map +1 -0
  107. package/dist/agent-farm/lib/token-exchange.js +48 -0
  108. package/dist/agent-farm/lib/token-exchange.js.map +1 -0
  109. package/dist/agent-farm/lib/tower-client.d.ts +163 -0
  110. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -0
  111. package/dist/agent-farm/lib/tower-client.js +233 -0
  112. package/dist/agent-farm/lib/tower-client.js.map +1 -0
  113. package/dist/agent-farm/lib/tunnel-client.d.ts +117 -0
  114. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -0
  115. package/dist/agent-farm/lib/tunnel-client.js +504 -0
  116. package/dist/agent-farm/lib/tunnel-client.js.map +1 -0
  117. package/dist/agent-farm/servers/tower-instances.d.ts +82 -0
  118. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -0
  119. package/dist/agent-farm/servers/tower-instances.js +454 -0
  120. package/dist/agent-farm/servers/tower-instances.js.map +1 -0
  121. package/dist/agent-farm/servers/tower-routes.d.ts +34 -0
  122. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -0
  123. package/dist/agent-farm/servers/tower-routes.js +1445 -0
  124. package/dist/agent-farm/servers/tower-routes.js.map +1 -0
  125. package/dist/agent-farm/servers/tower-server.d.ts +5 -2
  126. package/dist/agent-farm/servers/tower-server.d.ts.map +1 -1
  127. package/dist/agent-farm/servers/tower-server.js +157 -475
  128. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  129. package/dist/agent-farm/servers/tower-terminals.d.ts +119 -0
  130. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -0
  131. package/dist/agent-farm/servers/tower-terminals.js +629 -0
  132. package/dist/agent-farm/servers/tower-terminals.js.map +1 -0
  133. package/dist/agent-farm/servers/tower-tunnel.d.ts +34 -0
  134. package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -0
  135. package/dist/agent-farm/servers/tower-tunnel.js +480 -0
  136. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -0
  137. package/dist/agent-farm/servers/tower-types.d.ts +86 -0
  138. package/dist/agent-farm/servers/tower-types.d.ts.map +1 -0
  139. package/dist/agent-farm/servers/tower-types.js +6 -0
  140. package/dist/agent-farm/servers/tower-types.js.map +1 -0
  141. package/dist/agent-farm/servers/tower-utils.d.ts +58 -0
  142. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -0
  143. package/dist/agent-farm/servers/tower-utils.js +182 -0
  144. package/dist/agent-farm/servers/tower-utils.js.map +1 -0
  145. package/dist/agent-farm/servers/tower-websocket.d.ts +25 -0
  146. package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -0
  147. package/dist/agent-farm/servers/tower-websocket.js +171 -0
  148. package/dist/agent-farm/servers/tower-websocket.js.map +1 -0
  149. package/dist/agent-farm/state.d.ts +6 -2
  150. package/dist/agent-farm/state.d.ts.map +1 -1
  151. package/dist/agent-farm/state.js +34 -25
  152. package/dist/agent-farm/state.js.map +1 -1
  153. package/dist/agent-farm/types.d.ts +49 -26
  154. package/dist/agent-farm/types.d.ts.map +1 -1
  155. package/dist/agent-farm/utils/config.d.ts +0 -5
  156. package/dist/agent-farm/utils/config.d.ts.map +1 -1
  157. package/dist/agent-farm/utils/config.js +12 -44
  158. package/dist/agent-farm/utils/config.js.map +1 -1
  159. package/dist/agent-farm/utils/deps.d.ts.map +1 -1
  160. package/dist/agent-farm/utils/deps.js +0 -32
  161. package/dist/agent-farm/utils/deps.js.map +1 -1
  162. package/dist/agent-farm/utils/file-tabs.d.ts +27 -0
  163. package/dist/agent-farm/utils/file-tabs.d.ts.map +1 -0
  164. package/dist/agent-farm/utils/file-tabs.js +46 -0
  165. package/dist/agent-farm/utils/file-tabs.js.map +1 -0
  166. package/dist/agent-farm/utils/gate-status.d.ts +16 -0
  167. package/dist/agent-farm/utils/gate-status.d.ts.map +1 -0
  168. package/dist/agent-farm/utils/gate-status.js +79 -0
  169. package/dist/agent-farm/utils/gate-status.js.map +1 -0
  170. package/dist/agent-farm/utils/gate-watcher.d.ts +38 -0
  171. package/dist/agent-farm/utils/gate-watcher.d.ts.map +1 -0
  172. package/dist/agent-farm/utils/gate-watcher.js +122 -0
  173. package/dist/agent-farm/utils/gate-watcher.js.map +1 -0
  174. package/dist/agent-farm/utils/index.d.ts +0 -1
  175. package/dist/agent-farm/utils/index.d.ts.map +1 -1
  176. package/dist/agent-farm/utils/index.js +0 -1
  177. package/dist/agent-farm/utils/index.js.map +1 -1
  178. package/dist/agent-farm/utils/notifications.d.ts +30 -0
  179. package/dist/agent-farm/utils/notifications.d.ts.map +1 -0
  180. package/dist/agent-farm/utils/notifications.js +121 -0
  181. package/dist/agent-farm/utils/notifications.js.map +1 -0
  182. package/dist/agent-farm/utils/server-utils.d.ts +5 -5
  183. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
  184. package/dist/agent-farm/utils/server-utils.js +5 -16
  185. package/dist/agent-farm/utils/server-utils.js.map +1 -1
  186. package/dist/agent-farm/utils/session.d.ts +32 -0
  187. package/dist/agent-farm/utils/session.d.ts.map +1 -0
  188. package/dist/agent-farm/utils/session.js +57 -0
  189. package/dist/agent-farm/utils/session.js.map +1 -0
  190. package/dist/agent-farm/utils/shell.d.ts +9 -22
  191. package/dist/agent-farm/utils/shell.d.ts.map +1 -1
  192. package/dist/agent-farm/utils/shell.js +34 -34
  193. package/dist/agent-farm/utils/shell.js.map +1 -1
  194. package/dist/cli.d.ts.map +1 -1
  195. package/dist/cli.js +6 -37
  196. package/dist/cli.js.map +1 -1
  197. package/dist/commands/adopt.d.ts.map +1 -1
  198. package/dist/commands/adopt.js +33 -4
  199. package/dist/commands/adopt.js.map +1 -1
  200. package/dist/commands/consult/index.d.ts +13 -2
  201. package/dist/commands/consult/index.d.ts.map +1 -1
  202. package/dist/commands/consult/index.js +244 -29
  203. package/dist/commands/consult/index.js.map +1 -1
  204. package/dist/commands/doctor.d.ts.map +1 -1
  205. package/dist/commands/doctor.js +96 -79
  206. package/dist/commands/doctor.js.map +1 -1
  207. package/dist/commands/init.d.ts.map +1 -1
  208. package/dist/commands/init.js +36 -3
  209. package/dist/commands/init.js.map +1 -1
  210. package/dist/commands/porch/build-counter.d.ts +5 -0
  211. package/dist/commands/porch/build-counter.d.ts.map +1 -0
  212. package/dist/commands/porch/build-counter.js +5 -0
  213. package/dist/commands/porch/build-counter.js.map +1 -0
  214. package/dist/commands/porch/checks.d.ts +3 -2
  215. package/dist/commands/porch/checks.d.ts.map +1 -1
  216. package/dist/commands/porch/checks.js +8 -2
  217. package/dist/commands/porch/checks.js.map +1 -1
  218. package/dist/commands/porch/index.d.ts +4 -0
  219. package/dist/commands/porch/index.d.ts.map +1 -1
  220. package/dist/commands/porch/index.js +109 -70
  221. package/dist/commands/porch/index.js.map +1 -1
  222. package/dist/commands/porch/next.d.ts +22 -0
  223. package/dist/commands/porch/next.d.ts.map +1 -0
  224. package/dist/commands/porch/next.js +571 -0
  225. package/dist/commands/porch/next.js.map +1 -0
  226. package/dist/commands/porch/plan.d.ts +11 -1
  227. package/dist/commands/porch/plan.d.ts.map +1 -1
  228. package/dist/commands/porch/plan.js +33 -5
  229. package/dist/commands/porch/plan.js.map +1 -1
  230. package/dist/commands/porch/prompts.d.ts.map +1 -1
  231. package/dist/commands/porch/prompts.js +44 -26
  232. package/dist/commands/porch/prompts.js.map +1 -1
  233. package/dist/commands/porch/protocol.d.ts +6 -4
  234. package/dist/commands/porch/protocol.d.ts.map +1 -1
  235. package/dist/commands/porch/protocol.js +59 -15
  236. package/dist/commands/porch/protocol.js.map +1 -1
  237. package/dist/commands/porch/state.d.ts +29 -2
  238. package/dist/commands/porch/state.d.ts.map +1 -1
  239. package/dist/commands/porch/state.js +71 -3
  240. package/dist/commands/porch/state.js.map +1 -1
  241. package/dist/commands/porch/types.d.ts +45 -2
  242. package/dist/commands/porch/types.d.ts.map +1 -1
  243. package/dist/commands/porch/verdict.d.ts +31 -0
  244. package/dist/commands/porch/verdict.d.ts.map +1 -0
  245. package/dist/commands/porch/verdict.js +59 -0
  246. package/dist/commands/porch/verdict.js.map +1 -0
  247. package/dist/commands/update.d.ts.map +1 -1
  248. package/dist/commands/update.js +18 -6
  249. package/dist/commands/update.js.map +1 -1
  250. package/dist/lib/scaffold.d.ts +13 -0
  251. package/dist/lib/scaffold.d.ts.map +1 -1
  252. package/dist/lib/scaffold.js +36 -0
  253. package/dist/lib/scaffold.js.map +1 -1
  254. package/dist/terminal/index.d.ts +8 -0
  255. package/dist/terminal/index.d.ts.map +1 -0
  256. package/dist/terminal/index.js +5 -0
  257. package/dist/terminal/index.js.map +1 -0
  258. package/dist/terminal/pty-manager.d.ts +69 -0
  259. package/dist/terminal/pty-manager.d.ts.map +1 -0
  260. package/dist/terminal/pty-manager.js +377 -0
  261. package/dist/terminal/pty-manager.js.map +1 -0
  262. package/dist/terminal/pty-session.d.ts +104 -0
  263. package/dist/terminal/pty-session.d.ts.map +1 -0
  264. package/dist/terminal/pty-session.js +327 -0
  265. package/dist/terminal/pty-session.js.map +1 -0
  266. package/dist/terminal/ring-buffer.d.ts +34 -0
  267. package/dist/terminal/ring-buffer.d.ts.map +1 -0
  268. package/dist/terminal/ring-buffer.js +94 -0
  269. package/dist/terminal/ring-buffer.js.map +1 -0
  270. package/dist/terminal/session-manager.d.ts +115 -0
  271. package/dist/terminal/session-manager.d.ts.map +1 -0
  272. package/dist/terminal/session-manager.js +582 -0
  273. package/dist/terminal/session-manager.js.map +1 -0
  274. package/dist/terminal/shellper-client.d.ts +66 -0
  275. package/dist/terminal/shellper-client.d.ts.map +1 -0
  276. package/dist/terminal/shellper-client.js +234 -0
  277. package/dist/terminal/shellper-client.js.map +1 -0
  278. package/dist/terminal/shellper-main.d.ts +19 -0
  279. package/dist/terminal/shellper-main.d.ts.map +1 -0
  280. package/dist/terminal/shellper-main.js +153 -0
  281. package/dist/terminal/shellper-main.js.map +1 -0
  282. package/dist/terminal/shellper-process.d.ts +75 -0
  283. package/dist/terminal/shellper-process.d.ts.map +1 -0
  284. package/dist/terminal/shellper-process.js +279 -0
  285. package/dist/terminal/shellper-process.js.map +1 -0
  286. package/dist/terminal/shellper-protocol.d.ts +115 -0
  287. package/dist/terminal/shellper-protocol.d.ts.map +1 -0
  288. package/dist/terminal/shellper-protocol.js +214 -0
  289. package/dist/terminal/shellper-protocol.js.map +1 -0
  290. package/dist/terminal/shellper-replay-buffer.d.ts +38 -0
  291. package/dist/terminal/shellper-replay-buffer.d.ts.map +1 -0
  292. package/dist/terminal/shellper-replay-buffer.js +94 -0
  293. package/dist/terminal/shellper-replay-buffer.js.map +1 -0
  294. package/dist/terminal/ws-protocol.d.ts +27 -0
  295. package/dist/terminal/ws-protocol.d.ts.map +1 -0
  296. package/dist/terminal/ws-protocol.js +44 -0
  297. package/dist/terminal/ws-protocol.js.map +1 -0
  298. package/package.json +17 -5
  299. package/skeleton/.claude/skills/af/SKILL.md +89 -0
  300. package/skeleton/.claude/skills/codev/SKILL.md +41 -0
  301. package/skeleton/.claude/skills/consult/SKILL.md +81 -0
  302. package/skeleton/.claude/skills/generate-image/SKILL.md +56 -0
  303. package/skeleton/DEPENDENCIES.md +4 -62
  304. package/skeleton/builders.md +1 -1
  305. package/skeleton/consult-types/impl-review.md +18 -9
  306. package/skeleton/consult-types/integration-review.md +1 -1
  307. package/skeleton/consult-types/plan-review.md +1 -1
  308. package/skeleton/consult-types/pr-ready.md +1 -1
  309. package/skeleton/consult-types/spec-review.md +1 -1
  310. package/skeleton/porch/prompts/defend.md +1 -1
  311. package/skeleton/porch/prompts/evaluate.md +2 -2
  312. package/skeleton/porch/prompts/implement.md +1 -1
  313. package/skeleton/porch/prompts/plan.md +1 -1
  314. package/skeleton/porch/prompts/review.md +4 -4
  315. package/skeleton/porch/prompts/specify.md +1 -1
  316. package/skeleton/porch/prompts/understand.md +2 -2
  317. package/skeleton/protocol-schema.json +282 -0
  318. package/skeleton/protocols/bugfix/builder-prompt.md +60 -0
  319. package/skeleton/protocols/bugfix/prompts/fix.md +77 -0
  320. package/skeleton/protocols/bugfix/prompts/investigate.md +77 -0
  321. package/skeleton/protocols/bugfix/prompts/pr.md +84 -0
  322. package/skeleton/protocols/bugfix/protocol.json +20 -33
  323. package/skeleton/protocols/experiment/builder-prompt.md +52 -0
  324. package/skeleton/protocols/experiment/protocol.json +101 -0
  325. package/skeleton/protocols/experiment/protocol.md +3 -3
  326. package/skeleton/protocols/experiment/templates/notes.md +1 -1
  327. package/skeleton/protocols/maintain/builder-prompt.md +46 -0
  328. package/skeleton/protocols/maintain/prompts/audit.md +111 -0
  329. package/skeleton/protocols/maintain/prompts/clean.md +91 -0
  330. package/skeleton/protocols/maintain/prompts/sync.md +113 -0
  331. package/skeleton/protocols/maintain/prompts/verify.md +110 -0
  332. package/skeleton/protocols/maintain/protocol.json +141 -0
  333. package/skeleton/protocols/maintain/protocol.md +17 -11
  334. package/skeleton/protocols/protocol-schema.json +54 -1
  335. package/skeleton/protocols/spir/builder-prompt.md +66 -0
  336. package/skeleton/protocols/spir/prompts/implement.md +208 -0
  337. package/skeleton/protocols/{spider → spir}/prompts/plan.md +6 -70
  338. package/skeleton/protocols/{spider → spir}/prompts/review.md +20 -39
  339. package/skeleton/protocols/{spider → spir}/prompts/specify.md +24 -59
  340. package/skeleton/protocols/{spider → spir}/protocol.json +30 -10
  341. package/skeleton/protocols/{spider → spir}/protocol.md +35 -21
  342. package/skeleton/protocols/spir/templates/review.md +89 -0
  343. package/skeleton/protocols/tick/builder-prompt.md +56 -0
  344. package/skeleton/protocols/tick/protocol.json +7 -2
  345. package/skeleton/protocols/tick/protocol.md +18 -18
  346. package/skeleton/protocols/tick/templates/review.md +1 -1
  347. package/skeleton/resources/commands/agent-farm.md +63 -46
  348. package/skeleton/resources/commands/codev.md +0 -2
  349. package/skeleton/resources/commands/overview.md +7 -17
  350. package/skeleton/resources/workflow-reference.md +4 -4
  351. package/skeleton/roles/architect.md +151 -306
  352. package/skeleton/roles/builder.md +115 -332
  353. package/skeleton/roles/consultant.md +6 -6
  354. package/skeleton/templates/AGENTS.md +2 -2
  355. package/skeleton/templates/CLAUDE.md +2 -2
  356. package/skeleton/templates/cheatsheet.md +7 -5
  357. package/skeleton/templates/projectlist.md +1 -1
  358. package/templates/dashboard/index.html +17 -16
  359. package/templates/dashboard/js/dialogs.js +7 -7
  360. package/templates/dashboard/js/files.js +2 -2
  361. package/templates/dashboard/js/main.js +4 -4
  362. package/templates/dashboard/js/projects.js +3 -3
  363. package/templates/dashboard/js/tabs.js +1 -1
  364. package/templates/dashboard/js/utils.js +22 -1
  365. package/templates/open.html +26 -0
  366. package/templates/tower.html +731 -91
  367. package/dist/agent-farm/commands/kickoff.d.ts +0 -20
  368. package/dist/agent-farm/commands/kickoff.d.ts.map +0 -1
  369. package/dist/agent-farm/commands/kickoff.js +0 -273
  370. package/dist/agent-farm/commands/kickoff.js.map +0 -1
  371. package/dist/agent-farm/commands/rename.d.ts +0 -13
  372. package/dist/agent-farm/commands/rename.d.ts.map +0 -1
  373. package/dist/agent-farm/commands/rename.js +0 -33
  374. package/dist/agent-farm/commands/rename.js.map +0 -1
  375. package/dist/agent-farm/commands/tutorial.d.ts +0 -10
  376. package/dist/agent-farm/commands/tutorial.d.ts.map +0 -1
  377. package/dist/agent-farm/commands/tutorial.js +0 -49
  378. package/dist/agent-farm/commands/tutorial.js.map +0 -1
  379. package/dist/agent-farm/commands/util.d.ts +0 -15
  380. package/dist/agent-farm/commands/util.d.ts.map +0 -1
  381. package/dist/agent-farm/commands/util.js +0 -108
  382. package/dist/agent-farm/commands/util.js.map +0 -1
  383. package/dist/agent-farm/servers/dashboard-server.d.ts +0 -7
  384. package/dist/agent-farm/servers/dashboard-server.d.ts.map +0 -1
  385. package/dist/agent-farm/servers/dashboard-server.js +0 -1858
  386. package/dist/agent-farm/servers/dashboard-server.js.map +0 -1
  387. package/dist/agent-farm/servers/open-server.d.ts +0 -7
  388. package/dist/agent-farm/servers/open-server.d.ts.map +0 -1
  389. package/dist/agent-farm/servers/open-server.js +0 -315
  390. package/dist/agent-farm/servers/open-server.js.map +0 -1
  391. package/dist/agent-farm/tutorial/index.d.ts +0 -8
  392. package/dist/agent-farm/tutorial/index.d.ts.map +0 -1
  393. package/dist/agent-farm/tutorial/index.js +0 -8
  394. package/dist/agent-farm/tutorial/index.js.map +0 -1
  395. package/dist/agent-farm/tutorial/prompts.d.ts +0 -57
  396. package/dist/agent-farm/tutorial/prompts.d.ts.map +0 -1
  397. package/dist/agent-farm/tutorial/prompts.js +0 -147
  398. package/dist/agent-farm/tutorial/prompts.js.map +0 -1
  399. package/dist/agent-farm/tutorial/runner.d.ts +0 -52
  400. package/dist/agent-farm/tutorial/runner.d.ts.map +0 -1
  401. package/dist/agent-farm/tutorial/runner.js +0 -204
  402. package/dist/agent-farm/tutorial/runner.js.map +0 -1
  403. package/dist/agent-farm/tutorial/state.d.ts +0 -26
  404. package/dist/agent-farm/tutorial/state.d.ts.map +0 -1
  405. package/dist/agent-farm/tutorial/state.js +0 -89
  406. package/dist/agent-farm/tutorial/state.js.map +0 -1
  407. package/dist/agent-farm/tutorial/steps/first-spec.d.ts +0 -7
  408. package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +0 -1
  409. package/dist/agent-farm/tutorial/steps/first-spec.js +0 -136
  410. package/dist/agent-farm/tutorial/steps/first-spec.js.map +0 -1
  411. package/dist/agent-farm/tutorial/steps/implementation.d.ts +0 -7
  412. package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +0 -1
  413. package/dist/agent-farm/tutorial/steps/implementation.js +0 -76
  414. package/dist/agent-farm/tutorial/steps/implementation.js.map +0 -1
  415. package/dist/agent-farm/tutorial/steps/index.d.ts +0 -10
  416. package/dist/agent-farm/tutorial/steps/index.d.ts.map +0 -1
  417. package/dist/agent-farm/tutorial/steps/index.js +0 -10
  418. package/dist/agent-farm/tutorial/steps/index.js.map +0 -1
  419. package/dist/agent-farm/tutorial/steps/planning.d.ts +0 -7
  420. package/dist/agent-farm/tutorial/steps/planning.d.ts.map +0 -1
  421. package/dist/agent-farm/tutorial/steps/planning.js +0 -143
  422. package/dist/agent-farm/tutorial/steps/planning.js.map +0 -1
  423. package/dist/agent-farm/tutorial/steps/review.d.ts +0 -7
  424. package/dist/agent-farm/tutorial/steps/review.d.ts.map +0 -1
  425. package/dist/agent-farm/tutorial/steps/review.js +0 -78
  426. package/dist/agent-farm/tutorial/steps/review.js.map +0 -1
  427. package/dist/agent-farm/tutorial/steps/setup.d.ts +0 -7
  428. package/dist/agent-farm/tutorial/steps/setup.d.ts.map +0 -1
  429. package/dist/agent-farm/tutorial/steps/setup.js +0 -126
  430. package/dist/agent-farm/tutorial/steps/setup.js.map +0 -1
  431. package/dist/agent-farm/tutorial/steps/welcome.d.ts +0 -7
  432. package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +0 -1
  433. package/dist/agent-farm/tutorial/steps/welcome.js +0 -50
  434. package/dist/agent-farm/tutorial/steps/welcome.js.map +0 -1
  435. package/dist/agent-farm/utils/orphan-handler.d.ts +0 -27
  436. package/dist/agent-farm/utils/orphan-handler.d.ts.map +0 -1
  437. package/dist/agent-farm/utils/orphan-handler.js +0 -149
  438. package/dist/agent-farm/utils/orphan-handler.js.map +0 -1
  439. package/dist/agent-farm/utils/port-registry.d.ts +0 -58
  440. package/dist/agent-farm/utils/port-registry.d.ts.map +0 -1
  441. package/dist/agent-farm/utils/port-registry.js +0 -166
  442. package/dist/agent-farm/utils/port-registry.js.map +0 -1
  443. package/dist/agent-farm/utils/terminal-ports.d.ts +0 -18
  444. package/dist/agent-farm/utils/terminal-ports.d.ts.map +0 -1
  445. package/dist/agent-farm/utils/terminal-ports.js +0 -35
  446. package/dist/agent-farm/utils/terminal-ports.js.map +0 -1
  447. package/dist/commands/pcheck/cache.d.ts +0 -48
  448. package/dist/commands/pcheck/cache.d.ts.map +0 -1
  449. package/dist/commands/pcheck/cache.js +0 -170
  450. package/dist/commands/pcheck/cache.js.map +0 -1
  451. package/dist/commands/pcheck/evaluator.d.ts +0 -15
  452. package/dist/commands/pcheck/evaluator.d.ts.map +0 -1
  453. package/dist/commands/pcheck/evaluator.js +0 -246
  454. package/dist/commands/pcheck/evaluator.js.map +0 -1
  455. package/dist/commands/pcheck/index.d.ts +0 -12
  456. package/dist/commands/pcheck/index.d.ts.map +0 -1
  457. package/dist/commands/pcheck/index.js +0 -249
  458. package/dist/commands/pcheck/index.js.map +0 -1
  459. package/dist/commands/pcheck/parser.d.ts +0 -39
  460. package/dist/commands/pcheck/parser.d.ts.map +0 -1
  461. package/dist/commands/pcheck/parser.js +0 -155
  462. package/dist/commands/pcheck/parser.js.map +0 -1
  463. package/dist/commands/pcheck/types.d.ts +0 -82
  464. package/dist/commands/pcheck/types.d.ts.map +0 -1
  465. package/dist/commands/pcheck/types.js +0 -5
  466. package/dist/commands/pcheck/types.js.map +0 -1
  467. package/dist/commands/porch/claude.d.ts +0 -29
  468. package/dist/commands/porch/claude.d.ts.map +0 -1
  469. package/dist/commands/porch/claude.js +0 -79
  470. package/dist/commands/porch/claude.js.map +0 -1
  471. package/dist/commands/porch/consultation.d.ts +0 -56
  472. package/dist/commands/porch/consultation.d.ts.map +0 -1
  473. package/dist/commands/porch/consultation.js +0 -330
  474. package/dist/commands/porch/consultation.js.map +0 -1
  475. package/dist/commands/porch/notifications.d.ts +0 -99
  476. package/dist/commands/porch/notifications.d.ts.map +0 -1
  477. package/dist/commands/porch/notifications.js +0 -223
  478. package/dist/commands/porch/notifications.js.map +0 -1
  479. package/dist/commands/porch/plan-parser.d.ts +0 -38
  480. package/dist/commands/porch/plan-parser.d.ts.map +0 -1
  481. package/dist/commands/porch/plan-parser.js +0 -166
  482. package/dist/commands/porch/plan-parser.js.map +0 -1
  483. package/dist/commands/porch/protocol-loader.d.ts +0 -46
  484. package/dist/commands/porch/protocol-loader.d.ts.map +0 -1
  485. package/dist/commands/porch/protocol-loader.js +0 -262
  486. package/dist/commands/porch/protocol-loader.js.map +0 -1
  487. package/dist/commands/porch/repl.d.ts +0 -33
  488. package/dist/commands/porch/repl.d.ts.map +0 -1
  489. package/dist/commands/porch/repl.js +0 -206
  490. package/dist/commands/porch/repl.js.map +0 -1
  491. package/dist/commands/porch/run.d.ts +0 -15
  492. package/dist/commands/porch/run.d.ts.map +0 -1
  493. package/dist/commands/porch/run.js +0 -551
  494. package/dist/commands/porch/run.js.map +0 -1
  495. package/dist/commands/porch/signal-parser.d.ts +0 -102
  496. package/dist/commands/porch/signal-parser.d.ts.map +0 -1
  497. package/dist/commands/porch/signal-parser.js +0 -199
  498. package/dist/commands/porch/signal-parser.js.map +0 -1
  499. package/dist/commands/porch/signals.d.ts +0 -35
  500. package/dist/commands/porch/signals.d.ts.map +0 -1
  501. package/dist/commands/porch/signals.js +0 -76
  502. package/dist/commands/porch/signals.js.map +0 -1
  503. package/dist/commands/porch2/checks.d.ts +0 -29
  504. package/dist/commands/porch2/checks.d.ts.map +0 -1
  505. package/dist/commands/porch2/checks.js +0 -141
  506. package/dist/commands/porch2/checks.js.map +0 -1
  507. package/dist/commands/porch2/index.d.ts +0 -38
  508. package/dist/commands/porch2/index.d.ts.map +0 -1
  509. package/dist/commands/porch2/index.js +0 -483
  510. package/dist/commands/porch2/index.js.map +0 -1
  511. package/dist/commands/porch2/plan.d.ts +0 -70
  512. package/dist/commands/porch2/plan.d.ts.map +0 -1
  513. package/dist/commands/porch2/plan.js +0 -227
  514. package/dist/commands/porch2/plan.js.map +0 -1
  515. package/dist/commands/porch2/protocol.d.ts +0 -37
  516. package/dist/commands/porch2/protocol.d.ts.map +0 -1
  517. package/dist/commands/porch2/protocol.js +0 -183
  518. package/dist/commands/porch2/protocol.js.map +0 -1
  519. package/dist/commands/porch2/state.d.ts +0 -35
  520. package/dist/commands/porch2/state.d.ts.map +0 -1
  521. package/dist/commands/porch2/state.js +0 -124
  522. package/dist/commands/porch2/state.js.map +0 -1
  523. package/dist/commands/porch2/types.d.ts +0 -79
  524. package/dist/commands/porch2/types.d.ts.map +0 -1
  525. package/dist/commands/porch2/types.js +0 -8
  526. package/dist/commands/porch2/types.js.map +0 -1
  527. package/dist/commands/tower.d.ts +0 -16
  528. package/dist/commands/tower.d.ts.map +0 -1
  529. package/dist/commands/tower.js +0 -21
  530. package/dist/commands/tower.js.map +0 -1
  531. package/skeleton/config.json +0 -7
  532. package/skeleton/protocols/spider/prompts/defend.md +0 -215
  533. package/skeleton/protocols/spider/prompts/evaluate.md +0 -241
  534. package/skeleton/protocols/spider/prompts/implement.md +0 -149
  535. package/skeleton/protocols/spider/templates/review.md +0 -207
  536. /package/skeleton/protocols/{spider → spir}/templates/plan.md +0 -0
  537. /package/skeleton/protocols/{spider → spir}/templates/spec.md +0 -0
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Project instance lifecycle for tower server.
3
+ * Spec 0105: Tower Server Decomposition — Phase 3
4
+ *
5
+ * Contains: instance discovery (getInstances), launch/stop lifecycle,
6
+ * known project registration, and directory suggestion autocomplete.
7
+ */
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import crypto from 'node:crypto';
11
+ import { execSync } from 'node:child_process';
12
+ import { homedir } from 'node:os';
13
+ import { getGlobalDb } from '../db/index.js';
14
+ import { getProjectName, isTempDirectory, buildArchitectArgs, } from './tower-utils.js';
15
+ // ============================================================================
16
+ // Module-private state
17
+ // ============================================================================
18
+ let _deps = null;
19
+ // ============================================================================
20
+ // Public lifecycle
21
+ // ============================================================================
22
+ /** Initialize the instances module with dependencies. */
23
+ export function initInstances(deps) {
24
+ _deps = deps;
25
+ }
26
+ /** Tear down the instances module. */
27
+ export function shutdownInstances() {
28
+ _deps = null;
29
+ }
30
+ // ============================================================================
31
+ // Known project registration
32
+ // ============================================================================
33
+ /**
34
+ * Register a project in the known_projects table so it persists across restarts
35
+ * even when all terminal sessions are gone.
36
+ */
37
+ export function registerKnownProject(projectPath) {
38
+ try {
39
+ const db = getGlobalDb();
40
+ db.prepare(`
41
+ INSERT INTO known_projects (project_path, name, last_launched_at)
42
+ VALUES (?, ?, datetime('now'))
43
+ ON CONFLICT(project_path) DO UPDATE SET last_launched_at = datetime('now')
44
+ `).run(projectPath, path.basename(projectPath));
45
+ }
46
+ catch {
47
+ // Table may not exist yet (pre-migration)
48
+ }
49
+ }
50
+ /**
51
+ * Get all known project paths from known_projects, terminal_sessions, and in-memory cache.
52
+ */
53
+ export function getKnownProjectPaths() {
54
+ const projectPaths = new Set();
55
+ // From known_projects table (persists even after all terminals are killed)
56
+ try {
57
+ const db = getGlobalDb();
58
+ const projects = db.prepare('SELECT project_path FROM known_projects').all();
59
+ for (const p of projects) {
60
+ projectPaths.add(p.project_path);
61
+ }
62
+ }
63
+ catch {
64
+ // Table may not exist yet
65
+ }
66
+ // From terminal_sessions table (catches any missed by known_projects)
67
+ try {
68
+ const db = getGlobalDb();
69
+ const sessions = db.prepare('SELECT DISTINCT project_path FROM terminal_sessions').all();
70
+ for (const s of sessions) {
71
+ projectPaths.add(s.project_path);
72
+ }
73
+ }
74
+ catch {
75
+ // Table may not exist yet
76
+ }
77
+ // From in-memory cache (includes projects activated this session)
78
+ if (_deps) {
79
+ for (const [projectPath] of _deps.projectTerminals) {
80
+ projectPaths.add(projectPath);
81
+ }
82
+ }
83
+ return Array.from(projectPaths);
84
+ }
85
+ // ============================================================================
86
+ // Instance discovery
87
+ // ============================================================================
88
+ /**
89
+ * Get all instances with their status.
90
+ */
91
+ export async function getInstances() {
92
+ if (!_deps)
93
+ return []; // Module not yet initialized (startup window)
94
+ const knownPaths = getKnownProjectPaths();
95
+ const instances = [];
96
+ // Build a lookup of last_launched_at from known_projects
97
+ const lastLaunchedMap = new Map();
98
+ try {
99
+ const db = getGlobalDb();
100
+ const rows = db.prepare('SELECT project_path, last_launched_at FROM known_projects').all();
101
+ for (const row of rows) {
102
+ lastLaunchedMap.set(row.project_path, row.last_launched_at);
103
+ }
104
+ }
105
+ catch {
106
+ // Table may not exist yet (pre-migration)
107
+ }
108
+ for (const projectPath of knownPaths) {
109
+ // Skip builder worktrees - they're managed by their parent project
110
+ if (projectPath.includes('/.builders/')) {
111
+ continue;
112
+ }
113
+ // Skip projects in temp directories (e.g. test artifacts) or whose directories no longer exist
114
+ if (!projectPath.startsWith('remote:')) {
115
+ if (!fs.existsSync(projectPath)) {
116
+ continue;
117
+ }
118
+ if (isTempDirectory(projectPath)) {
119
+ continue;
120
+ }
121
+ }
122
+ // Encode project path for proxy URL
123
+ const encodedPath = Buffer.from(projectPath).toString('base64url');
124
+ const proxyUrl = `/project/${encodedPath}/`;
125
+ // Get terminals and gate status from tower's registry
126
+ // Phase 4 (Spec 0090): Tower manages terminals directly - no separate dashboard server
127
+ const { terminals, gateStatus } = await _deps.getTerminalsForProject(projectPath, proxyUrl);
128
+ // Project is active if it has any terminals (Phase 4: no port check needed)
129
+ const isActive = terminals.length > 0;
130
+ instances.push({
131
+ projectPath,
132
+ projectName: getProjectName(projectPath),
133
+ running: isActive,
134
+ proxyUrl,
135
+ architectUrl: `${proxyUrl}?tab=architect`,
136
+ terminals,
137
+ gateStatus,
138
+ lastUsed: lastLaunchedMap.get(projectPath),
139
+ });
140
+ }
141
+ // Sort: running first, then by project name
142
+ instances.sort((a, b) => {
143
+ if (a.running !== b.running) {
144
+ return a.running ? -1 : 1;
145
+ }
146
+ return a.projectName.localeCompare(b.projectName);
147
+ });
148
+ return instances;
149
+ }
150
+ // ============================================================================
151
+ // Directory suggestions (pure — no module state)
152
+ // ============================================================================
153
+ /**
154
+ * Get directory suggestions for autocomplete.
155
+ */
156
+ export async function getDirectorySuggestions(inputPath) {
157
+ // Default to home directory if empty
158
+ if (!inputPath) {
159
+ inputPath = homedir();
160
+ }
161
+ // Expand ~ to home directory
162
+ if (inputPath.startsWith('~')) {
163
+ inputPath = inputPath.replace('~', homedir());
164
+ }
165
+ // Relative paths are meaningless for the tower daemon — only absolute paths
166
+ if (!path.isAbsolute(inputPath)) {
167
+ return [];
168
+ }
169
+ // Determine the directory to list and the prefix to filter by
170
+ let dirToList;
171
+ let prefix;
172
+ if (inputPath.endsWith('/')) {
173
+ // User typed a complete directory path, list its contents
174
+ dirToList = inputPath;
175
+ prefix = '';
176
+ }
177
+ else {
178
+ // User is typing a partial name, list parent and filter
179
+ dirToList = path.dirname(inputPath);
180
+ prefix = path.basename(inputPath).toLowerCase();
181
+ }
182
+ // Check if directory exists
183
+ if (!fs.existsSync(dirToList)) {
184
+ return [];
185
+ }
186
+ const stat = fs.statSync(dirToList);
187
+ if (!stat.isDirectory()) {
188
+ return [];
189
+ }
190
+ // Read directory contents
191
+ const entries = fs.readdirSync(dirToList, { withFileTypes: true });
192
+ // Filter to directories only, apply prefix filter, and check for codev/
193
+ const suggestions = [];
194
+ for (const entry of entries) {
195
+ if (!entry.isDirectory())
196
+ continue;
197
+ if (entry.name.startsWith('.'))
198
+ continue; // Skip hidden directories
199
+ const name = entry.name.toLowerCase();
200
+ if (prefix && !name.startsWith(prefix))
201
+ continue;
202
+ const fullPath = path.join(dirToList, entry.name);
203
+ const isProject = fs.existsSync(path.join(fullPath, 'codev'));
204
+ suggestions.push({ path: fullPath, isProject });
205
+ }
206
+ // Sort: projects first, then alphabetically
207
+ suggestions.sort((a, b) => {
208
+ if (a.isProject !== b.isProject) {
209
+ return a.isProject ? -1 : 1;
210
+ }
211
+ return a.path.localeCompare(b.path);
212
+ });
213
+ // Limit to 20 suggestions
214
+ return suggestions.slice(0, 20);
215
+ }
216
+ // ============================================================================
217
+ // Instance lifecycle
218
+ // ============================================================================
219
+ /**
220
+ * Launch a new agent-farm instance.
221
+ * Phase 4 (Spec 0090): Tower manages terminals directly, no dashboard-server.
222
+ * Auto-adopts non-codev directories and creates architect terminal.
223
+ */
224
+ export async function launchInstance(projectPath) {
225
+ if (!_deps)
226
+ return { success: false, error: 'Tower is still starting up. Try again shortly.' };
227
+ // Validate path exists
228
+ if (!fs.existsSync(projectPath)) {
229
+ return { success: false, error: `Path does not exist: ${projectPath}` };
230
+ }
231
+ // Validate it's a directory
232
+ const stat = fs.statSync(projectPath);
233
+ if (!stat.isDirectory()) {
234
+ return { success: false, error: `Not a directory: ${projectPath}` };
235
+ }
236
+ // Auto-adopt non-codev directories
237
+ const codevDir = path.join(projectPath, 'codev');
238
+ let adopted = false;
239
+ if (!fs.existsSync(codevDir)) {
240
+ try {
241
+ // Run codev adopt --yes to set up the project
242
+ execSync('npx codev adopt --yes', {
243
+ cwd: projectPath,
244
+ stdio: 'pipe',
245
+ timeout: 30000,
246
+ });
247
+ adopted = true;
248
+ _deps.log('INFO', `Auto-adopted codev in: ${projectPath}`);
249
+ }
250
+ catch (err) {
251
+ return { success: false, error: `Failed to adopt codev: ${err.message}` };
252
+ }
253
+ }
254
+ // Phase 4 (Spec 0090): Tower manages terminals directly
255
+ // No dashboard-server spawning - tower handles everything
256
+ try {
257
+ // Ensure project has port allocation
258
+ const resolvedPath = fs.realpathSync(projectPath);
259
+ // Persist in known_projects so the project survives terminal cleanup
260
+ registerKnownProject(resolvedPath);
261
+ // Initialize project terminal entry
262
+ const entry = _deps.getProjectTerminalsEntry(resolvedPath);
263
+ // Create architect terminal if not already present
264
+ if (!entry.architect) {
265
+ const manager = _deps.getTerminalManager();
266
+ // Read af-config.json to get the architect command
267
+ let architectCmd = 'claude';
268
+ const configPath = path.join(projectPath, 'af-config.json');
269
+ if (fs.existsSync(configPath)) {
270
+ try {
271
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
272
+ if (config.shell?.architect) {
273
+ architectCmd = config.shell.architect;
274
+ }
275
+ }
276
+ catch {
277
+ // Ignore config read errors, use default
278
+ }
279
+ }
280
+ try {
281
+ // Parse command string to separate command and args, inject role prompt
282
+ const cmdParts = architectCmd.split(/\s+/);
283
+ const cmd = cmdParts[0];
284
+ const cmdArgs = buildArchitectArgs(cmdParts.slice(1), projectPath);
285
+ // Build env with CLAUDECODE removed so spawned Claude processes
286
+ // don't detect a nested session
287
+ const cleanEnv = { ...process.env };
288
+ delete cleanEnv['CLAUDECODE'];
289
+ // Try shellper first for persistent session with auto-restart
290
+ let shellperCreated = false;
291
+ if (_deps.shellperManager) {
292
+ try {
293
+ const sessionId = crypto.randomUUID();
294
+ const client = await _deps.shellperManager.createSession({
295
+ sessionId,
296
+ command: cmd,
297
+ args: cmdArgs,
298
+ cwd: projectPath,
299
+ env: cleanEnv,
300
+ cols: 200,
301
+ rows: 50,
302
+ restartOnExit: true,
303
+ restartDelay: 2000,
304
+ maxRestarts: 50,
305
+ });
306
+ // Get replay data and shellper info
307
+ const replayData = client.getReplayData() ?? Buffer.alloc(0);
308
+ const shellperInfo = _deps.shellperManager.getSessionInfo(sessionId);
309
+ // Create a PtySession backed by the shellper client
310
+ const session = manager.createSessionRaw({
311
+ label: 'Architect',
312
+ cwd: projectPath,
313
+ });
314
+ const ptySession = manager.getSession(session.id);
315
+ if (ptySession) {
316
+ ptySession.attachShellper(client, replayData, shellperInfo.pid, sessionId);
317
+ }
318
+ entry.architect = session.id;
319
+ _deps.saveTerminalSession(session.id, resolvedPath, 'architect', null, shellperInfo.pid, shellperInfo.socketPath, shellperInfo.pid, shellperInfo.startTime);
320
+ // Clean up cache/SQLite when the shellper session exits
321
+ if (ptySession) {
322
+ ptySession.on('exit', () => {
323
+ const currentEntry = _deps.getProjectTerminalsEntry(resolvedPath);
324
+ if (currentEntry.architect === session.id) {
325
+ currentEntry.architect = undefined;
326
+ }
327
+ _deps.deleteTerminalSession(session.id);
328
+ _deps.log('INFO', `Architect shellper session exited for ${projectPath}`);
329
+ });
330
+ }
331
+ shellperCreated = true;
332
+ _deps.log('INFO', `Created shellper-backed architect session for project: ${projectPath}`);
333
+ }
334
+ catch (shellperErr) {
335
+ _deps.log('WARN', `Shellper creation failed for architect, falling back: ${shellperErr.message}`);
336
+ }
337
+ }
338
+ // Fallback: non-persistent session (graceful degradation per plan)
339
+ // Shellper is the only persistence backend for new sessions.
340
+ if (!shellperCreated) {
341
+ const session = await manager.createSession({
342
+ command: cmd,
343
+ args: cmdArgs,
344
+ cwd: projectPath,
345
+ label: 'Architect',
346
+ env: cleanEnv,
347
+ });
348
+ entry.architect = session.id;
349
+ _deps.saveTerminalSession(session.id, resolvedPath, 'architect', null, session.pid);
350
+ const ptySession = manager.getSession(session.id);
351
+ if (ptySession) {
352
+ ptySession.on('exit', () => {
353
+ const currentEntry = _deps.getProjectTerminalsEntry(resolvedPath);
354
+ if (currentEntry.architect === session.id) {
355
+ currentEntry.architect = undefined;
356
+ }
357
+ _deps.deleteTerminalSession(session.id);
358
+ _deps.log('INFO', `Architect pty exited for ${projectPath}`);
359
+ });
360
+ }
361
+ _deps.log('WARN', `Architect terminal for ${projectPath} is non-persistent (shellper unavailable)`);
362
+ }
363
+ _deps.log('INFO', `Created architect terminal for project: ${projectPath}`);
364
+ }
365
+ catch (err) {
366
+ _deps.log('WARN', `Failed to create architect terminal: ${err.message}`);
367
+ // Don't fail the launch - project is still active, just without architect
368
+ }
369
+ }
370
+ return { success: true, adopted };
371
+ }
372
+ catch (err) {
373
+ return { success: false, error: `Failed to launch: ${err.message}` };
374
+ }
375
+ }
376
+ /**
377
+ * Kill a terminal session, including its shellper auto-restart if applicable.
378
+ * For shellper-backed sessions, calls SessionManager.killSession() which clears
379
+ * the restart timer and removes the session before sending SIGTERM, preventing
380
+ * the shellper from auto-restarting the process.
381
+ */
382
+ export async function killTerminalWithShellper(manager, terminalId) {
383
+ if (!_deps)
384
+ return false;
385
+ const session = manager.getSession(terminalId);
386
+ if (!session)
387
+ return false;
388
+ // If shellper-backed, disable auto-restart via SessionManager before killing the PtySession
389
+ if (session.shellperBacked && session.shellperSessionId && _deps.shellperManager) {
390
+ await _deps.shellperManager.killSession(session.shellperSessionId);
391
+ }
392
+ return manager.killSession(terminalId);
393
+ }
394
+ /**
395
+ * Stop an agent-farm instance by killing all its terminals.
396
+ * Phase 4 (Spec 0090): Tower manages terminals directly.
397
+ */
398
+ export async function stopInstance(projectPath) {
399
+ if (!_deps)
400
+ return { success: false, error: 'Tower is still starting up. Try again shortly.', stopped: [] };
401
+ const stopped = [];
402
+ const manager = _deps.getTerminalManager();
403
+ // Resolve symlinks for consistent lookup
404
+ let resolvedPath = projectPath;
405
+ try {
406
+ if (fs.existsSync(projectPath)) {
407
+ resolvedPath = fs.realpathSync(projectPath);
408
+ }
409
+ }
410
+ catch {
411
+ // Ignore - use original path
412
+ }
413
+ // Get project terminals
414
+ const entry = _deps.projectTerminals.get(resolvedPath) || _deps.projectTerminals.get(projectPath);
415
+ if (entry) {
416
+ // Kill architect (disable shellper auto-restart if applicable)
417
+ if (entry.architect) {
418
+ const session = manager.getSession(entry.architect);
419
+ if (session) {
420
+ await killTerminalWithShellper(manager, entry.architect);
421
+ stopped.push(session.pid);
422
+ }
423
+ }
424
+ // Kill all shells (disable shellper auto-restart if applicable)
425
+ for (const terminalId of entry.shells.values()) {
426
+ const session = manager.getSession(terminalId);
427
+ if (session) {
428
+ await killTerminalWithShellper(manager, terminalId);
429
+ stopped.push(session.pid);
430
+ }
431
+ }
432
+ // Kill all builders (disable shellper auto-restart if applicable)
433
+ for (const terminalId of entry.builders.values()) {
434
+ const session = manager.getSession(terminalId);
435
+ if (session) {
436
+ await killTerminalWithShellper(manager, terminalId);
437
+ stopped.push(session.pid);
438
+ }
439
+ }
440
+ // Clear project from registry
441
+ _deps.projectTerminals.delete(resolvedPath);
442
+ _deps.projectTerminals.delete(projectPath);
443
+ // TICK-001: Delete all terminal sessions from SQLite
444
+ _deps.deleteProjectTerminalSessions(resolvedPath);
445
+ if (resolvedPath !== projectPath) {
446
+ _deps.deleteProjectTerminalSessions(projectPath);
447
+ }
448
+ }
449
+ if (stopped.length === 0) {
450
+ return { success: true, error: 'No terminals found to stop', stopped };
451
+ }
452
+ return { success: true, stopped };
453
+ }
454
+ //# sourceMappingURL=tower-instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-instances.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-instances.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * HTTP route handlers for tower server.
3
+ * Spec 0105: Tower Server Decomposition — Phase 6
4
+ *
5
+ * Contains all HTTP request routing and response logic.
6
+ * The orchestrator (tower-server.ts) creates the HTTP server and
7
+ * delegates to handleRequest() for all HTTP requests.
8
+ *
9
+ * NOTE: This file exceeds the 900-line guideline because it contains
10
+ * all HTTP route handlers (~30 routes) which share a single responsibility
11
+ * (HTTP request handling). Splitting would create arbitrary boundaries
12
+ * without improving cohesion. See spec: "cohesion trumps arbitrary ceilings."
13
+ */
14
+ import http from 'node:http';
15
+ import type { SessionManager } from '../../terminal/session-manager.js';
16
+ import type { SSEClient } from './tower-types.js';
17
+ export interface RouteContext {
18
+ log: (level: 'INFO' | 'ERROR' | 'WARN', message: string) => void;
19
+ port: number;
20
+ templatePath: string | null;
21
+ reactDashboardPath: string;
22
+ hasReactDashboard: boolean;
23
+ getShellperManager: () => SessionManager | null;
24
+ broadcastNotification: (notification: {
25
+ type: string;
26
+ title: string;
27
+ body: string;
28
+ project?: string;
29
+ }) => void;
30
+ addSseClient: (client: SSEClient) => void;
31
+ removeSseClient: (id: string) => void;
32
+ }
33
+ export declare function handleRequest(req: http.IncomingMessage, res: http.ServerResponse, ctx: RouteContext): Promise<void>;
34
+ //# sourceMappingURL=tower-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-routes.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAuClD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC;IAChD,qBAAqB,EAAE,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AA6CD,wBAAsB,aAAa,CACjC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAuEf"}