@isarai/maestro 0.1.7 → 0.1.8
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/dist/index.js +33 -0
- package/dist/index.js.map +3 -3
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ var LEGACY_TOKEN_PATH = path.join(MAESTRO_DIR, "api-token");
|
|
|
16
16
|
var SERVER_PATH = path.join(PACKAGE_ROOT, "dist", "server.js");
|
|
17
17
|
var DEFAULT_HOST = process.env.HOST || "0.0.0.0";
|
|
18
18
|
var DEFAULT_PORT = process.env.PORT || "4800";
|
|
19
|
+
var MIN_SERVER_NODE_VERSION = { major: 22, minor: 13, patch: 0 };
|
|
19
20
|
function ensureMaestroDir() {
|
|
20
21
|
fs.mkdirSync(MAESTRO_DIR, { recursive: true });
|
|
21
22
|
}
|
|
@@ -23,6 +24,37 @@ function fail(message) {
|
|
|
23
24
|
console.error(message);
|
|
24
25
|
process.exit(1);
|
|
25
26
|
}
|
|
27
|
+
function parseNodeVersion(version2) {
|
|
28
|
+
const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(version2.trim());
|
|
29
|
+
if (!match) return null;
|
|
30
|
+
return {
|
|
31
|
+
major: Number(match[1]),
|
|
32
|
+
minor: Number(match[2]),
|
|
33
|
+
patch: Number(match[3])
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function isNodeVersionAtLeast(current, minimum) {
|
|
37
|
+
if (current.major !== minimum.major) {
|
|
38
|
+
return current.major > minimum.major;
|
|
39
|
+
}
|
|
40
|
+
if (current.minor !== minimum.minor) {
|
|
41
|
+
return current.minor > minimum.minor;
|
|
42
|
+
}
|
|
43
|
+
return current.patch >= minimum.patch;
|
|
44
|
+
}
|
|
45
|
+
function requireSupportedServerNode() {
|
|
46
|
+
const current = parseNodeVersion(process.version);
|
|
47
|
+
const required = `v${MIN_SERVER_NODE_VERSION.major}.${MIN_SERVER_NODE_VERSION.minor}.${MIN_SERVER_NODE_VERSION.patch}`;
|
|
48
|
+
if (!current) {
|
|
49
|
+
fail(`Unable to parse Node.js version ${process.version}. Maestro requires Node.js ${required} or newer.`);
|
|
50
|
+
}
|
|
51
|
+
if (isNodeVersionAtLeast(current, MIN_SERVER_NODE_VERSION)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
fail(
|
|
55
|
+
`Maestro requires Node.js ${required} or newer because the server uses the built-in node:sqlite module. Detected ${process.version}. Upgrade Node.js and run maestro start again.`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
26
58
|
function readPackageMeta() {
|
|
27
59
|
try {
|
|
28
60
|
return JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, "utf8"));
|
|
@@ -193,6 +225,7 @@ function getStatus() {
|
|
|
193
225
|
return { running: true, pid, meta };
|
|
194
226
|
}
|
|
195
227
|
function start() {
|
|
228
|
+
requireSupportedServerNode();
|
|
196
229
|
preflight();
|
|
197
230
|
ensureMaestroDir();
|
|
198
231
|
const current = getStatus();
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFileSync, spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\");\nconst PACKAGE_JSON_PATH = path.join(PACKAGE_ROOT, \"package.json\");\nconst MAESTRO_DIR = path.join(os.homedir(), \".maestro\");\nconst PID_PATH = path.join(MAESTRO_DIR, \"server.pid\");\nconst META_PATH = path.join(MAESTRO_DIR, \"server-meta.json\");\nconst LOG_PATH = path.join(MAESTRO_DIR, \"server.log\");\nconst UPDATE_STATE_PATH = path.join(MAESTRO_DIR, \"maestro-update-state.json\");\nconst TOKEN_PATH = path.join(MAESTRO_DIR, \"token\");\nconst LEGACY_TOKEN_PATH = path.join(MAESTRO_DIR, \"api-token\");\nconst SERVER_PATH = path.join(PACKAGE_ROOT, \"dist\", \"server.js\");\nconst DEFAULT_HOST = process.env.HOST || \"0.0.0.0\";\nconst DEFAULT_PORT = process.env.PORT || \"4800\";\n\ninterface ServerMeta {\n pid: number;\n host: string;\n port: string;\n logPath: string;\n startedAt: string;\n cwd: string;\n}\n\ninterface PackageMeta {\n name: string;\n version: string;\n}\n\ninterface MaestroUpdateState {\n updating: boolean;\n lastCheckedAt: string | null;\n lastUpdatedAt: string | null;\n latestVersion: string | null;\n lastError: string | null;\n}\n\nfunction ensureMaestroDir(): void {\n fs.mkdirSync(MAESTRO_DIR, { recursive: true });\n}\n\nfunction fail(message: string): never {\n console.error(message);\n process.exit(1);\n}\n\nfunction readPackageMeta(): PackageMeta {\n try {\n return JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, \"utf8\")) as PackageMeta;\n } catch {\n fail(`Maestro package metadata not found at ${PACKAGE_JSON_PATH}`);\n }\n}\n\nfunction preflight(): void {\n if (!fs.existsSync(SERVER_PATH)) {\n fail(`Maestro server bundle not found at ${SERVER_PATH}`);\n }\n}\n\nfunction readPid(): number | null {\n try {\n const raw = fs.readFileSync(PID_PATH, \"utf8\").trim();\n if (!raw) return null;\n const pid = Number(raw);\n return Number.isInteger(pid) && pid > 0 ? pid : null;\n } catch {\n return null;\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n if (process.platform === \"linux\") {\n try {\n const stat = fs.readFileSync(`/proc/${pid}/stat`, \"utf8\");\n const fields = stat.trim().split(\" \");\n if (fields[2] === \"Z\") {\n return false;\n }\n } catch {\n // Ignore /proc read failures and fall back to kill(0).\n }\n }\n return true;\n } catch (error) {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"EPERM\"\n );\n }\n}\n\nfunction readMeta(): ServerMeta | null {\n try {\n return JSON.parse(fs.readFileSync(META_PATH, \"utf8\")) as ServerMeta;\n } catch {\n return null;\n }\n}\n\nfunction writeMeta(meta: ServerMeta): void {\n ensureMaestroDir();\n fs.writeFileSync(META_PATH, JSON.stringify(meta, null, 2) + \"\\n\", \"utf8\");\n}\n\nfunction readUpdateState(): MaestroUpdateState {\n try {\n return JSON.parse(fs.readFileSync(UPDATE_STATE_PATH, \"utf8\")) as MaestroUpdateState;\n } catch {\n return {\n updating: false,\n lastCheckedAt: null,\n lastUpdatedAt: null,\n latestVersion: null,\n lastError: null,\n };\n }\n}\n\nfunction writeUpdateState(patch: Partial<MaestroUpdateState>): void {\n ensureMaestroDir();\n const next = { ...readUpdateState(), ...patch };\n fs.writeFileSync(UPDATE_STATE_PATH, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n\nfunction cleanupState(): void {\n try {\n fs.unlinkSync(PID_PATH);\n } catch {}\n try {\n fs.unlinkSync(META_PATH);\n } catch {}\n}\n\nfunction resolveTokenPath(): string | null {\n if (fs.existsSync(TOKEN_PATH)) {\n return TOKEN_PATH;\n }\n if (fs.existsSync(LEGACY_TOKEN_PATH)) {\n return LEGACY_TOKEN_PATH;\n }\n return null;\n}\n\nfunction displayHost(host: string | undefined): string {\n if (!host || host === \"0.0.0.0\" || host === \"::\") {\n return \"127.0.0.1\";\n }\n return host;\n}\n\nfunction isContainerManagedInstall(): boolean {\n return fs.existsSync(\"/.dockerenv\") || Boolean(process.env.KUBERNETES_SERVICE_HOST);\n}\n\nfunction getNpmCommand(): string {\n const npmCommand = process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n try {\n execFileSync(npmCommand, [\"--version\"], { stdio: [\"ignore\", \"ignore\", \"ignore\"] });\n return npmCommand;\n } catch {\n fail(\"npm is required for `maestro update`, but it was not found in PATH.\");\n }\n}\n\nfunction getGlobalNpmRoot(npmCommand: string): string {\n try {\n return execFileSync(npmCommand, [\"root\", \"-g\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n fail(\"Failed to determine the global npm install directory.\");\n }\n}\n\nfunction ensureGlobalNpmInstall(npmCommand: string, packageName: string): void {\n const globalRoot = path.resolve(getGlobalNpmRoot(npmCommand));\n const expectedRoot = path.resolve(globalRoot, packageName);\n const installedRoot = path.resolve(PACKAGE_ROOT);\n\n if (installedRoot !== expectedRoot) {\n fail(\n `maestro update only supports global npm installs. Expected package path ${expectedRoot}, found ${installedRoot}.`\n );\n }\n}\n\nfunction getLatestPublishedVersion(npmCommand: string, packageName: string): string {\n try {\n const raw = execFileSync(npmCommand, [\"view\", `${packageName}@latest`, \"version\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n }).trim();\n if (!raw) {\n throw new Error(\"empty version response\");\n }\n return raw;\n } catch {\n fail(`Failed to query the latest published version for ${packageName}.`);\n }\n}\n\nfunction version(): void {\n const meta = readPackageMeta();\n console.log(meta.version);\n}\n\nfunction runNpmInstallGlobal(npmCommand: string, packageName: string, versionSpec: string): void {\n try {\n execFileSync(\n npmCommand,\n [\"install\", \"-g\", `${packageName}@${versionSpec}`],\n { stdio: \"inherit\" }\n );\n } catch {\n throw new Error(`Failed to update ${packageName}@${versionSpec}.`);\n }\n}\n\nfunction getStatus(): { running: boolean; pid: number | null; meta: ServerMeta | null } {\n const pid = readPid();\n const meta = readMeta();\n\n if (!pid) {\n return { running: false, pid: null, meta };\n }\n\n if (!isProcessAlive(pid)) {\n cleanupState();\n return { running: false, pid: null, meta };\n }\n\n return { running: true, pid, meta };\n}\n\nfunction start(): void {\n preflight();\n ensureMaestroDir();\n\n const current = getStatus();\n if (current.running) {\n const host = displayHost(current.meta?.host || DEFAULT_HOST);\n const port = current.meta?.port || DEFAULT_PORT;\n console.log(`Maestro is already running (pid ${current.pid})`);\n console.log(`URL: http://${host}:${port}`);\n console.log(`Log: ${LOG_PATH}`);\n return;\n }\n\n const out = fs.openSync(LOG_PATH, \"a\");\n const env = {\n ...process.env,\n NODE_ENV: process.env.NODE_ENV || \"production\",\n HOST: DEFAULT_HOST,\n PORT: DEFAULT_PORT,\n MAESTRO_INSTALL_ROOT: PACKAGE_ROOT,\n };\n\n const child = spawn(process.execPath, [SERVER_PATH], {\n cwd: process.cwd(),\n detached: true,\n stdio: [\"ignore\", out, out],\n env,\n });\n\n child.unref();\n\n fs.writeFileSync(PID_PATH, `${child.pid}\\n`, \"utf8\");\n writeMeta({\n pid: child.pid ?? 0,\n host: env.HOST,\n port: env.PORT,\n logPath: LOG_PATH,\n startedAt: new Date().toISOString(),\n cwd: process.cwd(),\n });\n\n console.log(`Started Maestro (pid ${child.pid})`);\n console.log(`URL: http://${displayHost(env.HOST)}:${env.PORT}`);\n console.log(`Log: ${LOG_PATH}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function stop(): Promise<void> {\n const status = getStatus();\n if (!status.running || !status.pid) {\n console.log(\"Maestro is not running\");\n cleanupState();\n return;\n }\n\n process.kill(status.pid, \"SIGTERM\");\n\n const deadline = Date.now() + 10_000;\n while (Date.now() < deadline) {\n if (!isProcessAlive(status.pid)) {\n cleanupState();\n console.log(`Stopped Maestro (pid ${status.pid})`);\n return;\n }\n await sleep(200);\n }\n\n fail(`Timed out waiting for Maestro (pid ${status.pid}) to stop`);\n}\n\nfunction status(): void {\n const current = getStatus();\n if (!current.running) {\n console.log(\"Maestro is not running\");\n return;\n }\n\n const host = displayHost(current.meta?.host || DEFAULT_HOST);\n const port = current.meta?.port || DEFAULT_PORT;\n console.log(`Maestro is running (pid ${current.pid})`);\n console.log(`URL: http://${host}:${port}`);\n console.log(`Log: ${LOG_PATH}`);\n}\n\nfunction auth(): void {\n const tokenPath = resolveTokenPath();\n if (!tokenPath) {\n fail(`Maestro API token not found at ${TOKEN_PATH}. Start Maestro first.`);\n }\n\n const token = fs.readFileSync(tokenPath, \"utf8\").trim();\n const current = getStatus();\n const host = displayHost(current.meta?.host || DEFAULT_HOST);\n const port = current.meta?.port || DEFAULT_PORT;\n\n console.log(`Server URL: http://${host}:${port}`);\n console.log(`API token: ${token}`);\n console.log(`Token path: ${tokenPath}`);\n}\n\nfunction logs(args: string[]): void {\n const follow = args.includes(\"-f\") || args.includes(\"--follow\");\n\n if (!fs.existsSync(LOG_PATH)) {\n fail(`Maestro log file not found at ${LOG_PATH}. Start Maestro first.`);\n }\n\n let position = 0;\n\n const printChunk = (start: number, end: number) => {\n if (end <= start) return;\n\n const fd = fs.openSync(LOG_PATH, \"r\");\n try {\n const length = end - start;\n const buffer = Buffer.alloc(length);\n fs.readSync(fd, buffer, 0, length, start);\n process.stdout.write(buffer);\n } finally {\n fs.closeSync(fd);\n }\n };\n\n const stat = fs.statSync(LOG_PATH);\n printChunk(0, stat.size);\n position = stat.size;\n\n if (!follow) {\n return;\n }\n\n const stopWatching = () => {\n fs.unwatchFile(LOG_PATH, onChange);\n };\n\n const onChange = (curr: fs.Stats, prev: fs.Stats) => {\n if (curr.size < position) {\n position = 0;\n }\n if (curr.size > position) {\n printChunk(position, curr.size);\n position = curr.size;\n } else if (prev.size > curr.size) {\n position = curr.size;\n }\n };\n\n process.on(\"SIGINT\", () => {\n stopWatching();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", () => {\n stopWatching();\n process.exit(0);\n });\n\n fs.watchFile(LOG_PATH, { interval: 500 }, onChange);\n}\n\nasync function update(args: string[]): Promise<void> {\n if (isContainerManagedInstall()) {\n fail(\"maestro update is only supported for bare-metal npm installs. Redeploy the container image instead.\");\n }\n\n const delayMs = Number(process.env.MAESTRO_SELF_UPDATE_DELAY_MS || \"0\");\n if (Number.isFinite(delayMs) && delayMs > 0) {\n await sleep(delayMs);\n }\n\n const meta = readPackageMeta();\n const npmCommand = getNpmCommand();\n ensureGlobalNpmInstall(npmCommand, meta.name);\n\n const latestVersion = getLatestPublishedVersion(npmCommand, meta.name);\n const currentVersion = meta.version;\n const checkOnly = args.includes(\"--check\");\n\n console.log(`Installed: ${currentVersion}`);\n console.log(`Latest: ${latestVersion}`);\n\n if (currentVersion === latestVersion) {\n console.log(\"Maestro is already up to date.\");\n return;\n }\n\n if (checkOnly) {\n console.log(`Update available: ${currentVersion} -> ${latestVersion}`);\n return;\n }\n\n const current = getStatus();\n const wasRunning = current.running;\n\n if (wasRunning) {\n console.log(\"Stopping Maestro before update...\");\n await stop();\n }\n\n console.log(`Updating ${meta.name} to ${latestVersion}...`);\n try {\n runNpmInstallGlobal(npmCommand, meta.name, \"latest\");\n } catch (error) {\n writeUpdateState({\n updating: false,\n lastError: error instanceof Error ? error.message : \"Maestro update failed.\",\n });\n if (wasRunning) {\n console.log(\"Update failed; attempting to restart the previous Maestro process...\");\n start();\n }\n fail(error instanceof Error ? error.message : \"Maestro update failed.\");\n }\n\n writeUpdateState({\n updating: false,\n lastUpdatedAt: new Date().toISOString(),\n latestVersion,\n lastError: null,\n });\n\n if (wasRunning) {\n console.log(\"Starting Maestro after update...\");\n start();\n } else {\n console.log(\"Update complete.\");\n }\n}\n\nfunction help(): void {\n console.log(\"Usage: maestro <command>\");\n console.log(\"\");\n console.log(\"Commands:\");\n console.log(\" start Start the Maestro server in the background\");\n console.log(\" stop Stop the background Maestro server\");\n console.log(\" status Show whether the Maestro server is running\");\n console.log(\" auth Print the local Maestro API token\");\n console.log(\" logs Print the Maestro server log\");\n console.log(\" version Print the installed Maestro CLI version\");\n console.log(\" update Update the globally installed Maestro CLI\");\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" maestro logs -f Follow the Maestro server log\");\n console.log(\" maestro update --check Check whether an update is available\");\n}\n\nasync function main(): Promise<void> {\n const cmd = process.argv[2];\n const args = process.argv.slice(3);\n\n switch (cmd) {\n case \"start\":\n start();\n break;\n case \"stop\":\n await stop();\n break;\n case \"status\":\n status();\n break;\n case \"auth\":\n auth();\n break;\n case \"logs\":\n logs(args);\n break;\n case \"version\":\n version();\n break;\n case \"update\":\n await update(args);\n break;\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n help();\n break;\n default:\n fail(`Unknown command: ${cmd}`);\n }\n}\n\nvoid main();\n"],
|
|
5
|
-
"mappings": "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
|
|
6
|
-
"names": ["resolve", "status", "start"]
|
|
4
|
+
"sourcesContent": ["import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFileSync, spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\");\nconst PACKAGE_JSON_PATH = path.join(PACKAGE_ROOT, \"package.json\");\nconst MAESTRO_DIR = path.join(os.homedir(), \".maestro\");\nconst PID_PATH = path.join(MAESTRO_DIR, \"server.pid\");\nconst META_PATH = path.join(MAESTRO_DIR, \"server-meta.json\");\nconst LOG_PATH = path.join(MAESTRO_DIR, \"server.log\");\nconst UPDATE_STATE_PATH = path.join(MAESTRO_DIR, \"maestro-update-state.json\");\nconst TOKEN_PATH = path.join(MAESTRO_DIR, \"token\");\nconst LEGACY_TOKEN_PATH = path.join(MAESTRO_DIR, \"api-token\");\nconst SERVER_PATH = path.join(PACKAGE_ROOT, \"dist\", \"server.js\");\nconst DEFAULT_HOST = process.env.HOST || \"0.0.0.0\";\nconst DEFAULT_PORT = process.env.PORT || \"4800\";\n\ninterface ServerMeta {\n pid: number;\n host: string;\n port: string;\n logPath: string;\n startedAt: string;\n cwd: string;\n}\n\ninterface PackageMeta {\n name: string;\n version: string;\n}\n\ninterface MaestroUpdateState {\n updating: boolean;\n lastCheckedAt: string | null;\n lastUpdatedAt: string | null;\n latestVersion: string | null;\n lastError: string | null;\n}\n\nconst MIN_SERVER_NODE_VERSION = { major: 22, minor: 13, patch: 0 } as const;\n\nfunction ensureMaestroDir(): void {\n fs.mkdirSync(MAESTRO_DIR, { recursive: true });\n}\n\nfunction fail(message: string): never {\n console.error(message);\n process.exit(1);\n}\n\nfunction parseNodeVersion(version: string): { major: number; minor: number; patch: number } | null {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)$/.exec(version.trim());\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n };\n}\n\nfunction isNodeVersionAtLeast(\n current: { major: number; minor: number; patch: number },\n minimum: { major: number; minor: number; patch: number }\n): boolean {\n if (current.major !== minimum.major) {\n return current.major > minimum.major;\n }\n if (current.minor !== minimum.minor) {\n return current.minor > minimum.minor;\n }\n return current.patch >= minimum.patch;\n}\n\nfunction requireSupportedServerNode(): void {\n const current = parseNodeVersion(process.version);\n const required = `v${MIN_SERVER_NODE_VERSION.major}.${MIN_SERVER_NODE_VERSION.minor}.${MIN_SERVER_NODE_VERSION.patch}`;\n\n if (!current) {\n fail(`Unable to parse Node.js version ${process.version}. Maestro requires Node.js ${required} or newer.`);\n }\n\n if (isNodeVersionAtLeast(current, MIN_SERVER_NODE_VERSION)) {\n return;\n }\n\n fail(\n `Maestro requires Node.js ${required} or newer because the server uses the built-in node:sqlite module. Detected ${process.version}. Upgrade Node.js and run maestro start again.`\n );\n}\n\nfunction readPackageMeta(): PackageMeta {\n try {\n return JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, \"utf8\")) as PackageMeta;\n } catch {\n fail(`Maestro package metadata not found at ${PACKAGE_JSON_PATH}`);\n }\n}\n\nfunction preflight(): void {\n if (!fs.existsSync(SERVER_PATH)) {\n fail(`Maestro server bundle not found at ${SERVER_PATH}`);\n }\n}\n\nfunction readPid(): number | null {\n try {\n const raw = fs.readFileSync(PID_PATH, \"utf8\").trim();\n if (!raw) return null;\n const pid = Number(raw);\n return Number.isInteger(pid) && pid > 0 ? pid : null;\n } catch {\n return null;\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n if (process.platform === \"linux\") {\n try {\n const stat = fs.readFileSync(`/proc/${pid}/stat`, \"utf8\");\n const fields = stat.trim().split(\" \");\n if (fields[2] === \"Z\") {\n return false;\n }\n } catch {\n // Ignore /proc read failures and fall back to kill(0).\n }\n }\n return true;\n } catch (error) {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"EPERM\"\n );\n }\n}\n\nfunction readMeta(): ServerMeta | null {\n try {\n return JSON.parse(fs.readFileSync(META_PATH, \"utf8\")) as ServerMeta;\n } catch {\n return null;\n }\n}\n\nfunction writeMeta(meta: ServerMeta): void {\n ensureMaestroDir();\n fs.writeFileSync(META_PATH, JSON.stringify(meta, null, 2) + \"\\n\", \"utf8\");\n}\n\nfunction readUpdateState(): MaestroUpdateState {\n try {\n return JSON.parse(fs.readFileSync(UPDATE_STATE_PATH, \"utf8\")) as MaestroUpdateState;\n } catch {\n return {\n updating: false,\n lastCheckedAt: null,\n lastUpdatedAt: null,\n latestVersion: null,\n lastError: null,\n };\n }\n}\n\nfunction writeUpdateState(patch: Partial<MaestroUpdateState>): void {\n ensureMaestroDir();\n const next = { ...readUpdateState(), ...patch };\n fs.writeFileSync(UPDATE_STATE_PATH, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n\nfunction cleanupState(): void {\n try {\n fs.unlinkSync(PID_PATH);\n } catch {}\n try {\n fs.unlinkSync(META_PATH);\n } catch {}\n}\n\nfunction resolveTokenPath(): string | null {\n if (fs.existsSync(TOKEN_PATH)) {\n return TOKEN_PATH;\n }\n if (fs.existsSync(LEGACY_TOKEN_PATH)) {\n return LEGACY_TOKEN_PATH;\n }\n return null;\n}\n\nfunction displayHost(host: string | undefined): string {\n if (!host || host === \"0.0.0.0\" || host === \"::\") {\n return \"127.0.0.1\";\n }\n return host;\n}\n\nfunction isContainerManagedInstall(): boolean {\n return fs.existsSync(\"/.dockerenv\") || Boolean(process.env.KUBERNETES_SERVICE_HOST);\n}\n\nfunction getNpmCommand(): string {\n const npmCommand = process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n try {\n execFileSync(npmCommand, [\"--version\"], { stdio: [\"ignore\", \"ignore\", \"ignore\"] });\n return npmCommand;\n } catch {\n fail(\"npm is required for `maestro update`, but it was not found in PATH.\");\n }\n}\n\nfunction getGlobalNpmRoot(npmCommand: string): string {\n try {\n return execFileSync(npmCommand, [\"root\", \"-g\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n fail(\"Failed to determine the global npm install directory.\");\n }\n}\n\nfunction ensureGlobalNpmInstall(npmCommand: string, packageName: string): void {\n const globalRoot = path.resolve(getGlobalNpmRoot(npmCommand));\n const expectedRoot = path.resolve(globalRoot, packageName);\n const installedRoot = path.resolve(PACKAGE_ROOT);\n\n if (installedRoot !== expectedRoot) {\n fail(\n `maestro update only supports global npm installs. Expected package path ${expectedRoot}, found ${installedRoot}.`\n );\n }\n}\n\nfunction getLatestPublishedVersion(npmCommand: string, packageName: string): string {\n try {\n const raw = execFileSync(npmCommand, [\"view\", `${packageName}@latest`, \"version\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n }).trim();\n if (!raw) {\n throw new Error(\"empty version response\");\n }\n return raw;\n } catch {\n fail(`Failed to query the latest published version for ${packageName}.`);\n }\n}\n\nfunction version(): void {\n const meta = readPackageMeta();\n console.log(meta.version);\n}\n\nfunction runNpmInstallGlobal(npmCommand: string, packageName: string, versionSpec: string): void {\n try {\n execFileSync(\n npmCommand,\n [\"install\", \"-g\", `${packageName}@${versionSpec}`],\n { stdio: \"inherit\" }\n );\n } catch {\n throw new Error(`Failed to update ${packageName}@${versionSpec}.`);\n }\n}\n\nfunction getStatus(): { running: boolean; pid: number | null; meta: ServerMeta | null } {\n const pid = readPid();\n const meta = readMeta();\n\n if (!pid) {\n return { running: false, pid: null, meta };\n }\n\n if (!isProcessAlive(pid)) {\n cleanupState();\n return { running: false, pid: null, meta };\n }\n\n return { running: true, pid, meta };\n}\n\nfunction start(): void {\n requireSupportedServerNode();\n preflight();\n ensureMaestroDir();\n\n const current = getStatus();\n if (current.running) {\n const host = displayHost(current.meta?.host || DEFAULT_HOST);\n const port = current.meta?.port || DEFAULT_PORT;\n console.log(`Maestro is already running (pid ${current.pid})`);\n console.log(`URL: http://${host}:${port}`);\n console.log(`Log: ${LOG_PATH}`);\n return;\n }\n\n const out = fs.openSync(LOG_PATH, \"a\");\n const env = {\n ...process.env,\n NODE_ENV: process.env.NODE_ENV || \"production\",\n HOST: DEFAULT_HOST,\n PORT: DEFAULT_PORT,\n MAESTRO_INSTALL_ROOT: PACKAGE_ROOT,\n };\n\n const child = spawn(process.execPath, [SERVER_PATH], {\n cwd: process.cwd(),\n detached: true,\n stdio: [\"ignore\", out, out],\n env,\n });\n\n child.unref();\n\n fs.writeFileSync(PID_PATH, `${child.pid}\\n`, \"utf8\");\n writeMeta({\n pid: child.pid ?? 0,\n host: env.HOST,\n port: env.PORT,\n logPath: LOG_PATH,\n startedAt: new Date().toISOString(),\n cwd: process.cwd(),\n });\n\n console.log(`Started Maestro (pid ${child.pid})`);\n console.log(`URL: http://${displayHost(env.HOST)}:${env.PORT}`);\n console.log(`Log: ${LOG_PATH}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function stop(): Promise<void> {\n const status = getStatus();\n if (!status.running || !status.pid) {\n console.log(\"Maestro is not running\");\n cleanupState();\n return;\n }\n\n process.kill(status.pid, \"SIGTERM\");\n\n const deadline = Date.now() + 10_000;\n while (Date.now() < deadline) {\n if (!isProcessAlive(status.pid)) {\n cleanupState();\n console.log(`Stopped Maestro (pid ${status.pid})`);\n return;\n }\n await sleep(200);\n }\n\n fail(`Timed out waiting for Maestro (pid ${status.pid}) to stop`);\n}\n\nfunction status(): void {\n const current = getStatus();\n if (!current.running) {\n console.log(\"Maestro is not running\");\n return;\n }\n\n const host = displayHost(current.meta?.host || DEFAULT_HOST);\n const port = current.meta?.port || DEFAULT_PORT;\n console.log(`Maestro is running (pid ${current.pid})`);\n console.log(`URL: http://${host}:${port}`);\n console.log(`Log: ${LOG_PATH}`);\n}\n\nfunction auth(): void {\n const tokenPath = resolveTokenPath();\n if (!tokenPath) {\n fail(`Maestro API token not found at ${TOKEN_PATH}. Start Maestro first.`);\n }\n\n const token = fs.readFileSync(tokenPath, \"utf8\").trim();\n const current = getStatus();\n const host = displayHost(current.meta?.host || DEFAULT_HOST);\n const port = current.meta?.port || DEFAULT_PORT;\n\n console.log(`Server URL: http://${host}:${port}`);\n console.log(`API token: ${token}`);\n console.log(`Token path: ${tokenPath}`);\n}\n\nfunction logs(args: string[]): void {\n const follow = args.includes(\"-f\") || args.includes(\"--follow\");\n\n if (!fs.existsSync(LOG_PATH)) {\n fail(`Maestro log file not found at ${LOG_PATH}. Start Maestro first.`);\n }\n\n let position = 0;\n\n const printChunk = (start: number, end: number) => {\n if (end <= start) return;\n\n const fd = fs.openSync(LOG_PATH, \"r\");\n try {\n const length = end - start;\n const buffer = Buffer.alloc(length);\n fs.readSync(fd, buffer, 0, length, start);\n process.stdout.write(buffer);\n } finally {\n fs.closeSync(fd);\n }\n };\n\n const stat = fs.statSync(LOG_PATH);\n printChunk(0, stat.size);\n position = stat.size;\n\n if (!follow) {\n return;\n }\n\n const stopWatching = () => {\n fs.unwatchFile(LOG_PATH, onChange);\n };\n\n const onChange = (curr: fs.Stats, prev: fs.Stats) => {\n if (curr.size < position) {\n position = 0;\n }\n if (curr.size > position) {\n printChunk(position, curr.size);\n position = curr.size;\n } else if (prev.size > curr.size) {\n position = curr.size;\n }\n };\n\n process.on(\"SIGINT\", () => {\n stopWatching();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", () => {\n stopWatching();\n process.exit(0);\n });\n\n fs.watchFile(LOG_PATH, { interval: 500 }, onChange);\n}\n\nasync function update(args: string[]): Promise<void> {\n if (isContainerManagedInstall()) {\n fail(\"maestro update is only supported for bare-metal npm installs. Redeploy the container image instead.\");\n }\n\n const delayMs = Number(process.env.MAESTRO_SELF_UPDATE_DELAY_MS || \"0\");\n if (Number.isFinite(delayMs) && delayMs > 0) {\n await sleep(delayMs);\n }\n\n const meta = readPackageMeta();\n const npmCommand = getNpmCommand();\n ensureGlobalNpmInstall(npmCommand, meta.name);\n\n const latestVersion = getLatestPublishedVersion(npmCommand, meta.name);\n const currentVersion = meta.version;\n const checkOnly = args.includes(\"--check\");\n\n console.log(`Installed: ${currentVersion}`);\n console.log(`Latest: ${latestVersion}`);\n\n if (currentVersion === latestVersion) {\n console.log(\"Maestro is already up to date.\");\n return;\n }\n\n if (checkOnly) {\n console.log(`Update available: ${currentVersion} -> ${latestVersion}`);\n return;\n }\n\n const current = getStatus();\n const wasRunning = current.running;\n\n if (wasRunning) {\n console.log(\"Stopping Maestro before update...\");\n await stop();\n }\n\n console.log(`Updating ${meta.name} to ${latestVersion}...`);\n try {\n runNpmInstallGlobal(npmCommand, meta.name, \"latest\");\n } catch (error) {\n writeUpdateState({\n updating: false,\n lastError: error instanceof Error ? error.message : \"Maestro update failed.\",\n });\n if (wasRunning) {\n console.log(\"Update failed; attempting to restart the previous Maestro process...\");\n start();\n }\n fail(error instanceof Error ? error.message : \"Maestro update failed.\");\n }\n\n writeUpdateState({\n updating: false,\n lastUpdatedAt: new Date().toISOString(),\n latestVersion,\n lastError: null,\n });\n\n if (wasRunning) {\n console.log(\"Starting Maestro after update...\");\n start();\n } else {\n console.log(\"Update complete.\");\n }\n}\n\nfunction help(): void {\n console.log(\"Usage: maestro <command>\");\n console.log(\"\");\n console.log(\"Commands:\");\n console.log(\" start Start the Maestro server in the background\");\n console.log(\" stop Stop the background Maestro server\");\n console.log(\" status Show whether the Maestro server is running\");\n console.log(\" auth Print the local Maestro API token\");\n console.log(\" logs Print the Maestro server log\");\n console.log(\" version Print the installed Maestro CLI version\");\n console.log(\" update Update the globally installed Maestro CLI\");\n console.log(\"\");\n console.log(\"Options:\");\n console.log(\" maestro logs -f Follow the Maestro server log\");\n console.log(\" maestro update --check Check whether an update is available\");\n}\n\nasync function main(): Promise<void> {\n const cmd = process.argv[2];\n const args = process.argv.slice(3);\n\n switch (cmd) {\n case \"start\":\n start();\n break;\n case \"stop\":\n await stop();\n break;\n case \"status\":\n status();\n break;\n case \"auth\":\n auth();\n break;\n case \"logs\":\n logs(args);\n break;\n case \"version\":\n version();\n break;\n case \"update\":\n await update(args);\n break;\n case \"help\":\n case \"--help\":\n case \"-h\":\n case undefined:\n help();\n break;\n default:\n fail(`Unknown command: ${cmd}`);\n }\n}\n\nvoid main();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["version", "resolve", "status", "start"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isarai/maestro",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Standalone CLI for running the Maestro server",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"typecheck": "tsc --noEmit"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=22"
|
|
33
|
+
"node": ">=22.13.0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@fastify/cors": "^10.0.0",
|