@made-by-moonlight/athene-cli 0.9.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 (315) hide show
  1. package/LICENSE +22 -0
  2. package/dist/assets/plugin-registry.json +67 -0
  3. package/dist/assets/scripts/athene-doctor.ps1 +352 -0
  4. package/dist/assets/scripts/athene-doctor.sh +552 -0
  5. package/dist/assets/scripts/athene-update.ps1 +224 -0
  6. package/dist/assets/scripts/athene-update.sh +252 -0
  7. package/dist/commands/completion.d.ts +3 -0
  8. package/dist/commands/completion.d.ts.map +1 -0
  9. package/dist/commands/completion.js +26 -0
  10. package/dist/commands/completion.js.map +1 -0
  11. package/dist/commands/config.d.ts +11 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +89 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/dashboard.d.ts +3 -0
  16. package/dist/commands/dashboard.d.ts.map +1 -0
  17. package/dist/commands/dashboard.js +103 -0
  18. package/dist/commands/dashboard.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +3 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +329 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/events.d.ts +3 -0
  24. package/dist/commands/events.d.ts.map +1 -0
  25. package/dist/commands/events.js +172 -0
  26. package/dist/commands/events.js.map +1 -0
  27. package/dist/commands/migrate-storage.d.ts +3 -0
  28. package/dist/commands/migrate-storage.d.ts.map +1 -0
  29. package/dist/commands/migrate-storage.js +78 -0
  30. package/dist/commands/migrate-storage.js.map +1 -0
  31. package/dist/commands/notify.d.ts +3 -0
  32. package/dist/commands/notify.d.ts.map +1 -0
  33. package/dist/commands/notify.js +143 -0
  34. package/dist/commands/notify.js.map +1 -0
  35. package/dist/commands/open.d.ts +3 -0
  36. package/dist/commands/open.d.ts.map +1 -0
  37. package/dist/commands/open.js +167 -0
  38. package/dist/commands/open.js.map +1 -0
  39. package/dist/commands/plugin.d.ts +3 -0
  40. package/dist/commands/plugin.d.ts.map +1 -0
  41. package/dist/commands/plugin.js +462 -0
  42. package/dist/commands/plugin.js.map +1 -0
  43. package/dist/commands/project.d.ts +3 -0
  44. package/dist/commands/project.d.ts.map +1 -0
  45. package/dist/commands/project.js +143 -0
  46. package/dist/commands/project.js.map +1 -0
  47. package/dist/commands/report.d.ts +19 -0
  48. package/dist/commands/report.d.ts.map +1 -0
  49. package/dist/commands/report.js +114 -0
  50. package/dist/commands/report.js.map +1 -0
  51. package/dist/commands/review-check.d.ts +3 -0
  52. package/dist/commands/review-check.d.ts.map +1 -0
  53. package/dist/commands/review-check.js +122 -0
  54. package/dist/commands/review-check.js.map +1 -0
  55. package/dist/commands/review.d.ts +3 -0
  56. package/dist/commands/review.d.ts.map +1 -0
  57. package/dist/commands/review.js +215 -0
  58. package/dist/commands/review.js.map +1 -0
  59. package/dist/commands/send.d.ts +3 -0
  60. package/dist/commands/send.d.ts.map +1 -0
  61. package/dist/commands/send.js +187 -0
  62. package/dist/commands/send.js.map +1 -0
  63. package/dist/commands/session.d.ts +3 -0
  64. package/dist/commands/session.d.ts.map +1 -0
  65. package/dist/commands/session.js +439 -0
  66. package/dist/commands/session.js.map +1 -0
  67. package/dist/commands/setup.d.ts +5 -0
  68. package/dist/commands/setup.d.ts.map +1 -0
  69. package/dist/commands/setup.js +297 -0
  70. package/dist/commands/setup.js.map +1 -0
  71. package/dist/commands/spawn.d.ts +4 -0
  72. package/dist/commands/spawn.d.ts.map +1 -0
  73. package/dist/commands/spawn.js +436 -0
  74. package/dist/commands/spawn.js.map +1 -0
  75. package/dist/commands/start.d.ts +21 -0
  76. package/dist/commands/start.d.ts.map +1 -0
  77. package/dist/commands/start.js +1836 -0
  78. package/dist/commands/start.js.map +1 -0
  79. package/dist/commands/status.d.ts +3 -0
  80. package/dist/commands/status.d.ts.map +1 -0
  81. package/dist/commands/status.js +556 -0
  82. package/dist/commands/status.js.map +1 -0
  83. package/dist/commands/update.d.ts +15 -0
  84. package/dist/commands/update.d.ts.map +1 -0
  85. package/dist/commands/update.js +652 -0
  86. package/dist/commands/update.js.map +1 -0
  87. package/dist/commands/verify.d.ts +3 -0
  88. package/dist/commands/verify.d.ts.map +1 -0
  89. package/dist/commands/verify.js +131 -0
  90. package/dist/commands/verify.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +24 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/lib/bun-tmp-janitor.d.ts +18 -0
  96. package/dist/lib/bun-tmp-janitor.d.ts.map +1 -0
  97. package/dist/lib/bun-tmp-janitor.js +127 -0
  98. package/dist/lib/bun-tmp-janitor.js.map +1 -0
  99. package/dist/lib/caller-context.d.ts +13 -0
  100. package/dist/lib/caller-context.d.ts.map +1 -0
  101. package/dist/lib/caller-context.js +20 -0
  102. package/dist/lib/caller-context.js.map +1 -0
  103. package/dist/lib/cli-errors.d.ts +8 -0
  104. package/dist/lib/cli-errors.d.ts.map +1 -0
  105. package/dist/lib/cli-errors.js +20 -0
  106. package/dist/lib/cli-errors.js.map +1 -0
  107. package/dist/lib/completion.d.ts +13 -0
  108. package/dist/lib/completion.d.ts.map +1 -0
  109. package/dist/lib/completion.js +428 -0
  110. package/dist/lib/completion.js.map +1 -0
  111. package/dist/lib/composio-setup.d.ts +65 -0
  112. package/dist/lib/composio-setup.d.ts.map +1 -0
  113. package/dist/lib/composio-setup.js +3255 -0
  114. package/dist/lib/composio-setup.js.map +1 -0
  115. package/dist/lib/config-instruction.d.ts +2 -0
  116. package/dist/lib/config-instruction.d.ts.map +1 -0
  117. package/dist/lib/config-instruction.js +193 -0
  118. package/dist/lib/config-instruction.js.map +1 -0
  119. package/dist/lib/constants.d.ts +3 -0
  120. package/dist/lib/constants.d.ts.map +1 -0
  121. package/dist/lib/constants.js +3 -0
  122. package/dist/lib/constants.js.map +1 -0
  123. package/dist/lib/create-session-manager.d.ts +26 -0
  124. package/dist/lib/create-session-manager.d.ts.map +1 -0
  125. package/dist/lib/create-session-manager.js +55 -0
  126. package/dist/lib/create-session-manager.js.map +1 -0
  127. package/dist/lib/credential-resolver.d.ts +37 -0
  128. package/dist/lib/credential-resolver.d.ts.map +1 -0
  129. package/dist/lib/credential-resolver.js +105 -0
  130. package/dist/lib/credential-resolver.js.map +1 -0
  131. package/dist/lib/daemon.d.ts +69 -0
  132. package/dist/lib/daemon.d.ts.map +1 -0
  133. package/dist/lib/daemon.js +77 -0
  134. package/dist/lib/daemon.js.map +1 -0
  135. package/dist/lib/dashboard-rebuild.d.ts +53 -0
  136. package/dist/lib/dashboard-rebuild.d.ts.map +1 -0
  137. package/dist/lib/dashboard-rebuild.js +188 -0
  138. package/dist/lib/dashboard-rebuild.js.map +1 -0
  139. package/dist/lib/dashboard-setup.d.ts +14 -0
  140. package/dist/lib/dashboard-setup.d.ts.map +1 -0
  141. package/dist/lib/dashboard-setup.js +192 -0
  142. package/dist/lib/dashboard-setup.js.map +1 -0
  143. package/dist/lib/dashboard-url.d.ts +19 -0
  144. package/dist/lib/dashboard-url.d.ts.map +1 -0
  145. package/dist/lib/dashboard-url.js +25 -0
  146. package/dist/lib/dashboard-url.js.map +1 -0
  147. package/dist/lib/desktop-setup.d.ts +21 -0
  148. package/dist/lib/desktop-setup.d.ts.map +1 -0
  149. package/dist/lib/desktop-setup.js +556 -0
  150. package/dist/lib/desktop-setup.js.map +1 -0
  151. package/dist/lib/detect-agent.d.ts +24 -0
  152. package/dist/lib/detect-agent.d.ts.map +1 -0
  153. package/dist/lib/detect-agent.js +69 -0
  154. package/dist/lib/detect-agent.js.map +1 -0
  155. package/dist/lib/detect-env.d.ts +14 -0
  156. package/dist/lib/detect-env.d.ts.map +1 -0
  157. package/dist/lib/detect-env.js +46 -0
  158. package/dist/lib/detect-env.js.map +1 -0
  159. package/dist/lib/discord-setup.d.ts +20 -0
  160. package/dist/lib/discord-setup.d.ts.map +1 -0
  161. package/dist/lib/discord-setup.js +584 -0
  162. package/dist/lib/discord-setup.js.map +1 -0
  163. package/dist/lib/format.d.ts +11 -0
  164. package/dist/lib/format.d.ts.map +1 -0
  165. package/dist/lib/format.js +116 -0
  166. package/dist/lib/format.js.map +1 -0
  167. package/dist/lib/git-utils.d.ts +14 -0
  168. package/dist/lib/git-utils.d.ts.map +1 -0
  169. package/dist/lib/git-utils.js +45 -0
  170. package/dist/lib/git-utils.js.map +1 -0
  171. package/dist/lib/install-helpers.d.ts +24 -0
  172. package/dist/lib/install-helpers.d.ts.map +1 -0
  173. package/dist/lib/install-helpers.js +76 -0
  174. package/dist/lib/install-helpers.js.map +1 -0
  175. package/dist/lib/lifecycle-service.d.ts +11 -0
  176. package/dist/lib/lifecycle-service.d.ts.map +1 -0
  177. package/dist/lib/lifecycle-service.js +65 -0
  178. package/dist/lib/lifecycle-service.js.map +1 -0
  179. package/dist/lib/notifier-routing.d.ts +35 -0
  180. package/dist/lib/notifier-routing.d.ts.map +1 -0
  181. package/dist/lib/notifier-routing.js +133 -0
  182. package/dist/lib/notifier-routing.js.map +1 -0
  183. package/dist/lib/notify-test.d.ts +72 -0
  184. package/dist/lib/notify-test.d.ts.map +1 -0
  185. package/dist/lib/notify-test.js +674 -0
  186. package/dist/lib/notify-test.js.map +1 -0
  187. package/dist/lib/openclaw-probe.d.ts +38 -0
  188. package/dist/lib/openclaw-probe.d.ts.map +1 -0
  189. package/dist/lib/openclaw-probe.js +146 -0
  190. package/dist/lib/openclaw-probe.js.map +1 -0
  191. package/dist/lib/openclaw-setup.d.ts +19 -0
  192. package/dist/lib/openclaw-setup.d.ts.map +1 -0
  193. package/dist/lib/openclaw-setup.js +684 -0
  194. package/dist/lib/openclaw-setup.js.map +1 -0
  195. package/dist/lib/path-equality.d.ts +29 -0
  196. package/dist/lib/path-equality.d.ts.map +1 -0
  197. package/dist/lib/path-equality.js +52 -0
  198. package/dist/lib/path-equality.js.map +1 -0
  199. package/dist/lib/plugin-marketplace.d.ts +24 -0
  200. package/dist/lib/plugin-marketplace.d.ts.map +1 -0
  201. package/dist/lib/plugin-marketplace.js +175 -0
  202. package/dist/lib/plugin-marketplace.js.map +1 -0
  203. package/dist/lib/plugin-scaffold.d.ts +14 -0
  204. package/dist/lib/plugin-scaffold.d.ts.map +1 -0
  205. package/dist/lib/plugin-scaffold.js +174 -0
  206. package/dist/lib/plugin-scaffold.js.map +1 -0
  207. package/dist/lib/plugin-store.d.ts +9 -0
  208. package/dist/lib/plugin-store.d.ts.map +1 -0
  209. package/dist/lib/plugin-store.js +121 -0
  210. package/dist/lib/plugin-store.js.map +1 -0
  211. package/dist/lib/plugins.d.ts +17 -0
  212. package/dist/lib/plugins.d.ts.map +1 -0
  213. package/dist/lib/plugins.js +65 -0
  214. package/dist/lib/plugins.js.map +1 -0
  215. package/dist/lib/portfolio-display.d.ts +10 -0
  216. package/dist/lib/portfolio-display.d.ts.map +1 -0
  217. package/dist/lib/portfolio-display.js +17 -0
  218. package/dist/lib/portfolio-display.js.map +1 -0
  219. package/dist/lib/preflight.d.ts +27 -0
  220. package/dist/lib/preflight.d.ts.map +1 -0
  221. package/dist/lib/preflight.js +77 -0
  222. package/dist/lib/preflight.js.map +1 -0
  223. package/dist/lib/prevent-sleep.d.ts +34 -0
  224. package/dist/lib/prevent-sleep.d.ts.map +1 -0
  225. package/dist/lib/prevent-sleep.js +65 -0
  226. package/dist/lib/prevent-sleep.js.map +1 -0
  227. package/dist/lib/project-detection.d.ts +11 -0
  228. package/dist/lib/project-detection.d.ts.map +1 -0
  229. package/dist/lib/project-detection.js +206 -0
  230. package/dist/lib/project-detection.js.map +1 -0
  231. package/dist/lib/project-resolution.d.ts +10 -0
  232. package/dist/lib/project-resolution.d.ts.map +1 -0
  233. package/dist/lib/project-resolution.js +17 -0
  234. package/dist/lib/project-resolution.js.map +1 -0
  235. package/dist/lib/project-supervisor.d.ts +28 -0
  236. package/dist/lib/project-supervisor.d.ts.map +1 -0
  237. package/dist/lib/project-supervisor.js +167 -0
  238. package/dist/lib/project-supervisor.js.map +1 -0
  239. package/dist/lib/prompts.d.ts +7 -0
  240. package/dist/lib/prompts.d.ts.map +1 -0
  241. package/dist/lib/prompts.js +37 -0
  242. package/dist/lib/prompts.js.map +1 -0
  243. package/dist/lib/repo-utils.d.ts +16 -0
  244. package/dist/lib/repo-utils.d.ts.map +1 -0
  245. package/dist/lib/repo-utils.js +26 -0
  246. package/dist/lib/repo-utils.js.map +1 -0
  247. package/dist/lib/resolve-project.d.ts +113 -0
  248. package/dist/lib/resolve-project.d.ts.map +1 -0
  249. package/dist/lib/resolve-project.js +433 -0
  250. package/dist/lib/resolve-project.js.map +1 -0
  251. package/dist/lib/routes.d.ts +2 -0
  252. package/dist/lib/routes.d.ts.map +1 -0
  253. package/dist/lib/routes.js +5 -0
  254. package/dist/lib/routes.js.map +1 -0
  255. package/dist/lib/running-state.d.ts +76 -0
  256. package/dist/lib/running-state.d.ts.map +1 -0
  257. package/dist/lib/running-state.js +338 -0
  258. package/dist/lib/running-state.js.map +1 -0
  259. package/dist/lib/script-runner.d.ts +10 -0
  260. package/dist/lib/script-runner.d.ts.map +1 -0
  261. package/dist/lib/script-runner.js +189 -0
  262. package/dist/lib/script-runner.js.map +1 -0
  263. package/dist/lib/session-utils.d.ts +14 -0
  264. package/dist/lib/session-utils.d.ts.map +1 -0
  265. package/dist/lib/session-utils.js +58 -0
  266. package/dist/lib/session-utils.js.map +1 -0
  267. package/dist/lib/shell.d.ts +17 -0
  268. package/dist/lib/shell.d.ts.map +1 -0
  269. package/dist/lib/shell.js +90 -0
  270. package/dist/lib/shell.js.map +1 -0
  271. package/dist/lib/shutdown.d.ts +30 -0
  272. package/dist/lib/shutdown.d.ts.map +1 -0
  273. package/dist/lib/shutdown.js +177 -0
  274. package/dist/lib/shutdown.js.map +1 -0
  275. package/dist/lib/slack-setup.d.ts +17 -0
  276. package/dist/lib/slack-setup.d.ts.map +1 -0
  277. package/dist/lib/slack-setup.js +485 -0
  278. package/dist/lib/slack-setup.js.map +1 -0
  279. package/dist/lib/startup-preflight.d.ts +36 -0
  280. package/dist/lib/startup-preflight.d.ts.map +1 -0
  281. package/dist/lib/startup-preflight.js +273 -0
  282. package/dist/lib/startup-preflight.js.map +1 -0
  283. package/dist/lib/update-channel-onboarding.d.ts +52 -0
  284. package/dist/lib/update-channel-onboarding.d.ts.map +1 -0
  285. package/dist/lib/update-channel-onboarding.js +107 -0
  286. package/dist/lib/update-channel-onboarding.js.map +1 -0
  287. package/dist/lib/update-check.d.ts +161 -0
  288. package/dist/lib/update-check.d.ts.map +1 -0
  289. package/dist/lib/update-check.js +504 -0
  290. package/dist/lib/update-check.js.map +1 -0
  291. package/dist/lib/web-dir.d.ts +47 -0
  292. package/dist/lib/web-dir.d.ts.map +1 -0
  293. package/dist/lib/web-dir.js +179 -0
  294. package/dist/lib/web-dir.js.map +1 -0
  295. package/dist/lib/webhook-setup.d.ts +16 -0
  296. package/dist/lib/webhook-setup.d.ts.map +1 -0
  297. package/dist/lib/webhook-setup.js +383 -0
  298. package/dist/lib/webhook-setup.js.map +1 -0
  299. package/dist/options/version.d.ts +2 -0
  300. package/dist/options/version.d.ts.map +1 -0
  301. package/dist/options/version.js +7 -0
  302. package/dist/options/version.js.map +1 -0
  303. package/dist/program.d.ts +3 -0
  304. package/dist/program.d.ts.map +1 -0
  305. package/dist/program.js +63 -0
  306. package/dist/program.js.map +1 -0
  307. package/package.json +80 -0
  308. package/templates/rules/base.md +4 -0
  309. package/templates/rules/go.md +8 -0
  310. package/templates/rules/javascript.md +4 -0
  311. package/templates/rules/nextjs.md +7 -0
  312. package/templates/rules/pnpm-workspaces.md +4 -0
  313. package/templates/rules/python.md +8 -0
  314. package/templates/rules/react.md +8 -0
  315. package/templates/rules/typescript.md +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"running-state.d.ts","sourceRoot":"","sources":["../../src/lib/running-state.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,uEAAuE;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACpE;AAiJD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAOhD;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/E;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1E;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA4B/D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAErE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAYlE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnD"}
