@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,105 @@
1
+ /**
2
+ * Shared credential resolver — resolves API keys from multiple sources.
3
+ *
4
+ * Resolution order per key:
5
+ * 1. Environment variable (already set in process.env)
6
+ * 2. OpenClaw config (~/.openclaw/openclaw.json → keys section)
7
+ *
8
+ * Call `applyOpenClawCredentials()` early in CLI startup so spawned agent
9
+ * sessions inherit the resolved values via the parent process environment.
10
+ */
11
+ import { existsSync, readFileSync } from "node:fs";
12
+ import { homedir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { recordActivityEvent } from "@made-by-moonlight/athene-core";
15
+ /** Keys that AO agents commonly need and OpenClaw may already store. */
16
+ const RESOLVABLE_KEYS = [
17
+ "ANTHROPIC_API_KEY",
18
+ "OPENAI_API_KEY",
19
+ "GITHUB_TOKEN",
20
+ "GOOGLE_API_KEY",
21
+ "OPENROUTER_API_KEY",
22
+ ];
23
+ function readOpenClawKeys() {
24
+ const keys = {};
25
+ const configPath = join(homedir(), ".openclaw", "openclaw.json");
26
+ if (!existsSync(configPath))
27
+ return keys;
28
+ try {
29
+ const raw = readFileSync(configPath, "utf-8");
30
+ const config = JSON.parse(raw);
31
+ // OpenClaw stores keys in a top-level "keys" object:
32
+ // { "keys": { "ANTHROPIC_API_KEY": "sk-ant-...", ... } }
33
+ const keysSection = config.keys;
34
+ if (keysSection && typeof keysSection === "object") {
35
+ for (const [k, v] of Object.entries(keysSection)) {
36
+ if (typeof v === "string" && v.length > 0) {
37
+ keys[k] = v;
38
+ }
39
+ }
40
+ }
41
+ // Also check top-level env / environment block (some OpenClaw setups):
42
+ // { "env": { "ANTHROPIC_API_KEY": "sk-ant-..." } }
43
+ const envSection = config.env ?? config.environment;
44
+ if (envSection && typeof envSection === "object") {
45
+ for (const [k, v] of Object.entries(envSection)) {
46
+ if (typeof v === "string" && v.length > 0 && !(k in keys)) {
47
+ keys[k] = v;
48
+ }
49
+ }
50
+ }
51
+ }
52
+ catch (err) {
53
+ recordActivityEvent({
54
+ source: "cli",
55
+ kind: "cli.credential_load_failed",
56
+ level: "warn",
57
+ summary: `failed to read or parse ~/.openclaw/openclaw.json`,
58
+ data: {
59
+ configPath,
60
+ errorMessage: err instanceof Error ? err.message : String(err),
61
+ },
62
+ });
63
+ // Malformed config — silently skip (event surfaces it).
64
+ }
65
+ return keys;
66
+ }
67
+ /**
68
+ * Resolve a single credential from all available sources.
69
+ * Returns the value and where it came from, or null if not found anywhere.
70
+ */
71
+ export function resolveCredential(key) {
72
+ const envValue = process.env[key];
73
+ if (envValue && envValue.length > 0) {
74
+ return { key, value: envValue, source: "env" };
75
+ }
76
+ const openclawKeys = readOpenClawKeys();
77
+ const openclawValue = openclawKeys[key];
78
+ if (openclawValue) {
79
+ return { key, value: openclawValue, source: "openclaw" };
80
+ }
81
+ return null;
82
+ }
83
+ /**
84
+ * Populate `process.env` with API keys found in OpenClaw config that are
85
+ * not already set in the environment. This makes them available to all
86
+ * spawned agent sessions (tmux inherits the parent env).
87
+ *
88
+ * Returns the list of keys that were injected from OpenClaw.
89
+ */
90
+ export function applyOpenClawCredentials() {
91
+ const openclawKeys = readOpenClawKeys();
92
+ const applied = [];
93
+ for (const key of RESOLVABLE_KEYS) {
94
+ if (process.env[key] && process.env[key].length > 0)
95
+ continue;
96
+ const value = openclawKeys[key];
97
+ if (value) {
98
+ process.env[key] = value;
99
+ applied.push({ key, source: "openclaw" });
100
+ }
101
+ }
102
+ return applied;
103
+ }
104
+ export { RESOLVABLE_KEYS };
105
+ //# sourceMappingURL=credential-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-resolver.js","sourceRoot":"","sources":["../../src/lib/credential-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Daemon attachment and lifecycle helpers.
3
+ *
4
+ * Pulls the "AO is already running" branches out of `start.ts` so the running
5
+ * vs. not-running fork in the entry command is a single decision point and
6
+ * the per-branch operations (attach, kill, dashboard cache invalidation) can
7
+ * be reused.
8
+ *
9
+ * Today this covers:
10
+ * - {@link attachToDaemon}: build a handle to an already-running daemon and
11
+ * surface dashboard cache invalidation through {@link AttachedDaemon.notifyProjectChange}.
12
+ * - {@link killExistingDaemon}: SIGTERM -> wait -> SIGKILL the daemon and
13
+ * unregister `running.json`. Used by the "Restart everything" menu option.
14
+ *
15
+ * Spawning a fresh daemon (dashboard + supervisor + register) still lives in
16
+ * `start.ts`'s `runStartup`. PR B's plan eventually folds that into a
17
+ * symmetrical `spawnDaemon` here, but doing so requires extracting last-stop
18
+ * restore + browser-open + shutdown-handler installation, which is out of
19
+ * scope for this PR.
20
+ */
21
+ import { type RunningState } from "./running-state.js";
22
+ /**
23
+ * Return value of `notifyProjectChange`. The daemon may be unreachable (user
24
+ * stopped the dashboard manually) — callers can choose to warn or throw based
25
+ * on whether they expect the daemon to be live.
26
+ */
27
+ export type NotifyResult = {
28
+ ok: true;
29
+ } | {
30
+ ok: false;
31
+ reason: string;
32
+ };
33
+ /**
34
+ * Handle for a daemon that was already running when this CLI invocation
35
+ * started. Distinguishes from a freshly-spawned daemon (which would be
36
+ * managed in-process by `runStartup` + `installShutdownHandlers`).
37
+ */
38
+ export interface AttachedDaemon {
39
+ readonly outcome: "attached";
40
+ readonly port: number;
41
+ readonly pid: number;
42
+ /**
43
+ * Tell the dashboard a project was added or changed so it reloads its
44
+ * cached config. Returns `{ ok: false }` on any error; the dashboard might
45
+ * be down (user killed it manually), so callers typically warn rather than
46
+ * throw.
47
+ */
48
+ notifyProjectChange(): Promise<NotifyResult>;
49
+ }
50
+ /**
51
+ * Build an {@link AttachedDaemon} for an existing running daemon.
52
+ * Pure — does not perform any network/filesystem I/O until the returned
53
+ * handle's methods are called.
54
+ */
55
+ export declare function attachToDaemon(running: RunningState): AttachedDaemon;
56
+ /**
57
+ * Stop a running daemon synchronously: SIGTERM, wait up to 5s, SIGKILL if
58
+ * still alive, wait another 3s. Throws if the process refuses to die.
59
+ * Always unregisters `running.json` on success so the next `athene start` can
60
+ * spawn a fresh daemon without hitting the "already running" gate.
61
+ *
62
+ * Uses {@link killProcessTree} (not raw `process.kill`) so Windows actually
63
+ * terminates the daemon and its detached grandchildren (pty-host, dashboard
64
+ * subprocess) via `taskkill /T /F`. On POSIX this is process-group aware
65
+ * with a fallback to direct kill. Both paths swallow "already dead" errors
66
+ * internally.
67
+ */
68
+ export declare function killExistingDaemon(running: RunningState): Promise<void>;
69
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9C;AAiBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CAOpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7E"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Daemon attachment and lifecycle helpers.
3
+ *
4
+ * Pulls the "AO is already running" branches out of `start.ts` so the running
5
+ * vs. not-running fork in the entry command is a single decision point and
6
+ * the per-branch operations (attach, kill, dashboard cache invalidation) can
7
+ * be reused.
8
+ *
9
+ * Today this covers:
10
+ * - {@link attachToDaemon}: build a handle to an already-running daemon and
11
+ * surface dashboard cache invalidation through {@link AttachedDaemon.notifyProjectChange}.
12
+ * - {@link killExistingDaemon}: SIGTERM -> wait -> SIGKILL the daemon and
13
+ * unregister `running.json`. Used by the "Restart everything" menu option.
14
+ *
15
+ * Spawning a fresh daemon (dashboard + supervisor + register) still lives in
16
+ * `start.ts`'s `runStartup`. PR B's plan eventually folds that into a
17
+ * symmetrical `spawnDaemon` here, but doing so requires extracting last-stop
18
+ * restore + browser-open + shutdown-handler installation, which is out of
19
+ * scope for this PR.
20
+ */
21
+ import chalk from "chalk";
22
+ import { killProcessTree, sweepDaemonChildren } from "@made-by-moonlight/athene-core";
23
+ import { unregister, waitForExit } from "./running-state.js";
24
+ async function postProjectsReload(port) {
25
+ try {
26
+ const res = await fetch(`http://localhost:${port}/api/projects/reload`, {
27
+ method: "POST",
28
+ });
29
+ if (res.ok)
30
+ return { ok: true };
31
+ return { ok: false, reason: `Dashboard reload returned ${res.status}` };
32
+ }
33
+ catch (err) {
34
+ return {
35
+ ok: false,
36
+ reason: err instanceof Error ? err.message : String(err),
37
+ };
38
+ }
39
+ }
40
+ /**
41
+ * Build an {@link AttachedDaemon} for an existing running daemon.
42
+ * Pure — does not perform any network/filesystem I/O until the returned
43
+ * handle's methods are called.
44
+ */
45
+ export function attachToDaemon(running) {
46
+ return {
47
+ outcome: "attached",
48
+ port: running.port,
49
+ pid: running.pid,
50
+ notifyProjectChange: () => postProjectsReload(running.port),
51
+ };
52
+ }
53
+ /**
54
+ * Stop a running daemon synchronously: SIGTERM, wait up to 5s, SIGKILL if
55
+ * still alive, wait another 3s. Throws if the process refuses to die.
56
+ * Always unregisters `running.json` on success so the next `athene start` can
57
+ * spawn a fresh daemon without hitting the "already running" gate.
58
+ *
59
+ * Uses {@link killProcessTree} (not raw `process.kill`) so Windows actually
60
+ * terminates the daemon and its detached grandchildren (pty-host, dashboard
61
+ * subprocess) via `taskkill /T /F`. On POSIX this is process-group aware
62
+ * with a fallback to direct kill. Both paths swallow "already dead" errors
63
+ * internally.
64
+ */
65
+ export async function killExistingDaemon(running) {
66
+ await sweepDaemonChildren({ ownerPid: running.pid });
67
+ await killProcessTree(running.pid, "SIGTERM");
68
+ if (!(await waitForExit(running.pid, 5000))) {
69
+ console.log(chalk.yellow(" Process didn't exit cleanly, sending SIGKILL..."));
70
+ await killProcessTree(running.pid, "SIGKILL");
71
+ if (!(await waitForExit(running.pid, 3000))) {
72
+ throw new Error(`Failed to stop AO process (PID ${running.pid}). Check permissions or stop it manually.`);
73
+ }
74
+ }
75
+ await unregister();
76
+ }
77
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AA2BhF,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,sBAAsB,EAAE;YACtE,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACzD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,mBAAmB,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAqB;IAC5D,MAAM,mBAAmB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,kCAAkC,OAAO,CAAC,GAAG,2CAA2C,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Dashboard cache utilities — cleans stale .next artifacts, detects
3
+ * running dashboard processes, and rebuilds production artifacts.
4
+ */
5
+ /**
6
+ * Check if the web directory is inside a node_modules tree (npm/yarn global install).
7
+ * Matches node_modules as a path segment, not just a substring.
8
+ */
9
+ export declare function isInstalledUnderNodeModules(path: string): boolean;
10
+ /**
11
+ * Guard: rebuilds are only possible from a source checkout.
12
+ * Global npm installs ship prebuilt artifacts and cannot rebuild in place.
13
+ */
14
+ export declare function assertDashboardRebuildSupported(webDir: string): void;
15
+ /**
16
+ * Find the PID of a process listening on the given port.
17
+ * Returns null if no process is found. Cross-platform via core's findPidByPort.
18
+ */
19
+ export declare function findRunningDashboardPid(port: number): Promise<string | null>;
20
+ /**
21
+ * Find live dashboard server PIDs serving from webDir for the given ports.
22
+ *
23
+ * On Unix we cross-check each port-listening PID's cwd against webDir so we
24
+ * only kill OUR dashboard. On Windows there's no cheap cwd lookup, so we
25
+ * fall back to "anything on these ports" — acceptable because rebuild is
26
+ * always invoked against a known dashboard port.
27
+ */
28
+ export declare function findRunningDashboardPidsForWebDir(webDir: string, ports: readonly number[]): Promise<string[]>;
29
+ /**
30
+ * Stop any live production dashboard serving from webDir before mutating .next.
31
+ */
32
+ export declare function stopRunningDashboardsForWebDir(webDir: string, ports: readonly number[]): Promise<void>;
33
+ /**
34
+ * Wait for a port to be free (no process listening).
35
+ * Throws if the port is still busy after the timeout.
36
+ */
37
+ export declare function waitForPortFree(port: number, timeoutMs: number): Promise<void>;
38
+ /**
39
+ * Remove the .next directory before a rebuild.
40
+ */
41
+ export declare function cleanNextCache(webDir: string): Promise<void>;
42
+ /**
43
+ * Compare the .next/AO_VERSION stamp against the current web package version.
44
+ * If they differ (or the stamp is missing), clear the .next/cache directory
45
+ * so Next.js doesn't serve stale pages after a version upgrade.
46
+ */
47
+ export declare function clearStaleCacheIfNeeded(webDir: string): Promise<void>;
48
+ /**
49
+ * Rebuild dashboard production artifacts (Next.js build + server compilation)
50
+ * from a source checkout. Throws if called from an npm global install.
51
+ */
52
+ export declare function rebuildDashboardProductionArtifacts(webDir: string, ports?: readonly number[]): Promise<void>;
53
+ //# sourceMappingURL=dashboard-rebuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-rebuild.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-rebuild.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAOpE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAElF;AAgBD;;;;;;;GAOG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC3E;AAED;;;GAGG;AACH,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,SAAS,MAAM,EAAO,GAC5B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Dashboard cache utilities — cleans stale .next artifacts, detects
3
+ * running dashboard processes, and rebuilds production artifacts.
4
+ */
5
+ import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
+ import { normalize, resolve } from "node:path";
7
+ import ora from "ora";
8
+ import { findPidByPort, isWindows, killProcessTree } from "@made-by-moonlight/athene-core";
9
+ import { exec, execSilent } from "./shell.js";
10
+ /**
11
+ * Check if the web directory is inside a node_modules tree (npm/yarn global install).
12
+ * Matches node_modules as a path segment, not just a substring.
13
+ */
14
+ export function isInstalledUnderNodeModules(path) {
15
+ return path.includes("/node_modules/") || path.includes("\\node_modules\\");
16
+ }
17
+ /**
18
+ * Guard: rebuilds are only possible from a source checkout.
19
+ * Global npm installs ship prebuilt artifacts and cannot rebuild in place.
20
+ */
21
+ export function assertDashboardRebuildSupported(webDir) {
22
+ if (isInstalledUnderNodeModules(webDir)) {
23
+ throw new Error("Dashboard rebuild is only available from a source checkout. " +
24
+ "Run `athene update`, or reinstall with `npm install -g @made-by-moonlight/athene@latest`.");
25
+ }
26
+ }
27
+ /**
28
+ * Find the PID of a process listening on the given port.
29
+ * Returns null if no process is found. Cross-platform via core's findPidByPort.
30
+ */
31
+ export async function findRunningDashboardPid(port) {
32
+ return findPidByPort(port);
33
+ }
34
+ /**
35
+ * Find the working directory of a process. Unix only (uses lsof).
36
+ * Returns null on Windows or when lookup fails — callers must tolerate that.
37
+ */
38
+ async function getProcessCwd(pid) {
39
+ if (isWindows())
40
+ return null;
41
+ const output = await execSilent("lsof", ["-a", "-p", pid, "-d", "cwd", "-Fn"]);
42
+ if (!output)
43
+ return null;
44
+ const cwdLine = output.split("\n").find((line) => line.startsWith("n"));
45
+ const cwd = cwdLine?.slice(1).trim();
46
+ return cwd ? normalize(cwd) : null;
47
+ }
48
+ /**
49
+ * Find live dashboard server PIDs serving from webDir for the given ports.
50
+ *
51
+ * On Unix we cross-check each port-listening PID's cwd against webDir so we
52
+ * only kill OUR dashboard. On Windows there's no cheap cwd lookup, so we
53
+ * fall back to "anything on these ports" — acceptable because rebuild is
54
+ * always invoked against a known dashboard port.
55
+ */
56
+ export async function findRunningDashboardPidsForWebDir(webDir, ports) {
57
+ const expectedCwd = normalize(resolve(webDir));
58
+ const pids = new Set();
59
+ for (const port of ports) {
60
+ if (isWindows()) {
61
+ const pid = await findPidByPort(port);
62
+ if (pid)
63
+ pids.add(pid);
64
+ continue;
65
+ }
66
+ const output = await execSilent("lsof", ["-ti", `:${port}`, "-sTCP:LISTEN"]);
67
+ if (!output)
68
+ continue;
69
+ for (const rawPid of output.split("\n")) {
70
+ const pid = rawPid.trim();
71
+ if (!/^\d+$/.test(pid))
72
+ continue;
73
+ const cwd = await getProcessCwd(pid);
74
+ if (cwd === expectedCwd)
75
+ pids.add(pid);
76
+ }
77
+ }
78
+ return [...pids];
79
+ }
80
+ /**
81
+ * Stop any live production dashboard serving from webDir before mutating .next.
82
+ */
83
+ export async function stopRunningDashboardsForWebDir(webDir, ports) {
84
+ const pids = await findRunningDashboardPidsForWebDir(webDir, ports);
85
+ if (pids.length === 0)
86
+ return;
87
+ console.log(`Stopping running dashboard${pids.length === 1 ? "" : "s"} before rebuilding .next (PID${pids.length === 1 ? "" : "s"} ${pids.join(", ")})...`);
88
+ for (const pid of pids) {
89
+ try {
90
+ await killProcessTree(Number(pid), "SIGTERM");
91
+ }
92
+ catch {
93
+ // Process already exited — that's fine.
94
+ }
95
+ }
96
+ for (const port of ports) {
97
+ await waitForPortFree(port, 5000);
98
+ }
99
+ }
100
+ /**
101
+ * Wait for a port to be free (no process listening).
102
+ * Throws if the port is still busy after the timeout.
103
+ */
104
+ export async function waitForPortFree(port, timeoutMs) {
105
+ const start = Date.now();
106
+ while (Date.now() - start < timeoutMs) {
107
+ const pid = await findPidByPort(port);
108
+ if (!pid)
109
+ return;
110
+ await new Promise((r) => setTimeout(r, 200));
111
+ }
112
+ throw new Error(`Port ${port} still in use after ${timeoutMs}ms — old process did not exit in time`);
113
+ }
114
+ /**
115
+ * Remove the .next directory before a rebuild.
116
+ */
117
+ export async function cleanNextCache(webDir) {
118
+ const nextDir = resolve(webDir, ".next");
119
+ if (existsSync(nextDir)) {
120
+ const spinner = ora();
121
+ spinner.start("Cleaning .next build cache");
122
+ rmSync(nextDir, { recursive: true, force: true });
123
+ spinner.succeed(`Cleaned .next build cache (${webDir})`);
124
+ }
125
+ }
126
+ /**
127
+ * Compare the .next/AO_VERSION stamp against the current web package version.
128
+ * If they differ (or the stamp is missing), clear the .next/cache directory
129
+ * so Next.js doesn't serve stale pages after a version upgrade.
130
+ */
131
+ export async function clearStaleCacheIfNeeded(webDir) {
132
+ try {
133
+ const stampPath = resolve(webDir, ".next", "AO_VERSION");
134
+ const pkgPath = resolve(webDir, "package.json");
135
+ if (!existsSync(pkgPath))
136
+ return;
137
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
138
+ const currentVersion = pkg.version;
139
+ if (!currentVersion)
140
+ return;
141
+ let needsClear = false;
142
+ if (!existsSync(stampPath)) {
143
+ needsClear = true;
144
+ }
145
+ else {
146
+ const stamp = readFileSync(stampPath, "utf8").trim();
147
+ needsClear = stamp !== currentVersion;
148
+ }
149
+ if (needsClear) {
150
+ const cacheDir = resolve(webDir, ".next", "cache");
151
+ if (existsSync(cacheDir)) {
152
+ const spinner = ora();
153
+ spinner.start("Clearing stale Next.js cache (version upgrade detected)");
154
+ rmSync(cacheDir, { recursive: true, force: true });
155
+ spinner.succeed(`Cleared stale .next cache → v${currentVersion}`);
156
+ }
157
+ // Update stamp so subsequent starts skip the check
158
+ const nextDir = resolve(webDir, ".next");
159
+ if (existsSync(nextDir)) {
160
+ writeFileSync(stampPath, currentVersion, "utf8");
161
+ }
162
+ }
163
+ }
164
+ catch (err) {
165
+ // Best-effort cache cleanup — never prevent dashboard from starting
166
+ console.debug("Cache version check skipped:", err);
167
+ }
168
+ }
169
+ /**
170
+ * Rebuild dashboard production artifacts (Next.js build + server compilation)
171
+ * from a source checkout. Throws if called from an npm global install.
172
+ */
173
+ export async function rebuildDashboardProductionArtifacts(webDir, ports = []) {
174
+ assertDashboardRebuildSupported(webDir);
175
+ await stopRunningDashboardsForWebDir(webDir, ports);
176
+ await cleanNextCache(webDir);
177
+ const workspaceRoot = resolve(webDir, "../..");
178
+ const spinner = ora("Rebuilding dashboard production artifacts").start();
179
+ try {
180
+ await exec("pnpm", ["build"], { cwd: workspaceRoot });
181
+ spinner.succeed("Rebuilt dashboard production artifacts");
182
+ }
183
+ catch (error) {
184
+ spinner.fail("Dashboard rebuild failed");
185
+ throw new Error("Failed to rebuild dashboard production artifacts. Run `pnpm build` and try again.", { cause: error });
186
+ }
187
+ }
188
+ //# sourceMappingURL=dashboard-rebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-rebuild.js","sourceRoot":"","sources":["../../src/lib/dashboard-rebuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface DashboardSetupOptions {
2
+ limit?: string;
3
+ refresh?: boolean;
4
+ status?: boolean;
5
+ force?: boolean;
6
+ nonInteractive?: boolean;
7
+ routingPreset?: string;
8
+ }
9
+ export declare class DashboardSetupError extends Error {
10
+ readonly exitCode: number;
11
+ constructor(message: string, exitCode?: number);
12
+ }
13
+ export declare function runDashboardSetupAction(opts: DashboardSetupOptions): Promise<void>;
14
+ //# sourceMappingURL=dashboard-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-setup.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard-setup.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAiBD,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,QAAQ;gBADxB,OAAO,EAAE,MAAM,EACC,QAAQ,SAAI;CAK/B;AA0MD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCxF"}