@isarai/maestro 0.1.7 → 0.1.9

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/assets/setup.sh CHANGED
@@ -4,13 +4,111 @@
4
4
  W=${COLUMNS:-$(tput cols 2>/dev/null || echo 40)}
5
5
  BANNER=$(printf '%*s' "$W" '' | tr ' ' '=')
6
6
 
7
+ have_cmd() {
8
+ command -v "$1" >/dev/null 2>&1
9
+ }
10
+
11
+ prompt_yes_no() {
12
+ local prompt=$1
13
+ local answer
14
+ read -rp "$prompt" answer
15
+ [[ "$answer" =~ ^[Yy]$ ]]
16
+ }
17
+
18
+ run_step() {
19
+ local label=$1
20
+ shift
21
+
22
+ echo "Running: $label"
23
+ echo ""
24
+ "$@" || echo "($label exited with error)"
25
+ }
26
+
27
+ install_with_npm() {
28
+ local package_name=$1
29
+ local binary=$2
30
+
31
+ if ! have_cmd npm; then
32
+ echo "npm not found. Install Node.js/npm first, then rerun \`maestro onboard\`."
33
+ return 1
34
+ fi
35
+
36
+ run_step "npm install -g ${package_name}@latest" npm install -g "${package_name}@latest"
37
+
38
+ if have_cmd "$binary"; then
39
+ echo "$binary installed successfully."
40
+ return 0
41
+ fi
42
+
43
+ echo "$binary is still not available after the npm install attempt."
44
+ return 1
45
+ }
46
+
47
+ install_gh() {
48
+ if have_cmd gh; then
49
+ return 0
50
+ fi
51
+
52
+ if have_cmd brew; then
53
+ run_step "brew install gh" brew install gh
54
+ elif have_cmd apt-get; then
55
+ run_step "apt-get update" apt-get update
56
+ run_step "apt-get install -y gh" apt-get install -y gh
57
+ elif have_cmd dnf; then
58
+ run_step "dnf install -y gh" dnf install -y gh
59
+ elif have_cmd yum; then
60
+ run_step "yum install -y gh" yum install -y gh
61
+ elif have_cmd pacman; then
62
+ run_step "pacman -Sy --noconfirm github-cli" pacman -Sy --noconfirm github-cli
63
+ else
64
+ echo "GitHub CLI installation is not automated on this system."
65
+ echo "Install it manually, then rerun \`maestro onboard\`."
66
+ return 1
67
+ fi
68
+
69
+ if have_cmd gh; then
70
+ echo "GitHub CLI installed successfully."
71
+ return 0
72
+ fi
73
+
74
+ echo "GitHub CLI is still not available after the install attempt."
75
+ return 1
76
+ }
77
+
78
+ install_claude() {
79
+ install_with_npm "@anthropic-ai/claude-code" "claude"
80
+ }
81
+
82
+ install_codex() {
83
+ install_with_npm "@openai/codex" "codex"
84
+ }
85
+
86
+ ensure_tool() {
87
+ local binary=$1
88
+ local label=$2
89
+ local installer=$3
90
+
91
+ if have_cmd "$binary"; then
92
+ echo "$label is already installed."
93
+ return 0
94
+ fi
95
+
96
+ echo "$label is not installed."
97
+ if ! prompt_yes_no "Install $label now? (y/n) "; then
98
+ echo "Skipping $label installation."
99
+ return 1
100
+ fi
101
+
102
+ "$installer"
103
+ }
104
+
7
105
  echo "$BANNER"
8
106
  echo " Maestro First-Run Setup"
9
107
  echo "$BANNER"
10
108
  echo ""
11
109
 
12
110
  # --- GitHub CLI ---
13
- if command -v gh &>/dev/null; then
111
+ if ensure_tool gh "GitHub CLI" install_gh; then
14
112
  echo "Checking GitHub CLI authentication..."
15
113
  if gh auth status >/dev/null 2>&1; then
16
114
  echo "GitHub CLI is already authenticated."
@@ -18,17 +116,18 @@ if command -v gh &>/dev/null; then
18
116
  echo "GitHub CLI is not authenticated."