@@ -0,0 +1,338 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, unlinkSync, openSync, closeSync, constants, statSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { setTimeout as sleep } from "node:timers/promises";
5
+ import { atomicWriteFileSync, recordActivityEvent } from "@made-by-moonlight/athene-core";
6
+ const STATE_DIR = join(homedir(), ".agent-orchestrator");
7
+ const STATE_FILE = join(STATE_DIR, "running.json");
8
+ const STATE_LOCK_FILE = join(STATE_DIR, "running.lock");
9
+ const STARTUP_LOCK_FILE = join(STATE_DIR, "startup.lock");
10
+ const LAST_STOP_LOCK_FILE = join(STATE_DIR, "last-stop.lock");
11
+ const LAST_STOP_FILE = join(STATE_DIR, "last-stop.json");
12
+ const UNPARSEABLE_LOCK_GRACE_MS = 5_000;
13
+ function ensureDir() {
14
+ mkdirSync(STATE_DIR, { recursive: true });
15
+ }
16
+ function isProcessAlive(pid) {
17
+ try {
18
+ process.kill(pid, 0);
19
+ return true;
20
+ }
21
+ catch (error) {
22
+ if (error.code === "EPERM") {
23
+ return true;
24
+ }
25
+ return false;
26
+ }
27
+ }
28
+ function readLockMetadata(lockFile) {
29
+ try {
30
+ const raw = readFileSync(lockFile, "utf-8");
31
+ const parsed = JSON.parse(raw);
32
+ if (typeof parsed.pid !== "number")
33
+ return null;
34
+ return {
35
+ pid: parsed.pid,
36
+ acquiredAt: typeof parsed.acquiredAt === "string" ? parsed.acquiredAt : new Date(0).toISOString(),
37
+ };
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ function isStaleUnparseableLock(lockFile) {
44
+ try {
45
+ const mtimeMs = statSync(lockFile).mtimeMs;
46
+ return Date.now() - mtimeMs > UNPARSEABLE_LOCK_GRACE_MS;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /** Try to create the lockfile atomically. Returns a release function on success, null on failure. */
53
+ function tryAcquire(lockFile) {
54
+ try {
55
+ const fd = openSync(lockFile, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY);
56
+ const metadata = {
57
+ pid: process.pid,
58
+ acquiredAt: new Date().toISOString(),
59
+ };
60
+ try {
61
+ writeFileSync(fd, JSON.stringify(metadata), "utf-8");
62
+ }
63
+ catch {
64
+ try {
65
+ unlinkSync(lockFile);
66
+ }
67
+ catch { /* best effort */ }
68
+ return null;
69
+ }
70
+ finally {
71
+ try {
72
+ closeSync(fd);
73
+ }
74
+ catch { /* best effort */ }
75
+ }
76
+ return () => {
77
+ try {
78
+ unlinkSync(lockFile);
79
+ }
80
+ catch { /* best effort */ }
81
+ };
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ /**
88
+ * Advisory lockfile using O_EXCL for atomic creation.
89
+ * Retries with jittered backoff. Dead owners are treated as stale and cleaned
90
+ * up automatically. Live owners are never stolen; callers get a clear timeout.
91
+ */
92
+ async function acquireLock(lockFile, timeoutMs = 5000, resourceName = "lock") {
93
+ ensureDir();
94
+ const start = Date.now();
95
+ let attempt = 0;
96
+ while (true) {
97
+ const release = tryAcquire(lockFile);
98
+ if (release)
99
+ return release;
100
+ const owner = readLockMetadata(lockFile);
101
+ if ((!owner && isStaleUnparseableLock(lockFile))
102
+ || (owner && !isProcessAlive(owner.pid))) {
103
+ try {
104
+ unlinkSync(lockFile);
105
+ }
106
+ catch { /* ignore */ }
107
+ const retryRelease = tryAcquire(lockFile);
108
+ if (retryRelease)
109
+ return retryRelease;
110
+ }
111
+ if (Date.now() - start > timeoutMs) {
112
+ recordActivityEvent({
113
+ source: "cli",
114
+ kind: "cli.lock_timeout",
115
+ level: "warn",
116
+ summary: `lock acquisition timed out`,
117
+ data: {
118
+ resourceName,
119
+ lockFile,
120
+ timeoutMs,
121
+ attempts: attempt,
122
+ },
123
+ });
124
+ throw new Error(`Could not acquire ${resourceName} (${lockFile})`);
125
+ }
126
+ // Jittered backoff: 30-70ms base, growing with attempts (capped at 200ms)
127
+ const baseMs = Math.min(50 + attempt * 20, 200);
128
+ const jitter = Math.floor(Math.random() * 40) - 20;
129
+ await sleep(baseMs + jitter);
130
+ attempt++;
131
+ }
132
+ }
133
+ function readState() {
134
+ try {
135
+ const raw = readFileSync(STATE_FILE, "utf-8");
136
+ const state = JSON.parse(raw);
137
+ if (!state || typeof state.pid !== "number")
138
+ return null;
139
+ return state;
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ function writeState(state) {
146
+ ensureDir();
147
+ if (state === null) {
148
+ try {
149
+ unlinkSync(STATE_FILE);
150
+ }
151
+ catch { /* file may not exist */ }
152
+ }
153
+ else {
154
+ // Atomic temp+rename so a crash mid-write cannot leave torn JSON
155
+ // that makes `getRunning()` silently return `null` and orphan a
156
+ // still-alive AO process from later CLI commands.
157
+ atomicWriteFileSync(STATE_FILE, JSON.stringify(state, null, 2));
158
+ }
159
+ }
160
+ /**
161
+ * Register the current AO instance as running.
162
+ * Uses a lockfile to prevent concurrent registration.
163
+ */
164
+ export async function register(entry) {
165
+ const release = await acquireLock(STATE_LOCK_FILE, 5000, "running.json lock");
166
+ try {
167
+ writeState(entry);
168
+ }
169
+ finally {
170
+ release();
171
+ }
172
+ }
173
+ /**
174
+ * Unregister the running AO instance.
175
+ */
176
+ export async function unregister() {
177
+ const release = await acquireLock(STATE_LOCK_FILE, 5000, "running.json lock");
178
+ try {
179
+ writeState(null);
180
+ }
181
+ finally {
182
+ release();
183
+ }
184
+ }
185
+ /**
186
+ * Remove a single project from the running state's project list.
187
+ * Used by `athene stop <project>` so that `athene start <project>` can restart
188
+ * the orchestrator without hitting the "already running" gate.
189
+ * No-op if the state is missing or the project isn't listed.
190
+ */
191
+ export async function removeProjectFromRunning(projectId) {
192
+ const release = await acquireLock(STATE_LOCK_FILE, 5000, "running.json lock");
193
+ try {
194
+ const state = readState();
195
+ if (!state)
196
+ return;
197
+ const updated = state.projects.filter((p) => p !== projectId);
198
+ if (updated.length === state.projects.length)
199
+ return;
200
+ writeState({ ...state, projects: updated });
201
+ }
202
+ finally {
203
+ release();
204
+ }
205
+ }
206
+ /**
207
+ * Add a project to the running state's project list (idempotent).
208
+ * Used when a project's orchestrator is spawned against an already-running
209
+ * daemon — for example after `athene start <project>` attaches to an existing
210
+ * parent process whose `projects` list didn't yet include the project.
211
+ * Without this, subsequent `athene stop` (no args) would leave the new
212
+ * orchestrator orphaned because it isn't in `running.projects`.
213
+ * No-op if the state is missing or the project is already listed.
214
+ */
215
+ export async function addProjectToRunning(projectId) {
216
+ const release = await acquireLock(STATE_LOCK_FILE, 5000, "running.json lock");
217
+ try {
218
+ const state = readState();
219
+ if (!state)
220
+ return;
221
+ if (state.projects.includes(projectId))
222
+ return;
223
+ writeState({ ...state, projects: [...state.projects, projectId] });
224
+ }
225
+ finally {
226
+ release();
227
+ }
228
+ }
229
+ /**
230
+ * Get the currently running AO instance, if any.
231
+ * Auto-prunes stale entries (dead PIDs).
232
+ */
233
+ export async function getRunning() {
234
+ const release = await acquireLock(STATE_LOCK_FILE, 5000, "running.json lock");
235
+ try {
236
+ const state = readState();
237
+ if (!state)
238
+ return null;
239
+ if (!isProcessAlive(state.pid)) {
240
+ // Stale entry — process is dead, clean up
241
+ writeState(null);
242
+ recordActivityEvent({
243
+ source: "cli",
244
+ kind: "cli.stale_running_pruned",
245
+ level: "warn",
246
+ summary: `pruned stale running.json entry (dead pid ${state.pid})`,
247
+ data: {
248
+ pid: state.pid,
249
+ port: state.port,
250
+ startedAt: state.startedAt,
251
+ projects: state.projects,
252
+ },
253
+ });
254
+ return null;
255
+ }
256
+ return state;
257
+ }
258
+ finally {
259
+ release();
260
+ }
261
+ }
262
+ /**
263
+ * Check if AO is already running.
264
+ * Returns the running state if alive, null otherwise.
265
+ */
266
+ export async function isAlreadyRunning() {
267
+ return getRunning();
268
+ }
269
+ /**
270
+ * Serialize `athene start` so concurrent startups cannot both observe an empty
271
+ * running.json and create competing orchestrator/dashboard processes.
272
+ */
273
+ export async function acquireStartupLock(timeoutMs = 30000) {
274
+ return await acquireLock(STARTUP_LOCK_FILE, timeoutMs, "startup lock");
275
+ }
276
+ /**
277
+ * Wait for a process to exit, polling isProcessAlive.
278
+ * Returns true if the process exited, false if timeout reached.
279
+ */
280
+ export async function waitForExit(pid, timeoutMs = 5000) {
281
+ const start = Date.now();
282
+ while (Date.now() - start < timeoutMs) {
283
+ if (!isProcessAlive(pid))
284
+ return true;
285
+ await sleep(100);
286
+ }
287
+ return !isProcessAlive(pid);
288
+ }
289
+ /**
290
+ * Record which sessions were active when `athene stop` ran.
291
+ */
292
+ export async function writeLastStop(state) {
293
+ const release = await acquireLock(LAST_STOP_LOCK_FILE, 5000, "last-stop.json lock");
294
+ try {
295
+ // Atomic temp+rename so a crash mid-write cannot leave torn JSON
296
+ // that makes `readLastStop()` silently return `null` and lose the
297
+ // restore prompt for sessions the user just stopped.
298
+ atomicWriteFileSync(LAST_STOP_FILE, JSON.stringify(state, null, 2));
299
+ }
300
+ finally {
301
+ release();
302
+ }
303
+ }
304
+ /**
305
+ * Read the last-stop state, if any.
306
+ */
307
+ export async function readLastStop() {
308
+ const release = await acquireLock(LAST_STOP_LOCK_FILE, 5000, "last-stop.json lock");
309
+ try {
310
+ const raw = readFileSync(LAST_STOP_FILE, "utf-8");
311
+ const state = JSON.parse(raw);
312
+ if (!state || typeof state.stoppedAt !== "string" || !state.projectId || !Array.isArray(state.sessionIds))
313
+ return null;
314
+ return state;
315
+ }
316
+ catch {
317
+ return null;
318
+ }
319
+ finally {
320
+ release();
321
+ }
322
+ }
323
+ /**
324
+ * Remove the last-stop state file (after restore or skip).
325
+ */
326
+ export async function clearLastStop() {
327
+ const release = await acquireLock(LAST_STOP_LOCK_FILE, 5000, "last-stop.json lock");
328
+ try {
329
+ try {
330
+ unlinkSync(LAST_STOP_FILE);
331
+ }
332
+ catch { /* file may not exist */ }
333
+ }
334
+ finally {
335
+ release();
336
+ }
337
+ }
338
+ //# sourceMappingURL=running-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"running-state.js","sourceRoot":"","sources":["../../src/lib/running-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type ScriptLayout = "source-checkout" | "package-install";
2
+ export declare function resolveScriptLayoutFromPath(modulePath: string): ScriptLayout;
3
+ export declare function resolveDefaultRepoRootFromPath(modulePath: string): string;
4
+ export declare function resolveRepoRoot(): string;
5
+ export declare function resolveScriptLayout(): ScriptLayout;
6
+ export declare function resolveScriptPath(scriptName: string): string;
7
+ export declare function hasRepoScript(scriptName: string): boolean;
8
+ export declare function runRepoScript(scriptName: string, args: string[]): Promise<number>;
9
+ export declare function executeScriptCommand(scriptName: string, args: string[]): Promise<void>;
10
+ //# sourceMappingURL=script-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-runner.d.ts","sourceRoot":"","sources":["../../src/lib/script-runner.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAU5E;AAED,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMzE;AAWD,wBAAgB,eAAe,IAAI,MAAM,CAgBxC;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CASlD;AAMD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAkDD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDvF;AA4BD,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5F"}
@@ -0,0 +1,189 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { isWindows } from "@made-by-moonlight/athene-core";
6
+ import { classifyInstallPath, hasNodeModulesAncestor, isAgentOrchestratorRepoRoot, isAoCliPackageRoot, } from "./update-check.js";
7
+ const CURRENT_MODULE_PATH = fileURLToPath(import.meta.url);
8
+ const CURRENT_MODULE_DIR = dirname(CURRENT_MODULE_PATH);
9
+ const CLI_DIST_ROOT = resolve(CURRENT_MODULE_DIR, "..");
10
+ export function resolveScriptLayoutFromPath(modulePath) {
11
+ const installMethod = classifyInstallPath(modulePath);
12
+ if (installMethod === "git") {
13
+ return "source-checkout";
14
+ }
15
+ if (installMethod === "npm-global" || installMethod === "pnpm-global") {
16
+ return "package-install";
17
+ }
18
+ return hasNodeModulesAncestor(modulePath) ? "package-install" : "source-checkout";
19
+ }
20
+ export function resolveDefaultRepoRootFromPath(modulePath) {
21
+ const moduleDir = dirname(modulePath);
22
+ const layout = resolveScriptLayoutFromPath(modulePath);
23
+ return layout === "package-install"
24
+ ? resolve(moduleDir, "../..")
25
+ : resolve(moduleDir, "../../../../");
26
+ }
27
+ const DEFAULT_REPO_ROOT = resolveDefaultRepoRootFromPath(CURRENT_MODULE_PATH);
28
+ const DEFAULT_SCRIPT_LAYOUT = resolveScriptLayoutFromPath(CURRENT_MODULE_PATH);
29
+ function isValidRepoRootForLayout(root, layout) {
30
+ return layout === "source-checkout"
31
+ ? isAgentOrchestratorRepoRoot(root)
32
+ : isAoCliPackageRoot(root);
33
+ }
34
+ export function resolveRepoRoot() {
35
+ const override = process.env["AO_REPO_ROOT"];
36
+ if (!override) {
37
+ return DEFAULT_REPO_ROOT;
38
+ }
39
+ const resolved = resolve(override);
40
+ if (!isValidRepoRootForLayout(resolved, DEFAULT_SCRIPT_LAYOUT)) {
41
+ const expected = DEFAULT_SCRIPT_LAYOUT === "source-checkout"
42
+ ? "an agent-orchestrator checkout"
43
+ : "an installed @made-by-moonlight/athene-cli package";
44
+ throw new Error(`AO_REPO_ROOT=${override} does not look like ${expected}`);
45
+ }
46
+ return resolved;
47
+ }
48
+ export function resolveScriptLayout() {
49
+ const override = process.env["AO_SCRIPT_LAYOUT"];
50
+ if (process.env["AO_DEV"] === "1" &&
51
+ (override === "package-install" || override === "source-checkout")) {
52
+ return override;
53
+ }
54
+ return DEFAULT_SCRIPT_LAYOUT;
55
+ }
56
+ function getScriptPath(scriptName) {
57
+ return resolve(CLI_DIST_ROOT, "assets", "scripts", scriptName);
58
+ }
59
+ export function resolveScriptPath(scriptName) {
60
+ const scriptPath = getScriptPath(scriptName);
61
+ if (!existsSync(scriptPath)) {
62
+ throw new Error(`Script not found: ${scriptName}. Expected at: ${scriptPath} (scripts directory: ${resolve(CLI_DIST_ROOT, "assets", "scripts")})`);
63
+ }
64
+ return scriptPath;
65
+ }
66
+ // Common Git Bash install locations on Windows. WSL's bash.exe is intentionally
67
+ // excluded: when invoked from Windows-native Node, the spawned WSL bash sees
68
+ // Linux paths (/mnt/c/...) while cwd is a Windows path (D:\...), which silently
69
+ // breaks repo scripts. Users on WSL run `ao` as a Linux process anyway, where
70
+ // process.platform === "linux" and this branch never executes.
71
+ const WINDOWS_BASH_CANDIDATES = [
72
+ "C:\\Program Files\\Git\\bin\\bash.exe",
73
+ "C:\\Program Files (x86)\\Git\\bin\\bash.exe",
74
+ "C:\\Program Files\\Git\\usr\\bin\\bash.exe",
75
+ ];
76
+ // Walk PATH searching for bash.exe. Lets us discover Git Bash installs on
77
+ // non-default drives (e.g. D:\Program Files\Git) that the hardcoded list above
78
+ // would miss. Returns the first match or null. PATH-walking is sync but
79
+ // microseconds — no subprocess.
80
+ function findBashOnPath() {
81
+ const dirs = (process.env["PATH"] ?? "").split(";").filter(Boolean);
82
+ for (const dir of dirs) {
83
+ const candidate = resolve(dir, "bash.exe");
84
+ if (existsSync(candidate))
85
+ return candidate;
86
+ }
87
+ return null;
88
+ }
89
+ function detectWindowsBash() {
90
+ for (const candidate of WINDOWS_BASH_CANDIDATES) {
91
+ if (existsSync(candidate))
92
+ return candidate;
93
+ }
94
+ return findBashOnPath();
95
+ }
96
+ // Windows: prefer PowerShell 7 (pwsh.exe), fall back to bundled Windows
97
+ // PowerShell 5.1 (powershell.exe). Both can run our .ps1 scripts.
98
+ function detectWindowsPowerShell() {
99
+ const candidates = ["pwsh.exe", "powershell.exe"];
100
+ const dirs = (process.env["PATH"] ?? "").split(";").filter(Boolean);
101
+ for (const exe of candidates) {
102
+ for (const dir of dirs) {
103
+ const candidate = resolve(dir, exe);
104
+ if (existsSync(candidate))
105
+ return candidate;
106
+ }
107
+ }
108
+ // Fallback: powershell.exe ships in System32 on every supported Windows.
109
+ const sysRoot = process.env["SystemRoot"] ?? "C:\\Windows";
110
+ const fallback = resolve(sysRoot, "System32\\WindowsPowerShell\\v1.0\\powershell.exe");
111
+ return existsSync(fallback) ? fallback : null;
112
+ }
113
+ export function hasRepoScript(scriptName) {
114
+ return existsSync(getScriptPath(scriptName));
115
+ }
116
+ export async function runRepoScript(scriptName, args) {
117
+ const repoRoot = resolveRepoRoot();
118
+ const scriptLayout = resolveScriptLayout();
119
+ // Windows: prefer the .ps1 sibling of the requested .sh script and run via
120
+ // PowerShell. .sh scripts can still be run if the user has installed Git Bash
121
+ // and we ship no .ps1 equivalent. Booth/WSL bash isn't supported (see comment
122
+ // on WINDOWS_BASH_CANDIDATES).
123
+ if (isWindows()) {
124
+ const ps1Name = scriptName.replace(/\.sh$/i, ".ps1");
125
+ if (ps1Name !== scriptName && hasRepoScript(ps1Name)) {
126
+ const ps = detectWindowsPowerShell();
127
+ if (!ps) {
128
+ throw new Error("Cannot run PowerShell scripts on Windows. " +
129
+ "Install PowerShell 7 (https://aka.ms/powershell) or ensure powershell.exe is in PATH.");
130
+ }
131
+ const scriptPath = resolveScriptPath(ps1Name);
132
+ // -File runs the script with positional args; -ExecutionPolicy Bypass
133
+ // avoids machine policy blocking unsigned bundled scripts.
134
+ return await spawnAndWait(ps, ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", scriptPath, ...args], repoRoot, scriptLayout);
135
+ }
136
+ }
137
+ let shellOverride = process.env["AO_BASH_PATH"];
138
+ // Unix: always use bash — repo scripts have #!/bin/bash shebangs and bash-specific syntax.
139
+ // Shebangs are only honoured by the kernel when a file is executed directly; when passed as
140
+ // an argument to another interpreter (e.g. zsh script.sh) the shebang is ignored, so we must
141
+ // name bash explicitly rather than using the user's $SHELL.
142
+ // Windows: no native shell (pwsh, powershell.exe, cmd.exe) can run bash scripts —
143
+ // shebangs are ignored and bash-specific syntax fails. Auto-detect Git Bash / WSL,
144
+ // fall back to AO_BASH_PATH, throw with guidance if neither is found.
145
+ if (!shellOverride && isWindows()) {
146
+ const detected = detectWindowsBash();
147
+ if (!detected) {
148
+ throw new Error("Cannot run repo scripts on Windows without bash. " +
149
+ "Install Git for Windows (https://git-scm.com/download/win) or " +
150
+ "set AO_BASH_PATH to a bash executable " +
151
+ "(e.g. C:\\Program Files\\Git\\bin\\bash.exe).");
152
+ }
153
+ shellOverride = detected;
154
+ }
155
+ const shell = shellOverride ?? "bash";
156
+ const scriptPath = resolveScriptPath(scriptName);
157
+ return await spawnAndWait(shell, [scriptPath, ...args], repoRoot, scriptLayout);
158
+ }
159
+ function spawnAndWait(shell, shellArgs, repoRoot, scriptLayout) {
160
+ return new Promise((resolveExit, reject) => {
161
+ const child = spawn(shell, shellArgs, {
162
+ cwd: repoRoot,
163
+ env: { ...process.env, AO_REPO_ROOT: repoRoot, AO_SCRIPT_LAYOUT: scriptLayout },
164
+ stdio: "inherit",
165
+ windowsHide: true,
166
+ });
167
+ child.on("error", reject);
168
+ child.on("exit", (code, signal) => {
169
+ if (signal) {
170
+ resolveExit(1);
171
+ return;
172
+ }
173
+ resolveExit(code ?? 1);
174
+ });
175
+ });
176
+ }
177
+ export async function executeScriptCommand(scriptName, args) {
178
+ try {
179
+ const exitCode = await runRepoScript(scriptName, args);
180
+ if (exitCode !== 0) {
181
+ process.exit(exitCode);
182
+ }
183
+ }
184
+ catch (error) {
185
+ console.error(error instanceof Error ? error.message : String(error));
186
+ process.exit(1);
187
+ }
188
+ }
189
+ //# sourceMappingURL=script-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-runner.js","sourceRoot":"","sources":["../../src/lib/script-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { OrchestratorConfig } from "@made-by-moonlight/athene-core";
2
+ export declare function escapeRegex(str: string): string;
3
+ /**
4
+ * Strip optional 12-char hex hash prefix from a tmux session name.
5
+ * "1686e4aaaeaa-ao-145" → "ao-145"
6
+ * "ao-145" → "ao-145" (no-op if no hash prefix)
7
+ */
8
+ export declare function stripHashPrefix(name: string): string;
9
+ /** Check whether a session name matches a project prefix (strict: prefix-\d+ only). */
10
+ export declare function matchesPrefix(sessionName: string, prefix: string): boolean;
11
+ /** Find which project a session belongs to by matching its name against session prefixes. */
12
+ export declare function findProjectForSession(config: OrchestratorConfig, sessionName: string): string | null;
13
+ export declare function isOrchestratorSessionName(config: OrchestratorConfig, sessionName: string, projectId?: string): boolean;
14
+ //# sourceMappingURL=session-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-utils.d.ts","sourceRoot":"","sources":["../../src/lib/session-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAUf;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAwCT"}
@@ -0,0 +1,58 @@
1
+ export function escapeRegex(str) {
2
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3
+ }
4
+ /**
5
+ * Strip optional 12-char hex hash prefix from a tmux session name.
6
+ * "1686e4aaaeaa-ao-145" → "ao-145"
7
+ * "ao-145" → "ao-145" (no-op if no hash prefix)
8
+ */
9
+ export function stripHashPrefix(name) {
10
+ const match = name.match(/^[a-f0-9]{12}-(.+)$/);
11
+ return match ? match[1] : name;
12
+ }
13
+ /** Check whether a session name matches a project prefix (strict: prefix-\d+ only). */
14
+ export function matchesPrefix(sessionName, prefix) {
15
+ const normalizedName = stripHashPrefix(sessionName);
16
+ return new RegExp(`^${escapeRegex(prefix)}-\\d+$`).test(normalizedName);
17
+ }
18
+ /** Find which project a session belongs to by matching its name against session prefixes. */
19
+ export function findProjectForSession(config, sessionName) {
20
+ for (const [id, project] of Object.entries(config.projects)) {
21
+ const prefix = project.sessionPrefix || id;
22
+ if (matchesPrefix(sessionName, prefix) || isOrchestratorSessionName(config, sessionName, id)) {
23
+ return id;
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ export function isOrchestratorSessionName(config, sessionName, projectId) {
29
+ const normalizedName = stripHashPrefix(sessionName);
30
+ // If sessionName is a numbered worker for any configured project, it is not an orchestrator.
31
+ // This guard runs first to prevent cross-project false positives: e.g. prefix "app" would
32
+ // match "app-orchestrator-1" as an orchestrator pattern, but if another project has prefix
33
+ // "app-orchestrator" then "app-orchestrator-1" is a worker, not an orchestrator.
34
+ for (const [id, project] of Object.entries(config.projects)) {
35
+ const prefix = project.sessionPrefix || id;
36
+ if (matchesPrefix(normalizedName, prefix))
37
+ return false;
38
+ }
39
+ if (projectId) {
40
+ const project = config.projects[projectId];
41
+ if (project) {
42
+ const prefix = project.sessionPrefix || projectId;
43
+ if (normalizedName === `${prefix}-orchestrator` ||
44
+ new RegExp(`^${escapeRegex(prefix)}-orchestrator-\\d+$`).test(normalizedName)) {
45
+ return true;
46
+ }
47
+ }
48
+ }
49
+ for (const [id, project] of Object.entries(config.projects)) {
50
+ const prefix = project.sessionPrefix || id;
51
+ if (normalizedName === `${prefix}-orchestrator` ||
52
+ new RegExp(`^${escapeRegex(prefix)}-orchestrator-\\d+$`).test(normalizedName)) {
53
+ return true;
54
+ }
55
+ }
56
+ return normalizedName.endsWith("-orchestrator");
57
+ }
58
+ //# sourceMappingURL=session-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-utils.js","sourceRoot":"","sources":["../../src/lib/session-utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,MAAc;IAC/D,MAAM,cAAc,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACpD,OAAO,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1E,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,qBAAqB,CACnC,MAA0B,EAC1B,WAAmB;IAEnB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAEzD,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QAC3C,IAAI,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7F,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAA0B,EAC1B,WAAmB,EACnB,SAAkB;IAElB,MAAM,cAAc,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAEpD,6FAA6F;IAC7F,0FAA0F;IAC1F,2FAA2F;IAC3F,iFAAiF;IACjF,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAEzD,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QAC3C,IAAI,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1D,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC;YAClD,IACE,cAAc,KAAK,GAAG,MAAM,eAAe;gBAC3C,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAC7E,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAEzD,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QAC3C,IACE,cAAc,KAAK,GAAG,MAAM,eAAe;YAC3C,IAAI,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAC7E,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AAClD,CAAC"}