@cluesmith/codev 2.0.0-rc.8 → 2.0.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 (507) hide show
  1. package/bin/af.js +2 -2
  2. package/bin/consult.js +1 -1
  3. package/bin/porch.js +6 -35
  4. package/dashboard/dist/assets/index-4n9zpWLY.css +32 -0
  5. package/dashboard/dist/assets/index-b38SaXk5.js +136 -0
  6. package/dashboard/dist/assets/index-b38SaXk5.js.map +1 -0
  7. package/dashboard/dist/index.html +14 -0
  8. package/dist/agent-farm/cli.d.ts.map +1 -1
  9. package/dist/agent-farm/cli.js +179 -118
  10. package/dist/agent-farm/cli.js.map +1 -1
  11. package/dist/agent-farm/commands/architect.d.ts +3 -3
  12. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  13. package/dist/agent-farm/commands/architect.js +20 -147
  14. package/dist/agent-farm/commands/architect.js.map +1 -1
  15. package/dist/agent-farm/commands/attach.d.ts +13 -0
  16. package/dist/agent-farm/commands/attach.d.ts.map +1 -0
  17. package/dist/agent-farm/commands/attach.js +144 -0
  18. package/dist/agent-farm/commands/attach.js.map +1 -0
  19. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  20. package/dist/agent-farm/commands/cleanup.js +35 -19
  21. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  22. package/dist/agent-farm/commands/consult.d.ts +3 -4
  23. package/dist/agent-farm/commands/consult.d.ts.map +1 -1
  24. package/dist/agent-farm/commands/consult.js +27 -37
  25. package/dist/agent-farm/commands/consult.js.map +1 -1
  26. package/dist/agent-farm/commands/index.d.ts +2 -2
  27. package/dist/agent-farm/commands/index.d.ts.map +1 -1
  28. package/dist/agent-farm/commands/index.js +2 -2
  29. package/dist/agent-farm/commands/index.js.map +1 -1
  30. package/dist/agent-farm/commands/open.d.ts +4 -2
  31. package/dist/agent-farm/commands/open.d.ts.map +1 -1
  32. package/dist/agent-farm/commands/open.js +33 -83
  33. package/dist/agent-farm/commands/open.js.map +1 -1
  34. package/dist/agent-farm/commands/send.d.ts +1 -1
  35. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  36. package/dist/agent-farm/commands/send.js +70 -79
  37. package/dist/agent-farm/commands/send.js.map +1 -1
  38. package/dist/agent-farm/commands/shell.d.ts +15 -0
  39. package/dist/agent-farm/commands/shell.d.ts.map +1 -0
  40. package/dist/agent-farm/commands/shell.js +50 -0
  41. package/dist/agent-farm/commands/shell.js.map +1 -0
  42. package/dist/agent-farm/commands/spawn-roles.d.ts +80 -0
  43. package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -0
  44. package/dist/agent-farm/commands/spawn-roles.js +278 -0
  45. package/dist/agent-farm/commands/spawn-roles.js.map +1 -0
  46. package/dist/agent-farm/commands/spawn-worktree.d.ts +96 -0
  47. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -0
  48. package/dist/agent-farm/commands/spawn-worktree.js +305 -0
  49. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -0
  50. package/dist/agent-farm/commands/spawn.d.ts +5 -1
  51. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  52. package/dist/agent-farm/commands/spawn.js +242 -586
  53. package/dist/agent-farm/commands/spawn.js.map +1 -1
  54. package/dist/agent-farm/commands/start.d.ts +10 -20
  55. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  56. package/dist/agent-farm/commands/start.js +45 -491
  57. package/dist/agent-farm/commands/start.js.map +1 -1
  58. package/dist/agent-farm/commands/status.d.ts +2 -0
  59. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  60. package/dist/agent-farm/commands/status.js +75 -24
  61. package/dist/agent-farm/commands/status.js.map +1 -1
  62. package/dist/agent-farm/commands/stop.d.ts +6 -0
  63. package/dist/agent-farm/commands/stop.d.ts.map +1 -1
  64. package/dist/agent-farm/commands/stop.js +49 -109
  65. package/dist/agent-farm/commands/stop.js.map +1 -1
  66. package/dist/agent-farm/commands/tower-cloud.d.ts +48 -0
  67. package/dist/agent-farm/commands/tower-cloud.d.ts.map +1 -0
  68. package/dist/agent-farm/commands/tower-cloud.js +293 -0
  69. package/dist/agent-farm/commands/tower-cloud.js.map +1 -0
  70. package/dist/agent-farm/commands/tower.d.ts +9 -0
  71. package/dist/agent-farm/commands/tower.d.ts.map +1 -1
  72. package/dist/agent-farm/commands/tower.js +59 -19
  73. package/dist/agent-farm/commands/tower.js.map +1 -1
  74. package/dist/agent-farm/db/index.d.ts +6 -2
  75. package/dist/agent-farm/db/index.d.ts.map +1 -1
  76. package/dist/agent-farm/db/index.js +301 -19
  77. package/dist/agent-farm/db/index.js.map +1 -1
  78. package/dist/agent-farm/db/migrate.d.ts +0 -4
  79. package/dist/agent-farm/db/migrate.d.ts.map +1 -1
  80. package/dist/agent-farm/db/migrate.js +6 -55
  81. package/dist/agent-farm/db/migrate.js.map +1 -1
  82. package/dist/agent-farm/db/schema.d.ts +3 -3
  83. package/dist/agent-farm/db/schema.d.ts.map +1 -1
  84. package/dist/agent-farm/db/schema.js +25 -19
  85. package/dist/agent-farm/db/schema.js.map +1 -1
  86. package/dist/agent-farm/db/types.d.ts +3 -13
  87. package/dist/agent-farm/db/types.d.ts.map +1 -1
  88. package/dist/agent-farm/db/types.js +3 -11
  89. package/dist/agent-farm/db/types.js.map +1 -1
  90. package/dist/agent-farm/hq-connector.d.ts +2 -6
  91. package/dist/agent-farm/hq-connector.d.ts.map +1 -1
  92. package/dist/agent-farm/hq-connector.js +2 -17
  93. package/dist/agent-farm/hq-connector.js.map +1 -1
  94. package/dist/agent-farm/lib/cloud-config.d.ts +59 -0
  95. package/dist/agent-farm/lib/cloud-config.d.ts.map +1 -0
  96. package/dist/agent-farm/lib/cloud-config.js +143 -0
  97. package/dist/agent-farm/lib/cloud-config.js.map +1 -0
  98. package/dist/agent-farm/lib/device-name.d.ts +25 -0
  99. package/dist/agent-farm/lib/device-name.d.ts.map +1 -0
  100. package/dist/agent-farm/lib/device-name.js +46 -0
  101. package/dist/agent-farm/lib/device-name.js.map +1 -0
  102. package/dist/agent-farm/lib/nonce-store.d.ts +28 -0
  103. package/dist/agent-farm/lib/nonce-store.d.ts.map +1 -0
  104. package/dist/agent-farm/lib/nonce-store.js +60 -0
  105. package/dist/agent-farm/lib/nonce-store.js.map +1 -0
  106. package/dist/agent-farm/lib/token-exchange.d.ts +18 -0
  107. package/dist/agent-farm/lib/token-exchange.d.ts.map +1 -0
  108. package/dist/agent-farm/lib/token-exchange.js +48 -0
  109. package/dist/agent-farm/lib/token-exchange.js.map +1 -0
  110. package/dist/agent-farm/lib/tower-client.d.ts +163 -0
  111. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -0
  112. package/dist/agent-farm/lib/tower-client.js +233 -0
  113. package/dist/agent-farm/lib/tower-client.js.map +1 -0
  114. package/dist/agent-farm/lib/tunnel-client.d.ts +117 -0
  115. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -0
  116. package/dist/agent-farm/lib/tunnel-client.js +504 -0
  117. package/dist/agent-farm/lib/tunnel-client.js.map +1 -0
  118. package/dist/agent-farm/servers/tower-instances.d.ts +82 -0
  119. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -0
  120. package/dist/agent-farm/servers/tower-instances.js +454 -0
  121. package/dist/agent-farm/servers/tower-instances.js.map +1 -0
  122. package/dist/agent-farm/servers/tower-routes.d.ts +34 -0
  123. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -0
  124. package/dist/agent-farm/servers/tower-routes.js +1445 -0
  125. package/dist/agent-farm/servers/tower-routes.js.map +1 -0
  126. package/dist/agent-farm/servers/tower-server.d.ts +5 -2
  127. package/dist/agent-farm/servers/tower-server.d.ts.map +1 -1
  128. package/dist/agent-farm/servers/tower-server.js +157 -475
  129. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  130. package/dist/agent-farm/servers/tower-terminals.d.ts +119 -0
  131. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -0
  132. package/dist/agent-farm/servers/tower-terminals.js +629 -0
  133. package/dist/agent-farm/servers/tower-terminals.js.map +1 -0
  134. package/dist/agent-farm/servers/tower-tunnel.d.ts +34 -0
  135. package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -0
  136. package/dist/agent-farm/servers/tower-tunnel.js +473 -0
  137. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -0
  138. package/dist/agent-farm/servers/tower-types.d.ts +86 -0
  139. package/dist/agent-farm/servers/tower-types.d.ts.map +1 -0
  140. package/dist/agent-farm/servers/tower-types.js +6 -0
  141. package/dist/agent-farm/servers/tower-types.js.map +1 -0
  142. package/dist/agent-farm/servers/tower-utils.d.ts +58 -0
  143. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -0
  144. package/dist/agent-farm/servers/tower-utils.js +182 -0
  145. package/dist/agent-farm/servers/tower-utils.js.map +1 -0
  146. package/dist/agent-farm/servers/tower-websocket.d.ts +25 -0
  147. package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -0
  148. package/dist/agent-farm/servers/tower-websocket.js +171 -0
  149. package/dist/agent-farm/servers/tower-websocket.js.map +1 -0
  150. package/dist/agent-farm/state.d.ts +6 -12
  151. package/dist/agent-farm/state.d.ts.map +1 -1
  152. package/dist/agent-farm/state.js +34 -49
  153. package/dist/agent-farm/state.js.map +1 -1
  154. package/dist/agent-farm/types.d.ts +49 -26
  155. package/dist/agent-farm/types.d.ts.map +1 -1
  156. package/dist/agent-farm/utils/config.d.ts +0 -5
  157. package/dist/agent-farm/utils/config.d.ts.map +1 -1
  158. package/dist/agent-farm/utils/config.js +12 -44
  159. package/dist/agent-farm/utils/config.js.map +1 -1
  160. package/dist/agent-farm/utils/deps.d.ts.map +1 -1
  161. package/dist/agent-farm/utils/deps.js +0 -32
  162. package/dist/agent-farm/utils/deps.js.map +1 -1
  163. package/dist/agent-farm/utils/file-tabs.d.ts +27 -0
  164. package/dist/agent-farm/utils/file-tabs.d.ts.map +1 -0
  165. package/dist/agent-farm/utils/file-tabs.js +46 -0
  166. package/dist/agent-farm/utils/file-tabs.js.map +1 -0
  167. package/dist/agent-farm/utils/gate-status.d.ts +16 -0
  168. package/dist/agent-farm/utils/gate-status.d.ts.map +1 -0
  169. package/dist/agent-farm/utils/gate-status.js +79 -0
  170. package/dist/agent-farm/utils/gate-status.js.map +1 -0
  171. package/dist/agent-farm/utils/gate-watcher.d.ts +38 -0
  172. package/dist/agent-farm/utils/gate-watcher.d.ts.map +1 -0
  173. package/dist/agent-farm/utils/gate-watcher.js +122 -0
  174. package/dist/agent-farm/utils/gate-watcher.js.map +1 -0
  175. package/dist/agent-farm/utils/index.d.ts +0 -1
  176. package/dist/agent-farm/utils/index.d.ts.map +1 -1
  177. package/dist/agent-farm/utils/index.js +0 -1
  178. package/dist/agent-farm/utils/index.js.map +1 -1
  179. package/dist/agent-farm/utils/notifications.d.ts +30 -0
  180. package/dist/agent-farm/utils/notifications.d.ts.map +1 -0
  181. package/dist/agent-farm/utils/notifications.js +121 -0
  182. package/dist/agent-farm/utils/notifications.js.map +1 -0
  183. package/dist/agent-farm/utils/server-utils.d.ts +5 -5
  184. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
  185. package/dist/agent-farm/utils/server-utils.js +5 -16
  186. package/dist/agent-farm/utils/server-utils.js.map +1 -1
  187. package/dist/agent-farm/utils/session.d.ts +32 -0
  188. package/dist/agent-farm/utils/session.d.ts.map +1 -0
  189. package/dist/agent-farm/utils/session.js +57 -0
  190. package/dist/agent-farm/utils/session.js.map +1 -0
  191. package/dist/agent-farm/utils/shell.d.ts +9 -22
  192. package/dist/agent-farm/utils/shell.d.ts.map +1 -1
  193. package/dist/agent-farm/utils/shell.js +34 -34
  194. package/dist/agent-farm/utils/shell.js.map +1 -1
  195. package/dist/cli.d.ts.map +1 -1
  196. package/dist/cli.js +11 -54
  197. package/dist/cli.js.map +1 -1
  198. package/dist/commands/adopt.d.ts.map +1 -1
  199. package/dist/commands/adopt.js +49 -4
  200. package/dist/commands/adopt.js.map +1 -1
  201. package/dist/commands/consult/index.d.ts +13 -2
  202. package/dist/commands/consult/index.d.ts.map +1 -1
  203. package/dist/commands/consult/index.js +245 -29
  204. package/dist/commands/consult/index.js.map +1 -1
  205. package/dist/commands/doctor.d.ts.map +1 -1
  206. package/dist/commands/doctor.js +96 -79
  207. package/dist/commands/doctor.js.map +1 -1
  208. package/dist/commands/init.d.ts.map +1 -1
  209. package/dist/commands/init.js +52 -3
  210. package/dist/commands/init.js.map +1 -1
  211. package/dist/commands/porch/build-counter.d.ts +5 -0
  212. package/dist/commands/porch/build-counter.d.ts.map +1 -0
  213. package/dist/commands/porch/build-counter.js +5 -0
  214. package/dist/commands/porch/build-counter.js.map +1 -0
  215. package/dist/commands/porch/checks.d.ts +17 -29
  216. package/dist/commands/porch/checks.d.ts.map +1 -1
  217. package/dist/commands/porch/checks.js +96 -144
  218. package/dist/commands/porch/checks.js.map +1 -1
  219. package/dist/commands/porch/index.d.ts +25 -43
  220. package/dist/commands/porch/index.d.ts.map +1 -1
  221. package/dist/commands/porch/index.js +466 -1238
  222. package/dist/commands/porch/index.js.map +1 -1
  223. package/dist/commands/porch/next.d.ts +22 -0
  224. package/dist/commands/porch/next.d.ts.map +1 -0
  225. package/dist/commands/porch/next.js +571 -0
  226. package/dist/commands/porch/next.js.map +1 -0
  227. package/dist/commands/porch/plan.d.ts +70 -0
  228. package/dist/commands/porch/plan.d.ts.map +1 -0
  229. package/dist/commands/porch/plan.js +190 -0
  230. package/dist/commands/porch/plan.js.map +1 -0
  231. package/dist/commands/porch/prompts.d.ts +19 -0
  232. package/dist/commands/porch/prompts.d.ts.map +1 -0
  233. package/dist/commands/porch/prompts.js +277 -0
  234. package/dist/commands/porch/prompts.js.map +1 -0
  235. package/dist/commands/porch/protocol.d.ts +59 -0
  236. package/dist/commands/porch/protocol.d.ts.map +1 -0
  237. package/dist/commands/porch/protocol.js +294 -0
  238. package/dist/commands/porch/protocol.js.map +1 -0
  239. package/dist/commands/porch/state.d.ts +36 -107
  240. package/dist/commands/porch/state.d.ts.map +1 -1
  241. package/dist/commands/porch/state.js +120 -699
  242. package/dist/commands/porch/state.js.map +1 -1
  243. package/dist/commands/porch/types.d.ts +99 -164
  244. package/dist/commands/porch/types.d.ts.map +1 -1
  245. package/dist/commands/porch/types.js +2 -1
  246. package/dist/commands/porch/types.js.map +1 -1
  247. package/dist/commands/porch/verdict.d.ts +31 -0
  248. package/dist/commands/porch/verdict.d.ts.map +1 -0
  249. package/dist/commands/porch/verdict.js +59 -0
  250. package/dist/commands/porch/verdict.js.map +1 -0
  251. package/dist/commands/update.d.ts.map +1 -1
  252. package/dist/commands/update.js +31 -0
  253. package/dist/commands/update.js.map +1 -1
  254. package/dist/lib/scaffold.d.ts +37 -0
  255. package/dist/lib/scaffold.d.ts.map +1 -1
  256. package/dist/lib/scaffold.js +114 -0
  257. package/dist/lib/scaffold.js.map +1 -1
  258. package/dist/terminal/index.d.ts +8 -0
  259. package/dist/terminal/index.d.ts.map +1 -0
  260. package/dist/terminal/index.js +5 -0
  261. package/dist/terminal/index.js.map +1 -0
  262. package/dist/terminal/pty-manager.d.ts +69 -0
  263. package/dist/terminal/pty-manager.d.ts.map +1 -0
  264. package/dist/terminal/pty-manager.js +377 -0
  265. package/dist/terminal/pty-manager.js.map +1 -0
  266. package/dist/terminal/pty-session.d.ts +104 -0
  267. package/dist/terminal/pty-session.d.ts.map +1 -0
  268. package/dist/terminal/pty-session.js +327 -0
  269. package/dist/terminal/pty-session.js.map +1 -0
  270. package/dist/terminal/ring-buffer.d.ts +34 -0
  271. package/dist/terminal/ring-buffer.d.ts.map +1 -0
  272. package/dist/terminal/ring-buffer.js +94 -0
  273. package/dist/terminal/ring-buffer.js.map +1 -0
  274. package/dist/terminal/session-manager.d.ts +115 -0
  275. package/dist/terminal/session-manager.d.ts.map +1 -0
  276. package/dist/terminal/session-manager.js +582 -0
  277. package/dist/terminal/session-manager.js.map +1 -0
  278. package/dist/terminal/shellper-client.d.ts +66 -0
  279. package/dist/terminal/shellper-client.d.ts.map +1 -0
  280. package/dist/terminal/shellper-client.js +234 -0
  281. package/dist/terminal/shellper-client.js.map +1 -0
  282. package/dist/terminal/shellper-main.d.ts +19 -0
  283. package/dist/terminal/shellper-main.d.ts.map +1 -0
  284. package/dist/terminal/shellper-main.js +153 -0
  285. package/dist/terminal/shellper-main.js.map +1 -0
  286. package/dist/terminal/shellper-process.d.ts +75 -0
  287. package/dist/terminal/shellper-process.d.ts.map +1 -0
  288. package/dist/terminal/shellper-process.js +279 -0
  289. package/dist/terminal/shellper-process.js.map +1 -0
  290. package/dist/terminal/shellper-protocol.d.ts +115 -0
  291. package/dist/terminal/shellper-protocol.d.ts.map +1 -0
  292. package/dist/terminal/shellper-protocol.js +214 -0
  293. package/dist/terminal/shellper-protocol.js.map +1 -0
  294. package/dist/terminal/shellper-replay-buffer.d.ts +38 -0
  295. package/dist/terminal/shellper-replay-buffer.d.ts.map +1 -0
  296. package/dist/terminal/shellper-replay-buffer.js +94 -0
  297. package/dist/terminal/shellper-replay-buffer.js.map +1 -0
  298. package/dist/terminal/ws-protocol.d.ts +27 -0
  299. package/dist/terminal/ws-protocol.d.ts.map +1 -0
  300. package/dist/terminal/ws-protocol.js +44 -0
  301. package/dist/terminal/ws-protocol.js.map +1 -0
  302. package/package.json +19 -5
  303. package/skeleton/.claude/skills/af/SKILL.md +89 -0
  304. package/skeleton/.claude/skills/codev/SKILL.md +41 -0
  305. package/skeleton/.claude/skills/consult/SKILL.md +81 -0
  306. package/skeleton/.claude/skills/generate-image/SKILL.md +56 -0
  307. package/skeleton/DEPENDENCIES.md +4 -62
  308. package/skeleton/builders.md +1 -1
  309. package/skeleton/consult-types/impl-review.md +18 -9
  310. package/skeleton/consult-types/integration-review.md +1 -1
  311. package/skeleton/consult-types/plan-review.md +1 -1
  312. package/skeleton/consult-types/pr-ready.md +1 -1
  313. package/skeleton/consult-types/spec-review.md +1 -1
  314. package/skeleton/porch/prompts/defend.md +1 -1
  315. package/skeleton/porch/prompts/evaluate.md +2 -2
  316. package/skeleton/porch/prompts/implement.md +1 -1
  317. package/skeleton/porch/prompts/plan.md +1 -1
  318. package/skeleton/porch/prompts/review.md +4 -4
  319. package/skeleton/porch/prompts/specify.md +1 -1
  320. package/skeleton/porch/prompts/understand.md +2 -2
  321. package/skeleton/protocol-schema.json +282 -0
  322. package/skeleton/protocols/bugfix/builder-prompt.md +60 -0
  323. package/skeleton/protocols/bugfix/prompts/fix.md +77 -0
  324. package/skeleton/protocols/bugfix/prompts/investigate.md +77 -0
  325. package/skeleton/protocols/bugfix/prompts/pr.md +84 -0
  326. package/skeleton/protocols/bugfix/protocol.json +20 -33
  327. package/skeleton/protocols/experiment/builder-prompt.md +52 -0
  328. package/skeleton/protocols/experiment/protocol.json +101 -0
  329. package/skeleton/protocols/experiment/protocol.md +3 -3
  330. package/skeleton/protocols/experiment/templates/notes.md +1 -1
  331. package/skeleton/protocols/maintain/builder-prompt.md +46 -0
  332. package/skeleton/protocols/maintain/prompts/audit.md +111 -0
  333. package/skeleton/protocols/maintain/prompts/clean.md +91 -0
  334. package/skeleton/protocols/maintain/prompts/sync.md +113 -0
  335. package/skeleton/protocols/maintain/prompts/verify.md +110 -0
  336. package/skeleton/protocols/maintain/protocol.json +141 -0
  337. package/skeleton/protocols/maintain/protocol.md +17 -11
  338. package/skeleton/protocols/protocol-schema.json +54 -1
  339. package/skeleton/protocols/spir/builder-prompt.md +66 -0
  340. package/skeleton/protocols/spir/prompts/implement.md +208 -0
  341. package/skeleton/protocols/{spider → spir}/prompts/plan.md +6 -70
  342. package/skeleton/protocols/{spider → spir}/prompts/review.md +20 -39
  343. package/skeleton/protocols/{spider → spir}/prompts/specify.md +33 -61
  344. package/skeleton/protocols/spir/protocol.json +156 -0
  345. package/skeleton/protocols/{spider → spir}/protocol.md +35 -21
  346. package/skeleton/protocols/{spider → spir}/templates/plan.md +14 -0
  347. package/skeleton/protocols/spir/templates/review.md +89 -0
  348. package/skeleton/protocols/tick/builder-prompt.md +56 -0
  349. package/skeleton/protocols/tick/protocol.json +7 -2
  350. package/skeleton/protocols/tick/protocol.md +18 -18
  351. package/skeleton/protocols/tick/templates/review.md +1 -1
  352. package/skeleton/resources/commands/agent-farm.md +63 -46
  353. package/skeleton/resources/commands/codev.md +0 -2
  354. package/skeleton/resources/commands/overview.md +7 -17
  355. package/skeleton/resources/workflow-reference.md +4 -4
  356. package/skeleton/roles/architect.md +152 -315
  357. package/skeleton/roles/builder.md +120 -214
  358. package/skeleton/roles/consultant.md +6 -6
  359. package/skeleton/templates/AGENTS.md +2 -2
  360. package/skeleton/templates/CLAUDE.md +2 -2
  361. package/skeleton/templates/cheatsheet.md +7 -5
  362. package/skeleton/templates/projectlist.md +1 -1
  363. package/templates/dashboard/index.html +17 -43
  364. package/templates/dashboard/js/dialogs.js +7 -7
  365. package/templates/dashboard/js/files.js +2 -2
  366. package/templates/dashboard/js/main.js +4 -4
  367. package/templates/dashboard/js/projects.js +3 -3
  368. package/templates/dashboard/js/tabs.js +1 -1
  369. package/templates/dashboard/js/utils.js +22 -87
  370. package/templates/open.html +26 -0
  371. package/templates/tower.html +731 -91
  372. package/dist/agent-farm/commands/kickoff.d.ts +0 -20
  373. package/dist/agent-farm/commands/kickoff.d.ts.map +0 -1
  374. package/dist/agent-farm/commands/kickoff.js +0 -337
  375. package/dist/agent-farm/commands/kickoff.js.map +0 -1
  376. package/dist/agent-farm/commands/rename.d.ts +0 -13
  377. package/dist/agent-farm/commands/rename.d.ts.map +0 -1
  378. package/dist/agent-farm/commands/rename.js +0 -33
  379. package/dist/agent-farm/commands/rename.js.map +0 -1
  380. package/dist/agent-farm/commands/tutorial.d.ts +0 -10
  381. package/dist/agent-farm/commands/tutorial.d.ts.map +0 -1
  382. package/dist/agent-farm/commands/tutorial.js +0 -49
  383. package/dist/agent-farm/commands/tutorial.js.map +0 -1
  384. package/dist/agent-farm/commands/util.d.ts +0 -15
  385. package/dist/agent-farm/commands/util.d.ts.map +0 -1
  386. package/dist/agent-farm/commands/util.js +0 -108
  387. package/dist/agent-farm/commands/util.js.map +0 -1
  388. package/dist/agent-farm/servers/dashboard-server.d.ts +0 -7
  389. package/dist/agent-farm/servers/dashboard-server.d.ts.map +0 -1
  390. package/dist/agent-farm/servers/dashboard-server.js +0 -1872
  391. package/dist/agent-farm/servers/dashboard-server.js.map +0 -1
  392. package/dist/agent-farm/servers/open-server.d.ts +0 -7
  393. package/dist/agent-farm/servers/open-server.d.ts.map +0 -1
  394. package/dist/agent-farm/servers/open-server.js +0 -315
  395. package/dist/agent-farm/servers/open-server.js.map +0 -1
  396. package/dist/agent-farm/tutorial/index.d.ts +0 -8
  397. package/dist/agent-farm/tutorial/index.d.ts.map +0 -1
  398. package/dist/agent-farm/tutorial/index.js +0 -8
  399. package/dist/agent-farm/tutorial/index.js.map +0 -1
  400. package/dist/agent-farm/tutorial/prompts.d.ts +0 -57
  401. package/dist/agent-farm/tutorial/prompts.d.ts.map +0 -1
  402. package/dist/agent-farm/tutorial/prompts.js +0 -147
  403. package/dist/agent-farm/tutorial/prompts.js.map +0 -1
  404. package/dist/agent-farm/tutorial/runner.d.ts +0 -52
  405. package/dist/agent-farm/tutorial/runner.d.ts.map +0 -1
  406. package/dist/agent-farm/tutorial/runner.js +0 -204
  407. package/dist/agent-farm/tutorial/runner.js.map +0 -1
  408. package/dist/agent-farm/tutorial/state.d.ts +0 -26
  409. package/dist/agent-farm/tutorial/state.d.ts.map +0 -1
  410. package/dist/agent-farm/tutorial/state.js +0 -89
  411. package/dist/agent-farm/tutorial/state.js.map +0 -1
  412. package/dist/agent-farm/tutorial/steps/first-spec.d.ts +0 -7
  413. package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +0 -1
  414. package/dist/agent-farm/tutorial/steps/first-spec.js +0 -136
  415. package/dist/agent-farm/tutorial/steps/first-spec.js.map +0 -1
  416. package/dist/agent-farm/tutorial/steps/implementation.d.ts +0 -7
  417. package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +0 -1
  418. package/dist/agent-farm/tutorial/steps/implementation.js +0 -76
  419. package/dist/agent-farm/tutorial/steps/implementation.js.map +0 -1
  420. package/dist/agent-farm/tutorial/steps/index.d.ts +0 -10
  421. package/dist/agent-farm/tutorial/steps/index.d.ts.map +0 -1
  422. package/dist/agent-farm/tutorial/steps/index.js +0 -10
  423. package/dist/agent-farm/tutorial/steps/index.js.map +0 -1
  424. package/dist/agent-farm/tutorial/steps/planning.d.ts +0 -7
  425. package/dist/agent-farm/tutorial/steps/planning.d.ts.map +0 -1
  426. package/dist/agent-farm/tutorial/steps/planning.js +0 -143
  427. package/dist/agent-farm/tutorial/steps/planning.js.map +0 -1
  428. package/dist/agent-farm/tutorial/steps/review.d.ts +0 -7
  429. package/dist/agent-farm/tutorial/steps/review.d.ts.map +0 -1
  430. package/dist/agent-farm/tutorial/steps/review.js +0 -78
  431. package/dist/agent-farm/tutorial/steps/review.js.map +0 -1
  432. package/dist/agent-farm/tutorial/steps/setup.d.ts +0 -7
  433. package/dist/agent-farm/tutorial/steps/setup.d.ts.map +0 -1
  434. package/dist/agent-farm/tutorial/steps/setup.js +0 -126
  435. package/dist/agent-farm/tutorial/steps/setup.js.map +0 -1
  436. package/dist/agent-farm/tutorial/steps/welcome.d.ts +0 -7
  437. package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +0 -1
  438. package/dist/agent-farm/tutorial/steps/welcome.js +0 -50
  439. package/dist/agent-farm/tutorial/steps/welcome.js.map +0 -1
  440. package/dist/agent-farm/utils/orphan-handler.d.ts +0 -27
  441. package/dist/agent-farm/utils/orphan-handler.d.ts.map +0 -1
  442. package/dist/agent-farm/utils/orphan-handler.js +0 -149
  443. package/dist/agent-farm/utils/orphan-handler.js.map +0 -1
  444. package/dist/agent-farm/utils/port-registry.d.ts +0 -58
  445. package/dist/agent-farm/utils/port-registry.d.ts.map +0 -1
  446. package/dist/agent-farm/utils/port-registry.js +0 -166
  447. package/dist/agent-farm/utils/port-registry.js.map +0 -1
  448. package/dist/agent-farm/utils/terminal-ports.d.ts +0 -18
  449. package/dist/agent-farm/utils/terminal-ports.d.ts.map +0 -1
  450. package/dist/agent-farm/utils/terminal-ports.js +0 -35
  451. package/dist/agent-farm/utils/terminal-ports.js.map +0 -1
  452. package/dist/commands/pcheck/cache.d.ts +0 -48
  453. package/dist/commands/pcheck/cache.d.ts.map +0 -1
  454. package/dist/commands/pcheck/cache.js +0 -170
  455. package/dist/commands/pcheck/cache.js.map +0 -1
  456. package/dist/commands/pcheck/evaluator.d.ts +0 -15
  457. package/dist/commands/pcheck/evaluator.d.ts.map +0 -1
  458. package/dist/commands/pcheck/evaluator.js +0 -246
  459. package/dist/commands/pcheck/evaluator.js.map +0 -1
  460. package/dist/commands/pcheck/index.d.ts +0 -12
  461. package/dist/commands/pcheck/index.d.ts.map +0 -1
  462. package/dist/commands/pcheck/index.js +0 -249
  463. package/dist/commands/pcheck/index.js.map +0 -1
  464. package/dist/commands/pcheck/parser.d.ts +0 -39
  465. package/dist/commands/pcheck/parser.d.ts.map +0 -1
  466. package/dist/commands/pcheck/parser.js +0 -155
  467. package/dist/commands/pcheck/parser.js.map +0 -1
  468. package/dist/commands/pcheck/types.d.ts +0 -82
  469. package/dist/commands/pcheck/types.d.ts.map +0 -1
  470. package/dist/commands/pcheck/types.js +0 -5
  471. package/dist/commands/pcheck/types.js.map +0 -1
  472. package/dist/commands/porch/consultation.d.ts +0 -56
  473. package/dist/commands/porch/consultation.d.ts.map +0 -1
  474. package/dist/commands/porch/consultation.js +0 -330
  475. package/dist/commands/porch/consultation.js.map +0 -1
  476. package/dist/commands/porch/notifications.d.ts +0 -99
  477. package/dist/commands/porch/notifications.d.ts.map +0 -1
  478. package/dist/commands/porch/notifications.js +0 -223
  479. package/dist/commands/porch/notifications.js.map +0 -1
  480. package/dist/commands/porch/plan-parser.d.ts +0 -38
  481. package/dist/commands/porch/plan-parser.d.ts.map +0 -1
  482. package/dist/commands/porch/plan-parser.js +0 -166
  483. package/dist/commands/porch/plan-parser.js.map +0 -1
  484. package/dist/commands/porch/protocol-loader.d.ts +0 -46
  485. package/dist/commands/porch/protocol-loader.d.ts.map +0 -1
  486. package/dist/commands/porch/protocol-loader.js +0 -253
  487. package/dist/commands/porch/protocol-loader.js.map +0 -1
  488. package/dist/commands/porch/signal-parser.d.ts +0 -88
  489. package/dist/commands/porch/signal-parser.d.ts.map +0 -1
  490. package/dist/commands/porch/signal-parser.js +0 -148
  491. package/dist/commands/porch/signal-parser.js.map +0 -1
  492. package/dist/commands/tower.d.ts +0 -16
  493. package/dist/commands/tower.d.ts.map +0 -1
  494. package/dist/commands/tower.js +0 -21
  495. package/dist/commands/tower.js.map +0 -1
  496. package/skeleton/config.json +0 -7
  497. package/skeleton/porch/protocols/bugfix.json +0 -85
  498. package/skeleton/porch/protocols/spider.json +0 -135
  499. package/skeleton/porch/protocols/tick.json +0 -76
  500. package/skeleton/protocols/spider/prompts/defend.md +0 -215
  501. package/skeleton/protocols/spider/prompts/evaluate.md +0 -241
  502. package/skeleton/protocols/spider/prompts/implement.md +0 -149
  503. package/skeleton/protocols/spider/protocol.json +0 -210
  504. package/skeleton/protocols/spider/templates/review.md +0 -207
  505. package/templates/dashboard/css/activity.css +0 -151
  506. package/templates/dashboard/js/activity.js +0 -112
  507. /package/skeleton/protocols/{spider → spir}/templates/spec.md +0 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Cloud tunnel management for tower server.
