@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.
- package/LICENSE +22 -0
- package/dist/assets/plugin-registry.json +67 -0
- package/dist/assets/scripts/athene-doctor.ps1 +352 -0
- package/dist/assets/scripts/athene-doctor.sh +552 -0
- package/dist/assets/scripts/athene-update.ps1 +224 -0
- package/dist/assets/scripts/athene-update.sh +252 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +26 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +89 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +103 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +329 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.d.ts +3 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +172 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/migrate-storage.d.ts +3 -0
- package/dist/commands/migrate-storage.d.ts.map +1 -0
- package/dist/commands/migrate-storage.js +78 -0
- package/dist/commands/migrate-storage.js.map +1 -0
- package/dist/commands/notify.d.ts +3 -0
- package/dist/commands/notify.d.ts.map +1 -0
- package/dist/commands/notify.js +143 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/open.d.ts +3 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +167 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/plugin.d.ts +3 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +462 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +143 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/report.d.ts +19 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +114 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/review-check.d.ts +3 -0
- package/dist/commands/review-check.d.ts.map +1 -0
- package/dist/commands/review-check.js +122 -0
- package/dist/commands/review-check.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +215 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +187 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +439 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +297 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/spawn.d.ts +4 -0
- package/dist/commands/spawn.d.ts.map +1 -0
- package/dist/commands/spawn.js +436 -0
- package/dist/commands/spawn.js.map +1 -0
- package/dist/commands/start.d.ts +21 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +1836 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +556 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +15 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +652 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +131 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bun-tmp-janitor.d.ts +18 -0
- package/dist/lib/bun-tmp-janitor.d.ts.map +1 -0
- package/dist/lib/bun-tmp-janitor.js +127 -0
- package/dist/lib/bun-tmp-janitor.js.map +1 -0
- package/dist/lib/caller-context.d.ts +13 -0
- package/dist/lib/caller-context.d.ts.map +1 -0
- package/dist/lib/caller-context.js +20 -0
- package/dist/lib/caller-context.js.map +1 -0
- package/dist/lib/cli-errors.d.ts +8 -0
- package/dist/lib/cli-errors.d.ts.map +1 -0
- package/dist/lib/cli-errors.js +20 -0
- package/dist/lib/cli-errors.js.map +1 -0
- package/dist/lib/completion.d.ts +13 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +428 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/composio-setup.d.ts +65 -0
- package/dist/lib/composio-setup.d.ts.map +1 -0
- package/dist/lib/composio-setup.js +3255 -0
- package/dist/lib/composio-setup.js.map +1 -0
- package/dist/lib/config-instruction.d.ts +2 -0
- package/dist/lib/config-instruction.d.ts.map +1 -0
- package/dist/lib/config-instruction.js +193 -0
- package/dist/lib/config-instruction.js.map +1 -0
- package/dist/lib/constants.d.ts +3 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +3 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/create-session-manager.d.ts +26 -0
- package/dist/lib/create-session-manager.d.ts.map +1 -0
- package/dist/lib/create-session-manager.js +55 -0
- package/dist/lib/create-session-manager.js.map +1 -0
- package/dist/lib/credential-resolver.d.ts +37 -0
- package/dist/lib/credential-resolver.d.ts.map +1 -0
- package/dist/lib/credential-resolver.js +105 -0
- package/dist/lib/credential-resolver.js.map +1 -0
- package/dist/lib/daemon.d.ts +69 -0
- package/dist/lib/daemon.d.ts.map +1 -0
- package/dist/lib/daemon.js +77 -0
- package/dist/lib/daemon.js.map +1 -0
- package/dist/lib/dashboard-rebuild.d.ts +53 -0
- package/dist/lib/dashboard-rebuild.d.ts.map +1 -0
- package/dist/lib/dashboard-rebuild.js +188 -0
- package/dist/lib/dashboard-rebuild.js.map +1 -0
- package/dist/lib/dashboard-setup.d.ts +14 -0
- package/dist/lib/dashboard-setup.d.ts.map +1 -0
- package/dist/lib/dashboard-setup.js +192 -0
- package/dist/lib/dashboard-setup.js.map +1 -0
- package/dist/lib/dashboard-url.d.ts +19 -0
- package/dist/lib/dashboard-url.d.ts.map +1 -0
- package/dist/lib/dashboard-url.js +25 -0
- package/dist/lib/dashboard-url.js.map +1 -0
- package/dist/lib/desktop-setup.d.ts +21 -0
- package/dist/lib/desktop-setup.d.ts.map +1 -0
- package/dist/lib/desktop-setup.js +556 -0
- package/dist/lib/desktop-setup.js.map +1 -0
- package/dist/lib/detect-agent.d.ts +24 -0
- package/dist/lib/detect-agent.d.ts.map +1 -0
- package/dist/lib/detect-agent.js +69 -0
- package/dist/lib/detect-agent.js.map +1 -0
- package/dist/lib/detect-env.d.ts +14 -0
- package/dist/lib/detect-env.d.ts.map +1 -0
- package/dist/lib/detect-env.js +46 -0
- package/dist/lib/detect-env.js.map +1 -0
- package/dist/lib/discord-setup.d.ts +20 -0
- package/dist/lib/discord-setup.d.ts.map +1 -0
- package/dist/lib/discord-setup.js +584 -0
- package/dist/lib/discord-setup.js.map +1 -0
- package/dist/lib/format.d.ts +11 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +116 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/git-utils.d.ts +14 -0
- package/dist/lib/git-utils.d.ts.map +1 -0
- package/dist/lib/git-utils.js +45 -0
- package/dist/lib/git-utils.js.map +1 -0
- package/dist/lib/install-helpers.d.ts +24 -0
- package/dist/lib/install-helpers.d.ts.map +1 -0
- package/dist/lib/install-helpers.js +76 -0
- package/dist/lib/install-helpers.js.map +1 -0
- package/dist/lib/lifecycle-service.d.ts +11 -0
- package/dist/lib/lifecycle-service.d.ts.map +1 -0
- package/dist/lib/lifecycle-service.js +65 -0
- package/dist/lib/lifecycle-service.js.map +1 -0
- package/dist/lib/notifier-routing.d.ts +35 -0
- package/dist/lib/notifier-routing.d.ts.map +1 -0
- package/dist/lib/notifier-routing.js +133 -0
- package/dist/lib/notifier-routing.js.map +1 -0
- package/dist/lib/notify-test.d.ts +72 -0
- package/dist/lib/notify-test.d.ts.map +1 -0
- package/dist/lib/notify-test.js +674 -0
- package/dist/lib/notify-test.js.map +1 -0
- package/dist/lib/openclaw-probe.d.ts +38 -0
- package/dist/lib/openclaw-probe.d.ts.map +1 -0
- package/dist/lib/openclaw-probe.js +146 -0
- package/dist/lib/openclaw-probe.js.map +1 -0
- package/dist/lib/openclaw-setup.d.ts +19 -0
- package/dist/lib/openclaw-setup.d.ts.map +1 -0
- package/dist/lib/openclaw-setup.js +684 -0
- package/dist/lib/openclaw-setup.js.map +1 -0
- package/dist/lib/path-equality.d.ts +29 -0
- package/dist/lib/path-equality.d.ts.map +1 -0
- package/dist/lib/path-equality.js +52 -0
- package/dist/lib/path-equality.js.map +1 -0
- package/dist/lib/plugin-marketplace.d.ts +24 -0
- package/dist/lib/plugin-marketplace.d.ts.map +1 -0
- package/dist/lib/plugin-marketplace.js +175 -0
- package/dist/lib/plugin-marketplace.js.map +1 -0
- package/dist/lib/plugin-scaffold.d.ts +14 -0
- package/dist/lib/plugin-scaffold.d.ts.map +1 -0
- package/dist/lib/plugin-scaffold.js +174 -0
- package/dist/lib/plugin-scaffold.js.map +1 -0
- package/dist/lib/plugin-store.d.ts +9 -0
- package/dist/lib/plugin-store.d.ts.map +1 -0
- package/dist/lib/plugin-store.js +121 -0
- package/dist/lib/plugin-store.js.map +1 -0
- package/dist/lib/plugins.d.ts +17 -0
- package/dist/lib/plugins.d.ts.map +1 -0
- package/dist/lib/plugins.js +65 -0
- package/dist/lib/plugins.js.map +1 -0
- package/dist/lib/portfolio-display.d.ts +10 -0
- package/dist/lib/portfolio-display.d.ts.map +1 -0
- package/dist/lib/portfolio-display.js +17 -0
- package/dist/lib/portfolio-display.js.map +1 -0
- package/dist/lib/preflight.d.ts +27 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +77 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prevent-sleep.d.ts +34 -0
- package/dist/lib/prevent-sleep.d.ts.map +1 -0
- package/dist/lib/prevent-sleep.js +65 -0
- package/dist/lib/prevent-sleep.js.map +1 -0
- package/dist/lib/project-detection.d.ts +11 -0
- package/dist/lib/project-detection.d.ts.map +1 -0
- package/dist/lib/project-detection.js +206 -0
- package/dist/lib/project-detection.js.map +1 -0
- package/dist/lib/project-resolution.d.ts +10 -0
- package/dist/lib/project-resolution.d.ts.map +1 -0
- package/dist/lib/project-resolution.js +17 -0
- package/dist/lib/project-resolution.js.map +1 -0
- package/dist/lib/project-supervisor.d.ts +28 -0
- package/dist/lib/project-supervisor.d.ts.map +1 -0
- package/dist/lib/project-supervisor.js +167 -0
- package/dist/lib/project-supervisor.js.map +1 -0
- package/dist/lib/prompts.d.ts +7 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +37 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/repo-utils.d.ts +16 -0
- package/dist/lib/repo-utils.d.ts.map +1 -0
- package/dist/lib/repo-utils.js +26 -0
- package/dist/lib/repo-utils.js.map +1 -0
- package/dist/lib/resolve-project.d.ts +113 -0
- package/dist/lib/resolve-project.d.ts.map +1 -0
- package/dist/lib/resolve-project.js +433 -0
- package/dist/lib/resolve-project.js.map +1 -0
- package/dist/lib/routes.d.ts +2 -0
- package/dist/lib/routes.d.ts.map +1 -0
- package/dist/lib/routes.js +5 -0
- package/dist/lib/routes.js.map +1 -0
- package/dist/lib/running-state.d.ts +76 -0
- package/dist/lib/running-state.d.ts.map +1 -0
- package/dist/lib/running-state.js +338 -0
- package/dist/lib/running-state.js.map +1 -0
- package/dist/lib/script-runner.d.ts +10 -0
- package/dist/lib/script-runner.d.ts.map +1 -0
- package/dist/lib/script-runner.js +189 -0
- package/dist/lib/script-runner.js.map +1 -0
- package/dist/lib/session-utils.d.ts +14 -0
- package/dist/lib/session-utils.d.ts.map +1 -0
- package/dist/lib/session-utils.js +58 -0
- package/dist/lib/session-utils.js.map +1 -0
- package/dist/lib/shell.d.ts +17 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +90 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/shutdown.d.ts +30 -0
- package/dist/lib/shutdown.d.ts.map +1 -0
- package/dist/lib/shutdown.js +177 -0
- package/dist/lib/shutdown.js.map +1 -0
- package/dist/lib/slack-setup.d.ts +17 -0
- package/dist/lib/slack-setup.d.ts.map +1 -0
- package/dist/lib/slack-setup.js +485 -0
- package/dist/lib/slack-setup.js.map +1 -0
- package/dist/lib/startup-preflight.d.ts +36 -0
- package/dist/lib/startup-preflight.d.ts.map +1 -0
- package/dist/lib/startup-preflight.js +273 -0
- package/dist/lib/startup-preflight.js.map +1 -0
- package/dist/lib/update-channel-onboarding.d.ts +52 -0
- package/dist/lib/update-channel-onboarding.d.ts.map +1 -0
- package/dist/lib/update-channel-onboarding.js +107 -0
- package/dist/lib/update-channel-onboarding.js.map +1 -0
- package/dist/lib/update-check.d.ts +161 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +504 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/web-dir.d.ts +47 -0
- package/dist/lib/web-dir.d.ts.map +1 -0
- package/dist/lib/web-dir.js +179 -0
- package/dist/lib/web-dir.js.map +1 -0
- package/dist/lib/webhook-setup.d.ts +16 -0
- package/dist/lib/webhook-setup.d.ts.map +1 -0
- package/dist/lib/webhook-setup.js +383 -0
- package/dist/lib/webhook-setup.js.map +1 -0
- package/dist/options/version.d.ts +2 -0
- package/dist/options/version.d.ts.map +1 -0
- package/dist/options/version.js +7 -0
- package/dist/options/version.js.map +1 -0
- package/dist/program.d.ts +3 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +63 -0
- package/dist/program.js.map +1 -0
- package/package.json +80 -0
- package/templates/rules/base.md +4 -0
- package/templates/rules/go.md +8 -0
- package/templates/rules/javascript.md +4 -0
- package/templates/rules/nextjs.md +7 -0
- package/templates/rules/pnpm-workspaces.md +4 -0
- package/templates/rules/python.md +8 -0
- package/templates/rules/react.md +8 -0
- 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"}
|