19
117
  echo "Running: gh auth login"
20
118
  echo ""
21
- printf '%s' "$GH_PAT" | gh auth login --with-token || echo "(gh auth login exited with error)"
119
+ if [[ -n "${GH_PAT:-}" ]]; then
120
+ printf '%s' "$GH_PAT" | gh auth login --with-token || echo "(gh auth login exited with error)"
121
+ else
122
+ gh auth login || echo "(gh auth login exited with error)"
123
+ fi
22
124
  fi
23
- else
24
- echo "GitHub CLI (gh) not found, skipping."
25
125
  fi
26
126
  echo ""
27
127
 
28
128
  # --- Claude Code ---
29
- read -rp "Do you want to use Claude Code? (y/n) " use_claude
30
- if [[ "$use_claude" =~ ^[Yy]$ ]]; then
31
- if command -v claude &>/dev/null; then
129
+ if prompt_yes_no "Do you want to use Claude Code? (y/n) "; then
130
+ if ensure_tool claude "Claude Code CLI" install_claude; then
32
131
  echo "Checking Claude Code authentication..."
33
132
  if claude auth status >/dev/null 2>&1; then
34
133
  echo "Claude Code is already authenticated."
@@ -39,21 +138,21 @@ if [[ "$use_claude" =~ ^[Yy]$ ]]; then
39
138
  echo ""
40
139
  claude setup-token || echo "(claude setup-token exited with error)"
41
140
  fi
42
- else
43
- echo "Claude Code CLI not found, skipping."
44
141
  fi
45
142
  fi
46
143
  echo ""
47
144
 
48
145
  # --- Codex ---
49
- read -rp "Do you want to use Codex? (y/n) " use_codex
50
- if [[ "$use_codex" =~ ^[Yy]$ ]]; then
51
- if command -v codex &>/dev/null; then
52
- echo "Running: codex login"
53
- echo ""
54
- codex login --device-auth || echo "(codex login exited with error)"
55
- else
56
- echo "Codex CLI not found, skipping."
146
+ if prompt_yes_no "Do you want to use Codex? (y/n) "; then
147
+ if ensure_tool codex "Codex CLI" install_codex; then
148
+ echo "Checking Codex authentication..."
149
+ if codex login status >/dev/null 2>&1; then
150
+ echo "Codex is already authenticated."
151
+ else
152
+ echo "Running: codex login --device-auth"
153
+ echo ""
154
+ codex login --device-auth || echo "(codex login --device-auth exited with error)"
155
+ fi
57
156
  fi
58
157
  fi
59
158
  echo ""
package/dist/index.js CHANGED
@@ -14,8 +14,10 @@ var UPDATE_STATE_PATH = path.join(MAESTRO_DIR, "maestro-update-state.json");
14
14
  var TOKEN_PATH = path.join(MAESTRO_DIR, "token");
15
15
  var LEGACY_TOKEN_PATH = path.join(MAESTRO_DIR, "api-token");
16
16
  var SERVER_PATH = path.join(PACKAGE_ROOT, "dist", "server.js");
17
+ var ONBOARD_SCRIPT_PATH = path.join(PACKAGE_ROOT, "assets", "setup.sh");
17
18
  var DEFAULT_HOST = process.env.HOST || "0.0.0.0";
18
19
  var DEFAULT_PORT = process.env.PORT || "4800";
20
+ var MIN_SERVER_NODE_VERSION = { major: 22, minor: 13, patch: 0 };
19
21
  function ensureMaestroDir() {
20
22
  fs.mkdirSync(MAESTRO_DIR, { recursive: true });
21
23
  }
@@ -23,6 +25,37 @@ function fail(message) {
23
25
  console.error(message);
24
26
  process.exit(1);
25
27
  }