3
+ * Spec 0105: Tower Server Decomposition — Phase 2
4
+ *
5
+ * Contains: tunnel client lifecycle, config file watching,
6
+ * metadata refresh, and tunnel API endpoint handling.
7
+ */
8
+ import http from 'node:http';
9
+ import type { ProjectTerminals, InstanceStatus } from './tower-types.js';
10
+ import type { TerminalManager } from '../../terminal/pty-manager.js';
11
+ /** Minimal dependencies required by the tunnel module */
12
+ export interface TunnelDeps {
13
+ port: number;
14
+ log: (level: 'INFO' | 'ERROR' | 'WARN', message: string) => void;
15
+ projectTerminals: Map<string, ProjectTerminals>;
16
+ terminalManager: TerminalManager | null;
17
+ }
18
+ /**
19
+ * Initialize the tunnel module. Reads cloud config and connects if registered.
20
+ * Starts config file watcher for credential changes.
21
+ */
22
+ export declare function initTunnel(deps: TunnelDeps, callbacks: {
23
+ getInstances: () => Promise<InstanceStatus[]>;
24
+ }): Promise<void>;
25
+ /**
26
+ * Shut down the tunnel module. Disconnects client, stops watchers.
27
+ */
28
+ export declare function shutdownTunnel(): void;
29
+ /**
30
+ * Handle tunnel management endpoints (Spec 0097 Phase 4, Spec 0107 Phase 2).
31
+ * Dispatches /api/tunnel/{connect,connect/callback,disconnect,status} requests.
32
+ */
33
+ export declare function handleTunnelEndpoint(req: http.IncomingMessage, res: http.ServerResponse, tunnelSub: string): Promise<void>;
34
+ //# sourceMappingURL=tower-tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-tunnel.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-tunnel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,IAAI,MAAM,WAAW,CAAC;AAe7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAChD,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;CACzC;AAgMD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE;IAAE,YAAY,EAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAUrC;AA6BD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAwOf"}
@@ -0,0 +1,473 @@
1
+ /**
2
+ * Cloud tunnel management for tower server.
3
+ * Spec 0105: Tower Server Decomposition — Phase 2
4
+ *
5
+ * Contains: tunnel client lifecycle, config file watching,
6
+ * metadata refresh, and tunnel API endpoint handling.
7
+ */
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import os from 'node:os';
11
+ import { TunnelClient } from '../lib/tunnel-client.js';
12
+ import { readCloudConfig, writeCloudConfig, deleteCloudConfig, getCloudConfigPath, getOrCreateMachineId, maskApiKey, } from '../lib/cloud-config.js';
13
+ import { createPendingRegistration, consumePendingRegistration } from '../lib/nonce-store.js';
14
+ import { redeemToken } from '../lib/token-exchange.js';
15
+ import { validateDeviceName } from '../lib/device-name.js';
16
+ // ============================================================================
17
+ // Module-private state (lifecycle driven by orchestrator)
18
+ // ============================================================================
19
+ let tunnelClient = null;
20
+ let configWatcher = null;
21
+ let configWatchDebounce = null;
22
+ let metadataRefreshInterval = null;
23
+ const METADATA_REFRESH_MS = 30_000;
24
+ const DEFAULT_SERVER_URL = 'https://cloud.codevos.ai';
25
+ /** Stored references set by initTunnel() */
26
+ let _deps = null;
27
+ let _getInstances = null;
28
+ // ============================================================================
29
+ // Internal functions
30
+ // ============================================================================
31
+ /**
32
+ * Gather current tower metadata (projects + terminals) for codevos.ai.
33
+ */
34
+ async function gatherMetadata() {
35
+ if (!_deps || !_getInstances)
36
+ throw new Error('Tunnel not initialized');
37
+ const instances = await _getInstances();
38
+ const projects = instances.map((i) => ({
39
+ path: i.projectPath,
40
+ name: i.projectName,
41
+ }));
42
+ // Build reverse mapping: terminal ID → project path
43
+ const terminalToProject = new Map();
44
+ for (const [projectPath, entry] of _deps.projectTerminals) {
45
+ if (entry.architect)
46
+ terminalToProject.set(entry.architect, projectPath);
47
+ for (const termId of entry.builders.values())
48
+ terminalToProject.set(termId, projectPath);
49
+ for (const termId of entry.shells.values())
50
+ terminalToProject.set(termId, projectPath);
51
+ }
52
+ const manager = _deps.terminalManager;
53
+ const terminals = [];
54
+ if (manager) {
55
+ for (const session of manager.listSessions()) {
56
+ terminals.push({
57
+ id: session.id,
58
+ projectPath: terminalToProject.get(session.id) ?? '',
59
+ });
60
+ }
61
+ }
62
+ return { projects, terminals };
63
+ }
64
+ /**
65
+ * Start periodic metadata refresh — re-gathers metadata and pushes to codevos.ai
66
+ * every METADATA_REFRESH_MS while the tunnel is connected.
67
+ */
68
+ function startMetadataRefresh() {
69
+ stopMetadataRefresh();
70
+ metadataRefreshInterval = setInterval(async () => {
71
+ try {
72
+ if (tunnelClient && tunnelClient.getState() === 'connected') {
73
+ const metadata = await gatherMetadata();
74
+ tunnelClient.sendMetadata(metadata);
75
+ }
76
+ }
77
+ catch (err) {
78
+ _deps?.log('WARN', `Metadata refresh failed: ${err.message}`);
79
+ }
80
+ }, METADATA_REFRESH_MS);
81
+ }
82
+ /**
83
+ * Stop the periodic metadata refresh.
84
+ */
85
+ function stopMetadataRefresh() {
86
+ if (metadataRefreshInterval) {
87
+ clearInterval(metadataRefreshInterval);
88
+ metadataRefreshInterval = null;
89
+ }
90
+ }
91
+ /**
92
+ * Create or reconnect the tunnel client using the given config.
93
+ * Sets up state change listeners and sends initial metadata.
94
+ */
95
+ async function connectTunnel(config) {
96
+ if (!_deps)
97
+ throw new Error('Tunnel not initialized');
98
+ // Disconnect existing client if any
99
+ if (tunnelClient) {
100
+ tunnelClient.disconnect();
101
+ }
102
+ const client = new TunnelClient({
103
+ serverUrl: config.server_url,
104
+ apiKey: config.api_key,
105
+ towerId: config.tower_id,
106
+ localPort: _deps.port,
107
+ });
108
+ client.onStateChange((state, prev) => {
109
+ _deps.log('INFO', `Tunnel: ${prev} → ${state}`);
110
+ if (state === 'connected') {
111
+ startMetadataRefresh();
112
+ }
113
+ else if (prev === 'connected') {
114
+ stopMetadataRefresh();
115
+ }
116
+ if (state === 'auth_failed') {
117
+ _deps.log('ERROR', 'Cloud connection failed: API key is invalid or revoked. Run \'af tower connect --reauth\' to update credentials.');
118
+ }
119
+ });
120
+ // Gather and set initial metadata before connecting
121
+ const metadata = await gatherMetadata();
122
+ client.sendMetadata(metadata);
123
+ tunnelClient = client;
124
+ client.connect();
125
+ // Ensure config watcher is running — the config directory now exists.
126
+ startConfigWatcher();
127
+ return client;
128
+ }
129
+ /**
130
+ * Start watching cloud-config.json for changes.
131
+ * On change: reconnect with new credentials.
132
+ * On delete: disconnect tunnel.
133
+ */
134
+ function startConfigWatcher() {
135
+ stopConfigWatcher();
136
+ const configPath = getCloudConfigPath();
137
+ const configDir = path.dirname(configPath);
138
+ const configFile = path.basename(configPath);
139
+ // Watch the directory (more reliable than watching the file directly)
140
+ try {
141
+ configWatcher = fs.watch(configDir, (eventType, filename) => {
142
+ if (filename !== configFile)
143
+ return;
144
+ // Debounce: multiple events fire for a single write
145
+ if (configWatchDebounce)
146
+ clearTimeout(configWatchDebounce);
147
+ configWatchDebounce = setTimeout(async () => {
148
+ configWatchDebounce = null;
149
+ try {
150
+ const config = readCloudConfig();
151
+ if (config) {
152
+ _deps?.log('INFO', `Cloud config changed, reconnecting tunnel (key: ${maskApiKey(config.api_key)})`);
153
+ // Reset circuit breaker in case previous key was invalid
154
+ if (tunnelClient)
155
+ tunnelClient.resetCircuitBreaker();
156
+ await connectTunnel(config);
157
+ }
158
+ else {
159
+ // Config deleted or invalid
160
+ _deps?.log('INFO', 'Cloud config removed or invalid, disconnecting tunnel');
161
+ if (tunnelClient) {
162
+ tunnelClient.disconnect();
163
+ tunnelClient = null;
164
+ }
165
+ }
166
+ }
167
+ catch (err) {
168
+ _deps?.log('WARN', `Error handling config change: ${err.message}`);
169
+ }
170
+ }, 500);
171
+ });
172
+ }
173
+ catch {
174
+ // Directory doesn't exist yet — that's fine, user hasn't registered
175
+ }
176
+ }
177
+ /**
178
+ * Stop watching cloud-config.json.
179
+ */
180
+ function stopConfigWatcher() {
181
+ if (configWatcher) {
182
+ configWatcher.close();
183
+ configWatcher = null;
184
+ }
185
+ if (configWatchDebounce) {
186
+ clearTimeout(configWatchDebounce);
187
+ configWatchDebounce = null;
188
+ }
189
+ }
190
+ // ============================================================================
191
+ // Public API (called by orchestrator)
192
+ // ============================================================================
193
+ /**
194
+ * Initialize the tunnel module. Reads cloud config and connects if registered.
195
+ * Starts config file watcher for credential changes.
196
+ */
197
+ export async function initTunnel(deps, callbacks) {
198
+ _deps = deps;
199
+ _getInstances = callbacks.getInstances;
200
+ // Auto-connect tunnel if registered
201
+ try {
202
+ const config = readCloudConfig();
203
+ if (config) {
204
+ deps.log('INFO', `Cloud config found, connecting tunnel (tower: ${config.tower_name}, key: ${maskApiKey(config.api_key)})`);
205
+ await connectTunnel(config);
206
+ }
207
+ else {
208
+ deps.log('INFO', 'No cloud config found, operating in local-only mode');
209
+ }
210
+ }
211
+ catch (err) {
212
+ deps.log('WARN', `Failed to read cloud config: ${err.message}. Operating in local-only mode.`);
213
+ }
214
+ // Start watching cloud-config.json for changes
215
+ startConfigWatcher();
216
+ }
217
+ /**
218
+ * Shut down the tunnel module. Disconnects client, stops watchers.
219
+ */
220
+ export function shutdownTunnel() {
221
+ stopMetadataRefresh();
222
+ stopConfigWatcher();
223
+ if (tunnelClient) {
224
+ _deps?.log('INFO', 'Disconnecting tunnel...');
225
+ tunnelClient.disconnect();
226
+ tunnelClient = null;
227
+ }
228
+ _deps = null;
229
+ _getInstances = null;
230
+ }
231
+ /**
232
+ * Read the request body as a string.
233
+ */
234
+ function readBody(req) {
235
+ return new Promise((resolve, reject) => {
236
+ const chunks = [];
237
+ req.on('data', (chunk) => chunks.push(chunk));
238
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
239
+ req.on('error', reject);
240
+ });
241
+ }
242
+ /**
243
+ * Generate a minimal HTML response page.
244
+ */
245
+ function escapeHtml(str) {
246
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
247
+ }
248
+ function htmlPage(title, body) {
249
+ return `<!DOCTYPE html>
250
+ <html><head><meta charset="utf-8"><title>${title}</title>
251
+ <style>body{font-family:system-ui,sans-serif;max-width:480px;margin:60px auto;text-align:center}
252
+ h1{font-size:1.4em}a{color:#0066cc}</style></head>
253
+ <body><h1>${title}</h1>${body}</body></html>`;
254
+ }
255
+ /**
256
+ * Handle tunnel management endpoints (Spec 0097 Phase 4, Spec 0107 Phase 2).
257
+ * Dispatches /api/tunnel/{connect,connect/callback,disconnect,status} requests.
258
+ */
259
+ export async function handleTunnelEndpoint(req, res, tunnelSub) {
260
+ // GET connect/callback — OAuth callback (MUST be checked BEFORE 'connect')
261
+ if (req.method === 'GET' && tunnelSub === 'connect/callback') {
262
+ const url = new URL(req.url, `http://${req.headers.host}`);
263
+ const token = url.searchParams.get('token');
264
+ const nonce = url.searchParams.get('nonce');
265
+ if (!token || !nonce) {
266
+ res.writeHead(400, { 'Content-Type': 'text/html' });
267
+ res.end(htmlPage('Registration Failed', '<p>Missing token or nonce parameter.</p><p><a href="/">Back to Tower</a></p>'));
268
+ return;
269
+ }
270
+ const pending = consumePendingRegistration(nonce);
271
+ if (!pending) {
272
+ res.writeHead(400, { 'Content-Type': 'text/html' });
273
+ res.end(htmlPage('Registration Failed', '<p>Invalid or expired registration link. Please try again from the Tower UI.</p><p><a href="/">Back to Tower</a></p>'));
274
+ return;
275
+ }
276
+ try {
277
+ const machineId = getOrCreateMachineId();
278
+ _deps?.log('INFO', `OAuth callback: redeeming token for tower "${pending.name}" (key: ${maskApiKey(token)})`);
279
+ const { towerId, apiKey } = await redeemToken(pending.serverUrl, token, pending.name, machineId);
280
+ writeCloudConfig({
281
+ tower_id: towerId,
282
+ tower_name: pending.name,
283
+ api_key: apiKey,
284
+ server_url: pending.serverUrl,
285
+ });
286
+ _deps?.log('INFO', `Registration complete: tower="${pending.name}" id=${towerId} key=${maskApiKey(apiKey)}`);
287
+ // Connect tunnel with new credentials
288
+ const config = readCloudConfig();
289
+ if (config) {
290
+ await connectTunnel(config);
291
+ }
292
+ res.writeHead(200, { 'Content-Type': 'text/html' });
293
+ res.end(htmlPage('Connected to Codev Cloud', `<p>Tower "<strong>${pending.name}</strong>" is now connected.</p>` +
294
+ '<p>Redirecting to Tower homepage...</p>' +
295
+ '<meta http-equiv="refresh" content="3;url=/">' +
296
+ '<p><a href="/">Back to Tower</a></p>'));
297
+ }
298
+ catch (err) {
299
+ _deps?.log('ERROR', `OAuth callback failed: ${err.message}`);
300
+ res.writeHead(500, { 'Content-Type': 'text/html' });
301
+ res.end(htmlPage('Registration Failed', `<p>${escapeHtml(err.message)}</p><p><a href="/">Back to Tower</a></p>`));
302
+ }
303
+ return;
304
+ }
305
+ // POST connect — OAuth initiation or smart reconnect
306
+ if (req.method === 'POST' && tunnelSub === 'connect') {
307
+ if (!_deps) {
308
+ res.writeHead(503, { 'Content-Type': 'application/json' });
309
+ res.end(JSON.stringify({ success: false, error: 'Tower is still starting up. Try again shortly.' }));
310
+ return;
311
+ }
312
+ try {
313
+ const rawBody = await readBody(req);
314
+ let body = null;
315
+ if (rawBody.trim()) {
316
+ try {
317
+ body = JSON.parse(rawBody);
318
+ }
319
+ catch {
320
+ res.writeHead(400, { 'Content-Type': 'application/json' });
321
+ res.end(JSON.stringify({ success: false, error: 'Invalid JSON in request body.' }));
322
+ return;
323
+ }
324
+ }
325
+ // OAuth initiation: body contains { name, serverUrl?, origin? }
326
+ if (body && 'name' in body) {
327
+ const name = String(body.name);
328
+ const serverUrl = String(body.serverUrl || DEFAULT_SERVER_URL);
329
+ const origin = String(body.origin || `http://localhost:${_deps.port}`);
330
+ // Validate device name
331
+ const nameResult = validateDeviceName(name);
332
+ if (!nameResult.valid) {
333
+ res.writeHead(400, { 'Content-Type': 'application/json' });
334
+ res.end(JSON.stringify({ success: false, error: nameResult.error }));
335
+ return;
336
+ }
337
+ // Validate origin is a well-formed URL
338
+ try {
339
+ new URL(origin);
340
+ }
341
+ catch {
342
+ res.writeHead(400, { 'Content-Type': 'application/json' });
343
+ res.end(JSON.stringify({ success: false, error: 'Invalid origin URL.' }));
344
+ return;
345
+ }
346
+ // Validate serverUrl is HTTPS (or HTTP on localhost for development)
347
+ try {
348
+ const parsed = new URL(serverUrl);
349
+ const isLocalhost = parsed.hostname === 'localhost' && parsed.protocol === 'http:';
350
+ if (parsed.protocol !== 'https:' && !isLocalhost) {
351
+ res.writeHead(400, { 'Content-Type': 'application/json' });
352
+ res.end(JSON.stringify({ success: false, error: 'Server URL must use HTTPS.' }));
353
+ return;
354
+ }
355
+ }
356
+ catch {
357
+ res.writeHead(400, { 'Content-Type': 'application/json' });
358
+ res.end(JSON.stringify({ success: false, error: 'Invalid server URL.' }));
359
+ return;
360
+ }
361
+ const nonce = createPendingRegistration(name, serverUrl);
362
+ const callbackUrl = `${origin}/api/tunnel/connect/callback?nonce=${nonce}`;
363
+ const authUrl = `${serverUrl}/towers/register?callback=${encodeURIComponent(callbackUrl)}`;
364
+ _deps.log('INFO', `OAuth initiation: tower="${name}" server=${serverUrl}`);
365
+ res.writeHead(200, { 'Content-Type': 'application/json' });
366
+ res.end(JSON.stringify({ authUrl }));
367
+ return;
368
+ }
369
+ // Smart reconnect: no body or empty body — reconnect using existing config
370
+ const config = readCloudConfig();
371
+ if (!config) {
372
+ res.writeHead(400, { 'Content-Type': 'application/json' });
373
+ res.end(JSON.stringify({ success: false, error: "Not registered. Run 'af tower connect' or use the Connect button in the Tower UI." }));
374
+ return;
375
+ }
376
+ if (tunnelClient)
377
+ tunnelClient.resetCircuitBreaker();
378
+ const client = await connectTunnel(config);
379
+ res.writeHead(200, { 'Content-Type': 'application/json' });
380
+ res.end(JSON.stringify({ success: true, state: client.getState() }));
381
+ }
382
+ catch (err) {
383
+ _deps?.log('ERROR', `Tunnel connect failed: ${err.message}`);
384
+ res.writeHead(500, { 'Content-Type': 'application/json' });
385
+ res.end(JSON.stringify({ success: false, error: err.message }));
386
+ }
387
+ return;
388
+ }
389
+ // POST disconnect — deregister server-side + delete local config
390
+ if (req.method === 'POST' && tunnelSub === 'disconnect') {
391
+ let warning;
392
+ // Read config FIRST (need credentials for server-side deregister)
393
+ let config = null;
394
+ try {
395
+ config = readCloudConfig();
396
+ }
397
+ catch {
398
+ // Config corrupted — proceed with local cleanup
399
+ }
400
+ // Disconnect tunnel
401
+ if (tunnelClient) {
402
+ tunnelClient.disconnect();
403
+ tunnelClient = null;
404
+ }
405
+ // Server-side deregister (best-effort)
406
+ if (config) {
407
+ try {
408
+ const resp = await fetch(`${config.server_url}/api/towers/${config.tower_id}`, {
409
+ method: 'DELETE',
410
+ headers: { Authorization: `Bearer ${config.api_key}` },
411
+ signal: AbortSignal.timeout(10_000),
412
+ });
413
+ if (!resp.ok) {
414
+ warning = `Server-side deregister failed (${resp.status}). Local credentials removed.`;
415
+ _deps?.log('WARN', warning);
416
+ }
417
+ else {
418
+ _deps?.log('INFO', `Server-side deregister succeeded for tower ${config.tower_id}`);
419
+ }
420
+ }
421
+ catch (err) {
422
+ warning = `Server-side deregister failed: ${err.message}. Local credentials removed.`;
423
+ _deps?.log('WARN', warning);
424
+ }
425
+ }
426
+ // Delete local config LAST
427
+ try {
428
+ deleteCloudConfig();
429
+ }
430
+ catch (err) {
431
+ res.writeHead(500, { 'Content-Type': 'application/json' });
432
+ res.end(JSON.stringify({ success: false, error: `Failed to delete local config: ${err.message}` }));
433
+ return;
434
+ }
435
+ const response = { success: true };
436
+ if (warning)
437
+ response.warning = warning;
438
+ res.writeHead(200, { 'Content-Type': 'application/json' });
439
+ res.end(JSON.stringify(response));
440
+ return;
441
+ }
442
+ // GET status
443
+ if (req.method === 'GET' && tunnelSub === 'status') {
444
+ let config = null;
445
+ try {
446
+ config = readCloudConfig();
447
+ }
448
+ catch {
449
+ // Config file may be corrupted — treat as unregistered
450
+ }
451
+ const state = tunnelClient?.getState() ?? 'disconnected';
452
+ const uptime = tunnelClient?.getUptime() ?? null;
453
+ const response = {
454
+ registered: config !== null,
455
+ state,
456
+ uptime,
457
+ hostname: os.hostname(),
458
+ };
459
+ if (config) {
460
+ response.towerId = config.tower_id;
461
+ response.towerName = config.tower_name;
462
+ response.serverUrl = config.server_url;
463
+ response.accessUrl = `${config.server_url}/t/${config.tower_name}/`;
464
+ }
465
+ res.writeHead(200, { 'Content-Type': 'application/json' });
466
+ res.end(JSON.stringify(response));
467
+ return;
468
+ }
469
+ // Unknown tunnel endpoint
470
+ res.writeHead(404, { 'Content-Type': 'application/json' });
471
+ res.end(JSON.stringify({ error: 'Not found' }));
472
+ }
473
+ //# sourceMappingURL=tower-tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-tunnel.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Shared types for tower server modules.
3
+ * Spec 0105: Tower Server Decomposition
4
+ */
5
+ import type http from 'node:http';
6
+ import type { WebSocketServer } from 'ws';
7
+ import type Database from 'better-sqlite3';
8
+ import type { TerminalManager } from '../../terminal/pty-manager.js';
9
+ import type { SessionManager } from '../../terminal/session-manager.js';
10
+ import type { GateWatcher } from '../utils/gate-watcher.js';
11
+ import type { TunnelClient } from '../lib/tunnel-client.js';
12
+ import type { FileTab } from '../utils/file-tabs.js';
13
+ import type { GateStatus } from '../utils/gate-status.js';
14
+ /**
15
+ * Shared context passed to all tower modules.
16
+ * The orchestrator (tower-server.ts) owns lifecycle — it creates
17
+ * dependencies in startup order and tears them down in gracefulShutdown.
18
+ */
19
+ export interface TowerContext {
20
+ port: number;
21
+ log: (level: 'INFO' | 'ERROR' | 'WARN', message: string) => void;
22
+ terminalManager: TerminalManager;
23
+ shellperManager: SessionManager | null;
24
+ projectTerminals: Map<string, ProjectTerminals>;
25
+ db: () => Database.Database;
26
+ gateWatcher: GateWatcher;
27
+ broadcastNotification: (n: {
28
+ type: string;
29
+ title: string;
30
+ body: string;
31
+ project?: string;
32
+ }) => void;
33
+ tunnelClient: TunnelClient | null;
34
+ knownProjects: Set<string>;
35
+ server: http.Server;
36
+ terminalWss: WebSocketServer;
37
+ }
38
+ /** Tracks terminals belonging to a project */
39
+ export interface ProjectTerminals {
40
+ architect?: string;
41
+ builders: Map<string, string>;
42
+ shells: Map<string, string>;
43
+ fileTabs: Map<string, FileTab>;
44
+ }
45
+ /** SSE client connection for push notifications */
46
+ export interface SSEClient {
47
+ res: http.ServerResponse;
48
+ id: string;
49
+ }
50
+ /** Rate limiting entry for activation requests */
51
+ export interface RateLimitEntry {
52
+ count: number;
53
+ windowStart: number;
54
+ }
55
+ /** Terminal entry returned to tower UI */
56
+ export interface TerminalEntry {
57
+ type: 'architect' | 'builder' | 'shell' | 'file';
58
+ id: string;
59
+ label: string;
60
+ url: string;
61
+ active: boolean;
62
+ }
63
+ /** Instance status returned to tower UI */
64
+ export interface InstanceStatus {
65
+ projectPath: string;
66
+ projectName: string;
67
+ running: boolean;
68
+ proxyUrl: string;
69
+ architectUrl: string;
70
+ terminals: TerminalEntry[];
71
+ gateStatus?: GateStatus;
72
+ lastUsed?: string;
73
+ }
74
+ /** SQLite terminal session row shape */
75
+ export interface DbTerminalSession {
76
+ id: string;
77
+ project_path: string;
78
+ type: 'architect' | 'builder' | 'shell';
79
+ role_id: string | null;
80
+ pid: number | null;
81
+ shellper_socket: string | null;
82
+ shellper_pid: number | null;
83
+ shellper_start_time: number | null;
84
+ created_at: string;
85
+ }
86
+ //# sourceMappingURL=tower-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-types.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared types for tower server modules.
3
+ * Spec 0105: Tower Server Decomposition
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=tower-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tower-types.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/tower-types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}