@plumpslabs/fennec-cli 1.11.1 → 1.11.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/dist/index.js CHANGED
@@ -20,11 +20,11 @@ var fennecOrange = hexColor("#FF6432");
20
20
  var fennecYellow = hexColor("#FFB347");
21
21
  var FOX = `
22
22
  ${fennecOrange("/\\\\ /\\\\")}
23
- ${fennecOrange("(")} ${fennecYellow("o o")} ${fennecOrange(") ") + pc.bold("Fennec")} ${pc.dim("v1.11.1")}
23
+ ${fennecOrange("(")} ${fennecYellow("o o")} ${fennecOrange(") ") + pc.bold("Fennec")} ${pc.dim("v1.11.2")}
24
24
  ${fennecOrange("=(")} ${fennecYellow(" Y ")} ${fennecOrange(")=")} ${pc.dim("ears everywhere in your stack.")}
25
25
  ${fennecOrange(") (")}
26
26
  `;
27
- var FOX_COMPACT = `${pc.redBright(" \u{1F98A}")} ${pc.bold("Fennec")} ${pc.dim("v1.11.1")}`;
27
+ var FOX_COMPACT = `${pc.redBright(" \u{1F98A}")} ${pc.bold("Fennec")} ${pc.dim("v1.11.2")}`;
28
28
  function printBanner() {
29
29
  if (process.stdout.isTTY) {
30
30
  console.error(FOX);
@@ -61,13 +61,10 @@ function showHelp() {
61
61
  ${pc2.bold("Process Management")}
62
62
  ${sep}
63
63
 
64
- ${pc2.cyan("ps")} ${pc2.dim("[options]")} ${pc2.dim("List real system processes")}
65
- ${pc2.dim("--name")} Filter by process name
66
- ${pc2.dim("--port")} Filter by port
67
- ${pc2.dim("--sort")} Sort by ${pc2.dim("(cpu | mem | pid | name) [default: cpu]")}
68
- ${pc2.dim("-n")} Max results ${pc2.dim("[default: 30]")}
69
- ${pc2.dim("-w, --watch")} Watch mode ${pc2.dim("(refresh every 3s)")}
70
- ${pc2.dim("-a, --all")} Show all processes ${pc2.dim("(not just user)")}
64
+ ${pc2.cyan("ps")} ${pc2.dim("[options]")} ${pc2.dim("List Fennec-tracked apps (like PM2)")}
65
+ ${pc2.dim("--system, -a")} Show all system processes
66
+ ${pc2.dim("--name")} Filter by app name
67
+ ${pc2.dim("-w, --watch")} Watch mode ${pc2.dim("(system processes refresh every 3s)")}
71
68
 
72
69
  ${pc2.cyan("run")} ${pc2.dim("<command>")} ${pc2.dim("Run a command under Fennec observation")}
73
70
  ${pc2.dim("--name")} Process name ${pc2.dim("(required)")}
@@ -621,46 +618,8 @@ function mapBsdState(s) {
621
618
  return s;
622
619
  }
623
620
  }
624
- function detectListeningPorts(pid) {
625
- try {
626
- const tcpFile = `/proc/${pid}/net/tcp`;
627
- const tcp6File = `/proc/${pid}/net/tcp6`;
628
- const ports = [];
629
- for (const f of [tcpFile, tcp6File]) {
630
- try {
631
- const data = readSafe(f);
632
- if (data) {
633
- for (const port of parseProcNetTcp(data)) {
634
- if (!ports.includes(port)) ports.push(port);
635
- }
636
- }
637
- } catch {
638
- continue;
639
- }
640
- }
641
- return ports.sort((a, b) => a - b);
642
- } catch {
643
- return [];
644
- }
645
- }
646
- function parseProcNetTcp(data) {
647
- const ports = [];
648
- const lines = data.split("\n").slice(1);
649
- for (const line of lines) {
650
- const parts = line.trim().split(/\s+/);
651
- if (parts.length < 3) continue;
652
- const localAddr = parts[1] ?? "";
653
- const state = parts[3] ?? "";
654
- if (state !== "0A") continue;
655
- const portMatch = localAddr.match(/:([0-9a-fA-F]+)$/);
656
- if (portMatch) {
657
- const port = parseInt(portMatch[1], 16);
658
- if (port > 0 && port <= 65535) {
659
- ports.push(port);
660
- }
661
- }
662
- }
663
- return ports;
621
+ function detectListeningPorts(_pid) {
622
+ return [];
664
623
  }
665
624
  function readSafe(path) {
666
625
  try {
@@ -860,7 +819,7 @@ async function main() {
860
819
  printBanner();
861
820
  await initCommand();
862
821
  } else if (command === "version" || command === "--version" || command === "-v") {
863
- console.log(` ${symbols.fox} ${pc4.bold("Fennec")} ${pc4.dim("v1.11.1")}`);
822
+ console.log(` ${symbols.fox} ${pc4.bold("Fennec")} ${pc4.dim("v1.11.2")}`);
864
823
  } else if (command === "help" || command === "--help" || command === "-h") {
865
824
  console.log(pc4.dim("\n Use 'fennec help' for more information.\n"));
866
825
  printBanner();
@@ -990,102 +949,129 @@ async function runCommand(args2) {
990
949
  }
991
950
  async function psCommand(args2) {
992
951
  const watchFlag = args2.includes("-w") || args2.includes("--watch");
952
+ const systemFlag = args2.includes("--system") || args2.includes("-a") || args2.includes("--all");
993
953
  const nameFilter = args2.includes("--name") ? args2[args2.indexOf("--name") + 1] : void 0;
994
- const portFilter = args2.includes("--port") ? parseInt(args2[args2.indexOf("--port") + 1], 10) : void 0;
995
- const sortBy = args2.includes("--sort") ? args2[args2.indexOf("--sort") + 1] : args2.includes("-m") ? "mem" : args2.includes("-c") ? "cpu" : "cpu";
996
- const limit = args2.includes("-n") ? parseInt(args2[args2.indexOf("-n") + 1], 10) : 30;
997
- const allFlag = args2.includes("-a") || args2.includes("--all");
998
- if (watchFlag) {
999
- await watchProcesses(sortBy, limit);
954
+ const sortBy = args2.includes("--sort") ? args2[args2.indexOf("--sort") + 1] : "name";
955
+ if (watchFlag && systemFlag) {
956
+ await watchSystemProcesses(sortBy, 15);
1000
957
  return;
1001
958
  }
1002
- const spinner = createSpinner("Scanning system processes...");
1003
- try {
1004
- const processes = getSystemProcesses({
1005
- name: nameFilter,
1006
- port: portFilter,
1007
- userOnly: !allFlag,
1008
- sortBy,
1009
- limit
1010
- });
1011
- spinner.stop();
1012
- process.stdout.write("\r\x1B[K");
1013
- if (processes.length === 0) {
1014
- console.error(`
1015
- ${pc4.dim("No processes found.")}
959
+ if (systemFlag) {
960
+ const spinner = createSpinner("Scanning system processes...");
961
+ try {
962
+ const processes = getSystemProcesses({
963
+ name: nameFilter,
964
+ userOnly: true,
965
+ sortBy,
966
+ limit: 30
967
+ });
968
+ spinner.stop();
969
+ process.stdout.write("\r\x1B[K");
970
+ if (processes.length === 0) {
971
+ console.error(`
972
+ ${pc4.dim("No system processes found.")}
1016
973
  `);
1017
- return;
1018
- }
1019
- const columns = [
1020
- { key: "pid", label: "PID", align: "right", format: (v) => pc4.dim(String(v).padStart(6)) },
1021
- { key: "name", label: "Name", format: (v) => pc4.bold(String(v)) },
1022
- { key: "cpu", label: "CPU%", align: "right", format: (v) => {
1023
- const num = v;
1024
- return num > 10 ? pc4.red(String(num)) : num > 5 ? pc4.yellow(String(num)) : pc4.dim(String(num));
1025
- } },
1026
- { key: "mem", label: "MEM%", align: "right", format: (v) => {
1027
- const num = v;
1028
- return num > 10 ? pc4.red(String(num)) : num > 5 ? pc4.yellow(String(num)) : pc4.dim(String(num));
1029
- } },
1030
- { key: "state", label: "State", format: (v) => {
1031
- const s = String(v);
1032
- if (s === "R" || s === "Running") return pc4.green(s);
1033
- if (s === "Z" || s === "Zombie") return pc4.red(s);
1034
- if (s === "S" || s === "Sleeping") return pc4.cyan(s);
1035
- return pc4.dim(s);
1036
- } },
1037
- { key: "ports", label: "Ports", format: (v) => {
1038
- const ports = v;
1039
- return ports.length > 0 ? ports.map((p) => pc4.yellow(`:${p}`)).join(", ") : pc4.dim("-");
1040
- } }
1041
- ];
1042
- const rows = processes.map((p) => ({
1043
- pid: p.pid,
1044
- name: p.name,
1045
- cpu: p.cpuPercent,
1046
- mem: p.memPercent,
1047
- state: formatProcessState(p.state),
1048
- ports: p.ports
1049
- }));
1050
- const tracked = readTracked();
1051
- const managedPids = new Set(tracked.map((t) => t.pid));
1052
- const managedRows = processes.map((p) => {
1053
- const isManaged = managedPids.has(p.pid);
1054
- const trackedInfo = tracked.find((t) => t.pid === p.pid);
1055
- return {
1056
- ...{
1057
- pid: p.pid,
1058
- name: p.name,
1059
- cpu: p.cpuPercent,
1060
- mem: p.memPercent,
1061
- state: formatProcessState(p.state),
1062
- ports: p.ports
1063
- },
1064
- _managed: isManaged,
1065
- _trackedPort: trackedInfo?.port
1066
- };
1067
- });
1068
- if (tracked.length > 0) {
1069
- console.error(` ${pc4.green("\u25CF")} ${pc4.bold("Managed:")} ${tracked.map((t) => {
1070
- const running = isProcessRunning(t.pid);
1071
- const status = running ? pc4.green("running") : pc4.red("stopped");
1072
- const portStr = t.port ? ` ${pc4.yellow(`:${t.port}`)}` : "";
1073
- return `${pc4.bold(t.name)}${portStr} (${status})`;
1074
- }).join(", ")}
974
+ return;
975
+ }
976
+ const columns2 = [
977
+ { key: "pid", label: "PID", align: "right", format: (v) => pc4.dim(String(v).padStart(6)) },
978
+ { key: "name", label: "Name", format: (v) => pc4.bold(String(v)) },
979
+ { key: "cpu", label: "CPU%", align: "right", format: (v) => {
980
+ const num = v;
981
+ return num > 10 ? pc4.red(String(num)) : num > 5 ? pc4.yellow(String(num)) : pc4.dim(String(num));
982
+ } },
983
+ { key: "mem", label: "MEM%", align: "right", format: (v) => {
984
+ const num = v;
985
+ return num > 10 ? pc4.red(String(num)) : num > 5 ? pc4.yellow(String(num)) : pc4.dim(String(num));
986
+ } },
987
+ { key: "state", label: "State", format: (v) => {
988
+ const s = String(v);
989
+ if (s === "R" || s === "Running") return pc4.green(s);
990
+ if (s === "Z" || s === "Zombie") return pc4.red(s);
991
+ if (s === "S" || s === "Sleeping") return pc4.cyan(s);
992
+ return pc4.dim(s);
993
+ } }
994
+ ];
995
+ const rows2 = processes.map((p) => ({
996
+ pid: p.pid,
997
+ name: p.name,
998
+ cpu: p.cpuPercent,
999
+ mem: p.memPercent,
1000
+ state: formatProcessState(p.state)
1001
+ }));
1002
+ console.error(`
1003
+ ${symbols.fox} ${pc4.bold("System Processes")} ${pc4.dim(`(top ${processes.length} by ${sortBy})`)}
1075
1004
  `);
1005
+ console.error(renderTable(columns2, rows2));
1006
+ console.error();
1007
+ } catch (error) {
1008
+ spinner.fail("Failed to scan processes");
1009
+ console.error(renderError("Process scan failed", String(error)));
1076
1010
  }
1077
- console.error(` ${symbols.fox} ${pc4.bold("System Processes")} ${pc4.dim(`(${processes.length} shown, sorted by ${sortBy})`)}
1011
+ return;
1012
+ }
1013
+ const tracked = readTracked();
1014
+ if (tracked.length === 0) {
1015
+ console.error(`
1016
+ ${pc4.dim("No tracked processes.")}`);
1017
+ console.error(` ${pc4.dim("Start an app with:")} ${pc4.cyan("fennec start <command> --name <name>")}
1078
1018
  `);
1079
- console.error(renderTable(columns, managedRows));
1080
- console.error();
1081
- } catch (error) {
1082
- spinner.fail("Failed to scan processes");
1083
- console.error(renderError("Process scan failed", String(error)));
1019
+ return;
1084
1020
  }
1021
+ const columns = [
1022
+ { key: "name", label: "App", format: (v) => pc4.bold(String(v)) },
1023
+ { key: "pid", label: "PID", align: "right" },
1024
+ { key: "status", label: "Status", format: (v) => {
1025
+ const s = v;
1026
+ if (s === "running") return pc4.green("\u25CF running");
1027
+ return pc4.red("\u25CB stopped");
1028
+ } },
1029
+ { key: "port", label: "Port", format: (v) => {
1030
+ const p = v;
1031
+ return p ? pc4.yellow(`:${p}`) : pc4.dim("-");
1032
+ } },
1033
+ { key: "command", label: "Command", format: (v) => {
1034
+ const c = String(v);
1035
+ return c.length > 50 ? c.slice(0, 50) + "\u2026" : c;
1036
+ } },
1037
+ { key: "uptime", label: "Uptime", format: (v) => pc4.dim(String(v)) }
1038
+ ];
1039
+ const rows = tracked.map((t) => {
1040
+ const running = isProcessRunning(t.pid);
1041
+ const uptime = running ? formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1e3)) : "-";
1042
+ return {
1043
+ name: t.name,
1044
+ pid: running ? String(t.pid) : pc4.dim(String(t.pid)),
1045
+ status: running ? "running" : "stopped",
1046
+ port: t.port ?? null,
1047
+ command: t.command,
1048
+ uptime
1049
+ };
1050
+ });
1051
+ const runningCount = tracked.filter((t) => isProcessRunning(t.pid)).length;
1052
+ console.error(`
1053
+ ${symbols.fox} ${pc4.bold("Fennec Apps")} ${pc4.dim(`(${runningCount}/${tracked.length} running)`)}
1054
+ `);
1055
+ console.error(renderTable(columns, rows));
1056
+ console.error(` ${pc4.dim("Use")} ${pc4.cyan("fennec start <command> --name <name> --port <port>")} ${pc4.dim("to add more apps.")}`);
1057
+ console.error(` ${pc4.dim("Use")} ${pc4.cyan("fennec log <name>")} ${pc4.dim("to view logs.")}`);
1058
+ console.error(` ${pc4.dim("Use")} ${pc4.cyan("fennec kill <name>")} ${pc4.dim("to stop an app.")}`);
1059
+ console.error();
1085
1060
  }
1086
- async function watchProcesses(sortBy, limit) {
1061
+ function formatUptime(seconds) {
1062
+ if (seconds < 60) return `${seconds}s`;
1063
+ if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
1064
+ const h = Math.floor(seconds / 3600);
1065
+ const m = Math.floor(seconds % 3600 / 60);
1066
+ if (h >= 24) {
1067
+ const d = Math.floor(h / 24);
1068
+ return `${d}d ${h % 24}h ${m}m`;
1069
+ }
1070
+ return `${h}h ${m}m`;
1071
+ }
1072
+ async function watchSystemProcesses(sortBy, limit) {
1087
1073
  console.error(`
1088
- ${pc4.bold("Watching processes")} ${pc4.dim("(Ctrl+C to stop, refreshes every 3s)")}
1074
+ ${pc4.bold("Watching system processes")} ${pc4.dim("(Ctrl+C to stop, refreshes every 3s)")}
1089
1075
  `);
1090
1076
  const render = () => {
1091
1077
  const processes = getSystemProcesses({
@@ -1130,59 +1116,38 @@ ${renderTable(columns, rows, { compact: true })}`;
1130
1116
  }
1131
1117
  async function statusCommand(_args) {
1132
1118
  const watchFlag = _args.includes("-w") || _args.includes("--watch");
1133
- const spinner = createSpinner("Gathering system status...");
1134
- try {
1135
- const topProcesses = getSystemProcesses({ userOnly: true, sortBy: "cpu", limit: 10 });
1136
- const totalProcesses = getSystemProcesses({ userOnly: true }).length;
1137
- const services = [
1138
- { name: "node", label: "Node.js" },
1139
- { name: "npm", label: "npm" },
1140
- { name: "pnpm", label: "pnpm" },
1141
- { name: "vite", label: "Vite" },
1142
- { name: "next", label: "Next.js" },
1143
- { name: "webpack", label: "Webpack" },
1144
- { name: "tsc", label: "TypeScript" },
1145
- { name: "docker", label: "Docker" },
1146
- { name: "mysqld", label: "MySQL" },
1147
- { name: "postgres", label: "PostgreSQL" },
1148
- { name: "redis", label: "Redis" },
1149
- { name: "ollama", label: "Ollama" }
1150
- ];
1151
- spinner.stop();
1152
- process.stdout.write("\r\x1B[K");
1153
- console.error(`
1154
- ${symbols.fox} ${pc4.bold("Fennec System Overview")}
1119
+ const tracked = readTracked();
1120
+ const topSystem = getSystemProcesses({ userOnly: true, sortBy: "cpu", limit: 5 });
1121
+ const totalUserProcs = getSystemProcesses({ userOnly: true }).length;
1122
+ console.error(`
1123
+ ${symbols.fox} ${pc4.bold("Fennec Status")}
1155
1124
  `);
1156
- console.error(` ${renderKV("User Processes", pc4.bold(String(totalProcesses)))}`);
1157
- console.error(` ${renderKV("Fennec Version", pc4.dim("v1.11.1"))}`);
1158
- const activeServices = services.filter((s) => topProcesses.some((p) => p.name.toLowerCase().includes(s.name))).slice(0, 5);
1159
- if (activeServices.length > 0) {
1160
- console.error(` ${renderKV("Detected", activeServices.map((s) => pc4.green(s.label)).join(", "))}`);
1161
- }
1162
- console.error();
1163
- const columns = [
1164
- { key: "pid", label: "PID", align: "right", format: (v) => pc4.dim(String(v).padStart(6)) },
1165
- { key: "name", label: "Process", format: (v) => pc4.bold(String(v)) },
1166
- { key: "cpu", label: "CPU%", align: "right" },
1167
- { key: "mem", label: "MEM%", align: "right" }
1168
- ];
1169
- const rows = topProcesses.map((p) => ({
1170
- pid: p.pid,
1171
- name: p.name,
1172
- cpu: p.cpuPercent,
1173
- mem: p.memPercent
1174
- }));
1175
- console.error(` ${pc4.bold("Top CPU Processes")}
1125
+ if (tracked.length > 0) {
1126
+ const runningCount = tracked.filter((t) => isProcessRunning(t.pid)).length;
1127
+ console.error(` ${pc4.bold("Managed Apps")} ${pc4.dim(`(${runningCount}/${tracked.length} running)`)}
1176
1128
  `);
1177
- console.error(renderTable(columns, rows));
1178
- if (watchFlag) {
1179
- await watchProcesses("cpu", 15);
1129
+ for (const t of tracked) {
1130
+ const running = isProcessRunning(t.pid);
1131
+ const statusIcon = running ? pc4.green("\u25CF") : pc4.red("\u25CB");
1132
+ const portStr = t.port ? ` ${pc4.yellow(`:${t.port}`)}` : "";
1133
+ const uptime = running ? pc4.dim(formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1e3))) : pc4.red("stopped");
1134
+ console.error(` ${statusIcon} ${pc4.bold(t.name)}${portStr} ${pc4.dim(`(PID ${t.pid})`)} \u2014 ${uptime}`);
1180
1135
  }
1181
1136
  console.error();
1182
- } catch (error) {
1183
- spinner.fail("Failed to gather system status");
1184
- console.error(renderError("Status check failed", String(error)));
1137
+ } else {
1138
+ console.error(` ${pc4.dim("No managed apps.")} ${pc4.cyan("fennec start <command> --name <name>")}
1139
+ `);
1140
+ }
1141
+ console.error(` ${pc4.bold("System")} ${pc4.dim(`(${totalUserProcs} user processes)`)}`);
1142
+ for (const p of topSystem) {
1143
+ const cpuStr = p.cpuPercent > 10 ? pc4.red(`${p.cpuPercent}%`) : p.cpuPercent > 5 ? pc4.yellow(`${p.cpuPercent}%`) : pc4.dim(`${p.cpuPercent}%`);
1144
+ const memStr = p.memPercent > 10 ? pc4.red(`${p.memPercent}%`) : p.memPercent > 5 ? pc4.yellow(`${p.memPercent}%`) : pc4.dim(`${p.memPercent}%`);
1145
+ console.error(` ${pc4.dim(`PID ${p.pid}`)} ${pc4.bold(p.name)} \u2014 CPU: ${cpuStr} MEM: ${memStr}`);
1146
+ }
1147
+ if (watchFlag) {
1148
+ await watchSystemProcesses("cpu", 15);
1185
1149
  }
1150
+ console.error();
1186
1151
  }
1187
1152
  async function killCommand(args2) {
1188
1153
  const rawTarget = args2[0];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/banner.ts","../src/utils/help.ts","../src/commands/pipe.ts","../src/commands/attach-pid.ts","../src/commands/attach-port.ts","../src/commands/watch.ts","../src/utils/format.ts","../src/utils/system-process.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, writeFileSync, readFileSync, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execSync } from \"node:child_process\";\nimport { FennecServer, SessionStore, ProcessManager } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { printBanner } from \"./utils/banner.js\";\nimport { showHelp } from \"./utils/help.js\";\nimport { pipeCommand } from \"./commands/pipe.js\";\nimport { attachPidCommand } from \"./commands/attach-pid.js\";\nimport { attachPortCommand } from \"./commands/attach-port.js\";\nimport { watchCommand } from \"./commands/watch.js\";\nimport {\n symbols,\n renderTable,\n renderKV,\n renderError,\n renderSuccess,\n renderCommand,\n renderAppName,\n logLevel,\n timestamp,\n divider,\n createSpinner,\n selectPrompt,\n confirmPrompt,\n type Column,\n type Row,\n} from \"./utils/format.js\";\nimport {\n getSystemProcesses,\n killProcess as sysKill,\n isProcessRunning,\n formatProcessState,\n} from \"./utils/system-process.js\";\n\nconst [, , command, ...args] = process.argv;\n\n// ─── Process Tracking ────────────────────────────────────────────\n\ninterface TrackedProcess {\n name: string;\n pid: number;\n command: string;\n port?: number;\n cwd?: string;\n startedAt: string;\n}\n\nfunction getTrackedPath(): string {\n const dir = process.env.FENNEC_DATA_DIR\n ? resolve(process.env.FENNEC_DATA_DIR)\n : resolve(homedir(), \".fennec\");\n return resolve(dir, \"tracked.json\");\n}\n\nfunction readTracked(): TrackedProcess[] {\n try {\n const path = getTrackedPath();\n if (!existsSync(path)) return [];\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\nfunction saveTracked(processes: TrackedProcess[]): void {\n try {\n const path = getTrackedPath();\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(processes, null, 2), \"utf-8\");\n } catch {\n // Best-effort\n }\n}\n\nfunction addTracked(proc: TrackedProcess): void {\n const tracked = readTracked();\n // Remove old entry with same name\n const filtered = tracked.filter((t) => t.name !== proc.name);\n filtered.push(proc);\n saveTracked(filtered);\n}\n\nfunction removeTracked(name: string): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.name !== name));\n}\n\nfunction removeTrackedByPid(pid: number): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.pid !== pid));\n}\n\n// ─── Main ────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n if (!command || command === \"start\") {\n // Dual-mode: if first arg is a flag (--), start MCP server.\n // If first arg is a bare command (node, npm, etc.), start an app.\n if (args.length === 0 || args[0]?.startsWith(\"--\")) {\n await startServer(args);\n } else {\n await startCommand(args);\n }\n } else if (command === \"run\") {\n await runCommand(args);\n } else if (command === \"ps\") {\n await psCommand(args);\n } else if (command === \"status\") {\n await statusCommand(args);\n } else if (command === \"log\") {\n await logCommand(args);\n } else if (command === \"kill\") {\n await killCommand(args);\n } else if (command === \"restart\") {\n await restartCommand(args);\n } else if (command === \"attach\") {\n await attachCommand(args);\n } else if (command === \"pipe\") {\n await pipeCommand(args);\n } else if (command === \"attach-pid\") {\n await attachPidCommand(args);\n } else if (command === \"attach-port\") {\n await attachPortCommand(args);\n } else if (command === \"watch\") {\n await watchCommand(args);\n } else if (command === \"sessions\") {\n await sessionsCommand();\n } else if (command === \"setup\") {\n await setupCommand();\n } else if (command === \"install-browsers\") {\n printBanner();\n await installBrowsersCommand();\n } else if (command === \"init\") {\n printBanner();\n await initCommand();\n } else if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n console.log(` ${symbols.fox} ${pc.bold(\"Fennec\")} ${pc.dim(\"v1.11.1\")}`);\n } else if (command === \"help\" || command === \"--help\" || command === \"-h\") {\n console.log(pc.dim(\"\\n Use 'fennec help' for more information.\\n\"));\n printBanner();\n showHelp();\n } else {\n console.error(renderError(`Unknown command: ${command}`, \"Run 'fennec help' for usage information\"));\n process.exit(1);\n }\n}\n\n// ─── Command: start ──────────────────────────────────────────────\n\nasync function startServer(args: string[]): Promise<void> {\n printBanner();\n console.error(` ${pc.dim(\"Starting Fennec MCP server...\")}\\n`);\n\n const configIndex = args.indexOf(\"--config\");\n const configPath = configIndex !== -1 ? args[configIndex + 1] : undefined;\n\n const apiPortIndex = args.indexOf(\"--api-port\");\n const apiPort = apiPortIndex !== -1 ? parseInt(args[apiPortIndex + 1]!, 10) : 3456;\n\n try {\n const server = new FennecServer(configPath);\n await server.start();\n\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Fennec server is running\")}`);\n console.error(` ${renderKV(\"Transport\", \"stdio\")}`);\n console.error(` ${renderKV(\"Management API\", `http://localhost:${apiPort}`)}`);\n console.error(` ${renderKV(\"AI Agent\", \"Connect via MCP protocol\")}`);\n console.error(`\\n ${pc.dim(\"Press Ctrl+C to stop\")}\\n`);\n } catch (error) {\n console.error(renderError(\"Failed to start server\", String(error)));\n process.exit(1);\n }\n}\n\n// ─── Command: start (App Mode) ───────────────────────────────────\n\nasync function startCommand(args: string[]): Promise<void> {\n printBanner();\n console.error(` ${pc.dim(\"Starting app...\")}\\n`);\n await runCommand(args);\n}\n\n// ─── Shared: start/run a process ─────────────────────────────────\n\nasync function runCommand(args: string[]): Promise<void> {\n const nameIndex = args.indexOf(\"--name\");\n const name = nameIndex !== -1 ? args[nameIndex + 1] : undefined;\n const portIndex = args.indexOf(\"--port\");\n const port = portIndex !== -1 ? parseInt(args[portIndex + 1]!, 10) : undefined;\n const cwdIndex = args.indexOf(\"--cwd\");\n const cwd = cwdIndex !== -1 ? args[cwdIndex + 1] : undefined;\n const restartFlag = args.includes(\"--restart\");\n\n // Extract command (everything before --name, --port, or --cwd)\n const stopFlags = [nameIndex, portIndex, cwdIndex].filter((i) => i !== -1) as number[];\n const cmdEnd = Math.min(...stopFlags, Infinity);\n const cmdParts = args.slice(0, cmdEnd);\n const cmd = cmdParts.join(\" \");\n\n if (!cmd) {\n console.error(renderError(\"Missing command\", \"Usage: fennec start|run <command> --name <name> [--port <port>] [--cwd <dir>] [--restart]\"));\n process.exit(1);\n }\n\n const appName = name ?? cmdParts[0] ?? \"app\";\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Running\")} ${renderAppName(appName)}\\n`);\n console.error(` ${renderKV(\"Command\", cmd)}`);\n if (port) console.error(` ${renderKV(\"Port\", String(port))}`);\n if (cwd) console.error(` ${renderKV(\"Directory\", cwd)}`);\n console.error(` ${renderKV(\"Restart\", restartFlag ? \"on crash\" : \"off\")}`);\n console.error(` ${divider()}`);\n\n // Spawn process using ProcessManager\n const config = {\n maxProcesses: 10,\n logBufferLines: 2000,\n spawnAllowlist: [],\n };\n const pm = new ProcessManager(config);\n\n try {\n const proc = pm.spawn(cmdParts[0]!, cmdParts.slice(1), cwd, undefined, appName);\n\n // Save to tracked processes\n addTracked({\n name: appName,\n pid: proc.pid,\n command: cmd,\n port,\n cwd,\n startedAt: new Date().toISOString(),\n });\n\n console.error(`\\n ${pc.green(\"●\")} ${pc.bold(appName)} ${pc.dim(`started (PID: ${proc.pid})`)}${port ? pc.dim(` :${port}`) : \"\"}\\n`);\n\n // Forward logs to console\n const stdout = proc.child.stdout;\n const stderr = proc.child.stderr;\n\n if (stdout) {\n stdout.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n for (const line of lines) {\n const level = line.includes(\"error\") || line.includes(\"Error\") ? \"error\" as const\n : line.includes(\"warn\") || line.includes(\"WARN\") ? \"warn\" as const\n : \"info\" as const;\n const time = timestamp();\n const lvl = logLevel(level);\n process.stdout.write(` ${time} ${lvl} ${line}\\n`);\n }\n });\n }\n\n if (stderr) {\n stderr.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n for (const line of lines) {\n const time = timestamp();\n const lvl = logLevel(\"error\");\n process.stderr.write(` ${time} ${lvl} ${pc.red(line)}\\n`);\n }\n });\n }\n\n // Handle process exit\n proc.child.on(\"exit\", (code, signal) => {\n // Auto-cleanup tracked process\n removeTracked(appName);\n if (restartFlag && code !== 0) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${appName} ${pc.dim(`exited (${code}), restarting...`)}`);\n pm.restart(appName).catch(() => {});\n } else {\n console.error(`\\n ${pc.dim(\"○\")} ${pc.bold(appName)} ${pc.dim(`exited (${code})`)}`);\n }\n });\n\n // Keep running\n await new Promise(() => {});\n } catch (error) {\n console.error(renderError(`Failed to run ${appName}`, String(error)));\n process.exit(1);\n }\n}\n\n// ─── Command: ps (List System Processes) ─────────────────────────\n\nasync function psCommand(args: string[]): Promise<void> {\n const watchFlag = args.includes(\"-w\") || args.includes(\"--watch\");\n const nameFilter = args.includes(\"--name\") ? args[args.indexOf(\"--name\") + 1] : undefined;\n const portFilter = args.includes(\"--port\") ? parseInt(args[args.indexOf(\"--port\") + 1]!, 10) : undefined;\n const sortBy = args.includes(\"--sort\")\n ? (args[args.indexOf(\"--sort\") + 1] as \"cpu\" | \"mem\" | \"pid\" | \"name\")\n : args.includes(\"-m\") ? \"mem\" : args.includes(\"-c\") ? \"cpu\" : \"cpu\";\n const limit = args.includes(\"-n\") ? parseInt(args[args.indexOf(\"-n\") + 1]!, 10) : 30;\n const allFlag = args.includes(\"-a\") || args.includes(\"--all\");\n\n if (watchFlag) {\n await watchProcesses(sortBy, limit);\n return;\n }\n\n const spinner = createSpinner(\"Scanning system processes...\");\n\n try {\n const processes = getSystemProcesses({\n name: nameFilter,\n port: portFilter,\n userOnly: !allFlag,\n sortBy,\n limit,\n });\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\"); // Clear spinner line\n\n if (processes.length === 0) {\n console.error(`\\n ${pc.dim(\"No processes found.\")}\\n`);\n return;\n }\n\n const columns: Column[] = [\n { key: \"pid\", label: \"PID\", align: \"right\", format: (v) => pc.dim(String(v).padStart(6)) },\n { key: \"name\", label: \"Name\", format: (v) => pc.bold(String(v)) },\n { key: \"cpu\", label: \"CPU%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"state\", label: \"State\", format: (v) => {\n const s = String(v);\n if (s === \"R\" || s === \"Running\") return pc.green(s);\n if (s === \"Z\" || s === \"Zombie\") return pc.red(s);\n if (s === \"S\" || s === \"Sleeping\") return pc.cyan(s);\n return pc.dim(s);\n }},\n { key: \"ports\", label: \"Ports\", format: (v) => {\n const ports = v as number[];\n return ports.length > 0\n ? ports.map((p) => pc.yellow(`:${p}`)).join(\", \")\n : pc.dim(\"-\");\n }},\n ];\n\n const rows: Row[] = processes.map((p) => ({\n pid: p.pid,\n name: p.name,\n cpu: p.cpuPercent,\n mem: p.memPercent,\n state: formatProcessState(p.state),\n ports: p.ports,\n }));\n\n // Check for tracked processes and add a \"managed\" indicator\n const tracked = readTracked();\n const managedPids = new Set(tracked.map((t) => t.pid));\n\n // Add badge column showing managed vs system\n const managedRows: Row[] = processes.map((p) => {\n const isManaged = managedPids.has(p.pid);\n const trackedInfo = tracked.find((t) => t.pid === p.pid);\n return {\n ...({\n pid: p.pid,\n name: p.name,\n cpu: p.cpuPercent,\n mem: p.memPercent,\n state: formatProcessState(p.state),\n ports: p.ports,\n } as Row),\n _managed: isManaged,\n _trackedPort: trackedInfo?.port,\n };\n });\n\n // Show tracked processes summary\n if (tracked.length > 0) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"Managed:\")} ${tracked.map((t) => {\n const running = isProcessRunning(t.pid);\n const status = running ? pc.green(\"running\") : pc.red(\"stopped\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n return `${pc.bold(t.name)}${portStr} (${status})`;\n }).join(\", \")}\\n`);\n }\n\n console.error(` ${symbols.fox} ${pc.bold(\"System Processes\")} ${pc.dim(`(${processes.length} shown, sorted by ${sortBy})`)}\\n`);\n console.error(renderTable(columns, managedRows));\n console.error();\n } catch (error) {\n spinner.fail(\"Failed to scan processes\");\n console.error(renderError(\"Process scan failed\", String(error)));\n }\n}\n\nasync function watchProcesses(sortBy: string, limit: number): Promise<void> {\n console.error(`\\n ${pc.bold(\"Watching processes\")} ${pc.dim(\"(Ctrl+C to stop, refreshes every 3s)\")}\\n`);\n\n const render = () => {\n const processes = getSystemProcesses({\n userOnly: true,\n sortBy: sortBy as \"cpu\" | \"mem\" | \"pid\" | \"name\",\n limit,\n });\n\n const columns: Column[] = [\n { key: \"pid\", label: \"PID\", align: \"right\", format: (v) => pc.dim(String(v).padStart(6)) },\n { key: \"name\", label: \"Name\", format: (v) => pc.bold(String(v)) },\n { key: \"cpu\", label: \"CPU%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"state\", label: \"S\", align: \"center\" },\n ];\n\n const rows: Row[] = processes.map((p) => ({\n pid: p.pid,\n name: p.name,\n cpu: p.cpuPercent,\n mem: p.memPercent,\n state: p.state,\n }));\n\n return ` ${timestamp()} ${pc.dim(`${processes.length} processes`)}\\n${renderTable(columns, rows, { compact: true })}`;\n };\n\n console.error(render());\n const interval = setInterval(() => {\n process.stdout.write(\"\\x1B[J\"); // Clear from cursor to end\n console.error(render());\n }, 3000);\n\n process.on(\"SIGINT\", () => {\n clearInterval(interval);\n process.exit(0);\n });\n\n await new Promise(() => {});\n}\n\n// ─── Command: status ─────────────────────────────────────────────\n\nasync function statusCommand(_args: string[]): Promise<void> {\n const watchFlag = _args.includes(\"-w\") || _args.includes(\"--watch\");\n\n // Show a real-time system overview\n const spinner = createSpinner(\"Gathering system status...\");\n\n try {\n const topProcesses = getSystemProcesses({ userOnly: true, sortBy: \"cpu\", limit: 10 });\n const totalProcesses = getSystemProcesses({ userOnly: true }).length;\n\n // Detect common services\n const services = [\n { name: \"node\", label: \"Node.js\" },\n { name: \"npm\", label: \"npm\" },\n { name: \"pnpm\", label: \"pnpm\" },\n { name: \"vite\", label: \"Vite\" },\n { name: \"next\", label: \"Next.js\" },\n { name: \"webpack\", label: \"Webpack\" },\n { name: \"tsc\", label: \"TypeScript\" },\n { name: \"docker\", label: \"Docker\" },\n { name: \"mysqld\", label: \"MySQL\" },\n { name: \"postgres\", label: \"PostgreSQL\" },\n { name: \"redis\", label: \"Redis\" },\n { name: \"ollama\", label: \"Ollama\" },\n ];\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec System Overview\")}\\n`);\n\n // System summary\n console.error(` ${renderKV(\"User Processes\", pc.bold(String(totalProcesses)))}`);\n console.error(` ${renderKV(\"Fennec Version\", pc.dim(\"v1.11.1\"))}`);\n\n // Detected services\n const activeServices = services\n .filter((s) => topProcesses.some((p) => p.name.toLowerCase().includes(s.name)))\n .slice(0, 5);\n\n if (activeServices.length > 0) {\n console.error(` ${renderKV(\"Detected\", activeServices.map((s) => pc.green(s.label)).join(\", \"))}`);\n }\n\n console.error();\n\n // Top CPU processes\n const columns: Column[] = [\n { key: \"pid\", label: \"PID\", align: \"right\", format: (v) => pc.dim(String(v).padStart(6)) },\n { key: \"name\", label: \"Process\", format: (v) => pc.bold(String(v)) },\n { key: \"cpu\", label: \"CPU%\", align: \"right\" },\n { key: \"mem\", label: \"MEM%\", align: \"right\" },\n ];\n\n const rows: Row[] = topProcesses.map((p) => ({\n pid: p.pid,\n name: p.name,\n cpu: p.cpuPercent,\n mem: p.memPercent,\n }));\n\n console.error(` ${pc.bold(\"Top CPU Processes\")}\\n`);\n console.error(renderTable(columns, rows));\n\n if (watchFlag) {\n await watchProcesses(\"cpu\", 15);\n }\n\n console.error();\n } catch (error) {\n spinner.fail(\"Failed to gather system status\");\n console.error(renderError(\"Status check failed\", String(error)));\n }\n}\n\n// ─── Command: kill ───────────────────────────────────────────────\n\nasync function killCommand(args: string[]): Promise<void> {\n const rawTarget = args[0];\n const signalIndex = args.indexOf(\"--signal\");\n const signalRaw = signalIndex !== -1 ? args[signalIndex + 1] : \"SIGTERM\";\n const signal = (signalRaw ?? \"SIGTERM\") as NodeJS.Signals;\n\n // ─── Kill All Mode ─────────────────────────────────────\n if (rawTarget === \"all\" || args.includes(\"--all\") || args.includes(\"-a\")) {\n const userProcs = getSystemProcesses({ userOnly: true, sortBy: \"cpu\", limit: 200 });\n if (userProcs.length === 0) {\n console.error(` ${pc.dim(\"No user processes to kill.\")}`);\n return;\n }\n\n console.error(`\\n ${pc.bold(`Kill ${userProcs.length} user processes?`)}`);\n console.error(` ${pc.dim(\"This will stop ALL your running processes.\")}`);\n console.error(` ${pc.yellow(\"⚠ System processes will not be affected.\")}\\n`);\n\n const confirmed = await confirmPrompt(\n `${pc.red(\"Are you sure?\")} ${pc.dim(\"This cannot be undone\")}`,\n false,\n );\n\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled.\")}`);\n return;\n }\n\n const spinner = createSpinner(`Killing ${userProcs.length} processes...`);\n let killed = 0;\n let failed = 0;\n\n for (const proc of userProcs) {\n if (sysKill(proc.pid, signal)) {\n killed++;\n removeTrackedByPid(proc.pid);\n } else {\n failed++;\n }\n // Small delay to avoid overwhelming system\n if (killed % 10 === 0) await new Promise((r) => setTimeout(r, 50));\n }\n\n await new Promise((r) => setTimeout(r, 500));\n\n if (killed > 0) {\n spinner.succeed(`${killed} process(es) killed`);\n } else {\n spinner.fail(`Failed to kill processes`);\n }\n\n if (failed > 0) {\n console.error(` ${pc.yellow(`${failed} process(es) could not be killed`)} ${pc.dim(\"(try with sudo)\")}`);\n }\n return;\n }\n\n // ─── Single Kill Mode ─────────────────────────────────\n if (!rawTarget) {\n console.error(renderError(\"Missing target\", \"Usage: fennec kill <pid|name|all> [--signal SIGTERM|SIGKILL|SIGINT]\"));\n process.exit(1);\n }\n\n // Resolve target: numeric = PID, string = find by name\n let targetPid: number;\n let displayName: string;\n\n const pid = parseInt(rawTarget, 10);\n if (!isNaN(pid) && String(pid) === rawTarget) {\n // Direct PID\n if (!isProcessRunning(pid)) {\n console.error(renderError(\"Process not found\", `No process with PID ${pid} is running`));\n process.exit(1);\n }\n targetPid = pid;\n displayName = `PID ${pid}`;\n } else {\n // Find by name — show options if multiple matches\n const matches = getSystemProcesses({ name: rawTarget, userOnly: true, sortBy: \"cpu\" });\n if (matches.length === 0) {\n console.error(renderError(\"Process not found\", `No running process matching \"${rawTarget}\"`));\n process.exit(1);\n }\n\n if (matches.length > 1) {\n // Multiple matches — let user pick\n console.error(`\\n ${pc.bold(`Multiple processes match \"${rawTarget}\":`)}`);\n const selected = await selectPrompt(\n `Select which to kill:`,\n matches.map((p, i) => ({\n value: String(i),\n label: `${p.name} (PID ${p.pid})`,\n description: `${p.command.slice(0, 80)} — CPU: ${p.cpuPercent}% MEM: ${p.memPercent}%`,\n })),\n );\n if (selected === null) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n const idx = parseInt(selected, 10);\n targetPid = matches[idx]!.pid;\n displayName = `${matches[idx]!.name} (PID ${targetPid})`;\n } else {\n targetPid = matches[0]!.pid;\n displayName = `${matches[0]!.name} (PID ${targetPid})`;\n }\n }\n\n const confirmed = await confirmPrompt(\n `Kill ${pc.bold(displayName)} with ${pc.yellow(signal)}?`,\n false,\n );\n\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n\n const spinner = createSpinner(`Sending ${signal} to ${displayName}...`);\n\n const success = sysKill(targetPid, signal);\n\n if (success) {\n // Wait a moment to verify\n await new Promise((r) => setTimeout(r, 200));\n const stillRunning = isProcessRunning(targetPid);\n if (stillRunning && signal !== \"SIGKILL\") {\n spinner.warn(`${displayName} did not respond to ${signal}`);\n const forceKill = await confirmPrompt(\n `Send ${pc.red(\"SIGKILL\")} to force stop?`,\n true,\n );\n if (forceKill) {\n const forceSpinner = createSpinner(`Sending SIGKILL to ${displayName}...`);\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 300));\n if (!isProcessRunning(targetPid)) {\n forceSpinner.succeed(`${displayName} force stopped`);\n } else {\n forceSpinner.fail(`${displayName} could not be stopped (permission denied?)`);\n }\n } else {\n console.error(` ${pc.dim(\"Retrying with SIGTERM...\")}`);\n sysKill(targetPid, \"SIGTERM\");\n console.error(` ${pc.yellow(\"⚠\")} ${displayName} ${pc.dim(\"may still be running\")}`);\n }\n } else {\n // Clean up tracked process\n removeTrackedByPid(targetPid);\n spinner.succeed(`${displayName} stopped`);\n }\n } else {\n spinner.fail(`Failed to kill ${displayName}`);\n console.error(renderError(\"Permission denied\", `Try running with sudo or use a different signal.`));\n }\n}\n\n// ─── Command: restart ────────────────────────────────────────────\n\nasync function restartCommand(args: string[]): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error(renderError(\"Missing process name/pid\", \"Usage: fennec restart <pid|name>\"));\n process.exit(1);\n }\n\n // Resolve PID\n let targetPid: number;\n const pid = parseInt(name, 10);\n if (!isNaN(pid) && String(pid) === name) {\n targetPid = pid;\n } else {\n const processes = getSystemProcesses({ name, userOnly: true, limit: 1 });\n if (processes.length === 0) {\n console.error(renderError(\"Process not found\", `No process matching \"${name}\"`));\n process.exit(1);\n }\n targetPid = processes[0]!.pid;\n }\n\n const confirmed = await confirmPrompt(\n `Restart ${pc.bold(`${name} (PID ${targetPid})`)}?`,\n false,\n );\n\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n\n const spinner = createSpinner(`Stopping PID ${targetPid}...`);\n\n // Kill the process\n const killed = sysKill(targetPid, \"SIGTERM\");\n if (!killed) {\n spinner.fail(`Failed to stop PID ${targetPid}`);\n return;\n }\n\n // Wait for exit\n await new Promise((r) => setTimeout(r, 1000));\n\n const stillRunning = isProcessRunning(targetPid);\n if (stillRunning) {\n spinner.warn(`Process didn't stop, sending SIGKILL...`);\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 500));\n }\n\n // Get the command from the process info to suggest restart command\n const procInfo = getSystemProcesses({ pid: targetPid, limit: 1 })[0];\n let suggestion = \"\";\n if (procInfo) {\n suggestion = `\\n ${pc.dim(\"Re-run:\")} ${renderCommand(procInfo.command)}`;\n }\n\n spinner.succeed(`${name} stopped${suggestion}`);\n}\n\n// ─── Command: log ────────────────────────────────────────────────\n\nasync function logCommand(args: string[]): Promise<void> {\n const target = args[0];\n if (!target) {\n console.error(renderError(\"Missing process name/pid\", \"Usage: fennec log <pid|name> [--lines N] [--level LEVEL] [-f]\"));\n process.exit(1);\n }\n\n const linesIndex = args.indexOf(\"--lines\");\n const lines = linesIndex !== -1 ? parseInt(args[linesIndex + 1]!, 10) : 30;\n const followFlag = args.includes(\"-f\") || args.includes(\"--follow\");\n\n // Resolve PID\n let targetPid: number;\n let displayName: string;\n const pid = parseInt(target, 10);\n if (!isNaN(pid) && String(pid) === target) {\n targetPid = pid;\n displayName = `PID ${pid}`;\n } else {\n const processes = getSystemProcesses({ name: target, userOnly: true, limit: 1 });\n if (processes.length === 0) {\n console.error(renderError(\"Process not found\", `No process matching \"${target}\"`));\n process.exit(1);\n }\n targetPid = processes[0]!.pid;\n displayName = `${processes[0]!.name} (PID ${targetPid})`;\n }\n\n const spinner = createSpinner(`Fetching logs for ${displayName}...`);\n\n try {\n // Try journalctl first (Linux systemd), then fall back to /proc/pid/fd\n let logLines: string[] = [];\n\n try {\n const { execSync } = await import(\"node:child_process\");\n const output = execSync(\n `journalctl --no-pager -n ${lines} _PID=${targetPid} 2>/dev/null || tail -n ${lines} /proc/${targetPid}/fd/1 2>/dev/null || echo \"No logs available\"`,\n { encoding: \"utf-8\", timeout: 3000 },\n );\n logLines = output.trim().split(\"\\n\").filter(Boolean);\n } catch {\n logLines = [` ${pc.dim(\"(no log access — process may not be managed by Fennec)\")}`];\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Logs\")} ${renderAppName(displayName)} ${pc.dim(`(last ${lines} lines)`)}\\n`);\n\n for (const line of logLines.slice(-lines)) {\n const display = line.length > 200 ? line.slice(0, 200) + \"…\" : line;\n if (line.toLowerCase().includes(\"error\") || line.toLowerCase().includes(\"fail\")) {\n console.error(` ${pc.red(display)}`);\n } else if (line.toLowerCase().includes(\"warn\")) {\n console.error(` ${pc.yellow(display)}`);\n } else {\n console.error(` ${display}`);\n }\n }\n\n if (followFlag) {\n console.error(`\\n ${pc.dim(\"Following... (Ctrl+C to stop)\")}\\n`);\n await new Promise(() => {});\n }\n\n console.error();\n } catch (error) {\n spinner.fail(`Failed to fetch logs for ${displayName}`);\n console.error(renderError(\"Log fetch failed\", String(error)));\n }\n}\n\n// ─── Command: attach ─────────────────────────────────────────────\n\nasync function attachCommand(args: string[]): Promise<void> {\n const port = parseInt(args[0]!, 10);\n if (isNaN(port)) {\n console.error(renderError(\"Invalid port\", \"Usage: fennec attach <port> --name <name>\"));\n process.exit(1);\n }\n\n const nameIndex = args.indexOf(\"--name\");\n const rawName = nameIndex !== -1 ? args[nameIndex + 1] : undefined;\n const name = rawName ?? `port-${port}`;\n\n const spinner = createSpinner(`Attaching to :${port}...`);\n\n try {\n const { PortDetector } = await import(\"@plumpslabs/fennec-core\");\n const detector = new PortDetector();\n const info = detector.detectByPort(port);\n\n if (info) {\n spinner.succeed(`Attached to :${port}`);\n console.error(` ${renderKV(\"Name\", renderAppName(name))}`);\n console.error(` ${renderKV(\"PID\", String(info.pid))}`);\n console.error(` ${renderKV(\"Command\", info.command || pc.dim(\"unknown\"))}`);\n } else {\n spinner.fail(`No process found on port ${port}`);\n process.exit(1);\n }\n } catch (error) {\n spinner.fail(`Failed to attach to :${port}`);\n console.error(renderError(\"Error\", String(error)));\n process.exit(1);\n }\n}\n\n// ─── Command: sessions ───────────────────────────────────────────\n\nasync function sessionsCommand(): Promise<void> {\n const store = new SessionStore(\"./.fennec/sessions\");\n const sessions = store.list();\n\n if (sessions.length === 0) {\n console.error(`\\n ${pc.dim(\"No saved sessions found.\")}\\n`);\n return;\n }\n\n const columns: Column[] = [\n { key: \"name\", label: \"Name\", format: (v) => pc.bold(String(v)) },\n { key: \"origin\", label: \"Origin\" },\n { key: \"savedAt\", label: \"Saved\", format: (v) => pc.dim(String(v)) },\n ];\n\n const rows: Row[] = sessions.map((s) => ({\n name: s.name,\n origin: s.origin,\n savedAt: new Date(s.savedAt).toLocaleString(),\n }));\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Saved Sessions\")}\\n`);\n console.error(renderTable(columns, rows));\n console.error(` ${pc.dim(`${sessions.length} session(s)`)}\\n`);\n}\n\n// ─── Command: setup ──────────────────────────────────────────────\n\nasync function setupCommand(): Promise<void> {\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Setup\")}\\n`);\n\n const mcpClient = await selectPrompt(\"Which MCP client are you using?\", [\n { value: \"claude\", label: \"Claude Desktop\", description: \"Anthropic's AI desktop app\" },\n { value: \"cursor\", label: \"Cursor\", description: \"AI-powered code editor\" },\n { value: \"cline\", label: \"Cline\", description: \"VS Code MCP client\" },\n { value: \"other\", label: \"Other MCP client\", description: \"Any MCP-compatible client\" },\n ]);\n\n if (!mcpClient) {\n console.error(` ${pc.dim(\"Setup cancelled.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${pc.green(\"✓\")} Selected: ${pc.bold(mcpClient)}\\n`);\n\n const configSnippet = `{\n \"mcpServers\": {\n \"fennec\": {\n \"command\": \"fennec\",\n \"args\": [\"start\"]\n }\n }\n}`;\n\n console.error(` ${pc.bold(\"Add this to your MCP client config:\")}\\n`);\n console.error(` ${pc.dim(\"```\")}`);\n console.error(configSnippet.split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n console.error(` ${pc.dim(\"```\")}\\n`);\n console.error(` ${renderSuccess(\"Setup complete!\")} ${pc.dim(\"Run\")} ${renderCommand(\"fennec start\")} ${pc.dim(\"to begin.\")}\\n`);\n}\n\n// ─── Command: install-browsers ───────────────────────────────────\n\nasync function installBrowsersCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Installing Browser Engines\")}\\n`);\n\n const spinner = createSpinner(\"Installing Chromium...\");\n\n try {\n execSync(\"npx playwright install chromium\", {\n stdio: \"pipe\",\n timeout: 120000,\n });\n spinner.succeed(\"Chromium installed successfully\");\n } catch {\n spinner.fail(\"Failed to install Chromium\");\n console.error(` ${pc.yellow(\"→\")} Try running: ${renderCommand(\"npx playwright install chromium\")}`);\n }\n\n console.error(`\\n ${pc.green(\"✓\")} Browser installation complete.\\n`);\n}\n\n// ─── Command: init ───────────────────────────────────────────────\n\nasync function initCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Initialize Fennec Configuration\")}\\n`);\n\n const configFile = resolve(\"./fennec.config.yaml\");\n\n if (existsSync(configFile)) {\n const overwrite = await confirmPrompt(\n `${pc.yellow(\"fennec.config.yaml\")} already exists. Overwrite?`,\n false,\n );\n\n if (!overwrite) {\n console.error(` ${pc.dim(\"Cancelled.\")}\\n`);\n return;\n }\n }\n\n const spinner = createSpinner(\"Generating configuration...\");\n\n const config = `# Fennec Configuration\n# Generated by 'fennec init'\n\nbrowser:\n type: chromium\n headless: true\n defaultTimeout: 30000\n viewport:\n width: 1280\n height: 720\n\nsession:\n maxSessions: 10\n idleTimeoutSecs: 1800\n persistPath: \".fennec/sessions\"\n\nprocess:\n maxProcesses: 10\n logBufferLines: 2000\n spawnAllowlist:\n - \"npm\"\n - \"node\"\n - \"pnpm\"\n - \"yarn\"\n - \"bun\"\n - \"python\"\n - \"python3\"\n\nterminal:\n logBufferLines: 2000\n watchDebounceMs: 50\n\nnetwork:\n bufferSize: 1000\n captureRequestBody: true\n captureResponseBody: true\n slowRequestThresholdMs: 1000\n\nconsole:\n bufferSize: 500\n levels:\n - log\n - info\n - warn\n - error\n - debug\n\ncorrelation:\n windowMs: 500\n enableRootCauseInference: true\n minConfidence: 0.7\n\nsecurity:\n sandbox: true\n allowProcessSpawn: true\n allowProcessKill: false\n allowedDomains: []\n blockedDomains: []\n allowFileProtocol: false\n allowCDPRawAccess: false\n exportPath: \".fennec/exports\"\n maxExportSizeMB: 10\n\ntransport:\n type: stdio\n port: 3333\n host: \"127.0.0.1\"\n\nlogging:\n level: info\n format: pretty\n file: null\n`;\n\n writeFileSync(configFile, config, \"utf-8\");\n\n spinner.succeed(`Configuration written to ${pc.bold(configFile)}`);\n console.error(`\\n ${pc.dim(\"Edit the file to customize Fennec behavior.\")}\\n`);\n}\n\n// ─── Start ───────────────────────────────────────────────────────\n\nmain().catch((error) => {\n console.error(renderError(\"Fatal error\", String(error)));\n process.exit(1);\n});\n","import pc from \"picocolors\";\n\n// picocolors 1.x types don't include hex(), and on some Node.js versions\n// the CJS/ESM interop can make pc.hex undefined at runtime.\n// We detect and fall back gracefully.\nexport function hexColor(color: string): (s: string) => string {\n if (typeof (pc as any).hex === \"function\") {\n return (pc as any).hex(color);\n }\n // Fallback: return text unchanged if hex coloring isn't available\n return (s: string) => s;\n}\n\nconst fennecOrange = hexColor(\"#FF6432\");\nconst fennecYellow = hexColor(\"#FFB347\");\n\nconst FOX = `\n ${fennecOrange(\"/\\\\\\\\ /\\\\\\\\\")}\n ${fennecOrange(\"(\")} ${fennecYellow(\"o o\")} ${fennecOrange(\") \") + pc.bold(\"Fennec\")} ${pc.dim(\"v1.11.1\")}\n ${fennecOrange(\"=(\")} ${fennecYellow(\" Y \")} ${fennecOrange(\")=\")} ${pc.dim(\"ears everywhere in your stack.\")}\n ${fennecOrange(\") (\")}\n`;\n\nconst FOX_COMPACT = `${pc.redBright(\" 🦊\")} ${pc.bold(\"Fennec\")} ${pc.dim(\"v1.11.1\")}`;\n\nexport function printBanner(): void {\n if (process.stdout.isTTY) {\n console.error(FOX);\n } else {\n console.error(FOX_COMPACT);\n }\n}\n\nexport function printMiniBanner(): void {\n console.error(FOX_COMPACT + pc.dim(\" — ears everywhere in your stack.\"));\n}\n\nexport { FOX, FOX_COMPACT };\n","import pc from \"picocolors\";\nimport { hexColor } from \"./banner.js\";\n\nconst fennecOrange = hexColor(\"#FF6432\");\n\nexport function showHelp(): void {\n const sep = fennecOrange(\"─\".repeat(50));\n\n console.error(`\n\n ${pc.bold(\"Usage:\")} fennec ${pc.dim(\"<command>\")} ${pc.dim(\"[options]\")}\n\n ${sep}\n ${pc.bold(\"Server\")}\n ${sep}\n\n ${pc.cyan(\"start\")} ${pc.dim(\"Start Fennec MCP server (default)\")}\n ${pc.dim(\"--config\")} Path to config file\n ${pc.dim(\"--transport\")} Transport type ${pc.dim(\"(stdio | sse) [default: stdio]\")}\n ${pc.dim(\"--api-port\")} Management API port ${pc.dim(\"[default: 3456]\")}\n\n ${pc.cyan(\"start\")} ${pc.dim(\"<command>\")} ${pc.dim(\"Start an app under Fennec observation (new!)\")}\n ${pc.dim(\"--name\")} App name ${pc.dim(\"(required for tracking)\")}\n ${pc.dim(\"--port\")} Port the app listens on ${pc.dim(\"(optional)\")}\n ${pc.dim(\"--cwd\")} Working directory\n ${pc.dim(\"--restart\")} Auto-restart on crash\n\n ${sep}\n ${pc.bold(\"Process Management\")}\n ${sep}\n\n ${pc.cyan(\"ps\")} ${pc.dim(\"[options]\")} ${pc.dim(\"List real system processes\")}\n ${pc.dim(\"--name\")} Filter by process name\n ${pc.dim(\"--port\")} Filter by port\n ${pc.dim(\"--sort\")} Sort by ${pc.dim(\"(cpu | mem | pid | name) [default: cpu]\")}\n ${pc.dim(\"-n\")} Max results ${pc.dim(\"[default: 30]\")}\n ${pc.dim(\"-w, --watch\")} Watch mode ${pc.dim(\"(refresh every 3s)\")}\n ${pc.dim(\"-a, --all\")} Show all processes ${pc.dim(\"(not just user)\")}\n\n ${pc.cyan(\"run\")} ${pc.dim(\"<command>\")} ${pc.dim(\"Run a command under Fennec observation\")}\n ${pc.dim(\"--name\")} Process name ${pc.dim(\"(required)\")}\n ${pc.dim(\"--cwd\")} Working directory\n ${pc.dim(\"--restart\")} Auto-restart on crash\n\n ${pc.cyan(\"status\")} ${pc.dim(\"[name]\")} ${pc.dim(\"Show system overview & top processes\")}\n ${pc.dim(\"-w, --watch\")} Watch mode ${pc.dim(\"(refresh every 3s)\")}\n\n ${pc.cyan(\"log\")} ${pc.dim(\"<pid|name>\")} ${pc.dim(\"Show logs for a process\")}\n ${pc.dim(\"--lines\")} Number of lines ${pc.dim(\"[default: 30]\")}\n ${pc.dim(\"-f, --follow\")} Follow mode ${pc.dim(\"(journalctl --follow)\")}\n\n ${pc.cyan(\"kill\")} ${pc.dim(\"<pid|name|all>\")} ${pc.dim(\"Kill process(es) by PID, name, or all\")}\n ${pc.dim(\"--signal\")} Signal to send ${pc.dim(\"[default: SIGTERM]\")}\n ${pc.dim(\"--all\")} Kill all user processes\n\n ${pc.cyan(\"restart\")} ${pc.dim(\"<pid|name>\")} ${pc.dim(\"Kill + show re-run command\")}\n\n ${sep}\n ${pc.bold(\"Observation\")}\n ${sep}\n\n ${pc.cyan(\"attach\")} ${pc.dim(\"<port>\")} ${pc.dim(\"Observe a process by port\")}\n ${pc.dim(\"--name\")} Process name\n\n ${pc.cyan(\"pipe\")} ${pc.dim(\"Pipe stdin to log watcher\")}\n ${pc.dim(\"--name\")} Watcher name ${pc.dim(\"(required)\")}\n\n ${pc.cyan(\"watch\")} ${pc.dim(\"Watch a log file\")}\n ${pc.dim(\"--file\")} File path ${pc.dim(\"(required)\")}\n ${pc.dim(\"--name\")} Watcher name\n\n ${pc.cyan(\"attach-pid\")} ${pc.dim(\"<pid>\")} ${pc.dim(\"Attach to process by PID\")}\n ${pc.cyan(\"attach-port\")} ${pc.dim(\"<port>\")} ${pc.dim(\"Attach to process by port\")}\n\n ${sep}\n ${pc.bold(\"Configuration\")}\n ${sep}\n\n ${pc.cyan(\"init\")} ${pc.dim(\"Generate fennec.config.yaml\")}\n ${pc.cyan(\"setup\")} ${pc.dim(\"Configure MCP client\")}\n ${pc.cyan(\"install-browsers\")} ${pc.dim(\"Install Playwright browser engines\")}\n ${pc.cyan(\"sessions\")} ${pc.dim(\"List saved auth sessions\")}\n\n ${sep}\n ${pc.bold(\"Other\")}\n ${sep}\n\n ${pc.cyan(\"help\")} ${pc.dim(\"Show this help message\")}\n ${pc.cyan(\"version\")} ${pc.dim(\"Show version\")}\n\n ${pc.dim(\"─\".repeat(50))}\n\n ${pc.dim(\"Learn more:\")} ${pc.cyan(\"https://github.com/plumpslabs/fennec\")}\n `);\n}\n","export async function pipeCommand(args: string[]): Promise<void> {\n const nameIndex = args.indexOf(\"--name\");\n const name = nameIndex !== -1 ? args[nameIndex + 1] : \"pipe\";\n\n if (!name) {\n console.error(\"Error: --name is required for pipe command\");\n process.exit(1);\n }\n\n const { PipeWatcher } = await import(\"@plumpslabs/fennec-core\");\n const watcher = new PipeWatcher();\n const { write } = watcher.createPipe(name);\n\n console.error(`Pipe watcher '${name}' active. Forwarding stdin...`);\n\n const onDrain = () => {\n process.stdin.resume();\n };\n process.stdout.on(\"drain\", onDrain);\n\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.on(\"data\", (data: string) => {\n try {\n write(data);\n const canContinue = process.stdout.write(data);\n if (!canContinue) {\n process.stdin.pause();\n }\n } catch (error) {\n console.error(\"Pipe error:\", error);\n }\n });\n\n process.stdin.on(\"error\", (error) => {\n console.error(\"Pipe stdin error:\", error);\n });\n\n process.stdin.on(\"end\", () => {\n console.error(`Pipe watcher '${name}' ended.`);\n watcher.cleanup();\n });\n\n const shutdown = () => {\n watcher.cleanup();\n process.stdout.removeListener(\"drain\", onDrain);\n process.stdin.removeAllListeners();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n","export async function attachPidCommand(args: string[]): Promise<void> {\n const pid = parseInt(args[0]!, 10);\n if (isNaN(pid)) {\n console.error(\"Error: valid PID is required\");\n process.exit(1);\n }\n const { PortDetector } = await import(\"@plumpslabs/fennec-core\");\n const detector = new PortDetector();\n const info = detector.detectByPid(pid);\n if (info) {\n console.log(`Attached to PID ${pid}${info.command ? ` (${info.command})` : \"\"}`);\n if (info.port) console.log(` Port: ${info.port}`);\n } else {\n console.error(`Could not find process with PID ${pid}`);\n process.exit(1);\n }\n}\n","export async function attachPortCommand(args: string[]): Promise<void> {\n const port = parseInt(args[0]!, 10);\n if (isNaN(port)) {\n console.error(\"Error: valid port number is required\");\n process.exit(1);\n }\n const { PortDetector } = await import(\"@plumpslabs/fennec-core\");\n const detector = new PortDetector();\n const info = detector.detectByPort(port);\n if (info) {\n console.log(`Found process on port ${port}: PID ${info.pid}${info.command ? ` (${info.command})` : \"\"}`);\n } else {\n console.error(`No process found listening on port ${port}`);\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport async function watchCommand(args: string[]): Promise<void> {\n const fileIndex = args.indexOf(\"--file\");\n const filePath = fileIndex !== -1 ? args[fileIndex + 1] : undefined;\n if (!filePath) {\n console.error(\"Error: --file is required for watch command\");\n process.exit(1);\n }\n const nameIndex = args.indexOf(\"--name\");\n const name = nameIndex !== -1 ? args[nameIndex + 1] : undefined;\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n console.error(`Error: File not found: ${resolvedPath}`);\n process.exit(1);\n }\n const { LogWatcher } = await import(\"@plumpslabs/fennec-core\");\n const watcher = new LogWatcher();\n const watcherId = watcher.watchFile(resolvedPath, name);\n console.log(`Watching file: ${resolvedPath}`);\n console.log(`Watcher ID: ${watcherId}`);\n process.stdin.resume();\n}\n","/**\n * Fennec CLI Formatting System\n *\n * Central module for all CLI output formatting.\n * Uses picocolors (7KB, zero dependencies) for coloring.\n *\n * Design principles:\n * - Minimal dependencies (picocolors only)\n * - Clean, modern, readable output\n * - Consistent spacing and alignment\n * - Fox-themed (🦊) but not overwhelming\n */\n\nimport { createInterface } from \"node:readline\";\nimport pc from \"picocolors\";\n\n// ─── Color Helpers ───────────────────────────────────────────────\n\n/**\n * Custom hex color formatter.\n * picocolors has hex() at runtime but can be undefined on some Node.js\n * versions due to CJS/ESM interop issues. We detect and fall back.\n */\nfunction hex(color: string): (s: string) => string {\n if (typeof (pc as any).hex === \"function\") {\n return (pc as any).hex(color);\n }\n return (s: string) => s;\n}\n\n// Brand colors (runtime-safe, bypass TypeScript limitations)\nconst fennecOrange = hex(\"#FF6432\");\nconst blueAccent = hex(\"#4A90D9\");\nconst redAccent = hex(\"#E94560\");\n\n// ─── Color Palette ───────────────────────────────────────────────\n\nexport const colors = {\n // Brand colors\n primary: fennecOrange,\n secondary: blueAccent,\n accent: redAccent,\n\n // Semantic colors\n success: pc.green,\n error: pc.red,\n warning: pc.yellow,\n info: pc.cyan,\n muted: pc.dim,\n highlight: pc.bold,\n\n // Backgrounds\n bgSuccess: (s: string) => pc.bgGreen(pc.black(` ${s} `)),\n bgError: (s: string) => pc.bgRed(pc.white(` ${s} `)),\n bgWarning: (s: string) => pc.bgYellow(pc.black(` ${s} `)),\n bgInfo: (s: string) => pc.bgCyan(pc.black(` ${s} `)),\n} as const;\n\n// ─── Symbols ─────────────────────────────────────────────────────\n\nexport const symbols = {\n // Status\n active: pc.green(\"●\"),\n inactive: pc.dim(\"○\"),\n error: pc.red(\"✗\"),\n warning: pc.yellow(\"⚠\"),\n success: pc.green(\"✓\"),\n info: pc.cyan(\"ℹ\"),\n pending: pc.yellow(\"◌\"),\n\n // UI\n bullet: pc.dim(\"│\"),\n dot: pc.dim(\"·\"),\n arrow: pc.cyan(\"→\"),\n pointer: fennecOrange(\"▶\"),\n separator: pc.dim(\"─\"),\n\n // Fennec\n fox: \"🦊\",\n ears: \"⏜\",\n} as const;\n\n// ─── Status Badges ───────────────────────────────────────────────\n\nexport type ProcessStatus = \"running\" | \"stopped\" | \"error\" | \"starting\" | \"unknown\";\n\nexport function statusBadge(status: ProcessStatus): string {\n switch (status) {\n case \"running\": return pc.green(\"● running\");\n case \"stopped\": return pc.dim(\"○ stopped\");\n case \"error\": return pc.red(\"✗ error\");\n case \"starting\": return pc.yellow(\"◌ starting\");\n case \"unknown\": return pc.dim(\"? unknown\");\n }\n}\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"verbose\";\n\nexport function logLevel(label: string): string {\n const upper = label.toUpperCase().padEnd(5);\n switch (label.toLowerCase()) {\n case \"error\": return pc.bgRed(pc.white(` ${upper} `));\n case \"warn\": return pc.bgYellow(pc.black(` ${upper} `));\n case \"info\": return pc.bgCyan(pc.black(` ${upper} `));\n case \"debug\": return pc.dim(pc.italic(upper));\n case \"verbose\": return pc.dim(pc.italic(upper));\n default: return pc.dim(upper);\n }\n}\n\n// ─── Table Renderer ──────────────────────────────────────────────\n\nexport interface Column {\n key: string;\n label: string;\n align?: \"left\" | \"right\" | \"center\";\n width?: number;\n format?: (value: unknown) => string;\n}\n\nexport interface Row {\n [key: string]: unknown;\n}\n\nexport function renderTable(columns: Column[], rows: Row[], options?: { padding?: number; compact?: boolean }): string {\n const pad = options?.padding ?? 1;\n const isCompact = options?.compact ?? false;\n\n if (rows.length === 0) {\n return pc.dim(\" (no data)\");\n }\n\n // Calculate column widths\n const widths: number[] = columns.map((col) => {\n const headerLen = col.label.length;\n const maxDataLen = rows.reduce((max, row) => {\n const val = String(row[col.key] ?? \"-\");\n return Math.max(max, val.length);\n }, 0);\n return Math.max(headerLen, maxDataLen, col.width ?? 0) + pad * 2;\n });\n\n // ─── Helpers ────────────────────────────────────────\n const hLine = (left: string, mid: string, right: string, fill = \"─\") => {\n return pc.dim(\n left + widths.map((w) => fill.repeat(w)).join(mid) + right,\n );\n };\n\n const formatCell = (text: string, colIdx: number) => {\n const col = columns[colIdx]!;\n const w = widths[colIdx]!;\n\n // Truncate if too long\n const display = text.length > w ? text.slice(0, w - 1) + \"…\" : text;\n const padded = display.padEnd(w);\n\n const align = col.align ?? \"left\";\n if (align === \"right\") return padded.padStart(w);\n if (align === \"center\") {\n const leftPad = Math.floor((w - display.length) / 2);\n return \" \".repeat(leftPad) + display + \" \".repeat(w - display.length - leftPad);\n }\n return padded;\n };\n\n const renderRow = (row: Row): string => {\n const cells = columns.map((col, i) => {\n const raw = row[col.key];\n const formatted = col.format ? col.format(raw) : String(raw ?? \"-\");\n return formatCell(formatted, i);\n });\n return pc.dim(\"│\") + cells.join(pc.dim(\"│\")) + pc.dim(\"│\");\n };\n\n // ─── Build table ────────────────────────────────────\n const lines: string[] = [];\n\n if (!isCompact) {\n lines.push(hLine(\"┌\", \"┬\", \"┐\"));\n }\n\n // Header row\n const headerCells = columns.map((col, i) => {\n return formatCell(pc.bold(col.label), i);\n });\n lines.push(pc.dim(\"│\") + headerCells.join(pc.dim(\"│\")) + pc.dim(\"│\"));\n\n if (!isCompact) {\n lines.push(hLine(\"├\", \"┼\", \"┤\"));\n } else {\n lines.push(pc.dim(\"├\") + widths.map((w) => pc.dim(\"─\").repeat(w)).join(pc.dim(\"┼\")) + pc.dim(\"┤\"));\n }\n\n // Data rows\n for (const row of rows) {\n const rendered = renderRow(row);\n // Highlight if row has an error\n if (row._error) {\n lines.push(colors.error(rendered));\n } else {\n lines.push(rendered);\n }\n }\n\n if (!isCompact) {\n lines.push(hLine(\"└\", \"┴\", \"┘\"));\n }\n\n return lines.join(\"\\n\");\n}\n\n// ─── Key-Value Display ───────────────────────────────────────────\n\nexport function renderKV(key: string, value: string, options?: { indent?: number; separator?: string }): string {\n const indent = options?.indent ?? 2;\n const sep = options?.separator ?? \":\";\n const pad = \" \".repeat(indent);\n return `${pad}${pc.dim(key + sep)} ${value}`;\n}\n\nexport function renderKVColor(key: string, value: string, color: (s: string) => string = pc.bold): string {\n return ` ${pc.dim(key + \":\")} ${color(value)}`;\n}\n\nexport function renderSection(title: string, content: string): string {\n const line = pc.dim(\"─\".repeat(40));\n return `\\n ${pc.bold(title)}\\n ${line}\\n${content}\\n`;\n}\n\n// ─── Box Renderer ────────────────────────────────────────────────\n\nexport function renderBox(title: string, content: string, options?: {\n width?: number;\n borderColor?: (s: string) => string;\n titleColor?: (s: string) => string;\n}): string {\n const width = options?.width ?? 50;\n const border = options?.borderColor ?? pc.dim;\n const titleColor = options?.titleColor ?? pc.bold;\n\n const lines = content.split(\"\\n\");\n const wrapped = lines.map((l) => {\n const clean = l.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n return l + \" \".repeat(Math.max(0, width - clean.length - 2));\n });\n\n const top = border(`┌─ ${titleColor(title)} ${\"─\".repeat(Math.max(0, width - title.length - 4))}┐`);\n const mid = wrapped.map((l) => border(\"│ \") + l + border(\" │\")).join(\"\\n\");\n const bot = border(`└${\"─\".repeat(width)}┘`);\n\n return `\\n${top}\\n${mid}\\n${bot}\\n`;\n}\n\n// ─── Spinner (minimal, no dependencies) ──────────────────────────\n\nexport interface Spinner {\n update(text: string): void;\n succeed(text: string): void;\n fail(text: string): void;\n warn(text: string): void;\n stop(): void;\n}\n\nexport function createSpinner(text: string): Spinner {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n let running = true;\n\n const interval = setInterval(() => {\n if (!running) return;\n process.stdout.write(`\\r${pc.cyan(frames[i])} ${text}`);\n i = (i + 1) % frames.length;\n }, 80);\n\n return {\n update(newText: string) {\n if (!running) return;\n process.stdout.write(`\\r${pc.cyan(frames[i])} ${newText}`);\n },\n succeed(msg: string) {\n running = false;\n clearInterval(interval);\n process.stdout.write(`\\r${pc.green(\"✓\")} ${msg}\\n`);\n },\n fail(msg: string) {\n running = false;\n clearInterval(interval);\n process.stdout.write(`\\r${pc.red(\"✗\")} ${msg}\\n`);\n },\n warn(msg: string) {\n running = false;\n clearInterval(interval);\n process.stdout.write(`\\r${pc.yellow(\"⚠\")} ${msg}\\n`);\n },\n stop() {\n running = false;\n clearInterval(interval);\n },\n };\n}\n\n// ─── Interactive Select (enhanced) ───────────────────────────────\n\nexport async function selectPrompt<T extends string>(\n message: string,\n options: { value: T; label: string; description?: string }[],\n): Promise<T | null> {\n console.log(`\\n ${pc.bold(message)}\\n`);\n options.forEach((opt, i) => {\n const num = pc.cyan(` ${i + 1}`);\n console.log(`${num} ${opt.label}`);\n if (opt.description) {\n console.log(` ${pc.dim(opt.description)}`);\n }\n });\n console.log(` ${pc.dim(\"0) Cancel\")}\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(` ${pc.bold(\"Enter number\")} ${pc.dim(\"(0-\" + options.length + \")\")}: `, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n\n const num = parseInt(answer, 10);\n if (isNaN(num) || num === 0) return null;\n const selected = options[num - 1];\n if (!selected) {\n console.log(` ${pc.red(\"Invalid selection.\")}`);\n return null;\n }\n return selected.value;\n}\n\nexport async function confirmPrompt(message: string, defaultValue = false): Promise<boolean> {\n const hint = defaultValue ? pc.bold(\"Y\") + pc.dim(\"/n\") : pc.dim(\"y/\") + pc.bold(\"N\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`\\n ${message} ${pc.dim(\"(\" + hint + \")\")}: `, (ans) => {\n rl.close();\n resolve(ans.trim().toLowerCase());\n });\n });\n\n if (!answer) return defaultValue;\n return answer === \"y\" || answer === \"yes\";\n}\n\n// ─── Divider ─────────────────────────────────────────────────────\n\nexport function divider(text?: string): string {\n if (text) {\n const len = 50 - text.length - 2;\n const left = Math.floor(len / 2);\n const right = len - left;\n return pc.dim(\"─\".repeat(left) + ` ${text} ` + \"─\".repeat(right));\n }\n return pc.dim(\"─\".repeat(50));\n}\n\n// ─── Timestamp ───────────────────────────────────────────────────\n\nexport function timestamp(date?: Date): string {\n const d = date ?? new Date();\n const time = d.toLocaleTimeString(\"en-US\", { hour12: false });\n return pc.dim(`[${time}]`);\n}\n\n// ─── Command Line ────────────────────────────────────────────────\n\nexport function renderCommand(cmd: string): string {\n return fennecOrange(`$ ${cmd}`);\n}\n\nexport function renderAppName(name: string): string {\n return fennecOrange(pc.bold(name));\n}\n\n// ─── Error Display ───────────────────────────────────────────────\n\nexport function renderError(title: string, details?: string, suggestions?: string[]): string {\n const lines: string[] = [];\n lines.push(`\\n ${pc.bgRed(pc.white(\" ERROR \"))} ${pc.bold(title)}`);\n if (details) {\n lines.push(` ${pc.dim(details)}`);\n }\n if (suggestions && suggestions.length > 0) {\n lines.push(`\\n ${pc.bold(\"Suggestions:\")}`);\n for (const s of suggestions) {\n lines.push(` ${pc.cyan(\"→\")} ${s}`);\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nexport function renderSuccess(message: string): string {\n return ` ${pc.green(\"✓\")} ${message}`;\n}\n\nexport function renderWarning(message: string): string {\n return ` ${pc.yellow(\"⚠\")} ${message}`;\n}\n","/**\n * System Process Scanner\n *\n * Reads real system processes from /proc (Linux) or ps (macOS/BSD).\n * Returns process info: pid, name, cpu%, mem%, status, command, ports.\n *\n * Design principles:\n * - Zero external dependencies (uses Node.js built-ins only)\n * - Cross-platform (Linux via /proc, macOS/Windows via exec)\n * - Safe errors (never throws, returns empty array on failure)\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { cpus } from \"node:os\";\n\n// ─── Types ───────────────────────────────────────────────────────\n\nexport interface SystemProcessInfo {\n pid: number;\n name: string;\n command: string;\n cpuPercent: number;\n memPercent: number;\n memRss: number; // Resident Set Size in KB\n state: string; // R=Running, S=Sleeping, Z=Zombie, etc.\n startedAt: string | null;\n ports: number[]; // Listening ports (if any)\n isUserProcess: boolean; // true if owned by current user\n}\n\nexport interface SystemProcessFilter {\n name?: string;\n pid?: number;\n port?: number;\n userOnly?: boolean;\n sortBy?: \"cpu\" | \"mem\" | \"pid\" | \"name\";\n limit?: number;\n}\n\n// ─── Linux /proc Scanner ─────────────────────────────────────────\n\nfunction readProcProcesses(): SystemProcessInfo[] {\n const processes: SystemProcessInfo[] = [];\n const currentUid = process.getuid?.();\n const totalMemKb = readTotalMem();\n\n try {\n const pids = readdirSync(\"/proc\").filter((d) => /^\\d+$/.test(d));\n\n for (const pidStr of pids) {\n try {\n const pid = parseInt(pidStr, 10);\n const proc = readSingleProcProcess(pid, currentUid, totalMemKb);\n if (proc) processes.push(proc);\n } catch {\n // Process might have exited between readdir and stat\n continue;\n }\n }\n } catch {\n // /proc not available (not Linux)\n return [];\n }\n\n return processes;\n}\n\nfunction readSingleProcProcess(\n pid: number,\n currentUid: number | undefined,\n totalMemKb: number,\n): SystemProcessInfo | null {\n const statPath = `/proc/${pid}/stat`;\n const statusPath = `/proc/${pid}/status`;\n const cmdlinePath = `/proc/${pid}/cmdline`;\n\n if (!existsSync(statPath)) return null;\n\n // Read /proc/[pid]/status for name, uid, memory\n const statusText = readSafe(statusPath);\n if (!statusText) return null;\n\n const nameMatch = statusText.match(/Name:\\s+(.+)/);\n const uidMatch = statusText.match(/Uid:\\s+(\\d+)/);\n const vmRssMatch = statusText.match(/VmRSS:\\s+(\\d+)/);\n const stateMatch = statusText.match(/State:\\s+(\\S)/);\n const name = nameMatch?.[1] ?? `pid_${pid}`;\n const uid = uidMatch ? parseInt(uidMatch[1]!, 10) : undefined;\n const vmRss = vmRssMatch ? parseInt(vmRssMatch[1]!, 10) : 0;\n const state = stateMatch?.[1] ?? \"?\";\n\n const isUserProcess = uid !== undefined && currentUid !== undefined && uid === currentUid;\n\n // Read /proc/[pid]/stat for CPU ticks\n const statText = readSafe(statPath);\n let cpuPercent = 0;\n let startedAt: string | null = null;\n\n if (statText) {\n // Parse /proc/[pid]/stat format\n // Format: pid (comm) state ppid pgrp session tty_nr tpgid flags minflt cminflt majflt\n // cmajflt utime stime cutime cstime priority nice num_threads itrealvalue starttime\n const parenEnd = statText.lastIndexOf(\")\");\n if (parenEnd > 0) {\n const fields = statText.slice(parenEnd + 2).split(/\\s+/);\n const utime = parseInt(fields[11] ?? \"0\", 10); // User mode jiffies\n const stime = parseInt(fields[12] ?? \"0\", 10); // Kernel mode jiffies\n const starttime = parseInt(fields[19] ?? \"0\", 10); // Start time in jiffies\n\n // CPU usage = (utime + stime) / uptime_seconds / Hz\n const hertz = 100; // CLK_TCK, typically 100\n const uptimeSeconds = readUptime();\n const totalJiffies = utime + stime;\n\n if (uptimeSeconds > 0) {\n const elapsedJiffies = uptimeSeconds * hertz;\n const processJiffies = totalJiffies;\n cpuPercent = Math.min(100, (processJiffies / Math.max(1, elapsedJiffies)) * 100 * cpus().length);\n }\n\n // Boot time for startedAt\n startedAt = formatStartTime(starttime, uptimeSeconds, hertz);\n }\n }\n\n // Read /proc/[pid]/cmdline for full command\n const cmdlineRaw = readSafe(cmdlinePath);\n const command = cmdlineRaw\n ? cmdlineRaw.split(\"\\0\").filter(Boolean).join(\" \")\n : name;\n\n // Read listening ports\n const ports = detectListeningPorts(pid);\n\n const memPercent = totalMemKb > 0 ? (vmRss / totalMemKb) * 100 : 0;\n\n return {\n pid,\n name,\n command: command.length > 200 ? command.slice(0, 200) + \"…\" : command,\n cpuPercent: Math.round(cpuPercent * 10) / 10,\n memPercent: Math.round(memPercent * 10) / 10,\n memRss: vmRss,\n state,\n startedAt,\n ports,\n isUserProcess,\n };\n}\n\n// ─── macOS / BSD ps fallback ─────────────────────────────────────\n\nfunction runPsProcesses(): SystemProcessInfo[] {\n try {\n const output = execSync(\n \"ps axo pid,comm,pcpu,pmem,rss,state,etime,user --sort=-pcpu 2>/dev/null | head -200\",\n { encoding: \"utf-8\", timeout: 5000 },\n );\n\n const lines = output.trim().split(\"\\n\").slice(1); // Skip header\n const currentUser = execSync(\"whoami\", { encoding: \"utf-8\", timeout: 1000 }).trim();\n\n return lines.map((line) => {\n const parts = line.trim().split(/\\s+/);\n const pid = parseInt(parts[0] ?? \"0\", 10);\n const name = parts[1] ?? \"\";\n const cpu = parseFloat(parts[2] ?? \"0\");\n const mem = parseFloat(parts[3] ?? \"0\");\n const rss = parseInt(parts[4] ?? \"0\", 10);\n const state = parts[5] ?? \"?\";\n const elapsed = parts[6] ?? \"\";\n const user = parts[7] ?? \"\";\n const command = parts.slice(1).join(\" \");\n\n return {\n pid,\n name,\n command: command.length > 200 ? command.slice(0, 200) + \"…\" : command,\n cpuPercent: Math.round(cpu * 10) / 10,\n memPercent: Math.round(mem * 10) / 10,\n memRss: rss,\n state: mapBsdState(state),\n startedAt: elapsed || null,\n ports: [] as number[],\n isUserProcess: user === currentUser,\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction mapBsdState(s: string): string {\n switch (s) {\n case \"R\": return \"R\";\n case \"S\": return \"S\";\n case \"Z\": return \"Z\";\n case \"T\": return \"T\";\n case \"I\": return \"S\";\n default: return s;\n }\n}\n\n// ─── Port Scanner ────────────────────────────────────────────────\n\nfunction detectListeningPorts(pid: number): number[] {\n try {\n // Read per-process /proc/[pid]/net/tcp to find ports owned by this process\n // This is only available on Linux and only readable by the process owner or root\n const tcpFile = `/proc/${pid}/net/tcp`;\n const tcp6File = `/proc/${pid}/net/tcp6`;\n const ports: number[] = [];\n\n for (const f of [tcpFile, tcp6File]) {\n try {\n const data = readSafe(f);\n if (data) {\n for (const port of parseProcNetTcp(data)) {\n if (!ports.includes(port)) ports.push(port);\n }\n }\n } catch {\n continue;\n }\n }\n\n return ports.sort((a, b) => a - b);\n } catch {\n return [];\n }\n}\n\nfunction parseProcNetTcp(data: string): number[] {\n const ports: number[] = [];\n const lines = data.split(\"\\n\").slice(1); // Skip header\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 3) continue;\n\n const localAddr = parts[1] ?? \"\";\n const state = parts[3] ?? \"\";\n\n // Only LISTEN state (0x0A)\n if (state !== \"0A\") continue;\n\n // Format: 00000000:0050 (hex IP:hex port)\n const portMatch = localAddr.match(/:([0-9a-fA-F]+)$/);\n if (portMatch) {\n const port = parseInt(portMatch[1]!, 16);\n if (port > 0 && port <= 65535) {\n ports.push(port);\n }\n }\n }\n\n return ports;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────\n\nfunction readSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nfunction readTotalMem(): number {\n try {\n const memInfo = readSafe(\"/proc/meminfo\");\n if (memInfo) {\n const match = memInfo.match(/MemTotal:\\s+(\\d+)/);\n if (match) return parseInt(match[1]!, 10);\n }\n } catch {\n // ignore\n }\n return 16_000_000; // Default ~16GB\n}\n\nfunction readUptime(): number {\n try {\n const data = readSafe(\"/proc/uptime\");\n if (data) {\n return parseFloat(data.split(/\\s+/)[0] ?? \"0\");\n }\n } catch {\n // ignore\n }\n return 0;\n}\n\nfunction formatStartTime(starttime: number, uptimeSeconds: number, hertz: number): string | null {\n try {\n const bootTime = Date.now() / 1000 - uptimeSeconds;\n const processStart = bootTime + starttime / hertz;\n return new Date(processStart * 1000).toISOString();\n } catch {\n return null;\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────\n\n/**\n * Get all system processes.\n * Uses /proc on Linux, falls back to `ps` on macOS/BSD.\n */\nexport function getSystemProcesses(filter?: SystemProcessFilter): SystemProcessInfo[] {\n let processes: SystemProcessInfo[];\n\n // Try /proc first (Linux), fall back to ps (macOS/BSD)\n if (existsSync(\"/proc\")) {\n processes = readProcProcesses();\n } else {\n processes = runPsProcesses();\n }\n\n // Apply filters\n if (filter) {\n if (filter.userOnly) {\n processes = processes.filter((p) => p.isUserProcess);\n }\n if (filter.name) {\n const nameLower = filter.name.toLowerCase();\n processes = processes.filter(\n (p) => p.name.toLowerCase().includes(nameLower) || p.command.toLowerCase().includes(nameLower),\n );\n }\n if (filter.pid) {\n processes = processes.filter((p) => p.pid === filter.pid);\n }\n if (filter.port) {\n processes = processes.filter((p) => p.ports.includes(filter.port!));\n }\n\n // Sort\n if (filter.sortBy) {\n processes.sort((a, b) => {\n switch (filter.sortBy) {\n case \"cpu\": return b.cpuPercent - a.cpuPercent;\n case \"mem\": return b.memPercent - a.memPercent;\n case \"pid\": return a.pid - b.pid;\n case \"name\": return a.name.localeCompare(b.name);\n default: return b.cpuPercent - a.cpuPercent;\n }\n });\n }\n\n // Limit\n if (filter.limit && filter.limit > 0) {\n processes = processes.slice(0, filter.limit);\n }\n }\n\n return processes;\n}\n\n/**\n * Get a single process by PID. Returns null if not found.\n */\nexport function getProcessByPid(pid: number): SystemProcessInfo | null {\n const processes = getSystemProcesses({ pid });\n return processes[0] ?? null;\n}\n\n/**\n * Kill a process by PID. Returns true if successful.\n */\nexport function killProcess(pid: number, signal: NodeJS.Signals = \"SIGTERM\"): boolean {\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a process is running.\n */\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0); // Signal 0 checks existence without killing\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get human-readable process state.\n */\nexport function formatProcessState(state: string): string {\n switch (state) {\n case \"R\": return \"Running\";\n case \"S\": return \"Sleeping\";\n case \"D\": return \"Disk Sleep\";\n case \"Z\": return \"Zombie\";\n case \"T\": return \"Stopped\";\n case \"t\": return \"Tracing\";\n case \"X\": return \"Dead\";\n case \"I\": return \"Idle\";\n default: return state;\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","resolve","execSync","pc","pc","fennecOrange","pc","args","args","args","args","pc","fennecOrange","pc","pc","num","resolve","fennecOrange","existsSync","command","resolve","existsSync","readFileSync","pc","args","confirmed","spinner","execSync"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/banner.ts","../src/utils/help.ts","../src/commands/pipe.ts","../src/commands/attach-pid.ts","../src/commands/attach-port.ts","../src/commands/watch.ts","../src/utils/format.ts","../src/utils/system-process.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, writeFileSync, readFileSync, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execSync } from \"node:child_process\";\nimport { FennecServer, SessionStore, ProcessManager } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { printBanner } from \"./utils/banner.js\";\nimport { showHelp } from \"./utils/help.js\";\nimport { pipeCommand } from \"./commands/pipe.js\";\nimport { attachPidCommand } from \"./commands/attach-pid.js\";\nimport { attachPortCommand } from \"./commands/attach-port.js\";\nimport { watchCommand } from \"./commands/watch.js\";\nimport {\n symbols,\n renderTable,\n renderKV,\n renderError,\n renderSuccess,\n renderCommand,\n renderAppName,\n logLevel,\n timestamp,\n divider,\n createSpinner,\n selectPrompt,\n confirmPrompt,\n type Column,\n type Row,\n} from \"./utils/format.js\";\nimport {\n getSystemProcesses,\n killProcess as sysKill,\n isProcessRunning,\n formatProcessState,\n} from \"./utils/system-process.js\";\n\nconst [, , command, ...args] = process.argv;\n\n// ─── Process Tracking ────────────────────────────────────────────\n\ninterface TrackedProcess {\n name: string;\n pid: number;\n command: string;\n port?: number;\n cwd?: string;\n startedAt: string;\n}\n\nfunction getTrackedPath(): string {\n const dir = process.env.FENNEC_DATA_DIR\n ? resolve(process.env.FENNEC_DATA_DIR)\n : resolve(homedir(), \".fennec\");\n return resolve(dir, \"tracked.json\");\n}\n\nfunction readTracked(): TrackedProcess[] {\n try {\n const path = getTrackedPath();\n if (!existsSync(path)) return [];\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return [];\n }\n}\n\nfunction saveTracked(processes: TrackedProcess[]): void {\n try {\n const path = getTrackedPath();\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(processes, null, 2), \"utf-8\");\n } catch {\n // Best-effort\n }\n}\n\nfunction addTracked(proc: TrackedProcess): void {\n const tracked = readTracked();\n // Remove old entry with same name\n const filtered = tracked.filter((t) => t.name !== proc.name);\n filtered.push(proc);\n saveTracked(filtered);\n}\n\nfunction removeTracked(name: string): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.name !== name));\n}\n\nfunction removeTrackedByPid(pid: number): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.pid !== pid));\n}\n\n// ─── Main ────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n if (!command || command === \"start\") {\n // Dual-mode: if first arg is a flag (--), start MCP server.\n // If first arg is a bare command (node, npm, etc.), start an app.\n if (args.length === 0 || args[0]?.startsWith(\"--\")) {\n await startServer(args);\n } else {\n await startCommand(args);\n }\n } else if (command === \"run\") {\n await runCommand(args);\n } else if (command === \"ps\") {\n await psCommand(args);\n } else if (command === \"status\") {\n await statusCommand(args);\n } else if (command === \"log\") {\n await logCommand(args);\n } else if (command === \"kill\") {\n await killCommand(args);\n } else if (command === \"restart\") {\n await restartCommand(args);\n } else if (command === \"attach\") {\n await attachCommand(args);\n } else if (command === \"pipe\") {\n await pipeCommand(args);\n } else if (command === \"attach-pid\") {\n await attachPidCommand(args);\n } else if (command === \"attach-port\") {\n await attachPortCommand(args);\n } else if (command === \"watch\") {\n await watchCommand(args);\n } else if (command === \"sessions\") {\n await sessionsCommand();\n } else if (command === \"setup\") {\n await setupCommand();\n } else if (command === \"install-browsers\") {\n printBanner();\n await installBrowsersCommand();\n } else if (command === \"init\") {\n printBanner();\n await initCommand();\n } else if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n console.log(` ${symbols.fox} ${pc.bold(\"Fennec\")} ${pc.dim(\"v1.11.2\")}`);\n } else if (command === \"help\" || command === \"--help\" || command === \"-h\") {\n console.log(pc.dim(\"\\n Use 'fennec help' for more information.\\n\"));\n printBanner();\n showHelp();\n } else {\n console.error(renderError(`Unknown command: ${command}`, \"Run 'fennec help' for usage information\"));\n process.exit(1);\n }\n}\n\n// ─── Command: start ──────────────────────────────────────────────\n\nasync function startServer(args: string[]): Promise<void> {\n printBanner();\n console.error(` ${pc.dim(\"Starting Fennec MCP server...\")}\\n`);\n\n const configIndex = args.indexOf(\"--config\");\n const configPath = configIndex !== -1 ? args[configIndex + 1] : undefined;\n\n const apiPortIndex = args.indexOf(\"--api-port\");\n const apiPort = apiPortIndex !== -1 ? parseInt(args[apiPortIndex + 1]!, 10) : 3456;\n\n try {\n const server = new FennecServer(configPath);\n await server.start();\n\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Fennec server is running\")}`);\n console.error(` ${renderKV(\"Transport\", \"stdio\")}`);\n console.error(` ${renderKV(\"Management API\", `http://localhost:${apiPort}`)}`);\n console.error(` ${renderKV(\"AI Agent\", \"Connect via MCP protocol\")}`);\n console.error(`\\n ${pc.dim(\"Press Ctrl+C to stop\")}\\n`);\n } catch (error) {\n console.error(renderError(\"Failed to start server\", String(error)));\n process.exit(1);\n }\n}\n\n// ─── Command: start (App Mode) ───────────────────────────────────\n\nasync function startCommand(args: string[]): Promise<void> {\n printBanner();\n console.error(` ${pc.dim(\"Starting app...\")}\\n`);\n await runCommand(args);\n}\n\n// ─── Shared: start/run a process ─────────────────────────────────\n\nasync function runCommand(args: string[]): Promise<void> {\n const nameIndex = args.indexOf(\"--name\");\n const name = nameIndex !== -1 ? args[nameIndex + 1] : undefined;\n const portIndex = args.indexOf(\"--port\");\n const port = portIndex !== -1 ? parseInt(args[portIndex + 1]!, 10) : undefined;\n const cwdIndex = args.indexOf(\"--cwd\");\n const cwd = cwdIndex !== -1 ? args[cwdIndex + 1] : undefined;\n const restartFlag = args.includes(\"--restart\");\n\n // Extract command (everything before --name, --port, or --cwd)\n const stopFlags = [nameIndex, portIndex, cwdIndex].filter((i) => i !== -1) as number[];\n const cmdEnd = Math.min(...stopFlags, Infinity);\n const cmdParts = args.slice(0, cmdEnd);\n const cmd = cmdParts.join(\" \");\n\n if (!cmd) {\n console.error(renderError(\"Missing command\", \"Usage: fennec start|run <command> --name <name> [--port <port>] [--cwd <dir>] [--restart]\"));\n process.exit(1);\n }\n\n const appName = name ?? cmdParts[0] ?? \"app\";\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Running\")} ${renderAppName(appName)}\\n`);\n console.error(` ${renderKV(\"Command\", cmd)}`);\n if (port) console.error(` ${renderKV(\"Port\", String(port))}`);\n if (cwd) console.error(` ${renderKV(\"Directory\", cwd)}`);\n console.error(` ${renderKV(\"Restart\", restartFlag ? \"on crash\" : \"off\")}`);\n console.error(` ${divider()}`);\n\n // Spawn process using ProcessManager\n const config = {\n maxProcesses: 10,\n logBufferLines: 2000,\n spawnAllowlist: [],\n };\n const pm = new ProcessManager(config);\n\n try {\n const proc = pm.spawn(cmdParts[0]!, cmdParts.slice(1), cwd, undefined, appName);\n\n // Save to tracked processes\n addTracked({\n name: appName,\n pid: proc.pid,\n command: cmd,\n port,\n cwd,\n startedAt: new Date().toISOString(),\n });\n\n console.error(`\\n ${pc.green(\"●\")} ${pc.bold(appName)} ${pc.dim(`started (PID: ${proc.pid})`)}${port ? pc.dim(` :${port}`) : \"\"}\\n`);\n\n // Forward logs to console\n const stdout = proc.child.stdout;\n const stderr = proc.child.stderr;\n\n if (stdout) {\n stdout.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n for (const line of lines) {\n const level = line.includes(\"error\") || line.includes(\"Error\") ? \"error\" as const\n : line.includes(\"warn\") || line.includes(\"WARN\") ? \"warn\" as const\n : \"info\" as const;\n const time = timestamp();\n const lvl = logLevel(level);\n process.stdout.write(` ${time} ${lvl} ${line}\\n`);\n }\n });\n }\n\n if (stderr) {\n stderr.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n for (const line of lines) {\n const time = timestamp();\n const lvl = logLevel(\"error\");\n process.stderr.write(` ${time} ${lvl} ${pc.red(line)}\\n`);\n }\n });\n }\n\n // Handle process exit\n proc.child.on(\"exit\", (code, signal) => {\n // Auto-cleanup tracked process\n removeTracked(appName);\n if (restartFlag && code !== 0) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${appName} ${pc.dim(`exited (${code}), restarting...`)}`);\n pm.restart(appName).catch(() => {});\n } else {\n console.error(`\\n ${pc.dim(\"○\")} ${pc.bold(appName)} ${pc.dim(`exited (${code})`)}`);\n }\n });\n\n // Keep running\n await new Promise(() => {});\n } catch (error) {\n console.error(renderError(`Failed to run ${appName}`, String(error)));\n process.exit(1);\n }\n}\n\n// ─── Command: ps (List Managed / Tracked Processes) ───────────────\n// Like PM2: by default shows only Fennec-tracked apps.\n// Use --system or -a to see all system processes.\n\nasync function psCommand(args: string[]): Promise<void> {\n const watchFlag = args.includes(\"-w\") || args.includes(\"--watch\");\n const systemFlag = args.includes(\"--system\") || args.includes(\"-a\") || args.includes(\"--all\");\n const nameFilter = args.includes(\"--name\") ? args[args.indexOf(\"--name\") + 1] : undefined;\n const sortBy = args.includes(\"--sort\")\n ? (args[args.indexOf(\"--sort\") + 1] as \"cpu\" | \"mem\" | \"pid\" | \"name\")\n : \"name\";\n\n if (watchFlag && systemFlag) {\n await watchSystemProcesses(sortBy, 15);\n return;\n }\n\n // ─── Mode 1: Show all system processes (--system / -a) ──\n if (systemFlag) {\n const spinner = createSpinner(\"Scanning system processes...\");\n try {\n const processes = getSystemProcesses({\n name: nameFilter,\n userOnly: true,\n sortBy,\n limit: 30,\n });\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (processes.length === 0) {\n console.error(`\\n ${pc.dim(\"No system processes found.\")}\\n`);\n return;\n }\n\n const columns: Column[] = [\n { key: \"pid\", label: \"PID\", align: \"right\", format: (v) => pc.dim(String(v).padStart(6)) },\n { key: \"name\", label: \"Name\", format: (v) => pc.bold(String(v)) },\n { key: \"cpu\", label: \"CPU%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"state\", label: \"State\", format: (v) => {\n const s = String(v);\n if (s === \"R\" || s === \"Running\") return pc.green(s);\n if (s === \"Z\" || s === \"Zombie\") return pc.red(s);\n if (s === \"S\" || s === \"Sleeping\") return pc.cyan(s);\n return pc.dim(s);\n }},\n ];\n\n const rows: Row[] = processes.map((p) => ({\n pid: p.pid,\n name: p.name,\n cpu: p.cpuPercent,\n mem: p.memPercent,\n state: formatProcessState(p.state),\n }));\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"System Processes\")} ${pc.dim(`(top ${processes.length} by ${sortBy})`)}\\n`);\n console.error(renderTable(columns, rows));\n console.error();\n } catch (error) {\n spinner.fail(\"Failed to scan processes\");\n console.error(renderError(\"Process scan failed\", String(error)));\n }\n return;\n }\n\n // ─── Mode 2: Show only Fennec-tracked processes (default) ─\n const tracked = readTracked();\n\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes.\")}`);\n console.error(` ${pc.dim(\"Start an app with:\")} ${pc.cyan(\"fennec start <command> --name <name>\")}\\n`);\n return;\n }\n\n const columns: Column[] = [\n { key: \"name\", label: \"App\", format: (v) => pc.bold(String(v)) },\n { key: \"pid\", label: \"PID\", align: \"right\" },\n { key: \"status\", label: \"Status\", format: (v) => {\n const s = v as string;\n if (s === \"running\") return pc.green(\"● running\");\n return pc.red(\"○ stopped\");\n }},\n { key: \"port\", label: \"Port\", format: (v) => {\n const p = v as number | null;\n return p ? pc.yellow(`:${p}`) : pc.dim(\"-\");\n }},\n { key: \"command\", label: \"Command\", format: (v) => {\n const c = String(v);\n return c.length > 50 ? c.slice(0, 50) + \"…\" : c;\n }},\n { key: \"uptime\", label: \"Uptime\", format: (v) => pc.dim(String(v)) },\n ];\n\n const rows: Row[] = tracked.map((t) => {\n const running = isProcessRunning(t.pid);\n const uptime = running\n ? formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000))\n : \"-\";\n return {\n name: t.name,\n pid: running ? String(t.pid) : pc.dim(String(t.pid)),\n status: running ? \"running\" : \"stopped\",\n port: t.port ?? null,\n command: t.command,\n uptime,\n };\n });\n\n const runningCount = tracked.filter((t) => isProcessRunning(t.pid)).length;\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Apps\")} ${pc.dim(`(${runningCount}/${tracked.length} running)`)}\\n`);\n console.error(renderTable(columns, rows));\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec start <command> --name <name> --port <port>\")} ${pc.dim(\"to add more apps.\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec log <name>\")} ${pc.dim(\"to view logs.\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec kill <name>\")} ${pc.dim(\"to stop an app.\")}`);\n console.error();\n}\n\nfunction formatUptime(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h >= 24) {\n const d = Math.floor(h / 24);\n return `${d}d ${h % 24}h ${m}m`;\n }\n return `${h}h ${m}m`;\n}\n\nasync function watchSystemProcesses(sortBy: string, limit: number): Promise<void> {\n console.error(`\\n ${pc.bold(\"Watching system processes\")} ${pc.dim(\"(Ctrl+C to stop, refreshes every 3s)\")}\\n`);\n\n const render = () => {\n const processes = getSystemProcesses({\n userOnly: true,\n sortBy: sortBy as \"cpu\" | \"mem\" | \"pid\" | \"name\",\n limit,\n });\n\n const columns: Column[] = [\n { key: \"pid\", label: \"PID\", align: \"right\", format: (v) => pc.dim(String(v).padStart(6)) },\n { key: \"name\", label: \"Name\", format: (v) => pc.bold(String(v)) },\n { key: \"cpu\", label: \"CPU%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => {\n const num = v as number;\n return num > 10 ? pc.red(String(num)) : num > 5 ? pc.yellow(String(num)) : pc.dim(String(num));\n }},\n { key: \"state\", label: \"S\", align: \"center\" },\n ];\n\n const rows: Row[] = processes.map((p) => ({\n pid: p.pid,\n name: p.name,\n cpu: p.cpuPercent,\n mem: p.memPercent,\n state: p.state,\n }));\n\n return ` ${timestamp()} ${pc.dim(`${processes.length} processes`)}\\n${renderTable(columns, rows, { compact: true })}`;\n };\n\n console.error(render());\n const interval = setInterval(() => {\n process.stdout.write(\"\\x1B[J\"); // Clear from cursor to end\n console.error(render());\n }, 3000);\n\n process.on(\"SIGINT\", () => {\n clearInterval(interval);\n process.exit(0);\n });\n\n await new Promise(() => {});\n}\n\n// ─── Command: status ─────────────────────────────────────────────\n\nasync function statusCommand(_args: string[]): Promise<void> {\n const watchFlag = _args.includes(\"-w\") || _args.includes(\"--watch\");\n\n // Show tracked processes + system overview\n const tracked = readTracked();\n const topSystem = getSystemProcesses({ userOnly: true, sortBy: \"cpu\", limit: 5 });\n const totalUserProcs = getSystemProcesses({ userOnly: true }).length;\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Status\")}\\n`);\n\n // ─── Tracked Apps Section ────────────────────────\n if (tracked.length > 0) {\n const runningCount = tracked.filter((t) => isProcessRunning(t.pid)).length;\n console.error(` ${pc.bold(\"Managed Apps\")} ${pc.dim(`(${runningCount}/${tracked.length} running)`)}\\n`);\n\n for (const t of tracked) {\n const running = isProcessRunning(t.pid);\n const statusIcon = running ? pc.green(\"●\") : pc.red(\"○\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n const uptime = running\n ? pc.dim(formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000)))\n : pc.red(\"stopped\");\n console.error(` ${statusIcon} ${pc.bold(t.name)}${portStr} ${pc.dim(`(PID ${t.pid})`)} — ${uptime}`);\n }\n console.error();\n } else {\n console.error(` ${pc.dim(\"No managed apps.\")} ${pc.cyan(\"fennec start <command> --name <name>\")}\\n`);\n }\n\n // ─── System Summary ──────────────────────────────\n console.error(` ${pc.bold(\"System\")} ${pc.dim(`(${totalUserProcs} user processes)`)}`);\n\n for (const p of topSystem) {\n const cpuStr = p.cpuPercent > 10 ? pc.red(`${p.cpuPercent}%`) : p.cpuPercent > 5 ? pc.yellow(`${p.cpuPercent}%`) : pc.dim(`${p.cpuPercent}%`);\n const memStr = p.memPercent > 10 ? pc.red(`${p.memPercent}%`) : p.memPercent > 5 ? pc.yellow(`${p.memPercent}%`) : pc.dim(`${p.memPercent}%`);\n console.error(` ${pc.dim(`PID ${p.pid}`)} ${pc.bold(p.name)} — CPU: ${cpuStr} MEM: ${memStr}`);\n }\n\n if (watchFlag) {\n await watchSystemProcesses(\"cpu\", 15);\n }\n\n console.error();\n}\n\n// ─── Command: kill ───────────────────────────────────────────────\n\nasync function killCommand(args: string[]): Promise<void> {\n const rawTarget = args[0];\n const signalIndex = args.indexOf(\"--signal\");\n const signalRaw = signalIndex !== -1 ? args[signalIndex + 1] : \"SIGTERM\";\n const signal = (signalRaw ?? \"SIGTERM\") as NodeJS.Signals;\n\n // ─── Kill All Mode ─────────────────────────────────────\n if (rawTarget === \"all\" || args.includes(\"--all\") || args.includes(\"-a\")) {\n const userProcs = getSystemProcesses({ userOnly: true, sortBy: \"cpu\", limit: 200 });\n if (userProcs.length === 0) {\n console.error(` ${pc.dim(\"No user processes to kill.\")}`);\n return;\n }\n\n console.error(`\\n ${pc.bold(`Kill ${userProcs.length} user processes?`)}`);\n console.error(` ${pc.dim(\"This will stop ALL your running processes.\")}`);\n console.error(` ${pc.yellow(\"⚠ System processes will not be affected.\")}\\n`);\n\n const confirmed = await confirmPrompt(\n `${pc.red(\"Are you sure?\")} ${pc.dim(\"This cannot be undone\")}`,\n false,\n );\n\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled.\")}`);\n return;\n }\n\n const spinner = createSpinner(`Killing ${userProcs.length} processes...`);\n let killed = 0;\n let failed = 0;\n\n for (const proc of userProcs) {\n if (sysKill(proc.pid, signal)) {\n killed++;\n removeTrackedByPid(proc.pid);\n } else {\n failed++;\n }\n // Small delay to avoid overwhelming system\n if (killed % 10 === 0) await new Promise((r) => setTimeout(r, 50));\n }\n\n await new Promise((r) => setTimeout(r, 500));\n\n if (killed > 0) {\n spinner.succeed(`${killed} process(es) killed`);\n } else {\n spinner.fail(`Failed to kill processes`);\n }\n\n if (failed > 0) {\n console.error(` ${pc.yellow(`${failed} process(es) could not be killed`)} ${pc.dim(\"(try with sudo)\")}`);\n }\n return;\n }\n\n // ─── Single Kill Mode ─────────────────────────────────\n if (!rawTarget) {\n console.error(renderError(\"Missing target\", \"Usage: fennec kill <pid|name|all> [--signal SIGTERM|SIGKILL|SIGINT]\"));\n process.exit(1);\n }\n\n // Resolve target: numeric = PID, string = find by name\n let targetPid: number;\n let displayName: string;\n\n const pid = parseInt(rawTarget, 10);\n if (!isNaN(pid) && String(pid) === rawTarget) {\n // Direct PID\n if (!isProcessRunning(pid)) {\n console.error(renderError(\"Process not found\", `No process with PID ${pid} is running`));\n process.exit(1);\n }\n targetPid = pid;\n displayName = `PID ${pid}`;\n } else {\n // Find by name — show options if multiple matches\n const matches = getSystemProcesses({ name: rawTarget, userOnly: true, sortBy: \"cpu\" });\n if (matches.length === 0) {\n console.error(renderError(\"Process not found\", `No running process matching \"${rawTarget}\"`));\n process.exit(1);\n }\n\n if (matches.length > 1) {\n // Multiple matches — let user pick\n console.error(`\\n ${pc.bold(`Multiple processes match \"${rawTarget}\":`)}`);\n const selected = await selectPrompt(\n `Select which to kill:`,\n matches.map((p, i) => ({\n value: String(i),\n label: `${p.name} (PID ${p.pid})`,\n description: `${p.command.slice(0, 80)} — CPU: ${p.cpuPercent}% MEM: ${p.memPercent}%`,\n })),\n );\n if (selected === null) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n const idx = parseInt(selected, 10);\n targetPid = matches[idx]!.pid;\n displayName = `${matches[idx]!.name} (PID ${targetPid})`;\n } else {\n targetPid = matches[0]!.pid;\n displayName = `${matches[0]!.name} (PID ${targetPid})`;\n }\n }\n\n const confirmed = await confirmPrompt(\n `Kill ${pc.bold(displayName)} with ${pc.yellow(signal)}?`,\n false,\n );\n\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n\n const spinner = createSpinner(`Sending ${signal} to ${displayName}...`);\n\n const success = sysKill(targetPid, signal);\n\n if (success) {\n // Wait a moment to verify\n await new Promise((r) => setTimeout(r, 200));\n const stillRunning = isProcessRunning(targetPid);\n if (stillRunning && signal !== \"SIGKILL\") {\n spinner.warn(`${displayName} did not respond to ${signal}`);\n const forceKill = await confirmPrompt(\n `Send ${pc.red(\"SIGKILL\")} to force stop?`,\n true,\n );\n if (forceKill) {\n const forceSpinner = createSpinner(`Sending SIGKILL to ${displayName}...`);\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 300));\n if (!isProcessRunning(targetPid)) {\n forceSpinner.succeed(`${displayName} force stopped`);\n } else {\n forceSpinner.fail(`${displayName} could not be stopped (permission denied?)`);\n }\n } else {\n console.error(` ${pc.dim(\"Retrying with SIGTERM...\")}`);\n sysKill(targetPid, \"SIGTERM\");\n console.error(` ${pc.yellow(\"⚠\")} ${displayName} ${pc.dim(\"may still be running\")}`);\n }\n } else {\n // Clean up tracked process\n removeTrackedByPid(targetPid);\n spinner.succeed(`${displayName} stopped`);\n }\n } else {\n spinner.fail(`Failed to kill ${displayName}`);\n console.error(renderError(\"Permission denied\", `Try running with sudo or use a different signal.`));\n }\n}\n\n// ─── Command: restart ────────────────────────────────────────────\n\nasync function restartCommand(args: string[]): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error(renderError(\"Missing process name/pid\", \"Usage: fennec restart <pid|name>\"));\n process.exit(1);\n }\n\n // Resolve PID\n let targetPid: number;\n const pid = parseInt(name, 10);\n if (!isNaN(pid) && String(pid) === name) {\n targetPid = pid;\n } else {\n const processes = getSystemProcesses({ name, userOnly: true, limit: 1 });\n if (processes.length === 0) {\n console.error(renderError(\"Process not found\", `No process matching \"${name}\"`));\n process.exit(1);\n }\n targetPid = processes[0]!.pid;\n }\n\n const confirmed = await confirmPrompt(\n `Restart ${pc.bold(`${name} (PID ${targetPid})`)}?`,\n false,\n );\n\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n\n const spinner = createSpinner(`Stopping PID ${targetPid}...`);\n\n // Kill the process\n const killed = sysKill(targetPid, \"SIGTERM\");\n if (!killed) {\n spinner.fail(`Failed to stop PID ${targetPid}`);\n return;\n }\n\n // Wait for exit\n await new Promise((r) => setTimeout(r, 1000));\n\n const stillRunning = isProcessRunning(targetPid);\n if (stillRunning) {\n spinner.warn(`Process didn't stop, sending SIGKILL...`);\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 500));\n }\n\n // Get the command from the process info to suggest restart command\n const procInfo = getSystemProcesses({ pid: targetPid, limit: 1 })[0];\n let suggestion = \"\";\n if (procInfo) {\n suggestion = `\\n ${pc.dim(\"Re-run:\")} ${renderCommand(procInfo.command)}`;\n }\n\n spinner.succeed(`${name} stopped${suggestion}`);\n}\n\n// ─── Command: log ────────────────────────────────────────────────\n\nasync function logCommand(args: string[]): Promise<void> {\n const target = args[0];\n if (!target) {\n console.error(renderError(\"Missing process name/pid\", \"Usage: fennec log <pid|name> [--lines N] [--level LEVEL] [-f]\"));\n process.exit(1);\n }\n\n const linesIndex = args.indexOf(\"--lines\");\n const lines = linesIndex !== -1 ? parseInt(args[linesIndex + 1]!, 10) : 30;\n const followFlag = args.includes(\"-f\") || args.includes(\"--follow\");\n\n // Resolve PID\n let targetPid: number;\n let displayName: string;\n const pid = parseInt(target, 10);\n if (!isNaN(pid) && String(pid) === target) {\n targetPid = pid;\n displayName = `PID ${pid}`;\n } else {\n const processes = getSystemProcesses({ name: target, userOnly: true, limit: 1 });\n if (processes.length === 0) {\n console.error(renderError(\"Process not found\", `No process matching \"${target}\"`));\n process.exit(1);\n }\n targetPid = processes[0]!.pid;\n displayName = `${processes[0]!.name} (PID ${targetPid})`;\n }\n\n const spinner = createSpinner(`Fetching logs for ${displayName}...`);\n\n try {\n // Try journalctl first (Linux systemd), then fall back to /proc/pid/fd\n let logLines: string[] = [];\n\n try {\n const { execSync } = await import(\"node:child_process\");\n const output = execSync(\n `journalctl --no-pager -n ${lines} _PID=${targetPid} 2>/dev/null || tail -n ${lines} /proc/${targetPid}/fd/1 2>/dev/null || echo \"No logs available\"`,\n { encoding: \"utf-8\", timeout: 3000 },\n );\n logLines = output.trim().split(\"\\n\").filter(Boolean);\n } catch {\n logLines = [` ${pc.dim(\"(no log access — process may not be managed by Fennec)\")}`];\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Logs\")} ${renderAppName(displayName)} ${pc.dim(`(last ${lines} lines)`)}\\n`);\n\n for (const line of logLines.slice(-lines)) {\n const display = line.length > 200 ? line.slice(0, 200) + \"…\" : line;\n if (line.toLowerCase().includes(\"error\") || line.toLowerCase().includes(\"fail\")) {\n console.error(` ${pc.red(display)}`);\n } else if (line.toLowerCase().includes(\"warn\")) {\n console.error(` ${pc.yellow(display)}`);\n } else {\n console.error(` ${display}`);\n }\n }\n\n if (followFlag) {\n console.error(`\\n ${pc.dim(\"Following... (Ctrl+C to stop)\")}\\n`);\n await new Promise(() => {});\n }\n\n console.error();\n } catch (error) {\n spinner.fail(`Failed to fetch logs for ${displayName}`);\n console.error(renderError(\"Log fetch failed\", String(error)));\n }\n}\n\n// ─── Command: attach ─────────────────────────────────────────────\n\nasync function attachCommand(args: string[]): Promise<void> {\n const port = parseInt(args[0]!, 10);\n if (isNaN(port)) {\n console.error(renderError(\"Invalid port\", \"Usage: fennec attach <port> --name <name>\"));\n process.exit(1);\n }\n\n const nameIndex = args.indexOf(\"--name\");\n const rawName = nameIndex !== -1 ? args[nameIndex + 1] : undefined;\n const name = rawName ?? `port-${port}`;\n\n const spinner = createSpinner(`Attaching to :${port}...`);\n\n try {\n const { PortDetector } = await import(\"@plumpslabs/fennec-core\");\n const detector = new PortDetector();\n const info = detector.detectByPort(port);\n\n if (info) {\n spinner.succeed(`Attached to :${port}`);\n console.error(` ${renderKV(\"Name\", renderAppName(name))}`);\n console.error(` ${renderKV(\"PID\", String(info.pid))}`);\n console.error(` ${renderKV(\"Command\", info.command || pc.dim(\"unknown\"))}`);\n } else {\n spinner.fail(`No process found on port ${port}`);\n process.exit(1);\n }\n } catch (error) {\n spinner.fail(`Failed to attach to :${port}`);\n console.error(renderError(\"Error\", String(error)));\n process.exit(1);\n }\n}\n\n// ─── Command: sessions ───────────────────────────────────────────\n\nasync function sessionsCommand(): Promise<void> {\n const store = new SessionStore(\"./.fennec/sessions\");\n const sessions = store.list();\n\n if (sessions.length === 0) {\n console.error(`\\n ${pc.dim(\"No saved sessions found.\")}\\n`);\n return;\n }\n\n const columns: Column[] = [\n { key: \"name\", label: \"Name\", format: (v) => pc.bold(String(v)) },\n { key: \"origin\", label: \"Origin\" },\n { key: \"savedAt\", label: \"Saved\", format: (v) => pc.dim(String(v)) },\n ];\n\n const rows: Row[] = sessions.map((s) => ({\n name: s.name,\n origin: s.origin,\n savedAt: new Date(s.savedAt).toLocaleString(),\n }));\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Saved Sessions\")}\\n`);\n console.error(renderTable(columns, rows));\n console.error(` ${pc.dim(`${sessions.length} session(s)`)}\\n`);\n}\n\n// ─── Command: setup ──────────────────────────────────────────────\n\nasync function setupCommand(): Promise<void> {\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Setup\")}\\n`);\n\n const mcpClient = await selectPrompt(\"Which MCP client are you using?\", [\n { value: \"claude\", label: \"Claude Desktop\", description: \"Anthropic's AI desktop app\" },\n { value: \"cursor\", label: \"Cursor\", description: \"AI-powered code editor\" },\n { value: \"cline\", label: \"Cline\", description: \"VS Code MCP client\" },\n { value: \"other\", label: \"Other MCP client\", description: \"Any MCP-compatible client\" },\n ]);\n\n if (!mcpClient) {\n console.error(` ${pc.dim(\"Setup cancelled.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${pc.green(\"✓\")} Selected: ${pc.bold(mcpClient)}\\n`);\n\n const configSnippet = `{\n \"mcpServers\": {\n \"fennec\": {\n \"command\": \"fennec\",\n \"args\": [\"start\"]\n }\n }\n}`;\n\n console.error(` ${pc.bold(\"Add this to your MCP client config:\")}\\n`);\n console.error(` ${pc.dim(\"```\")}`);\n console.error(configSnippet.split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\"));\n console.error(` ${pc.dim(\"```\")}\\n`);\n console.error(` ${renderSuccess(\"Setup complete!\")} ${pc.dim(\"Run\")} ${renderCommand(\"fennec start\")} ${pc.dim(\"to begin.\")}\\n`);\n}\n\n// ─── Command: install-browsers ───────────────────────────────────\n\nasync function installBrowsersCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Installing Browser Engines\")}\\n`);\n\n const spinner = createSpinner(\"Installing Chromium...\");\n\n try {\n execSync(\"npx playwright install chromium\", {\n stdio: \"pipe\",\n timeout: 120000,\n });\n spinner.succeed(\"Chromium installed successfully\");\n } catch {\n spinner.fail(\"Failed to install Chromium\");\n console.error(` ${pc.yellow(\"→\")} Try running: ${renderCommand(\"npx playwright install chromium\")}`);\n }\n\n console.error(`\\n ${pc.green(\"✓\")} Browser installation complete.\\n`);\n}\n\n// ─── Command: init ───────────────────────────────────────────────\n\nasync function initCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Initialize Fennec Configuration\")}\\n`);\n\n const configFile = resolve(\"./fennec.config.yaml\");\n\n if (existsSync(configFile)) {\n const overwrite = await confirmPrompt(\n `${pc.yellow(\"fennec.config.yaml\")} already exists. Overwrite?`,\n false,\n );\n\n if (!overwrite) {\n console.error(` ${pc.dim(\"Cancelled.\")}\\n`);\n return;\n }\n }\n\n const spinner = createSpinner(\"Generating configuration...\");\n\n const config = `# Fennec Configuration\n# Generated by 'fennec init'\n\nbrowser:\n type: chromium\n headless: true\n defaultTimeout: 30000\n viewport:\n width: 1280\n height: 720\n\nsession:\n maxSessions: 10\n idleTimeoutSecs: 1800\n persistPath: \".fennec/sessions\"\n\nprocess:\n maxProcesses: 10\n logBufferLines: 2000\n spawnAllowlist:\n - \"npm\"\n - \"node\"\n - \"pnpm\"\n - \"yarn\"\n - \"bun\"\n - \"python\"\n - \"python3\"\n\nterminal:\n logBufferLines: 2000\n watchDebounceMs: 50\n\nnetwork:\n bufferSize: 1000\n captureRequestBody: true\n captureResponseBody: true\n slowRequestThresholdMs: 1000\n\nconsole:\n bufferSize: 500\n levels:\n - log\n - info\n - warn\n - error\n - debug\n\ncorrelation:\n windowMs: 500\n enableRootCauseInference: true\n minConfidence: 0.7\n\nsecurity:\n sandbox: true\n allowProcessSpawn: true\n allowProcessKill: false\n allowedDomains: []\n blockedDomains: []\n allowFileProtocol: false\n allowCDPRawAccess: false\n exportPath: \".fennec/exports\"\n maxExportSizeMB: 10\n\ntransport:\n type: stdio\n port: 3333\n host: \"127.0.0.1\"\n\nlogging:\n level: info\n format: pretty\n file: null\n`;\n\n writeFileSync(configFile, config, \"utf-8\");\n\n spinner.succeed(`Configuration written to ${pc.bold(configFile)}`);\n console.error(`\\n ${pc.dim(\"Edit the file to customize Fennec behavior.\")}\\n`);\n}\n\n// ─── Start ───────────────────────────────────────────────────────\n\nmain().catch((error) => {\n console.error(renderError(\"Fatal error\", String(error)));\n process.exit(1);\n});\n","import pc from \"picocolors\";\n\n// picocolors 1.x types don't include hex(), and on some Node.js versions\n// the CJS/ESM interop can make pc.hex undefined at runtime.\n// We detect and fall back gracefully.\nexport function hexColor(color: string): (s: string) => string {\n if (typeof (pc as any).hex === \"function\") {\n return (pc as any).hex(color);\n }\n // Fallback: return text unchanged if hex coloring isn't available\n return (s: string) => s;\n}\n\nconst fennecOrange = hexColor(\"#FF6432\");\nconst fennecYellow = hexColor(\"#FFB347\");\n\nconst FOX = `\n ${fennecOrange(\"/\\\\\\\\ /\\\\\\\\\")}\n ${fennecOrange(\"(\")} ${fennecYellow(\"o o\")} ${fennecOrange(\") \") + pc.bold(\"Fennec\")} ${pc.dim(\"v1.11.2\")}\n ${fennecOrange(\"=(\")} ${fennecYellow(\" Y \")} ${fennecOrange(\")=\")} ${pc.dim(\"ears everywhere in your stack.\")}\n ${fennecOrange(\") (\")}\n`;\n\nconst FOX_COMPACT = `${pc.redBright(\" 🦊\")} ${pc.bold(\"Fennec\")} ${pc.dim(\"v1.11.2\")}`;\n\nexport function printBanner(): void {\n if (process.stdout.isTTY) {\n console.error(FOX);\n } else {\n console.error(FOX_COMPACT);\n }\n}\n\nexport function printMiniBanner(): void {\n console.error(FOX_COMPACT + pc.dim(\" — ears everywhere in your stack.\"));\n}\n\nexport { FOX, FOX_COMPACT };\n","import pc from \"picocolors\";\nimport { hexColor } from \"./banner.js\";\n\nconst fennecOrange = hexColor(\"#FF6432\");\n\nexport function showHelp(): void {\n const sep = fennecOrange(\"─\".repeat(50));\n\n console.error(`\n\n ${pc.bold(\"Usage:\")} fennec ${pc.dim(\"<command>\")} ${pc.dim(\"[options]\")}\n\n ${sep}\n ${pc.bold(\"Server\")}\n ${sep}\n\n ${pc.cyan(\"start\")} ${pc.dim(\"Start Fennec MCP server (default)\")}\n ${pc.dim(\"--config\")} Path to config file\n ${pc.dim(\"--transport\")} Transport type ${pc.dim(\"(stdio | sse) [default: stdio]\")}\n ${pc.dim(\"--api-port\")} Management API port ${pc.dim(\"[default: 3456]\")}\n\n ${pc.cyan(\"start\")} ${pc.dim(\"<command>\")} ${pc.dim(\"Start an app under Fennec observation (new!)\")}\n ${pc.dim(\"--name\")} App name ${pc.dim(\"(required for tracking)\")}\n ${pc.dim(\"--port\")} Port the app listens on ${pc.dim(\"(optional)\")}\n ${pc.dim(\"--cwd\")} Working directory\n ${pc.dim(\"--restart\")} Auto-restart on crash\n\n ${sep}\n ${pc.bold(\"Process Management\")}\n ${sep}\n\n ${pc.cyan(\"ps\")} ${pc.dim(\"[options]\")} ${pc.dim(\"List Fennec-tracked apps (like PM2)\")}\n ${pc.dim(\"--system, -a\")} Show all system processes\n ${pc.dim(\"--name\")} Filter by app name\n ${pc.dim(\"-w, --watch\")} Watch mode ${pc.dim(\"(system processes refresh every 3s)\")}\n\n ${pc.cyan(\"run\")} ${pc.dim(\"<command>\")} ${pc.dim(\"Run a command under Fennec observation\")}\n ${pc.dim(\"--name\")} Process name ${pc.dim(\"(required)\")}\n ${pc.dim(\"--cwd\")} Working directory\n ${pc.dim(\"--restart\")} Auto-restart on crash\n\n ${pc.cyan(\"status\")} ${pc.dim(\"[name]\")} ${pc.dim(\"Show system overview & top processes\")}\n ${pc.dim(\"-w, --watch\")} Watch mode ${pc.dim(\"(refresh every 3s)\")}\n\n ${pc.cyan(\"log\")} ${pc.dim(\"<pid|name>\")} ${pc.dim(\"Show logs for a process\")}\n ${pc.dim(\"--lines\")} Number of lines ${pc.dim(\"[default: 30]\")}\n ${pc.dim(\"-f, --follow\")} Follow mode ${pc.dim(\"(journalctl --follow)\")}\n\n ${pc.cyan(\"kill\")} ${pc.dim(\"<pid|name|all>\")} ${pc.dim(\"Kill process(es) by PID, name, or all\")}\n ${pc.dim(\"--signal\")} Signal to send ${pc.dim(\"[default: SIGTERM]\")}\n ${pc.dim(\"--all\")} Kill all user processes\n\n ${pc.cyan(\"restart\")} ${pc.dim(\"<pid|name>\")} ${pc.dim(\"Kill + show re-run command\")}\n\n ${sep}\n ${pc.bold(\"Observation\")}\n ${sep}\n\n ${pc.cyan(\"attach\")} ${pc.dim(\"<port>\")} ${pc.dim(\"Observe a process by port\")}\n ${pc.dim(\"--name\")} Process name\n\n ${pc.cyan(\"pipe\")} ${pc.dim(\"Pipe stdin to log watcher\")}\n ${pc.dim(\"--name\")} Watcher name ${pc.dim(\"(required)\")}\n\n ${pc.cyan(\"watch\")} ${pc.dim(\"Watch a log file\")}\n ${pc.dim(\"--file\")} File path ${pc.dim(\"(required)\")}\n ${pc.dim(\"--name\")} Watcher name\n\n ${pc.cyan(\"attach-pid\")} ${pc.dim(\"<pid>\")} ${pc.dim(\"Attach to process by PID\")}\n ${pc.cyan(\"attach-port\")} ${pc.dim(\"<port>\")} ${pc.dim(\"Attach to process by port\")}\n\n ${sep}\n ${pc.bold(\"Configuration\")}\n ${sep}\n\n ${pc.cyan(\"init\")} ${pc.dim(\"Generate fennec.config.yaml\")}\n ${pc.cyan(\"setup\")} ${pc.dim(\"Configure MCP client\")}\n ${pc.cyan(\"install-browsers\")} ${pc.dim(\"Install Playwright browser engines\")}\n ${pc.cyan(\"sessions\")} ${pc.dim(\"List saved auth sessions\")}\n\n ${sep}\n ${pc.bold(\"Other\")}\n ${sep}\n\n ${pc.cyan(\"help\")} ${pc.dim(\"Show this help message\")}\n ${pc.cyan(\"version\")} ${pc.dim(\"Show version\")}\n\n ${pc.dim(\"─\".repeat(50))}\n\n ${pc.dim(\"Learn more:\")} ${pc.cyan(\"https://github.com/plumpslabs/fennec\")}\n `);\n}\n","export async function pipeCommand(args: string[]): Promise<void> {\n const nameIndex = args.indexOf(\"--name\");\n const name = nameIndex !== -1 ? args[nameIndex + 1] : \"pipe\";\n\n if (!name) {\n console.error(\"Error: --name is required for pipe command\");\n process.exit(1);\n }\n\n const { PipeWatcher } = await import(\"@plumpslabs/fennec-core\");\n const watcher = new PipeWatcher();\n const { write } = watcher.createPipe(name);\n\n console.error(`Pipe watcher '${name}' active. Forwarding stdin...`);\n\n const onDrain = () => {\n process.stdin.resume();\n };\n process.stdout.on(\"drain\", onDrain);\n\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.on(\"data\", (data: string) => {\n try {\n write(data);\n const canContinue = process.stdout.write(data);\n if (!canContinue) {\n process.stdin.pause();\n }\n } catch (error) {\n console.error(\"Pipe error:\", error);\n }\n });\n\n process.stdin.on(\"error\", (error) => {\n console.error(\"Pipe stdin error:\", error);\n });\n\n process.stdin.on(\"end\", () => {\n console.error(`Pipe watcher '${name}' ended.`);\n watcher.cleanup();\n });\n\n const shutdown = () => {\n watcher.cleanup();\n process.stdout.removeListener(\"drain\", onDrain);\n process.stdin.removeAllListeners();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n","export async function attachPidCommand(args: string[]): Promise<void> {\n const pid = parseInt(args[0]!, 10);\n if (isNaN(pid)) {\n console.error(\"Error: valid PID is required\");\n process.exit(1);\n }\n const { PortDetector } = await import(\"@plumpslabs/fennec-core\");\n const detector = new PortDetector();\n const info = detector.detectByPid(pid);\n if (info) {\n console.log(`Attached to PID ${pid}${info.command ? ` (${info.command})` : \"\"}`);\n if (info.port) console.log(` Port: ${info.port}`);\n } else {\n console.error(`Could not find process with PID ${pid}`);\n process.exit(1);\n }\n}\n","export async function attachPortCommand(args: string[]): Promise<void> {\n const port = parseInt(args[0]!, 10);\n if (isNaN(port)) {\n console.error(\"Error: valid port number is required\");\n process.exit(1);\n }\n const { PortDetector } = await import(\"@plumpslabs/fennec-core\");\n const detector = new PortDetector();\n const info = detector.detectByPort(port);\n if (info) {\n console.log(`Found process on port ${port}: PID ${info.pid}${info.command ? ` (${info.command})` : \"\"}`);\n } else {\n console.error(`No process found listening on port ${port}`);\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport async function watchCommand(args: string[]): Promise<void> {\n const fileIndex = args.indexOf(\"--file\");\n const filePath = fileIndex !== -1 ? args[fileIndex + 1] : undefined;\n if (!filePath) {\n console.error(\"Error: --file is required for watch command\");\n process.exit(1);\n }\n const nameIndex = args.indexOf(\"--name\");\n const name = nameIndex !== -1 ? args[nameIndex + 1] : undefined;\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n console.error(`Error: File not found: ${resolvedPath}`);\n process.exit(1);\n }\n const { LogWatcher } = await import(\"@plumpslabs/fennec-core\");\n const watcher = new LogWatcher();\n const watcherId = watcher.watchFile(resolvedPath, name);\n console.log(`Watching file: ${resolvedPath}`);\n console.log(`Watcher ID: ${watcherId}`);\n process.stdin.resume();\n}\n","/**\n * Fennec CLI Formatting System\n *\n * Central module for all CLI output formatting.\n * Uses picocolors (7KB, zero dependencies) for coloring.\n *\n * Design principles:\n * - Minimal dependencies (picocolors only)\n * - Clean, modern, readable output\n * - Consistent spacing and alignment\n * - Fox-themed (🦊) but not overwhelming\n */\n\nimport { createInterface } from \"node:readline\";\nimport pc from \"picocolors\";\n\n// ─── Color Helpers ───────────────────────────────────────────────\n\n/**\n * Custom hex color formatter.\n * picocolors has hex() at runtime but can be undefined on some Node.js\n * versions due to CJS/ESM interop issues. We detect and fall back.\n */\nfunction hex(color: string): (s: string) => string {\n if (typeof (pc as any).hex === \"function\") {\n return (pc as any).hex(color);\n }\n return (s: string) => s;\n}\n\n// Brand colors (runtime-safe, bypass TypeScript limitations)\nconst fennecOrange = hex(\"#FF6432\");\nconst blueAccent = hex(\"#4A90D9\");\nconst redAccent = hex(\"#E94560\");\n\n// ─── Color Palette ───────────────────────────────────────────────\n\nexport const colors = {\n // Brand colors\n primary: fennecOrange,\n secondary: blueAccent,\n accent: redAccent,\n\n // Semantic colors\n success: pc.green,\n error: pc.red,\n warning: pc.yellow,\n info: pc.cyan,\n muted: pc.dim,\n highlight: pc.bold,\n\n // Backgrounds\n bgSuccess: (s: string) => pc.bgGreen(pc.black(` ${s} `)),\n bgError: (s: string) => pc.bgRed(pc.white(` ${s} `)),\n bgWarning: (s: string) => pc.bgYellow(pc.black(` ${s} `)),\n bgInfo: (s: string) => pc.bgCyan(pc.black(` ${s} `)),\n} as const;\n\n// ─── Symbols ─────────────────────────────────────────────────────\n\nexport const symbols = {\n // Status\n active: pc.green(\"●\"),\n inactive: pc.dim(\"○\"),\n error: pc.red(\"✗\"),\n warning: pc.yellow(\"⚠\"),\n success: pc.green(\"✓\"),\n info: pc.cyan(\"ℹ\"),\n pending: pc.yellow(\"◌\"),\n\n // UI\n bullet: pc.dim(\"│\"),\n dot: pc.dim(\"·\"),\n arrow: pc.cyan(\"→\"),\n pointer: fennecOrange(\"▶\"),\n separator: pc.dim(\"─\"),\n\n // Fennec\n fox: \"🦊\",\n ears: \"⏜\",\n} as const;\n\n// ─── Status Badges ───────────────────────────────────────────────\n\nexport type ProcessStatus = \"running\" | \"stopped\" | \"error\" | \"starting\" | \"unknown\";\n\nexport function statusBadge(status: ProcessStatus): string {\n switch (status) {\n case \"running\": return pc.green(\"● running\");\n case \"stopped\": return pc.dim(\"○ stopped\");\n case \"error\": return pc.red(\"✗ error\");\n case \"starting\": return pc.yellow(\"◌ starting\");\n case \"unknown\": return pc.dim(\"? unknown\");\n }\n}\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"verbose\";\n\nexport function logLevel(label: string): string {\n const upper = label.toUpperCase().padEnd(5);\n switch (label.toLowerCase()) {\n case \"error\": return pc.bgRed(pc.white(` ${upper} `));\n case \"warn\": return pc.bgYellow(pc.black(` ${upper} `));\n case \"info\": return pc.bgCyan(pc.black(` ${upper} `));\n case \"debug\": return pc.dim(pc.italic(upper));\n case \"verbose\": return pc.dim(pc.italic(upper));\n default: return pc.dim(upper);\n }\n}\n\n// ─── Table Renderer ──────────────────────────────────────────────\n\nexport interface Column {\n key: string;\n label: string;\n align?: \"left\" | \"right\" | \"center\";\n width?: number;\n format?: (value: unknown) => string;\n}\n\nexport interface Row {\n [key: string]: unknown;\n}\n\nexport function renderTable(columns: Column[], rows: Row[], options?: { padding?: number; compact?: boolean }): string {\n const pad = options?.padding ?? 1;\n const isCompact = options?.compact ?? false;\n\n if (rows.length === 0) {\n return pc.dim(\" (no data)\");\n }\n\n // Calculate column widths\n const widths: number[] = columns.map((col) => {\n const headerLen = col.label.length;\n const maxDataLen = rows.reduce((max, row) => {\n const val = String(row[col.key] ?? \"-\");\n return Math.max(max, val.length);\n }, 0);\n return Math.max(headerLen, maxDataLen, col.width ?? 0) + pad * 2;\n });\n\n // ─── Helpers ────────────────────────────────────────\n const hLine = (left: string, mid: string, right: string, fill = \"─\") => {\n return pc.dim(\n left + widths.map((w) => fill.repeat(w)).join(mid) + right,\n );\n };\n\n const formatCell = (text: string, colIdx: number) => {\n const col = columns[colIdx]!;\n const w = widths[colIdx]!;\n\n // Truncate if too long\n const display = text.length > w ? text.slice(0, w - 1) + \"…\" : text;\n const padded = display.padEnd(w);\n\n const align = col.align ?? \"left\";\n if (align === \"right\") return padded.padStart(w);\n if (align === \"center\") {\n const leftPad = Math.floor((w - display.length) / 2);\n return \" \".repeat(leftPad) + display + \" \".repeat(w - display.length - leftPad);\n }\n return padded;\n };\n\n const renderRow = (row: Row): string => {\n const cells = columns.map((col, i) => {\n const raw = row[col.key];\n const formatted = col.format ? col.format(raw) : String(raw ?? \"-\");\n return formatCell(formatted, i);\n });\n return pc.dim(\"│\") + cells.join(pc.dim(\"│\")) + pc.dim(\"│\");\n };\n\n // ─── Build table ────────────────────────────────────\n const lines: string[] = [];\n\n if (!isCompact) {\n lines.push(hLine(\"┌\", \"┬\", \"┐\"));\n }\n\n // Header row\n const headerCells = columns.map((col, i) => {\n return formatCell(pc.bold(col.label), i);\n });\n lines.push(pc.dim(\"│\") + headerCells.join(pc.dim(\"│\")) + pc.dim(\"│\"));\n\n if (!isCompact) {\n lines.push(hLine(\"├\", \"┼\", \"┤\"));\n } else {\n lines.push(pc.dim(\"├\") + widths.map((w) => pc.dim(\"─\").repeat(w)).join(pc.dim(\"┼\")) + pc.dim(\"┤\"));\n }\n\n // Data rows\n for (const row of rows) {\n const rendered = renderRow(row);\n // Highlight if row has an error\n if (row._error) {\n lines.push(colors.error(rendered));\n } else {\n lines.push(rendered);\n }\n }\n\n if (!isCompact) {\n lines.push(hLine(\"└\", \"┴\", \"┘\"));\n }\n\n return lines.join(\"\\n\");\n}\n\n// ─── Key-Value Display ───────────────────────────────────────────\n\nexport function renderKV(key: string, value: string, options?: { indent?: number; separator?: string }): string {\n const indent = options?.indent ?? 2;\n const sep = options?.separator ?? \":\";\n const pad = \" \".repeat(indent);\n return `${pad}${pc.dim(key + sep)} ${value}`;\n}\n\nexport function renderKVColor(key: string, value: string, color: (s: string) => string = pc.bold): string {\n return ` ${pc.dim(key + \":\")} ${color(value)}`;\n}\n\nexport function renderSection(title: string, content: string): string {\n const line = pc.dim(\"─\".repeat(40));\n return `\\n ${pc.bold(title)}\\n ${line}\\n${content}\\n`;\n}\n\n// ─── Box Renderer ────────────────────────────────────────────────\n\nexport function renderBox(title: string, content: string, options?: {\n width?: number;\n borderColor?: (s: string) => string;\n titleColor?: (s: string) => string;\n}): string {\n const width = options?.width ?? 50;\n const border = options?.borderColor ?? pc.dim;\n const titleColor = options?.titleColor ?? pc.bold;\n\n const lines = content.split(\"\\n\");\n const wrapped = lines.map((l) => {\n const clean = l.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n return l + \" \".repeat(Math.max(0, width - clean.length - 2));\n });\n\n const top = border(`┌─ ${titleColor(title)} ${\"─\".repeat(Math.max(0, width - title.length - 4))}┐`);\n const mid = wrapped.map((l) => border(\"│ \") + l + border(\" │\")).join(\"\\n\");\n const bot = border(`└${\"─\".repeat(width)}┘`);\n\n return `\\n${top}\\n${mid}\\n${bot}\\n`;\n}\n\n// ─── Spinner (minimal, no dependencies) ──────────────────────────\n\nexport interface Spinner {\n update(text: string): void;\n succeed(text: string): void;\n fail(text: string): void;\n warn(text: string): void;\n stop(): void;\n}\n\nexport function createSpinner(text: string): Spinner {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n let running = true;\n\n const interval = setInterval(() => {\n if (!running) return;\n process.stdout.write(`\\r${pc.cyan(frames[i])} ${text}`);\n i = (i + 1) % frames.length;\n }, 80);\n\n return {\n update(newText: string) {\n if (!running) return;\n process.stdout.write(`\\r${pc.cyan(frames[i])} ${newText}`);\n },\n succeed(msg: string) {\n running = false;\n clearInterval(interval);\n process.stdout.write(`\\r${pc.green(\"✓\")} ${msg}\\n`);\n },\n fail(msg: string) {\n running = false;\n clearInterval(interval);\n process.stdout.write(`\\r${pc.red(\"✗\")} ${msg}\\n`);\n },\n warn(msg: string) {\n running = false;\n clearInterval(interval);\n process.stdout.write(`\\r${pc.yellow(\"⚠\")} ${msg}\\n`);\n },\n stop() {\n running = false;\n clearInterval(interval);\n },\n };\n}\n\n// ─── Interactive Select (enhanced) ───────────────────────────────\n\nexport async function selectPrompt<T extends string>(\n message: string,\n options: { value: T; label: string; description?: string }[],\n): Promise<T | null> {\n console.log(`\\n ${pc.bold(message)}\\n`);\n options.forEach((opt, i) => {\n const num = pc.cyan(` ${i + 1}`);\n console.log(`${num} ${opt.label}`);\n if (opt.description) {\n console.log(` ${pc.dim(opt.description)}`);\n }\n });\n console.log(` ${pc.dim(\"0) Cancel\")}\\n`);\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(` ${pc.bold(\"Enter number\")} ${pc.dim(\"(0-\" + options.length + \")\")}: `, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n\n const num = parseInt(answer, 10);\n if (isNaN(num) || num === 0) return null;\n const selected = options[num - 1];\n if (!selected) {\n console.log(` ${pc.red(\"Invalid selection.\")}`);\n return null;\n }\n return selected.value;\n}\n\nexport async function confirmPrompt(message: string, defaultValue = false): Promise<boolean> {\n const hint = defaultValue ? pc.bold(\"Y\") + pc.dim(\"/n\") : pc.dim(\"y/\") + pc.bold(\"N\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`\\n ${message} ${pc.dim(\"(\" + hint + \")\")}: `, (ans) => {\n rl.close();\n resolve(ans.trim().toLowerCase());\n });\n });\n\n if (!answer) return defaultValue;\n return answer === \"y\" || answer === \"yes\";\n}\n\n// ─── Divider ─────────────────────────────────────────────────────\n\nexport function divider(text?: string): string {\n if (text) {\n const len = 50 - text.length - 2;\n const left = Math.floor(len / 2);\n const right = len - left;\n return pc.dim(\"─\".repeat(left) + ` ${text} ` + \"─\".repeat(right));\n }\n return pc.dim(\"─\".repeat(50));\n}\n\n// ─── Timestamp ───────────────────────────────────────────────────\n\nexport function timestamp(date?: Date): string {\n const d = date ?? new Date();\n const time = d.toLocaleTimeString(\"en-US\", { hour12: false });\n return pc.dim(`[${time}]`);\n}\n\n// ─── Command Line ────────────────────────────────────────────────\n\nexport function renderCommand(cmd: string): string {\n return fennecOrange(`$ ${cmd}`);\n}\n\nexport function renderAppName(name: string): string {\n return fennecOrange(pc.bold(name));\n}\n\n// ─── Error Display ───────────────────────────────────────────────\n\nexport function renderError(title: string, details?: string, suggestions?: string[]): string {\n const lines: string[] = [];\n lines.push(`\\n ${pc.bgRed(pc.white(\" ERROR \"))} ${pc.bold(title)}`);\n if (details) {\n lines.push(` ${pc.dim(details)}`);\n }\n if (suggestions && suggestions.length > 0) {\n lines.push(`\\n ${pc.bold(\"Suggestions:\")}`);\n for (const s of suggestions) {\n lines.push(` ${pc.cyan(\"→\")} ${s}`);\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nexport function renderSuccess(message: string): string {\n return ` ${pc.green(\"✓\")} ${message}`;\n}\n\nexport function renderWarning(message: string): string {\n return ` ${pc.yellow(\"⚠\")} ${message}`;\n}\n","/**\n * System Process Scanner\n *\n * Reads real system processes from /proc (Linux) or ps (macOS/BSD).\n * Returns process info: pid, name, cpu%, mem%, status, command, ports.\n *\n * Design principles:\n * - Zero external dependencies (uses Node.js built-ins only)\n * - Cross-platform (Linux via /proc, macOS/Windows via exec)\n * - Safe errors (never throws, returns empty array on failure)\n */\n\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { cpus } from \"node:os\";\n\n// ─── Types ───────────────────────────────────────────────────────\n\nexport interface SystemProcessInfo {\n pid: number;\n name: string;\n command: string;\n cpuPercent: number;\n memPercent: number;\n memRss: number; // Resident Set Size in KB\n state: string; // R=Running, S=Sleeping, Z=Zombie, etc.\n startedAt: string | null;\n ports: number[]; // Listening ports (if any)\n isUserProcess: boolean; // true if owned by current user\n}\n\nexport interface SystemProcessFilter {\n name?: string;\n pid?: number;\n port?: number;\n userOnly?: boolean;\n sortBy?: \"cpu\" | \"mem\" | \"pid\" | \"name\";\n limit?: number;\n}\n\n// ─── Linux /proc Scanner ─────────────────────────────────────────\n\nfunction readProcProcesses(): SystemProcessInfo[] {\n const processes: SystemProcessInfo[] = [];\n const currentUid = process.getuid?.();\n const totalMemKb = readTotalMem();\n\n try {\n const pids = readdirSync(\"/proc\").filter((d) => /^\\d+$/.test(d));\n\n for (const pidStr of pids) {\n try {\n const pid = parseInt(pidStr, 10);\n const proc = readSingleProcProcess(pid, currentUid, totalMemKb);\n if (proc) processes.push(proc);\n } catch {\n // Process might have exited between readdir and stat\n continue;\n }\n }\n } catch {\n // /proc not available (not Linux)\n return [];\n }\n\n return processes;\n}\n\nfunction readSingleProcProcess(\n pid: number,\n currentUid: number | undefined,\n totalMemKb: number,\n): SystemProcessInfo | null {\n const statPath = `/proc/${pid}/stat`;\n const statusPath = `/proc/${pid}/status`;\n const cmdlinePath = `/proc/${pid}/cmdline`;\n\n if (!existsSync(statPath)) return null;\n\n // Read /proc/[pid]/status for name, uid, memory\n const statusText = readSafe(statusPath);\n if (!statusText) return null;\n\n const nameMatch = statusText.match(/Name:\\s+(.+)/);\n const uidMatch = statusText.match(/Uid:\\s+(\\d+)/);\n const vmRssMatch = statusText.match(/VmRSS:\\s+(\\d+)/);\n const stateMatch = statusText.match(/State:\\s+(\\S)/);\n const name = nameMatch?.[1] ?? `pid_${pid}`;\n const uid = uidMatch ? parseInt(uidMatch[1]!, 10) : undefined;\n const vmRss = vmRssMatch ? parseInt(vmRssMatch[1]!, 10) : 0;\n const state = stateMatch?.[1] ?? \"?\";\n\n const isUserProcess = uid !== undefined && currentUid !== undefined && uid === currentUid;\n\n // Read /proc/[pid]/stat for CPU ticks\n const statText = readSafe(statPath);\n let cpuPercent = 0;\n let startedAt: string | null = null;\n\n if (statText) {\n // Parse /proc/[pid]/stat format\n // Format: pid (comm) state ppid pgrp session tty_nr tpgid flags minflt cminflt majflt\n // cmajflt utime stime cutime cstime priority nice num_threads itrealvalue starttime\n const parenEnd = statText.lastIndexOf(\")\");\n if (parenEnd > 0) {\n const fields = statText.slice(parenEnd + 2).split(/\\s+/);\n const utime = parseInt(fields[11] ?? \"0\", 10); // User mode jiffies\n const stime = parseInt(fields[12] ?? \"0\", 10); // Kernel mode jiffies\n const starttime = parseInt(fields[19] ?? \"0\", 10); // Start time in jiffies\n\n // CPU usage = (utime + stime) / uptime_seconds / Hz\n const hertz = 100; // CLK_TCK, typically 100\n const uptimeSeconds = readUptime();\n const totalJiffies = utime + stime;\n\n if (uptimeSeconds > 0) {\n const elapsedJiffies = uptimeSeconds * hertz;\n const processJiffies = totalJiffies;\n cpuPercent = Math.min(100, (processJiffies / Math.max(1, elapsedJiffies)) * 100 * cpus().length);\n }\n\n // Boot time for startedAt\n startedAt = formatStartTime(starttime, uptimeSeconds, hertz);\n }\n }\n\n // Read /proc/[pid]/cmdline for full command\n const cmdlineRaw = readSafe(cmdlinePath);\n const command = cmdlineRaw\n ? cmdlineRaw.split(\"\\0\").filter(Boolean).join(\" \")\n : name;\n\n // Read listening ports\n const ports = detectListeningPorts(pid);\n\n const memPercent = totalMemKb > 0 ? (vmRss / totalMemKb) * 100 : 0;\n\n return {\n pid,\n name,\n command: command.length > 200 ? command.slice(0, 200) + \"…\" : command,\n cpuPercent: Math.round(cpuPercent * 10) / 10,\n memPercent: Math.round(memPercent * 10) / 10,\n memRss: vmRss,\n state,\n startedAt,\n ports,\n isUserProcess,\n };\n}\n\n// ─── macOS / BSD ps fallback ─────────────────────────────────────\n\nfunction runPsProcesses(): SystemProcessInfo[] {\n try {\n const output = execSync(\n \"ps axo pid,comm,pcpu,pmem,rss,state,etime,user --sort=-pcpu 2>/dev/null | head -200\",\n { encoding: \"utf-8\", timeout: 5000 },\n );\n\n const lines = output.trim().split(\"\\n\").slice(1); // Skip header\n const currentUser = execSync(\"whoami\", { encoding: \"utf-8\", timeout: 1000 }).trim();\n\n return lines.map((line) => {\n const parts = line.trim().split(/\\s+/);\n const pid = parseInt(parts[0] ?? \"0\", 10);\n const name = parts[1] ?? \"\";\n const cpu = parseFloat(parts[2] ?? \"0\");\n const mem = parseFloat(parts[3] ?? \"0\");\n const rss = parseInt(parts[4] ?? \"0\", 10);\n const state = parts[5] ?? \"?\";\n const elapsed = parts[6] ?? \"\";\n const user = parts[7] ?? \"\";\n const command = parts.slice(1).join(\" \");\n\n return {\n pid,\n name,\n command: command.length > 200 ? command.slice(0, 200) + \"…\" : command,\n cpuPercent: Math.round(cpu * 10) / 10,\n memPercent: Math.round(mem * 10) / 10,\n memRss: rss,\n state: mapBsdState(state),\n startedAt: elapsed || null,\n ports: [] as number[],\n isUserProcess: user === currentUser,\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction mapBsdState(s: string): string {\n switch (s) {\n case \"R\": return \"R\";\n case \"S\": return \"S\";\n case \"Z\": return \"Z\";\n case \"T\": return \"T\";\n case \"I\": return \"S\";\n default: return s;\n }\n}\n\n// ─── Port Scanner ────────────────────────────────────────────────\n// NOTE: Per-process port detection via /proc/[pid]/net/tcp is unreliable\n// because it shows network namespace ports, not per-process ports.\n// Fennec tracks ports via the --port flag when starting apps.\n// We keep the field for API compatibility but always return empty.\n\nfunction detectListeningPorts(_pid: number): number[] {\n return [];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────\n\nfunction readSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nfunction readTotalMem(): number {\n try {\n const memInfo = readSafe(\"/proc/meminfo\");\n if (memInfo) {\n const match = memInfo.match(/MemTotal:\\s+(\\d+)/);\n if (match) return parseInt(match[1]!, 10);\n }\n } catch {\n // ignore\n }\n return 16_000_000; // Default ~16GB\n}\n\nfunction readUptime(): number {\n try {\n const data = readSafe(\"/proc/uptime\");\n if (data) {\n return parseFloat(data.split(/\\s+/)[0] ?? \"0\");\n }\n } catch {\n // ignore\n }\n return 0;\n}\n\nfunction formatStartTime(starttime: number, uptimeSeconds: number, hertz: number): string | null {\n try {\n const bootTime = Date.now() / 1000 - uptimeSeconds;\n const processStart = bootTime + starttime / hertz;\n return new Date(processStart * 1000).toISOString();\n } catch {\n return null;\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────\n\n/**\n * Get all system processes.\n * Uses /proc on Linux, falls back to `ps` on macOS/BSD.\n */\nexport function getSystemProcesses(filter?: SystemProcessFilter): SystemProcessInfo[] {\n let processes: SystemProcessInfo[];\n\n // Try /proc first (Linux), fall back to ps (macOS/BSD)\n if (existsSync(\"/proc\")) {\n processes = readProcProcesses();\n } else {\n processes = runPsProcesses();\n }\n\n // Apply filters\n if (filter) {\n if (filter.userOnly) {\n processes = processes.filter((p) => p.isUserProcess);\n }\n if (filter.name) {\n const nameLower = filter.name.toLowerCase();\n processes = processes.filter(\n (p) => p.name.toLowerCase().includes(nameLower) || p.command.toLowerCase().includes(nameLower),\n );\n }\n if (filter.pid) {\n processes = processes.filter((p) => p.pid === filter.pid);\n }\n if (filter.port) {\n processes = processes.filter((p) => p.ports.includes(filter.port!));\n }\n\n // Sort\n if (filter.sortBy) {\n processes.sort((a, b) => {\n switch (filter.sortBy) {\n case \"cpu\": return b.cpuPercent - a.cpuPercent;\n case \"mem\": return b.memPercent - a.memPercent;\n case \"pid\": return a.pid - b.pid;\n case \"name\": return a.name.localeCompare(b.name);\n default: return b.cpuPercent - a.cpuPercent;\n }\n });\n }\n\n // Limit\n if (filter.limit && filter.limit > 0) {\n processes = processes.slice(0, filter.limit);\n }\n }\n\n return processes;\n}\n\n/**\n * Get a single process by PID. Returns null if not found.\n */\nexport function getProcessByPid(pid: number): SystemProcessInfo | null {\n const processes = getSystemProcesses({ pid });\n return processes[0] ?? null;\n}\n\n/**\n * Kill a process by PID. Returns true if successful.\n */\nexport function killProcess(pid: number, signal: NodeJS.Signals = \"SIGTERM\"): boolean {\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a process is running.\n */\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0); // Signal 0 checks existence without killing\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get human-readable process state.\n */\nexport function formatProcessState(state: string): string {\n switch (state) {\n case \"R\": return \"Running\";\n case \"S\": return \"Sleeping\";\n case \"D\": return \"Disk Sleep\";\n case \"Z\": return \"Zombie\";\n case \"T\": return \"Stopped\";\n case \"t\": return \"Tracing\";\n case \"X\": return \"Dead\";\n case \"I\": return \"Idle\";\n default: return state;\n }\n}\n"],"mappings":";;;AAEA,SAAS,cAAAA,aAAY,eAAe,gBAAAC,eAAc,iBAAiB;AACnE,SAAS,WAAAC,UAAS,eAAe;AACjC,SAAS,eAAe;AACxB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAc,cAAc,sBAAsB;AAC3D,OAAOC,SAAQ;;;ACPf,OAAO,QAAQ;AAKR,SAAS,SAAS,OAAsC;AAC7D,MAAI,OAAQ,GAAW,QAAQ,YAAY;AACzC,WAAQ,GAAW,IAAI,KAAK;AAAA,EAC9B;AAEA,SAAO,CAAC,MAAc;AACxB;AAEA,IAAM,eAAe,SAAS,SAAS;AACvC,IAAM,eAAe,SAAS,SAAS;AAEvC,IAAM,MAAM;AAAA,QACJ,aAAa,eAAe,CAAC;AAAA,OAC9B,aAAa,GAAG,CAAC,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,UAAU,IAAI,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC;AAAA,OAC7G,aAAa,IAAI,CAAC,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,IAAI,CAAC,UAAU,GAAG,IAAI,gCAAgC,CAAC;AAAA,SAC/G,aAAa,OAAO,CAAC;AAAA;AAG9B,IAAM,cAAc,GAAG,GAAG,UAAU,aAAM,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC;AAE9E,SAAS,cAAoB;AAClC,MAAI,QAAQ,OAAO,OAAO;AACxB,YAAQ,MAAM,GAAG;AAAA,EACnB,OAAO;AACL,YAAQ,MAAM,WAAW;AAAA,EAC3B;AACF;;;AC/BA,OAAOC,SAAQ;AAGf,IAAMC,gBAAe,SAAS,SAAS;AAEhC,SAAS,WAAiB;AAC/B,QAAM,MAAMA,cAAa,SAAI,OAAO,EAAE,CAAC;AAEvC,UAAQ,MAAM;AAAA;AAAA,IAEZC,IAAG,KAAK,QAAQ,CAAC,WAAWA,IAAG,IAAI,WAAW,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC;AAAA;AAAA,IAEtE,GAAG;AAAA,IACHA,IAAG,KAAK,QAAQ,CAAC;AAAA,IACjB,GAAG;AAAA;AAAA,MAEDA,IAAG,KAAK,OAAO,CAAC,eAAeA,IAAG,IAAI,mCAAmC,CAAC;AAAA,uBACzDA,IAAG,IAAI,UAAU,CAAC;AAAA,uBAClBA,IAAG,IAAI,aAAa,CAAC,mBAAmBA,IAAG,IAAI,gCAAgC,CAAC;AAAA,uBAChFA,IAAG,IAAI,YAAY,CAAC,yBAAyBA,IAAG,IAAI,iBAAiB,CAAC;AAAA;AAAA,MAEvFA,IAAG,KAAK,OAAO,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC,YAAYA,IAAG,IAAI,8CAA8C,CAAC;AAAA,uBACxFA,IAAG,IAAI,QAAQ,CAAC,gBAAgBA,IAAG,IAAI,yBAAyB,CAAC;AAAA,uBACjEA,IAAG,IAAI,QAAQ,CAAC,+BAA+BA,IAAG,IAAI,YAAY,CAAC;AAAA,uBACnEA,IAAG,IAAI,OAAO,CAAC;AAAA,uBACfA,IAAG,IAAI,WAAW,CAAC;AAAA;AAAA,IAEtC,GAAG;AAAA,IACHA,IAAG,KAAK,oBAAoB,CAAC;AAAA,IAC7B,GAAG;AAAA;AAAA,MAEDA,IAAG,KAAK,IAAI,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC,aAAaA,IAAG,IAAI,qCAAqC,CAAC;AAAA,uBAC7EA,IAAG,IAAI,cAAc,CAAC;AAAA,uBACtBA,IAAG,IAAI,QAAQ,CAAC;AAAA,uBAChBA,IAAG,IAAI,aAAa,CAAC,gBAAgBA,IAAG,IAAI,qCAAqC,CAAC;AAAA;AAAA,MAEnGA,IAAG,KAAK,KAAK,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC,WAAWA,IAAG,IAAI,wCAAwC,CAAC;AAAA,uBAC/EA,IAAG,IAAI,QAAQ,CAAC,oBAAoBA,IAAG,IAAI,YAAY,CAAC;AAAA,uBACxDA,IAAG,IAAI,OAAO,CAAC;AAAA,uBACfA,IAAG,IAAI,WAAW,CAAC;AAAA;AAAA,MAEpCA,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,QAAQ,CAAC,WAAWA,IAAG,IAAI,sCAAsC,CAAC;AAAA,uBAC7EA,IAAG,IAAI,aAAa,CAAC,gBAAgBA,IAAG,IAAI,oBAAoB,CAAC;AAAA;AAAA,MAElFA,IAAG,KAAK,KAAK,CAAC,IAAIA,IAAG,IAAI,YAAY,CAAC,UAAUA,IAAG,IAAI,yBAAyB,CAAC;AAAA,uBAChEA,IAAG,IAAI,SAAS,CAAC,sBAAsBA,IAAG,IAAI,eAAe,CAAC;AAAA,uBAC9DA,IAAG,IAAI,cAAc,CAAC,iBAAiBA,IAAG,IAAI,uBAAuB,CAAC;AAAA;AAAA,MAEvFA,IAAG,KAAK,MAAM,CAAC,IAAIA,IAAG,IAAI,gBAAgB,CAAC,KAAKA,IAAG,IAAI,uCAAuC,CAAC;AAAA,uBAC9EA,IAAG,IAAI,UAAU,CAAC,oBAAoBA,IAAG,IAAI,oBAAoB,CAAC;AAAA,uBAClEA,IAAG,IAAI,OAAO,CAAC;AAAA;AAAA,MAEhCA,IAAG,KAAK,SAAS,CAAC,IAAIA,IAAG,IAAI,YAAY,CAAC,MAAMA,IAAG,IAAI,4BAA4B,CAAC;AAAA;AAAA,IAEtF,GAAG;AAAA,IACHA,IAAG,KAAK,aAAa,CAAC;AAAA,IACtB,GAAG;AAAA;AAAA,MAEDA,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,QAAQ,CAAC,YAAYA,IAAG,IAAI,2BAA2B,CAAC;AAAA,uBACnEA,IAAG,IAAI,QAAQ,CAAC;AAAA;AAAA,MAEjCA,IAAG,KAAK,MAAM,CAAC,gBAAgBA,IAAG,IAAI,2BAA2B,CAAC;AAAA,uBACjDA,IAAG,IAAI,QAAQ,CAAC,oBAAoBA,IAAG,IAAI,YAAY,CAAC;AAAA;AAAA,MAEzEA,IAAG,KAAK,OAAO,CAAC,eAAeA,IAAG,IAAI,kBAAkB,CAAC;AAAA,uBACxCA,IAAG,IAAI,QAAQ,CAAC,iBAAiBA,IAAG,IAAI,YAAY,CAAC;AAAA,uBACrDA,IAAG,IAAI,QAAQ,CAAC;AAAA;AAAA,MAEjCA,IAAG,KAAK,YAAY,CAAC,IAAIA,IAAG,IAAI,OAAO,CAAC,SAASA,IAAG,IAAI,0BAA0B,CAAC;AAAA,MACnFA,IAAG,KAAK,aAAa,CAAC,IAAIA,IAAG,IAAI,QAAQ,CAAC,OAAOA,IAAG,IAAI,2BAA2B,CAAC;AAAA;AAAA,IAEtF,GAAG;AAAA,IACHA,IAAG,KAAK,eAAe,CAAC;AAAA,IACxB,GAAG;AAAA;AAAA,MAEDA,IAAG,KAAK,MAAM,CAAC,gBAAgBA,IAAG,IAAI,6BAA6B,CAAC;AAAA,MACpEA,IAAG,KAAK,OAAO,CAAC,eAAeA,IAAG,IAAI,sBAAsB,CAAC;AAAA,MAC7DA,IAAG,KAAK,kBAAkB,CAAC,IAAIA,IAAG,IAAI,oCAAoC,CAAC;AAAA,MAC3EA,IAAG,KAAK,UAAU,CAAC,YAAYA,IAAG,IAAI,0BAA0B,CAAC;AAAA;AAAA,IAEnE,GAAG;AAAA,IACHA,IAAG,KAAK,OAAO,CAAC;AAAA,IAChB,GAAG;AAAA;AAAA,MAEDA,IAAG,KAAK,MAAM,CAAC,gBAAgBA,IAAG,IAAI,wBAAwB,CAAC;AAAA,MAC/DA,IAAG,KAAK,SAAS,CAAC,aAAaA,IAAG,IAAI,cAAc,CAAC;AAAA;AAAA,IAEvDA,IAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAAA;AAAA,IAEtBA,IAAG,IAAI,aAAa,CAAC,IAAIA,IAAG,KAAK,sCAAsC,CAAC;AAAA,GACzE;AACH;;;AC3FA,eAAsB,YAAYC,OAA+B;AAC/D,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,QAAM,OAAO,cAAc,KAAKA,MAAK,YAAY,CAAC,IAAI;AAEtD,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,4CAA4C;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,yBAAyB;AAC9D,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,EAAE,MAAM,IAAI,QAAQ,WAAW,IAAI;AAEzC,UAAQ,MAAM,iBAAiB,IAAI,+BAA+B;AAElE,QAAM,UAAU,MAAM;AACpB,YAAQ,MAAM,OAAO;AAAA,EACvB;AACA,UAAQ,OAAO,GAAG,SAAS,OAAO;AAElC,UAAQ,MAAM,YAAY,OAAO;AACjC,UAAQ,MAAM,GAAG,QAAQ,CAAC,SAAiB;AACzC,QAAI;AACF,YAAM,IAAI;AACV,YAAM,cAAc,QAAQ,OAAO,MAAM,IAAI;AAC7C,UAAI,CAAC,aAAa;AAChB,gBAAQ,MAAM,MAAM;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,eAAe,KAAK;AAAA,IACpC;AAAA,EACF,CAAC;AAED,UAAQ,MAAM,GAAG,SAAS,CAAC,UAAU;AACnC,YAAQ,MAAM,qBAAqB,KAAK;AAAA,EAC1C,CAAC;AAED,UAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,YAAQ,MAAM,iBAAiB,IAAI,UAAU;AAC7C,YAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,QAAM,WAAW,MAAM;AACrB,YAAQ,QAAQ;AAChB,YAAQ,OAAO,eAAe,SAAS,OAAO;AAC9C,YAAQ,MAAM,mBAAmB;AACjC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;;;AClDA,eAAsB,iBAAiBC,OAA+B;AACpE,QAAM,MAAM,SAASA,MAAK,CAAC,GAAI,EAAE;AACjC,MAAI,MAAM,GAAG,GAAG;AACd,YAAQ,MAAM,8BAA8B;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,yBAAyB;AAC/D,QAAM,WAAW,IAAI,aAAa;AAClC,QAAM,OAAO,SAAS,YAAY,GAAG;AACrC,MAAI,MAAM;AACR,YAAQ,IAAI,mBAAmB,GAAG,GAAG,KAAK,UAAU,KAAK,KAAK,OAAO,MAAM,EAAE,EAAE;AAC/E,QAAI,KAAK,KAAM,SAAQ,IAAI,YAAY,KAAK,IAAI,EAAE;AAAA,EACpD,OAAO;AACL,YAAQ,MAAM,mCAAmC,GAAG,EAAE;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AChBA,eAAsB,kBAAkBC,OAA+B;AACrE,QAAM,OAAO,SAASA,MAAK,CAAC,GAAI,EAAE;AAClC,MAAI,MAAM,IAAI,GAAG;AACf,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,yBAAyB;AAC/D,QAAM,WAAW,IAAI,aAAa;AAClC,QAAM,OAAO,SAAS,aAAa,IAAI;AACvC,MAAI,MAAM;AACR,YAAQ,IAAI,yBAAyB,IAAI,SAAS,KAAK,GAAG,GAAG,KAAK,UAAU,KAAK,KAAK,OAAO,MAAM,EAAE,EAAE;AAAA,EACzG,OAAO;AACL,YAAQ,MAAM,sCAAsC,IAAI,EAAE;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACfA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAExB,eAAsB,aAAaC,OAA+B;AAChE,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,QAAM,WAAW,cAAc,KAAKA,MAAK,YAAY,CAAC,IAAI;AAC1D,MAAI,CAAC,UAAU;AACb,YAAQ,MAAM,6CAA6C;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,QAAM,OAAO,cAAc,KAAKA,MAAK,YAAY,CAAC,IAAI;AACtD,QAAM,eAAe,QAAQ,QAAQ;AACrC,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,YAAQ,MAAM,0BAA0B,YAAY,EAAE;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,yBAAyB;AAC7D,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,YAAY,QAAQ,UAAU,cAAc,IAAI;AACtD,UAAQ,IAAI,kBAAkB,YAAY,EAAE;AAC5C,UAAQ,IAAI,eAAe,SAAS,EAAE;AACtC,UAAQ,MAAM,OAAO;AACvB;;;ACVA,SAAS,uBAAuB;AAChC,OAAOC,SAAQ;AASf,SAAS,IAAI,OAAsC;AACjD,MAAI,OAAQA,IAAW,QAAQ,YAAY;AACzC,WAAQA,IAAW,IAAI,KAAK;AAAA,EAC9B;AACA,SAAO,CAAC,MAAc;AACxB;AAGA,IAAMC,gBAAe,IAAI,SAAS;AAClC,IAAM,aAAa,IAAI,SAAS;AAChC,IAAM,YAAY,IAAI,SAAS;AAIxB,IAAM,SAAS;AAAA;AAAA,EAEpB,SAASA;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EAGR,SAASD,IAAG;AAAA,EACZ,OAAOA,IAAG;AAAA,EACV,SAASA,IAAG;AAAA,EACZ,MAAMA,IAAG;AAAA,EACT,OAAOA,IAAG;AAAA,EACV,WAAWA,IAAG;AAAA;AAAA,EAGd,WAAW,CAAC,MAAcA,IAAG,QAAQA,IAAG,MAAM,IAAI,CAAC,GAAG,CAAC;AAAA,EACvD,SAAS,CAAC,MAAcA,IAAG,MAAMA,IAAG,MAAM,IAAI,CAAC,GAAG,CAAC;AAAA,EACnD,WAAW,CAAC,MAAcA,IAAG,SAASA,IAAG,MAAM,IAAI,CAAC,GAAG,CAAC;AAAA,EACxD,QAAQ,CAAC,MAAcA,IAAG,OAAOA,IAAG,MAAM,IAAI,CAAC,GAAG,CAAC;AACrD;AAIO,IAAM,UAAU;AAAA;AAAA,EAErB,QAAQA,IAAG,MAAM,QAAG;AAAA,EACpB,UAAUA,IAAG,IAAI,QAAG;AAAA,EACpB,OAAOA,IAAG,IAAI,QAAG;AAAA,EACjB,SAASA,IAAG,OAAO,QAAG;AAAA,EACtB,SAASA,IAAG,MAAM,QAAG;AAAA,EACrB,MAAMA,IAAG,KAAK,QAAG;AAAA,EACjB,SAASA,IAAG,OAAO,QAAG;AAAA;AAAA,EAGtB,QAAQA,IAAG,IAAI,QAAG;AAAA,EAClB,KAAKA,IAAG,IAAI,MAAG;AAAA,EACf,OAAOA,IAAG,KAAK,QAAG;AAAA,EAClB,SAASC,cAAa,QAAG;AAAA,EACzB,WAAWD,IAAG,IAAI,QAAG;AAAA;AAAA,EAGrB,KAAK;AAAA,EACL,MAAM;AACR;AAkBO,SAAS,SAAS,OAAuB;AAC9C,QAAM,QAAQ,MAAM,YAAY,EAAE,OAAO,CAAC;AAC1C,UAAQ,MAAM,YAAY,GAAG;AAAA,IAC3B,KAAK;AAAW,aAAOE,IAAG,MAAMA,IAAG,MAAM,IAAI,KAAK,GAAG,CAAC;AAAA,IACtD,KAAK;AAAW,aAAOA,IAAG,SAASA,IAAG,MAAM,IAAI,KAAK,GAAG,CAAC;AAAA,IACzD,KAAK;AAAW,aAAOA,IAAG,OAAOA,IAAG,MAAM,IAAI,KAAK,GAAG,CAAC;AAAA,IACvD,KAAK;AAAW,aAAOA,IAAG,IAAIA,IAAG,OAAO,KAAK,CAAC;AAAA,IAC9C,KAAK;AAAW,aAAOA,IAAG,IAAIA,IAAG,OAAO,KAAK,CAAC;AAAA,IAC9C;AAAgB,aAAOA,IAAG,IAAI,KAAK;AAAA,EACrC;AACF;AAgBO,SAAS,YAAY,SAAmB,MAAa,SAA2D;AACrH,QAAM,MAAM,SAAS,WAAW;AAChC,QAAM,YAAY,SAAS,WAAW;AAEtC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAOA,IAAG,IAAI,aAAa;AAAA,EAC7B;AAGA,QAAM,SAAmB,QAAQ,IAAI,CAAC,QAAQ;AAC5C,UAAM,YAAY,IAAI,MAAM;AAC5B,UAAM,aAAa,KAAK,OAAO,CAAC,KAAK,QAAQ;AAC3C,YAAM,MAAM,OAAO,IAAI,IAAI,GAAG,KAAK,GAAG;AACtC,aAAO,KAAK,IAAI,KAAK,IAAI,MAAM;AAAA,IACjC,GAAG,CAAC;AACJ,WAAO,KAAK,IAAI,WAAW,YAAY,IAAI,SAAS,CAAC,IAAI,MAAM;AAAA,EACjE,CAAC;AAGD,QAAM,QAAQ,CAAC,MAAc,KAAa,OAAe,OAAO,aAAQ;AACtE,WAAOA,IAAG;AAAA,MACR,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,MAAc,WAAmB;AACnD,UAAM,MAAM,QAAQ,MAAM;AAC1B,UAAM,IAAI,OAAO,MAAM;AAGvB,UAAM,UAAU,KAAK,SAAS,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,WAAM;AAC/D,UAAM,SAAS,QAAQ,OAAO,CAAC;AAE/B,UAAM,QAAQ,IAAI,SAAS;AAC3B,QAAI,UAAU,QAAS,QAAO,OAAO,SAAS,CAAC;AAC/C,QAAI,UAAU,UAAU;AACtB,YAAM,UAAU,KAAK,OAAO,IAAI,QAAQ,UAAU,CAAC;AACnD,aAAO,IAAI,OAAO,OAAO,IAAI,UAAU,IAAI,OAAO,IAAI,QAAQ,SAAS,OAAO;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,QAAqB;AACtC,UAAM,QAAQ,QAAQ,IAAI,CAAC,KAAK,MAAM;AACpC,YAAM,MAAM,IAAI,IAAI,GAAG;AACvB,YAAM,YAAY,IAAI,SAAS,IAAI,OAAO,GAAG,IAAI,OAAO,OAAO,GAAG;AAClE,aAAO,WAAW,WAAW,CAAC;AAAA,IAChC,CAAC;AACD,WAAOA,IAAG,IAAI,QAAG,IAAI,MAAM,KAAKA,IAAG,IAAI,QAAG,CAAC,IAAIA,IAAG,IAAI,QAAG;AAAA,EAC3D;AAGA,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAAC,WAAW;AACd,UAAM,KAAK,MAAM,UAAK,UAAK,QAAG,CAAC;AAAA,EACjC;AAGA,QAAM,cAAc,QAAQ,IAAI,CAAC,KAAK,MAAM;AAC1C,WAAO,WAAWA,IAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAAA,EACzC,CAAC;AACD,QAAM,KAAKA,IAAG,IAAI,QAAG,IAAI,YAAY,KAAKA,IAAG,IAAI,QAAG,CAAC,IAAIA,IAAG,IAAI,QAAG,CAAC;AAEpE,MAAI,CAAC,WAAW;AACd,UAAM,KAAK,MAAM,UAAK,UAAK,QAAG,CAAC;AAAA,EACjC,OAAO;AACL,UAAM,KAAKA,IAAG,IAAI,QAAG,IAAI,OAAO,IAAI,CAAC,MAAMA,IAAG,IAAI,QAAG,EAAE,OAAO,CAAC,CAAC,EAAE,KAAKA,IAAG,IAAI,QAAG,CAAC,IAAIA,IAAG,IAAI,QAAG,CAAC;AAAA,EACnG;AAGA,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,UAAU,GAAG;AAE9B,QAAI,IAAI,QAAQ;AACd,YAAM,KAAK,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnC,OAAO;AACL,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,UAAM,KAAK,MAAM,UAAK,UAAK,QAAG,CAAC;AAAA,EACjC;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAIO,SAAS,SAAS,KAAa,OAAe,SAA2D;AAC9G,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,MAAM,SAAS,aAAa;AAClC,QAAM,MAAM,IAAI,OAAO,MAAM;AAC7B,SAAO,GAAG,GAAG,GAAGA,IAAG,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK;AAC5C;AA6CO,SAAS,cAAc,MAAuB;AACnD,QAAM,SAAS,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAChE,MAAI,IAAI;AACR,MAAI,UAAU;AAEd,QAAM,WAAW,YAAY,MAAM;AACjC,QAAI,CAAC,QAAS;AACd,YAAQ,OAAO,MAAM,KAAKC,IAAG,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;AACtD,SAAK,IAAI,KAAK,OAAO;AAAA,EACvB,GAAG,EAAE;AAEL,SAAO;AAAA,IACL,OAAO,SAAiB;AACtB,UAAI,CAAC,QAAS;AACd,cAAQ,OAAO,MAAM,KAAKA,IAAG,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE;AAAA,IAC3D;AAAA,IACA,QAAQ,KAAa;AACnB,gBAAU;AACV,oBAAc,QAAQ;AACtB,cAAQ,OAAO,MAAM,KAAKA,IAAG,MAAM,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI;AAAA,IACpD;AAAA,IACA,KAAK,KAAa;AAChB,gBAAU;AACV,oBAAc,QAAQ;AACtB,cAAQ,OAAO,MAAM,KAAKA,IAAG,IAAI,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI;AAAA,IAClD;AAAA,IACA,KAAK,KAAa;AAChB,gBAAU;AACV,oBAAc,QAAQ;AACtB,cAAQ,OAAO,MAAM,KAAKA,IAAG,OAAO,QAAG,CAAC,IAAI,GAAG;AAAA,CAAI;AAAA,IACrD;AAAA,IACA,OAAO;AACL,gBAAU;AACV,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AACF;AAIA,eAAsB,aACpB,SACA,SACmB;AACnB,UAAQ,IAAI;AAAA,IAAOA,IAAG,KAAK,OAAO,CAAC;AAAA,CAAI;AACvC,UAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,UAAMC,OAAMD,IAAG,KAAK,KAAK,IAAI,CAAC,EAAE;AAChC,YAAQ,IAAI,GAAGC,IAAG,KAAK,IAAI,KAAK,EAAE;AAClC,QAAI,IAAI,aAAa;AACnB,cAAQ,IAAI,QAAQD,IAAG,IAAI,IAAI,WAAW,CAAC,EAAE;AAAA,IAC/C;AAAA,EACF,CAAC;AACD,UAAQ,IAAI,KAAKA,IAAG,IAAI,YAAY,CAAC;AAAA,CAAI;AAEzC,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,QAAM,SAAS,MAAM,IAAI,QAAgB,CAACE,aAAY;AACpD,OAAG,SAAS,KAAKF,IAAG,KAAK,cAAc,CAAC,IAAIA,IAAG,IAAI,QAAQ,QAAQ,SAAS,GAAG,CAAC,MAAM,CAAC,QAAQ;AAC7F,SAAG,MAAM;AACT,MAAAE,SAAQ,IAAI,KAAK,CAAC;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,MAAI,MAAM,GAAG,KAAK,QAAQ,EAAG,QAAO;AACpC,QAAM,WAAW,QAAQ,MAAM,CAAC;AAChC,MAAI,CAAC,UAAU;AACb,YAAQ,IAAI,KAAKF,IAAG,IAAI,oBAAoB,CAAC,EAAE;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;AAEA,eAAsB,cAAc,SAAiB,eAAe,OAAyB;AAC3F,QAAM,OAAO,eAAeA,IAAG,KAAK,GAAG,IAAIA,IAAG,IAAI,IAAI,IAAIA,IAAG,IAAI,IAAI,IAAIA,IAAG,KAAK,GAAG;AACpF,QAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,QAAM,SAAS,MAAM,IAAI,QAAgB,CAACE,aAAY;AACpD,OAAG,SAAS;AAAA,IAAO,OAAO,IAAIF,IAAG,IAAI,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ;AACnE,SAAG,MAAM;AACT,MAAAE,SAAQ,IAAI,KAAK,EAAE,YAAY,CAAC;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,WAAW,OAAO,WAAW;AACtC;AAIO,SAAS,QAAQ,MAAuB;AAC7C,MAAI,MAAM;AACR,UAAM,MAAM,KAAK,KAAK,SAAS;AAC/B,UAAM,OAAO,KAAK,MAAM,MAAM,CAAC;AAC/B,UAAM,QAAQ,MAAM;AACpB,WAAOF,IAAG,IAAI,SAAI,OAAO,IAAI,IAAI,IAAI,IAAI,MAAM,SAAI,OAAO,KAAK,CAAC;AAAA,EAClE;AACA,SAAOA,IAAG,IAAI,SAAI,OAAO,EAAE,CAAC;AAC9B;AAIO,SAAS,UAAU,MAAqB;AAC7C,QAAM,IAAI,QAAQ,oBAAI,KAAK;AAC3B,QAAM,OAAO,EAAE,mBAAmB,SAAS,EAAE,QAAQ,MAAM,CAAC;AAC5D,SAAOA,IAAG,IAAI,IAAI,IAAI,GAAG;AAC3B;AAIO,SAAS,cAAc,KAAqB;AACjD,SAAOG,cAAa,KAAK,GAAG,EAAE;AAChC;AAEO,SAAS,cAAc,MAAsB;AAClD,SAAOA,cAAaH,IAAG,KAAK,IAAI,CAAC;AACnC;AAIO,SAAS,YAAY,OAAe,SAAkB,aAAgC;AAC3F,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK;AAAA,IAAOA,IAAG,MAAMA,IAAG,MAAM,SAAS,CAAC,CAAC,IAAIA,IAAG,KAAK,KAAK,CAAC,EAAE;AACnE,MAAI,SAAS;AACX,UAAM,KAAK,KAAKA,IAAG,IAAI,OAAO,CAAC,EAAE;AAAA,EACnC;AACA,MAAI,eAAe,YAAY,SAAS,GAAG;AACzC,UAAM,KAAK;AAAA,IAAOA,IAAG,KAAK,cAAc,CAAC,EAAE;AAC3C,eAAW,KAAK,aAAa;AAC3B,YAAM,KAAK,KAAKA,IAAG,KAAK,QAAG,CAAC,IAAI,CAAC,EAAE;AAAA,IACrC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAEO,SAAS,cAAc,SAAyB;AACrD,SAAO,KAAKA,IAAG,MAAM,QAAG,CAAC,IAAI,OAAO;AACtC;;;ACnYA,SAAS,aAAa,cAAc,cAAAI,mBAAkB;AACtD,SAAS,gBAAgB;AACzB,SAAS,YAAY;AA4BrB,SAAS,oBAAyC;AAChD,QAAM,YAAiC,CAAC;AACxC,QAAM,aAAa,QAAQ,SAAS;AACpC,QAAM,aAAa,aAAa;AAEhC,MAAI;AACF,UAAM,OAAO,YAAY,OAAO,EAAE,OAAO,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAE/D,eAAW,UAAU,MAAM;AACzB,UAAI;AACF,cAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,cAAM,OAAO,sBAAsB,KAAK,YAAY,UAAU;AAC9D,YAAI,KAAM,WAAU,KAAK,IAAI;AAAA,MAC/B,QAAQ;AAEN;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAEN,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,KACA,YACA,YAC0B;AAC1B,QAAM,WAAW,SAAS,GAAG;AAC7B,QAAM,aAAa,SAAS,GAAG;AAC/B,QAAM,cAAc,SAAS,GAAG;AAEhC,MAAI,CAACA,YAAW,QAAQ,EAAG,QAAO;AAGlC,QAAM,aAAa,SAAS,UAAU;AACtC,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,YAAY,WAAW,MAAM,cAAc;AACjD,QAAM,WAAW,WAAW,MAAM,cAAc;AAChD,QAAM,aAAa,WAAW,MAAM,gBAAgB;AACpD,QAAM,aAAa,WAAW,MAAM,eAAe;AACnD,QAAM,OAAO,YAAY,CAAC,KAAK,OAAO,GAAG;AACzC,QAAM,MAAM,WAAW,SAAS,SAAS,CAAC,GAAI,EAAE,IAAI;AACpD,QAAM,QAAQ,aAAa,SAAS,WAAW,CAAC,GAAI,EAAE,IAAI;AAC1D,QAAM,QAAQ,aAAa,CAAC,KAAK;AAEjC,QAAM,gBAAgB,QAAQ,UAAa,eAAe,UAAa,QAAQ;AAG/E,QAAM,WAAW,SAAS,QAAQ;AAClC,MAAI,aAAa;AACjB,MAAI,YAA2B;AAE/B,MAAI,UAAU;AAIZ,UAAM,WAAW,SAAS,YAAY,GAAG;AACzC,QAAI,WAAW,GAAG;AAChB,YAAM,SAAS,SAAS,MAAM,WAAW,CAAC,EAAE,MAAM,KAAK;AACvD,YAAM,QAAQ,SAAS,OAAO,EAAE,KAAK,KAAK,EAAE;AAC5C,YAAM,QAAQ,SAAS,OAAO,EAAE,KAAK,KAAK,EAAE;AAC5C,YAAM,YAAY,SAAS,OAAO,EAAE,KAAK,KAAK,EAAE;AAGhD,YAAM,QAAQ;AACd,YAAM,gBAAgB,WAAW;AACjC,YAAM,eAAe,QAAQ;AAE7B,UAAI,gBAAgB,GAAG;AACrB,cAAM,iBAAiB,gBAAgB;AACvC,cAAM,iBAAiB;AACvB,qBAAa,KAAK,IAAI,KAAM,iBAAiB,KAAK,IAAI,GAAG,cAAc,IAAK,MAAM,KAAK,EAAE,MAAM;AAAA,MACjG;AAGA,kBAAY,gBAAgB,WAAW,eAAe,KAAK;AAAA,IAC7D;AAAA,EACF;AAGA,QAAM,aAAa,SAAS,WAAW;AACvC,QAAMC,WAAU,aACZ,WAAW,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,IAC/C;AAGJ,QAAM,QAAQ,qBAAqB,GAAG;AAEtC,QAAM,aAAa,aAAa,IAAK,QAAQ,aAAc,MAAM;AAEjE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAASA,SAAQ,SAAS,MAAMA,SAAQ,MAAM,GAAG,GAAG,IAAI,WAAMA;AAAA,IAC9D,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI;AAAA,IAC1C,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI;AAAA,IAC1C,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIA,SAAS,iBAAsC;AAC7C,MAAI;AACF,UAAM,SAAS;AAAA,MACb;AAAA,MACA,EAAE,UAAU,SAAS,SAAS,IAAK;AAAA,IACrC;AAEA,UAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC;AAC/C,UAAM,cAAc,SAAS,UAAU,EAAE,UAAU,SAAS,SAAS,IAAK,CAAC,EAAE,KAAK;AAElF,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,YAAM,MAAM,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AACxC,YAAM,OAAO,MAAM,CAAC,KAAK;AACzB,YAAM,MAAM,WAAW,MAAM,CAAC,KAAK,GAAG;AACtC,YAAM,MAAM,WAAW,MAAM,CAAC,KAAK,GAAG;AACtC,YAAM,MAAM,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AACxC,YAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,YAAM,UAAU,MAAM,CAAC,KAAK;AAC5B,YAAM,OAAO,MAAM,CAAC,KAAK;AACzB,YAAMA,WAAU,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAEvC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAASA,SAAQ,SAAS,MAAMA,SAAQ,MAAM,GAAG,GAAG,IAAI,WAAMA;AAAA,QAC9D,YAAY,KAAK,MAAM,MAAM,EAAE,IAAI;AAAA,QACnC,YAAY,KAAK,MAAM,MAAM,EAAE,IAAI;AAAA,QACnC,QAAQ;AAAA,QACR,OAAO,YAAY,KAAK;AAAA,QACxB,WAAW,WAAW;AAAA,QACtB,OAAO,CAAC;AAAA,QACR,eAAe,SAAS;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,YAAY,GAAmB;AACtC,UAAQ,GAAG;AAAA,IACT,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB;AAAS,aAAO;AAAA,EAClB;AACF;AAQA,SAAS,qBAAqB,MAAwB;AACpD,SAAO,CAAC;AACV;AAIA,SAAS,SAAS,MAA6B;AAC7C,MAAI;AACF,WAAO,aAAa,MAAM,OAAO;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAuB;AAC9B,MAAI;AACF,UAAM,UAAU,SAAS,eAAe;AACxC,QAAI,SAAS;AACX,YAAM,QAAQ,QAAQ,MAAM,mBAAmB;AAC/C,UAAI,MAAO,QAAO,SAAS,MAAM,CAAC,GAAI,EAAE;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,aAAqB;AAC5B,MAAI;AACF,UAAM,OAAO,SAAS,cAAc;AACpC,QAAI,MAAM;AACR,aAAO,WAAW,KAAK,MAAM,KAAK,EAAE,CAAC,KAAK,GAAG;AAAA,IAC/C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAmB,eAAuB,OAA8B;AAC/F,MAAI;AACF,UAAM,WAAW,KAAK,IAAI,IAAI,MAAO;AACrC,UAAM,eAAe,WAAW,YAAY;AAC5C,WAAO,IAAI,KAAK,eAAe,GAAI,EAAE,YAAY;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,mBAAmB,QAAmD;AACpF,MAAI;AAGJ,MAAID,YAAW,OAAO,GAAG;AACvB,gBAAY,kBAAkB;AAAA,EAChC,OAAO;AACL,gBAAY,eAAe;AAAA,EAC7B;AAGA,MAAI,QAAQ;AACV,QAAI,OAAO,UAAU;AACnB,kBAAY,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa;AAAA,IACrD;AACA,QAAI,OAAO,MAAM;AACf,YAAM,YAAY,OAAO,KAAK,YAAY;AAC1C,kBAAY,UAAU;AAAA,QACpB,CAAC,MAAM,EAAE,KAAK,YAAY,EAAE,SAAS,SAAS,KAAK,EAAE,QAAQ,YAAY,EAAE,SAAS,SAAS;AAAA,MAC/F;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,kBAAY,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG;AAAA,IAC1D;AACA,QAAI,OAAO,MAAM;AACf,kBAAY,UAAU,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,OAAO,IAAK,CAAC;AAAA,IACpE;AAGA,QAAI,OAAO,QAAQ;AACjB,gBAAU,KAAK,CAAC,GAAG,MAAM;AACvB,gBAAQ,OAAO,QAAQ;AAAA,UACrB,KAAK;AAAQ,mBAAO,EAAE,aAAa,EAAE;AAAA,UACrC,KAAK;AAAQ,mBAAO,EAAE,aAAa,EAAE;AAAA,UACrC,KAAK;AAAQ,mBAAO,EAAE,MAAM,EAAE;AAAA,UAC9B,KAAK;AAAQ,mBAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,UAC/C;AAAa,mBAAO,EAAE,aAAa,EAAE;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,SAAS,OAAO,QAAQ,GAAG;AACpC,kBAAY,UAAU,MAAM,GAAG,OAAO,KAAK;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AACT;AAaO,SAAS,YAAY,KAAa,SAAyB,WAAoB;AACpF,MAAI;AACF,YAAQ,KAAK,KAAK,MAAM;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,iBAAiB,KAAsB;AACrD,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,mBAAmB,OAAuB;AACxD,UAAQ,OAAO;AAAA,IACb,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB;AAAU,aAAO;AAAA,EACnB;AACF;;;ARpUA,IAAM,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,IAAI,QAAQ;AAavC,SAAS,iBAAyB;AAChC,QAAM,MAAM,QAAQ,IAAI,kBACpBE,SAAQ,QAAQ,IAAI,eAAe,IACnCA,SAAQ,QAAQ,GAAG,SAAS;AAChC,SAAOA,SAAQ,KAAK,cAAc;AACpC;AAEA,SAAS,cAAgC;AACvC,MAAI;AACF,UAAM,OAAO,eAAe;AAC5B,QAAI,CAACC,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,WAAO,KAAK,MAAMC,cAAa,MAAM,OAAO,CAAC;AAAA,EAC/C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,YAAY,WAAmC;AACtD,MAAI;AACF,UAAM,OAAO,eAAe;AAC5B,cAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,kBAAc,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,GAAG,OAAO;AAAA,EACjE,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,WAAW,MAA4B;AAC9C,QAAM,UAAU,YAAY;AAE5B,QAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC3D,WAAS,KAAK,IAAI;AAClB,cAAY,QAAQ;AACtB;AAEA,SAAS,cAAc,MAAoB;AACzC,QAAM,UAAU,YAAY;AAC5B,cAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC;AACpD;AAEA,SAAS,mBAAmB,KAAmB;AAC7C,QAAM,UAAU,YAAY;AAC5B,cAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC;AAClD;AAIA,eAAe,OAAsB;AACnC,MAAI,CAAC,WAAW,YAAY,SAAS;AAGnC,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,GAAG,WAAW,IAAI,GAAG;AAClD,YAAM,YAAY,IAAI;AAAA,IACxB,OAAO;AACL,YAAM,aAAa,IAAI;AAAA,IACzB;AAAA,EACF,WAAW,YAAY,OAAO;AAC5B,UAAM,WAAW,IAAI;AAAA,EACvB,WAAW,YAAY,MAAM;AAC3B,UAAM,UAAU,IAAI;AAAA,EACtB,WAAW,YAAY,UAAU;AAC/B,UAAM,cAAc,IAAI;AAAA,EAC1B,WAAW,YAAY,OAAO;AAC5B,UAAM,WAAW,IAAI;AAAA,EACvB,WAAW,YAAY,QAAQ;AAC7B,UAAM,YAAY,IAAI;AAAA,EACxB,WAAW,YAAY,WAAW;AAChC,UAAM,eAAe,IAAI;AAAA,EAC3B,WAAW,YAAY,UAAU;AAC/B,UAAM,cAAc,IAAI;AAAA,EAC1B,WAAW,YAAY,QAAQ;AAC7B,UAAM,YAAY,IAAI;AAAA,EACxB,WAAW,YAAY,cAAc;AACnC,UAAM,iBAAiB,IAAI;AAAA,EAC7B,WAAW,YAAY,eAAe;AACpC,UAAM,kBAAkB,IAAI;AAAA,EAC9B,WAAW,YAAY,SAAS;AAC9B,UAAM,aAAa,IAAI;AAAA,EACzB,WAAW,YAAY,YAAY;AACjC,UAAM,gBAAgB;AAAA,EACxB,WAAW,YAAY,SAAS;AAC9B,UAAM,aAAa;AAAA,EACrB,WAAW,YAAY,oBAAoB;AACzC,gBAAY;AACZ,UAAM,uBAAuB;AAAA,EAC/B,WAAW,YAAY,QAAQ;AAC7B,gBAAY;AACZ,UAAM,YAAY;AAAA,EACpB,WAAW,YAAY,aAAa,YAAY,eAAe,YAAY,MAAM;AAC/E,YAAQ,IAAI,KAAK,QAAQ,GAAG,IAAIC,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,SAAS,CAAC,EAAE;AAAA,EAC1E,WAAW,YAAY,UAAU,YAAY,YAAY,YAAY,MAAM;AACzE,YAAQ,IAAIA,IAAG,IAAI,+CAA+C,CAAC;AACnE,gBAAY;AACZ,aAAS;AAAA,EACX,OAAO;AACL,YAAQ,MAAM,YAAY,oBAAoB,OAAO,IAAI,yCAAyC,CAAC;AACnG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,eAAe,YAAYC,OAA+B;AACxD,cAAY;AACZ,UAAQ,MAAM,KAAKD,IAAG,IAAI,+BAA+B,CAAC;AAAA,CAAI;AAE9D,QAAM,cAAcC,MAAK,QAAQ,UAAU;AAC3C,QAAM,aAAa,gBAAgB,KAAKA,MAAK,cAAc,CAAC,IAAI;AAEhE,QAAM,eAAeA,MAAK,QAAQ,YAAY;AAC9C,QAAM,UAAU,iBAAiB,KAAK,SAASA,MAAK,eAAe,CAAC,GAAI,EAAE,IAAI;AAE9E,MAAI;AACF,UAAM,SAAS,IAAI,aAAa,UAAU;AAC1C,UAAM,OAAO,MAAM;AAEnB,YAAQ,MAAM;AAAA,IAAOD,IAAG,MAAM,QAAG,CAAC,IAAIA,IAAG,KAAK,0BAA0B,CAAC,EAAE;AAC3E,YAAQ,MAAM,KAAK,SAAS,aAAa,OAAO,CAAC,EAAE;AACnD,YAAQ,MAAM,KAAK,SAAS,kBAAkB,oBAAoB,OAAO,EAAE,CAAC,EAAE;AAC9E,YAAQ,MAAM,KAAK,SAAS,YAAY,0BAA0B,CAAC,EAAE;AACrE,YAAQ,MAAM;AAAA,IAAOA,IAAG,IAAI,sBAAsB,CAAC;AAAA,CAAI;AAAA,EACzD,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,0BAA0B,OAAO,KAAK,CAAC,CAAC;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,eAAe,aAAaC,OAA+B;AACzD,cAAY;AACZ,UAAQ,MAAM,KAAKD,IAAG,IAAI,iBAAiB,CAAC;AAAA,CAAI;AAChD,QAAM,WAAWC,KAAI;AACvB;AAIA,eAAe,WAAWA,OAA+B;AACvD,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,QAAM,OAAO,cAAc,KAAKA,MAAK,YAAY,CAAC,IAAI;AACtD,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,QAAM,OAAO,cAAc,KAAK,SAASA,MAAK,YAAY,CAAC,GAAI,EAAE,IAAI;AACrE,QAAM,WAAWA,MAAK,QAAQ,OAAO;AACrC,QAAM,MAAM,aAAa,KAAKA,MAAK,WAAW,CAAC,IAAI;AACnD,QAAM,cAAcA,MAAK,SAAS,WAAW;AAG7C,QAAM,YAAY,CAAC,WAAW,WAAW,QAAQ,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE;AACzE,QAAM,SAAS,KAAK,IAAI,GAAG,WAAW,QAAQ;AAC9C,QAAM,WAAWA,MAAK,MAAM,GAAG,MAAM;AACrC,QAAM,MAAM,SAAS,KAAK,GAAG;AAE7B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,mBAAmB,2FAA2F,CAAC;AACzI,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,QAAQ,SAAS,CAAC,KAAK;AAEvC,UAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAID,IAAG,KAAK,SAAS,CAAC,IAAI,cAAc,OAAO,CAAC;AAAA,CAAI;AACpF,UAAQ,MAAM,KAAK,SAAS,WAAW,GAAG,CAAC,EAAE;AAC7C,MAAI,KAAM,SAAQ,MAAM,KAAK,SAAS,QAAQ,OAAO,IAAI,CAAC,CAAC,EAAE;AAC7D,MAAI,IAAK,SAAQ,MAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AACxD,UAAQ,MAAM,KAAK,SAAS,WAAW,cAAc,aAAa,KAAK,CAAC,EAAE;AAC1E,UAAQ,MAAM,KAAK,QAAQ,CAAC,EAAE;AAG9B,QAAM,SAAS;AAAA,IACb,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB,CAAC;AAAA,EACnB;AACA,QAAM,KAAK,IAAI,eAAe,MAAM;AAEpC,MAAI;AACF,UAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAI,SAAS,MAAM,CAAC,GAAG,KAAK,QAAW,OAAO;AAG9E,eAAW;AAAA,MACT,MAAM;AAAA,MACN,KAAK,KAAK;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,YAAQ,MAAM;AAAA,IAAOA,IAAG,MAAM,QAAG,CAAC,IAAIA,IAAG,KAAK,OAAO,CAAC,IAAIA,IAAG,IAAI,iBAAiB,KAAK,GAAG,GAAG,CAAC,GAAG,OAAOA,IAAG,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE;AAAA,CAAI;AAGpI,UAAM,SAAS,KAAK,MAAM;AAC1B,UAAM,SAAS,KAAK,MAAM;AAE1B,QAAI,QAAQ;AACV,aAAO,GAAG,QAAQ,CAAC,SAAiB;AAClC,cAAM,QAAQ,KAAK,SAAS,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,mBAAW,QAAQ,OAAO;AACxB,gBAAM,QAAQ,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,IAAI,UAC7D,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,IAAI,SACjD;AACJ,gBAAM,OAAO,UAAU;AACvB,gBAAM,MAAM,SAAS,KAAK;AAC1B,kBAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI;AAAA,CAAI;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ;AACV,aAAO,GAAG,QAAQ,CAAC,SAAiB;AAClC,cAAM,QAAQ,KAAK,SAAS,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACxD,mBAAW,QAAQ,OAAO;AACxB,gBAAM,OAAO,UAAU;AACvB,gBAAM,MAAM,SAAS,OAAO;AAC5B,kBAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,GAAG,IAAIA,IAAG,IAAI,IAAI,CAAC;AAAA,CAAI;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAGA,SAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AAEtC,oBAAc,OAAO;AACrB,UAAI,eAAe,SAAS,GAAG;AAC7B,gBAAQ,MAAM;AAAA,IAAOA,IAAG,OAAO,QAAG,CAAC,IAAI,OAAO,IAAIA,IAAG,IAAI,WAAW,IAAI,kBAAkB,CAAC,EAAE;AAC7F,WAAG,QAAQ,OAAO,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACpC,OAAO;AACL,gBAAQ,MAAM;AAAA,IAAOA,IAAG,IAAI,QAAG,CAAC,IAAIA,IAAG,KAAK,OAAO,CAAC,IAAIA,IAAG,IAAI,WAAW,IAAI,GAAG,CAAC,EAAE;AAAA,MACtF;AAAA,IACF,CAAC;AAGD,UAAM,IAAI,QAAQ,MAAM;AAAA,IAAC,CAAC;AAAA,EAC5B,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,iBAAiB,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAMA,eAAe,UAAUC,OAA+B;AACtD,QAAM,YAAYA,MAAK,SAAS,IAAI,KAAKA,MAAK,SAAS,SAAS;AAChE,QAAM,aAAaA,MAAK,SAAS,UAAU,KAAKA,MAAK,SAAS,IAAI,KAAKA,MAAK,SAAS,OAAO;AAC5F,QAAM,aAAaA,MAAK,SAAS,QAAQ,IAAIA,MAAKA,MAAK,QAAQ,QAAQ,IAAI,CAAC,IAAI;AAChF,QAAM,SAASA,MAAK,SAAS,QAAQ,IAChCA,MAAKA,MAAK,QAAQ,QAAQ,IAAI,CAAC,IAChC;AAEJ,MAAI,aAAa,YAAY;AAC3B,UAAM,qBAAqB,QAAQ,EAAE;AACrC;AAAA,EACF;AAGA,MAAI,YAAY;AACd,UAAM,UAAU,cAAc,8BAA8B;AAC5D,QAAI;AACF,YAAM,YAAY,mBAAmB;AAAA,QACnC,MAAM;AAAA,QACN,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AACD,cAAQ,KAAK;AACb,cAAQ,OAAO,MAAM,UAAU;AAE/B,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,MAAM;AAAA,IAAOD,IAAG,IAAI,4BAA4B,CAAC;AAAA,CAAI;AAC7D;AAAA,MACF;AAEA,YAAME,WAAoB;AAAA,QACxB,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,SAAS,QAAQ,CAAC,MAAMF,IAAG,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;AAAA,QACzF,EAAE,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAAC,MAAMA,IAAG,KAAK,OAAO,CAAC,CAAC,EAAE;AAAA,QAChE,EAAE,KAAK,OAAO,OAAO,QAAQ,OAAO,SAAS,QAAQ,CAAC,MAAM;AAC1D,gBAAM,MAAM;AACZ,iBAAO,MAAM,KAAKA,IAAG,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,IAAIA,IAAG,OAAO,OAAO,GAAG,CAAC,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC;AAAA,QAC/F,EAAC;AAAA,QACD,EAAE,KAAK,OAAO,OAAO,QAAQ,OAAO,SAAS,QAAQ,CAAC,MAAM;AAC1D,gBAAM,MAAM;AACZ,iBAAO,MAAM,KAAKA,IAAG,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,IAAIA,IAAG,OAAO,OAAO,GAAG,CAAC,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC;AAAA,QAC/F,EAAC;AAAA,QACD,EAAE,KAAK,SAAS,OAAO,SAAS,QAAQ,CAAC,MAAM;AAC7C,gBAAM,IAAI,OAAO,CAAC;AAClB,cAAI,MAAM,OAAO,MAAM,UAAW,QAAOA,IAAG,MAAM,CAAC;AACnD,cAAI,MAAM,OAAO,MAAM,SAAU,QAAOA,IAAG,IAAI,CAAC;AAChD,cAAI,MAAM,OAAO,MAAM,WAAY,QAAOA,IAAG,KAAK,CAAC;AACnD,iBAAOA,IAAG,IAAI,CAAC;AAAA,QACjB,EAAC;AAAA,MACH;AAEA,YAAMG,QAAc,UAAU,IAAI,CAAC,OAAO;AAAA,QACxC,KAAK,EAAE;AAAA,QACP,MAAM,EAAE;AAAA,QACR,KAAK,EAAE;AAAA,QACP,KAAK,EAAE;AAAA,QACP,OAAO,mBAAmB,EAAE,KAAK;AAAA,MACnC,EAAE;AAEF,cAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAIH,IAAG,KAAK,kBAAkB,CAAC,IAAIA,IAAG,IAAI,QAAQ,UAAU,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA,CAAI;AACvH,cAAQ,MAAM,YAAYE,UAASC,KAAI,CAAC;AACxC,cAAQ,MAAM;AAAA,IAChB,SAAS,OAAO;AACd,cAAQ,KAAK,0BAA0B;AACvC,cAAQ,MAAM,YAAY,uBAAuB,OAAO,KAAK,CAAC,CAAC;AAAA,IACjE;AACA;AAAA,EACF;AAGA,QAAM,UAAU,YAAY;AAE5B,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,MAAM;AAAA,IAAOH,IAAG,IAAI,uBAAuB,CAAC,EAAE;AACtD,YAAQ,MAAM,KAAKA,IAAG,IAAI,oBAAoB,CAAC,IAAIA,IAAG,KAAK,sCAAsC,CAAC;AAAA,CAAI;AACtG;AAAA,EACF;AAEA,QAAM,UAAoB;AAAA,IACxB,EAAE,KAAK,QAAQ,OAAO,OAAO,QAAQ,CAAC,MAAMA,IAAG,KAAK,OAAO,CAAC,CAAC,EAAE;AAAA,IAC/D,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ;AAAA,IAC3C,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,CAAC,MAAM;AAC/C,YAAM,IAAI;AACV,UAAI,MAAM,UAAW,QAAOA,IAAG,MAAM,gBAAW;AAChD,aAAOA,IAAG,IAAI,gBAAW;AAAA,IAC3B,EAAC;AAAA,IACD,EAAE,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAAC,MAAM;AAC3C,YAAM,IAAI;AACV,aAAO,IAAIA,IAAG,OAAO,IAAI,CAAC,EAAE,IAAIA,IAAG,IAAI,GAAG;AAAA,IAC5C,EAAC;AAAA,IACD,EAAE,KAAK,WAAW,OAAO,WAAW,QAAQ,CAAC,MAAM;AACjD,YAAM,IAAI,OAAO,CAAC;AAClB,aAAO,EAAE,SAAS,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,WAAM;AAAA,IAChD,EAAC;AAAA,IACD,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,CAAC,MAAMA,IAAG,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,EACrE;AAEA,QAAM,OAAc,QAAQ,IAAI,CAAC,MAAM;AACrC,UAAM,UAAU,iBAAiB,EAAE,GAAG;AACtC,UAAM,SAAS,UACX,aAAa,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,GAAI,CAAC,IAC9E;AACJ,WAAO;AAAA,MACL,MAAM,EAAE;AAAA,MACR,KAAK,UAAU,OAAO,EAAE,GAAG,IAAIA,IAAG,IAAI,OAAO,EAAE,GAAG,CAAC;AAAA,MACnD,QAAQ,UAAU,YAAY;AAAA,MAC9B,MAAM,EAAE,QAAQ;AAAA,MAChB,SAAS,EAAE;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,iBAAiB,EAAE,GAAG,CAAC,EAAE;AAEpE,UAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAIA,IAAG,KAAK,aAAa,CAAC,IAAIA,IAAG,IAAI,IAAI,YAAY,IAAI,QAAQ,MAAM,WAAW,CAAC;AAAA,CAAI;AACvH,UAAQ,MAAM,YAAY,SAAS,IAAI,CAAC;AACxC,UAAQ,MAAM,KAAKA,IAAG,IAAI,KAAK,CAAC,IAAIA,IAAG,KAAK,oDAAoD,CAAC,IAAIA,IAAG,IAAI,mBAAmB,CAAC,EAAE;AAClI,UAAQ,MAAM,KAAKA,IAAG,IAAI,KAAK,CAAC,IAAIA,IAAG,KAAK,mBAAmB,CAAC,IAAIA,IAAG,IAAI,eAAe,CAAC,EAAE;AAC7F,UAAQ,MAAM,KAAKA,IAAG,IAAI,KAAK,CAAC,IAAIA,IAAG,KAAK,oBAAoB,CAAC,IAAIA,IAAG,IAAI,iBAAiB,CAAC,EAAE;AAChG,UAAQ,MAAM;AAChB;AAEA,SAAS,aAAa,SAAyB;AAC7C,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,MAAI,UAAU,KAAM,QAAO,GAAG,KAAK,MAAM,UAAU,EAAE,CAAC,KAAK,UAAU,EAAE;AACvE,QAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AACnC,QAAM,IAAI,KAAK,MAAO,UAAU,OAAQ,EAAE;AAC1C,MAAI,KAAK,IAAI;AACX,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,WAAO,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,CAAC;AAAA,EAC9B;AACA,SAAO,GAAG,CAAC,KAAK,CAAC;AACnB;AAEA,eAAe,qBAAqB,QAAgB,OAA8B;AAChF,UAAQ,MAAM;AAAA,IAAOA,IAAG,KAAK,2BAA2B,CAAC,IAAIA,IAAG,IAAI,sCAAsC,CAAC;AAAA,CAAI;AAE/G,QAAM,SAAS,MAAM;AACnB,UAAM,YAAY,mBAAmB;AAAA,MACnC,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,UAAoB;AAAA,MACxB,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,SAAS,QAAQ,CAAC,MAAMA,IAAG,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;AAAA,MACzF,EAAE,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAAC,MAAMA,IAAG,KAAK,OAAO,CAAC,CAAC,EAAE;AAAA,MAChE,EAAE,KAAK,OAAO,OAAO,QAAQ,OAAO,SAAS,QAAQ,CAAC,MAAM;AAC1D,cAAM,MAAM;AACZ,eAAO,MAAM,KAAKA,IAAG,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,IAAIA,IAAG,OAAO,OAAO,GAAG,CAAC,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MAC/F,EAAC;AAAA,MACD,EAAE,KAAK,OAAO,OAAO,QAAQ,OAAO,SAAS,QAAQ,CAAC,MAAM;AAC1D,cAAM,MAAM;AACZ,eAAO,MAAM,KAAKA,IAAG,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,IAAIA,IAAG,OAAO,OAAO,GAAG,CAAC,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC;AAAA,MAC/F,EAAC;AAAA,MACD,EAAE,KAAK,SAAS,OAAO,KAAK,OAAO,SAAS;AAAA,IAC9C;AAEA,UAAM,OAAc,UAAU,IAAI,CAAC,OAAO;AAAA,MACxC,KAAK,EAAE;AAAA,MACP,MAAM,EAAE;AAAA,MACR,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,OAAO,EAAE;AAAA,IACX,EAAE;AAEF,WAAO,KAAK,UAAU,CAAC,IAAIA,IAAG,IAAI,GAAG,UAAU,MAAM,YAAY,CAAC;AAAA,EAAK,YAAY,SAAS,MAAM,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,EACtH;AAEA,UAAQ,MAAM,OAAO,CAAC;AACtB,QAAM,WAAW,YAAY,MAAM;AACjC,YAAQ,OAAO,MAAM,QAAQ;AAC7B,YAAQ,MAAM,OAAO,CAAC;AAAA,EACxB,GAAG,GAAI;AAEP,UAAQ,GAAG,UAAU,MAAM;AACzB,kBAAc,QAAQ;AACtB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,QAAM,IAAI,QAAQ,MAAM;AAAA,EAAC,CAAC;AAC5B;AAIA,eAAe,cAAc,OAAgC;AAC3D,QAAM,YAAY,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,SAAS;AAGlE,QAAM,UAAU,YAAY;AAC5B,QAAM,YAAY,mBAAmB,EAAE,UAAU,MAAM,QAAQ,OAAO,OAAO,EAAE,CAAC;AAChF,QAAM,iBAAiB,mBAAmB,EAAE,UAAU,KAAK,CAAC,EAAE;AAE9D,UAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAIA,IAAG,KAAK,eAAe,CAAC;AAAA,CAAI;AAGhE,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,iBAAiB,EAAE,GAAG,CAAC,EAAE;AACpE,YAAQ,MAAM,KAAKA,IAAG,KAAK,cAAc,CAAC,IAAIA,IAAG,IAAI,IAAI,YAAY,IAAI,QAAQ,MAAM,WAAW,CAAC;AAAA,CAAI;AAEvG,eAAW,KAAK,SAAS;AACvB,YAAM,UAAU,iBAAiB,EAAE,GAAG;AACtC,YAAM,aAAa,UAAUA,IAAG,MAAM,QAAG,IAAIA,IAAG,IAAI,QAAG;AACvD,YAAM,UAAU,EAAE,OAAO,IAAIA,IAAG,OAAO,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK;AACzD,YAAM,SAAS,UACXA,IAAG,IAAI,aAAa,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,GAAI,CAAC,CAAC,IACtFA,IAAG,IAAI,SAAS;AACpB,cAAQ,MAAM,KAAK,UAAU,IAAIA,IAAG,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,IAAIA,IAAG,IAAI,QAAQ,EAAE,GAAG,GAAG,CAAC,WAAM,MAAM,EAAE;AAAA,IACtG;AACA,YAAQ,MAAM;AAAA,EAChB,OAAO;AACL,YAAQ,MAAM,KAAKA,IAAG,IAAI,kBAAkB,CAAC,IAAIA,IAAG,KAAK,sCAAsC,CAAC;AAAA,CAAI;AAAA,EACtG;AAGA,UAAQ,MAAM,KAAKA,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,IAAI,cAAc,kBAAkB,CAAC,EAAE;AAEtF,aAAW,KAAK,WAAW;AACzB,UAAM,SAAS,EAAE,aAAa,KAAKA,IAAG,IAAI,GAAG,EAAE,UAAU,GAAG,IAAI,EAAE,aAAa,IAAIA,IAAG,OAAO,GAAG,EAAE,UAAU,GAAG,IAAIA,IAAG,IAAI,GAAG,EAAE,UAAU,GAAG;AAC5I,UAAM,SAAS,EAAE,aAAa,KAAKA,IAAG,IAAI,GAAG,EAAE,UAAU,GAAG,IAAI,EAAE,aAAa,IAAIA,IAAG,OAAO,GAAG,EAAE,UAAU,GAAG,IAAIA,IAAG,IAAI,GAAG,EAAE,UAAU,GAAG;AAC5I,YAAQ,MAAM,KAAKA,IAAG,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,IAAIA,IAAG,KAAK,EAAE,IAAI,CAAC,gBAAW,MAAM,SAAS,MAAM,EAAE;AAAA,EAChG;AAEA,MAAI,WAAW;AACb,UAAM,qBAAqB,OAAO,EAAE;AAAA,EACtC;AAEA,UAAQ,MAAM;AAChB;AAIA,eAAe,YAAYC,OAA+B;AACxD,QAAM,YAAYA,MAAK,CAAC;AACxB,QAAM,cAAcA,MAAK,QAAQ,UAAU;AAC3C,QAAM,YAAY,gBAAgB,KAAKA,MAAK,cAAc,CAAC,IAAI;AAC/D,QAAM,SAAU,aAAa;AAG7B,MAAI,cAAc,SAASA,MAAK,SAAS,OAAO,KAAKA,MAAK,SAAS,IAAI,GAAG;AACxE,UAAM,YAAY,mBAAmB,EAAE,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,CAAC;AAClF,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,MAAM,KAAKD,IAAG,IAAI,4BAA4B,CAAC,EAAE;AACzD;AAAA,IACF;AAEA,YAAQ,MAAM;AAAA,IAAOA,IAAG,KAAK,QAAQ,UAAU,MAAM,kBAAkB,CAAC,EAAE;AAC1E,YAAQ,MAAM,KAAKA,IAAG,IAAI,4CAA4C,CAAC,EAAE;AACzE,YAAQ,MAAM,KAAKA,IAAG,OAAO,+CAA0C,CAAC;AAAA,CAAI;AAE5E,UAAMI,aAAY,MAAM;AAAA,MACtB,GAAGJ,IAAG,IAAI,eAAe,CAAC,IAAIA,IAAG,IAAI,uBAAuB,CAAC;AAAA,MAC7D;AAAA,IACF;AAEA,QAAI,CAACI,YAAW;AACd,cAAQ,MAAM,KAAKJ,IAAG,IAAI,YAAY,CAAC,EAAE;AACzC;AAAA,IACF;AAEA,UAAMK,WAAU,cAAc,WAAW,UAAU,MAAM,eAAe;AACxE,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAW,QAAQ,WAAW;AAC5B,UAAI,YAAQ,KAAK,KAAK,MAAM,GAAG;AAC7B;AACA,2BAAmB,KAAK,GAAG;AAAA,MAC7B,OAAO;AACL;AAAA,MACF;AAEA,UAAI,SAAS,OAAO,EAAG,OAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAAA,IACnE;AAEA,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE3C,QAAI,SAAS,GAAG;AACd,MAAAA,SAAQ,QAAQ,GAAG,MAAM,qBAAqB;AAAA,IAChD,OAAO;AACL,MAAAA,SAAQ,KAAK,0BAA0B;AAAA,IACzC;AAEA,QAAI,SAAS,GAAG;AACd,cAAQ,MAAM,KAAKL,IAAG,OAAO,GAAG,MAAM,kCAAkC,CAAC,IAAIA,IAAG,IAAI,iBAAiB,CAAC,EAAE;AAAA,IAC1G;AACA;AAAA,EACF;AAGA,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,YAAY,kBAAkB,qEAAqE,CAAC;AAClH,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACJ,MAAI;AAEJ,QAAM,MAAM,SAAS,WAAW,EAAE;AAClC,MAAI,CAAC,MAAM,GAAG,KAAK,OAAO,GAAG,MAAM,WAAW;AAE5C,QAAI,CAAC,iBAAiB,GAAG,GAAG;AAC1B,cAAQ,MAAM,YAAY,qBAAqB,uBAAuB,GAAG,aAAa,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,gBAAY;AACZ,kBAAc,OAAO,GAAG;AAAA,EAC1B,OAAO;AAEL,UAAM,UAAU,mBAAmB,EAAE,MAAM,WAAW,UAAU,MAAM,QAAQ,MAAM,CAAC;AACrF,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,MAAM,YAAY,qBAAqB,gCAAgC,SAAS,GAAG,CAAC;AAC5F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,QAAQ,SAAS,GAAG;AAEtB,cAAQ,MAAM;AAAA,IAAOA,IAAG,KAAK,6BAA6B,SAAS,IAAI,CAAC,EAAE;AAC1E,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA,QAAQ,IAAI,CAAC,GAAG,OAAO;AAAA,UACrB,OAAO,OAAO,CAAC;AAAA,UACf,OAAO,GAAG,EAAE,IAAI,SAAS,EAAE,GAAG;AAAA,UAC9B,aAAa,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,CAAC,gBAAW,EAAE,UAAU,UAAU,EAAE,UAAU;AAAA,QACrF,EAAE;AAAA,MACJ;AACA,UAAI,aAAa,MAAM;AACrB,gBAAQ,MAAM,KAAKA,IAAG,IAAI,WAAW,CAAC,EAAE;AACxC;AAAA,MACF;AACA,YAAM,MAAM,SAAS,UAAU,EAAE;AACjC,kBAAY,QAAQ,GAAG,EAAG;AAC1B,oBAAc,GAAG,QAAQ,GAAG,EAAG,IAAI,SAAS,SAAS;AAAA,IACvD,OAAO;AACL,kBAAY,QAAQ,CAAC,EAAG;AACxB,oBAAc,GAAG,QAAQ,CAAC,EAAG,IAAI,SAAS,SAAS;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,QAAQA,IAAG,KAAK,WAAW,CAAC,SAASA,IAAG,OAAO,MAAM,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,KAAKA,IAAG,IAAI,WAAW,CAAC,EAAE;AACxC;AAAA,EACF;AAEA,QAAM,UAAU,cAAc,WAAW,MAAM,OAAO,WAAW,KAAK;AAEtE,QAAM,UAAU,YAAQ,WAAW,MAAM;AAEzC,MAAI,SAAS;AAEX,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,UAAM,eAAe,iBAAiB,SAAS;AAC/C,QAAI,gBAAgB,WAAW,WAAW;AACxC,cAAQ,KAAK,GAAG,WAAW,uBAAuB,MAAM,EAAE;AAC1D,YAAM,YAAY,MAAM;AAAA,QACtB,QAAQA,IAAG,IAAI,SAAS,CAAC;AAAA,QACzB;AAAA,MACF;AACA,UAAI,WAAW;AACb,cAAM,eAAe,cAAc,sBAAsB,WAAW,KAAK;AACzE,oBAAQ,WAAW,SAAS;AAC5B,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,YAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,uBAAa,QAAQ,GAAG,WAAW,gBAAgB;AAAA,QACrD,OAAO;AACL,uBAAa,KAAK,GAAG,WAAW,4CAA4C;AAAA,QAC9E;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,KAAKA,IAAG,IAAI,0BAA0B,CAAC,EAAE;AACvD,oBAAQ,WAAW,SAAS;AAC5B,gBAAQ,MAAM,KAAKA,IAAG,OAAO,QAAG,CAAC,IAAI,WAAW,IAAIA,IAAG,IAAI,sBAAsB,CAAC,EAAE;AAAA,MACtF;AAAA,IACF,OAAO;AAEL,yBAAmB,SAAS;AAC5B,cAAQ,QAAQ,GAAG,WAAW,UAAU;AAAA,IAC1C;AAAA,EACF,OAAO;AACL,YAAQ,KAAK,kBAAkB,WAAW,EAAE;AAC5C,YAAQ,MAAM,YAAY,qBAAqB,kDAAkD,CAAC;AAAA,EACpG;AACF;AAIA,eAAe,eAAeC,OAA+B;AAC3D,QAAM,OAAOA,MAAK,CAAC;AACnB,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,YAAY,4BAA4B,kCAAkC,CAAC;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACJ,QAAM,MAAM,SAAS,MAAM,EAAE;AAC7B,MAAI,CAAC,MAAM,GAAG,KAAK,OAAO,GAAG,MAAM,MAAM;AACvC,gBAAY;AAAA,EACd,OAAO;AACL,UAAM,YAAY,mBAAmB,EAAE,MAAM,UAAU,MAAM,OAAO,EAAE,CAAC;AACvE,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,MAAM,YAAY,qBAAqB,wBAAwB,IAAI,GAAG,CAAC;AAC/E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,gBAAY,UAAU,CAAC,EAAG;AAAA,EAC5B;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,WAAWD,IAAG,KAAK,GAAG,IAAI,SAAS,SAAS,GAAG,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,KAAKA,IAAG,IAAI,WAAW,CAAC,EAAE;AACxC;AAAA,EACF;AAEA,QAAM,UAAU,cAAc,gBAAgB,SAAS,KAAK;AAG5D,QAAM,SAAS,YAAQ,WAAW,SAAS;AAC3C,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,sBAAsB,SAAS,EAAE;AAC9C;AAAA,EACF;AAGA,QAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAE5C,QAAM,eAAe,iBAAiB,SAAS;AAC/C,MAAI,cAAc;AAChB,YAAQ,KAAK,yCAAyC;AACtD,gBAAQ,WAAW,SAAS;AAC5B,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,EAC7C;AAGA,QAAM,WAAW,mBAAmB,EAAE,KAAK,WAAW,OAAO,EAAE,CAAC,EAAE,CAAC;AACnE,MAAI,aAAa;AACjB,MAAI,UAAU;AACZ,iBAAa;AAAA,IAAOA,IAAG,IAAI,SAAS,CAAC,IAAI,cAAc,SAAS,OAAO,CAAC;AAAA,EAC1E;AAEA,UAAQ,QAAQ,GAAG,IAAI,WAAW,UAAU,EAAE;AAChD;AAIA,eAAe,WAAWC,OAA+B;AACvD,QAAM,SAASA,MAAK,CAAC;AACrB,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,YAAY,4BAA4B,+DAA+D,CAAC;AACtH,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAaA,MAAK,QAAQ,SAAS;AACzC,QAAM,QAAQ,eAAe,KAAK,SAASA,MAAK,aAAa,CAAC,GAAI,EAAE,IAAI;AACxE,QAAM,aAAaA,MAAK,SAAS,IAAI,KAAKA,MAAK,SAAS,UAAU;AAGlE,MAAI;AACJ,MAAI;AACJ,QAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,MAAI,CAAC,MAAM,GAAG,KAAK,OAAO,GAAG,MAAM,QAAQ;AACzC,gBAAY;AACZ,kBAAc,OAAO,GAAG;AAAA,EAC1B,OAAO;AACL,UAAM,YAAY,mBAAmB,EAAE,MAAM,QAAQ,UAAU,MAAM,OAAO,EAAE,CAAC;AAC/E,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,MAAM,YAAY,qBAAqB,wBAAwB,MAAM,GAAG,CAAC;AACjF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,gBAAY,UAAU,CAAC,EAAG;AAC1B,kBAAc,GAAG,UAAU,CAAC,EAAG,IAAI,SAAS,SAAS;AAAA,EACvD;AAEA,QAAM,UAAU,cAAc,qBAAqB,WAAW,KAAK;AAEnE,MAAI;AAEF,QAAI,WAAqB,CAAC;AAE1B,QAAI;AACF,YAAM,EAAE,UAAAK,UAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,YAAM,SAASA;AAAA,QACb,4BAA4B,KAAK,SAAS,SAAS,2BAA2B,KAAK,UAAU,SAAS;AAAA,QACtG,EAAE,UAAU,SAAS,SAAS,IAAK;AAAA,MACrC;AACA,iBAAW,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,IACrD,QAAQ;AACN,iBAAW,CAAC,KAAKN,IAAG,IAAI,6DAAwD,CAAC,EAAE;AAAA,IACrF;AAEA,YAAQ,KAAK;AACb,YAAQ,OAAO,MAAM,UAAU;AAE/B,YAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAIA,IAAG,KAAK,MAAM,CAAC,IAAI,cAAc,WAAW,CAAC,IAAIA,IAAG,IAAI,SAAS,KAAK,SAAS,CAAC;AAAA,CAAI;AAExH,eAAW,QAAQ,SAAS,MAAM,CAAC,KAAK,GAAG;AACzC,YAAM,UAAU,KAAK,SAAS,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,WAAM;AAC/D,UAAI,KAAK,YAAY,EAAE,SAAS,OAAO,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AAC/E,gBAAQ,MAAM,KAAKA,IAAG,IAAI,OAAO,CAAC,EAAE;AAAA,MACtC,WAAW,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AAC9C,gBAAQ,MAAM,KAAKA,IAAG,OAAO,OAAO,CAAC,EAAE;AAAA,MACzC,OAAO;AACL,gBAAQ,MAAM,KAAK,OAAO,EAAE;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,YAAY;AACd,cAAQ,MAAM;AAAA,IAAOA,IAAG,IAAI,+BAA+B,CAAC;AAAA,CAAI;AAChE,YAAM,IAAI,QAAQ,MAAM;AAAA,MAAC,CAAC;AAAA,IAC5B;AAEA,YAAQ,MAAM;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,KAAK,4BAA4B,WAAW,EAAE;AACtD,YAAQ,MAAM,YAAY,oBAAoB,OAAO,KAAK,CAAC,CAAC;AAAA,EAC9D;AACF;AAIA,eAAe,cAAcC,OAA+B;AAC1D,QAAM,OAAO,SAASA,MAAK,CAAC,GAAI,EAAE;AAClC,MAAI,MAAM,IAAI,GAAG;AACf,YAAQ,MAAM,YAAY,gBAAgB,2CAA2C,CAAC;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAYA,MAAK,QAAQ,QAAQ;AACvC,QAAM,UAAU,cAAc,KAAKA,MAAK,YAAY,CAAC,IAAI;AACzD,QAAM,OAAO,WAAW,QAAQ,IAAI;AAEpC,QAAM,UAAU,cAAc,iBAAiB,IAAI,KAAK;AAExD,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,yBAAyB;AAC/D,UAAM,WAAW,IAAI,aAAa;AAClC,UAAM,OAAO,SAAS,aAAa,IAAI;AAEvC,QAAI,MAAM;AACR,cAAQ,QAAQ,gBAAgB,IAAI,EAAE;AACtC,cAAQ,MAAM,KAAK,SAAS,QAAQ,cAAc,IAAI,CAAC,CAAC,EAAE;AAC1D,cAAQ,MAAM,KAAK,SAAS,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,EAAE;AACtD,cAAQ,MAAM,KAAK,SAAS,WAAW,KAAK,WAAWD,IAAG,IAAI,SAAS,CAAC,CAAC,EAAE;AAAA,IAC7E,OAAO;AACL,cAAQ,KAAK,4BAA4B,IAAI,EAAE;AAC/C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB,IAAI,EAAE;AAC3C,YAAQ,MAAM,YAAY,SAAS,OAAO,KAAK,CAAC,CAAC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,eAAe,kBAAiC;AAC9C,QAAM,QAAQ,IAAI,aAAa,oBAAoB;AACnD,QAAM,WAAW,MAAM,KAAK;AAE5B,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,MAAM;AAAA,IAAOA,IAAG,IAAI,0BAA0B,CAAC;AAAA,CAAI;AAC3D;AAAA,EACF;AAEA,QAAM,UAAoB;AAAA,IACxB,EAAE,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAAC,MAAMA,IAAG,KAAK,OAAO,CAAC,CAAC,EAAE;AAAA,IAChE,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,IACjC,EAAE,KAAK,WAAW,OAAO,SAAS,QAAQ,CAAC,MAAMA,IAAG,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,EACrE;AAEA,QAAM,OAAc,SAAS,IAAI,CAAC,OAAO;AAAA,IACvC,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,SAAS,IAAI,KAAK,EAAE,OAAO,EAAE,eAAe;AAAA,EAC9C,EAAE;AAEF,UAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAIA,IAAG,KAAK,gBAAgB,CAAC;AAAA,CAAI;AACjE,UAAQ,MAAM,YAAY,SAAS,IAAI,CAAC;AACxC,UAAQ,MAAM,KAAKA,IAAG,IAAI,GAAG,SAAS,MAAM,aAAa,CAAC;AAAA,CAAI;AAChE;AAIA,eAAe,eAA8B;AAC3C,UAAQ,MAAM;AAAA,IAAO,QAAQ,GAAG,IAAIA,IAAG,KAAK,cAAc,CAAC;AAAA,CAAI;AAE/D,QAAM,YAAY,MAAM,aAAa,mCAAmC;AAAA,IACtE,EAAE,OAAO,UAAU,OAAO,kBAAkB,aAAa,6BAA6B;AAAA,IACtF,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,yBAAyB;AAAA,IAC1E,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,qBAAqB;AAAA,IACpE,EAAE,OAAO,SAAS,OAAO,oBAAoB,aAAa,4BAA4B;AAAA,EACxF,CAAC;AAED,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,KAAKA,IAAG,IAAI,kBAAkB,CAAC;AAAA,CAAI;AACjD;AAAA,EACF;AAEA,UAAQ,MAAM;AAAA,IAAOA,IAAG,MAAM,QAAG,CAAC,cAAcA,IAAG,KAAK,SAAS,CAAC;AAAA,CAAI;AAEtE,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB,UAAQ,MAAM,KAAKA,IAAG,KAAK,qCAAqC,CAAC;AAAA,CAAI;AACrE,UAAQ,MAAM,KAAKA,IAAG,IAAI,KAAK,CAAC,EAAE;AAClC,UAAQ,MAAM,cAAc,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AACvE,UAAQ,MAAM,KAAKA,IAAG,IAAI,KAAK,CAAC;AAAA,CAAI;AACpC,UAAQ,MAAM,KAAK,cAAc,iBAAiB,CAAC,IAAIA,IAAG,IAAI,KAAK,CAAC,IAAI,cAAc,cAAc,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC;AAAA,CAAI;AAClI;AAIA,eAAe,yBAAwC;AACrD,UAAQ,MAAM;AAAA,IAAOA,IAAG,KAAK,4BAA4B,CAAC;AAAA,CAAI;AAE9D,QAAM,UAAU,cAAc,wBAAwB;AAEtD,MAAI;AACF,IAAAM,UAAS,mCAAmC;AAAA,MAC1C,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AACD,YAAQ,QAAQ,iCAAiC;AAAA,EACnD,QAAQ;AACN,YAAQ,KAAK,4BAA4B;AACzC,YAAQ,MAAM,KAAKN,IAAG,OAAO,QAAG,CAAC,iBAAiB,cAAc,iCAAiC,CAAC,EAAE;AAAA,EACtG;AAEA,UAAQ,MAAM;AAAA,IAAOA,IAAG,MAAM,QAAG,CAAC;AAAA,CAAmC;AACvE;AAIA,eAAe,cAA6B;AAC1C,UAAQ,MAAM;AAAA,IAAOA,IAAG,KAAK,iCAAiC,CAAC;AAAA,CAAI;AAEnE,QAAM,aAAaH,SAAQ,sBAAsB;AAEjD,MAAIC,YAAW,UAAU,GAAG;AAC1B,UAAM,YAAY,MAAM;AAAA,MACtB,GAAGE,IAAG,OAAO,oBAAoB,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,KAAKA,IAAG,IAAI,YAAY,CAAC;AAAA,CAAI;AAC3C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,cAAc,6BAA6B;AAE3D,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ef,gBAAc,YAAY,QAAQ,OAAO;AAEzC,UAAQ,QAAQ,4BAA4BA,IAAG,KAAK,UAAU,CAAC,EAAE;AACjE,UAAQ,MAAM;AAAA,IAAOA,IAAG,IAAI,6CAA6C,CAAC;AAAA,CAAI;AAChF;AAIA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,YAAY,eAAe,OAAO,KAAK,CAAC,CAAC;AACvD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["existsSync","readFileSync","resolve","execSync","pc","pc","fennecOrange","pc","args","args","args","args","pc","fennecOrange","pc","pc","num","resolve","fennecOrange","existsSync","command","resolve","existsSync","readFileSync","pc","args","columns","rows","confirmed","spinner","execSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumpslabs/fennec-cli",
3
- "version": "1.11.1",
3
+ "version": "1.11.2",
4
4
  "description": "Fennec CLI — pipe, attach, watch, and start the Fennec MCP server",
5
5
  "keywords": [
6
6
  "mcp",
@@ -39,7 +39,7 @@
39
39
  ],
40
40
  "dependencies": {
41
41
  "picocolors": "^1.1.1",
42
- "@plumpslabs/fennec-core": "1.11.1"
42
+ "@plumpslabs/fennec-core": "1.11.2"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "playwright": "^1.42.0"