@apralabs/apra-fleet 0.2.2

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 (482) hide show
  1. package/LICENSE +182 -0
  2. package/README.md +324 -0
  3. package/dist/cli/auth.d.ts +2 -0
  4. package/dist/cli/auth.d.ts.map +1 -0
  5. package/dist/cli/auth.js +210 -0
  6. package/dist/cli/auth.js.map +1 -0
  7. package/dist/cli/config.d.ts +30 -0
  8. package/dist/cli/config.d.ts.map +1 -0
  9. package/dist/cli/config.js +157 -0
  10. package/dist/cli/config.js.map +1 -0
  11. package/dist/cli/install.d.ts +37 -0
  12. package/dist/cli/install.d.ts.map +1 -0
  13. package/dist/cli/install.js +630 -0
  14. package/dist/cli/install.js.map +1 -0
  15. package/dist/cli/secret.d.ts +2 -0
  16. package/dist/cli/secret.d.ts.map +1 -0
  17. package/dist/cli/secret.js +366 -0
  18. package/dist/cli/secret.js.map +1 -0
  19. package/dist/cli/uninstall.d.ts +2 -0
  20. package/dist/cli/uninstall.d.ts.map +1 -0
  21. package/dist/cli/uninstall.js +312 -0
  22. package/dist/cli/uninstall.js.map +1 -0
  23. package/dist/cli/update.d.ts +2 -0
  24. package/dist/cli/update.d.ts.map +1 -0
  25. package/dist/cli/update.js +105 -0
  26. package/dist/cli/update.js.map +1 -0
  27. package/dist/delivery-mode.d.ts +19 -0
  28. package/dist/delivery-mode.d.ts.map +1 -0
  29. package/dist/delivery-mode.js +26 -0
  30. package/dist/delivery-mode.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +272 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/onboarding/text.d.ts +83 -0
  36. package/dist/onboarding/text.d.ts.map +1 -0
  37. package/dist/onboarding/text.js +126 -0
  38. package/dist/onboarding/text.js.map +1 -0
  39. package/dist/os/index.d.ts +9 -0
  40. package/dist/os/index.d.ts.map +1 -0
  41. package/dist/os/index.js +16 -0
  42. package/dist/os/index.js.map +1 -0
  43. package/dist/os/linux.d.ts +50 -0
  44. package/dist/os/linux.d.ts.map +1 -0
  45. package/dist/os/linux.js +244 -0
  46. package/dist/os/linux.js.map +1 -0
  47. package/dist/os/macos.d.ts +12 -0
  48. package/dist/os/macos.d.ts.map +1 -0
  49. package/dist/os/macos.js +41 -0
  50. package/dist/os/macos.js.map +1 -0
  51. package/dist/os/os-commands.d.ts +47 -0
  52. package/dist/os/os-commands.d.ts.map +1 -0
  53. package/dist/os/os-commands.js +3 -0
  54. package/dist/os/os-commands.js.map +1 -0
  55. package/dist/os/windows-wrapper.d.ts +6 -0
  56. package/dist/os/windows-wrapper.d.ts.map +1 -0
  57. package/dist/os/windows-wrapper.js +9 -0
  58. package/dist/os/windows-wrapper.js.map +1 -0
  59. package/dist/os/windows.d.ts +44 -0
  60. package/dist/os/windows.d.ts.map +1 -0
  61. package/dist/os/windows.js +269 -0
  62. package/dist/os/windows.js.map +1 -0
  63. package/dist/paths.d.ts +2 -0
  64. package/dist/paths.d.ts.map +1 -0
  65. package/dist/paths.js +4 -0
  66. package/dist/paths.js.map +1 -0
  67. package/dist/providers/agy.d.ts +41 -0
  68. package/dist/providers/agy.d.ts.map +1 -0
  69. package/dist/providers/agy.js +208 -0
  70. package/dist/providers/agy.js.map +1 -0
  71. package/dist/providers/claude.d.ts +40 -0
  72. package/dist/providers/claude.d.ts.map +1 -0
  73. package/dist/providers/claude.js +178 -0
  74. package/dist/providers/claude.js.map +1 -0
  75. package/dist/providers/codex.d.ts +44 -0
  76. package/dist/providers/codex.d.ts.map +1 -0
  77. package/dist/providers/codex.js +173 -0
  78. package/dist/providers/codex.js.map +1 -0
  79. package/dist/providers/copilot.d.ts +40 -0
  80. package/dist/providers/copilot.d.ts.map +1 -0
  81. package/dist/providers/copilot.js +172 -0
  82. package/dist/providers/copilot.js.map +1 -0
  83. package/dist/providers/gemini.d.ts +41 -0
  84. package/dist/providers/gemini.d.ts.map +1 -0
  85. package/dist/providers/gemini.js +192 -0
  86. package/dist/providers/gemini.js.map +1 -0
  87. package/dist/providers/index.d.ts +10 -0
  88. package/dist/providers/index.d.ts.map +1 -0
  89. package/dist/providers/index.js +27 -0
  90. package/dist/providers/index.js.map +1 -0
  91. package/dist/providers/provider.d.ts +85 -0
  92. package/dist/providers/provider.d.ts.map +1 -0
  93. package/dist/providers/provider.js +21 -0
  94. package/dist/providers/provider.js.map +1 -0
  95. package/dist/services/auth-socket.d.ts +87 -0
  96. package/dist/services/auth-socket.d.ts.map +1 -0
  97. package/dist/services/auth-socket.js +684 -0
  98. package/dist/services/auth-socket.js.map +1 -0
  99. package/dist/services/auth-web.d.ts +31 -0
  100. package/dist/services/auth-web.d.ts.map +1 -0
  101. package/dist/services/auth-web.js +202 -0
  102. package/dist/services/auth-web.js.map +1 -0
  103. package/dist/services/cloud/activity.d.ts +16 -0
  104. package/dist/services/cloud/activity.d.ts.map +1 -0
  105. package/dist/services/cloud/activity.js +61 -0
  106. package/dist/services/cloud/activity.js.map +1 -0
  107. package/dist/services/cloud/aws.d.ts +24 -0
  108. package/dist/services/cloud/aws.d.ts.map +1 -0
  109. package/dist/services/cloud/aws.js +114 -0
  110. package/dist/services/cloud/aws.js.map +1 -0
  111. package/dist/services/cloud/cost.d.ts +46 -0
  112. package/dist/services/cloud/cost.d.ts.map +1 -0
  113. package/dist/services/cloud/cost.js +161 -0
  114. package/dist/services/cloud/cost.js.map +1 -0
  115. package/dist/services/cloud/idle-manager.d.ts +20 -0
  116. package/dist/services/cloud/idle-manager.d.ts.map +1 -0
  117. package/dist/services/cloud/idle-manager.js +103 -0
  118. package/dist/services/cloud/idle-manager.js.map +1 -0
  119. package/dist/services/cloud/lifecycle.d.ts +14 -0
  120. package/dist/services/cloud/lifecycle.d.ts.map +1 -0
  121. package/dist/services/cloud/lifecycle.js +128 -0
  122. package/dist/services/cloud/lifecycle.js.map +1 -0
  123. package/dist/services/cloud/task-wrapper.d.ts +30 -0
  124. package/dist/services/cloud/task-wrapper.d.ts.map +1 -0
  125. package/dist/services/cloud/task-wrapper.js +116 -0
  126. package/dist/services/cloud/task-wrapper.js.map +1 -0
  127. package/dist/services/cloud/types.d.ts +26 -0
  128. package/dist/services/cloud/types.d.ts.map +1 -0
  129. package/dist/services/cloud/types.js +2 -0
  130. package/dist/services/cloud/types.js.map +1 -0
  131. package/dist/services/credential-cleanup.d.ts +4 -0
  132. package/dist/services/credential-cleanup.d.ts.map +1 -0
  133. package/dist/services/credential-cleanup.js +61 -0
  134. package/dist/services/credential-cleanup.js.map +1 -0
  135. package/dist/services/credential-store.d.ts +56 -0
  136. package/dist/services/credential-store.d.ts.map +1 -0
  137. package/dist/services/credential-store.js +280 -0
  138. package/dist/services/credential-store.js.map +1 -0
  139. package/dist/services/file-transfer.d.ts +22 -0
  140. package/dist/services/file-transfer.d.ts.map +1 -0
  141. package/dist/services/file-transfer.js +14 -0
  142. package/dist/services/file-transfer.js.map +1 -0
  143. package/dist/services/git-config.d.ts +6 -0
  144. package/dist/services/git-config.d.ts.map +1 -0
  145. package/dist/services/git-config.js +31 -0
  146. package/dist/services/git-config.js.map +1 -0
  147. package/dist/services/github-app.d.ts +30 -0
  148. package/dist/services/github-app.d.ts.map +1 -0
  149. package/dist/services/github-app.js +96 -0
  150. package/dist/services/github-app.js.map +1 -0
  151. package/dist/services/icons.d.ts +16 -0
  152. package/dist/services/icons.d.ts.map +1 -0
  153. package/dist/services/icons.js +67 -0
  154. package/dist/services/icons.js.map +1 -0
  155. package/dist/services/known-hosts.d.ts +23 -0
  156. package/dist/services/known-hosts.d.ts.map +1 -0
  157. package/dist/services/known-hosts.js +86 -0
  158. package/dist/services/known-hosts.js.map +1 -0
  159. package/dist/services/onboarding.d.ts +68 -0
  160. package/dist/services/onboarding.d.ts.map +1 -0
  161. package/dist/services/onboarding.js +205 -0
  162. package/dist/services/onboarding.js.map +1 -0
  163. package/dist/services/registry.d.ts +16 -0
  164. package/dist/services/registry.d.ts.map +1 -0
  165. package/dist/services/registry.js +156 -0
  166. package/dist/services/registry.js.map +1 -0
  167. package/dist/services/sftp.d.ts +16 -0
  168. package/dist/services/sftp.d.ts.map +1 -0
  169. package/dist/services/sftp.js +104 -0
  170. package/dist/services/sftp.js.map +1 -0
  171. package/dist/services/ssh.d.ts +29 -0
  172. package/dist/services/ssh.d.ts.map +1 -0
  173. package/dist/services/ssh.js +297 -0
  174. package/dist/services/ssh.js.map +1 -0
  175. package/dist/services/stall/find-log-file.d.ts +2 -0
  176. package/dist/services/stall/find-log-file.d.ts.map +1 -0
  177. package/dist/services/stall/find-log-file.js +153 -0
  178. package/dist/services/stall/find-log-file.js.map +1 -0
  179. package/dist/services/stall/index.d.ts +4 -0
  180. package/dist/services/stall/index.d.ts.map +1 -0
  181. package/dist/services/stall/index.js +4 -0
  182. package/dist/services/stall/index.js.map +1 -0
  183. package/dist/services/stall/log-path-resolver.d.ts +4 -0
  184. package/dist/services/stall/log-path-resolver.d.ts.map +1 -0
  185. package/dist/services/stall/log-path-resolver.js +32 -0
  186. package/dist/services/stall/log-path-resolver.js.map +1 -0
  187. package/dist/services/stall/log-path-resolver.test.d.ts +2 -0
  188. package/dist/services/stall/log-path-resolver.test.d.ts.map +1 -0
  189. package/dist/services/stall/log-path-resolver.test.js +76 -0
  190. package/dist/services/stall/log-path-resolver.test.js.map +1 -0
  191. package/dist/services/stall/read-log-tail.d.ts +6 -0
  192. package/dist/services/stall/read-log-tail.d.ts.map +1 -0
  193. package/dist/services/stall/read-log-tail.js +44 -0
  194. package/dist/services/stall/read-log-tail.js.map +1 -0
  195. package/dist/services/stall/stall-detector.d.ts +25 -0
  196. package/dist/services/stall/stall-detector.d.ts.map +1 -0
  197. package/dist/services/stall/stall-detector.js +153 -0
  198. package/dist/services/stall/stall-detector.js.map +1 -0
  199. package/dist/services/stall/stall-poller.d.ts +6 -0
  200. package/dist/services/stall/stall-poller.d.ts.map +1 -0
  201. package/dist/services/stall/stall-poller.js +75 -0
  202. package/dist/services/stall/stall-poller.js.map +1 -0
  203. package/dist/services/stall/time-utils.d.ts +4 -0
  204. package/dist/services/stall/time-utils.d.ts.map +1 -0
  205. package/dist/services/stall/time-utils.js +22 -0
  206. package/dist/services/stall/time-utils.js.map +1 -0
  207. package/dist/services/statusline.d.ts +10 -0
  208. package/dist/services/statusline.d.ts.map +1 -0
  209. package/dist/services/statusline.js +84 -0
  210. package/dist/services/statusline.js.map +1 -0
  211. package/dist/services/strategy.d.ts +16 -0
  212. package/dist/services/strategy.d.ts.map +1 -0
  213. package/dist/services/strategy.js +241 -0
  214. package/dist/services/strategy.js.map +1 -0
  215. package/dist/services/task-cleanup.d.ts +3 -0
  216. package/dist/services/task-cleanup.d.ts.map +1 -0
  217. package/dist/services/task-cleanup.js +81 -0
  218. package/dist/services/task-cleanup.js.map +1 -0
  219. package/dist/services/update-check.d.ts +15 -0
  220. package/dist/services/update-check.d.ts.map +1 -0
  221. package/dist/services/update-check.js +67 -0
  222. package/dist/services/update-check.js.map +1 -0
  223. package/dist/services/user-config.d.ts +12 -0
  224. package/dist/services/user-config.d.ts.map +1 -0
  225. package/dist/services/user-config.js +73 -0
  226. package/dist/services/user-config.js.map +1 -0
  227. package/dist/services/vcs/azure-devops.d.ts +7 -0
  228. package/dist/services/vcs/azure-devops.d.ts.map +1 -0
  229. package/dist/services/vcs/azure-devops.js +38 -0
  230. package/dist/services/vcs/azure-devops.js.map +1 -0
  231. package/dist/services/vcs/bitbucket.d.ts +6 -0
  232. package/dist/services/vcs/bitbucket.d.ts.map +1 -0
  233. package/dist/services/vcs/bitbucket.js +31 -0
  234. package/dist/services/vcs/bitbucket.js.map +1 -0
  235. package/dist/services/vcs/constants.d.ts +2 -0
  236. package/dist/services/vcs/constants.d.ts.map +1 -0
  237. package/dist/services/vcs/constants.js +6 -0
  238. package/dist/services/vcs/constants.js.map +1 -0
  239. package/dist/services/vcs/github.d.ts +6 -0
  240. package/dist/services/vcs/github.d.ts.map +1 -0
  241. package/dist/services/vcs/github.js +81 -0
  242. package/dist/services/vcs/github.js.map +1 -0
  243. package/dist/services/vcs/types.d.ts +52 -0
  244. package/dist/services/vcs/types.d.ts.map +1 -0
  245. package/dist/services/vcs/types.js +8 -0
  246. package/dist/services/vcs/types.js.map +1 -0
  247. package/dist/smoke-test.d.ts +10 -0
  248. package/dist/smoke-test.d.ts.map +1 -0
  249. package/dist/smoke-test.js +102 -0
  250. package/dist/smoke-test.js.map +1 -0
  251. package/dist/tools/check-status.d.ts +11 -0
  252. package/dist/tools/check-status.d.ts.map +1 -0
  253. package/dist/tools/check-status.js +247 -0
  254. package/dist/tools/check-status.js.map +1 -0
  255. package/dist/tools/cloud-control.d.ts +17 -0
  256. package/dist/tools/cloud-control.d.ts.map +1 -0
  257. package/dist/tools/cloud-control.js +102 -0
  258. package/dist/tools/cloud-control.js.map +1 -0
  259. package/dist/tools/compose-permissions.d.ts +26 -0
  260. package/dist/tools/compose-permissions.d.ts.map +1 -0
  261. package/dist/tools/compose-permissions.js +217 -0
  262. package/dist/tools/compose-permissions.js.map +1 -0
  263. package/dist/tools/credential-store-delete.d.ts +11 -0
  264. package/dist/tools/credential-store-delete.d.ts.map +1 -0
  265. package/dist/tools/credential-store-delete.js +15 -0
  266. package/dist/tools/credential-store-delete.js.map +1 -0
  267. package/dist/tools/credential-store-list.d.ts +4 -0
  268. package/dist/tools/credential-store-list.d.ts.map +1 -0
  269. package/dist/tools/credential-store-list.js +30 -0
  270. package/dist/tools/credential-store-list.js.map +1 -0
  271. package/dist/tools/credential-store-set.d.ts +26 -0
  272. package/dist/tools/credential-store-set.d.ts.map +1 -0
  273. package/dist/tools/credential-store-set.js +28 -0
  274. package/dist/tools/credential-store-set.js.map +1 -0
  275. package/dist/tools/credential-store-update.d.ts +20 -0
  276. package/dist/tools/credential-store-update.d.ts.map +1 -0
  277. package/dist/tools/credential-store-update.js +38 -0
  278. package/dist/tools/credential-store-update.js.map +1 -0
  279. package/dist/tools/execute-command.d.ts +33 -0
  280. package/dist/tools/execute-command.d.ts.map +1 -0
  281. package/dist/tools/execute-command.js +231 -0
  282. package/dist/tools/execute-command.js.map +1 -0
  283. package/dist/tools/execute-prompt.d.ts +36 -0
  284. package/dist/tools/execute-prompt.d.ts.map +1 -0
  285. package/dist/tools/execute-prompt.js +310 -0
  286. package/dist/tools/execute-prompt.js.map +1 -0
  287. package/dist/tools/list-members.d.ts +11 -0
  288. package/dist/tools/list-members.d.ts.map +1 -0
  289. package/dist/tools/list-members.js +108 -0
  290. package/dist/tools/list-members.js.map +1 -0
  291. package/dist/tools/member-detail.d.ts +17 -0
  292. package/dist/tools/member-detail.d.ts.map +1 -0
  293. package/dist/tools/member-detail.js +263 -0
  294. package/dist/tools/member-detail.js.map +1 -0
  295. package/dist/tools/monitor-task.d.ts +20 -0
  296. package/dist/tools/monitor-task.d.ts.map +1 -0
  297. package/dist/tools/monitor-task.js +89 -0
  298. package/dist/tools/monitor-task.js.map +1 -0
  299. package/dist/tools/provision-auth.d.ts +17 -0
  300. package/dist/tools/provision-auth.d.ts.map +1 -0
  301. package/dist/tools/provision-auth.js +256 -0
  302. package/dist/tools/provision-auth.js.map +1 -0
  303. package/dist/tools/provision-vcs-auth.d.ts +50 -0
  304. package/dist/tools/provision-vcs-auth.d.ts.map +1 -0
  305. package/dist/tools/provision-vcs-auth.js +187 -0
  306. package/dist/tools/provision-vcs-auth.js.map +1 -0
  307. package/dist/tools/receive-files.d.ts +20 -0
  308. package/dist/tools/receive-files.d.ts.map +1 -0
  309. package/dist/tools/receive-files.js +82 -0
  310. package/dist/tools/receive-files.js.map +1 -0
  311. package/dist/tools/register-member.d.ts +74 -0
  312. package/dist/tools/register-member.d.ts.map +1 -0
  313. package/dist/tools/register-member.js +310 -0
  314. package/dist/tools/register-member.js.map +1 -0
  315. package/dist/tools/remove-member.d.ts +17 -0
  316. package/dist/tools/remove-member.d.ts.map +1 -0
  317. package/dist/tools/remove-member.js +126 -0
  318. package/dist/tools/remove-member.js.map +1 -0
  319. package/dist/tools/revoke-vcs-auth.d.ts +23 -0
  320. package/dist/tools/revoke-vcs-auth.d.ts.map +1 -0
  321. package/dist/tools/revoke-vcs-auth.js +55 -0
  322. package/dist/tools/revoke-vcs-auth.js.map +1 -0
  323. package/dist/tools/send-files.d.ts +20 -0
  324. package/dist/tools/send-files.d.ts.map +1 -0
  325. package/dist/tools/send-files.js +103 -0
  326. package/dist/tools/send-files.js.map +1 -0
  327. package/dist/tools/setup-git-app.d.ts +17 -0
  328. package/dist/tools/setup-git-app.d.ts.map +1 -0
  329. package/dist/tools/setup-git-app.js +89 -0
  330. package/dist/tools/setup-git-app.js.map +1 -0
  331. package/dist/tools/setup-ssh-key.d.ts +14 -0
  332. package/dist/tools/setup-ssh-key.d.ts.map +1 -0
  333. package/dist/tools/setup-ssh-key.js +119 -0
  334. package/dist/tools/setup-ssh-key.js.map +1 -0
  335. package/dist/tools/shutdown-server.d.ts +4 -0
  336. package/dist/tools/shutdown-server.d.ts.map +1 -0
  337. package/dist/tools/shutdown-server.js +9 -0
  338. package/dist/tools/shutdown-server.js.map +1 -0
  339. package/dist/tools/stop-prompt.d.ts +14 -0
  340. package/dist/tools/stop-prompt.d.ts.map +1 -0
  341. package/dist/tools/stop-prompt.js +44 -0
  342. package/dist/tools/stop-prompt.js.map +1 -0
  343. package/dist/tools/update-agent-cli.d.ts +17 -0
  344. package/dist/tools/update-agent-cli.d.ts.map +1 -0
  345. package/dist/tools/update-agent-cli.js +110 -0
  346. package/dist/tools/update-agent-cli.js.map +1 -0
  347. package/dist/tools/update-member.d.ts +77 -0
  348. package/dist/tools/update-member.d.ts.map +1 -0
  349. package/dist/tools/update-member.js +202 -0
  350. package/dist/tools/update-member.js.map +1 -0
  351. package/dist/tools/version.d.ts +4 -0
  352. package/dist/tools/version.d.ts.map +1 -0
  353. package/dist/tools/version.js +7 -0
  354. package/dist/tools/version.js.map +1 -0
  355. package/dist/types.d.ts +70 -0
  356. package/dist/types.d.ts.map +1 -0
  357. package/dist/types.js +2 -0
  358. package/dist/types.js.map +1 -0
  359. package/dist/utils/agent-helpers.d.ts +41 -0
  360. package/dist/utils/agent-helpers.d.ts.map +1 -0
  361. package/dist/utils/agent-helpers.js +84 -0
  362. package/dist/utils/agent-helpers.js.map +1 -0
  363. package/dist/utils/ansi.d.ts +6 -0
  364. package/dist/utils/ansi.d.ts.map +1 -0
  365. package/dist/utils/ansi.js +20 -0
  366. package/dist/utils/ansi.js.map +1 -0
  367. package/dist/utils/auth-env.d.ts +8 -0
  368. package/dist/utils/auth-env.d.ts.map +1 -0
  369. package/dist/utils/auth-env.js +30 -0
  370. package/dist/utils/auth-env.js.map +1 -0
  371. package/dist/utils/collect-secret.d.ts +2 -0
  372. package/dist/utils/collect-secret.d.ts.map +1 -0
  373. package/dist/utils/collect-secret.js +80 -0
  374. package/dist/utils/collect-secret.js.map +1 -0
  375. package/dist/utils/credential-validation.d.ts +13 -0
  376. package/dist/utils/credential-validation.d.ts.map +1 -0
  377. package/dist/utils/credential-validation.js +35 -0
  378. package/dist/utils/credential-validation.js.map +1 -0
  379. package/dist/utils/crypto.d.ts +3 -0
  380. package/dist/utils/crypto.d.ts.map +1 -0
  381. package/dist/utils/crypto.js +61 -0
  382. package/dist/utils/crypto.js.map +1 -0
  383. package/dist/utils/deep-merge.d.ts +3 -0
  384. package/dist/utils/deep-merge.d.ts.map +1 -0
  385. package/dist/utils/deep-merge.js +23 -0
  386. package/dist/utils/deep-merge.js.map +1 -0
  387. package/dist/utils/file-permissions.d.ts +8 -0
  388. package/dist/utils/file-permissions.d.ts.map +1 -0
  389. package/dist/utils/file-permissions.js +13 -0
  390. package/dist/utils/file-permissions.js.map +1 -0
  391. package/dist/utils/gpu-parser.d.ts +6 -0
  392. package/dist/utils/gpu-parser.d.ts.map +1 -0
  393. package/dist/utils/gpu-parser.js +15 -0
  394. package/dist/utils/gpu-parser.js.map +1 -0
  395. package/dist/utils/log-helpers.d.ts +29 -0
  396. package/dist/utils/log-helpers.d.ts.map +1 -0
  397. package/dist/utils/log-helpers.js +128 -0
  398. package/dist/utils/log-helpers.js.map +1 -0
  399. package/dist/utils/oob-timeout.d.ts +2 -0
  400. package/dist/utils/oob-timeout.d.ts.map +1 -0
  401. package/dist/utils/oob-timeout.js +2 -0
  402. package/dist/utils/oob-timeout.js.map +1 -0
  403. package/dist/utils/pid-helpers.d.ts +11 -0
  404. package/dist/utils/pid-helpers.d.ts.map +1 -0
  405. package/dist/utils/pid-helpers.js +21 -0
  406. package/dist/utils/pid-helpers.js.map +1 -0
  407. package/dist/utils/platform.d.ts +13 -0
  408. package/dist/utils/platform.d.ts.map +1 -0
  409. package/dist/utils/platform.js +60 -0
  410. package/dist/utils/platform.js.map +1 -0
  411. package/dist/utils/prompt-errors.d.ts +5 -0
  412. package/dist/utils/prompt-errors.d.ts.map +1 -0
  413. package/dist/utils/prompt-errors.js +15 -0
  414. package/dist/utils/prompt-errors.js.map +1 -0
  415. package/dist/utils/resolve-member.d.ts +18 -0
  416. package/dist/utils/resolve-member.d.ts.map +1 -0
  417. package/dist/utils/resolve-member.js +23 -0
  418. package/dist/utils/resolve-member.js.map +1 -0
  419. package/dist/utils/secure-input.d.ts +6 -0
  420. package/dist/utils/secure-input.d.ts.map +1 -0
  421. package/dist/utils/secure-input.js +60 -0
  422. package/dist/utils/secure-input.js.map +1 -0
  423. package/dist/utils/shell-escape.d.ts +43 -0
  424. package/dist/utils/shell-escape.d.ts.map +1 -0
  425. package/dist/utils/shell-escape.js +67 -0
  426. package/dist/utils/shell-escape.js.map +1 -0
  427. package/dist/utils/ssh-error-messages.d.ts +5 -0
  428. package/dist/utils/ssh-error-messages.d.ts.map +1 -0
  429. package/dist/utils/ssh-error-messages.js +20 -0
  430. package/dist/utils/ssh-error-messages.js.map +1 -0
  431. package/dist/version.d.ts +18 -0
  432. package/dist/version.d.ts.map +1 -0
  433. package/dist/version.js +101 -0
  434. package/dist/version.js.map +1 -0
  435. package/hooks/hooks-config.json +15 -0
  436. package/hooks/post-register-member.sh +10 -0
  437. package/package.json +82 -0
  438. package/scripts/agy-settings-merge.js +27 -0
  439. package/scripts/agy-transcript-reader.js +62 -0
  440. package/scripts/fleet-statusline.sh +43 -0
  441. package/skills/fleet/SKILL.md +262 -0
  442. package/skills/fleet/auth-azdevops.md +72 -0
  443. package/skills/fleet/auth-bitbucket.md +65 -0
  444. package/skills/fleet/auth-github.md +86 -0
  445. package/skills/fleet/beads.md +90 -0
  446. package/skills/fleet/onboarding.md +92 -0
  447. package/skills/fleet/permissions.md +23 -0
  448. package/skills/fleet/profiles/base-dev.json +18 -0
  449. package/skills/fleet/profiles/base-reviewer.json +14 -0
  450. package/skills/fleet/profiles/cpp.json +4 -0
  451. package/skills/fleet/profiles/dotnet.json +4 -0
  452. package/skills/fleet/profiles/go.json +4 -0
  453. package/skills/fleet/profiles/jvm.json +4 -0
  454. package/skills/fleet/profiles/node.json +4 -0
  455. package/skills/fleet/profiles/python.json +4 -0
  456. package/skills/fleet/profiles/rust.json +4 -0
  457. package/skills/fleet/profiles/tpl-permissions.json +5 -0
  458. package/skills/fleet/skill-matrix.md +34 -0
  459. package/skills/fleet/troubleshooting.md +13 -0
  460. package/skills/pm/SKILL.md +110 -0
  461. package/skills/pm/backlog-item.md +65 -0
  462. package/skills/pm/beads.md +192 -0
  463. package/skills/pm/cleanup.md +15 -0
  464. package/skills/pm/context-file.md +40 -0
  465. package/skills/pm/doer-reviewer.md +123 -0
  466. package/skills/pm/init.md +25 -0
  467. package/skills/pm/multi-pair-sprint.md +64 -0
  468. package/skills/pm/plan-prompt.md +94 -0
  469. package/skills/pm/simple-sprint.md +42 -0
  470. package/skills/pm/single-pair-sprint.md +178 -0
  471. package/skills/pm/tpl-deploy.md +24 -0
  472. package/skills/pm/tpl-design.md +29 -0
  473. package/skills/pm/tpl-doer.md +43 -0
  474. package/skills/pm/tpl-plan.md +72 -0
  475. package/skills/pm/tpl-pm.md +2 -0
  476. package/skills/pm/tpl-progress.json +28 -0
  477. package/skills/pm/tpl-projects.md +4 -0
  478. package/skills/pm/tpl-requirements.md +21 -0
  479. package/skills/pm/tpl-reviewer-plan.md +53 -0
  480. package/skills/pm/tpl-reviewer.md +72 -0
  481. package/skills/pm/tpl-status.md +29 -0
  482. package/version.json +3 -0
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Cost estimation for common AWS instance types (us-east-1 on-demand pricing).
3
+ * These are approximate rates — see AWS pricing pages for exact figures.
4
+ */
5
+ /** Warn if estimated session cost exceeds this amount in dollars */
6
+ export const COST_WARNING_THRESHOLD = 10;
7
+ /** Warn if hourly rate exceeds this amount in dollars */
8
+ export const RATE_WARNING_THRESHOLD = 5;
9
+ /** Flag sessions running longer than this many hours (may indicate idle detection anomaly) */
10
+ export const UPTIME_WARNING_THRESHOLD_HRS = 12;
11
+ const HOURLY_RATES = {
12
+ // GPU instances — G4dn family (NVIDIA T4)
13
+ 'g4dn.xlarge': 0.526,
14
+ 'g4dn.2xlarge': 0.752,
15
+ 'g4dn.4xlarge': 1.204,
16
+ 'g4dn.8xlarge': 2.264,
17
+ 'g4dn.12xlarge': 3.912,
18
+ 'g4dn.16xlarge': 4.528,
19
+ 'g4dn.metal': 7.824,
20
+ // GPU instances — G5 family (NVIDIA A10G)
21
+ 'g5.xlarge': 1.006,
22
+ 'g5.2xlarge': 1.212,
23
+ 'g5.4xlarge': 1.624,
24
+ 'g5.8xlarge': 2.448,
25
+ 'g5.12xlarge': 5.672,
26
+ 'g5.16xlarge': 4.096,
27
+ 'g5.24xlarge': 8.144,
28
+ 'g5.48xlarge': 16.288,
29
+ // GPU instances — P3 family (NVIDIA V100)
30
+ 'p3.2xlarge': 3.06,
31
+ 'p3.8xlarge': 12.24,
32
+ 'p3.16xlarge': 24.48,
33
+ // GPU instances — P4d family (NVIDIA A100)
34
+ 'p4d.24xlarge': 32.77,
35
+ // General purpose — T3 family
36
+ 't3.nano': 0.0052,
37
+ 't3.micro': 0.0104,
38
+ 't3.small': 0.0208,
39
+ 't3.medium': 0.0416,
40
+ 't3.large': 0.0832,
41
+ 't3.xlarge': 0.1664,
42
+ 't3.2xlarge': 0.3328,
43
+ // General purpose — M5 family
44
+ 'm5.large': 0.096,
45
+ 'm5.xlarge': 0.192,
46
+ 'm5.2xlarge': 0.384,
47
+ 'm5.4xlarge': 0.768,
48
+ 'm5.8xlarge': 1.536,
49
+ 'm5.12xlarge': 2.304,
50
+ 'm5.16xlarge': 3.072,
51
+ 'm5.24xlarge': 4.608,
52
+ // Compute optimized — C5 family
53
+ 'c5.large': 0.085,
54
+ 'c5.xlarge': 0.170,
55
+ 'c5.2xlarge': 0.340,
56
+ 'c5.4xlarge': 0.680,
57
+ 'c5.9xlarge': 1.530,
58
+ 'c5.12xlarge': 2.040,
59
+ 'c5.18xlarge': 3.060,
60
+ 'c5.24xlarge': 4.080,
61
+ };
62
+ /**
63
+ * Returns true if the instance type is in the pricing table.
64
+ */
65
+ export function isKnownInstanceType(type) {
66
+ return Object.prototype.hasOwnProperty.call(HOURLY_RATES, type);
67
+ }
68
+ /**
69
+ * Returns a cost/rate warning string if thresholds are exceeded, or null if all is well.
70
+ * - Unknown instance type → warning
71
+ * - Hourly rate > RATE_WARNING_THRESHOLD → rate warning
72
+ * - Estimated session cost > COST_WARNING_THRESHOLD → cost warning
73
+ */
74
+ export function costWarning(instanceType, uptimeHours) {
75
+ if (!instanceType)
76
+ return null;
77
+ if (!isKnownInstanceType(instanceType)) {
78
+ return `Unknown pricing for instance type '${instanceType}'`;
79
+ }
80
+ const rate = HOURLY_RATES[instanceType];
81
+ if (rate > RATE_WARNING_THRESHOLD) {
82
+ return `Expensive instance: $${rate.toFixed(2)}/hr`;
83
+ }
84
+ const cost = rate * uptimeHours;
85
+ if (cost > COST_WARNING_THRESHOLD) {
86
+ return `High cost: $${cost.toFixed(2)} this session`;
87
+ }
88
+ return null;
89
+ }
90
+ /**
91
+ * Returns an uptime anomaly warning if the session is suspiciously long, or null.
92
+ * Long sessions may indicate idle detection is not working correctly.
93
+ */
94
+ export function uptimeWarning(uptimeHours) {
95
+ if (uptimeHours > UPTIME_WARNING_THRESHOLD_HRS) {
96
+ const h = Math.round(uptimeHours);
97
+ return `Long session: ${h}h — verify idle detection is working correctly`;
98
+ }
99
+ return null;
100
+ }
101
+ /**
102
+ * Returns estimated hourly cost as a formatted string (e.g. "$2.42"),
103
+ * or "?" if the instance type is not in the lookup table.
104
+ */
105
+ export function estimateCost(instanceType, uptimeHours) {
106
+ if (!instanceType)
107
+ return '?';
108
+ const rate = HOURLY_RATES[instanceType];
109
+ if (rate === undefined)
110
+ return '?';
111
+ const total = rate * uptimeHours;
112
+ return '$' + total.toFixed(2);
113
+ }
114
+ /**
115
+ * Returns hourly rate string (e.g. "$0.526/hr"), or "?" if unknown.
116
+ */
117
+ export function hourlyRate(instanceType) {
118
+ if (!instanceType)
119
+ return '?';
120
+ const rate = HOURLY_RATES[instanceType];
121
+ if (rate === undefined)
122
+ return '?';
123
+ return '$' + rate.toFixed(3) + '/hr';
124
+ }
125
+ /**
126
+ * Formats uptime in hours as a human-readable duration string.
127
+ * Examples: "45m", "2h 30m", "1d 3h"
128
+ */
129
+ export function formatUptimeDuration(hours) {
130
+ if (hours < 0)
131
+ return '0m';
132
+ const totalMinutes = Math.round(hours * 60);
133
+ const days = Math.floor(totalMinutes / (60 * 24));
134
+ const remainingAfterDays = totalMinutes % (60 * 24);
135
+ const hrs = Math.floor(remainingAfterDays / 60);
136
+ const mins = remainingAfterDays % 60;
137
+ const parts = [];
138
+ if (days > 0)
139
+ parts.push(`${days}d`);
140
+ if (hrs > 0)
141
+ parts.push(`${hrs}h`);
142
+ if (mins > 0 || parts.length === 0)
143
+ parts.push(`${mins}m`);
144
+ return parts.join(' ');
145
+ }
146
+ /**
147
+ * Calculate uptime hours from an ISO launch time string.
148
+ * Returns 0 if launchTime is missing or unparseable.
149
+ */
150
+ export function uptimeHoursFromLaunch(launchTime) {
151
+ if (!launchTime)
152
+ return 0;
153
+ try {
154
+ const launched = new Date(launchTime).getTime();
155
+ return (Date.now() - launched) / 3_600_000;
156
+ }
157
+ catch {
158
+ return 0;
159
+ }
160
+ }
161
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../../src/services/cloud/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare class IdleManager {
2
+ private interval;
3
+ private stopping;
4
+ private lastActivity;
5
+ private idleTimeoutMs;
6
+ /**
7
+ * Start the idle manager. Idempotent — safe to call multiple times.
8
+ * @param idleTimeoutMs Global fallback idle timeout (ms). Per-agent timeout takes priority if set.
9
+ */
10
+ start(idleTimeoutMs?: number): void;
11
+ /** Stop the idle manager and clear the interval. */
12
+ stop(): void;
13
+ /** Reset the idle timer for a member. Called on every tool invocation via touchAgent. */
14
+ resetTimer(agentId: string): void;
15
+ /** Run one idle check cycle immediately (exposed for testing). */
16
+ checkOnce(): Promise<void>;
17
+ private check;
18
+ }
19
+ export declare const idleManager: IdleManager;
20
+ //# sourceMappingURL=idle-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cloud/idle-manager.ts"],"names":[],"mappings":"AAYA,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAA2B;IAEhD;;;OAGG;IACH,KAAK,CAAC,aAAa,SAA0B,GAAG,IAAI;IAmBpD,oDAAoD;IACpD,IAAI,IAAI,IAAI;IAOZ,yFAAyF;IACzF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,kEAAkE;IAC5D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;YAIlB,KAAK;CAmDpB;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { getAllAgents } from '../registry.js';
2
+ import { awsProvider } from './aws.js';
3
+ import { checkMemberActivity } from './activity.js';
4
+ import { setIdleTouchHook } from '../../utils/agent-helpers.js';
5
+ const IDLE_CHECK_INTERVAL_MS = 60_000;
6
+ const DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
7
+ function log(msg) {
8
+ process.stderr.write('[idle-manager] ' + msg + '\n');
9
+ }
10
+ export class IdleManager {
11
+ interval = null;
12
+ stopping = new Set();
13
+ lastActivity = new Map();
14
+ idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS;
15
+ /**
16
+ * Start the idle manager. Idempotent — safe to call multiple times.
17
+ * @param idleTimeoutMs Global fallback idle timeout (ms). Per-agent timeout takes priority if set.
18
+ */
19
+ start(idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS) {
20
+ if (this.interval)
21
+ return; // already running
22
+ this.idleTimeoutMs = idleTimeoutMs;
23
+ // R-9: pre-populate lastActivity from persisted lastUsed so we survive server restarts.
24
+ for (const agent of getAllAgents()) {
25
+ if (agent.cloud && agent.lastUsed) {
26
+ this.lastActivity.set(agent.id, new Date(agent.lastUsed).getTime());
27
+ }
28
+ }
29
+ // Wire into touchAgent so tool calls reset the idle timer.
30
+ setIdleTouchHook(id => this.resetTimer(id));
31
+ this.interval = setInterval(() => void this.check(), IDLE_CHECK_INTERVAL_MS);
32
+ this.interval.unref(); // don't prevent process exit
33
+ log('started (idle timeout: ' + (idleTimeoutMs / 60000) + 'min)');
34
+ }
35
+ /** Stop the idle manager and clear the interval. */
36
+ stop() {
37
+ if (this.interval) {
38
+ clearInterval(this.interval);
39
+ this.interval = null;
40
+ }
41
+ }
42
+ /** Reset the idle timer for a member. Called on every tool invocation via touchAgent. */
43
+ resetTimer(agentId) {
44
+ this.lastActivity.set(agentId, Date.now());
45
+ }
46
+ /** Run one idle check cycle immediately (exposed for testing). */
47
+ async checkOnce() {
48
+ return this.check();
49
+ }
50
+ async check() {
51
+ const cloudAgents = getAllAgents().filter(a => a.cloud);
52
+ for (const agent of cloudAgents) {
53
+ // Mutex: skip if a stop is already in progress for this instance
54
+ if (this.stopping.has(agent.id))
55
+ continue;
56
+ // Determine effective idle timeout: per-agent setting takes priority over global
57
+ const perAgentMs = agent.cloud.idleTimeoutMin
58
+ ? agent.cloud.idleTimeoutMin * 60_000
59
+ : 0;
60
+ const effectiveTimeoutMs = perAgentMs > 0 ? perAgentMs : this.idleTimeoutMs;
61
+ // Check idle time
62
+ const lastActive = this.lastActivity.get(agent.id)
63
+ ?? (agent.lastUsed ? new Date(agent.lastUsed).getTime() : 0);
64
+ const idleMs = Date.now() - lastActive;
65
+ if (idleMs < effectiveTimeoutMs)
66
+ continue;
67
+ // Only stop running instances
68
+ let state;
69
+ try {
70
+ state = await awsProvider.getInstanceState(agent.cloud);
71
+ }
72
+ catch (e) {
73
+ log('cannot get state for ' + agent.friendlyName + ': ' + e.message);
74
+ continue;
75
+ }
76
+ if (state !== 'running')
77
+ continue;
78
+ // Check for active work before stopping (safe default: unknown → don't stop)
79
+ const activity = await checkMemberActivity(agent);
80
+ if (activity !== 'idle') {
81
+ log(agent.friendlyName + ' is ' + activity + ' — deferring idle stop');
82
+ this.lastActivity.set(agent.id, Date.now()); // bump to avoid re-checking every cycle
83
+ continue;
84
+ }
85
+ // Stop the instance
86
+ this.stopping.add(agent.id);
87
+ const mins = Math.round(idleMs / 60000);
88
+ log('stopping ' + agent.friendlyName + ' (idle ' + mins + 'min)');
89
+ try {
90
+ await awsProvider.stopInstance(agent.cloud);
91
+ log('stopped ' + agent.friendlyName);
92
+ }
93
+ catch (e) {
94
+ log('failed to stop ' + agent.friendlyName + ': ' + e.message);
95
+ }
96
+ finally {
97
+ this.stopping.delete(agent.id);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ export const idleManager = new IdleManager();
103
+ //# sourceMappingURL=idle-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-manager.js","sourceRoot":"","sources":["../../../src/services/cloud/idle-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Agent } from '../../types.js';
2
+ /**
3
+ * Ensures a cloud member's instance is running and SSH-ready before a tool
4
+ * call proceeds. Returns the (possibly updated) agent from the registry.
5
+ *
6
+ * Non-cloud members are returned unchanged immediately.
7
+ * Running: verify IP is current; update registry if changed.
8
+ * Stopped: start instance, wait for running, update IP, poll SSH, re-provision auth (F5).
9
+ * Stopping: wait for stopped, then treat as stopped.
10
+ * Pending: wait for running, then update IP, poll SSH, re-provision auth.
11
+ * Terminated/shutting-down: throw — instance cannot be used.
12
+ */
13
+ export declare function ensureCloudReady(agent: Agent): Promise<Agent>;
14
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/services/cloud/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAmE5C;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CA0DnE"}
@@ -0,0 +1,128 @@
1
+ import net from 'node:net';
2
+ import { getAgent, updateAgent } from '../registry.js';
3
+ import { awsProvider } from './aws.js';
4
+ import { provisionAuth } from '../../tools/provision-auth.js';
5
+ import { provisionVcsAuth } from '../../tools/provision-vcs-auth.js';
6
+ const SSH_POLL_ATTEMPTS = 30;
7
+ const SSH_POLL_DELAY_MS = 2000;
8
+ function log(msg) {
9
+ process.stderr.write('[cloud] ' + msg + '\n');
10
+ }
11
+ async function waitForSsh(host, port) {
12
+ for (let i = 0; i < SSH_POLL_ATTEMPTS; i++) {
13
+ const reachable = await new Promise((resolve) => {
14
+ const socket = net.createConnection({ host, port, timeout: 2000 });
15
+ socket.on('connect', () => { socket.destroy(); resolve(true); });
16
+ socket.on('error', () => { socket.destroy(); resolve(false); });
17
+ socket.on('timeout', () => { socket.destroy(); resolve(false); });
18
+ });
19
+ if (reachable)
20
+ return;
21
+ if (i < SSH_POLL_ATTEMPTS - 1) {
22
+ await new Promise(r => setTimeout(r, SSH_POLL_DELAY_MS));
23
+ }
24
+ }
25
+ throw new Error('SSH not ready on ' + host + ':' + port +
26
+ ' after ' + SSH_POLL_ATTEMPTS + ' attempts (' +
27
+ (SSH_POLL_ATTEMPTS * SSH_POLL_DELAY_MS / 1000) + 's)');
28
+ }
29
+ async function reProvisionAuth(agent) {
30
+ // F5: Re-provision Claude OAuth credentials from PM machine (best-effort)
31
+ try {
32
+ const result = await provisionAuth({ member_id: agent.id });
33
+ if (!result.startsWith('\u2705')) {
34
+ log('provision_llm_auth warning for ' + agent.friendlyName + ': ' + result.split('\n')[0]);
35
+ }
36
+ }
37
+ catch (e) {
38
+ // Truncate error message to prevent accidental credential leakage in log output
39
+ const msg = e.message.slice(0, 50);
40
+ log('provision_llm_auth failed for ' + agent.friendlyName + ': ' + msg);
41
+ }
42
+ // F5: Re-mint GitHub App tokens if agent has git repos configured (best-effort)
43
+ if (agent.gitAccess && agent.gitRepos && agent.gitRepos.length > 0) {
44
+ try {
45
+ const result = await provisionVcsAuth({
46
+ member_id: agent.id,
47
+ provider: 'github',
48
+ github_mode: 'github-app',
49
+ git_access: agent.gitAccess,
50
+ repos: agent.gitRepos,
51
+ });
52
+ if (!result.startsWith('\u2705')) {
53
+ log('provision_vcs_auth warning for ' + agent.friendlyName + ': ' + result.split('\n')[0]);
54
+ }
55
+ }
56
+ catch (e) {
57
+ // Truncate error message to prevent accidental credential leakage in log output
58
+ const msg = e.message.slice(0, 50);
59
+ log('provision_vcs_auth failed for ' + agent.friendlyName + ': ' + msg);
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Ensures a cloud member's instance is running and SSH-ready before a tool
65
+ * call proceeds. Returns the (possibly updated) agent from the registry.
66
+ *
67
+ * Non-cloud members are returned unchanged immediately.
68
+ * Running: verify IP is current; update registry if changed.
69
+ * Stopped: start instance, wait for running, update IP, poll SSH, re-provision auth (F5).
70
+ * Stopping: wait for stopped, then treat as stopped.
71
+ * Pending: wait for running, then update IP, poll SSH, re-provision auth.
72
+ * Terminated/shutting-down: throw — instance cannot be used.
73
+ */
74
+ export async function ensureCloudReady(agent) {
75
+ if (!agent.cloud)
76
+ return agent;
77
+ const config = agent.cloud;
78
+ const state = await awsProvider.getInstanceState(config);
79
+ if (state === 'terminated' || state === 'shutting-down') {
80
+ throw new Error('EC2 instance ' + config.instanceId + ' is ' + state + ' and cannot be used.');
81
+ }
82
+ if (state === 'running') {
83
+ // Already running — verify IP and return
84
+ try {
85
+ const currentIp = await awsProvider.getPublicIp(config);
86
+ if (currentIp !== agent.host) {
87
+ log('IP updated for ' + agent.friendlyName + ': ' + agent.host + ' -> ' + currentIp);
88
+ updateAgent(agent.id, { host: currentIp });
89
+ }
90
+ }
91
+ catch {
92
+ // Cannot get IP — SSH to existing host may still work
93
+ }
94
+ return getAgent(agent.id) ?? agent;
95
+ }
96
+ // Instance is not running — bring it up
97
+ if (state === 'stopping') {
98
+ log(agent.friendlyName + ' is stopping — waiting before start');
99
+ await awsProvider.waitForStopped(config);
100
+ log('Starting ' + agent.friendlyName + ' (' + config.instanceId + ')');
101
+ await awsProvider.startInstance(config);
102
+ await awsProvider.waitForRunning(config);
103
+ }
104
+ else if (state === 'pending') {
105
+ log(agent.friendlyName + ' is pending — waiting for running');
106
+ await awsProvider.waitForRunning(config);
107
+ }
108
+ else {
109
+ // stopped
110
+ log('Starting ' + agent.friendlyName + ' (' + config.instanceId + ')');
111
+ await awsProvider.startInstance(config);
112
+ await awsProvider.waitForRunning(config);
113
+ }
114
+ // Get fresh IP after start
115
+ const newIp = await awsProvider.getPublicIp(config);
116
+ log(agent.friendlyName + ' running at ' + newIp);
117
+ // Update registry: new IP + reset idle timer (wiring point for T7)
118
+ updateAgent(agent.id, { host: newIp, lastUsed: new Date().toISOString() });
119
+ // Poll SSH readiness
120
+ const sshPort = agent.port ?? 22;
121
+ log('Waiting for SSH on ' + newIp + ':' + sshPort);
122
+ await waitForSsh(newIp, sshPort);
123
+ log('SSH ready — ' + agent.friendlyName + ' is live');
124
+ // F5: Re-provision auth after fresh start
125
+ await reProvisionAuth(getAgent(agent.id) ?? agent);
126
+ return getAgent(agent.id) ?? agent;
127
+ }
128
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/services/cloud/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Task wrapper script generator for long-running background commands.
3
+ *
4
+ * Features:
5
+ * F1: restart_command used on retry runs (e.g. checkpoint resume)
6
+ * F3: background activity loop touches ~/.fleet-tasks/<taskId>/activity every
7
+ * activityIntervalSec while the main PID is alive — keeps idle manager from
8
+ * stopping the instance during active work.
9
+ */
10
+ export interface TaskConfig {
11
+ taskId: string;
12
+ command: string;
13
+ restartCommand?: string;
14
+ maxRetries: number;
15
+ activityIntervalSec: number;
16
+ }
17
+ /**
18
+ * Generate a self-contained bash wrapper script for a long-running task.
19
+ * Commands are base64-encoded to avoid shell escaping issues.
20
+ *
21
+ * The script:
22
+ * 1. Creates ~/.fleet-tasks/<taskId>/ directory
23
+ * 2. Writes PID to task.pid
24
+ * 3. Writes JSON status to status.json
25
+ * 4. Background loop: touches activity file every activityIntervalSec while PID alive (F3)
26
+ * 5. Runs command; on non-zero exit retries up to maxRetries using restartCommand (F1)
27
+ * 6. On success or max retries: updates status.json, removes task.pid
28
+ */
29
+ export declare function generateTaskWrapper(config: TaskConfig): string;
30
+ //# sourceMappingURL=task-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-wrapper.d.ts","sourceRoot":"","sources":["../../../src/services/cloud/task-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA+F9D"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Task wrapper script generator for long-running background commands.
3
+ *
4
+ * Features:
5
+ * F1: restart_command used on retry runs (e.g. checkpoint resume)
6
+ * F3: background activity loop touches ~/.fleet-tasks/<taskId>/activity every
7
+ * activityIntervalSec while the main PID is alive — keeps idle manager from
8
+ * stopping the instance during active work.
9
+ */
10
+ /**
11
+ * Generate a self-contained bash wrapper script for a long-running task.
12
+ * Commands are base64-encoded to avoid shell escaping issues.
13
+ *
14
+ * The script:
15
+ * 1. Creates ~/.fleet-tasks/<taskId>/ directory
16
+ * 2. Writes PID to task.pid
17
+ * 3. Writes JSON status to status.json
18
+ * 4. Background loop: touches activity file every activityIntervalSec while PID alive (F3)
19
+ * 5. Runs command; on non-zero exit retries up to maxRetries using restartCommand (F1)
20
+ * 6. On success or max retries: updates status.json, removes task.pid
21
+ */
22
+ export function generateTaskWrapper(config) {
23
+ const cmdB64 = Buffer.from(config.command).toString('base64');
24
+ const restartB64 = Buffer.from(config.restartCommand ?? config.command).toString('base64');
25
+ const taskDir = `~/.fleet-tasks/${config.taskId}`;
26
+ // We build the bash script as an array of lines then join, using
27
+ // plain string concatenation for shell $VAR references to avoid
28
+ // TypeScript template-literal interpolation of ${...}.
29
+ const D = '$'; // single $ — used for bash variable references
30
+ const lines = [
31
+ '#!/usr/bin/env bash',
32
+ 'set -euo pipefail',
33
+ '',
34
+ 'TASK_ID="' + config.taskId + '"',
35
+ 'TASK_DIR="' + taskDir + '"',
36
+ 'MAX_RETRIES=' + config.maxRetries,
37
+ 'ACTIVITY_INTERVAL=' + config.activityIntervalSec,
38
+ '',
39
+ 'mkdir -p "' + D + 'TASK_DIR"',
40
+ '',
41
+ '# Decode commands from base64 to avoid shell escaping issues',
42
+ 'MAIN_CMD=$(printf \'%s\' \'' + cmdB64 + '\' | base64 -d)',
43
+ 'RESTART_CMD=$(printf \'%s\' \'' + restartB64 + '\' | base64 -d)',
44
+ '',
45
+ '# Write / update status.json',
46
+ 'write_status() {',
47
+ ' local status="' + D + '1"',
48
+ ' local exit_code="' + D + '{2:-null}"',
49
+ ' local retries="' + D + '{3:-0}"',
50
+ ' printf \'{"taskId":"%s","status":"%s","started":"%s","updated":"%s","exitCode":%s,"retries":%s}\\n\' \\',
51
+ ' "' + D + 'TASK_ID" "' + D + 'status" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "' + D + 'exit_code" "' + D + 'retries" \\',
52
+ ' > "' + D + 'TASK_DIR/status.json"',
53
+ '}',
54
+ '',
55
+ 'update_status() {',
56
+ ' local status="' + D + '1"',
57
+ ' local exit_code="' + D + '{2:-null}"',
58
+ ' local retries="' + D + '{3:-0}"',
59
+ ' local started',
60
+ // Pure bash: grep/cut to extract started timestamp from our own single-line JSON format.
61
+ // Safe because write_status uses printf + date -u which never produces escaped quotes.
62
+ // Fallback to current date if status.json is missing or the field is absent.
63
+ ' started=$(grep -o \'"started":"[^"]*"\' "' + D + 'TASK_DIR/status.json" 2>/dev/null | head -1 | cut -d\'"\' -f4)',
64
+ ' [ -z "' + D + 'started" ] && started=$(date -u +%Y-%m-%dT%H:%M:%SZ)',
65
+ ' printf \'{"taskId":"%s","status":"%s","started":"%s","updated":"%s","exitCode":%s,"retries":%s}\\n\' \\',
66
+ ' "' + D + 'TASK_ID" "' + D + 'status" "' + D + 'started" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "' + D + 'exit_code" "' + D + 'retries" \\',
67
+ ' > "' + D + 'TASK_DIR/status.json"',
68
+ '}',
69
+ '',
70
+ 'write_status "running" null 0',
71
+ '',
72
+ '# Write our PID',
73
+ 'echo ' + D + D + ' > "' + D + 'TASK_DIR/task.pid"',
74
+ '',
75
+ '# F3: Background activity marker loop',
76
+ '(',
77
+ ' while kill -0 ' + D + D + ' 2>/dev/null; do',
78
+ ' touch "' + D + 'TASK_DIR/activity"',
79
+ ' sleep ' + D + 'ACTIVITY_INTERVAL',
80
+ ' done',
81
+ ') &',
82
+ 'ACTIVITY_PID=' + D + '!',
83
+ '',
84
+ '# Run with retries (F1: use RESTART_CMD after first attempt)',
85
+ 'RETRIES=0',
86
+ 'EXIT_CODE=0',
87
+ '',
88
+ '# First run: use MAIN_CMD',
89
+ 'bash -c "' + D + 'MAIN_CMD" >> "' + D + 'TASK_DIR/task.log" 2>&1 || EXIT_CODE=' + D + '?',
90
+ '',
91
+ 'while [ ' + D + 'EXIT_CODE -ne 0 ] && [ ' + D + 'RETRIES -lt ' + D + 'MAX_RETRIES ]; do',
92
+ ' RETRIES=$((' + D + 'RETRIES + 1))',
93
+ ' update_status "retrying" ' + D + 'EXIT_CODE ' + D + 'RETRIES',
94
+ ' echo "[fleet-task] retry ' + D + 'RETRIES/' + D + 'MAX_RETRIES at $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "' + D + 'TASK_DIR/task.log"',
95
+ ' EXIT_CODE=0',
96
+ ' # F1: use restart command on retries',
97
+ ' bash -c "' + D + 'RESTART_CMD" >> "' + D + 'TASK_DIR/task.log" 2>&1 || EXIT_CODE=' + D + '?',
98
+ 'done',
99
+ '',
100
+ '# Kill activity loop',
101
+ 'kill ' + D + 'ACTIVITY_PID 2>/dev/null || true',
102
+ '',
103
+ '# Remove PID file',
104
+ 'rm -f "' + D + 'TASK_DIR/task.pid"',
105
+ '',
106
+ 'if [ ' + D + 'EXIT_CODE -eq 0 ]; then',
107
+ ' update_status "completed" 0 ' + D + 'RETRIES',
108
+ 'else',
109
+ ' update_status "failed" ' + D + 'EXIT_CODE ' + D + 'RETRIES',
110
+ 'fi',
111
+ '',
112
+ 'exit ' + D + 'EXIT_CODE',
113
+ ];
114
+ return lines.join('\n') + '\n';
115
+ }
116
+ //# sourceMappingURL=task-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-wrapper.js","sourceRoot":"","sources":["../../../src/services/cloud/task-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type InstanceState = 'pending' | 'running' | 'stopping' | 'stopped' | 'shutting-down' | 'terminated';
2
+ export interface CloudConfig {
3
+ provider: 'aws';
4
+ instanceId: string;
5
+ region: string;
6
+ profile?: string;
7
+ idleTimeoutMin: number;
8
+ /** Custom shell command for workload detection; outputs "busy" or "idle" */
9
+ activityCommand?: string;
10
+ }
11
+ export interface CloudInstanceDetails {
12
+ state: InstanceState;
13
+ publicIp?: string;
14
+ instanceType?: string;
15
+ launchTime?: string;
16
+ }
17
+ export interface CloudProvider {
18
+ getInstanceState(config: CloudConfig): Promise<InstanceState>;
19
+ startInstance(config: CloudConfig): Promise<void>;
20
+ stopInstance(config: CloudConfig): Promise<void>;
21
+ waitForRunning(config: CloudConfig): Promise<void>;
22
+ waitForStopped(config: CloudConfig): Promise<void>;
23
+ getPublicIp(config: CloudConfig): Promise<string>;
24
+ getInstanceDetails(config: CloudConfig): Promise<CloudInstanceDetails>;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map