28
+ function parseNodeVersion(version2) {
29
+ const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(version2.trim());
30
+ if (!match) return null;
31
+ return {
32
+ major: Number(match[1]),
33
+ minor: Number(match[2]),
34
+ patch: Number(match[3])
35
+ };
36
+ }
37
+ function isNodeVersionAtLeast(current, minimum) {
38
+ if (current.major !== minimum.major) {
39
+ return current.major > minimum.major;
40
+ }
41
+ if (current.minor !== minimum.minor) {
42
+ return current.minor > minimum.minor;
43
+ }
44
+ return current.patch >= minimum.patch;
45
+ }
46
+ function requireSupportedServerNode() {
47
+ const current = parseNodeVersion(process.version);
48
+ const required = `v${MIN_SERVER_NODE_VERSION.major}.${MIN_SERVER_NODE_VERSION.minor}.${MIN_SERVER_NODE_VERSION.patch}`;
49
+ if (!current) {
50
+ fail(`Unable to parse Node.js version ${process.version}. Maestro requires Node.js ${required} or newer.`);
51
+ }
52
+ if (isNodeVersionAtLeast(current, MIN_SERVER_NODE_VERSION)) {
53
+ return;
54
+ }
55
+ fail(
56
+ `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.`
57
+ );
58
+ }
26
59
  function readPackageMeta() {
27
60
  try {
28
61
  return JSON.parse(fs.readFileSync(PACKAGE_JSON_PATH, "utf8"));
@@ -35,6 +68,11 @@ function preflight() {
35
68
  fail(`Maestro server bundle not found at ${SERVER_PATH}`);
36
69
  }
37
70
  }
71
+ function onboardPreflight() {
72
+ if (!fs.existsSync(ONBOARD_SCRIPT_PATH)) {
73
+ fail(`Maestro onboarding script not found at ${ONBOARD_SCRIPT_PATH}`);
74
+ }
75
+ }
38
76
  function readPid() {
39
77
  try {
40
78
  const raw = fs.readFileSync(PID_PATH, "utf8").trim();
@@ -193,6 +231,7 @@ function getStatus() {
193
231
  return { running: true, pid, meta };
194
232
  }
195
233
  function start() {
234
+ requireSupportedServerNode();
196
235
  preflight();
197
236
  ensureMaestroDir();
198
237
  const current = getStatus();
@@ -280,6 +319,24 @@ function auth() {
280
319
  console.log(`API token: ${token}`);
281
320
  console.log(`Token path: ${tokenPath}`);
282
321
  }
322
+ function onboard() {
323
+ onboardPreflight();
324
+ try {
325
+ fs.chmodSync(ONBOARD_SCRIPT_PATH, 493);
326
+ } catch {
327
+ }
328
+ try {
329
+ execFileSync("bash", [ONBOARD_SCRIPT_PATH], {
330
+ stdio: "inherit",
331
+ env: process.env
332
+ });
333
+ } catch (error) {
334
+ if (error && typeof error === "object" && "status" in error && typeof error.status === "number" && error.status > 0) {
335
+ process.exit(error.status);
336
+ }
337
+ fail(error instanceof Error ? error.message : "Maestro onboarding failed.");
338
+ }
339
+ }
283
340
  function logs(args) {
284
341
  const follow = args.includes("-f") || args.includes("--follow");
285
342
  if (!fs.existsSync(LOG_PATH)) {
@@ -393,6 +450,7 @@ function help() {
393
450
  console.log(" stop Stop the background Maestro server");
394
451
  console.log(" status Show whether the Maestro server is running");
395
452
  console.log(" auth Print the local Maestro API token");
453
+ console.log(" onboard Check/install CLI dependencies and authenticate them");
396
454
  console.log(" logs Print the Maestro server log");
397
455
  console.log(" version Print the installed Maestro CLI version");
398
456
  console.log(" update Update the globally installed Maestro CLI");
@@ -417,6 +475,9 @@ async function main() {
417
475
  case "auth":
418
476
  auth();
419
477
  break;
478
+ case "onboard":
479
+ onboard();
480
+ break;
420
481
  case "logs":
421
482
  logs(args);
422
483
  break;
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 ONBOARD_SCRIPT_PATH = path.join(PACKAGE_ROOT, \"assets\", \"setup.sh\");\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 onboardPreflight(): void {\n if (!fs.existsSync(ONBOARD_SCRIPT_PATH)) {\n fail(`Maestro onboarding script not found at ${ONBOARD_SCRIPT_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 onboard(): void {\n onboardPreflight();\n\n try {\n fs.chmodSync(ONBOARD_SCRIPT_PATH, 0o755);\n } catch {\n // Ignore chmod failures and let execution report the real problem.\n }\n\n try {\n execFileSync(\"bash\", [ONBOARD_SCRIPT_PATH], {\n stdio: \"inherit\",\n env: process.env,\n });\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n typeof error.status === \"number\" &&\n error.status > 0\n ) {\n process.exit(error.status);\n }\n\n fail(error instanceof Error ? error.message : \"Maestro onboarding failed.\");\n }\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(\" onboard Check/install CLI dependencies and authenticate them\");\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 \"onboard\":\n onboard();\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": ";AAAA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,cAAc,aAAa;AACpC,SAAS,qBAAqB;AAE9B,IAAM,eAAoB,aAAa,aAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,IAAI;AACpF,IAAM,oBAAyB,UAAK,cAAc,cAAc;AAChE,IAAM,cAAmB,UAAQ,WAAQ,GAAG,UAAU;AACtD,IAAM,WAAgB,UAAK,aAAa,YAAY;AACpD,IAAM,YAAiB,UAAK,aAAa,kBAAkB;AAC3D,IAAM,WAAgB,UAAK,aAAa,YAAY;AACpD,IAAM,oBAAyB,UAAK,aAAa,2BAA2B;AAC5E,IAAM,aAAkB,UAAK,aAAa,OAAO;AACjD,IAAM,oBAAyB,UAAK,aAAa,WAAW;AAC5D,IAAM,cAAmB,UAAK,cAAc,QAAQ,WAAW;AAC/D,IAAM,sBAA2B,UAAK,cAAc,UAAU,UAAU;AACxE,IAAM,eAAe,QAAQ,IAAI,QAAQ;AACzC,IAAM,eAAe,QAAQ,IAAI,QAAQ;AAwBzC,IAAM,0BAA0B,EAAE,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE;AAEjE,SAAS,mBAAyB;AAChC,EAAG,aAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/C;AAEA,SAAS,KAAK,SAAwB;AACpC,UAAQ,MAAM,OAAO;AACrB,UAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,iBAAiBA,UAAyE;AACjG,QAAM,QAAQ,0BAA0B,KAAKA,SAAQ,KAAK,CAAC;AAC3D,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,IACtB,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,IACtB,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,EACxB;AACF;AAEA,SAAS,qBACP,SACA,SACS;AACT,MAAI,QAAQ,UAAU,QAAQ,OAAO;AACnC,WAAO,QAAQ,QAAQ,QAAQ;AAAA,EACjC;AACA,MAAI,QAAQ,UAAU,QAAQ,OAAO;AACnC,WAAO,QAAQ,QAAQ,QAAQ;AAAA,EACjC;AACA,SAAO,QAAQ,SAAS,QAAQ;AAClC;AAEA,SAAS,6BAAmC;AAC1C,QAAM,UAAU,iBAAiB,QAAQ,OAAO;AAChD,QAAM,WAAW,IAAI,wBAAwB,KAAK,IAAI,wBAAwB,KAAK,IAAI,wBAAwB,KAAK;AAEpH,MAAI,CAAC,SAAS;AACZ,SAAK,mCAAmC,QAAQ,OAAO,8BAA8B,QAAQ,YAAY;AAAA,EAC3G;AAEA,MAAI,qBAAqB,SAAS,uBAAuB,GAAG;AAC1D;AAAA,EACF;AAEA;AAAA,IACE,4BAA4B,QAAQ,+EAA+E,QAAQ,OAAO;AAAA,EACpI;AACF;AAEA,SAAS,kBAA+B;AACtC,MAAI;AACF,WAAO,KAAK,MAAS,gBAAa,mBAAmB,MAAM,CAAC;AAAA,EAC9D,QAAQ;AACN,SAAK,yCAAyC,iBAAiB,EAAE;AAAA,EACnE;AACF;AAEA,SAAS,YAAkB;AACzB,MAAI,CAAI,cAAW,WAAW,GAAG;AAC/B,SAAK,sCAAsC,WAAW,EAAE;AAAA,EAC1D;AACF;AAEA,SAAS,mBAAyB;AAChC,MAAI,CAAI,cAAW,mBAAmB,GAAG;AACvC,SAAK,0CAA0C,mBAAmB,EAAE;AAAA,EACtE;AACF;AAEA,SAAS,UAAyB;AAChC,MAAI;AACF,UAAM,MAAS,gBAAa,UAAU,MAAM,EAAE,KAAK;AACnD,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,MAAM,OAAO,GAAG;AACtB,WAAO,OAAO,UAAU,GAAG,KAAK,MAAM,IAAI,MAAM;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,KAAsB;AAC5C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,QAAI,QAAQ,aAAa,SAAS;AAChC,UAAI;AACF,cAAM,OAAU,gBAAa,SAAS,GAAG,SAAS,MAAM;AACxD,cAAM,SAAS,KAAK,KAAK,EAAE,MAAM,GAAG;AACpC,YAAI,OAAO,CAAC,MAAM,KAAK;AACrB,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SACA,OAAO,UAAU,YACjB,UAAU,SACT,MAAgC,SAAS;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,SAAS,WAA8B;AACrC,MAAI;AACF,WAAO,KAAK,MAAS,gBAAa,WAAW,MAAM,CAAC;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,MAAwB;AACzC,mBAAiB;AACjB,EAAG,iBAAc,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM;AAC1E;AAEA,SAAS,kBAAsC;AAC7C,MAAI;AACF,WAAO,KAAK,MAAS,gBAAa,mBAAmB,MAAM,CAAC;AAAA,EAC9D,QAAQ;AACN,WAAO;AAAA,MACL,UAAU;AAAA,MACV,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAA0C;AAClE,mBAAiB;AACjB,QAAM,OAAO,EAAE,GAAG,gBAAgB,GAAG,GAAG,MAAM;AAC9C,EAAG,iBAAc,mBAAmB,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM;AAClF;AAEA,SAAS,eAAqB;AAC5B,MAAI;AACF,IAAG,cAAW,QAAQ;AAAA,EACxB,QAAQ;AAAA,EAAC;AACT,MAAI;AACF,IAAG,cAAW,SAAS;AAAA,EACzB,QAAQ;AAAA,EAAC;AACX;AAEA,SAAS,mBAAkC;AACzC,MAAO,cAAW,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAO,cAAW,iBAAiB,GAAG;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAkC;AACrD,MAAI,CAAC,QAAQ,SAAS,aAAa,SAAS,MAAM;AAChD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,4BAAqC;AAC5C,SAAU,cAAW,aAAa,KAAK,QAAQ,QAAQ,IAAI,uBAAuB;AACpF;AAEA,SAAS,gBAAwB;AAC/B,QAAM,aAAa,QAAQ,aAAa,UAAU,YAAY;AAC9D,MAAI;AACF,iBAAa,YAAY,CAAC,WAAW,GAAG,EAAE,OAAO,CAAC,UAAU,UAAU,QAAQ,EAAE,CAAC;AACjF,WAAO;AAAA,EACT,QAAQ;AACN,SAAK,qEAAqE;AAAA,EAC5E;AACF;AAEA,SAAS,iBAAiB,YAA4B;AACpD,MAAI;AACF,WAAO,aAAa,YAAY,CAAC,QAAQ,IAAI,GAAG;AAAA,MAC9C,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,SAAK,uDAAuD;AAAA,EAC9D;AACF;AAEA,SAAS,uBAAuB,YAAoB,aAA2B;AAC7E,QAAM,aAAkB,aAAQ,iBAAiB,UAAU,CAAC;AAC5D,QAAM,eAAoB,aAAQ,YAAY,WAAW;AACzD,QAAM,gBAAqB,aAAQ,YAAY;AAE/C,MAAI,kBAAkB,cAAc;AAClC;AAAA,MACE,2EAA2E,YAAY,WAAW,aAAa;AAAA,IACjH;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,YAAoB,aAA6B;AAClF,MAAI;AACF,UAAM,MAAM,aAAa,YAAY,CAAC,QAAQ,GAAG,WAAW,WAAW,SAAS,GAAG;AAAA,MACjF,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,SAAS;AAAA,IACrC,CAAC,EAAE,KAAK;AACR,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,WAAO;AAAA,EACT,QAAQ;AACN,SAAK,oDAAoD,WAAW,GAAG;AAAA,EACzE;AACF;AAEA,SAAS,UAAgB;AACvB,QAAM,OAAO,gBAAgB;AAC7B,UAAQ,IAAI,KAAK,OAAO;AAC1B;AAEA,SAAS,oBAAoB,YAAoB,aAAqB,aAA2B;AAC/F,MAAI;AACF;AAAA,MACE;AAAA,MACA,CAAC,WAAW,MAAM,GAAG,WAAW,IAAI,WAAW,EAAE;AAAA,MACjD,EAAE,OAAO,UAAU;AAAA,IACrB;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,oBAAoB,WAAW,IAAI,WAAW,GAAG;AAAA,EACnE;AACF;AAEA,SAAS,YAA+E;AACtF,QAAM,MAAM,QAAQ;AACpB,QAAM,OAAO,SAAS;AAEtB,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,SAAS,OAAO,KAAK,MAAM,KAAK;AAAA,EAC3C;AAEA,MAAI,CAAC,eAAe,GAAG,GAAG;AACxB,iBAAa;AACb,WAAO,EAAE,SAAS,OAAO,KAAK,MAAM,KAAK;AAAA,EAC3C;AAEA,SAAO,EAAE,SAAS,MAAM,KAAK,KAAK;AACpC;AAEA,SAAS,QAAc;AACrB,6BAA2B;AAC3B,YAAU;AACV,mBAAiB;AAEjB,QAAM,UAAU,UAAU;AAC1B,MAAI,QAAQ,SAAS;AACnB,UAAM,OAAO,YAAY,QAAQ,MAAM,QAAQ,YAAY;AAC3D,UAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,YAAQ,IAAI,mCAAmC,QAAQ,GAAG,GAAG;AAC7D,YAAQ,IAAI,eAAe,IAAI,IAAI,IAAI,EAAE;AACzC,YAAQ,IAAI,QAAQ,QAAQ,EAAE;AAC9B;AAAA,EACF;AAEA,QAAM,MAAS,YAAS,UAAU,GAAG;AACrC,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ;AAAA,IACX,UAAU,QAAQ,IAAI,YAAY;AAAA,IAClC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,sBAAsB;AAAA,EACxB;AAEA,QAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,WAAW,GAAG;AAAA,IACnD,KAAK,QAAQ,IAAI;AAAA,IACjB,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,QAAM,MAAM;AAEZ,EAAG,iBAAc,UAAU,GAAG,MAAM,GAAG;AAAA,GAAM,MAAM;AACnD,YAAU;AAAA,IACR,KAAK,MAAM,OAAO;AAAA,IAClB,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AAED,UAAQ,IAAI,wBAAwB,MAAM,GAAG,GAAG;AAChD,UAAQ,IAAI,eAAe,YAAY,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAC9D,UAAQ,IAAI,QAAQ,QAAQ,EAAE;AAChC;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,eAAe,OAAsB;AACnC,QAAMC,UAAS,UAAU;AACzB,MAAI,CAACA,QAAO,WAAW,CAACA,QAAO,KAAK;AAClC,YAAQ,IAAI,wBAAwB;AACpC,iBAAa;AACb;AAAA,EACF;AAEA,UAAQ,KAAKA,QAAO,KAAK,SAAS;AAElC,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI,CAAC,eAAeA,QAAO,GAAG,GAAG;AAC/B,mBAAa;AACb,cAAQ,IAAI,wBAAwBA,QAAO,GAAG,GAAG;AACjD;AAAA,IACF;AACA,UAAM,MAAM,GAAG;AAAA,EACjB;AAEA,OAAK,sCAAsCA,QAAO,GAAG,WAAW;AAClE;AAEA,SAAS,SAAe;AACtB,QAAM,UAAU,UAAU;AAC1B,MAAI,CAAC,QAAQ,SAAS;AACpB,YAAQ,IAAI,wBAAwB;AACpC;AAAA,EACF;AAEA,QAAM,OAAO,YAAY,QAAQ,MAAM,QAAQ,YAAY;AAC3D,QAAM,OAAO,QAAQ,MAAM,QAAQ;AACnC,UAAQ,IAAI,2BAA2B,QAAQ,GAAG,GAAG;AACrD,UAAQ,IAAI,eAAe,IAAI,IAAI,IAAI,EAAE;AACzC,UAAQ,IAAI,QAAQ,QAAQ,EAAE;AAChC;AAEA,SAAS,OAAa;AACpB,QAAM,YAAY,iBAAiB;AACnC,MAAI,CAAC,WAAW;AACd,SAAK,kCAAkC,UAAU,wBAAwB;AAAA,EAC3E;AAEA,QAAM,QAAW,gBAAa,WAAW,MAAM,EAAE,KAAK;AACtD,QAAM,UAAU,UAAU;AAC1B,QAAM,OAAO,YAAY,QAAQ,MAAM,QAAQ,YAAY;AAC3D,QAAM,OAAO,QAAQ,MAAM,QAAQ;AAEnC,UAAQ,IAAI,sBAAsB,IAAI,IAAI,IAAI,EAAE;AAChD,UAAQ,IAAI,cAAc,KAAK,EAAE;AACjC,UAAQ,IAAI,eAAe,SAAS,EAAE;AACxC;AAEA,SAAS,UAAgB;AACvB,mBAAiB;AAEjB,MAAI;AACF,IAAG,aAAU,qBAAqB,GAAK;AAAA,EACzC,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,iBAAa,QAAQ,CAAC,mBAAmB,GAAG;AAAA,MAC1C,OAAO;AAAA,MACP,KAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QACE,SACA,OAAO,UAAU,YACjB,YAAY,SACZ,OAAO,MAAM,WAAW,YACxB,MAAM,SAAS,GACf;AACA,cAAQ,KAAK,MAAM,MAAM;AAAA,IAC3B;AAEA,SAAK,iBAAiB,QAAQ,MAAM,UAAU,4BAA4B;AAAA,EAC5E;AACF;AAEA,SAAS,KAAK,MAAsB;AAClC,QAAM,SAAS,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU;AAE9D,MAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,SAAK,iCAAiC,QAAQ,wBAAwB;AAAA,EACxE;AAEA,MAAI,WAAW;AAEf,QAAM,aAAa,CAACC,QAAe,QAAgB;AACjD,QAAI,OAAOA,OAAO;AAElB,UAAM,KAAQ,YAAS,UAAU,GAAG;AACpC,QAAI;AACF,YAAM,SAAS,MAAMA;AACrB,YAAM,SAAS,OAAO,MAAM,MAAM;AAClC,MAAG,YAAS,IAAI,QAAQ,GAAG,QAAQA,MAAK;AACxC,cAAQ,OAAO,MAAM,MAAM;AAAA,IAC7B,UAAE;AACA,MAAG,aAAU,EAAE;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,OAAU,YAAS,QAAQ;AACjC,aAAW,GAAG,KAAK,IAAI;AACvB,aAAW,KAAK;AAEhB,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,IAAG,eAAY,UAAU,QAAQ;AAAA,EACnC;AAEA,QAAM,WAAW,CAAC,MAAgB,SAAmB;AACnD,QAAI,KAAK,OAAO,UAAU;AACxB,iBAAW;AAAA,IACb;AACA,QAAI,KAAK,OAAO,UAAU;AACxB,iBAAW,UAAU,KAAK,IAAI;AAC9B,iBAAW,KAAK;AAAA,IAClB,WAAW,KAAK,OAAO,KAAK,MAAM;AAChC,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,UAAQ,GAAG,UAAU,MAAM;AACzB,iBAAa;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,WAAW,MAAM;AAC1B,iBAAa;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,EAAG,aAAU,UAAU,EAAE,UAAU,IAAI,GAAG,QAAQ;AACpD;AAEA,eAAe,OAAO,MAA+B;AACnD,MAAI,0BAA0B,GAAG;AAC/B,SAAK,qGAAqG;AAAA,EAC5G;AAEA,QAAM,UAAU,OAAO,QAAQ,IAAI,gCAAgC,GAAG;AACtE,MAAI,OAAO,SAAS,OAAO,KAAK,UAAU,GAAG;AAC3C,UAAM,MAAM,OAAO;AAAA,EACrB;AAEA,QAAM,OAAO,gBAAgB;AAC7B,QAAM,aAAa,cAAc;AACjC,yBAAuB,YAAY,KAAK,IAAI;AAE5C,QAAM,gBAAgB,0BAA0B,YAAY,KAAK,IAAI;AACrE,QAAM,iBAAiB,KAAK;AAC5B,QAAM,YAAY,KAAK,SAAS,SAAS;AAEzC,UAAQ,IAAI,cAAc,cAAc,EAAE;AAC1C,UAAQ,IAAI,WAAW,aAAa,EAAE;AAEtC,MAAI,mBAAmB,eAAe;AACpC,YAAQ,IAAI,gCAAgC;AAC5C;AAAA,EACF;AAEA,MAAI,WAAW;AACb,YAAQ,IAAI,qBAAqB,cAAc,OAAO,aAAa,EAAE;AACrE;AAAA,EACF;AAEA,QAAM,UAAU,UAAU;AAC1B,QAAM,aAAa,QAAQ;AAE3B,MAAI,YAAY;AACd,YAAQ,IAAI,mCAAmC;AAC/C,UAAM,KAAK;AAAA,EACb;AAEA,UAAQ,IAAI,YAAY,KAAK,IAAI,OAAO,aAAa,KAAK;AAC1D,MAAI;AACF,wBAAoB,YAAY,KAAK,MAAM,QAAQ;AAAA,EACrD,SAAS,OAAO;AACd,qBAAiB;AAAA,MACf,UAAU;AAAA,MACV,WAAW,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IACtD,CAAC;AACD,QAAI,YAAY;AACd,cAAQ,IAAI,sEAAsE;AAClF,YAAM;AAAA,IACR;AACA,SAAK,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB;AAAA,EACxE;AAEA,mBAAiB;AAAA,IACf,UAAU;AAAA,IACV,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAED,MAAI,YAAY;AACd,YAAQ,IAAI,kCAAkC;AAC9C,UAAM;AAAA,EACR,OAAO;AACL,YAAQ,IAAI,kBAAkB;AAAA,EAChC;AACF;AAEA,SAAS,OAAa;AACpB,UAAQ,IAAI,0BAA0B;AACtC,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW;AACvB,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,8CAA8C;AAC1D,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,6CAA6C;AACzD,UAAQ,IAAI,gEAAgE;AAC5E,UAAQ,IAAI,wCAAwC;AACpD,UAAQ,IAAI,mDAAmD;AAC/D,UAAQ,IAAI,qDAAqD;AACjE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU;AACtB,UAAQ,IAAI,yDAAyD;AACrE,UAAQ,IAAI,iEAAiE;AAC/E;AAEA,eAAe,OAAsB;AACnC,QAAM,MAAM,QAAQ,KAAK,CAAC;AAC1B,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAEjC,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,YAAM;AACN;AAAA,IACF,KAAK;AACH,YAAM,KAAK;AACX;AAAA,IACF,KAAK;AACH,aAAO;AACP;AAAA,IACF,KAAK;AACH,WAAK;AACL;AAAA,IACF,KAAK;AACH,cAAQ;AACR;AAAA,IACF,KAAK;AACH,WAAK,IAAI;AACT;AAAA,IACF,KAAK;AACH,cAAQ;AACR;AAAA,IACF,KAAK;AACH,YAAM,OAAO,IAAI;AACjB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,WAAK;AACL;AAAA,IACF;AACE,WAAK,oBAAoB,GAAG,EAAE;AAAA,EAClC;AACF;AAEA,KAAK,KAAK;",
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.7",
3
+ "version": "0.1.9",
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",