@plumpslabs/fennec-cli 1.14.1 → 1.14.3
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/README.md +59 -7
- package/dist/index.js +771 -203
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/debug.js","../../../node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js","../../../node_modules/.pnpm/strip-ansi@6.0.1/node_modules/strip-ansi/index.js","../../../node_modules/.pnpm/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js","../../../node_modules/.pnpm/emoji-regex@8.0.0/node_modules/emoji-regex/index.js","../../../node_modules/.pnpm/string-width@4.2.3/node_modules/string-width/index.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/utils.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/styles.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/has-flag.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/supports-colors.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/trap.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/zalgo.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/america.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/zebra.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/rainbow.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/random.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/colors.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/safe.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/cell.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/layout-manager.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/table.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/index.js","../src/utils/format.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/commands/start.ts","../src/commands/tracker.ts","../src/utils/system-process.ts","../src/commands/supervisor.ts","../src/commands/persist.ts","../src/commands/ps.ts","../src/commands/kill.ts","../src/commands/stop.ts","../src/commands/spawn.ts","../src/commands/restart.ts","../src/commands/adopt.ts","../src/commands/inspect.ts","../src/utils/redact.ts","../src/commands/dev.ts","../src/commands/log.ts","../src/commands/attach.ts","../src/commands/sessions.ts","../src/commands/setup.ts","../src/commands/management.ts","../src/commands/health.ts","../src/commands/cleanup.ts","../src/commands/info.ts","../src/commands/rename.ts","../src/commands/export-import.ts","../src/index.ts"],"sourcesContent":["let messages = [];\nlet level = 0;\n\nconst debug = (msg, min) => {\n if (level >= min) {\n messages.push(msg);\n }\n};\n\ndebug.WARN = 1;\ndebug.INFO = 2;\ndebug.DEBUG = 3;\n\ndebug.reset = () => {\n messages = [];\n};\n\ndebug.setDebugLevel = (v) => {\n level = v;\n};\n\ndebug.warn = (msg) => debug(msg, debug.WARN);\ndebug.info = (msg) => debug(msg, debug.INFO);\ndebug.debug = (msg) => debug(msg, debug.DEBUG);\n\ndebug.debugMessages = () => messages;\n\nmodule.exports = debug;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","const stringWidth = require('string-width');\n\nfunction codeRegex(capture) {\n return capture ? /\\u001b\\[((?:\\d*;){0,5}\\d*)m/g : /\\u001b\\[(?:\\d*;){0,5}\\d*m/g;\n}\n\nfunction strlen(str) {\n let code = codeRegex();\n let stripped = ('' + str).replace(code, '');\n let split = stripped.split('\\n');\n return split.reduce(function (memo, s) {\n return stringWidth(s) > memo ? stringWidth(s) : memo;\n }, 0);\n}\n\nfunction repeat(str, times) {\n return Array(times + 1).join(str);\n}\n\nfunction pad(str, len, pad, dir) {\n let length = strlen(str);\n if (len + 1 >= length) {\n let padlen = len - length;\n switch (dir) {\n case 'right': {\n str = repeat(pad, padlen) + str;\n break;\n }\n case 'center': {\n let right = Math.ceil(padlen / 2);\n let left = padlen - right;\n str = repeat(pad, left) + str + repeat(pad, right);\n break;\n }\n default: {\n str = str + repeat(pad, padlen);\n break;\n }\n }\n }\n return str;\n}\n\nlet codeCache = {};\n\nfunction addToCodeCache(name, on, off) {\n on = '\\u001b[' + on + 'm';\n off = '\\u001b[' + off + 'm';\n codeCache[on] = { set: name, to: true };\n codeCache[off] = { set: name, to: false };\n codeCache[name] = { on: on, off: off };\n}\n\n//https://github.com/Marak/colors.js/blob/master/lib/styles.js\naddToCodeCache('bold', 1, 22);\naddToCodeCache('italics', 3, 23);\naddToCodeCache('underline', 4, 24);\naddToCodeCache('inverse', 7, 27);\naddToCodeCache('strikethrough', 9, 29);\n\nfunction updateState(state, controlChars) {\n let controlCode = controlChars[1] ? parseInt(controlChars[1].split(';')[0]) : 0;\n if ((controlCode >= 30 && controlCode <= 39) || (controlCode >= 90 && controlCode <= 97)) {\n state.lastForegroundAdded = controlChars[0];\n return;\n }\n if ((controlCode >= 40 && controlCode <= 49) || (controlCode >= 100 && controlCode <= 107)) {\n state.lastBackgroundAdded = controlChars[0];\n return;\n }\n if (controlCode === 0) {\n for (let i in state) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(state, i)) {\n delete state[i];\n }\n }\n return;\n }\n let info = codeCache[controlChars[0]];\n if (info) {\n state[info.set] = info.to;\n }\n}\n\nfunction readState(line) {\n let code = codeRegex(true);\n let controlChars = code.exec(line);\n let state = {};\n while (controlChars !== null) {\n updateState(state, controlChars);\n controlChars = code.exec(line);\n }\n return state;\n}\n\nfunction unwindState(state, ret) {\n let lastBackgroundAdded = state.lastBackgroundAdded;\n let lastForegroundAdded = state.lastForegroundAdded;\n\n delete state.lastBackgroundAdded;\n delete state.lastForegroundAdded;\n\n Object.keys(state).forEach(function (key) {\n if (state[key]) {\n ret += codeCache[key].off;\n }\n });\n\n if (lastBackgroundAdded && lastBackgroundAdded != '\\u001b[49m') {\n ret += '\\u001b[49m';\n }\n if (lastForegroundAdded && lastForegroundAdded != '\\u001b[39m') {\n ret += '\\u001b[39m';\n }\n\n return ret;\n}\n\nfunction rewindState(state, ret) {\n let lastBackgroundAdded = state.lastBackgroundAdded;\n let lastForegroundAdded = state.lastForegroundAdded;\n\n delete state.lastBackgroundAdded;\n delete state.lastForegroundAdded;\n\n Object.keys(state).forEach(function (key) {\n if (state[key]) {\n ret = codeCache[key].on + ret;\n }\n });\n\n if (lastBackgroundAdded && lastBackgroundAdded != '\\u001b[49m') {\n ret = lastBackgroundAdded + ret;\n }\n if (lastForegroundAdded && lastForegroundAdded != '\\u001b[39m') {\n ret = lastForegroundAdded + ret;\n }\n\n return ret;\n}\n\nfunction truncateWidth(str, desiredLength) {\n if (str.length === strlen(str)) {\n return str.substr(0, desiredLength);\n }\n\n while (strlen(str) > desiredLength) {\n str = str.slice(0, -1);\n }\n\n return str;\n}\n\nfunction truncateWidthWithAnsi(str, desiredLength) {\n let code = codeRegex(true);\n let split = str.split(codeRegex());\n let splitIndex = 0;\n let retLen = 0;\n let ret = '';\n let myArray;\n let state = {};\n\n while (retLen < desiredLength) {\n myArray = code.exec(str);\n let toAdd = split[splitIndex];\n splitIndex++;\n if (retLen + strlen(toAdd) > desiredLength) {\n toAdd = truncateWidth(toAdd, desiredLength - retLen);\n }\n ret += toAdd;\n retLen += strlen(toAdd);\n\n if (retLen < desiredLength) {\n if (!myArray) {\n break;\n } // full-width chars may cause a whitespace which cannot be filled\n ret += myArray[0];\n updateState(state, myArray);\n }\n }\n\n return unwindState(state, ret);\n}\n\nfunction truncate(str, desiredLength, truncateChar) {\n truncateChar = truncateChar || '…';\n let lengthOfStr = strlen(str);\n if (lengthOfStr <= desiredLength) {\n return str;\n }\n desiredLength -= strlen(truncateChar);\n\n let ret = truncateWidthWithAnsi(str, desiredLength);\n\n ret += truncateChar;\n\n const hrefTag = '\\x1B]8;;\\x07';\n\n if (str.includes(hrefTag) && !ret.includes(hrefTag)) {\n ret += hrefTag;\n }\n\n return ret;\n}\n\nfunction defaultOptions() {\n return {\n chars: {\n top: '─',\n 'top-mid': '┬',\n 'top-left': '┌',\n 'top-right': '┐',\n bottom: '─',\n 'bottom-mid': '┴',\n 'bottom-left': '└',\n 'bottom-right': '┘',\n left: '│',\n 'left-mid': '├',\n mid: '─',\n 'mid-mid': '┼',\n right: '│',\n 'right-mid': '┤',\n middle: '│',\n },\n truncate: '…',\n colWidths: [],\n rowHeights: [],\n colAligns: [],\n rowAligns: [],\n style: {\n 'padding-left': 1,\n 'padding-right': 1,\n head: ['red'],\n border: ['grey'],\n compact: false,\n },\n head: [],\n };\n}\n\nfunction mergeOptions(options, defaults) {\n options = options || {};\n defaults = defaults || defaultOptions();\n let ret = Object.assign({}, defaults, options);\n ret.chars = Object.assign({}, defaults.chars, options.chars);\n ret.style = Object.assign({}, defaults.style, options.style);\n return ret;\n}\n\n// Wrap on word boundary\nfunction wordWrap(maxLength, input) {\n let lines = [];\n let split = input.split(/(\\s+)/g);\n let line = [];\n let lineLength = 0;\n let whitespace;\n for (let i = 0; i < split.length; i += 2) {\n let word = split[i];\n let newLength = lineLength + strlen(word);\n if (lineLength > 0 && whitespace) {\n newLength += whitespace.length;\n }\n if (newLength > maxLength) {\n if (lineLength !== 0) {\n lines.push(line.join(''));\n }\n line = [word];\n lineLength = strlen(word);\n } else {\n line.push(whitespace || '', word);\n lineLength = newLength;\n }\n whitespace = split[i + 1];\n }\n if (lineLength) {\n lines.push(line.join(''));\n }\n return lines;\n}\n\n// Wrap text (ignoring word boundaries)\nfunction textWrap(maxLength, input) {\n let lines = [];\n let line = '';\n function pushLine(str, ws) {\n if (line.length && ws) line += ws;\n line += str;\n while (line.length > maxLength) {\n lines.push(line.slice(0, maxLength));\n line = line.slice(maxLength);\n }\n }\n let split = input.split(/(\\s+)/g);\n for (let i = 0; i < split.length; i += 2) {\n pushLine(split[i], i && split[i - 1]);\n }\n if (line.length) lines.push(line);\n return lines;\n}\n\nfunction multiLineWordWrap(maxLength, input, wrapOnWordBoundary = true) {\n let output = [];\n input = input.split('\\n');\n const handler = wrapOnWordBoundary ? wordWrap : textWrap;\n for (let i = 0; i < input.length; i++) {\n output.push.apply(output, handler(maxLength, input[i]));\n }\n return output;\n}\n\nfunction colorizeLines(input) {\n let state = {};\n let output = [];\n for (let i = 0; i < input.length; i++) {\n let line = rewindState(state, input[i]);\n state = readState(line);\n let temp = Object.assign({}, state);\n output.push(unwindState(temp, line));\n }\n return output;\n}\n\n/**\n * Credit: Matheus Sampaio https://github.com/matheussampaio\n */\nfunction hyperlink(url, text) {\n const OSC = '\\u001B]';\n const BEL = '\\u0007';\n const SEP = ';';\n\n return [OSC, '8', SEP, SEP, url || text, BEL, text, OSC, '8', SEP, SEP, BEL].join('');\n}\n\nmodule.exports = {\n strlen: strlen,\n repeat: repeat,\n pad: pad,\n truncate: truncate,\n mergeOptions: mergeOptions,\n wordWrap: multiLineWordWrap,\n colorizeLines: colorizeLines,\n hyperlink,\n};\n","/*\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\nvar styles = {};\nmodule['exports'] = styles;\n\nvar codes = {\n reset: [0, 0],\n\n bold: [1, 22],\n dim: [2, 22],\n italic: [3, 23],\n underline: [4, 24],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n gray: [90, 39],\n grey: [90, 39],\n\n brightRed: [91, 39],\n brightGreen: [92, 39],\n brightYellow: [93, 39],\n brightBlue: [94, 39],\n brightMagenta: [95, 39],\n brightCyan: [96, 39],\n brightWhite: [97, 39],\n\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49],\n bgGray: [100, 49],\n bgGrey: [100, 49],\n\n bgBrightRed: [101, 49],\n bgBrightGreen: [102, 49],\n bgBrightYellow: [103, 49],\n bgBrightBlue: [104, 49],\n bgBrightMagenta: [105, 49],\n bgBrightCyan: [106, 49],\n bgBrightWhite: [107, 49],\n\n // legacy styles for colors pre v1.0.0\n blackBG: [40, 49],\n redBG: [41, 49],\n greenBG: [42, 49],\n yellowBG: [43, 49],\n blueBG: [44, 49],\n magentaBG: [45, 49],\n cyanBG: [46, 49],\n whiteBG: [47, 49],\n\n};\n\nObject.keys(codes).forEach(function(key) {\n var val = codes[key];\n var style = styles[key] = [];\n style.open = '\\u001b[' + val[0] + 'm';\n style.close = '\\u001b[' + val[1] + 'm';\n});\n","/*\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n'use strict';\n\nmodule.exports = function(flag, argv) {\n argv = argv || process.argv;\n\n var terminatorPos = argv.indexOf('--');\n var prefix = /^-{1,2}/.test(flag) ? '' : '--';\n var pos = argv.indexOf(prefix + flag);\n\n return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);\n};\n","/*\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\n'use strict';\n\nvar os = require('os');\nvar hasFlag = require('./has-flag.js');\n\nvar env = process.env;\n\nvar forceColor = void 0;\nif (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) {\n forceColor = false;\n} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true')\n || hasFlag('color=always')) {\n forceColor = true;\n}\nif ('FORCE_COLOR' in env) {\n forceColor = env.FORCE_COLOR.length === 0\n || parseInt(env.FORCE_COLOR, 10) !== 0;\n}\n\nfunction translateLevel(level) {\n if (level === 0) {\n return false;\n }\n\n return {\n level: level,\n hasBasic: true,\n has256: level >= 2,\n has16m: level >= 3,\n };\n}\n\nfunction supportsColor(stream) {\n if (forceColor === false) {\n return 0;\n }\n\n if (hasFlag('color=16m') || hasFlag('color=full')\n || hasFlag('color=truecolor')) {\n return 3;\n }\n\n if (hasFlag('color=256')) {\n return 2;\n }\n\n if (stream && !stream.isTTY && forceColor !== true) {\n return 0;\n }\n\n var min = forceColor ? 1 : 0;\n\n if (process.platform === 'win32') {\n // Node.js 7.5.0 is the first version of Node.js to include a patch to\n // libuv that enables 256 color output on Windows. Anything earlier and it\n // won't work. However, here we target Node.js 8 at minimum as it is an LTS\n // release, and Node.js 7 is not. Windows 10 build 10586 is the first\n // Windows release that supports 256 colors. Windows 10 build 14931 is the\n // first release that supports 16m/TrueColor.\n var osRelease = os.release().split('.');\n if (Number(process.versions.node.split('.')[0]) >= 8\n && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {\n return Number(osRelease[2]) >= 14931 ? 3 : 2;\n }\n\n return 1;\n }\n\n if ('CI' in env) {\n if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) {\n return sign in env;\n }) || env.CI_NAME === 'codeship') {\n return 1;\n }\n\n return min;\n }\n\n if ('TEAMCITY_VERSION' in env) {\n return (/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0\n );\n }\n\n if ('TERM_PROGRAM' in env) {\n var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n switch (env.TERM_PROGRAM) {\n case 'iTerm.app':\n return version >= 3 ? 3 : 2;\n case 'Hyper':\n return 3;\n case 'Apple_Terminal':\n return 2;\n // No default\n }\n }\n\n if (/-256(color)?$/i.test(env.TERM)) {\n return 2;\n }\n\n if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n return 1;\n }\n\n if ('COLORTERM' in env) {\n return 1;\n }\n\n if (env.TERM === 'dumb') {\n return min;\n }\n\n return min;\n}\n\nfunction getSupportLevel(stream) {\n var level = supportsColor(stream);\n return translateLevel(level);\n}\n\nmodule.exports = {\n supportsColor: getSupportLevel,\n stdout: getSupportLevel(process.stdout),\n stderr: getSupportLevel(process.stderr),\n};\n","module['exports'] = function runTheTrap(text, options) {\n var result = '';\n text = text || 'Run the trap, drop the bass';\n text = text.split('');\n var trap = {\n a: ['\\u0040', '\\u0104', '\\u023a', '\\u0245', '\\u0394', '\\u039b', '\\u0414'],\n b: ['\\u00df', '\\u0181', '\\u0243', '\\u026e', '\\u03b2', '\\u0e3f'],\n c: ['\\u00a9', '\\u023b', '\\u03fe'],\n d: ['\\u00d0', '\\u018a', '\\u0500', '\\u0501', '\\u0502', '\\u0503'],\n e: ['\\u00cb', '\\u0115', '\\u018e', '\\u0258', '\\u03a3', '\\u03be', '\\u04bc',\n '\\u0a6c'],\n f: ['\\u04fa'],\n g: ['\\u0262'],\n h: ['\\u0126', '\\u0195', '\\u04a2', '\\u04ba', '\\u04c7', '\\u050a'],\n i: ['\\u0f0f'],\n j: ['\\u0134'],\n k: ['\\u0138', '\\u04a0', '\\u04c3', '\\u051e'],\n l: ['\\u0139'],\n m: ['\\u028d', '\\u04cd', '\\u04ce', '\\u0520', '\\u0521', '\\u0d69'],\n n: ['\\u00d1', '\\u014b', '\\u019d', '\\u0376', '\\u03a0', '\\u048a'],\n o: ['\\u00d8', '\\u00f5', '\\u00f8', '\\u01fe', '\\u0298', '\\u047a', '\\u05dd',\n '\\u06dd', '\\u0e4f'],\n p: ['\\u01f7', '\\u048e'],\n q: ['\\u09cd'],\n r: ['\\u00ae', '\\u01a6', '\\u0210', '\\u024c', '\\u0280', '\\u042f'],\n s: ['\\u00a7', '\\u03de', '\\u03df', '\\u03e8'],\n t: ['\\u0141', '\\u0166', '\\u0373'],\n u: ['\\u01b1', '\\u054d'],\n v: ['\\u05d8'],\n w: ['\\u0428', '\\u0460', '\\u047c', '\\u0d70'],\n x: ['\\u04b2', '\\u04fe', '\\u04fc', '\\u04fd'],\n y: ['\\u00a5', '\\u04b0', '\\u04cb'],\n z: ['\\u01b5', '\\u0240'],\n };\n text.forEach(function(c) {\n c = c.toLowerCase();\n var chars = trap[c] || [' '];\n var rand = Math.floor(Math.random() * chars.length);\n if (typeof trap[c] !== 'undefined') {\n result += trap[c][rand];\n } else {\n result += c;\n }\n });\n return result;\n};\n","// please no\nmodule['exports'] = function zalgo(text, options) {\n text = text || ' he is here ';\n var soul = {\n 'up': [\n '̍', '̎', '̄', '̅',\n '̿', '̑', '̆', '̐',\n '͒', '͗', '͑', '̇',\n '̈', '̊', '͂', '̓',\n '̈', '͊', '͋', '͌',\n '̃', '̂', '̌', '͐',\n '̀', '́', '̋', '̏',\n '̒', '̓', '̔', '̽',\n '̉', 'ͣ', 'ͤ', 'ͥ',\n 'ͦ', 'ͧ', 'ͨ', 'ͩ',\n 'ͪ', 'ͫ', 'ͬ', 'ͭ',\n 'ͮ', 'ͯ', '̾', '͛',\n '͆', '̚',\n ],\n 'down': [\n '̖', '̗', '̘', '̙',\n '̜', '̝', '̞', '̟',\n '̠', '̤', '̥', '̦',\n '̩', '̪', '̫', '̬',\n '̭', '̮', '̯', '̰',\n '̱', '̲', '̳', '̹',\n '̺', '̻', '̼', 'ͅ',\n '͇', '͈', '͉', '͍',\n '͎', '͓', '͔', '͕',\n '͖', '͙', '͚', '̣',\n ],\n 'mid': [\n '̕', '̛', '̀', '́',\n '͘', '̡', '̢', '̧',\n '̨', '̴', '̵', '̶',\n '͜', '͝', '͞',\n '͟', '͠', '͢', '̸',\n '̷', '͡', ' ҉',\n ],\n };\n var all = [].concat(soul.up, soul.down, soul.mid);\n\n function randomNumber(range) {\n var r = Math.floor(Math.random() * range);\n return r;\n }\n\n function isChar(character) {\n var bool = false;\n all.filter(function(i) {\n bool = (i === character);\n });\n return bool;\n }\n\n\n function heComes(text, options) {\n var result = '';\n var counts;\n var l;\n options = options || {};\n options['up'] =\n typeof options['up'] !== 'undefined' ? options['up'] : true;\n options['mid'] =\n typeof options['mid'] !== 'undefined' ? options['mid'] : true;\n options['down'] =\n typeof options['down'] !== 'undefined' ? options['down'] : true;\n options['size'] =\n typeof options['size'] !== 'undefined' ? options['size'] : 'maxi';\n text = text.split('');\n for (l in text) {\n if (isChar(l)) {\n continue;\n }\n result = result + text[l];\n counts = {'up': 0, 'down': 0, 'mid': 0};\n switch (options.size) {\n case 'mini':\n counts.up = randomNumber(8);\n counts.mid = randomNumber(2);\n counts.down = randomNumber(8);\n break;\n case 'maxi':\n counts.up = randomNumber(16) + 3;\n counts.mid = randomNumber(4) + 1;\n counts.down = randomNumber(64) + 3;\n break;\n default:\n counts.up = randomNumber(8) + 1;\n counts.mid = randomNumber(6) / 2;\n counts.down = randomNumber(8) + 1;\n break;\n }\n\n var arr = ['up', 'mid', 'down'];\n for (var d in arr) {\n var index = arr[d];\n for (var i = 0; i <= counts[index]; i++) {\n if (options[index]) {\n result = result + soul[index][randomNumber(soul[index].length)];\n }\n }\n }\n }\n return result;\n }\n // don't summon him\n return heComes(text, options);\n};\n\n","module['exports'] = function(colors) {\n return function(letter, i, exploded) {\n if (letter === ' ') return letter;\n switch (i%3) {\n case 0: return colors.red(letter);\n case 1: return colors.white(letter);\n case 2: return colors.blue(letter);\n }\n };\n};\n","module['exports'] = function(colors) {\n return function(letter, i, exploded) {\n return i % 2 === 0 ? letter : colors.inverse(letter);\n };\n};\n","module['exports'] = function(colors) {\n // RoY G BiV\n var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta'];\n return function(letter, i, exploded) {\n if (letter === ' ') {\n return letter;\n } else {\n return colors[rainbowColors[i++ % rainbowColors.length]](letter);\n }\n };\n};\n\n","module['exports'] = function(colors) {\n var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green',\n 'blue', 'white', 'cyan', 'magenta', 'brightYellow', 'brightRed',\n 'brightGreen', 'brightBlue', 'brightWhite', 'brightCyan', 'brightMagenta'];\n return function(letter, i, exploded) {\n return letter === ' ' ? letter :\n colors[\n available[Math.round(Math.random() * (available.length - 2))]\n ](letter);\n };\n};\n","/*\n\nThe MIT License (MIT)\n\nOriginal Library\n - Copyright (c) Marak Squires\n\nAdditional functionality\n - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\nvar colors = {};\nmodule['exports'] = colors;\n\ncolors.themes = {};\n\nvar util = require('util');\nvar ansiStyles = colors.styles = require('./styles');\nvar defineProps = Object.defineProperties;\nvar newLineRegex = new RegExp(/[\\r\\n]+/g);\n\ncolors.supportsColor = require('./system/supports-colors').supportsColor;\n\nif (typeof colors.enabled === 'undefined') {\n colors.enabled = colors.supportsColor() !== false;\n}\n\ncolors.enable = function() {\n colors.enabled = true;\n};\n\ncolors.disable = function() {\n colors.enabled = false;\n};\n\ncolors.stripColors = colors.strip = function(str) {\n return ('' + str).replace(/\\x1B\\[\\d+m/g, '');\n};\n\n// eslint-disable-next-line no-unused-vars\nvar stylize = colors.stylize = function stylize(str, style) {\n if (!colors.enabled) {\n return str+'';\n }\n\n var styleMap = ansiStyles[style];\n\n // Stylize should work for non-ANSI styles, too\n if (!styleMap && style in colors) {\n // Style maps like trap operate as functions on strings;\n // they don't have properties like open or close.\n return colors[style](str);\n }\n\n return styleMap.open + str + styleMap.close;\n};\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\nvar escapeStringRegexp = function(str) {\n if (typeof str !== 'string') {\n throw new TypeError('Expected a string');\n }\n return str.replace(matchOperatorsRe, '\\\\$&');\n};\n\nfunction build(_styles) {\n var builder = function builder() {\n return applyStyle.apply(builder, arguments);\n };\n builder._styles = _styles;\n // __proto__ is used because we must return a function, but there is\n // no way to create a function with a different prototype.\n builder.__proto__ = proto;\n return builder;\n}\n\nvar styles = (function() {\n var ret = {};\n ansiStyles.grey = ansiStyles.gray;\n Object.keys(ansiStyles).forEach(function(key) {\n ansiStyles[key].closeRe =\n new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n ret[key] = {\n get: function() {\n return build(this._styles.concat(key));\n },\n };\n });\n return ret;\n})();\n\nvar proto = defineProps(function colors() {}, styles);\n\nfunction applyStyle() {\n var args = Array.prototype.slice.call(arguments);\n\n var str = args.map(function(arg) {\n // Use weak equality check so we can colorize null/undefined in safe mode\n if (arg != null && arg.constructor === String) {\n return arg;\n } else {\n return util.inspect(arg);\n }\n }).join(' ');\n\n if (!colors.enabled || !str) {\n return str;\n }\n\n var newLinesPresent = str.indexOf('\\n') != -1;\n\n var nestedStyles = this._styles;\n\n var i = nestedStyles.length;\n while (i--) {\n var code = ansiStyles[nestedStyles[i]];\n str = code.open + str.replace(code.closeRe, code.open) + code.close;\n if (newLinesPresent) {\n str = str.replace(newLineRegex, function(match) {\n return code.close + match + code.open;\n });\n }\n }\n\n return str;\n}\n\ncolors.setTheme = function(theme) {\n if (typeof theme === 'string') {\n console.log('colors.setTheme now only accepts an object, not a string. ' +\n 'If you are trying to set a theme from a file, it is now your (the ' +\n 'caller\\'s) responsibility to require the file. The old syntax ' +\n 'looked like colors.setTheme(__dirname + ' +\n '\\'/../themes/generic-logging.js\\'); The new syntax looks like '+\n 'colors.setTheme(require(__dirname + ' +\n '\\'/../themes/generic-logging.js\\'));');\n return;\n }\n for (var style in theme) {\n (function(style) {\n colors[style] = function(str) {\n if (typeof theme[style] === 'object') {\n var out = str;\n for (var i in theme[style]) {\n out = colors[theme[style][i]](out);\n }\n return out;\n }\n return colors[theme[style]](str);\n };\n })(style);\n }\n};\n\nfunction init() {\n var ret = {};\n Object.keys(styles).forEach(function(name) {\n ret[name] = {\n get: function() {\n return build([name]);\n },\n };\n });\n return ret;\n}\n\nvar sequencer = function sequencer(map, str) {\n var exploded = str.split('');\n exploded = exploded.map(map);\n return exploded.join('');\n};\n\n// custom formatter methods\ncolors.trap = require('./custom/trap');\ncolors.zalgo = require('./custom/zalgo');\n\n// maps\ncolors.maps = {};\ncolors.maps.america = require('./maps/america')(colors);\ncolors.maps.zebra = require('./maps/zebra')(colors);\ncolors.maps.rainbow = require('./maps/rainbow')(colors);\ncolors.maps.random = require('./maps/random')(colors);\n\nfor (var map in colors.maps) {\n (function(map) {\n colors[map] = function(str) {\n return sequencer(colors.maps[map], str);\n };\n })(map);\n}\n\ndefineProps(colors, init());\n","//\n// Remark: Requiring this file will use the \"safe\" colors API,\n// which will not touch String.prototype.\n//\n// var colors = require('colors/safe');\n// colors.red(\"foo\")\n//\n//\nvar colors = require('./lib/colors');\nmodule['exports'] = colors;\n","const { info, debug } = require('./debug');\nconst utils = require('./utils');\n\nclass Cell {\n /**\n * A representation of a cell within the table.\n * Implementations must have `init` and `draw` methods,\n * as well as `colSpan`, `rowSpan`, `desiredHeight` and `desiredWidth` properties.\n * @param options\n * @constructor\n */\n constructor(options) {\n this.setOptions(options);\n\n /**\n * Each cell will have it's `x` and `y` values set by the `layout-manager` prior to\n * `init` being called;\n * @type {Number}\n */\n this.x = null;\n this.y = null;\n }\n\n setOptions(options) {\n if (['boolean', 'number', 'bigint', 'string'].indexOf(typeof options) !== -1) {\n options = { content: '' + options };\n }\n options = options || {};\n this.options = options;\n let content = options.content;\n if (['boolean', 'number', 'bigint', 'string'].indexOf(typeof content) !== -1) {\n this.content = String(content);\n } else if (!content) {\n this.content = this.options.href || '';\n } else {\n throw new Error('Content needs to be a primitive, got: ' + typeof content);\n }\n this.colSpan = options.colSpan || 1;\n this.rowSpan = options.rowSpan || 1;\n if (this.options.href) {\n Object.defineProperty(this, 'href', {\n get() {\n return this.options.href;\n },\n });\n }\n }\n\n mergeTableOptions(tableOptions, cells) {\n this.cells = cells;\n\n let optionsChars = this.options.chars || {};\n let tableChars = tableOptions.chars;\n let chars = (this.chars = {});\n CHAR_NAMES.forEach(function (name) {\n setOption(optionsChars, tableChars, name, chars);\n });\n\n this.truncate = this.options.truncate || tableOptions.truncate;\n\n let style = (this.options.style = this.options.style || {});\n let tableStyle = tableOptions.style;\n setOption(style, tableStyle, 'padding-left', this);\n setOption(style, tableStyle, 'padding-right', this);\n this.head = style.head || tableStyle.head;\n this.border = style.border || tableStyle.border;\n\n this.fixedWidth = tableOptions.colWidths[this.x];\n this.lines = this.computeLines(tableOptions);\n\n this.desiredWidth = utils.strlen(this.content) + this.paddingLeft + this.paddingRight;\n this.desiredHeight = this.lines.length;\n }\n\n computeLines(tableOptions) {\n const tableWordWrap = tableOptions.wordWrap || tableOptions.textWrap;\n const { wordWrap = tableWordWrap } = this.options;\n if (this.fixedWidth && wordWrap) {\n this.fixedWidth -= this.paddingLeft + this.paddingRight;\n if (this.colSpan) {\n let i = 1;\n while (i < this.colSpan) {\n this.fixedWidth += tableOptions.colWidths[this.x + i];\n i++;\n }\n }\n const { wrapOnWordBoundary: tableWrapOnWordBoundary = true } = tableOptions;\n const { wrapOnWordBoundary = tableWrapOnWordBoundary } = this.options;\n return this.wrapLines(utils.wordWrap(this.fixedWidth, this.content, wrapOnWordBoundary));\n }\n return this.wrapLines(this.content.split('\\n'));\n }\n\n wrapLines(computedLines) {\n const lines = utils.colorizeLines(computedLines);\n if (this.href) {\n return lines.map((line) => utils.hyperlink(this.href, line));\n }\n return lines;\n }\n\n /**\n * Initializes the Cells data structure.\n *\n * @param tableOptions - A fully populated set of tableOptions.\n * In addition to the standard default values, tableOptions must have fully populated the\n * `colWidths` and `rowWidths` arrays. Those arrays must have lengths equal to the number\n * of columns or rows (respectively) in this table, and each array item must be a Number.\n *\n */\n init(tableOptions) {\n let x = this.x;\n let y = this.y;\n this.widths = tableOptions.colWidths.slice(x, x + this.colSpan);\n this.heights = tableOptions.rowHeights.slice(y, y + this.rowSpan);\n this.width = this.widths.reduce(sumPlusOne, -1);\n this.height = this.heights.reduce(sumPlusOne, -1);\n\n this.hAlign = this.options.hAlign || tableOptions.colAligns[x];\n this.vAlign = this.options.vAlign || tableOptions.rowAligns[y];\n\n this.drawRight = x + this.colSpan == tableOptions.colWidths.length;\n }\n\n /**\n * Draws the given line of the cell.\n * This default implementation defers to methods `drawTop`, `drawBottom`, `drawLine` and `drawEmpty`.\n * @param lineNum - can be `top`, `bottom` or a numerical line number.\n * @param spanningCell - will be a number if being called from a RowSpanCell, and will represent how\n * many rows below it's being called from. Otherwise it's undefined.\n * @returns {String} The representation of this line.\n */\n draw(lineNum, spanningCell) {\n if (lineNum == 'top') return this.drawTop(this.drawRight);\n if (lineNum == 'bottom') return this.drawBottom(this.drawRight);\n let content = utils.truncate(this.content, 10, this.truncate);\n if (!lineNum) {\n info(`${this.y}-${this.x}: ${this.rowSpan - lineNum}x${this.colSpan} Cell ${content}`);\n } else {\n // debug(`${lineNum}-${this.x}: 1x${this.colSpan} RowSpanCell ${content}`);\n }\n let padLen = Math.max(this.height - this.lines.length, 0);\n let padTop;\n switch (this.vAlign) {\n case 'center':\n padTop = Math.ceil(padLen / 2);\n break;\n case 'bottom':\n padTop = padLen;\n break;\n default:\n padTop = 0;\n }\n if (lineNum < padTop || lineNum >= padTop + this.lines.length) {\n return this.drawEmpty(this.drawRight, spanningCell);\n }\n let forceTruncation = this.lines.length > this.height && lineNum + 1 >= this.height;\n return this.drawLine(lineNum - padTop, this.drawRight, forceTruncation, spanningCell);\n }\n\n /**\n * Renders the top line of the cell.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @returns {String}\n */\n drawTop(drawRight) {\n let content = [];\n if (this.cells) {\n //TODO: cells should always exist - some tests don't fill it in though\n this.widths.forEach(function (width, index) {\n content.push(this._topLeftChar(index));\n content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'], width));\n }, this);\n } else {\n content.push(this._topLeftChar(0));\n content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'], this.width));\n }\n if (drawRight) {\n content.push(this.chars[this.y == 0 ? 'topRight' : 'rightMid']);\n }\n return this.wrapWithStyleColors('border', content.join(''));\n }\n\n _topLeftChar(offset) {\n let x = this.x + offset;\n let leftChar;\n if (this.y == 0) {\n leftChar = x == 0 ? 'topLeft' : offset == 0 ? 'topMid' : 'top';\n } else {\n if (x == 0) {\n leftChar = 'leftMid';\n } else {\n leftChar = offset == 0 ? 'midMid' : 'bottomMid';\n if (this.cells) {\n //TODO: cells should always exist - some tests don't fill it in though\n let spanAbove = this.cells[this.y - 1][x] instanceof Cell.ColSpanCell;\n if (spanAbove) {\n leftChar = offset == 0 ? 'topMid' : 'mid';\n }\n if (offset == 0) {\n let i = 1;\n while (this.cells[this.y][x - i] instanceof Cell.ColSpanCell) {\n i++;\n }\n if (this.cells[this.y][x - i] instanceof Cell.RowSpanCell) {\n leftChar = 'leftMid';\n }\n }\n }\n }\n }\n return this.chars[leftChar];\n }\n\n wrapWithStyleColors(styleProperty, content) {\n if (this[styleProperty] && this[styleProperty].length) {\n try {\n let colors = require('@colors/colors/safe');\n for (let i = this[styleProperty].length - 1; i >= 0; i--) {\n colors = colors[this[styleProperty][i]];\n }\n return colors(content);\n } catch (e) {\n return content;\n }\n } else {\n return content;\n }\n }\n\n /**\n * Renders a line of text.\n * @param lineNum - Which line of text to render. This is not necessarily the line within the cell.\n * There may be top-padding above the first line of text.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @param forceTruncationSymbol - `true` if the rendered text should end with the truncation symbol even\n * if the text fits. This is used when the cell is vertically truncated. If `false` the text should\n * only include the truncation symbol if the text will not fit horizontally within the cell width.\n * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.\n * @returns {String}\n */\n drawLine(lineNum, drawRight, forceTruncationSymbol, spanningCell) {\n let left = this.chars[this.x == 0 ? 'left' : 'middle'];\n if (this.x && spanningCell && this.cells) {\n let cellLeft = this.cells[this.y + spanningCell][this.x - 1];\n while (cellLeft instanceof ColSpanCell) {\n cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];\n }\n if (!(cellLeft instanceof RowSpanCell)) {\n left = this.chars['rightMid'];\n }\n }\n let leftPadding = utils.repeat(' ', this.paddingLeft);\n let right = drawRight ? this.chars['right'] : '';\n let rightPadding = utils.repeat(' ', this.paddingRight);\n let line = this.lines[lineNum];\n let len = this.width - (this.paddingLeft + this.paddingRight);\n if (forceTruncationSymbol) line += this.truncate || '…';\n let content = utils.truncate(line, len, this.truncate);\n content = utils.pad(content, len, ' ', this.hAlign);\n content = leftPadding + content + rightPadding;\n return this.stylizeLine(left, content, right);\n }\n\n stylizeLine(left, content, right) {\n left = this.wrapWithStyleColors('border', left);\n right = this.wrapWithStyleColors('border', right);\n if (this.y === 0) {\n content = this.wrapWithStyleColors('head', content);\n }\n return left + content + right;\n }\n\n /**\n * Renders the bottom line of the cell.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @returns {String}\n */\n drawBottom(drawRight) {\n let left = this.chars[this.x == 0 ? 'bottomLeft' : 'bottomMid'];\n let content = utils.repeat(this.chars.bottom, this.width);\n let right = drawRight ? this.chars['bottomRight'] : '';\n return this.wrapWithStyleColors('border', left + content + right);\n }\n\n /**\n * Renders a blank line of text within the cell. Used for top and/or bottom padding.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.\n * @returns {String}\n */\n drawEmpty(drawRight, spanningCell) {\n let left = this.chars[this.x == 0 ? 'left' : 'middle'];\n if (this.x && spanningCell && this.cells) {\n let cellLeft = this.cells[this.y + spanningCell][this.x - 1];\n while (cellLeft instanceof ColSpanCell) {\n cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];\n }\n if (!(cellLeft instanceof RowSpanCell)) {\n left = this.chars['rightMid'];\n }\n }\n let right = drawRight ? this.chars['right'] : '';\n let content = utils.repeat(' ', this.width);\n return this.stylizeLine(left, content, right);\n }\n}\n\nclass ColSpanCell {\n /**\n * A Cell that doesn't do anything. It just draws empty lines.\n * Used as a placeholder in column spanning.\n * @constructor\n */\n constructor() {}\n\n draw(lineNum) {\n if (typeof lineNum === 'number') {\n debug(`${this.y}-${this.x}: 1x1 ColSpanCell`);\n }\n return '';\n }\n\n init() {}\n\n mergeTableOptions() {}\n}\n\nclass RowSpanCell {\n /**\n * A placeholder Cell for a Cell that spans multiple rows.\n * It delegates rendering to the original cell, but adds the appropriate offset.\n * @param originalCell\n * @constructor\n */\n constructor(originalCell) {\n this.originalCell = originalCell;\n }\n\n init(tableOptions) {\n let y = this.y;\n let originalY = this.originalCell.y;\n this.cellOffset = y - originalY;\n this.offset = findDimension(tableOptions.rowHeights, originalY, this.cellOffset);\n }\n\n draw(lineNum) {\n if (lineNum == 'top') {\n return this.originalCell.draw(this.offset, this.cellOffset);\n }\n if (lineNum == 'bottom') {\n return this.originalCell.draw('bottom');\n }\n debug(`${this.y}-${this.x}: 1x${this.colSpan} RowSpanCell for ${this.originalCell.content}`);\n return this.originalCell.draw(this.offset + 1 + lineNum);\n }\n\n mergeTableOptions() {}\n}\n\nfunction firstDefined(...args) {\n return args.filter((v) => v !== undefined && v !== null).shift();\n}\n\n// HELPER FUNCTIONS\nfunction setOption(objA, objB, nameB, targetObj) {\n let nameA = nameB.split('-');\n if (nameA.length > 1) {\n nameA[1] = nameA[1].charAt(0).toUpperCase() + nameA[1].substr(1);\n nameA = nameA.join('');\n targetObj[nameA] = firstDefined(objA[nameA], objA[nameB], objB[nameA], objB[nameB]);\n } else {\n targetObj[nameB] = firstDefined(objA[nameB], objB[nameB]);\n }\n}\n\nfunction findDimension(dimensionTable, startingIndex, span) {\n let ret = dimensionTable[startingIndex];\n for (let i = 1; i < span; i++) {\n ret += 1 + dimensionTable[startingIndex + i];\n }\n return ret;\n}\n\nfunction sumPlusOne(a, b) {\n return a + b + 1;\n}\n\nlet CHAR_NAMES = [\n 'top',\n 'top-mid',\n 'top-left',\n 'top-right',\n 'bottom',\n 'bottom-mid',\n 'bottom-left',\n 'bottom-right',\n 'left',\n 'left-mid',\n 'mid',\n 'mid-mid',\n 'right',\n 'right-mid',\n 'middle',\n];\n\nmodule.exports = Cell;\nmodule.exports.ColSpanCell = ColSpanCell;\nmodule.exports.RowSpanCell = RowSpanCell;\n","const { warn, debug } = require('./debug');\nconst Cell = require('./cell');\nconst { ColSpanCell, RowSpanCell } = Cell;\n\n(function () {\n function next(alloc, col) {\n if (alloc[col] > 0) {\n return next(alloc, col + 1);\n }\n return col;\n }\n\n function layoutTable(table) {\n let alloc = {};\n table.forEach(function (row, rowIndex) {\n let col = 0;\n row.forEach(function (cell) {\n cell.y = rowIndex;\n // Avoid erroneous call to next() on first row\n cell.x = rowIndex ? next(alloc, col) : col;\n const rowSpan = cell.rowSpan || 1;\n const colSpan = cell.colSpan || 1;\n if (rowSpan > 1) {\n for (let cs = 0; cs < colSpan; cs++) {\n alloc[cell.x + cs] = rowSpan;\n }\n }\n col = cell.x + colSpan;\n });\n Object.keys(alloc).forEach((idx) => {\n alloc[idx]--;\n if (alloc[idx] < 1) delete alloc[idx];\n });\n });\n }\n\n function maxWidth(table) {\n let mw = 0;\n table.forEach(function (row) {\n row.forEach(function (cell) {\n mw = Math.max(mw, cell.x + (cell.colSpan || 1));\n });\n });\n return mw;\n }\n\n function maxHeight(table) {\n return table.length;\n }\n\n function cellsConflict(cell1, cell2) {\n let yMin1 = cell1.y;\n let yMax1 = cell1.y - 1 + (cell1.rowSpan || 1);\n let yMin2 = cell2.y;\n let yMax2 = cell2.y - 1 + (cell2.rowSpan || 1);\n let yConflict = !(yMin1 > yMax2 || yMin2 > yMax1);\n\n let xMin1 = cell1.x;\n let xMax1 = cell1.x - 1 + (cell1.colSpan || 1);\n let xMin2 = cell2.x;\n let xMax2 = cell2.x - 1 + (cell2.colSpan || 1);\n let xConflict = !(xMin1 > xMax2 || xMin2 > xMax1);\n\n return yConflict && xConflict;\n }\n\n function conflictExists(rows, x, y) {\n let i_max = Math.min(rows.length - 1, y);\n let cell = { x: x, y: y };\n for (let i = 0; i <= i_max; i++) {\n let row = rows[i];\n for (let j = 0; j < row.length; j++) {\n if (cellsConflict(cell, row[j])) {\n return true;\n }\n }\n }\n return false;\n }\n\n function allBlank(rows, y, xMin, xMax) {\n for (let x = xMin; x < xMax; x++) {\n if (conflictExists(rows, x, y)) {\n return false;\n }\n }\n return true;\n }\n\n function addRowSpanCells(table) {\n table.forEach(function (row, rowIndex) {\n row.forEach(function (cell) {\n for (let i = 1; i < cell.rowSpan; i++) {\n let rowSpanCell = new RowSpanCell(cell);\n rowSpanCell.x = cell.x;\n rowSpanCell.y = cell.y + i;\n rowSpanCell.colSpan = cell.colSpan;\n insertCell(rowSpanCell, table[rowIndex + i]);\n }\n });\n });\n }\n\n function addColSpanCells(cellRows) {\n for (let rowIndex = cellRows.length - 1; rowIndex >= 0; rowIndex--) {\n let cellColumns = cellRows[rowIndex];\n for (let columnIndex = 0; columnIndex < cellColumns.length; columnIndex++) {\n let cell = cellColumns[columnIndex];\n for (let k = 1; k < cell.colSpan; k++) {\n let colSpanCell = new ColSpanCell();\n colSpanCell.x = cell.x + k;\n colSpanCell.y = cell.y;\n cellColumns.splice(columnIndex + 1, 0, colSpanCell);\n }\n }\n }\n }\n\n function insertCell(cell, row) {\n let x = 0;\n while (x < row.length && row[x].x < cell.x) {\n x++;\n }\n row.splice(x, 0, cell);\n }\n\n function fillInTable(table) {\n let h_max = maxHeight(table);\n let w_max = maxWidth(table);\n debug(`Max rows: ${h_max}; Max cols: ${w_max}`);\n for (let y = 0; y < h_max; y++) {\n for (let x = 0; x < w_max; x++) {\n if (!conflictExists(table, x, y)) {\n let opts = { x: x, y: y, colSpan: 1, rowSpan: 1 };\n x++;\n while (x < w_max && !conflictExists(table, x, y)) {\n opts.colSpan++;\n x++;\n }\n let y2 = y + 1;\n while (y2 < h_max && allBlank(table, y2, opts.x, opts.x + opts.colSpan)) {\n opts.rowSpan++;\n y2++;\n }\n let cell = new Cell(opts);\n cell.x = opts.x;\n cell.y = opts.y;\n warn(`Missing cell at ${cell.y}-${cell.x}.`);\n insertCell(cell, table[y]);\n }\n }\n }\n }\n\n function generateCells(rows) {\n return rows.map(function (row) {\n if (!Array.isArray(row)) {\n let key = Object.keys(row)[0];\n row = row[key];\n if (Array.isArray(row)) {\n row = row.slice();\n row.unshift(key);\n } else {\n row = [key, row];\n }\n }\n return row.map(function (cell) {\n return new Cell(cell);\n });\n });\n }\n\n function makeTableLayout(rows) {\n let cellRows = generateCells(rows);\n layoutTable(cellRows);\n fillInTable(cellRows);\n addRowSpanCells(cellRows);\n addColSpanCells(cellRows);\n return cellRows;\n }\n\n module.exports = {\n makeTableLayout: makeTableLayout,\n layoutTable: layoutTable,\n addRowSpanCells: addRowSpanCells,\n maxWidth: maxWidth,\n fillInTable: fillInTable,\n computeWidths: makeComputeWidths('colSpan', 'desiredWidth', 'x', 1),\n computeHeights: makeComputeWidths('rowSpan', 'desiredHeight', 'y', 1),\n };\n})();\n\nfunction makeComputeWidths(colSpan, desiredWidth, x, forcedMin) {\n return function (vals, table) {\n let result = [];\n let spanners = [];\n let auto = {};\n table.forEach(function (row) {\n row.forEach(function (cell) {\n if ((cell[colSpan] || 1) > 1) {\n spanners.push(cell);\n } else {\n result[cell[x]] = Math.max(result[cell[x]] || 0, cell[desiredWidth] || 0, forcedMin);\n }\n });\n });\n\n vals.forEach(function (val, index) {\n if (typeof val === 'number') {\n result[index] = val;\n }\n });\n\n //spanners.forEach(function(cell){\n for (let k = spanners.length - 1; k >= 0; k--) {\n let cell = spanners[k];\n let span = cell[colSpan];\n let col = cell[x];\n let existingWidth = result[col];\n let editableCols = typeof vals[col] === 'number' ? 0 : 1;\n if (typeof existingWidth === 'number') {\n for (let i = 1; i < span; i++) {\n existingWidth += 1 + result[col + i];\n if (typeof vals[col + i] !== 'number') {\n editableCols++;\n }\n }\n } else {\n existingWidth = desiredWidth === 'desiredWidth' ? cell.desiredWidth - 1 : 1;\n if (!auto[col] || auto[col] < existingWidth) {\n auto[col] = existingWidth;\n }\n }\n\n if (cell[desiredWidth] > existingWidth) {\n let i = 0;\n while (editableCols > 0 && cell[desiredWidth] > existingWidth) {\n if (typeof vals[col + i] !== 'number') {\n let dif = Math.round((cell[desiredWidth] - existingWidth) / editableCols);\n existingWidth += dif;\n result[col + i] += dif;\n editableCols--;\n }\n i++;\n }\n }\n }\n\n Object.assign(vals, result, auto);\n for (let j = 0; j < vals.length; j++) {\n vals[j] = Math.max(forcedMin, vals[j] || 0);\n }\n };\n}\n","const debug = require('./debug');\nconst utils = require('./utils');\nconst tableLayout = require('./layout-manager');\n\nclass Table extends Array {\n constructor(opts) {\n super();\n\n const options = utils.mergeOptions(opts);\n Object.defineProperty(this, 'options', {\n value: options,\n enumerable: options.debug,\n });\n\n if (options.debug) {\n switch (typeof options.debug) {\n case 'boolean':\n debug.setDebugLevel(debug.WARN);\n break;\n case 'number':\n debug.setDebugLevel(options.debug);\n break;\n case 'string':\n debug.setDebugLevel(parseInt(options.debug, 10));\n break;\n default:\n debug.setDebugLevel(debug.WARN);\n debug.warn(`Debug option is expected to be boolean, number, or string. Received a ${typeof options.debug}`);\n }\n Object.defineProperty(this, 'messages', {\n get() {\n return debug.debugMessages();\n },\n });\n }\n }\n\n toString() {\n let array = this;\n let headersPresent = this.options.head && this.options.head.length;\n if (headersPresent) {\n array = [this.options.head];\n if (this.length) {\n array.push.apply(array, this);\n }\n } else {\n this.options.style.head = [];\n }\n\n let cells = tableLayout.makeTableLayout(array);\n\n cells.forEach(function (row) {\n row.forEach(function (cell) {\n cell.mergeTableOptions(this.options, cells);\n }, this);\n }, this);\n\n tableLayout.computeWidths(this.options.colWidths, cells);\n tableLayout.computeHeights(this.options.rowHeights, cells);\n\n cells.forEach(function (row) {\n row.forEach(function (cell) {\n cell.init(this.options);\n }, this);\n }, this);\n\n let result = [];\n\n for (let rowIndex = 0; rowIndex < cells.length; rowIndex++) {\n let row = cells[rowIndex];\n let heightOfRow = this.options.rowHeights[rowIndex];\n\n if (rowIndex === 0 || !this.options.style.compact || (rowIndex == 1 && headersPresent)) {\n doDraw(row, 'top', result);\n }\n\n for (let lineNum = 0; lineNum < heightOfRow; lineNum++) {\n doDraw(row, lineNum, result);\n }\n\n if (rowIndex + 1 == cells.length) {\n doDraw(row, 'bottom', result);\n }\n }\n\n return result.join('\\n');\n }\n\n get width() {\n let str = this.toString().split('\\n');\n return str[0].length;\n }\n}\n\nTable.reset = () => debug.reset();\n\nfunction doDraw(row, lineNum, result) {\n let line = [];\n row.forEach(function (cell) {\n line.push(cell.draw(lineNum));\n });\n let str = line.join('');\n if (str.length) result.push(str);\n}\n\nmodule.exports = Table;\n","module.exports = require('./src/table');","/**\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\";\nimport CliTable3 from \"cli-table3\";\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 (cli-table3 powered) ────────────────────────\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\n if (rows.length === 0) {\n return pc.dim(\" (no data)\");\n }\n\n // Build cli-table3 instance\n const table = new CliTable3({\n head: columns.map((c) => pc.bold(c.label)),\n colAligns: columns.map((c) => c.align ?? \"left\"),\n style: {\n \"padding-left\": pad,\n \"padding-right\": pad,\n head: [], // reset default styles; our pc.bold is already applied\n border: [],\n compact: false,\n },\n chars: {\n top: \"─\", \"top-mid\": \"┬\", \"top-left\": \"┌\", \"top-right\": \"┐\",\n \"bottom\": \"─\", \"bottom-mid\": \"┴\", \"bottom-left\": \"└\", \"bottom-right\": \"┘\",\n left: \"│\", \"left-mid\": \"├\", mid: \"─\", \"mid-mid\": \"┼\",\n right: \"│\", \"right-mid\": \"┤\",\n middle: \"│\",\n },\n truncate: \"…\",\n });\n\n for (const row of rows) {\n const values = columns.map((col) => {\n const raw = row[col.key];\n return col.format ? col.format(raw) : String(raw ?? \"-\");\n });\n table.push(values);\n }\n\n const output = table.toString();\n\n // Apply dim to all border lines (head, body, foot)\n const lines = output.split(\"\\n\");\n return lines.map((l) => {\n // Only dim border chars (lines that start with box-drawing chars)\n if (l.length > 0 && (l[0] === \"┌\" || l[0] === \"│\" || l[0] === \"├\" || l[0] === \"└\" || l[0] === \"─\")) {\n // Dim the border characters but keep cell content bright\n return l.replace(/^([│├└┌┐┤┴┬─]+)/, (m) => pc.dim(m));\n }\n return l;\n }).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 * Fennec CLI Banner\n *\n * Pure-text ASCII art banner using picocolors only.\n * No external font libraries — avoids ESM/CJS interop issues\n * (cfonts uses dynamic require(\"os\") which crashes in ESM bundles).\n *\n * Falls back to a compact fox icon for non-TTY environments.\n * All picocolors-based, no additional dependencies.\n */\n\nimport pc from \"picocolors\";\n\n// ─── Hex color helper ──────────────────────────────────────────\n\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 return (s: string) => s;\n}\n\nconst fennecOrange = hexColor(\"#FF6432\");\nconst fennecGold = hexColor(\"#FFB347\");\n\n// ─── Version ────────────────────────────────────────────────────\n\nexport const VERSION = \"1.14.1\";\n\n// ─── Banner generation ──────────────────────────────────────────\n\nlet cachedBanner: string | null = null;\nlet cachedCompact: string | null = null;\n\n/**\n * Generate the full FENNEC ASCII art banner.\n * Pure-text — no external font library needed.\n * Cached after first call.\n */\nfunction generateBanner(): string {\n if (cachedBanner) return cachedBanner;\n\n const logo = [\n \"███████╗███████╗███╗ ██╗███╗ ██╗███████╗ ██████╗\",\n \"██╔════╝██╔════╝████╗ ██║████╗ ██║██╔════╝██╔════╝\",\n \"█████╗ █████╗ ██╔██╗ ██║██╔██╗ ██║█████╗ ██║ \",\n \"██╔══╝ ██╔══╝ ██║╚██╗██║██║╚██╗██║██╔══╝ ██║ \",\n \"██║ ███████╗██║ ╚████║██║ ╚████║███████╗╚██████╗\",\n \"╚═╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═══╝╚══════╝ ╚═════╝\",\n ];\n\n // Apply gradient: orange → gold\n const gradientSteps = logo.length;\n const bannerStr = logo\n .map((line, i) => {\n const ratio = i / (gradientSteps - 1);\n const color = ratio < 0.5 ? fennecOrange : fennecGold;\n return color(line);\n })\n .join(\"\\n\");\n\n const tagline = pc.dim(\"ears everywhere in your stack.\") + pc.dim(` v${VERSION}`);\n\n cachedBanner = `\\n${bannerStr}\\n ${tagline}\\n`;\n return cachedBanner;\n}\n\n/**\n * Compact banner for non-TTY or quick commands.\n */\nfunction generateCompactBanner(): string {\n if (cachedCompact) return cachedCompact;\n cachedCompact = `${pc.redBright(\" 🦊\")} ${pc.bold(\"Fennec\")} ${pc.dim(`v${VERSION}`)}`;\n return cachedCompact;\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Print the full FENNEC banner (ASCII art) to stderr.\n * Uses full logo in TTY mode, compact in non-TTY.\n */\nexport function printBanner(): void {\n if (process.stdout.isTTY) {\n console.error(generateBanner());\n } else {\n console.error(generateCompactBanner());\n }\n}\n\n/**\n * Print a mini/compact banner (fox icon + version only).\n * Suitable for quick commands like ps, status, kill.\n */\nexport function printMiniBanner(): void {\n console.error(generateCompactBanner());\n}\n\n// ─── Exports for reuse ──────────────────────────────────────────\n\nexport const FOX = generateBanner();\nexport const FOX_COMPACT = generateCompactBanner();\n","import pc from \"picocolors\";\nimport { hexColor } from \"./banner.js\";\n\nconst fennecOrange = hexColor(\"#FF6432\");\n\n// ─── Command Registry ────────────────────────────────────────────\n// Single source of truth for CLI documentation. Powers both the full\n// `fennec help` listing and per-command `fennec <cmd> --help` output.\n\nexport interface CommandDoc {\n /** Canonical command name */\n name: string;\n /** Full usage string (without the leading `fennec `) */\n usage: string;\n /** Concise signature for the grouped list (defaults to `usage`) */\n short?: string;\n /** One-line summary shown in the grouped list */\n summary: string;\n /** Longer description shown in per-command help (optional) */\n description?: string;\n /** Alternate names */\n aliases?: string[];\n /** [flag, description] pairs */\n options?: [string, string][];\n /** Example invocations (without the leading `fennec `) */\n examples?: string[];\n}\n\nexport const COMMANDS: Record<string, CommandDoc> = {\n \"start-server\": {\n name: \"start\",\n usage: \"start [options]\",\n summary: \"Start the Fennec MCP server (default when no app command is given)\",\n description: \"Boots the Fennec MCP server so AI agents can connect. Also auto-resurrects tracked apps that died since the last session.\",\n options: [\n [\"--config <path>\", \"Path to a fennec.config.yaml file\"],\n [\"--sse\", \"Use SSE (HTTP) transport instead of stdio\"],\n ],\n examples: [\"start\", \"start --sse\", \"start --config ./fennec.config.yaml\"],\n },\n start: {\n name: \"start\",\n usage: \"start <command> --name <name> [options]\",\n short: \"start <command>\",\n summary: \"Start an app as a background daemon (like)\",\n description: \"Launches <command> as a detached daemon. Its output is written directly to ~/.fennec/logs/<name>.log, so Fennec confirms the app is really running and then exits — no Ctrl+C needed.\",\n aliases: [\"run\"],\n options: [\n [\"--name <name>\", \"App name used for tracking (recommended)\"],\n [\"--port <port>\", \"Port the app listens on — Fennec waits until it accepts connections\"],\n [\"--cwd <dir>\", \"Working directory to run the command in\"],\n [\"--restart\", \"Auto-restart if it crashes or its port stops listening (detached supervisor, survives terminal close)\"],\n ],\n examples: [\n 'start \"npm run dev\" --name web --port 3000',\n \"start node server.js --name api --cwd ./backend --restart\",\n ],\n },\n run: {\n name: \"run\",\n usage: \"run <command> --name <name> [options]\",\n short: \"run <command>\",\n summary: \"Alias of `start <command>` — run an app under Fennec\",\n aliases: [\"start\"],\n options: [\n [\"--name <name>\", \"App name used for tracking (recommended)\"],\n [\"--port <port>\", \"Port the app listens on\"],\n [\"--cwd <dir>\", \"Working directory\"],\n [\"--restart\", \"Auto-restart if it crashes or its port stops listening\"],\n ],\n examples: [\"run npm start --name web --port 8080\"],\n },\n ps: {\n name: \"ps\",\n usage: \"ps [options]\",\n summary: \"List Fennec-tracked apps with live status\",\n description: \"Shows tracked apps and whether they are genuinely running (PID + command identity are verified to avoid false positives from PID reuse).\",\n options: [\n [\"--system, -a, --all\", \"Show all system processes instead of tracked apps\"],\n [\"--name <name>\", \"Filter system processes by name\"],\n [\"--sort <field>\", \"Sort by cpu | mem | pid | name (default: name)\"],\n [\"--json\", \"Output tracked apps as JSON\"],\n [\"-w, --watch\", \"Watch mode — refresh every 3s (with --system)\"],\n ],\n examples: [\"ps\", \"ps --json\", \"ps --system --sort cpu -w\"],\n },\n status: {\n name: \"status\",\n usage: \"status [name] [options]\",\n summary: \"Show system overview & top processes\",\n options: [[\"-w, --watch\", \"Watch mode — refresh every 3s\"]],\n examples: [\"status\", \"status -w\"],\n },\n log: {\n name: \"log\",\n usage: \"log <name|pid> [options]\",\n summary: \"Show (and follow) logs for a tracked app\",\n description: \"Prints the app's status (running/stopped) then its recent logs. Run without an app name to list all tracked apps to choose from. Secrets (API keys, tokens, connection strings, private keys) are redacted by default — safe to pipe to an AI assistant. Use --json for a bounded, machine-readable view (AI mode).\",\n aliases: [\"logs\"],\n options: [\n [\"--lines <n>\", \"Number of lines to show (default: 30, capped at 500)\"],\n [\"-f, --follow\", \"Follow mode — stream new log lines live (Ctrl+C to stop)\"],\n [\"--level <level>\", \"Filter by level: error | warn | info | debug\"],\n [\"--since <dur>\", \"Only show lines from the last duration (e.g. 10m, 1h, 30s)\"],\n [\"--json\", \"Machine-readable JSON (AI mode) — bounded, redacted, no ANSI\"],\n [\"--no-redact\", \"Disable secret redaction (use with care)\"],\n [\"--clear\", \"Delete the log file for this app\"],\n ],\n examples: [\"logs\", \"log web\", \"log web -f\", \"log api --level error --lines 100\"],\n },\n spawn: {\n name: \"spawn\",\n usage: \"spawn [name] [--all]\",\n summary: \"Re-spawn a stopped tracked app from its saved config\",\n description: \"Revives a previously stopped app using its saved command/args/cwd. With no name, shows an interactive list of stopped apps.\",\n options: [[\"--all, -a\", \"Re-spawn all stopped apps that have a saved command\"]],\n examples: [\"spawn\", \"spawn web\", \"spawn --all\"],\n },\n stop: {\n name: \"stop\",\n usage: \"stop <name|--all>\",\n summary: \"Stop (pause) a tracked app but keep it in the registry\",\n description: \"Sends SIGTERM but keeps the entry in tracked.json so it can be revived later with `fennec spawn`.\",\n options: [[\"--all, -a\", \"Stop all running tracked apps\"]],\n examples: [\"stop web\", \"stop --all\"],\n },\n restart: {\n name: \"restart\",\n usage: \"restart <name|pid>\",\n summary: \"Stop and re-spawn a tracked app from its saved config\",\n examples: [\"restart web\"],\n },\n kill: {\n name: \"kill\",\n usage: \"kill <pid|name|all>\",\n summary: \"Kill a Fennec-tracked process (by PID, tracked name, or all tracked)\",\n description: \"Permanently removes a tracked app (unlike `stop`, which keeps it). By NAME it only matches Fennec-tracked apps — use an explicit PID to kill a system process. Prompts before killing.\",\n options: [\n [\"--signal <sig>\", \"Signal to send (default: SIGTERM). e.g. SIGKILL, SIGINT\"],\n [\"--all, -a\", \"Kill ALL tracked apps (asks for confirmation)\"],\n [\"-y, --yes\", \"Skip the confirmation prompt\"],\n ],\n examples: [\"kill web\", \"kill 12345 --signal SIGKILL\", \"kill all -y\"],\n },\n supervisor: {\n name: \"supervisor\",\n usage: \"supervisor <start|stop|status|restart>\",\n short: \"supervisor <action>\",\n summary: \"Manage the background daemon that keeps --restart apps alive\",\n description: \"The supervisor is a detached daemon that auto-restarts apps started with --restart, even after you close the terminal. It polls every few seconds, health-checks each app's port (restarting ones that are alive but not listening) and has crash-loop backoff. `fennec start --restart` starts it automatically.\",\n options: [\n [\"start\", \"Start the supervisor daemon\"],\n [\"stop\", \"Stop the supervisor daemon\"],\n [\"status\", \"Show supervisor status and managed apps\"],\n [\"restart\", \"Restart the supervisor daemon\"],\n ],\n examples: [\"supervisor status\", \"supervisor start\", \"supervisor stop\"],\n },\n persist: {\n name: \"persist\",\n usage: \"persist <enable|disable|status>\",\n short: \"persist <action>\",\n summary: \"Make fennec survive reboots (auto-start apps after login)\",\n description: \"Installs a boot unit (systemd user service on Linux, launchd agent on macOS, a startup script on Windows) that starts the supervisor at login. The supervisor then resurrects every app started with --restart, so your whole fleet comes back after a reboot — like `startup` + `save`. `fennec start --restart` enables this automatically.\",\n options: [\n [\"enable\", \"Install the boot unit for the current user\"],\n [\"disable\", \"Remove the boot unit\"],\n [\"status\", \"Show whether boot persistence is active\"],\n ],\n examples: [\"persist enable\", \"persist status\", \"persist disable\"],\n },\n inspect: {\n name: \"inspect\",\n usage: \"inspect <name|pid> [--plain] [--tail N] [--since 10m]\",\n short: \"inspect <name|pid>\",\n summary: \"Compact, AI-safe snapshot of an app (status + logs + errors)\",\n description: \"Returns a single bounded, machine-readable (JSON) view of one app: liveness, port health, uptime, memory, recent log lines and an error scan. Output is capped (token budget), secrets are redacted by default, and the shape is stable — so an AI assistant can observe a real running app (BE, FE, worker, console, ...) cheaply and predictably. Add --plain for a short human summary.\",\n options: [\n [\"--plain\", \"Short human-readable summary instead of JSON\"],\n [\"--tail N\", \"Max recent log lines (default 40, cap 200)\"],\n [\"--since 10m|1h\", \"Only consider log lines from the last duration\"],\n ],\n examples: [\"inspect web --plain\", \"inspect web --since 10m\", \"inspect api --tail 20\"],\n },\n dev: {\n name: \"dev\",\n usage: \"dev <up|down|status> [--config fennec.config.yaml]\",\n short: \"dev <action>\",\n summary: \"Orchestrate a whole dev stack from fennec.config.yaml\",\n description: \"Declarative dev-environment orchestration. `fennec dev up` reads fennec.config.yaml, starts every app (BE/FE/DB/worker) like `fennec start --restart`, respects dependencies (waits for a dependent's port), and brings the whole stack up as one unit. Apps are supervised (auto-restart + port health-check) and boot-persistent. `fennec dev down` stops them (disabling auto-restart). `fennec dev status` shows the stack. This is the AI-friendly way to boot an entire project and then observe it with `fennec observe` / `inspect`.\",\n options: [\n [\"up\", \"Start the whole stack from fennec.config.yaml\"],\n [\"down\", \"Stop the whole stack (auto-restart disabled)\"],\n [\"status\", \"Show stack status (running/stopped, last restart cause)\"],\n [\"--config <path>\", \"Path to the config file (default: ./fennec.config.yaml)\"],\n ],\n examples: [\"dev up\", \"dev up --config ./stack.yaml\", \"dev down\", \"dev status\"],\n },\n info: {\n name: \"info\",\n usage: \"info <name>\",\n summary: \"Show detailed info for a tracked app\",\n examples: [\"info web\"],\n },\n rename: {\n name: \"rename\",\n usage: \"rename <old-name> <new-name>\",\n summary: \"Rename a tracked app\",\n examples: [\"rename web frontend\"],\n },\n attach: {\n name: \"attach\",\n usage: \"attach <port> --name <name>\",\n short: \"attach <port>\",\n summary: \"Observe a running process by the port it listens on\",\n options: [[\"--name <name>\", \"Name to track the observed process under\"]],\n examples: [\"attach 3000 --name web\"],\n },\n \"attach-pid\": {\n name: \"attach-pid\",\n usage: \"attach-pid <pid>\",\n summary: \"Attach to and observe a process by its PID\",\n examples: [\"attach-pid 12345\"],\n },\n \"attach-port\": {\n name: \"attach-port\",\n usage: \"attach-port <port>\",\n summary: \"Attach to and observe a process by its port\",\n examples: [\"attach-port 8080\"],\n },\n pipe: {\n name: \"pipe\",\n usage: \"pipe --name <name>\",\n summary: \"Pipe stdin into a Fennec log watcher\",\n options: [[\"--name <name>\", \"Watcher name (required)\"]],\n examples: [\"npm run dev | fennec pipe --name web\"],\n },\n watch: {\n name: \"watch\",\n usage: \"watch --file <path> [--name <name>]\",\n short: \"watch --file <path>\",\n summary: \"Watch an existing log file\",\n options: [\n [\"--file <path>\", \"Path to the log file (required)\"],\n [\"--name <name>\", \"Watcher name\"],\n ],\n examples: [\"watch --file ./app.log --name web\"],\n },\n export: {\n name: \"export\",\n usage: \"export --file <path>\",\n summary: \"Export tracked apps to a file\",\n options: [[\"--file <path>\", \"Destination file path (required)\"]],\n examples: [\"export --file ./fennec-apps.json\"],\n },\n import: {\n name: \"import\",\n usage: \"import <file>\",\n summary: \"Import tracked apps from a file\",\n examples: [\"import ./fennec-apps.json\"],\n },\n cleanup: {\n name: \"cleanup\",\n usage: \"cleanup\",\n summary: \"Remove dead/stale entries from the tracked registry\",\n examples: [\"cleanup\"],\n },\n init: {\n name: \"init\",\n usage: \"init\",\n summary: \"Generate a fennec.config.yaml in the current directory\",\n examples: [\"init\"],\n },\n setup: {\n name: \"setup\",\n usage: \"setup\",\n summary: \"Interactively configure your MCP client for Fennec\",\n examples: [\"setup\"],\n },\n \"install-browsers\": {\n name: \"install-browsers\",\n usage: \"install-browsers\",\n summary: \"Install Playwright browser engines\",\n examples: [\"install-browsers\"],\n },\n sessions: {\n name: \"sessions\",\n usage: \"sessions\",\n summary: \"List saved browser auth sessions\",\n examples: [\"sessions\"],\n },\n health: {\n name: \"health\",\n usage: \"health\",\n summary: \"Run a health check of the Fennec environment\",\n examples: [\"health\"],\n },\n help: {\n name: \"help\",\n usage: \"help [command]\",\n summary: \"Show this help, or detailed help for a command\",\n examples: [\"help\", \"help start\", \"start --help\"],\n },\n version: {\n name: \"version\",\n usage: \"version\",\n summary: \"Show the installed Fennec version\",\n examples: [\"version\"],\n },\n};\n\n// Map any alias/lookup key to a canonical registry key.\nconst LOOKUP: Record<string, string> = {\n logs: \"log\",\n \"-v\": \"version\",\n \"--version\": \"version\",\n \"-h\": \"help\",\n \"--help\": \"help\",\n};\n\n/** Resolve a user-typed command to a CommandDoc (handles aliases). */\nexport function findCommandDoc(cmd: string): CommandDoc | undefined {\n if (COMMANDS[cmd]) return COMMANDS[cmd];\n const alias = LOOKUP[cmd];\n return alias ? COMMANDS[alias] : undefined;\n}\n\n// ─── Renderers ───────────────────────────────────────────────────\n\nconst GROUPS: { title: string; keys: string[] }[] = [\n { title: \"Server\", keys: [\"start-server\"] },\n { title: \"Apps & Processes\", keys: [\"start\", \"run\", \"ps\", \"status\", \"log\", \"spawn\", \"stop\", \"restart\", \"kill\", \"supervisor\", \"persist\", \"dev\", \"inspect\", \"info\", \"rename\"] },\n { title: \"Observation\", keys: [\"attach\", \"attach-pid\", \"attach-port\", \"pipe\", \"watch\"] },\n { title: \"Data\", keys: [\"export\", \"import\", \"cleanup\"] },\n { title: \"Configuration\", keys: [\"init\", \"setup\", \"install-browsers\", \"sessions\"] },\n { title: \"Other\", keys: [\"health\", \"help\", \"version\"] },\n];\n\nfunction pad(s: string, width: number): string {\n return s.length >= width ? s : s + \" \".repeat(width - s.length);\n}\n\n/** Full grouped help listing. */\nexport function showHelp(): void {\n const sep = fennecOrange(\"─\".repeat(56));\n const lines: string[] = [];\n\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Usage:\")} fennec ${pc.dim(\"<command>\")} ${pc.dim(\"[options]\")}`);\n lines.push(` ${pc.dim(\"Run\")} ${pc.cyan(\"fennec <command> --help\")} ${pc.dim(\"for details on any command.\")}`);\n\n for (const group of GROUPS) {\n lines.push(\"\");\n lines.push(` ${sep}`);\n lines.push(` ${pc.bold(group.title)}`);\n lines.push(` ${sep}`);\n lines.push(\"\");\n for (const key of group.keys) {\n const doc = COMMANDS[key];\n if (!doc) continue;\n const usageLabel = key === \"start-server\" ? \"start\" : (doc.short ?? doc.usage);\n lines.push(` ${pc.cyan(pad(usageLabel, 24))} ${pc.dim(doc.summary)}`);\n }\n }\n\n lines.push(\"\");\n lines.push(` ${pc.dim(\"─\".repeat(56))}`);\n lines.push(` ${pc.dim(\"Learn more:\")} ${pc.cyan(\"https://github.com/plumpslabs/fennec\")}`);\n lines.push(\"\");\n\n console.error(lines.join(\"\\n\"));\n}\n\n/** Detailed help for a single command. */\nexport function showCommandHelp(cmd: string): void {\n const doc = findCommandDoc(cmd);\n if (!doc) {\n console.error(`\\n ${pc.yellow(\"⚠\")} Unknown command: ${pc.bold(cmd)}`);\n console.error(` ${pc.dim(\"Run\")} ${pc.cyan(\"fennec help\")} ${pc.dim(\"to see all commands.\")}\\n`);\n return;\n }\n\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(` ${pc.bold(fennecOrange(doc.name))} ${pc.dim(\"—\")} ${doc.summary}`);\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Usage:\")} ${pc.cyan(`fennec ${doc.usage}`)}`);\n if (doc.aliases?.length) {\n lines.push(` ${pc.bold(\"Aliases:\")} ${doc.aliases.map((a) => pc.cyan(a)).join(\", \")}`);\n }\n if (doc.description) {\n lines.push(\"\");\n lines.push(` ${doc.description}`);\n }\n if (doc.options?.length) {\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Options:\")}`);\n const width = Math.max(...doc.options.map(([f]) => f.length));\n for (const [flag, desc] of doc.options) {\n lines.push(` ${pc.cyan(pad(flag, width))} ${pc.dim(desc)}`);\n }\n }\n if (doc.examples?.length) {\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Examples:\")}`);\n for (const ex of doc.examples) {\n lines.push(` ${pc.dim(\"$\")} ${fennecOrange(`fennec ${ex}`)}`);\n }\n }\n lines.push(\"\");\n console.error(lines.join(\"\\n\"));\n}\n","import { PipeWatcher } from \"@plumpslabs/fennec-core\";\n\nexport 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 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","import { PortDetector } from \"@plumpslabs/fennec-core\";\n\nexport 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 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","import { PortDetector } from \"@plumpslabs/fennec-core\";\n\nexport 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 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\";\nimport { LogWatcher } from \"@plumpslabs/fennec-core\";\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 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 * Command: start / run — Spawn a process as a detached daemon.\n * Includes auto-resurrect: on server start, re-spawns tracked processes\n * that died since last session (like resurrect).\n *\n * With --restart flag: auto-restarts the process if it crashes (watch).\n */\nimport { mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { FennecServer } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { printBanner } from \"../utils/banner.js\";\nimport { symbols, renderKV, renderAppName, renderError, divider, createSpinner } from \"../utils/format.js\";\nimport { readTracked, addTracked, removeTracked, spawnDaemon, resolveArgs, isTrackedRunning, buildSpawnEnv, logFilePathFor, adoptExternalOnPort } from \"./tracker.js\";\nimport { ensureSupervisorRunning } from \"./supervisor.js\";\nimport { ensurePersistEnabled } from \"./persist.js\";\nimport { isProcessRunning, checkPort } from \"../utils/system-process.js\";\nimport { psCommand } from \"./ps.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\n\n/** Sleep helper */\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Wait until a freshly spawned daemon is confirmed \"ready\":\n * - If a port is provided, wait until the port accepts connections.\n * - Otherwise, wait a short grace period and confirm the PID is still alive\n * (catches commands that crash immediately, e.g. \"No rule to make target\").\n */\nasync function waitForReady(\n pid: number,\n port: number | undefined,\n timeoutMs = 8000,\n): Promise<{ running: boolean; portReady: boolean }> {\n const start = Date.now();\n const graceMs = 700;\n\n while (Date.now() - start < timeoutMs) {\n if (!isProcessRunning(pid)) return { running: false, portReady: false };\n if (port !== undefined) {\n if (await checkPort(port)) return { running: true, portReady: true };\n await sleep(250);\n continue;\n }\n // No port to probe: just make sure it survives the grace window.\n if (Date.now() - start >= graceMs) return { running: true, portReady: false };\n await sleep(150);\n }\n return { running: isProcessRunning(pid), portReady: port === undefined ? false : false };\n}\n\n// Re-export from tracker for backward compat\nexport type { TrackedProcess };\n\nexport async 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 const useSse = args.includes(\"--sse\");\n\n // Set env var so ConfigLoader picks it up (overrides config file)\n if (useSse) {\n process.env.FENNEC_TRANSPORT_TYPE = \"sse\";\n }\n\n try {\n const server = new FennecServer(configPath);\n\n // Auto-resurrect: re-spawn tracked processes that died since last session\n await resurrectTracked();\n\n await server.start();\n\n if (useSse) {\n const port = server.getConfig().transport.port;\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Fennec server is running\")}`);\n console.error(` ${renderKV(\"Transport\", pc.cyan(\"SSE (HTTP)\"))}`);\n console.error(` ${renderKV(\"URL\", pc.cyan(`http://localhost:${port}/sse`))}`);\n console.error(` ${renderKV(\"MCP Config\", pc.cyan(`{ \\\"type\\\": \\\"remote\\\", \\\"url\\\": \\\"http://localhost:${port}/sse\\\" }`))}`);\n console.error(` ${renderKV(\"OpenCode\", pc.cyan(`type: remote, url: http://localhost:${port}/sse`))}`);\n console.error(`\\n ${pc.dim(\"Press Ctrl+C to stop\")}\\n`);\n } else {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Fennec server is running\")}`);\n console.error(` ${renderKV(\"Transport\", \"stdio\")}`);\n console.error(` ${renderKV(\"AI Agent\", \"Connect via MCP protocol\")}`);\n console.error(` ${renderKV(\"Tip\", pc.dim(\"For SSE mode: fennec start --sse\"))}`);\n console.error(`\\n ${pc.dim(\"Press Ctrl+C to stop\")}\\n`);\n }\n } catch (error) {\n console.error(renderError(\"Failed to start server\", String(error)));\n process.exit(1);\n }\n}\n\nexport async function startCommand(args: string[]): Promise<void> {\n printBanner();\n console.error(` ${pc.dim(\"Starting app...\")}\\n`);\n await runCommand(args);\n}\n\nexport async 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 // Always record a working directory so the app can be re-spawned from\n // ANY terminal/path later (spawn/restart/supervisor). Defaults to the\n // directory where `fennec start` was run.\n const cwd = cwdIndex !== -1 ? resolve(args[cwdIndex + 1]!) : process.cwd();\n const restartFlag = args.includes(\"--restart\");\n const jsonlFlag = args.includes(\"--jsonl\");\n\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 // Idempotent-by-port: if an EXTERNAL process is already listening on our\n // declared port (e.g. an AI agent launched it via raw bash), adopt it\n // instead of starting a duplicate that fails with EADDRINUSE.\n if (port !== undefined) {\n const adopted = adoptExternalOnPort(port, appName);\n if (adopted) {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Adopted\")} ${pc.bold(adopted.name)} ${pc.dim(`(PID ${adopted.pid}) — already listening on :${port}`)}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(`fennec log ${adopted.name}`))}`);\n console.error();\n return;\n }\n }\n\n // Duplicate Prevention\n const tracked = readTracked();\n const existing = tracked.find((t) => t.name === appName);\n if (existing && isTrackedRunning(existing)) {\n console.error();\n console.error(` ${pc.yellow(\"⚠\")} ${pc.bold(appName)} ${pc.dim(`is already running (PID: ${existing.pid})`)}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(`fennec log ${appName}`))}`);\n console.error(` ${renderKV(\"Stop\", pc.cyan(`fennec kill ${appName}`))}`);\n console.error();\n process.exit(0);\n }\n\n const logDir = dirname(logFilePathFor(appName));\n mkdirSync(logDir, { recursive: true });\n const logFilePath = logFilePathFor(appName);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Starting\")} ${renderAppName(appName)} ${pc.dim(\"(daemon)\")}\\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 if (restartFlag) console.error(` ${renderKV(\"Auto-restart\", pc.green(\"enabled\"))}`);\n console.error(` ${divider()}`);\n\n try {\n // Snapshot the environment at start time so this app keeps its\n // variables (DB URL, nvm PATH, NODE_ENV, ...) even when later\n // spawned/restarted from a different terminal or the supervisor.\n const startEnv: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (v !== undefined) startEnv[k] = v;\n }\n\n const currentChild = spawnDaemon({ cmdParts, name: appName, cwd, logFilePath, env: buildSpawnEnv(startEnv), logMode: jsonlFlag ? \"jsonl\" : \"text\" });\n\n const pid = currentChild.pid ?? 0;\n\n addTracked({\n name: appName,\n pid,\n command: cmd,\n args: cmdParts,\n port,\n cwd,\n env: startEnv,\n startedAt: new Date().toISOString(),\n autoRestart: restartFlag,\n logMode: jsonlFlag ? \"jsonl\" : \"text\",\n });\n\n console.error(` ${pc.green(\"✓\")} ${pc.bold(appName)} ${pc.dim(`started (PID: ${pid})`)}`);\n\n // Verify the app actually came up before we hand back control.\n const spinner = createSpinner(port ? `Waiting for ${appName} on port ${port}...` : `Confirming ${appName} is running...`);\n const ready = await waitForReady(pid, port);\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (!ready.running) {\n // Crashed almost immediately (bad command, missing target, etc.)\n removeTracked(appName);\n console.error(` ${pc.red(\"✗\")} ${pc.bold(appName)} ${pc.dim(\"exited immediately after start\")}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(`fennec log ${appName}`))}`);\n console.error();\n process.exit(1);\n }\n\n if (port) {\n if (ready.portReady) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(appName)} ${pc.dim(`is listening on port ${port}`)}`);\n } else {\n console.error(` ${pc.yellow(\"⚠\")} ${pc.bold(appName)} ${pc.dim(`is running but port ${port} is not accepting connections yet`)}`);\n }\n }\n\n // If --restart is set, hand crash-watching to the detached supervisor\n // daemon so it survives this terminal closing (no foreground Ctrl+C).\n if (restartFlag) {\n const supPid = ensureSupervisorRunning();\n ensurePersistEnabled();\n console.error(` ${pc.green(\"✓\")} ${pc.bold(\"Auto-restart\")} ${pc.dim(`managed by supervisor (PID ${supPid}) — survives terminal close`)}`);\n console.error(` ${renderKV(\"Supervisor\", pc.cyan(\"fennec supervisor status\"))}`);\n }\n\n // Show the process table and exit cleanly. Because the daemon logs\n // directly to its own file, we no longer hold any pipes — the event\n // loop drains and the CLI returns immediately without needing Ctrl+C.\n await psCommand([]);\n } catch (error) {\n console.error(renderError(`Failed to start ${appName}`, String(error)));\n process.exit(1);\n }\n}\n\n/**\n * like resurrect: Re-spawn tracked processes that died.\n * Called automatically during `fennec start` (server mode).\n * Reads tracked.json, checks each PID, re-spawns stopped ones.\n */\nexport async function resurrectTracked(): Promise<void> {\n const tracked = readTracked();\n if (tracked.length === 0) return;\n\n const dead = tracked.filter((t) => !isTrackedRunning(t));\n if (dead.length === 0) return;\n\n const spinner = createSpinner(`Resurrecting ${dead.length} stopped process(es)...`);\n let resurrected = 0;\n let failed = 0;\n\n for (const proc of dead) {\n // Only resurrect if the process has a command (not just a PID reference)\n if (!proc.command) {\n removeTracked(proc.name);\n continue;\n }\n\n try {\n const cmdParts = resolveArgs(proc);\n const logFilePath = logFilePathFor(proc.name);\n\n const child = spawnDaemon({ cmdParts, name: proc.name, cwd: proc.cwd, logFilePath, env: buildSpawnEnv(proc.env), logMode: proc.logMode });\n\n // Update PID in tracked.json — preserve autoRestart so the supervisor\n // keeps managing it, and carry restartCause forward.\n addTracked({\n name: proc.name,\n pid: child.pid ?? 0,\n command: proc.command,\n args: cmdParts,\n port: proc.port,\n cwd: proc.cwd,\n env: proc.env,\n startedAt: new Date().toISOString(),\n autoRestart: proc.autoRestart,\n restartCause: proc.restartCause,\n logMode: proc.logMode,\n });\n\n resurrected++;\n } catch {\n failed++;\n }\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (resurrected > 0) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(`Resurrected ${resurrected} process(es)`)}`);\n }\n if (failed > 0) {\n console.error(` ${pc.red(\"●\")} ${pc.bold(`${failed} process(es) failed to resurrect`)}`);\n }\n}\n","/**\n * Process Tracker — Shared state for managing ~/.fennec/tracked.json\n * Extracted from index.ts to be reusable across all CLI command files.\n */\nimport { existsSync, writeFileSync, readFileSync, mkdirSync, renameSync, statSync, rmSync, openSync, closeSync, writeSync } from \"node:fs\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { resolve, dirname, basename } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { isProcessRunning, getProcessCmdline, getProcessEnviron, getProcessCwd, findPidOnPort } from \"../utils/system-process.js\";\n\nexport interface TrackedProcess {\n name: string;\n pid: number;\n command: string;\n /**\n * The raw argv used to spawn the process. Preferred over `command`\n * (a display string) when re-spawning, because splitting `command`\n * on whitespace breaks arguments that contain spaces/quotes.\n */\n args?: string[];\n port?: number;\n cwd?: string;\n /**\n * Environment captured when the app was first started. Re-applied on\n * spawn/respawn so apps started in one terminal keep their variables\n * (DATABASE_URL, PATH from nvm, NODE_ENV, ...) even when later managed\n * from a different terminal or by the detached supervisor.\n */\n env?: Record<string, string>;\n startedAt: string;\n /** When true, the supervisor daemon auto-restarts this app if it dies. */\n autoRestart?: boolean;\n /** Restart-cause annotation (e.g. \"crash\", \"port-down\") set by supervisor. */\n restartCause?: string;\n /** True when the supervisor has restarted this app repeatedly in a short\n * window (crash-loop / flapping) — surfaced so users know it's unstable. */\n flapping?: boolean;\n /**\n * Log format written by spawnDaemon. \"text\" = raw app output (human\n * readable, default). \"jsonl\" = structured per-line JSON (timestamp +\n * level + source) so AI tools can query/filter reliably. Stored so\n * re-spawns keep the same format.\n */\n logMode?: \"text\" | \"jsonl\";\n /** HTTP readiness URL (resolved at spawn) — supervisor health-checks this\n * instead of a bare TCP port when present. */\n healthCheck?: string;\n}\n\n/** Marker line written to a log when the supervisor restarts an app. */\nexport const RESTART_CAUSE = \"fennec:restart\";\n\nexport function getFennecDir(): string {\n return process.env.FENNEC_DATA_DIR\n ? resolve(process.env.FENNEC_DATA_DIR)\n : resolve(homedir(), \".fennec\");\n}\n\nexport function getTrackedPath(): string {\n return resolve(getFennecDir(), \"tracked.json\");\n}\n\n/** Path to the supervisor daemon's PID file. */\nexport function getSupervisorPidPath(): string {\n return resolve(getFennecDir(), \"supervisor.pid\");\n}\n\n/** Absolute path to an app's log file (respects FENNEC_DATA_DIR). */\nexport function logFilePathFor(name: string): string {\n return resolve(getFennecDir(), \"logs\", `${name}.log`);\n}\n\nexport function 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\nexport function 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 (err) {\n console.error(\"[fennec] Failed to save tracked processes:\", err instanceof Error ? err.message : String(err));\n }\n}\n\nexport function addTracked(proc: TrackedProcess): void {\n const tracked = readTracked();\n const filtered = tracked.filter((t) => t.name !== proc.name);\n filtered.push(proc);\n saveTracked(filtered);\n}\n\nexport function removeTracked(name: string): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.name !== name));\n}\n\n/**\n * Toggle the auto-restart flag for a tracked app by name.\n * Used so an intentional `stop` isn't immediately undone by the supervisor.\n */\nexport function setAutoRestart(name: string, value: boolean): void {\n const tracked = readTracked();\n let changed = false;\n for (const t of tracked) {\n if (t.name === name) { t.autoRestart = value; changed = true; }\n }\n if (changed) saveTracked(tracked);\n}\n\nexport function removeTrackedByPid(pid: number): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.pid !== pid));\n}\n\n/**\n * Resolve the argv for a tracked process. Prefers the stored `args`\n * array (spawn-safe); falls back to whitespace-splitting `command`\n * for entries saved before `args` existed.\n */\nexport function resolveArgs(proc: Pick<TrackedProcess, \"args\" | \"command\">): string[] {\n if (proc.args && proc.args.length > 0) return proc.args;\n return proc.command.split(/\\s+/).filter(Boolean);\n}\n\n/**\n * Adopt an ALREADY-RUNNING process (started via raw bash, another tool, or a\n * previous session) into fennec's tracked registry — without restarting it.\n * This is the human-facing counterpart to the agent's `process_adopt`: it\n * stops an externally-launched server from becoming an untracked orphan (and\n * prevents `start`/`spawn` from creating a duplicate that fails with\n * EADDRINUSE). Enriches the entry from /proc when details are omitted.\n */\nexport function adoptProcess(\n pid: number,\n opts: { name?: string; port?: number; command?: string; cwd?: string; env?: Record<string, string>; autoRestart?: boolean } = {},\n): TrackedProcess | null {\n if (!isProcessRunning(pid)) return null;\n const command = opts.command ?? getProcessCmdline(pid) ?? `pid ${pid}`;\n const cwd = opts.cwd ?? getProcessCwd(pid) ?? undefined;\n const name = opts.name ?? `pid_${pid}`;\n const entry: TrackedProcess = {\n name,\n pid,\n command,\n port: opts.port,\n cwd,\n env: opts.env,\n startedAt: new Date().toISOString(),\n autoRestart: opts.autoRestart ?? true,\n flapping: false,\n };\n addTracked(entry);\n return entry;\n}\n\n/**\n * If something is ALREADY listening on `port` (e.g. an AI agent launched the\n * server via raw bash, or a previous `start` is still bound), adopt that\n * existing process instead of spawning a duplicate that would fail with\n * EADDRINUSE. Returns the adopted entry, or null if nothing is listening (or\n * the listener is already one of our tracked processes).\n */\nexport function adoptExternalOnPort(port: number, name?: string): TrackedProcess | null {\n const occ = findPidOnPort(port);\n if (!occ) return null;\n const tracked = readTracked();\n if (tracked.some((t) => t.pid === occ.pid)) return null; // already ours\n return adoptProcess(occ.pid, { port, name });\n}\n\n/**\n * Verify a tracked process is genuinely still OUR process — not just a\n * live PID. Guards against PID reuse: after a process dies the OS may\n * assign the same PID to an unrelated program, which would otherwise\n * show up as a false \"running\". We confirm the live PID's cmdline still\n * matches the executable we spawned.\n *\n * On platforms without /proc (cmdline unavailable) we can't verify, so\n * we fall back to the plain liveness check to avoid false negatives.\n */\nexport function isTrackedRunning(proc: TrackedProcess): boolean {\n if (!isProcessRunning(proc.pid)) return false;\n\n // Preferred: verify ownership via the FENNEC_APP_NAME marker we inject at\n // spawn. Robust even if the app re-execs a different binary (where cmdline\n // matching would wrongly report \"dead\"). Only treat the marker as\n // authoritative when it is PRESENT — an adopted/external process has no\n // marker, so we must fall through to the cmdline check instead of assuming\n // \"not ours\".\n const environ = getProcessEnviron(proc.pid);\n if (environ && \"FENNEC_APP_NAME\" in environ) {\n return environ.FENNEC_APP_NAME === proc.name;\n }\n\n // Fallback (non-Linux / no /proc/environ): trust cmdline basename match.\n const cmdline = getProcessCmdline(proc.pid);\n if (!cmdline) return true; // cannot verify — trust the PID\n\n const argv = resolveArgs(proc);\n const exe = argv[0];\n if (!exe) return true;\n\n // The process was spawned directly, so argv[0] should appear in the\n // live cmdline. Compare on basename to tolerate absolute-path resolution.\n const exeBase = basename(exe);\n if (exeBase.length === 0) return true;\n return cmdline.includes(exeBase);\n}\n\nexport function 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\n// ─── Log Rotation ─────────────────────────────────────────────────\n// Rotates log files when they exceed maxSize (default: 10MB).\n// Keeps up to maxFiles rotated copies (default: 3) then deletes oldest.\n\nconst DEFAULT_MAX_LOG_SIZE = 10 * 1024 * 1024; // 10MB\nconst DEFAULT_MAX_LOG_FILES = 3;\n\n/**\n * Check if a log file needs rotation and rotate if necessary.\n * Returns true if rotation was performed.\n */\nexport function rotateLogFile(\n filePath: string,\n maxSize = DEFAULT_MAX_LOG_SIZE,\n maxFiles = DEFAULT_MAX_LOG_FILES,\n): boolean {\n try {\n if (!existsSync(filePath)) return false;\n const stats = statSync(filePath);\n if (stats.size < maxSize) return false;\n\n // Rotate: .log -> .log.1 -> .log.2 -> .log.3 (delete oldest)\n const dir = dirname(filePath);\n const base = basename(filePath);\n\n // Delete oldest if exists\n const oldestPath = resolve(dir, `${base}.${maxFiles}`);\n if (existsSync(oldestPath)) {\n try { rmSync(oldestPath); } catch { /* best-effort */ }\n }\n\n // Shift existing rotations\n for (let i = maxFiles - 1; i >= 1; i--) {\n const src = resolve(dir, `${base}.${i}`);\n const dst = resolve(dir, `${base}.${i + 1}`);\n if (existsSync(src)) {\n try { renameSync(src, dst); } catch { /* best-effort */ }\n }\n }\n\n // Rotate current file\n try {\n renameSync(filePath, resolve(dir, `${base}.1`));\n } catch { /* best-effort */ }\n\n return true;\n } catch (err) {\n console.error(\"[fennec] Log rotation failed:\", err instanceof Error ? err.message : String(err));\n return false;\n }\n}\n\n// ─── Daemon Spawner ───────────────────────────────────────────────\n// Spawns a detached daemon whose stdout/stderr are redirected DIRECTLY\n// to the log file descriptor (style). This is critical: it means\n// the child writes its own logs to disk, so the launching CLI process\n// can exit immediately without killing logging — and `fennec log -f`\n// keeps receiving new lines after the launcher is gone.\n\nexport interface SpawnDaemonOptions {\n cmdParts: string[];\n /** App name — injected as FENNEC_APP_NAME so fennec can verify ownership. */\n name: string;\n cwd?: string;\n logFilePath: string;\n env?: Record<string, string>;\n /** \"jsonl\" writes structured per-line JSON (timestamp+level+source+line). */\n logMode?: \"text\" | \"jsonl\";\n}\n\n// ─── Secret redaction (AI-safe) ───────────────────────────────────\n// Mirrors the core package so daemon-written logs never hit disk with\n// raw credentials. Best-effort: keeps a hint of the shape for debugging.\n/**\n * Build the environment for a spawned app. Starts from the environment\n * captured at `start` time (so app-specific vars survive being managed\n * from another terminal/supervisor), then overlays the current process\n * environment so live system paths (PATH, HOME, TERM, ...) are current,\n * and finally pins fennec's own state dirs so the child logs/supervises\n * into the same fennec instance regardless of where it's launched.\n */\nexport function buildSpawnEnv(stored?: Record<string, string>): Record<string, string> {\n // Start from the live environment so system paths (PATH, HOME, TERM, ...)\n // stay current, then overlay the explicitly-provided (start-time/config)\n // env so those values win over anything inherited. This keeps config\n // `env: { PORT: \"47111\" }` authoritative instead of being clobbered.\n const merged: Record<string, string> = { ...process.env } as Record<string, string>;\n for (const [k, v] of Object.entries(stored ?? {})) {\n if (v !== undefined) merged[k] = v;\n }\n if (process.env.FENNEC_DATA_DIR) merged.FENNEC_DATA_DIR = process.env.FENNEC_DATA_DIR;\n if (process.env.HOME) merged.HOME = process.env.HOME;\n return merged;\n}\n\n/**\n * Spawn a detached background process that logs directly to a file.\n * The returned ChildProcess is unref'd so it won't keep the parent\n * event loop alive. The parent may still listen to its \"exit\" event\n * (e.g. for --restart watching) as long as the loop is kept alive by\n * other means.\n */\n/**\n * Respawn a tracked process quietly (no UI) and update its registry entry\n * with the new PID/args. Returns the new PID. Used by the supervisor and\n * by command-level respawns.\n */\nexport function respawnTracked(proc: TrackedProcess, cause?: string): number {\n const cmdParts = resolveArgs(proc);\n const logFilePath = logFilePathFor(proc.name);\n mkdirSync(dirname(logFilePath), { recursive: true });\n if (cause) annotateRestart(logFilePath, cause);\n // Kill the (possibly still-alive) previous instance so a \"port-down\"\n // restart doesn't leave an orphan holding the port (which would then\n // cause an EADDRINUSE cascade on the new instance).\n if (isProcessRunning(proc.pid)) {\n try { process.kill(proc.pid, \"SIGTERM\"); } catch { /* best-effort */ }\n }\n const child = spawnDaemon({\n cmdParts,\n name: proc.name,\n cwd: proc.cwd,\n logFilePath,\n env: buildSpawnEnv(proc.env),\n logMode: proc.logMode,\n });\n const pid = child.pid ?? 0;\n addTracked({\n ...proc,\n pid,\n args: cmdParts,\n startedAt: new Date().toISOString(),\n restartCause: cause,\n });\n return pid;\n}\n\n/**\n * Spawn a process as a detached daemon whose output is written straight to the\n * log file, so logs survive the launching CLI process exiting.\n *\n * - text mode: the child inherits the log file fd directly.\n * - jsonl mode: a tiny detached relay process wraps each line as structured\n * JSON ({ts,level,source,line}) and writes to the file. The relay outlives\n * the launching CLI because it is detached (otherwise the parent relay would\n * die with the CLI and lose all output).\n */\nexport function spawnDaemon(opts: SpawnDaemonOptions): ChildProcess {\n rotateLogFile(opts.logFilePath);\n // Inject a marker so fennec can verify process ownership even if the app\n // later re-execs a different binary (cmdline matching alone is fragile).\n const env = { ...(opts.env ?? buildSpawnEnv()), FENNEC_APP_NAME: opts.name };\n if (opts.logMode === \"jsonl\") {\n return spawnDaemonJsonl(opts, env);\n }\n const fd = openSync(opts.logFilePath, \"a\");\n const child = spawn(opts.cmdParts[0]!, opts.cmdParts.slice(1), {\n cwd: opts.cwd,\n env,\n stdio: [\"ignore\", fd, fd],\n detached: true,\n });\n child.unref();\n // Child now owns a dup of the fd; we can close our copy.\n child.once(\"spawn\", () => {\n try { closeSync(fd); } catch { /* best-effort */ }\n });\n return child;\n}\n\n/** jsonl variant: a detached relay reads the child's stdout+stderr and writes JSONL. */\nfunction spawnDaemonJsonl(opts: SpawnDaemonOptions, env: Record<string, string>): ChildProcess {\n const relay = spawn(\n process.execPath,\n [\"-e\", JSONL_RELAY],\n {\n env: { ...process.env, FENNEC_RELAY_LOG: opts.logFilePath },\n stdio: [\"pipe\", \"ignore\", \"ignore\"],\n detached: true,\n },\n );\n relay.unref();\n const child = spawn(opts.cmdParts[0]!, opts.cmdParts.slice(1), {\n cwd: opts.cwd,\n env,\n stdio: [\"ignore\", relay.stdin!, relay.stdin!],\n detached: true,\n });\n child.unref();\n // Release the parent's hold on the relay's stdin write-end. `spawn` dups the\n // fd into the child, so the child keeps writing; but destroying our copy\n // means the relay receives EOF (and exits) when the child dies — otherwise a\n // long-lived parent (the supervisor) would keep the pipe open forever and\n // leak relays (which also risks SIGPIPE-killing the app).\n try { relay.stdin?.destroy(); } catch { /* best-effort */ }\n // The relay flushes and exits once the child's streams close.\n return child;\n}\n\n/**\n * Self-contained JSONL relay (runs in a detached node process). Reads raw lines\n * from stdin, redacts obvious secrets, classifies level, and appends structured\n * JSON to the file named by FENNEC_RELAY_LOG.\n */\nconst JSONL_RELAY = `\nconst fs = require('fs');\nconst fd = fs.openSync(process.env.FENNEC_RELAY_LOG, 'a');\nlet buf = '';\nconst SECRET = new RegExp('(password|passwd|token|secret|api[_-]?key|access[_-]?key).{0,60}', 'gi');\nfunction redact(s){ return s.replace(SECRET, '$1***'); }\nfunction level(s){\n const t = s.toLowerCase();\n if (t.indexOf('error')>=0 || t.indexOf('fail')>=0 || t.indexOf('fatal')>=0 || t.indexOf('exception')>=0 || t.indexOf('denied')>=0 || t.indexOf('refused')>=0 || t.indexOf('cannot')>=0 || t.indexOf('panic')>=0) return 'error';\n if (t.indexOf('warn')>=0) return 'warn';\n return 'info';\n}\nfunction flush(){\n const parts = buf.split('\\\\n');\n buf = parts.pop() || '';\n for (const r of parts){\n if (!r) continue;\n const line = redact(r);\n try { fs.writeSync(fd, JSON.stringify({ ts: new Date().toISOString(), level: level(line), source: 'app', line }) + '\\\\n'); } catch (e) {}\n }\n}\nprocess.stdin.on('data', (c) => { buf += c.toString('utf8'); flush(); });\nprocess.stdin.on('end', () => { flush(); try { fs.closeSync(fd); } catch (e) {} process.exit(0); });\nprocess.stdin.on('error', () => { process.exit(0); });\n`;\n\n/** Write a restart-cause separator into the log (used by the supervisor). */\nexport function annotateRestart(logFilePath: string, cause: string): void {\n try {\n const fd = openSync(logFilePath, \"a\");\n try {\n writeSync(fd, `\\n${RESTART_CAUSE} cause=${cause} at=${new Date().toISOString()}\\n`);\n } finally {\n closeSync(fd);\n }\n } catch { /* best-effort */ }\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, readlinkSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { cpus } from \"node:os\";\nimport net from \"node:net\";\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 runTasklistProcesses(): SystemProcessInfo[] {\n try {\n const output = execSync(\"tasklist /fo csv /nh 2>nul\", { encoding: \"utf-8\", timeout: 5000 });\n const result: SystemProcessInfo[] = [];\n for (const raw of output.split(\"\\n\")) {\n if (!raw.trim()) continue;\n const parts = raw.split('\",\"').map((p) => p.replace(/^\"|\"$/g, \"\"));\n const pid = parseInt(parts[1] ?? \"\", 10);\n if (isNaN(pid)) continue;\n const image = parts[0] ?? \"\";\n const name = image.replace(/\\.[a-z0-9]+$/i, \"\");\n const memKb = parseInt((parts[4] ?? \"\").replace(/[^\\d]/g, \"\"), 10) || 0;\n result.push({\n pid,\n name,\n command: image,\n cpuPercent: 0,\n memPercent: 0,\n memRss: memKb,\n state: \"R\",\n startedAt: null,\n ports: [],\n isUserProcess: false,\n });\n }\n return result;\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 // Linux uses /proc (richest); macOS/BSD use ps; Windows uses tasklist.\n if (process.platform === \"win32\") {\n processes = runTasklistProcesses();\n } else 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 * Check if something is accepting TCP connections on a port.\n * Tries both IPv4 (127.0.0.1) and IPv6 (::1) loopback so apps that bind to\n * localhost (which often resolves to ::1, e.g. Next.js/Vite) aren't falsely\n * reported as \"not listening\". Resolves true if EITHER connects.\n */\nexport function checkPort(port: number, host: string = \"127.0.0.1\", timeout = 1000): Promise<boolean> {\n const tryHost = (h: string): Promise<boolean> =>\n new Promise((resolve) => {\n const socket = new net.Socket();\n let settled = false;\n const finish = (result: boolean) => {\n if (settled) return;\n settled = true;\n socket.destroy();\n resolve(result);\n };\n socket.setTimeout(timeout);\n socket.once(\"connect\", () => finish(true));\n socket.once(\"timeout\", () => finish(false));\n socket.once(\"error\", () => finish(false));\n socket.connect(port, h);\n });\n\n return tryHost(host).then((ok) => (ok ? true : tryHost(\"::1\")));\n}\n\n/**\n * HTTP readiness/health probe. Resolves true only on a 2xx/3xx response;\n * any network error, timeout, or 4xx/5xx resolves false (so the supervisor\n * treats the app as unhealthy and restarts it). Used when an app declares a\n * `healthCheck` URL — a stronger signal than a bare TCP port check.\n */\nexport async function checkHttp(url: string, timeout = 2000): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n const res = await fetch(url, { method: \"GET\", signal: controller.signal, redirect: \"manual\" });\n return res.status >= 200 && res.status < 400;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Resolve a `healthCheck` declaration to a concrete URL.\n * - starts with http(s):// → used verbatim\n * - starts with \"/\" → http://127.0.0.1:<port><path>\n * Returns null when the form can't be resolved (e.g. a path with no port).\n */\nexport function resolveHealthUrl(healthCheck: string, port?: number): string | null {\n if (/^https?:\\/\\//i.test(healthCheck)) return healthCheck;\n if (healthCheck.startsWith(\"/\")) {\n if (!port) return null;\n return `http://127.0.0.1:${port}${healthCheck}`;\n }\n return null;\n}\n\n/**\n * Find the PID (and command) of whatever process is LISTENING on `port`.\n * Cross-platform: Linux via /proc, macOS via `lsof`, Windows via `netstat`.\n * Returns null when nothing is listening or the platform tools are missing.\n * Used to adopt an externally-started server (e.g. one an AI agent launched\n * via raw bash) instead of spawning a duplicate that fails with EADDRINUSE.\n */\nexport function findPidOnPort(port: number): { pid: number; command: string } | null {\n if (process.platform === \"win32\") return findPidOnPortWindows(port);\n if (process.platform === \"darwin\") return findPidOnPortMac(port);\n return findPidOnPortLinux(port);\n}\n\nfunction findPidOnPortLinux(port: number): { pid: number; command: string } | null {\n try {\n const hexPort = port.toString(16).toUpperCase().padStart(4, \"0\");\n const inodes = new Set<number>();\n for (const f of [\"/proc/net/tcp\", \"/proc/net/tcp6\"]) {\n if (!existsSync(f)) continue;\n for (const line of readFileSync(f, \"utf-8\").split(\"\\n\").slice(1)) {\n const cols = line.trim().split(/\\s+/);\n if (cols.length < 10) continue;\n if (cols[3] !== \"0A\") continue; // 0A = LISTEN\n const localPort = cols[1]?.split(\":\")[1];\n const inode = parseInt(cols[9] ?? \"\", 10);\n if (localPort === hexPort && !Number.isNaN(inode)) inodes.add(inode);\n }\n }\n if (inodes.size === 0) return null;\n for (const pidStr of readdirSync(\"/proc\").filter((d) => /^\\d+$/.test(d))) {\n const pid = parseInt(pidStr, 10);\n try {\n const fdDir = `/proc/${pid}/fd`;\n for (const fd of readdirSync(fdDir)) {\n const link = readlinkSync(`${fdDir}/${fd}`);\n const m = link.match(/socket:\\[(\\d+)\\]/);\n if (m && inodes.has(parseInt(m[1]!, 10))) {\n return { pid, command: getProcessCmdline(pid) ?? \"\" };\n }\n }\n } catch { /* pid may have exited */ }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction findPidOnPortMac(port: number): { pid: number; command: string } | null {\n try {\n const out = execSync(`lsof -i :${port} -sTCP:LISTEN -P -n 2>/dev/null`, { encoding: \"utf-8\", timeout: 5000 });\n for (const line of out.split(\"\\n\")) {\n if (!line.includes(\"LISTEN\")) continue;\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 2) {\n const pid = parseInt(parts[1]!, 10);\n if (!isNaN(pid)) return { pid, command: parts[0] ?? \"\" };\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction findPidOnPortWindows(port: number): { pid: number; command: string } | null {\n try {\n const out = execSync(`netstat -ano -p tcp 2>nul`, { encoding: \"utf-8\", timeout: 5000 });\n const target = `:${port} `;\n for (const line of out.split(\"\\n\")) {\n const upper = line.toUpperCase();\n if (!upper.includes(\"LISTENING\")) continue;\n if (!upper.includes(target)) continue;\n const pid = parseInt(line.trim().split(/\\s+/).pop() ?? \"\", 10);\n if (!isNaN(pid)) return { pid, command: getProcessCmdline(pid) ?? \"\" };\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Read the full command line (argv, space-joined) of a running PID.\n * Cross-platform: Linux /proc, macOS `ps`, Windows `wmic`. Returns null when\n * unavailable — callers should treat null as \"cannot verify\", not \"mismatch\".\n */\nexport function getProcessCmdline(pid: number): string | null {\n if (process.platform === \"win32\") return getProcessCmdlineWindows(pid);\n if (process.platform === \"darwin\") return getProcessCmdlineMac(pid);\n return getProcessCmdlineLinux(pid);\n}\n\nfunction getProcessCmdlineLinux(pid: number): string | null {\n try {\n const raw = readFileSync(`/proc/${pid}/cmdline`, \"utf-8\");\n const joined = raw.split(\"\\0\").filter(Boolean).join(\" \").trim();\n return joined.length > 0 ? joined : null;\n } catch {\n return null;\n }\n}\n\nfunction getProcessCmdlineMac(pid: number): string | null {\n try {\n const out = execSync(`ps -p ${pid} -o command=`, { encoding: \"utf-8\", timeout: 3000 });\n const trimmed = out.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch {\n return null;\n }\n}\n\nfunction getProcessCmdlineWindows(pid: number): string | null {\n try {\n const out = execSync(`wmic process where ProcessId=${pid} get CommandLine /value 2>nul`, { encoding: \"utf-8\", timeout: 3000 });\n const line = out.split(\"\\n\").find((l) => l.includes(\"=\"));\n const value = line?.split(\"=\")[1]?.trim();\n return value ? value : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve a process's cwd. Linux /proc, macOS `lsof`; Windows cwd is not\n * easily available via built-ins, so it returns null there. Callers must\n * tolerate null.\n */\nexport function getProcessCwd(pid: number): string | null {\n if (process.platform === \"linux\") {\n try {\n return readlinkSync(`/proc/${pid}/cwd`) || null;\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n try {\n const out = execSync(`lsof -p ${pid} -a -d cwd -F n 2>/dev/null`, { encoding: \"utf-8\", timeout: 3000 });\n const line = out.split(\"\\n\").find((l) => l.startsWith(\"n\"));\n return line ? line.slice(1) : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Read /proc/<pid>/environ (NUL-separated KEY=VALUE pairs) of a running PID.\n * Returns null when unavailable. Used to verify a tracked process is really\n * ours via the FENNEC_APP_NAME marker we inject at spawn time — robust even\n * when the app re-execs a different binary (where cmdline matching fails).\n */\nexport function getProcessEnviron(pid: number): Record<string, string> | null {\n try {\n const raw = readFileSync(`/proc/${pid}/environ`, \"utf-8\");\n const env: Record<string, string> = {};\n for (const pair of raw.split(\"\\0\")) {\n if (!pair) continue;\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n env[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return env;\n } catch {\n return null;\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","/**\n * Command: supervisor — A detached background daemon that keeps\n * auto-restart apps alive even after the launching terminal is closed.\n *\n * Unlike the old foreground `--restart` watcher (which died when you\n * closed the terminal), the supervisor runs as its own detached process.\n * It polls tracked.json and re-spawns any app flagged `autoRestart` that\n * has died — with crash-loop backoff to avoid hammering a broken app.\n *\n * Sub-commands:\n * fennec supervisor start Start the supervisor daemon\n * fennec supervisor stop Stop it\n * fennec supervisor status Show status + managed apps\n * fennec supervisor restart Restart the daemon\n *\n * Internal:\n * fennec __supervisor The daemon loop itself (not user-facing)\n */\nimport pc from \"picocolors\";\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, openSync, closeSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { dirname } from \"node:path\";\nimport { symbols, renderError, renderKV, createSpinner } from \"../utils/format.js\";\nimport { isProcessRunning, checkPort, checkHttp, resolveHealthUrl } from \"../utils/system-process.js\";\nimport {\n readTracked,\n respawnTracked,\n addTracked,\n isTrackedRunning,\n getSupervisorPidPath,\n logFilePathFor,\n rotateLogFile,\n} from \"./tracker.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\n\nconst POLL_INTERVAL_MS = 3000;\nconst CRASH_WINDOW_MS = 60_000; // window for crash-loop detection\nconst MAX_RESTARTS_IN_WINDOW = 5; // give up after this many crashes in the window\n// Restarts (crash OR port-down) at/above this many within the window mark the\n// app as \"flapping\" so users can see it's unstable in `dev status`.\nconst FLAPPING_THRESHOLD = 3;\n// Don't health-check the port during this window after a (re)start: slow\n// apps may take several seconds to begin listening, and killing them for a\n// transient \"not listening yet\" would cause a restart loop.\nconst PORT_GRACE_MS = 15_000;\n// Periodic log rotation: even long-lived apps that never restart would\n// otherwise grow their log file without bound. Check hourly and rotate any\n// log exceeding the size cap (see rotateLogFile defaults).\nconst LOG_ROTATE_CHECK_MS = 60 * 60 * 1000;\n\n// ─── Public helpers ──────────────────────────────────────────────\n\n/** Read the supervisor PID if the daemon is currently running. */\nexport function getSupervisorPid(): number | null {\n const path = getSupervisorPidPath();\n if (!existsSync(path)) return null;\n const pid = parseInt(readFileSync(path, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return null;\n return isProcessRunning(pid) ? pid : null;\n}\n\nexport function isSupervisorRunning(): boolean {\n return getSupervisorPid() !== null;\n}\n\n/**\n * Ensure the supervisor daemon is running; start it (detached) if not.\n * Returns the running PID. Safe to call repeatedly.\n */\nexport function ensureSupervisorRunning(): number {\n const existing = getSupervisorPid();\n if (existing) return existing;\n return startSupervisorDaemon();\n}\n\n/** Spawn the supervisor as a detached daemon and return its PID. */\nexport function startSupervisorDaemon(): number {\n const logFilePath = logFilePathFor(\"supervisor\");\n mkdirSync(dirname(logFilePath), { recursive: true });\n const fd = openSync(logFilePath, \"a\");\n\n // Re-invoke this same CLI with the internal __supervisor command.\n const child = spawn(process.execPath, [process.argv[1]!, \"__supervisor\"], {\n env: { ...process.env },\n stdio: [\"ignore\", fd, fd],\n detached: true,\n });\n child.unref();\n child.once(\"spawn\", () => { try { closeSync(fd); } catch { /* best-effort */ } });\n return child.pid ?? 0;\n}\n\n// ─── User-facing command ─────────────────────────────────────────\n\nexport async function supervisorCommand(args: string[]): Promise<void> {\n const sub = args[0] ?? \"status\";\n\n switch (sub) {\n case \"start\":\n return supervisorStart();\n case \"stop\":\n return supervisorStop();\n case \"restart\":\n await supervisorStop();\n return supervisorStart();\n case \"status\":\n return supervisorStatus();\n default:\n console.error(renderError(\"Unknown sub-command\", `\"${sub}\" — use: start | stop | status | restart`));\n process.exit(1);\n }\n}\n\nfunction supervisorStart(): void {\n const existing = getSupervisorPid();\n if (existing) {\n console.error(`\\n ${pc.yellow(\"⚠\")} Supervisor already running ${pc.dim(`(PID ${existing})`)}\\n`);\n return;\n }\n const pid = startSupervisorDaemon();\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Supervisor started\")} ${pc.dim(`(PID ${pid})`)}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(\"fennec log supervisor\"))}`);\n console.error(` ${pc.dim(\"It will auto-restart apps started with\")} ${pc.cyan(\"--restart\")} ${pc.dim(\"even if you close this terminal.\")}\\n`);\n}\n\nfunction supervisorStop(): void {\n const pid = getSupervisorPid();\n if (!pid) {\n console.error(`\\n ${pc.dim(\"Supervisor is not running.\")}\\n`);\n return;\n }\n try {\n process.kill(pid, \"SIGTERM\");\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Supervisor stopped\")} ${pc.dim(`(PID ${pid})`)}\\n`);\n } catch (err) {\n console.error(renderError(\"Failed to stop supervisor\", String(err)));\n }\n try { unlinkSync(getSupervisorPidPath()); } catch { /* best-effort */ }\n}\n\nfunction supervisorStatus(): void {\n const pid = getSupervisorPid();\n const tracked = readTracked();\n const managed = tracked.filter((t) => t.autoRestart);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Supervisor\")}`);\n if (pid) {\n console.error(` ${pc.green(\"●\")} running ${pc.dim(`(PID ${pid})`)}`);\n } else {\n console.error(` ${pc.red(\"○\")} not running ${pc.dim(\"— start with\")} ${pc.cyan(\"fennec supervisor start\")}`);\n }\n\n console.error(`\\n ${pc.bold(\"Managed apps\")} ${pc.dim(`(${managed.length} with auto-restart)`)}`);\n if (managed.length === 0) {\n console.error(` ${pc.dim(\"None. Start one with\")} ${pc.cyan(\"fennec start <cmd> --name <name> --restart\")}`);\n } else {\n for (const t of managed) {\n const running = isTrackedRunning(t);\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const state = running ? pc.green(`running (PID ${t.pid})`) : pc.red(\"stopped\");\n console.error(` ${dot} ${pc.bold(t.name)} ${pc.dim(\"—\")} ${state}`);\n }\n }\n console.error();\n}\n\n// ─── The daemon loop (internal `__supervisor`) ───────────────────\n\ninterface CrashRecord {\n windowStart: number;\n count: number;\n gaveUp: boolean;\n /** Consecutive port health-check failures (app alive but not listening). */\n portFails: number;\n}\n\n/** Restart an app after this many consecutive port health-check failures. */\nconst PORT_FAIL_THRESHOLD = 2;\n\nexport async function runSupervisor(): Promise<void> {\n const pidPath = getSupervisorPidPath();\n mkdirSync(dirname(pidPath), { recursive: true });\n\n // Refuse to run twice.\n const existing = getSupervisorPid();\n if (existing && existing !== process.pid) {\n log(`supervisor already running (PID ${existing}); exiting`);\n return;\n }\n writeFileSync(pidPath, String(process.pid), \"utf-8\");\n log(`supervisor started (PID ${process.pid}), polling every ${POLL_INTERVAL_MS}ms`);\n\n const crashes = new Map<string, CrashRecord>();\n let stopped = false;\n\n const cleanup = (): void => {\n stopped = true;\n try { unlinkSync(pidPath); } catch { /* best-effort */ }\n log(\"supervisor stopping\");\n process.exit(0);\n };\n process.on(\"SIGTERM\", cleanup);\n process.on(\"SIGINT\", cleanup);\n\n const tick = async (): Promise<void> => {\n if (stopped) return;\n let tracked;\n try {\n tracked = readTracked();\n } catch (err) {\n log(`failed to read tracked.json: ${String(err)}`);\n return;\n }\n\n for (const t of tracked) {\n if (!t.autoRestart) continue;\n\n // Port health-check: the app is alive but not listening on its\n // advertised port (hung / deadlocked). This catches the \"running\n // but broken\" case that a plain PID check misses. Only apps with a\n // `port` are health-checked; we require a couple of consecutive\n // failures to avoid restarting during slow startup. Skipped during\n // the post-start grace window so slow apps aren't killed prematurely.\n if (t.port && isTrackedRunning(t)) {\n const startedAt = Date.parse(t.startedAt);\n const ageMs = Number.isNaN(startedAt) ? Number.POSITIVE_INFINITY : Date.now() - startedAt;\n if (ageMs >= PORT_GRACE_MS) {\n let rec = crashes.get(t.name);\n if (!rec) {\n rec = { windowStart: Date.now(), count: 0, gaveUp: false, portFails: 0 };\n crashes.set(t.name, rec);\n }\n let listening = false;\n const healthUrl = t.healthCheck ? resolveHealthUrl(t.healthCheck, t.port) : null;\n try {\n listening = healthUrl ? await checkHttp(healthUrl) : await checkPort(t.port);\n } catch {\n listening = false;\n }\n if (listening) {\n rec.portFails = 0;\n // App has been listening steadily through a full window — clear any\n // stale flapping flag.\n if (t.flapping && Date.now() - rec.windowStart > CRASH_WINDOW_MS) setFlapping(t, false);\n } else {\n rec.portFails++;\n const probe = healthUrl ? `health check ${healthUrl}` : `port ${t.port}`;\n if (rec.portFails >= PORT_FAIL_THRESHOLD) {\n rec.portFails = 0;\n rec.count++;\n if (rec.count >= FLAPPING_THRESHOLD) setFlapping(t, true);\n log(`${t.name}: alive but ${probe} not responding ${PORT_FAIL_THRESHOLD}x — restarting`);\n try {\n const newPid = respawnTracked(t, \"port-down\");\n log(`${t.name}: restarted (PID ${newPid}) after ${probe} failure`);\n } catch (err) {\n log(`${t.name}: restart failed: ${String(err)}`);\n }\n } else {\n log(`${t.name}: ${probe} not responding (${rec.portFails}/${PORT_FAIL_THRESHOLD})`);\n }\n }\n }\n continue;\n }\n\n if (isTrackedRunning(t)) continue;\n\n // Crash-loop backoff.\n const now = Date.now();\n let rec = crashes.get(t.name);\n // Allow a retry once the crash window has elapsed since we gave up.\n if (rec?.gaveUp && now - rec.windowStart > CRASH_WINDOW_MS) rec = undefined;\n if (!rec || now - rec.windowStart > CRASH_WINDOW_MS) {\n rec = { windowStart: now, count: 0, gaveUp: false, portFails: 0 };\n crashes.set(t.name, rec);\n if (t.flapping) setFlapping(t, false); // old window elapsed — clear stale flag\n }\n if (rec.gaveUp) continue;\n if (rec.count >= MAX_RESTARTS_IN_WINDOW) {\n rec.gaveUp = true;\n log(`${t.name}: crashed ${rec.count}x in <60s — giving up (will retry after window resets)`);\n continue;\n }\n\n rec.count++;\n if (rec.count >= FLAPPING_THRESHOLD) setFlapping(t, true);\n try {\n const newPid = respawnTracked(t, \"crash\");\n log(`${t.name}: restarted (PID ${newPid}) [${rec.count}/${MAX_RESTARTS_IN_WINDOW} in window]`);\n } catch (err) {\n log(`${t.name}: restart failed: ${String(err)}`);\n }\n }\n };\n\n // Run immediately, then on an interval. The (ref'd) interval keeps the\n // process alive until it receives SIGTERM/SIGINT.\n tick();\n setInterval(tick, POLL_INTERVAL_MS);\n // Rotate logs for long-lived apps that may never restart (bound the growth).\n setInterval(rotateAllLogs, LOG_ROTATE_CHECK_MS);\n await new Promise<void>(() => { /* run until SIGTERM/SIGINT */ });\n}\n\n/** Rotate the log of every tracked app whose log exceeds the size cap. */\nfunction rotateAllLogs(): void {\n try {\n for (const t of readTracked()) {\n try {\n rotateLogFile(logFilePathFor(t.name));\n } catch { /* best-effort per-app */ }\n }\n } catch (err) {\n log(`log rotation pass failed: ${String(err)}`);\n }\n}\n\nfunction setFlapping(t: TrackedProcess, val: boolean): void {\n if (!!t.flapping === val) return;\n t.flapping = val;\n try {\n addTracked({ ...t, flapping: val });\n } catch { /* best-effort */ }\n}\n\nfunction log(msg: string): void {\n // stdout is redirected to the supervisor log file by the daemon spawner.\n process.stdout.write(`[${new Date().toISOString()}] ${msg}\\n`);\n}\n","/**\n * Command: persist — Make fennec survive reboots.\n *\n * Installs a boot unit (systemd user service on Linux, a launchd agent\n * on macOS, a startup script on Windows) that starts the fennec\n * supervisor at login. The supervisor then resurrects every app flagged\n * `autoRestart` (i.e. started with `--restart`), so the whole app fleet\n * comes back automatically after a reboot — like `startup` + `save`.\n *\n * Sub-commands:\n * fennec persist enable Install the boot unit for the current user\n * fennec persist disable Remove it\n * fennec persist status Show whether boot persistence is active\n *\n * The boot unit always targets the fennec data dir that was active when\n * `enable` ran (baked into the unit's environment), so it works whatever\n * `FENNEC_DATA_DIR` is set to later.\n */\nimport pc from \"picocolors\";\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, chmodSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { renderError, renderKV } from \"../utils/format.js\";\nimport { getFennecDir } from \"./tracker.js\";\n\ntype Backend = \"systemd\" | \"launchd\" | \"windows\" | \"unsupported\";\n\nfunction detectBackend(): Backend {\n const p = platform();\n if (p === \"linux\" || p === \"freebsd\") {\n // Only user services are safe/simple here.\n return \"systemd\";\n }\n if (p === \"darwin\") return \"launchd\";\n if (p === \"win32\") return \"windows\";\n return \"unsupported\";\n}\n\nfunction unitPaths(backend: Backend): { unit: string; extra?: string } {\n const fennecDir = getFennecDir();\n switch (backend) {\n case \"systemd\":\n return { unit: resolve(homedir(), \".config\", \"systemd\", \"user\", \"fennec-supervisor.service\") };\n case \"launchd\":\n return { unit: resolve(homedir(), \"Library\", \"LaunchAgents\", \"io.fennec.supervisor.plist\") };\n case \"windows\":\n return { unit: resolve(homedir(), \"AppData\", \"Roaming\", \"Microsoft\", \"Windows\", \"Start Menu\", \"Programs\", \"Startup\", \"fennec-supervisor.bat\") };\n default:\n return { unit: resolve(fennecDir, \"persist.unit\") };\n }\n}\n\n/**\n * Build the boot unit content. The unit runs `node <cli> supervisor start`,\n * which launches the detached supervisor (and resurrects auto-restart apps).\n * FENNEC_DATA_DIR is pinned so the supervised apps (and their logs) resolve\n * to the same fennec instance regardless of the boot environment.\n */\nfunction buildUnit(backend: Backend, dataDir: string): string {\n const nodeBin = process.execPath;\n const cli = process.argv[1] ?? \"fennec\";\n const envLine = `FENNEC_DATA_DIR=${dataDir}`;\n\n if (backend === \"systemd\") {\n return `[Unit]\nDescription=Fennec process supervisor (auto-restarts managed apps)\nAfter=network.target\n\n[Service]\nType=simple\nEnvironment=${envLine}\nExecStart=${nodeBin} ${cli} supervisor start\nRestart=on-failure\n\n[Install]\nWantedBy=default.target\n`;\n }\n\n if (backend === \"launchd\") {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>io.fennec.supervisor</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodeBin}</string>\n <string>${cli}</string>\n <string>supervisor</string>\n <string>start</string>\n </array>\n <key>EnvironmentVariables</key>\n <dict>\n <key>FENNEC_DATA_DIR</key>\n <string>${dataDir}</string>\n </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <false/>\n</dict>\n</plist>\n`;\n }\n\n // windows .bat (runs at user login)\n return `@echo off\nset FENNEC_DATA_DIR=${dataDir}\n\"${nodeBin}\" \"${cli}\" supervisor start\n`;\n}\n\nfunction run(cmd: string, args: string[]): { ok: boolean; out: string } {\n try {\n const out = execFileSync(cmd, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] }).toString().trim();\n return { ok: true, out };\n } catch (err) {\n const e = err as { stdout?: Buffer; stderr?: Buffer; status?: number };\n const out = (e.stdout ?? e.stderr ?? Buffer.from(\"\")).toString().trim();\n return { ok: false, out };\n }\n}\n\nexport function persistEnabled(backend = detectBackend()): boolean {\n const { unit } = unitPaths(backend);\n return existsSync(unit);\n}\n\n/**\n * Silently ensure boot persistence is installed. Called from `start --restart`\n * so the first `--restart` app also arms reboot survival without the user\n * having to run `fennec persist enable`. No-ops on unsupported platforms or\n * if persistence is already enabled. Returns true if it just installed it.\n */\nexport function ensurePersistEnabled(): boolean {\n const backend = detectBackend();\n if (backend === \"unsupported\") return false;\n if (persistEnabled(backend)) return false;\n persistEnable(backend);\n return true;\n}\n\nexport async function persistCommand(args: string[]): Promise<void> {\n const sub = args[0] ?? \"status\";\n const backend = detectBackend();\n\n if (backend === \"unsupported\") {\n console.error(renderError(\"Unsupported platform\", `Boot persistence isn't available on ${platform()}. You can still run \"fennec supervisor start\" manually.`));\n process.exit(1);\n }\n\n switch (sub) {\n case \"enable\":\n return persistEnable(backend);\n case \"disable\":\n return persistDisable(backend);\n case \"status\":\n return persistStatus(backend);\n default:\n console.error(renderError(\"Unknown sub-command\", `\"${sub}\" — use: enable | disable | status`));\n process.exit(1);\n }\n}\n\nfunction persistEnable(backend: Backend): void {\n const dataDir = getFennecDir();\n const { unit } = unitPaths(backend);\n mkdirSync(dirname(unit), { recursive: true });\n writeFileSync(unit, buildUnit(backend, dataDir), \"utf-8\");\n if (backend === \"windows\") {\n // Nothing to register; the script runs at next login.\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot script installed\")} ${pc.dim(`(runs at next login)`)}`);\n console.error(` ${renderKV(\"Path\", pc.cyan(unit))}`);\n console.error(` ${pc.dim(\"Supervisor will start automatically when you log in.\")}\\n`);\n return;\n }\n\n if (backend === \"systemd\") {\n const reg = run(\"systemctl\", [\"--user\", \"enable\", \"--now\", resolve(unit)]);\n if (!reg.ok) {\n // Fall back to plain enable (some systems can't --now without a running manager)\n run(\"systemctl\", [\"--user\", \"enable\", resolve(unit)]);\n // Try to start the daemon directly so it's alive now.\n run(\"systemctl\", [\"--user\", \"start\", \"fennec-supervisor.service\"]);\n }\n // Always enable lingering so the user service keeps running after logout —\n // otherwise closing the session kills the supervisor (and every app it\n // manages), defeating the whole point of \"survive reboot\".\n const linger = run(\"loginctl\", [\"enable-linger\"]);\n if (!linger.ok) {\n console.error(` ${pc.yellow(\"⚠\")} ${pc.dim(\"Could not enable user linger — the supervisor may stop when you log out.\")}`);\n }\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot persistence enabled\")} ${pc.dim(\"(systemd user service)\")}`);\n console.error(` ${renderKV(\"Unit\", pc.cyan(\"fennec-supervisor.service\"))}`);\n console.error(` ${renderKV(\"Data dir\", pc.cyan(dataDir))}`);\n console.error(` ${pc.dim(\"The supervisor (and all --restart apps) will start at login and keep running after logout.\")}\\n`);\n return;\n }\n\n if (backend === \"launchd\") {\n run(\"launchctl\", [\"load\", resolve(unit)]);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot persistence enabled\")} ${pc.dim(\"(launchd agent)\")}`);\n console.error(` ${renderKV(\"Label\", pc.cyan(\"io.fennec.supervisor\"))}`);\n console.error(` ${renderKV(\"Data dir\", pc.cyan(dataDir))}`);\n console.error(` ${pc.dim(\"The supervisor will start at login.\")}\\n`);\n return;\n }\n}\n\nfunction persistDisable(backend: Backend): void {\n const { unit } = unitPaths(backend);\n if (backend === \"systemd\") {\n run(\"systemctl\", [\"--user\", \"disable\", \"--now\", \"fennec-supervisor.service\"]);\n } else if (backend === \"launchd\") {\n run(\"launchctl\", [\"unload\", resolve(unit)]);\n }\n try {\n if (existsSync(unit)) unlinkSync(unit);\n } catch { /* best-effort */ }\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot persistence disabled\")}\\n`);\n}\n\nfunction persistStatus(backend: Backend): void {\n const { unit } = unitPaths(backend);\n const installed = existsSync(unit);\n const label = backend === \"systemd\" ? \"fennec-supervisor.service\" : backend === \"launchd\" ? \"io.fennec.supervisor\" : \"fennec-supervisor.bat\";\n\n console.error(`\\n ${pc.bold(\"Fennec Boot Persistence\")} ${pc.dim(`(${backend})`)}`);\n if (!installed) {\n console.error(` ${pc.red(\"○\")} ${pc.dim(\"not installed — run \")}${pc.cyan(\"fennec persist enable\")}${pc.dim(\" to auto-start apps after reboot\")}`);\n console.error();\n return;\n }\n\n if (backend === \"systemd\") {\n const en = run(\"systemctl\", [\"--user\", \"is-enabled\", \"fennec-supervisor.service\"]).out;\n const ac = run(\"systemctl\", [\"--user\", \"is-active\", \"fennec-supervisor.service\"]).out;\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"installed\")}`);\n console.error(` ${renderKV(\"Enabled\", en || \"?\")}`);\n console.error(` ${renderKV(\"Active\", ac || \"?\")}`);\n } else if (backend === \"launchd\") {\n const loaded = run(\"launchctl\", [\"list\", \"io.fennec.supervisor\"]).ok;\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"installed\")}`);\n console.error(` ${renderKV(\"Loaded\", loaded ? pc.green(\"yes\") : pc.red(\"no\"))}`);\n } else {\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"installed\")} ${pc.dim(\"(runs at login)\")}`);\n }\n console.error(` ${renderKV(\"Unit\", pc.cyan(label))}`);\n console.error(` ${renderKV(\"Path\", pc.cyan(unit))}`);\n console.error();\n}\n","/**\n * Command: ps, status — List tracked processes and system overview.\n */\nimport pc from \"picocolors\";\nimport { printBanner } from \"../utils/banner.js\";\nimport { symbols, renderTable, renderError, renderCommand, createSpinner, timestamp, type Column, type Row } from \"../utils/format.js\";\nimport { getSystemProcesses, formatProcessState } from \"../utils/system-process.js\";\nimport { readTracked, formatUptime, isTrackedRunning } from \"./tracker.js\";\n\nexport async 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 jsonFlag = args.includes(\"--json\");\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 (jsonFlag) {\n await psJson();\n return;\n }\n\n if (watchFlag && systemFlag) {\n await watchSystemProcesses(sortBy, 15);\n return;\n }\n\n if (systemFlag) {\n const spinner = createSpinner(\"Scanning system processes...\");\n try {\n const processes = getSystemProcesses({ name: nameFilter, userOnly: true, sortBy, limit: 30 });\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n if (processes.length === 0) {\n console.error(`\\n ${pc.dim(\"No system processes found.\")}\\n`);\n return;\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) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"state\", label: \"State\", format: (v) => { const s = String(v); if (s === \"R\" || s === \"Running\") return pc.green(s); if (s === \"Z\" || s === \"Zombie\") return pc.red(s); if (s === \"S\" || s === \"Sleeping\") return pc.cyan(s); return pc.dim(s); } },\n ];\n const rows: Row[] = processes.map((p) => ({ pid: p.pid, name: p.name, cpu: p.cpuPercent, mem: p.memPercent, state: formatProcessState(p.state) }));\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 const tracked = readTracked();\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) => { const s = v as string; return s === \"running\" ? pc.green(\"● running\") : pc.red(\"○ stopped\"); } },\n { key: \"port\", label: \"Port\", format: (v) => { const p = v as number | null; return p ? pc.yellow(`:${p}`) : pc.dim(\"-\"); } },\n { key: \"command\", label: \"Command\", format: (v) => { const c = String(v); return c.length > 50 ? c.slice(0, 50) + \"…\" : c; } },\n { key: \"uptime\", label: \"Uptime\", format: (v) => pc.dim(String(v)) },\n ];\n\n const rows: Row[] = tracked.map((t) => {\n const running = isTrackedRunning(t);\n const uptime = running ? formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000)) : \"-\";\n return { name: t.name, pid: running ? String(t.pid) : pc.dim(String(t.pid)), status: running ? \"running\" : \"stopped\", port: t.port ?? null, command: t.command, uptime };\n });\n\n const runningCount = tracked.filter((t) => isTrackedRunning(t)).length;\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 stop <name>\")} ${pc.dim(\"to pause an app.\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec spawn <name>\")} ${pc.dim(\"to resume a paused app.\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec kill <name>\")} ${pc.dim(\"to permanently remove an app.\")}`);\n console.error();\n}\n\n/**\n * JSON output of tracked processes.\n */\nasync function psJson(): Promise<void> {\n const tracked = readTracked();\n const data = tracked.map((t) => {\n const running = isTrackedRunning(t);\n return {\n name: t.name,\n pid: t.pid,\n status: running ? \"running\" : \"stopped\",\n port: t.port ?? null,\n command: t.command,\n cwd: t.cwd ?? null,\n startedAt: t.startedAt,\n uptime: running ? Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000) : null,\n };\n });\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport async function statusCommand(_args: string[]): Promise<void> {\n const watchFlag = _args.includes(\"-w\") || _args.includes(\"--watch\");\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 if (tracked.length > 0) {\n const runningCount = tracked.filter((t) => isTrackedRunning(t)).length;\n console.error(` ${pc.bold(\"Managed Apps\")} ${pc.dim(`(${runningCount}/${tracked.length} running)`)}\\n`);\n for (const t of tracked) {\n const running = isTrackedRunning(t);\n const statusIcon = running ? pc.green(\"●\") : pc.red(\"○\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n const uptime = running ? pc.dim(formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000))) : 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 console.error(` ${pc.bold(\"System\")} ${pc.dim(`(${totalUserProcs} user processes)`)}`);\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) await watchSystemProcesses(\"cpu\", 15);\n console.error();\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({ userOnly: true, sortBy: sortBy as \"cpu\" | \"mem\" | \"pid\" | \"name\", limit });\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) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"state\", label: \"S\", align: \"center\" },\n ];\n const rows: Row[] = processes.map((p) => ({ pid: p.pid, name: p.name, cpu: p.cpuPercent, mem: p.memPercent, state: p.state }));\n return ` ${timestamp()} ${pc.dim(`${processes.length} processes`)}\\n${renderTable(columns, rows, { compact: true })}`;\n };\n\n console.error(render());\n const interval = setInterval(() => { process.stdout.write(\"\\x1B[J\"); console.error(render()); }, 3000);\n // Keep alive until SIGINT — resolves cleanly (no process.exit)\n await new Promise<void>((resolve) => {\n process.once(\"SIGINT\", () => {\n clearInterval(interval);\n process.stdout.write(\"\\x1B[J\");\n resolve();\n });\n });\n}\n","/**\n * Command: kill — Kill process by PID, name, or kill all Fennec-tracked apps.\n */\nimport pc from \"picocolors\";\nimport { renderError, createSpinner, selectPrompt, confirmPrompt } from \"../utils/format.js\";\nimport { killProcess as sysKill, isProcessRunning } from \"../utils/system-process.js\";\nimport { readTracked, removeTrackedByPid, isTrackedRunning } from \"./tracker.js\";\n\nexport async 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 const force = args.includes(\"-y\") || args.includes(\"--yes\");\n\n if (rawTarget === \"all\" || args.includes(\"--all\") || args.includes(\"-a\")) {\n await killAll(signal, force);\n return;\n }\n\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 let targetPid: number;\n let displayName: string;\n const pid = parseInt(rawTarget, 10);\n\n if (!isNaN(pid) && String(pid) === rawTarget) {\n if (!isProcessRunning(pid)) { console.error(renderError(\"Process not found\", `No process with PID ${pid} is running`)); process.exit(1); }\n targetPid = pid;\n displayName = `PID ${pid}`;\n } else {\n // First check tracked processes (from fennec start / tracked.json)\n const tracked = readTracked();\n const trackedMatch = tracked.find((t) => t.name === rawTarget);\n if (trackedMatch) {\n if (!isTrackedRunning(trackedMatch)) {\n // Already stopped — nothing to signal. `kill` means \"permanently\n // remove\", so just deregister it from tracked.json (don't leave a\n // zombie entry the user can't get rid of).\n removeTrackedByPid(trackedMatch.pid);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(rawTarget)} ${pc.dim(\"removed from tracked apps (was already stopped)\")}`);\n console.error();\n return;\n }\n targetPid = trackedMatch.pid;\n displayName = `${trackedMatch.name} (PID ${targetPid})`;\n } else {\n // Scope to Fennec-tracked apps only. Killing arbitrary user processes by\n // name (e.g. `fennec kill node`) is a footgun — an explicit PID is the\n // supported way to target a system process.\n console.error(renderError(\"Not tracked\", `No tracked process named \"${rawTarget}\".\\nUse ${pc.cyan(`fennec kill <pid>`)} to kill a system process by its PID.`));\n process.exit(1);\n }\n }\n\n const confirmed = force || (await confirmPrompt(`Kill ${pc.bold(displayName)} with ${pc.yellow(signal)}?`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n const spinner = createSpinner(`Sending ${signal} to ${displayName}...`);\n const success = sysKill(targetPid, signal);\n\n if (success) {\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 = force || (await confirmPrompt(`Send ${pc.red(\"SIGKILL\")} to force stop?`, true));\n if (forceKill) {\n const forceSpinner = createSpinner(`Sending SIGKILL to ${displayName}...`);\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 300));\n isProcessRunning(targetPid) ? forceSpinner.fail(`${displayName} could not be stopped (permission denied?)`) : forceSpinner.succeed(`${displayName} force stopped`);\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 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\nasync function killAll(signal: NodeJS.Signals, force: boolean): Promise<void> {\n // Scope strictly to Fennec-tracked apps — NEVER all user processes.\n const tracked = readTracked();\n if (tracked.length === 0) { console.error(` ${pc.dim(\"No tracked apps to kill.\")}`); return; }\n\n const running = tracked.filter((t) => isTrackedRunning(t));\n const stopped = tracked.filter((t) => !isTrackedRunning(t));\n\n console.error(`\\n ${pc.bold(`Kill ${running.length} running + remove ${stopped.length} stopped tracked app(s)?`)}`);\n console.error(` ${pc.dim(\"Permanently removes every Fennec-tracked app — other processes are untouched.\")}\\n`);\n\n const confirmed = force || (await confirmPrompt(`${pc.red(\"Are you sure?\")} ${pc.dim(\"This cannot be undone\")}`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled.\")}`); return; }\n\n const spinner = createSpinner(`Killing ${running.length} + removing ${stopped.length} tracked app(s)...`);\n let killed = 0, failed = 0;\n for (const t of running) {\n if (sysKill(t.pid, signal)) { killed++; } else { failed++; }\n removeTrackedByPid(t.pid);\n }\n // Stopped entries have nothing to signal — just deregister them.\n for (const t of stopped) {\n removeTrackedByPid(t.pid);\n }\n await new Promise((r) => setTimeout(r, 300));\n const total = running.length + stopped.length;\n total > 0 ? spinner.succeed(`${killed} killed, ${stopped.length} stopped entr${stopped.length === 1 ? \"y\" : \"ies\"} removed`) : spinner.fail(\"Failed to kill apps\");\n if (failed > 0) console.error(` ${pc.yellow(`${failed} running app(s) could not be killed`)}`);\n}\n","/**\n * Command: stop — Stop a tracked process but keep it in tracked.json.\n * Unlike `kill`, the process entry remains in tracked.json so it can\n * be re-spawned later via `fennec spawn <name>`.\n */\nimport pc from \"picocolors\";\nimport { renderError, createSpinner, confirmPrompt } from \"../utils/format.js\";\nimport { killProcess as sysKill, isProcessRunning } from \"../utils/system-process.js\";\nimport { readTracked, isTrackedRunning, setAutoRestart } from \"./tracker.js\";\nimport { psCommand } from \"./ps.js\";\n\nexport async function stopCommand(args: string[]): Promise<void> {\n const stopAll = args.includes(\"--all\") || args.includes(\"-a\");\n\n if (stopAll) {\n await stopAllTracked(args);\n return;\n }\n\n const rawTarget = args[0];\n\n if (!rawTarget) {\n console.error(renderError(\"Missing name\", \"Usage: fennec stop <name|--all>\"));\n process.exit(1);\n }\n\n // Only works on tracked processes\n const tracked = readTracked();\n const trackedMatch = tracked.find((t) => t.name === rawTarget);\n\n if (!trackedMatch) {\n console.error(renderError(\"Not found\", `No tracked process named \"${rawTarget}\". Use ${pc.cyan(\"fennec kill <pid>\")} to kill a system process.`));\n process.exit(1);\n }\n\n if (!isTrackedRunning(trackedMatch)) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(rawTarget)} ${pc.dim(\"is already stopped\")}`);\n console.error();\n process.exit(0);\n }\n\n const displayName = `${trackedMatch.name} (PID ${trackedMatch.pid})`;\n const force = args.includes(\"-y\") || args.includes(\"--yes\");\n const confirmed = force || (await confirmPrompt(`Stop ${pc.bold(displayName)}? ${pc.dim(\"It can be re-spawned later via fennec spawn\")}`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n // Disable auto-restart first so the supervisor doesn't immediately revive it.\n setAutoRestart(trackedMatch.name, false);\n await stopSingleProcess(trackedMatch.pid, trackedMatch.name);\n}\n\n/**\n * Stop all running tracked processes (keep them in tracked.json).\n */\nasync function stopAllTracked(args: string[]): Promise<void> {\n const tracked = readTracked();\n const running = tracked.filter((t) => isTrackedRunning(t));\n\n if (running.length === 0) {\n console.error(`\\n ${pc.dim(\"No running tracked processes to stop.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(`Stop all ${running.length} running process(es)?`)} ${pc.dim(\"(They can be re-spawned later)\")}\\n`);\n for (const t of running) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(t.name)} ${pc.dim(`(PID ${t.pid})`)}`);\n }\n console.error();\n\n const forceAll = args.includes(\"-y\") || args.includes(\"--yes\");\n const confirmed = forceAll || (await confirmPrompt(\"Stop all?\", false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n const spinner = createSpinner(`Stopping ${running.length} process(es)...`);\n let stopped = 0;\n let failed = 0;\n\n for (const t of running) {\n setAutoRestart(t.name, false);\n if (sysKill(t.pid, \"SIGTERM\")) {\n stopped++;\n } else {\n failed++;\n }\n }\n\n await new Promise((r) => setTimeout(r, 300));\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (stopped > 0) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(`Stopped ${stopped} process(es)`)} ${pc.dim(\"(kept in tracked.json)\")}`);\n }\n if (failed > 0) {\n console.error(` ${pc.red(\"✗\")} ${pc.bold(`${failed} process(es) failed to stop`)}`);\n }\n\n console.error();\n await psCommand([]);\n}\n\nasync function stopSingleProcess(pid: number, name: string): Promise<void> {\n const displayName = `${name} (PID ${pid})`;\n const spinner = createSpinner(`Stopping ${displayName}...`);\n const success = sysKill(pid, \"SIGTERM\");\n\n if (success) {\n await new Promise((r) => setTimeout(r, 200));\n const stillRunning = isProcessRunning(pid);\n if (stillRunning) {\n spinner.warn(`${displayName} did not respond to SIGTERM`);\n const forceKill = await confirmPrompt(`Send ${pc.red(\"SIGKILL\")} to force stop?`, true);\n if (forceKill) {\n const forceSpinner = createSpinner(`Sending SIGKILL to ${displayName}...`);\n sysKill(pid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 300));\n isProcessRunning(pid)\n ? forceSpinner.fail(`${displayName} could not be stopped (permission denied?)`)\n : forceSpinner.succeed(`${displayName} force stopped`);\n } else {\n console.error(` ${pc.yellow(\"⚠\")} ${displayName} ${pc.dim(\"may still be running\")}`);\n }\n } else {\n spinner.succeed(`${displayName} stopped`);\n }\n\n console.error();\n await psCommand([]);\n } else {\n spinner.fail(`Failed to stop ${displayName}`);\n console.error(renderError(\"Permission denied\", \"Try running with sudo or use fennec kill.\"));\n }\n}\n","/**\n * Command: spawn — List stopped tracked processes or re-spawn one.\n *\n * Without args: shows a selectable list of stopped tracked processes.\n * With name: re-spawns the named process from its saved command in tracked.json.\n * With --all: re-spawns all stopped processes that have saved commands.\n *\n * Unlike `fennec start <cmd> --name <name>` which creates a brand new connection,\n * `fennec spawn` revives a previously stopped process.\n */\nimport pc from \"picocolors\";\nimport { mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { symbols, renderError, renderKV, renderAppName, createSpinner, selectPrompt } from \"../utils/format.js\";\nimport { readTracked, addTracked, spawnDaemon, resolveArgs, isTrackedRunning, buildSpawnEnv } from \"./tracker.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\nimport { ensureSupervisorRunning } from \"./supervisor.js\";\nimport { ensurePersistEnabled } from \"./persist.js\";\nimport { psCommand } from \"./ps.js\";\n\nexport async function spawnCommand(args: string[]): Promise<void> {\n const spawnAll = args.includes(\"--all\") || args.includes(\"-a\");\n const name = args[0];\n\n if (spawnAll) {\n await spawnAllStopped();\n return;\n }\n\n if (!name) {\n // No args: list stopped processes for selection\n await spawnList();\n return;\n }\n\n // With name: find and re-spawn\n const tracked = readTracked();\n const match = tracked.find((t) => t.name === name);\n\n if (!match) {\n console.error(renderError(\"Not found\", `No tracked process named \"${name}\". Use ${pc.cyan(\"fennec spawn\")} to see available processes, or ${pc.cyan(\"fennec start <command> --name <name>\")} to create a new one.`));\n process.exit(1);\n }\n\n if (isTrackedRunning(match)) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(name)} ${pc.dim(\"is already running (PID:\")} ${match.pid}${pc.dim(\")\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(`fennec stop ${name}`)} ${pc.dim(\"to stop it first.\")}`);\n console.error();\n process.exit(0);\n }\n\n if (!match.command) {\n console.error(renderError(\"No command saved\", `\"${name}\" has no saved command and cannot be re-spawned.`));\n process.exit(1);\n }\n\n await respawnProcess(match);\n}\n\n/**\n * Re-spawn ALL stopped tracked processes that have saved commands.\n */\nasync function spawnAllStopped(): Promise<void> {\n const tracked = readTracked();\n const toSpawn = tracked.filter((t) => !isTrackedRunning(t) && t.command);\n\n if (toSpawn.length === 0) {\n console.error(`\\n ${pc.dim(\"No stopped processes with saved commands to spawn.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(`Spawning ${toSpawn.length} process(es)...`)}\\n`);\n for (const t of toSpawn) {\n console.error(` ${pc.dim(\"·\")} ${pc.bold(t.name)} ${pc.dim(`(${t.command})`)}`);\n }\n console.error();\n\n const spinner = createSpinner(\"Spawning...\");\n let spawned = 0;\n let failed = 0;\n\n for (const proc of toSpawn) {\n try {\n const cmdParts = resolveArgs(proc);\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n mkdirSync(logDir, { recursive: true });\n const logFilePath = resolve(logDir, `${proc.name}.log`);\n\n const child = spawnDaemon({ cmdParts, name: proc.name, cwd: proc.cwd, logFilePath, env: buildSpawnEnv(proc.env), logMode: proc.logMode });\n const pid = child.pid ?? 0;\n\n addTracked({\n name: proc.name,\n pid,\n command: proc.command,\n args: cmdParts,\n port: proc.port,\n cwd: proc.cwd,\n env: proc.env,\n startedAt: new Date().toISOString(),\n autoRestart: proc.autoRestart,\n logMode: proc.logMode,\n });\n if (proc.autoRestart) { ensureSupervisorRunning(); ensurePersistEnabled(); }\n\n spawned++;\n } catch {\n failed++;\n }\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (spawned > 0) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(`Spawned ${spawned} process(es)`)}`);\n }\n if (failed > 0) {\n console.error(` ${pc.red(\"✗\")} ${pc.bold(`${failed} process(es) failed to spawn`)}`);\n }\n\n console.error();\n await psCommand([]);\n}\n\n/**\n * Show a selectable list of stopped tracked processes.\n */\nasync function spawnList(): Promise<void> {\n const tracked = readTracked();\n\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes found.\")}`);\n console.error(` ${pc.dim(\"Start an app first:\")} ${pc.cyan(\"fennec start <command> --name <name>\")}`);\n console.error();\n return;\n }\n\n const stopped = tracked.filter((t) => !isTrackedRunning(t));\n const running = tracked.filter((t) => isTrackedRunning(t));\n\n if (stopped.length === 0) {\n console.error(`\\n ${pc.dim(\"All tracked processes are running. Nothing to spawn.\")}`);\n console.error();\n return;\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Available to spawn\")} ${pc.dim(`(${stopped.length}/${tracked.length} stopped)`)}`);\n\n // Show running ones as info\n if (running.length > 0) {\n console.error(` ${pc.dim(\"Running (use stop first):\")}`);\n for (const r of running) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(r.name)} ${pc.dim(`(PID ${r.pid})`)}`);\n }\n console.error();\n }\n\n // Show stopped ones as selectable\n const selected = await selectPrompt(\"Select a process to spawn:\", stopped.map((t) => ({\n value: t.name,\n label: t.name,\n description: t.command.length > 80 ? t.command.slice(0, 80) + \"...\" : t.command,\n })));\n\n if (selected === null) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n\n const match = stopped.find((t) => t.name === selected);\n if (match) {\n await respawnProcess(match);\n }\n}\n\n/**\n * Re-spawn a stopped tracked process from its saved command/cwd.\n */\nasync function respawnProcess(proc: TrackedProcess): Promise<void> {\n const cmdParts = resolveArgs(proc);\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n mkdirSync(logDir, { recursive: true });\n const logFilePath = resolve(logDir, `${proc.name}.log`);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Spawning\")} ${renderAppName(proc.name)} ${pc.dim(\"(from saved config)\")}\\n`);\n console.error(` ${renderKV(\"Command\", proc.command)}`);\n if (proc.cwd) console.error(` ${renderKV(\"Directory\", proc.cwd)}`);\n if (proc.port) console.error(` ${renderKV(\"Port\", String(proc.port))}`);\n\n try {\n const child = spawnDaemon({ cmdParts, name: proc.name, cwd: proc.cwd, logFilePath, env: buildSpawnEnv(proc.env), logMode: proc.logMode });\n const pid = child.pid ?? 0;\n\n // Update tracked.json with new PID\n addTracked({\n name: proc.name,\n pid,\n command: proc.command,\n args: cmdParts,\n port: proc.port,\n cwd: proc.cwd,\n env: proc.env,\n startedAt: new Date().toISOString(),\n autoRestart: proc.autoRestart,\n logMode: proc.logMode,\n });\n\n if (proc.autoRestart) { ensureSupervisorRunning(); ensurePersistEnabled(); }\n\n console.error(` ${pc.green(\"✓\")} ${pc.bold(proc.name)} ${pc.dim(`spawned (PID: ${pid})`)}`);\n\n // Show the process table\n await psCommand([]);\n } catch (error) {\n console.error(renderError(`Failed to spawn ${proc.name}`, String(error)));\n process.exit(1);\n }\n}\n","/**\n * Command: restart — Kill and re-spawn a tracked process from tracked.json config.\n * Fixed: now actually re-spawns (instead of just killing + suggesting manual re-run).\n */\nimport pc from \"picocolors\";\nimport { mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderCommand, createSpinner, confirmPrompt } from \"../utils/format.js\";\nimport { killProcess as sysKill, isProcessRunning } from \"../utils/system-process.js\";\nimport { readTracked, addTracked, removeTrackedByPid, spawnDaemon, resolveArgs, buildSpawnEnv } from \"./tracker.js\";\n\nexport async function restartCommand(args: string[]): Promise<void> {\n const raw = args[0];\n if (!raw) { console.error(renderError(\"Missing process name/pid\", \"Usage: fennec restart <name|pid> [-y]\")); process.exit(1); }\n\n const tracked = readTracked();\n const pidNum = parseInt(raw, 10);\n // Resolve by tracked name OR by a tracked PID. Intentionally NOT falling back\n // to a system-wide name search — restart is only meaningful for Fennec-tracked\n // apps (it re-spawns from saved config). Killing arbitrary system processes by\n // name here would be a footgun (see the kill -all incident).\n const trackedEntry =\n tracked.find((t) => t.name === raw) ??\n (!isNaN(pidNum) && String(pidNum) === raw ? tracked.find((t) => t.pid === pidNum) : undefined);\n\n if (!trackedEntry) {\n console.error(renderError(\"Not tracked\", `No tracked process named or with PID \"${raw}\".\\nfennec restart only re-spawns Fennec-tracked apps (from their saved config).`));\n process.exit(1);\n }\n\n const targetPid = trackedEntry.pid;\n const force = args.includes(\"-y\") || args.includes(\"--yes\");\n const confirmed = force || (await confirmPrompt(`Restart ${pc.bold(`${trackedEntry.name} (PID ${targetPid})`)}?`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n const spinner = createSpinner(`Stopping ${trackedEntry.name} (PID ${targetPid})...`);\n const killed = sysKill(targetPid, \"SIGTERM\");\n if (!killed) { spinner.fail(`Failed to stop PID ${targetPid}`); return; }\n\n await new Promise((r) => setTimeout(r, 1000));\n if (isProcessRunning(targetPid)) {\n spinner.warn(\"Process didn't stop, sending SIGKILL...\");\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 500));\n }\n\n spinner.succeed(`${trackedEntry.name} stopped`);\n\n const respawnSpinner = createSpinner(`Re-spawning ${trackedEntry.name}...`);\n try {\n const cmdParts = resolveArgs(trackedEntry);\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n mkdirSync(logDir, { recursive: true });\n const logFilePath = resolve(logDir, `${trackedEntry.name}.log`);\n\n const child = spawnDaemon({ cmdParts, name: trackedEntry.name, cwd: trackedEntry.cwd, logFilePath, env: buildSpawnEnv(trackedEntry.env), logMode: trackedEntry.logMode });\n\n // Remove old PID entry, add new one (only after successful spawn)\n removeTrackedByPid(targetPid);\n addTracked({\n name: trackedEntry.name,\n pid: child.pid ?? 0,\n command: trackedEntry.command,\n args: cmdParts,\n port: trackedEntry.port,\n cwd: trackedEntry.cwd,\n env: trackedEntry.env,\n startedAt: new Date().toISOString(),\n autoRestart: trackedEntry.autoRestart,\n logMode: trackedEntry.logMode,\n });\n\n respawnSpinner.succeed(`${trackedEntry.name} restarted (PID: ${child.pid})`);\n } catch (error) {\n respawnSpinner.fail(`Failed to re-spawn ${trackedEntry.name}: ${String(error)}`);\n console.error(` ${pc.dim(\"Config preserved. Re-run manually:\")} ${renderCommand(trackedEntry.command)}`);\n }\n}\n","/**\n * Command: adopt — Register an already-running process (started via raw bash,\n * another tool, or a previous session) into fennec's tracked registry WITHOUT\n * restarting it. The human counterpart to the agent's `process_adopt`: it\n * stops an externally-launched server from being an untracked orphan and\n * prevents `start`/`spawn` from creating a duplicate that fails with\n * EADDRINUSE.\n *\n * Usage: fennec adopt <pid> [--name <name>] [--port <port>]\n */\nimport pc from \"picocolors\";\nimport { renderError, symbols } from \"../utils/format.js\";\nimport { adoptProcess, logFilePathFor } from \"./tracker.js\";\n\nexport function adoptCommand(args: string[]): void {\n const pidArg = args.find((a) => /^\\d+$/.test(a));\n if (!pidArg) {\n console.error(renderError(\"Missing PID\", `Usage: fennec adopt <pid> [--name <name>] [--port <port>]`));\n process.exit(1);\n }\n const pid = parseInt(pidArg, 10);\n\n const nameIdx = args.indexOf(\"--name\");\n const name = nameIdx !== -1 ? args[nameIdx + 1] : undefined;\n const portIdx = args.indexOf(\"--port\");\n const port = portIdx !== -1 ? parseInt(args[portIdx + 1] ?? \"\", 10) : undefined;\n\n const entry = adoptProcess(pid, { name, port: Number.isNaN(port) ? undefined : port });\n if (!entry) {\n console.error(renderError(\"Cannot adopt\", `No running process with PID ${pid}`));\n process.exit(1);\n }\n\n console.error(`\\n ${symbols.fox} ${pc.green(\"✓\")} ${pc.bold(\"Adopted\")} ${pc.bold(entry.name)} ${pc.dim(`(PID ${pid})`)}`);\n if (entry.port) console.error(` ${pc.dim(\"port\")} ${pc.yellow(`:${entry.port}`)}`);\n if (entry.command) console.error(` ${pc.dim(\"command\")} ${entry.command}`);\n console.error(` ${pc.dim(\"status\")} now tracked + supervised by the supervisor`);\n console.error(` ${pc.dim(\"logs\")} ${pc.cyan(logFilePathFor(entry.name))}\\n`);\n}\n","/**\n * Command: inspect — Compact, AI-friendly snapshot of one app.\n *\n * Returns a single bounded, machine-readable (JSON) view combining liveness,\n * port health, recent log lines, and a quick error scan. Designed so an AI\n * assistant can \"observe\" a real running app (BE, FE, worker, console, ...)\n * cheaply and predictably: output is capped (token budget), secrets are\n * redacted, and the shape is stable. Use `--plain` for a short human summary.\n *\n * fennec inspect <name|pid> [--plain] [--tail N] [--since 10m]\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport pc from \"picocolors\";\nimport { symbols, renderAppName } from \"../utils/format.js\";\nimport { readTracked, isTrackedRunning, formatUptime } from \"./tracker.js\";\nimport { checkPort } from \"../utils/system-process.js\";\nimport { logFilePathFor } from \"./tracker.js\";\nimport { readLogLines, redactLine, stripAnsi, parseDuration, redactionCount, classifyLevel } from \"../utils/redact.js\";\n\nconst DEFAULT_TAIL = 40;\nconst MAX_TAIL = 200;\n\ninterface ProcMetrics {\n rssMb?: number;\n cpuPct?: number;\n}\n\n/** Best-effort RSS/CPU read from /proc. Returns undefined fields if unavailable. */\nfunction readMetrics(pid: number): ProcMetrics {\n const m: ProcMetrics = {};\n try {\n const status = readFileSync(`/proc/${pid}/status`, \"utf-8\");\n const rssLine = status.split(\"\\n\").find((l) => l.startsWith(\"VmRSS:\"));\n if (rssLine) {\n const kb = parseInt(rssLine.replace(/[^\\d]/g, \"\"), 10);\n if (!isNaN(kb)) m.rssMb = Math.round((kb / 1024) * 10) / 10;\n }\n } catch { /* best-effort */ }\n return m;\n}\n\nexport async function inspectCommand(args: string[]): Promise<void> {\n const target = args[0];\n if (!target || target.startsWith(\"--\")) {\n console.error(pc.dim(`Usage: fennec inspect <name|pid> [--plain] [--tail N] [--since 10m]`));\n process.exit(1);\n }\n const plain = args.includes(\"--plain\");\n const tailIndex = args.indexOf(\"--tail\");\n const tail = tailIndex !== -1 ? Math.min(parseInt(args[tailIndex + 1]!, 10) || DEFAULT_TAIL, MAX_TAIL) : DEFAULT_TAIL;\n const sinceIndex = args.indexOf(\"--since\");\n const sinceMs = sinceIndex !== -1 ? parseDuration(args[sinceIndex + 1]!) : undefined;\n if (sinceIndex !== -1 && sinceMs === undefined) {\n console.error(pc.red(`Invalid --since. Use e.g. 10m, 1h, 30s.`));\n process.exit(1);\n }\n\n const tracked = readTracked();\n const proc = tracked.find((t) => t.name === target || (parseInt(target, 10) === t.pid && !isNaN(parseInt(target, 10))));\n if (!proc) {\n console.error(pc.red(`No tracked app named \"${target}\".`));\n process.exit(1);\n }\n\n const running = isTrackedRunning(proc);\n const logPath = logFilePathFor(proc.name);\n const lines = readLogLines(logPath, { tail: Math.max(tail, sinceMs ? MAX_TAIL : 0), sinceMs: sinceMs ?? undefined, redact: true, parseTimestamp: true });\n const recent = lines.slice(-tail);\n const errorLines = lines.filter((l) => classifyLevel(l) === \"error\").slice(-15);\n const redactedLines = recent.reduce((acc, l) => acc + (redactionCount(stripAnsi(l)) > 0 ? 1 : 0), 0);\n const metrics = running ? readMetrics(proc.pid) : {};\n\n let portHealthy: boolean | null = null;\n if (proc.port) {\n try { portHealthy = await checkPort(proc.port); } catch { portHealthy = false; }\n }\n\n const startedAt = Date.parse(proc.startedAt);\n const uptimeSec = running && !isNaN(startedAt) ? Math.floor((Date.now() - startedAt) / 1000) : 0;\n\n if (plain) {\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const portStr = proc.port ? ` :${proc.port}${portHealthy === false ? pc.red(\" (port down!)\") : portHealthy ? pc.green(\" (up)\") : \"\"}` : \"\";\n console.error(`\\n ${symbols.fox} ${renderAppName(proc.name)}${portStr} ${dot} ${running ? pc.green(`running PID ${proc.pid}`) : pc.red(\"stopped\")}`);\n console.error(` ${pc.dim(\"uptime\")} ${pc.cyan(uptimeSec ? formatUptime(uptimeSec) : \"—\")} ${pc.dim(\"rss\")} ${pc.cyan(metrics.rssMb ? `${metrics.rssMb}MB` : \"—\")} ${pc.dim(\"errors(last)\")} ${pc.cyan(String(errorLines.length))} ${pc.dim(\"redacted\")} ${pc.cyan(String(redactedLines))}`);\n if (errorLines.length) {\n console.error(`\\n ${pc.bold(pc.red(\"Recent errors:\"))}`);\n for (const l of errorLines.slice(-8)) console.error(` ${pc.red(stripAnsi(l).slice(0, 300))}`);\n }\n console.error();\n return;\n }\n\n const payload = {\n name: proc.name,\n running,\n pid: running ? (proc.pid ?? null) : null,\n port: proc.port ?? null,\n portHealthy,\n autoRestart: proc.autoRestart ?? false,\n uptimeSec,\n metrics,\n logTail: recent,\n errorCount: errorLines.length,\n errors: errorLines,\n redacted: true,\n redactedLines,\n note: \"Secrets redacted by default. Bounded snapshot for AI observation.\",\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n}\n","/**\n * Secret redaction + log shaping for AI-safe observability.\n *\n * Logs from real apps routinely contain credentials (DB connection\n * strings, API keys, session tokens). Because fennec is designed to be\n * inspected by an AI assistant — which has a finite, precious context\n * window — leaking those into the context is both a security risk and a\n * token-waste. These helpers strip known secret shapes (best-effort, not\n * a substitute for proper secret management) and bound/shape log output\n * so AI inspection stays controlled and predictable.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\n\nexport interface RedactOptions {\n /** When false, no redaction is performed (e.g. user opted out). */\n enabled?: boolean;\n}\n\n// Order matters: more specific patterns first.\nconst SECRET_PATTERNS: { name: string; re: RegExp }[] = [\n // Bearer / auth tokens\n { name: \"bearer\", re: /\\bBearer\\s+[A-Za-z0-9._\\-]+/gi },\n // Authorization: <scheme> <token>\n { name: \"authorization\", re: /\\bAuthorization\\s*:\\s*\\S+/gi },\n // Generic API keys\n { name: \"apikey\", re: /\\b(api[_-]?key|apikey|access[_-]?key|secret[_-]?key|private[_-]?key)\\s*[:=]\\s*\\S+/gi },\n // AWS\n { name: \"aws\", re: /\\b(AKIA|ASIA)[0-9A-Z]{16}\\b/g },\n // Slack tokens\n { name: \"slack\", re: /\\bxox[baprs]-[0-9A-Za-z\\-]{10,}/g },\n // Stripe\n { name: \"stripe\", re: /\\b(sk|rk|pk)_(live|test)_[0-9A-Za-z]{16,}\\b/g },\n // JWT\n { name: \"jwt\", re: /\\beyJ[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-]*/g },\n // Google API\n { name: \"google\", re: /\\bAIza[0-9A-Za-z_\\-]{35}\\b/g },\n // GitHub PAT\n { name: \"github\", re: /\\bgh[pousr]_[0-9A-Za-z]{36,}\\b/g },\n // Generic long hex/alpha tokens (>=32 chars) in common contexts\n { name: \"token\", re: /\\b(token|secret|password|passwd|pwd|client[_-]?secret)\\s*[:=]\\s*\\S+/gi },\n // Connection strings with credentials\n { name: \"connstr\", re: /\\b(mongodb(\\+srv)?|postgres(ql)?|mysql|redis|amqp|sqlserver):\\/\\/[^\\s:]+:[^\\s@]+@/gi },\n // Private key blocks\n { name: \"pem\", re: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/g },\n];\n\nexport function redactLine(line: string, opts: RedactOptions = {}): string {\n if (opts.enabled === false) return line;\n let out = line;\n for (const { name, re } of SECRET_PATTERNS) {\n out = out.replace(re, (m) => {\n // Keep a hint of what was redacted so logs stay debuggable.\n const head = m.slice(0, Math.min(m.length, name.length + 4));\n return `${head}…[REDACTED]`;\n });\n }\n return out;\n}\n\n/** Count how many secret matches a line would produce (for threat signal). */\nexport function redactionCount(line: string): number {\n let n = 0;\n for (const { re } of SECRET_PATTERNS) {\n const m = line.match(re);\n if (m) n += m.length;\n }\n return n;\n}\n\n// Strip ANSI escape sequences so AI sees plain text.\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"other\";\n\nconst LEVEL_RE: { level: LogLevel; re: RegExp }[] = [\n { level: \"error\", re: /\\b(ERROR|FATAL|CRITICAL|EXCEPTION|UNCAUGHT)\\b/i },\n { level: \"warn\", re: /\\b(WARN|WARNING)\\b/i },\n { level: \"info\", re: /\\b(INFO|NOTICE)\\b/i },\n { level: \"debug\", re: /\\b(DEBUG|TRACE)\\b/i },\n];\n\n/** Classify a log line by level (best-effort, keyword based). */\nexport function classifyLevel(line: string): LogLevel {\n for (const { level, re } of LEVEL_RE) {\n if (re.test(line)) return level;\n }\n if (/\\b(error|fail|failed|failure|denied|reject)\\b/i.test(line)) return \"error\";\n if (/\\b(warn)\\b/i.test(line)) return \"warn\";\n return \"other\";\n}\n\nexport interface ReadLogOptions {\n /** Max lines to keep (token budget). Keeps the most recent. */\n tail?: number;\n /** Only include lines whose timestamp is within the last `sinceMs`. */\n sinceMs?: number;\n /** Redact secrets. */\n redact?: boolean;\n /** Parse an ISO-ish [ts] prefix at the start of a line for --since. */\n parseTimestamp?: boolean;\n}\n\n/**\n * Extract a timestamp from a log line. Handles both plain text logs\n * (`[2026-...] msg` or `2026-... msg`) and structured JSONL (`{\"ts\":\"...\",...}`).\n * Returns the ISO string or null when no timestamp is found.\n */\nexport function extractTimestamp(line: string): string | null {\n const m = line.match(/^\\s*\\[?(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z?)\\]?/);\n if (m) return m[1]!;\n const trimmed = line.trimStart();\n if (trimmed.startsWith(\"{\")) {\n try {\n const obj = JSON.parse(line) as Record<string, unknown>;\n const ts = obj.ts ?? obj.time ?? obj.timestamp;\n if (typeof ts === \"string\") return ts;\n if (typeof ts === \"number\") return new Date(ts).toISOString();\n } catch { /* not JSON */ }\n }\n return null;\n}\n\n/** Read a log file, apply redaction + time filter, and enforce a tail budget. */\nexport function readLogLines(path: string, opts: ReadLogOptions = {}): string[] {\n if (!existsSync(path)) return [];\n const raw = readFileSync(path, \"utf-8\");\n let lines = raw.split(\"\\n\").filter(Boolean);\n const now = Date.now();\n\n if (opts.sinceMs && opts.parseTimestamp) {\n lines = lines.filter((l) => {\n const ts = extractTimestamp(l);\n if (ts === null) return true; // keep un-timestamped lines (don't drop unknown)\n const t = Date.parse(ts);\n return !isNaN(t) && now - t <= opts.sinceMs!;\n });\n }\n\n if (opts.redact === false) {\n // still strip ANSI for machine consumption\n lines = lines.map(stripAnsi);\n } else {\n lines = lines.map((l) => stripAnsi(redactLine(l)));\n }\n\n if (opts.tail && opts.tail > 0 && lines.length > opts.tail) {\n lines = lines.slice(-opts.tail);\n }\n return lines;\n}\n\n/** Parse a human duration like \"10m\", \"1h\", \"30s\", \"2d\" into milliseconds. */\nexport function parseDuration(input: string): number | null {\n const m = input.trim().match(/^(\\d+)\\s*(s|m|h|d)$/i);\n if (!m) return null;\n const n = parseInt(m[1]!, 10);\n const unit = m[2]!.toLowerCase();\n const mul = unit === \"s\" ? 1000 : unit === \"m\" ? 60_000 : unit === \"h\" ? 3_600_000 : 86_400_000;\n return n * mul;\n}\n","/**\n * Command: dev — Declarative dev environment orchestration.\n *\n * Reads a `fennec.config.yaml` describing the whole stack (BE, FE, DB, workers)\n * and brings it up/down as one unit. Each app is started like `fennec start\n * --restart`, so the supervisor keeps them alive, health-checks their ports,\n * and (with boot persistence) survives reboots. Dependencies are started first\n * and an app can wait for another's port before launching — so `fennec dev up`\n * is a single, AI-friendly command to boot an entire project and observe it.\n *\n * fennec dev up [--config fennec.config.yaml]\n * fennec dev down\n * fennec dev status\n *\n * Config shape (fennec.config.yaml):\n * apps:\n * - name: api\n * command: node\n * args: [app.js]\n * cwd: ./backend\n * port: 3000\n * env: { NODE_ENV: development }\n * restart: true # auto-restart (default true)\n * jsonl: true # structured logs (default false)\n * waitForPort: 3000 # wait for this port before starting dependents\n * - name: web\n * command: npm\n * args: [run, dev]\n * cwd: ./frontend\n * port: 5173\n * dependsOn: [api] # started after `api` is up\n */\nimport pc from \"picocolors\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderKV, symbols, createSpinner } from \"../utils/format.js\";\nimport { readTracked, addTracked, isTrackedRunning, spawnDaemon, buildSpawnEnv, logFilePathFor, respawnTracked, adoptExternalOnPort } from \"./tracker.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\nimport { ensureSupervisorRunning } from \"./supervisor.js\";\nimport { ensurePersistEnabled } from \"./persist.js\";\nimport { checkPort } from \"../utils/system-process.js\";\nimport yaml from \"js-yaml\";\n\ninterface AppConfig {\n name: string;\n command: string;\n args?: string[];\n cwd?: string;\n port?: number;\n env?: Record<string, string>;\n restart?: boolean;\n jsonl?: boolean;\n dependsOn?: string[];\n waitForPort?: number;\n /** HTTP readiness probe. A full URL (http://...) or a path (/health) that's\n * combined with `port`. When set, the supervisor health-checks this URL\n * instead of a bare TCP port check. */\n healthCheck?: string;\n}\n\ninterface DevConfig {\n apps?: AppConfig[];\n}\n\nfunction loadConfig(path: string): DevConfig {\n if (!existsSync(path)) {\n console.error(renderError(\"Config not found\", path));\n process.exit(1);\n }\n try {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = yaml.load(raw) as DevConfig;\n return parsed ?? {};\n } catch (err) {\n console.error(renderError(\"Failed to parse config\", String(err)));\n process.exit(1);\n }\n}\n\nfunction resolveCwd(baseDir: string, cwd?: string): string {\n if (!cwd) return baseDir;\n return resolve(baseDir, cwd);\n}\n\nasync function waitForPort(port: number, timeoutMs = 30_000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n if (await checkPort(port)) return true;\n } catch { /* keep trying */ }\n await new Promise((r) => setTimeout(r, 500));\n }\n return false;\n}\n\ntype StartResult = \"started\" | \"skipped\" | \"restarted\" | \"adopted\";\n\n/** Returns true when an existing tracked entry already runs the same app with\n * an identical spawn config (command, args, cwd, port, env, mode, restart). */\nfunction configMatches(\n existing: TrackedProcess,\n desired: Pick<TrackedProcess, \"command\" | \"args\" | \"cwd\" | \"port\" | \"env\" | \"logMode\" | \"autoRestart\" | \"healthCheck\">,\n): boolean {\n if (existing.command !== desired.command) return false;\n if (JSON.stringify(existing.args ?? []) !== JSON.stringify(desired.args)) return false;\n if (existing.cwd !== desired.cwd) return false;\n if ((existing.port ?? null) !== (desired.port ?? null)) return false;\n if (existing.logMode !== desired.logMode) return false;\n if ((existing.autoRestart ?? true) !== desired.autoRestart) return false;\n if ((existing.healthCheck ?? null) !== (desired.healthCheck ?? null)) return false;\n if (JSON.stringify(existing.env ?? {}) !== JSON.stringify(desired.env)) return false;\n return true;\n}\n\n/** Idempotent start: skip an app that's already running with identical config,\n * restart only if running but changed, otherwise spawn fresh. */\nasync function startApp(app: AppConfig, baseDir: string): Promise<StartResult> {\n const cwd = resolveCwd(baseDir, app.cwd);\n const cmdParts = [app.command, ...(app.args ?? [])];\n const logFilePath = logFilePathFor(app.name);\n const env: Record<string, string> = { ...(app.env ?? {}) };\n const port = app.waitForPort ?? app.port;\n const restart = app.restart ?? true;\n const logMode: \"text\" | \"jsonl\" = app.jsonl ? \"jsonl\" : \"text\";\n const desired = {\n command: cmdParts.join(\" \"),\n args: cmdParts,\n cwd,\n port,\n env,\n logMode,\n autoRestart: restart,\n healthCheck: app.healthCheck,\n };\n\n const existing = readTracked().find((t) => t.name === app.name);\n if (existing && isTrackedRunning(existing) && configMatches(existing, desired)) {\n return \"skipped\"; // already healthy & unchanged — leave it alone\n }\n\n const wasRunning = !!(existing && isTrackedRunning(existing));\n if (wasRunning) {\n try { process.kill(existing!.pid, \"SIGTERM\"); } catch { /* best-effort */ }\n }\n\n // Idempotent-by-port: if an EXTERNAL process (e.g. started via raw bash by\n // an agent) is already listening on our port, adopt it instead of spawning\n // a duplicate that fails with EADDRINUSE.\n if (port && !(existing && isTrackedRunning(existing))) {\n const adopted = adoptExternalOnPort(port, app.name);\n if (adopted) {\n return \"adopted\";\n }\n if (await checkPort(port)) {\n console.error(\n ` ${pc.yellow(\"⚠\")} ${pc.dim(`port :${port} already responding — ${app.name} may fail to bind (EADDRINUSE)`)}`,\n );\n }\n }\n\n const child = spawnDaemon({\n cmdParts,\n name: app.name,\n cwd,\n logFilePath,\n env: buildSpawnEnv(env),\n logMode,\n });\n addTracked({\n name: app.name,\n pid: child.pid ?? 0,\n command: desired.command,\n args: cmdParts,\n port,\n cwd,\n env,\n startedAt: new Date().toISOString(),\n autoRestart: restart,\n logMode,\n flapping: false,\n healthCheck: app.healthCheck,\n });\n return wasRunning ? \"restarted\" : \"started\";\n}\n\nexport async function devCommand(args: string[]): Promise<void> {\n const sub = args[0] ?? \"up\";\n const configIndex = args.indexOf(\"--config\");\n const configPath = configIndex !== -1 ? resolve(args[configIndex + 1]!) : resolve(process.cwd(), \"fennec.config.yaml\");\n\n if (sub === \"down\") {\n return devDown();\n }\n if (sub === \"status\") {\n return devStatus();\n }\n if (sub === \"restart\") {\n return devRestart(args.slice(1));\n }\n if (sub !== \"up\") {\n console.error(renderError(\"Unknown sub-command\", `\"${sub}\" — use: up | down | status | restart`));\n process.exit(1);\n }\n\n const config = loadConfig(configPath);\n const apps = config.apps ?? [];\n if (apps.length === 0) {\n console.error(renderError(\"No apps defined\", `Add an \"apps:\" list to ${configPath}`));\n process.exit(1);\n }\n const baseDir = dirname(configPath);\n\n // Topological-ish start: apps without deps first, then dependents.\n const started = new Set<string>();\n const ordered = topoOrder(apps);\n\n // Pre-flight: detect apps in this config that declare the same port.\n const portOwner = new Map<number, string>();\n for (const a of apps) {\n const p = a.waitForPort ?? a.port;\n if (p) {\n const prev = portOwner.get(p);\n if (prev) {\n console.error(renderError(\"Port conflict\", `apps \"${prev}\" and \"${a.name}\" both declare port :${p}`));\n process.exit(1);\n }\n portOwner.set(p, a.name);\n }\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev up\")} ${pc.dim(`— ${apps.length} app(s) from ${configPath}`)}`);\n ensureSupervisorRunning();\n ensurePersistEnabled();\n\n for (const app of ordered) {\n // Wait for declared dependencies' ports.\n for (const dep of app.dependsOn ?? []) {\n const depApp = apps.find((a) => a.name === dep);\n const port = depApp?.waitForPort ?? depApp?.port;\n if (port) {\n const sp = createSpinner(`Waiting for ${dep} :${port}...`);\n const ok = await waitForPort(port);\n sp.stop();\n if (!ok) console.error(` ${pc.yellow(\"⚠\")} ${pc.dim(`${dep} :${port} not ready in time (continuing)`)}`);\n }\n }\n const res = await startApp(app, baseDir);\n const pid = readTracked().find((t) => t.name === app.name)?.pid ?? \"?\";\n const tag =\n res === \"skipped\" ? pc.dim(\"already running (skipped)\")\n : res === \"restarted\" ? pc.yellow(`restarted (PID ${pid})`)\n : res === \"adopted\" ? pc.cyan(`adopted external process on :${app.port ?? app.waitForPort}`)\n : pc.dim(`started (PID ${pid})`);\n console.error(` ${pc.green(\"✓\")} ${pc.bold(app.name)} ${tag}`);\n }\n\n console.error(`\\n ${pc.green(\"✓\")} Stack up. Observe with ${pc.cyan(\"fennec observe\")} or ${pc.cyan(\"fennec dev status\")}.`);\n console.error(` ${pc.dim(\"Apps auto-restart (supervisor) + survive reboot (persist).\")}\\n`);\n}\n\nfunction devDown(): void {\n const tracked = readTracked().filter((t) => t.autoRestart);\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No supervised apps to stop.\")}\\n`);\n return;\n }\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev down\")} ${pc.dim(`— stopping ${tracked.length} app(s)`)}`);\n for (const t of tracked) {\n try {\n if (isTrackedRunning(t)) process.kill(t.pid, \"SIGTERM\");\n } catch { /* best-effort */ }\n // Disable auto-restart so the supervisor doesn't revive them.\n t.autoRestart = false;\n addTracked({ ...t, autoRestart: false });\n console.error(` ${pc.red(\"■\")} ${pc.bold(t.name)}`);\n }\n console.error(`\\n ${pc.green(\"✓\")} Stack stopped (auto-restart disabled). Use ${pc.cyan(\"fennec dev up\")} to bring it back.\\n`);\n}\n\n/** Restart one or more tracked apps (or all auto-restart apps if no names\n * given) in place — the supervisor respawns each from its stored config. */\nfunction devRestart(names: string[]): void {\n ensureSupervisorRunning();\n ensurePersistEnabled();\n const tracked = readTracked();\n const targets = names.length\n ? tracked.filter((t) => names.includes(t.name))\n : tracked.filter((t) => t.autoRestart);\n const missing = names.filter((n) => !tracked.some((t) => t.name === n));\n if (missing.length) {\n console.error(renderError(\"Not tracked\", `No such app(s): ${missing.join(\", \")} — run \"fennec dev status\" to list tracked apps.`));\n }\n if (targets.length === 0) {\n console.error(`\\n ${pc.dim(\"Nothing to restart.\")}\\n`);\n return;\n }\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev restart\")} ${pc.dim(`— ${targets.length} app(s)`)}`);\n for (const t of targets) {\n try {\n const newPid = respawnTracked(t, \"manual\");\n console.error(` ${pc.green(\"✓\")} ${pc.bold(t.name)} ${pc.dim(`restarted (PID ${newPid})`)}`);\n } catch (err) {\n console.error(` ${pc.red(\"✗\")} ${pc.bold(t.name)} ${pc.dim(`restart failed: ${String(err)}`)}`);\n }\n }\n console.error();\n}\n\nfunction devStatus(): void {\n const tracked = readTracked();\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev status\")}`);\n if (tracked.length === 0) {\n console.error(` ${pc.dim(\"Nothing tracked.\")}\\n`);\n return;\n }\n for (const t of tracked) {\n const running = isTrackedRunning(t);\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const state = running ? pc.green(`running (PID ${t.pid})`) : pc.red(\"stopped\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n const cause = t.restartCause ? pc.dim(` · last-restart: ${t.restartCause}`) : \"\";\n const flap = t.flapping ? pc.red(\" · ⚠ flapping\") : \"\";\n console.error(` ${dot} ${pc.bold(t.name)}${portStr} ${pc.dim(\"—\")} ${state}${cause}${flap}`);\n }\n console.error();\n}\n\n/** Order apps so dependencies come before dependents (best-effort, stable). */\nfunction topoOrder(apps: AppConfig[]): AppConfig[] {\n const byName = new Map(apps.map((a) => [a.name, a]));\n const visited = new Set<string>();\n const out: AppConfig[] = [];\n const visit = (app: AppConfig, stack: Set<string>): void => {\n if (visited.has(app.name)) return;\n if (stack.has(app.name)) return; // cycle guard\n stack.add(app.name);\n for (const dep of app.dependsOn ?? []) {\n const d = byName.get(dep);\n if (d) visit(d, stack);\n }\n stack.delete(app.name);\n visited.add(app.name);\n out.push(app);\n };\n for (const app of apps) visit(app, new Set());\n return out;\n}\n","/**\n * Command: log — Show logs for a tracked/managed process.\n * Supports --clear to delete log file, --level to filter by level, and -f for follow mode.\n */\nimport { existsSync, readFileSync, unlinkSync, statSync, openSync, fstatSync, readSync, closeSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport { symbols, renderError, renderAppName, createSpinner } from \"../utils/format.js\";\nimport { readTracked, isTrackedRunning, logFilePathFor } from \"./tracker.js\";\nimport { redactLine, stripAnsi, readLogLines, parseDuration, redactionCount } from \"../utils/redact.js\";\n\n/** Hard cap on lines emitted (token budget) so AI/json inspection stays bounded. */\nconst MAX_LOG_LINES = 500;\n\n/** Known log-level prefixes to color/highlight */\nconst LEVEL_PATTERNS: { level: string; pattern: RegExp }[] = [\n { level: \"error\", pattern: /\\b(ERROR?|FATAL?|CRITICAL?|EXCEPTION)\\b/i },\n { level: \"warn\", pattern: /\\b(WARN(ING)?)\\b/i },\n { level: \"info\", pattern: /\\b(INFO)\\b/i },\n { level: \"debug\", pattern: /\\b(DEBUG)\\b/i },\n];\n\nexport async function logCommand(args: string[]): Promise<void> {\n const target = args[0];\n if (!target || target.startsWith(\"--\")) {\n // No app specified: show available apps so the user knows what to log.\n listAvailableApps();\n return;\n }\n\n const clearFlag = args.includes(\"--clear\");\n const jsonFlag = args.includes(\"--json\");\n const noRedact = args.includes(\"--no-redact\");\n const linesIndex = args.indexOf(\"--lines\");\n const lineCount = linesIndex !== -1 ? Math.min(parseInt(args[linesIndex + 1]!, 10), MAX_LOG_LINES) : 30;\n const followFlag = args.includes(\"-f\") || args.includes(\"--follow\");\n const levelFilter = args.includes(\"--level\") ? args[args.indexOf(\"--level\") + 1]?.toLowerCase() : undefined;\n const sinceIndex = args.indexOf(\"--since\");\n const sinceMs = sinceIndex !== -1 ? parseDuration(args[sinceIndex + 1]!) : undefined;\n\n if (sinceIndex !== -1 && sinceMs === undefined) {\n console.error(renderError(\"Invalid --since\", `Use a duration like 10m, 1h, 30s, 2d`));\n process.exit(1);\n }\n\n // Validate level filter\n if (levelFilter && ![\"error\", \"warn\", \"info\", \"debug\"].includes(levelFilter)) {\n console.error(renderError(\"Invalid level\", `\"${levelFilter}\" is not a valid level. Use: error, warn, info, debug`));\n process.exit(1);\n }\n\n // Secrets are redacted by default (AI-safe). --no-redact opts out.\n const redact = !noRedact;\n\n let logFilePath: string | null = null;\n let displayName = target;\n const tracked = readTracked();\n const trackedMatch = tracked.find((t) => t.name === target || (parseInt(target, 10) === t.pid && !isNaN(parseInt(target, 10))));\n\n if (trackedMatch) {\n displayName = trackedMatch.name;\n logFilePath = logFilePathFor(trackedMatch.name);\n } else {\n const pid = parseInt(target, 10);\n if (!isNaN(pid) && String(pid) === target) {\n const procPath = `/proc/${pid}/fd/1`;\n if (existsSync(procPath)) logFilePath = procPath;\n }\n }\n\n // --clear flag: delete the log file\n if (clearFlag) {\n if (!logFilePath || !existsSync(logFilePath)) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.dim(\"No log file found for\")} ${pc.bold(displayName)}\\n`);\n process.exit(0);\n }\n try {\n unlinkSync(logFilePath);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Log cleared\")} ${pc.dim(`— ${logFilePath}`)}\\n`);\n } catch (err) {\n console.error(renderError(\"Failed to clear log\", String(err)));\n process.exit(1);\n }\n return;\n }\n\n // ── JSON mode (AI): emit machine-readable, redacted, bounded output.\n // Must run BEFORE any human header so stdout stays valid JSON.\n if (jsonFlag) {\n let logLines: string[] = [];\n if (logFilePath && existsSync(logFilePath)) {\n logLines = readLogLines(logFilePath, {\n tail: Math.max(lineCount, sinceMs ? MAX_LOG_LINES : 0),\n sinceMs: sinceMs ?? undefined,\n redact,\n parseTimestamp: true,\n });\n } else {\n const pid = trackedMatch?.pid ?? parseInt(target, 10);\n if (!isNaN(pid)) {\n try {\n const output = execSync(`journalctl --no-pager -n ${Math.max(lineCount, 500)} _PID=${pid} 2>/dev/null || echo \"\"`, { encoding: \"utf-8\", timeout: 3000 });\n logLines = output.trim().split(\"\\n\").filter(Boolean).map((l) => redact ? redactLine(stripAnsi(l)) : stripAnsi(l));\n } catch { logLines = [\"(no logs available)\"]; }\n } else { logLines = [\"(no logs available)\"]; }\n }\n if (levelFilter) {\n const levelRegex = new RegExp(`\\\\b(${levelFilter.toUpperCase()})\\\\b`, \"i\");\n logLines = logLines.filter((line) => levelRegex.test(line));\n }\n const running = trackedMatch ? isTrackedRunning(trackedMatch) : false;\n const sliced = logLines.slice(-lineCount);\n const redactedHits = sliced.reduce((acc, l) => acc + (redactionCount(stripAnsi(l)) > 0 ? 1 : 0), 0);\n const payload = {\n app: displayName,\n running,\n pid: trackedMatch?.pid != null ? trackedMatch.pid : null,\n port: trackedMatch?.port != null ? trackedMatch.port : null,\n lines: sliced,\n count: sliced.length,\n redacted: redact,\n redactedLines: redactedHits,\n note: \"Secrets are redacted by default; use --no-redact to disable.\",\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n return;\n }\n\n // Status header: tell the user whether the app is actually alive.\n if (trackedMatch) {\n const running = isTrackedRunning(trackedMatch);\n const statusStr = running\n ? pc.green(`● running (PID ${trackedMatch.pid})`)\n : pc.red(\"○ stopped\");\n const portStr = trackedMatch.port ? ` ${pc.yellow(`:${trackedMatch.port}`)}` : \"\";\n console.error(`\\n ${symbols.fox} ${renderAppName(displayName)}${portStr} — ${statusStr}`);\n if (!running) {\n console.error(` ${pc.dim(\"This app is not running. Showing last captured logs.\")} ${pc.cyan(`fennec spawn ${displayName}`)} ${pc.dim(\"to restart.\")}`);\n }\n }\n\n const spinner = createSpinner(`Reading logs for ${displayName}...`);\n try {\n let logLines: string[] = [];\n if (logFilePath && existsSync(logFilePath)) {\n logLines = readLogLines(logFilePath, {\n tail: Math.max(lineCount, sinceMs ? MAX_LOG_LINES : 0),\n sinceMs: sinceMs ?? undefined,\n redact,\n parseTimestamp: true,\n });\n } else {\n const pid = trackedMatch?.pid ?? parseInt(target, 10);\n if (!isNaN(pid)) {\n try {\n const output = execSync(`journalctl --no-pager -n ${Math.max(lineCount, 500)} _PID=${pid} 2>/dev/null || echo \"\"`, { encoding: \"utf-8\", timeout: 3000 });\n logLines = output.trim().split(\"\\n\").filter(Boolean).map((l) => redact ? redactLine(stripAnsi(l)) : stripAnsi(l));\n } catch { logLines = [\"(no logs available)\"]; }\n } else { logLines = [\"(no logs available)\"]; }\n }\n\n // Apply level filter\n if (levelFilter) {\n const levelRegex = new RegExp(`\\\\b(${levelFilter.toUpperCase()})\\\\b`, \"i\");\n logLines = logLines.filter((line) => levelRegex.test(line));\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Logs\")} ${renderAppName(displayName)} ${pc.dim(`(last ${logLines.length} line${logLines.length !== 1 ? \"s\" : \"\"})${redact ? pc.dim(\" · secrets redacted\") : \"\"})`)}`);\n\n const sliced = logLines.slice(-lineCount);\n for (const line of sliced) {\n const display = line.length > 300 ? line.slice(0, 300) + \"…\" : line;\n\n // Color by level\n if (line.toLowerCase().includes(\"error\") || line.toLowerCase().includes(\"fail\") || line.toLowerCase().includes(\"fatal\")) {\n console.error(` ${pc.red(display)}`);\n } else if (line.toLowerCase().includes(\"warn\")) {\n console.error(` ${pc.yellow(display)}`);\n } else if (line.toLowerCase().includes(\"info\") || line.includes(\"[\")) {\n console.error(` ${pc.cyan(display)}`);\n } else {\n console.error(` ${display}`);\n }\n }\n\n if (followFlag && logFilePath) {\n await followLog(logFilePath, { redact, levelFilter, json: jsonFlag });\n }\n console.error();\n } catch (error) {\n spinner.fail(`Failed to read logs for ${displayName}`);\n console.error(renderError(\"Log read failed\", String(error)));\n }\n}\n\n/**\n * Portable `tail -f` replacement: prints the initial lines (done by the\n * caller), then polls the file for appended bytes and streams new lines to\n * stderr. Handles log rotation (file shrinks → reset offset). Cross-platform\n * (no `tail` binary dependency). Ctrl+C stops it.\n */\nasync function followLog(\n logFilePath: string,\n opts: { redact: boolean; levelFilter?: string; json: boolean },\n): Promise<void> {\n let lastSize = 0;\n try {\n lastSize = statSync(logFilePath).size;\n } catch { /* file may not exist yet */ }\n\n console.error(`\\n ${pc.dim(\"Following... (Ctrl+C to stop)\")}\\n`);\n const levelRe = opts.levelFilter ? new RegExp(`\\\\b(${opts.levelFilter.toUpperCase()})\\\\b`, \"i\") : null;\n\n const emit = (raw: string): void => {\n const line = opts.redact ? redactLine(raw) : raw;\n if (levelRe && !levelRe.test(line)) return;\n if (opts.json) {\n try {\n process.stdout.write(JSON.stringify(JSON.parse(line)) + \"\\n\");\n return;\n } catch { /* not valid JSON — fall through to plain print */ }\n }\n const display = line.length > 300 ? line.slice(0, 300) + \"…\" : line;\n if (line.toLowerCase().includes(\"error\") || line.toLowerCase().includes(\"fail\") || line.toLowerCase().includes(\"fatal\")) {\n console.error(` ${pc.red(display)}`);\n } else if (line.toLowerCase().includes(\"warn\")) {\n console.error(` ${pc.yellow(display)}`);\n } else if (line.toLowerCase().includes(\"info\") || line.includes(\"[\")) {\n console.error(` ${pc.cyan(display)}`);\n } else {\n console.error(` ${display}`);\n }\n };\n\n const timer = setInterval(() => {\n let fd: number;\n try {\n fd = openSync(logFilePath, \"r\");\n } catch {\n return; // not created yet\n }\n try {\n const size = fstatSync(fd).size;\n if (size < lastSize) lastSize = 0; // rotated\n if (size > lastSize) {\n const buf = Buffer.alloc(size - lastSize);\n readSync(fd, buf, 0, buf.length, lastSize);\n lastSize = size;\n for (const l of buf.toString(\"utf8\").split(\"\\n\")) {\n if (l.length) emit(l);\n }\n }\n } finally {\n closeSync(fd);\n }\n }, 400);\n\n await new Promise<void>((resolve) => {\n const stop = (): void => {\n clearInterval(timer);\n resolve();\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n });\n}\n\n/**\n * When `fennec log` / `fennec logs` is run without an app name, list the\n * tracked apps (with live status) so the user can pick one instead of\n * hitting an error.\n */\nfunction listAvailableApps(): void {\n const tracked = readTracked();\n\n if (tracked.length === 0) {\n console.error(`\\n ${symbols.fox} ${pc.bold(\"No tracked apps to show logs for.\")}`);\n console.error(` ${pc.dim(\"Start one with:\")} ${pc.cyan(\"fennec start <command> --name <name>\")}\\n`);\n return;\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Logs\")} ${pc.dim(\"— pick an app:\")}\\n`);\n for (const t of tracked) {\n const running = isTrackedRunning(t);\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const state = running ? pc.green(`running (PID ${t.pid})`) : pc.red(\"stopped\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n console.error(` ${dot} ${pc.bold(t.name)}${portStr} ${pc.dim(\"—\")} ${state}`);\n console.error(` ${pc.cyan(`fennec log ${t.name}`)} ${pc.dim(\"·\")} ${pc.cyan(`fennec log ${t.name} -f`)}`);\n }\n console.error(`\\n ${pc.dim(\"Flags:\")} ${pc.cyan(\"-f\")} ${pc.dim(\"follow\")} ${pc.dim(\"·\")} ${pc.cyan(\"--lines N\")} ${pc.dim(\"·\")} ${pc.cyan(\"--since 10m|1h\")} ${pc.dim(\"·\")} ${pc.cyan(\"--level error|warn|info|debug\")} ${pc.dim(\"·\")} ${pc.cyan(\"--json\")} ${pc.dim(\"(AI)\")} ${pc.dim(\"·\")} ${pc.cyan(\"--no-redact\")} ${pc.dim(\"·\")} ${pc.cyan(\"--clear\")}`);\n console.error(` ${pc.dim(\"AI mode:\")} ${pc.cyan(\"fennec log <app> --json --since 10m\")} ${pc.dim(\"— bounded, redacted, machine-readable. Secrets are redacted by default.\")}\\n`);\n}\n","/**\n * Command: attach — Attach to a process by port.\n */\nimport { PortDetector } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { renderError, renderKV, renderAppName, createSpinner } from \"../utils/format.js\";\n\nexport async function attachCommand(args: string[]): Promise<void> {\n const port = parseInt(args[0]!, 10);\n if (isNaN(port)) { console.error(renderError(\"Invalid port\", \"Usage: fennec attach <port> --name <name>\")); process.exit(1); }\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 try {\n const detector = new PortDetector();\n const info = detector.detectByPort(port);\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 — List saved auth sessions.\n */\nimport { SessionStore } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { symbols, renderTable, type Column, type Row } from \"../utils/format.js\";\n\nexport async function sessionsCommand(): Promise<void> {\n const store = new SessionStore(\"./.fennec/sessions\");\n const sessions = store.list();\n if (sessions.length === 0) { console.error(`\\n ${pc.dim(\"No saved sessions found.\")}\\n`); return; }\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 const rows: Row[] = sessions.map((s) => ({ name: s.name, origin: s.origin, savedAt: new Date(s.savedAt).toLocaleString() }));\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 — Interactive MCP client setup.\n */\nimport pc from \"picocolors\";\nimport { symbols, renderSuccess, renderCommand, selectPrompt } from \"../utils/format.js\";\n\nexport async 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) { console.error(` ${pc.dim(\"Setup cancelled.\")}\\n`); return; }\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: init, install-browsers — Project setup utilities.\n */\nimport { existsSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport { renderCommand, renderError, renderSuccess, createSpinner, confirmPrompt } from \"../utils/format.js\";\n\nexport async function installBrowsersCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Installing Browser Engines\")}\\n`);\n const spinner = createSpinner(\"Installing Chromium...\");\n try {\n execSync(\"npx playwright install chromium\", { stdio: \"pipe\", timeout: 120000 });\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 console.error(`\\n ${pc.green(\"✓\")} Browser installation complete.\\n`);\n}\n\nexport async function initCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Initialize Fennec Configuration\")}\\n`);\n\n const configFile = resolve(\"./fennec.config.yaml\");\n if (existsSync(configFile)) {\n const overwrite = await confirmPrompt(`${pc.yellow(\"fennec.config.yaml\")} already exists. Overwrite?`, false);\n if (!overwrite) { console.error(` ${pc.dim(\"Cancelled.\")}\\n`); return; }\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 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 * Command: health — Check Fennec system health\n * Returns system status, tracked processes, and resource info.\n */\nimport { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport pc from \"picocolors\";\nimport { printBanner } from \"../utils/banner.js\";\nimport { symbols, renderKV, renderError } from \"../utils/format.js\";\nimport { readTracked } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function healthCommand(): Promise<void> {\n printBanner();\n console.error(` ${pc.bold(\"Fennec Health Check\")}\\n`);\n\n // 1. ADB availability (if needed)\n let adbStatus = \"unknown\";\n try {\n const result = execSync(\"adb --version\", {\n encoding: \"utf-8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const version = result.split(\"\\n\")[0]?.trim() ?? \"installed\";\n adbStatus = pc.green(version);\n } catch {\n adbStatus = pc.dim(\"not found\") + \" (optional)\";\n }\n\n // 2. Tracked processes\n const tracked = readTracked();\n const runningCount = tracked.filter((t) => isProcessRunning(t.pid)).length;\n\n // 3. Disk usage for logs\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n let logSize = \"0 B\";\n try {\n if (existsSync(logDir)) {\n const files = readdirSync(logDir);\n let totalBytes = 0;\n for (const f of files) {\n const fStat = statSync(resolve(logDir, f));\n totalBytes += fStat.size;\n }\n logSize = totalBytes > 1024 * 1024\n ? `${(totalBytes / (1024 * 1024)).toFixed(1)} MB`\n : `${(totalBytes / 1024).toFixed(1)} KB`;\n }\n } catch { /* best-effort */ }\n\n // 4. Memory info\n let memoryInfo = \"unknown\";\n try {\n const mem = process.memoryUsage();\n memoryInfo = `${(mem.rss / (1024 * 1024)).toFixed(0)} MB RSS / ${(mem.heapUsed / (1024 * 1024)).toFixed(0)} MB heap`;\n } catch { /* best-effort */ }\n\n console.error(` ${symbols.fox} ${pc.bold(\"System\")}\\n`);\n console.error(` ${renderKV(\"Node.js\", process.version)}`);\n console.error(` ${renderKV(\"Platform\", `${process.platform} ${process.arch}`)}`);\n console.error(` ${renderKV(\"Memory\", memoryInfo)}`);\n console.error(` ${renderKV(\"ADB\", adbStatus)}`);\n console.error(` ${renderKV(\"PID\", String(process.pid))}`);\n console.error();\n console.error(` ${symbols.fox} ${pc.bold(\"Processes\")}\\n`);\n console.error(` ${renderKV(\"Tracked\", String(tracked.length))}`);\n console.error(` ${renderKV(\"Running\", String(runningCount))}`);\n console.error(` ${renderKV(\"Logs\", logSize)}`);\n console.error();\n\n const allHealthy = runningCount === tracked.length || tracked.length === 0;\n if (allHealthy) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(\"All systems healthy\")}\\n`);\n } else {\n const stopped = tracked.length - runningCount;\n console.error(` ${pc.yellow(\"⚠\")} ${pc.bold(`${stopped} process(es) stopped`)} ${pc.dim(\"fennec ps\")}\\n`);\n }\n}\n","/**\n * Command: cleanup — Remove dead tracked entries that have no saved command\n * and cannot be re-spawned.\n */\nimport pc from \"picocolors\";\nimport { renderError, confirmPrompt } from \"../utils/format.js\";\nimport { readTracked, saveTracked } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function cleanupCommand(): Promise<void> {\n const tracked = readTracked();\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes to clean up.\")}\\n`);\n return;\n }\n\n const toRemove = tracked.filter((t) => !isProcessRunning(t.pid) && !t.command);\n if (toRemove.length === 0) {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"All clean\")} ${pc.dim(\"— no dead entries without saved commands.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(`Found ${toRemove.length} dead entr${toRemove.length > 1 ? \"ies\" : \"y\"} without saved commands`)}\\n`);\n for (const entry of toRemove) {\n console.error(` ${pc.dim(\"·\")} ${pc.bold(entry.name)} ${pc.dim(`(PID ${entry.pid})`)}`);\n }\n console.error();\n\n const confirmed = await confirmPrompt(`Remove ${toRemove.length} entr${toRemove.length > 1 ? \"ies\" : \"y\"}?`, false);\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n const remaining = tracked.filter((t) => !toRemove.includes(t));\n saveTracked(remaining);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(`Removed ${toRemove.length} entr${toRemove.length > 1 ? \"ies\" : \"y\"}`)} ${pc.dim(`(${remaining.length} remaining)`)}\\n`);\n}\n","/**\n * Command: info — Show detailed info about a tracked process.\n */\nimport pc from \"picocolors\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderKVColor, symbols } from \"../utils/format.js\";\nimport { readTracked, formatUptime } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function infoCommand(args: string[]): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error(renderError(\"Missing name\", \"Usage: fennec info <name>\"));\n process.exit(1);\n }\n\n const tracked = readTracked();\n const match = tracked.find((t) => t.name === name);\n\n if (!match) {\n console.error(renderError(\"Not found\", `No tracked process named \"${name}\".`));\n process.exit(1);\n }\n\n const running = isProcessRunning(match.pid);\n const statusIcon = running ? pc.green(\"●\") : pc.red(\"○\");\n const statusText = running ? pc.green(\"running\") : pc.red(\"stopped\");\n const uptime = running\n ? formatUptime(Math.floor((Date.now() - new Date(match.startedAt).getTime()) / 1000))\n : \"-\";\n const logPath = resolve(homedir(), \".fennec\", \"logs\", `${match.name}.log`);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(match.name)} ${pc.dim(\"— Process Info\")}\\n`);\n console.error(` ${renderKVColor(\"Name\", match.name, pc.bold)}`);\n console.error(` ${renderKVColor(\"Status\", `${statusIcon} ${statusText}`)}`);\n console.error(` ${renderKVColor(\"PID\", String(match.pid))}`);\n console.error(` ${renderKVColor(\"Port\", match.port ? String(match.port) : \"-\")}`);\n console.error(` ${renderKVColor(\"Command\", match.command || pc.dim(\"(none)\"))}`);\n if (match.cwd) console.error(` ${renderKVColor(\"CWD\", match.cwd)}`);\n console.error(` ${renderKVColor(\"Started\", new Date(match.startedAt).toLocaleString())}`);\n console.error(` ${renderKVColor(\"Uptime\", uptime)}`);\n console.error(` ${renderKVColor(\"Log Path\", logPath)}`);\n\n if (!running && match.command) {\n console.error(`\\n ${pc.dim(\"Re-spawn with:\")} ${pc.cyan(`fennec spawn ${match.name}`)}`);\n }\n console.error();\n}\n","/**\n * Command: rename — Rename a tracked process and its log file.\n */\nimport pc from \"picocolors\";\nimport { existsSync, renameSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderKVColor, createSpinner, confirmPrompt, symbols } from \"../utils/format.js\";\nimport { readTracked, saveTracked } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function renameCommand(args: string[]): Promise<void> {\n const [oldName, newName] = args;\n\n if (!oldName || !newName) {\n console.error(renderError(\"Missing arguments\", \"Usage: fennec rename <old-name> <new-name>\"));\n process.exit(1);\n }\n\n if (oldName === newName) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.dim(\"Old and new names are the same.\")}\\n`);\n process.exit(0);\n }\n\n const tracked = readTracked();\n const match = tracked.find((t) => t.name === oldName);\n\n if (!match) {\n console.error(renderError(\"Not found\", `No tracked process named \"${oldName}\".`));\n process.exit(1);\n }\n\n if (tracked.some((t) => t.name === newName)) {\n console.error(renderError(\"Name taken\", `A process named \"${newName}\" already exists.`));\n process.exit(1);\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Rename Process\")}\\n`);\n console.error(` ${renderKVColor(\"From\", oldName)}`);\n console.error(` ${renderKVColor(\"To\", newName)}`);\n if (isProcessRunning(match.pid)) {\n console.error(` ${pc.yellow(\"⚠\")} ${pc.dim(\"Process is still running — log entries will go to the old file until stopped.\")}`);\n }\n console.error();\n\n const confirmed = await confirmPrompt(`Rename ${pc.bold(oldName)} ${pc.dim(\"→\")} ${pc.bold(newName)}?`, true);\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n const spinner = createSpinner(`Renaming ${oldName} → ${newName}...`);\n\n // Rename log file if it exists\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n const oldLog = resolve(logDir, `${oldName}.log`);\n const newLog = resolve(logDir, `${newName}.log`);\n\n if (existsSync(oldLog) && !existsSync(newLog)) {\n try {\n renameSync(oldLog, newLog);\n } catch { /* best-effort */ }\n }\n\n // Update tracked.json\n match.name = newName;\n saveTracked(tracked);\n\n spinner.succeed(`${pc.bold(oldName)} ${pc.dim(\"→\")} ${pc.bold(newName)}`);\n console.error();\n}\n","/**\n * Commands: export, import — Backup and restore tracked.json configuration.\n */\nimport pc from \"picocolors\";\nimport { existsSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { renderError, confirmPrompt, symbols, renderKVColor } from \"../utils/format.js\";\nimport { readTracked, saveTracked } from \"./tracker.js\";\n\n/**\n * fennec export [--file path]\n * Export tracked.json to stdout or a file.\n */\nexport async function exportCommand(args: string[]): Promise<void> {\n const tracked = readTracked();\n const fileIndex = args.indexOf(\"--file\");\n const filePath = fileIndex !== -1 ? args[fileIndex + 1] : undefined;\n\n if (fileIndex !== -1 && !filePath) {\n console.error(renderError(\"Missing file path\", \"Usage: fennec export --file <path>\"));\n process.exit(1);\n }\n\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes to export.\")}\\n`);\n return;\n }\n\n const json = JSON.stringify(tracked, null, 2);\n\n if (filePath) {\n try {\n writeFileSync(resolve(filePath), json, \"utf-8\");\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(`Exported ${tracked.length} process(es)`)} ${pc.dim(`→ ${filePath}`)}\\n`);\n } catch (err) {\n console.error(renderError(\"Export failed\", String(err)));\n process.exit(1);\n }\n } else {\n // Write to stdout as JSON\n console.log(json);\n }\n}\n\n/**\n * fennec import <file>\n * Import processes from a JSON file and merge into tracked.json.\n */\nexport async function importCommand(args: string[]): Promise<void> {\n const filePath = args[0];\n\n if (!filePath) {\n console.error(renderError(\"Missing file\", \"Usage: fennec import <file>\"));\n process.exit(1);\n }\n\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n console.error(renderError(\"File not found\", `\"${filePath}\" does not exist.`));\n process.exit(1);\n }\n\n let imported: { name: string; pid: number; command: string; port?: number; cwd?: string; startedAt: string }[];\n try {\n imported = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (!Array.isArray(imported) || imported.length === 0) {\n console.error(renderError(\"Invalid file\", \"File must contain a non-empty JSON array of process objects.\"));\n process.exit(1);\n }\n } catch (err) {\n console.error(renderError(\"Invalid JSON\", String(err)));\n process.exit(1);\n }\n\n const existing = readTracked();\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Import Processes\")}\\n`);\n console.error(` ${renderKVColor(\"File\", resolvedPath)}`);\n console.error(` ${renderKVColor(\"Importing\", `${imported.length} process(es)`)}`);\n console.error(` ${renderKVColor(\"Existing\", `${existing.length} process(es)`)}`);\n\n // Show what will be imported\n console.error(`\\n ${pc.bold(\"Processes to import:\")}`);\n for (const p of imported) {\n console.error(` ${pc.green(\"+\")} ${pc.bold(p.name)} ${pc.dim(`(${p.command})`)}`);\n }\n console.error();\n\n const confirmed = await confirmPrompt(\"Merge into tracked.json? Existing processes with the same name will be overwritten.\", true);\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n // Merge: overwrite existing by name, add new\n const merged = [...existing];\n for (const proc of imported) {\n const idx = merged.findIndex((t) => t.name === proc.name);\n if (idx !== -1) {\n merged[idx] = { ...merged[idx], ...proc };\n } else {\n merged.push(proc as any);\n }\n }\n\n saveTracked(merged);\n console.error(` ${pc.green(\"✓\")} ${pc.bold(`Imported ${imported.length} process(es)`)} ${pc.dim(`(${merged.length} total)`)}\\n`);\n}\n","#!/usr/bin/env node\n\nimport { renderError } from \"./utils/format.js\";\nimport { printBanner } from \"./utils/banner.js\";\nimport { showHelp, showCommandHelp } 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 { startServer, startCommand, runCommand } from \"./commands/start.js\";\nimport { psCommand, statusCommand } from \"./commands/ps.js\";\nimport { killCommand } from \"./commands/kill.js\";\nimport { stopCommand } from \"./commands/stop.js\";\nimport { spawnCommand } from \"./commands/spawn.js\";\nimport { restartCommand } from \"./commands/restart.js\";\nimport { adoptCommand } from \"./commands/adopt.js\";\nimport { supervisorCommand, runSupervisor } from \"./commands/supervisor.js\";\nimport { persistCommand } from \"./commands/persist.js\";\nimport { inspectCommand } from \"./commands/inspect.js\";\nimport { devCommand } from \"./commands/dev.js\";\nimport { logCommand } from \"./commands/log.js\";\nimport { attachCommand } from \"./commands/attach.js\";\nimport { sessionsCommand } from \"./commands/sessions.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { installBrowsersCommand, initCommand } from \"./commands/management.js\";\nimport { healthCommand } from \"./commands/health.js\";\nimport { cleanupCommand } from \"./commands/cleanup.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { renameCommand } from \"./commands/rename.js\";\nimport { exportCommand, importCommand } from \"./commands/export-import.js\";\n\nconst [, , command, ...args] = process.argv;\n\nasync function main(): Promise<void> {\n // Per-command help: `fennec <command> --help` / `-h` (but not bare `start`,\n // which is the server, and not the help command itself).\n if (\n command &&\n command !== \"help\" &&\n command !== \"--help\" &&\n command !== \"-h\" &&\n (args.includes(\"--help\") || args.includes(\"-h\"))\n ) {\n printBanner();\n showCommandHelp(command);\n return;\n }\n\n if (!command || command === \"start\") {\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 printBanner();\n await psCommand(args);\n } else if (command === \"status\") {\n printBanner();\n await statusCommand(args);\n } else if (command === \"log\" || command === \"logs\") {\n await logCommand(args);\n } else if (command === \"spawn\") {\n await spawnCommand(args);\n } else if (command === \"stop\") {\n await stopCommand(args);\n } else if (command === \"kill\") {\n await killCommand(args);\n } else if (command === \"restart\") {\n await restartCommand(args);\n } else if (command === \"adopt\") {\n adoptCommand(args);\n } else if (command === \"supervisor\") {\n printBanner();\n await supervisorCommand(args);\n } else if (command === \"__supervisor\") {\n await runSupervisor();\n } else if (command === \"persist\") {\n printBanner();\n await persistCommand(args);\n } else if (command === \"inspect\") {\n await inspectCommand(args);\n } else if (command === \"dev\") {\n printBanner();\n await devCommand(args);\n } else if (command === \"info\") {\n printBanner();\n await infoCommand(args);\n } else if (command === \"cleanup\") {\n printBanner();\n await cleanupCommand();\n } else if (command === \"rename\") {\n await renameCommand(args);\n } else if (command === \"export\") {\n await exportCommand(args);\n } else if (command === \"import\") {\n await importCommand(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 === \"health\" || command === \"--health\") {\n await healthCommand();\n } else if (command === \"init\") {\n printBanner();\n await initCommand();\n } else if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n printBanner();\n } else if (command === \"help\" || command === \"--help\" || command === \"-h\") {\n printBanner();\n if (args[0] && !args[0].startsWith(\"-\")) {\n showCommandHelp(args[0]);\n } else {\n showHelp();\n }\n } else {\n console.error(renderError(`Unknown command: ${command}`, \"Run 'fennec help' for usage information\"));\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(renderError(\"Fatal error\", String(error)));\n process.exit(1);\n});\n"],"mappings":"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","names":["stripAnsi","pad","text","options","colors","colors","colors","colors","colors","stylize","builder","args","style","sequencer","map","colors","colors","args","pad","CliTable3","num","resolve","pc","fennecOrange","pc","fennecOrange","pc","args","args","PortDetector","args","args","mkdirSync","resolve","dirname","pc","existsSync","readFileSync","resolve","existsSync","command","resolve","existsSync","resolve","existsSync","readFileSync","command","pc","existsSync","readFileSync","writeFileSync","mkdirSync","openSync","closeSync","spawn","dirname","existsSync","readFileSync","mkdirSync","dirname","openSync","spawn","closeSync","args","pc","writeFileSync","rec","pc","existsSync","writeFileSync","unlinkSync","mkdirSync","resolve","dirname","homedir","resolve","homedir","args","existsSync","mkdirSync","dirname","writeFileSync","pc","unlinkSync","pc","args","pc","columns","rows","resolve","args","pc","resolve","dirname","mkdirSync","pc","args","pc","pc","args","pc","pc","mkdirSync","resolve","homedir","args","pc","resolve","homedir","mkdirSync","pc","mkdirSync","resolve","homedir","args","pc","resolve","homedir","mkdirSync","pc","args","pc","readFileSync","pc","existsSync","readFileSync","readFileSync","args","pc","pc","existsSync","readFileSync","resolve","dirname","existsSync","readFileSync","resolve","pc","args","dirname","existsSync","unlinkSync","statSync","openSync","closeSync","execSync","pc","args","existsSync","pc","unlinkSync","execSync","statSync","openSync","closeSync","resolve","PortDetector","pc","args","PortDetector","pc","pc","pc","pc","pc","existsSync","writeFileSync","resolve","execSync","pc","pc","execSync","resolve","existsSync","writeFileSync","existsSync","readdirSync","statSync","execSync","resolve","homedir","pc","pc","execSync","resolve","homedir","existsSync","readdirSync","statSync","pc","pc","pc","resolve","homedir","args","pc","resolve","homedir","pc","existsSync","renameSync","resolve","homedir","args","pc","resolve","homedir","existsSync","renameSync","pc","existsSync","writeFileSync","readFileSync","resolve","args","pc","writeFileSync","resolve","existsSync","readFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/debug.js","../../../node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js","../../../node_modules/.pnpm/strip-ansi@6.0.1/node_modules/strip-ansi/index.js","../../../node_modules/.pnpm/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js","../../../node_modules/.pnpm/emoji-regex@8.0.0/node_modules/emoji-regex/index.js","../../../node_modules/.pnpm/string-width@4.2.3/node_modules/string-width/index.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/utils.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/styles.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/has-flag.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/supports-colors.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/trap.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/zalgo.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/america.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/zebra.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/rainbow.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/random.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/lib/colors.js","../../../node_modules/.pnpm/@colors+colors@1.5.0/node_modules/@colors/colors/safe.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/cell.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/layout-manager.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/src/table.js","../../../node_modules/.pnpm/cli-table3@0.6.5/node_modules/cli-table3/index.js","../src/utils/format.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/commands/start.ts","../src/commands/tracker.ts","../src/utils/system-process.ts","../src/commands/supervisor.ts","../src/commands/persist.ts","../src/commands/ps.ts","../src/commands/kill.ts","../src/commands/stop.ts","../src/commands/spawn.ts","../src/commands/restart.ts","../src/commands/adopt.ts","../src/commands/inspect.ts","../src/utils/redact.ts","../src/commands/dev.ts","../src/commands/log.ts","../src/commands/attach.ts","../src/commands/store.ts","../src/commands/doctor.ts","../src/commands/setup.ts","../src/commands/management.ts","../src/commands/health.ts","../src/commands/cleanup.ts","../src/commands/info.ts","../src/commands/rename.ts","../src/commands/export-import.ts","../src/commands/group.ts","../src/index.ts"],"sourcesContent":["let messages = [];\nlet level = 0;\n\nconst debug = (msg, min) => {\n if (level >= min) {\n messages.push(msg);\n }\n};\n\ndebug.WARN = 1;\ndebug.INFO = 2;\ndebug.DEBUG = 3;\n\ndebug.reset = () => {\n messages = [];\n};\n\ndebug.setDebugLevel = (v) => {\n level = v;\n};\n\ndebug.warn = (msg) => debug(msg, debug.WARN);\ndebug.info = (msg) => debug(msg, debug.INFO);\ndebug.debug = (msg) => debug(msg, debug.DEBUG);\n\ndebug.debugMessages = () => messages;\n\nmodule.exports = debug;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","const stringWidth = require('string-width');\n\nfunction codeRegex(capture) {\n return capture ? /\\u001b\\[((?:\\d*;){0,5}\\d*)m/g : /\\u001b\\[(?:\\d*;){0,5}\\d*m/g;\n}\n\nfunction strlen(str) {\n let code = codeRegex();\n let stripped = ('' + str).replace(code, '');\n let split = stripped.split('\\n');\n return split.reduce(function (memo, s) {\n return stringWidth(s) > memo ? stringWidth(s) : memo;\n }, 0);\n}\n\nfunction repeat(str, times) {\n return Array(times + 1).join(str);\n}\n\nfunction pad(str, len, pad, dir) {\n let length = strlen(str);\n if (len + 1 >= length) {\n let padlen = len - length;\n switch (dir) {\n case 'right': {\n str = repeat(pad, padlen) + str;\n break;\n }\n case 'center': {\n let right = Math.ceil(padlen / 2);\n let left = padlen - right;\n str = repeat(pad, left) + str + repeat(pad, right);\n break;\n }\n default: {\n str = str + repeat(pad, padlen);\n break;\n }\n }\n }\n return str;\n}\n\nlet codeCache = {};\n\nfunction addToCodeCache(name, on, off) {\n on = '\\u001b[' + on + 'm';\n off = '\\u001b[' + off + 'm';\n codeCache[on] = { set: name, to: true };\n codeCache[off] = { set: name, to: false };\n codeCache[name] = { on: on, off: off };\n}\n\n//https://github.com/Marak/colors.js/blob/master/lib/styles.js\naddToCodeCache('bold', 1, 22);\naddToCodeCache('italics', 3, 23);\naddToCodeCache('underline', 4, 24);\naddToCodeCache('inverse', 7, 27);\naddToCodeCache('strikethrough', 9, 29);\n\nfunction updateState(state, controlChars) {\n let controlCode = controlChars[1] ? parseInt(controlChars[1].split(';')[0]) : 0;\n if ((controlCode >= 30 && controlCode <= 39) || (controlCode >= 90 && controlCode <= 97)) {\n state.lastForegroundAdded = controlChars[0];\n return;\n }\n if ((controlCode >= 40 && controlCode <= 49) || (controlCode >= 100 && controlCode <= 107)) {\n state.lastBackgroundAdded = controlChars[0];\n return;\n }\n if (controlCode === 0) {\n for (let i in state) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(state, i)) {\n delete state[i];\n }\n }\n return;\n }\n let info = codeCache[controlChars[0]];\n if (info) {\n state[info.set] = info.to;\n }\n}\n\nfunction readState(line) {\n let code = codeRegex(true);\n let controlChars = code.exec(line);\n let state = {};\n while (controlChars !== null) {\n updateState(state, controlChars);\n controlChars = code.exec(line);\n }\n return state;\n}\n\nfunction unwindState(state, ret) {\n let lastBackgroundAdded = state.lastBackgroundAdded;\n let lastForegroundAdded = state.lastForegroundAdded;\n\n delete state.lastBackgroundAdded;\n delete state.lastForegroundAdded;\n\n Object.keys(state).forEach(function (key) {\n if (state[key]) {\n ret += codeCache[key].off;\n }\n });\n\n if (lastBackgroundAdded && lastBackgroundAdded != '\\u001b[49m') {\n ret += '\\u001b[49m';\n }\n if (lastForegroundAdded && lastForegroundAdded != '\\u001b[39m') {\n ret += '\\u001b[39m';\n }\n\n return ret;\n}\n\nfunction rewindState(state, ret) {\n let lastBackgroundAdded = state.lastBackgroundAdded;\n let lastForegroundAdded = state.lastForegroundAdded;\n\n delete state.lastBackgroundAdded;\n delete state.lastForegroundAdded;\n\n Object.keys(state).forEach(function (key) {\n if (state[key]) {\n ret = codeCache[key].on + ret;\n }\n });\n\n if (lastBackgroundAdded && lastBackgroundAdded != '\\u001b[49m') {\n ret = lastBackgroundAdded + ret;\n }\n if (lastForegroundAdded && lastForegroundAdded != '\\u001b[39m') {\n ret = lastForegroundAdded + ret;\n }\n\n return ret;\n}\n\nfunction truncateWidth(str, desiredLength) {\n if (str.length === strlen(str)) {\n return str.substr(0, desiredLength);\n }\n\n while (strlen(str) > desiredLength) {\n str = str.slice(0, -1);\n }\n\n return str;\n}\n\nfunction truncateWidthWithAnsi(str, desiredLength) {\n let code = codeRegex(true);\n let split = str.split(codeRegex());\n let splitIndex = 0;\n let retLen = 0;\n let ret = '';\n let myArray;\n let state = {};\n\n while (retLen < desiredLength) {\n myArray = code.exec(str);\n let toAdd = split[splitIndex];\n splitIndex++;\n if (retLen + strlen(toAdd) > desiredLength) {\n toAdd = truncateWidth(toAdd, desiredLength - retLen);\n }\n ret += toAdd;\n retLen += strlen(toAdd);\n\n if (retLen < desiredLength) {\n if (!myArray) {\n break;\n } // full-width chars may cause a whitespace which cannot be filled\n ret += myArray[0];\n updateState(state, myArray);\n }\n }\n\n return unwindState(state, ret);\n}\n\nfunction truncate(str, desiredLength, truncateChar) {\n truncateChar = truncateChar || '…';\n let lengthOfStr = strlen(str);\n if (lengthOfStr <= desiredLength) {\n return str;\n }\n desiredLength -= strlen(truncateChar);\n\n let ret = truncateWidthWithAnsi(str, desiredLength);\n\n ret += truncateChar;\n\n const hrefTag = '\\x1B]8;;\\x07';\n\n if (str.includes(hrefTag) && !ret.includes(hrefTag)) {\n ret += hrefTag;\n }\n\n return ret;\n}\n\nfunction defaultOptions() {\n return {\n chars: {\n top: '─',\n 'top-mid': '┬',\n 'top-left': '┌',\n 'top-right': '┐',\n bottom: '─',\n 'bottom-mid': '┴',\n 'bottom-left': '└',\n 'bottom-right': '┘',\n left: '│',\n 'left-mid': '├',\n mid: '─',\n 'mid-mid': '┼',\n right: '│',\n 'right-mid': '┤',\n middle: '│',\n },\n truncate: '…',\n colWidths: [],\n rowHeights: [],\n colAligns: [],\n rowAligns: [],\n style: {\n 'padding-left': 1,\n 'padding-right': 1,\n head: ['red'],\n border: ['grey'],\n compact: false,\n },\n head: [],\n };\n}\n\nfunction mergeOptions(options, defaults) {\n options = options || {};\n defaults = defaults || defaultOptions();\n let ret = Object.assign({}, defaults, options);\n ret.chars = Object.assign({}, defaults.chars, options.chars);\n ret.style = Object.assign({}, defaults.style, options.style);\n return ret;\n}\n\n// Wrap on word boundary\nfunction wordWrap(maxLength, input) {\n let lines = [];\n let split = input.split(/(\\s+)/g);\n let line = [];\n let lineLength = 0;\n let whitespace;\n for (let i = 0; i < split.length; i += 2) {\n let word = split[i];\n let newLength = lineLength + strlen(word);\n if (lineLength > 0 && whitespace) {\n newLength += whitespace.length;\n }\n if (newLength > maxLength) {\n if (lineLength !== 0) {\n lines.push(line.join(''));\n }\n line = [word];\n lineLength = strlen(word);\n } else {\n line.push(whitespace || '', word);\n lineLength = newLength;\n }\n whitespace = split[i + 1];\n }\n if (lineLength) {\n lines.push(line.join(''));\n }\n return lines;\n}\n\n// Wrap text (ignoring word boundaries)\nfunction textWrap(maxLength, input) {\n let lines = [];\n let line = '';\n function pushLine(str, ws) {\n if (line.length && ws) line += ws;\n line += str;\n while (line.length > maxLength) {\n lines.push(line.slice(0, maxLength));\n line = line.slice(maxLength);\n }\n }\n let split = input.split(/(\\s+)/g);\n for (let i = 0; i < split.length; i += 2) {\n pushLine(split[i], i && split[i - 1]);\n }\n if (line.length) lines.push(line);\n return lines;\n}\n\nfunction multiLineWordWrap(maxLength, input, wrapOnWordBoundary = true) {\n let output = [];\n input = input.split('\\n');\n const handler = wrapOnWordBoundary ? wordWrap : textWrap;\n for (let i = 0; i < input.length; i++) {\n output.push.apply(output, handler(maxLength, input[i]));\n }\n return output;\n}\n\nfunction colorizeLines(input) {\n let state = {};\n let output = [];\n for (let i = 0; i < input.length; i++) {\n let line = rewindState(state, input[i]);\n state = readState(line);\n let temp = Object.assign({}, state);\n output.push(unwindState(temp, line));\n }\n return output;\n}\n\n/**\n * Credit: Matheus Sampaio https://github.com/matheussampaio\n */\nfunction hyperlink(url, text) {\n const OSC = '\\u001B]';\n const BEL = '\\u0007';\n const SEP = ';';\n\n return [OSC, '8', SEP, SEP, url || text, BEL, text, OSC, '8', SEP, SEP, BEL].join('');\n}\n\nmodule.exports = {\n strlen: strlen,\n repeat: repeat,\n pad: pad,\n truncate: truncate,\n mergeOptions: mergeOptions,\n wordWrap: multiLineWordWrap,\n colorizeLines: colorizeLines,\n hyperlink,\n};\n","/*\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\nvar styles = {};\nmodule['exports'] = styles;\n\nvar codes = {\n reset: [0, 0],\n\n bold: [1, 22],\n dim: [2, 22],\n italic: [3, 23],\n underline: [4, 24],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n gray: [90, 39],\n grey: [90, 39],\n\n brightRed: [91, 39],\n brightGreen: [92, 39],\n brightYellow: [93, 39],\n brightBlue: [94, 39],\n brightMagenta: [95, 39],\n brightCyan: [96, 39],\n brightWhite: [97, 39],\n\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49],\n bgGray: [100, 49],\n bgGrey: [100, 49],\n\n bgBrightRed: [101, 49],\n bgBrightGreen: [102, 49],\n bgBrightYellow: [103, 49],\n bgBrightBlue: [104, 49],\n bgBrightMagenta: [105, 49],\n bgBrightCyan: [106, 49],\n bgBrightWhite: [107, 49],\n\n // legacy styles for colors pre v1.0.0\n blackBG: [40, 49],\n redBG: [41, 49],\n greenBG: [42, 49],\n yellowBG: [43, 49],\n blueBG: [44, 49],\n magentaBG: [45, 49],\n cyanBG: [46, 49],\n whiteBG: [47, 49],\n\n};\n\nObject.keys(codes).forEach(function(key) {\n var val = codes[key];\n var style = styles[key] = [];\n style.open = '\\u001b[' + val[0] + 'm';\n style.close = '\\u001b[' + val[1] + 'm';\n});\n","/*\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n'use strict';\n\nmodule.exports = function(flag, argv) {\n argv = argv || process.argv;\n\n var terminatorPos = argv.indexOf('--');\n var prefix = /^-{1,2}/.test(flag) ? '' : '--';\n var pos = argv.indexOf(prefix + flag);\n\n return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);\n};\n","/*\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\n'use strict';\n\nvar os = require('os');\nvar hasFlag = require('./has-flag.js');\n\nvar env = process.env;\n\nvar forceColor = void 0;\nif (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) {\n forceColor = false;\n} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true')\n || hasFlag('color=always')) {\n forceColor = true;\n}\nif ('FORCE_COLOR' in env) {\n forceColor = env.FORCE_COLOR.length === 0\n || parseInt(env.FORCE_COLOR, 10) !== 0;\n}\n\nfunction translateLevel(level) {\n if (level === 0) {\n return false;\n }\n\n return {\n level: level,\n hasBasic: true,\n has256: level >= 2,\n has16m: level >= 3,\n };\n}\n\nfunction supportsColor(stream) {\n if (forceColor === false) {\n return 0;\n }\n\n if (hasFlag('color=16m') || hasFlag('color=full')\n || hasFlag('color=truecolor')) {\n return 3;\n }\n\n if (hasFlag('color=256')) {\n return 2;\n }\n\n if (stream && !stream.isTTY && forceColor !== true) {\n return 0;\n }\n\n var min = forceColor ? 1 : 0;\n\n if (process.platform === 'win32') {\n // Node.js 7.5.0 is the first version of Node.js to include a patch to\n // libuv that enables 256 color output on Windows. Anything earlier and it\n // won't work. However, here we target Node.js 8 at minimum as it is an LTS\n // release, and Node.js 7 is not. Windows 10 build 10586 is the first\n // Windows release that supports 256 colors. Windows 10 build 14931 is the\n // first release that supports 16m/TrueColor.\n var osRelease = os.release().split('.');\n if (Number(process.versions.node.split('.')[0]) >= 8\n && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {\n return Number(osRelease[2]) >= 14931 ? 3 : 2;\n }\n\n return 1;\n }\n\n if ('CI' in env) {\n if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) {\n return sign in env;\n }) || env.CI_NAME === 'codeship') {\n return 1;\n }\n\n return min;\n }\n\n if ('TEAMCITY_VERSION' in env) {\n return (/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0\n );\n }\n\n if ('TERM_PROGRAM' in env) {\n var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n switch (env.TERM_PROGRAM) {\n case 'iTerm.app':\n return version >= 3 ? 3 : 2;\n case 'Hyper':\n return 3;\n case 'Apple_Terminal':\n return 2;\n // No default\n }\n }\n\n if (/-256(color)?$/i.test(env.TERM)) {\n return 2;\n }\n\n if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n return 1;\n }\n\n if ('COLORTERM' in env) {\n return 1;\n }\n\n if (env.TERM === 'dumb') {\n return min;\n }\n\n return min;\n}\n\nfunction getSupportLevel(stream) {\n var level = supportsColor(stream);\n return translateLevel(level);\n}\n\nmodule.exports = {\n supportsColor: getSupportLevel,\n stdout: getSupportLevel(process.stdout),\n stderr: getSupportLevel(process.stderr),\n};\n","module['exports'] = function runTheTrap(text, options) {\n var result = '';\n text = text || 'Run the trap, drop the bass';\n text = text.split('');\n var trap = {\n a: ['\\u0040', '\\u0104', '\\u023a', '\\u0245', '\\u0394', '\\u039b', '\\u0414'],\n b: ['\\u00df', '\\u0181', '\\u0243', '\\u026e', '\\u03b2', '\\u0e3f'],\n c: ['\\u00a9', '\\u023b', '\\u03fe'],\n d: ['\\u00d0', '\\u018a', '\\u0500', '\\u0501', '\\u0502', '\\u0503'],\n e: ['\\u00cb', '\\u0115', '\\u018e', '\\u0258', '\\u03a3', '\\u03be', '\\u04bc',\n '\\u0a6c'],\n f: ['\\u04fa'],\n g: ['\\u0262'],\n h: ['\\u0126', '\\u0195', '\\u04a2', '\\u04ba', '\\u04c7', '\\u050a'],\n i: ['\\u0f0f'],\n j: ['\\u0134'],\n k: ['\\u0138', '\\u04a0', '\\u04c3', '\\u051e'],\n l: ['\\u0139'],\n m: ['\\u028d', '\\u04cd', '\\u04ce', '\\u0520', '\\u0521', '\\u0d69'],\n n: ['\\u00d1', '\\u014b', '\\u019d', '\\u0376', '\\u03a0', '\\u048a'],\n o: ['\\u00d8', '\\u00f5', '\\u00f8', '\\u01fe', '\\u0298', '\\u047a', '\\u05dd',\n '\\u06dd', '\\u0e4f'],\n p: ['\\u01f7', '\\u048e'],\n q: ['\\u09cd'],\n r: ['\\u00ae', '\\u01a6', '\\u0210', '\\u024c', '\\u0280', '\\u042f'],\n s: ['\\u00a7', '\\u03de', '\\u03df', '\\u03e8'],\n t: ['\\u0141', '\\u0166', '\\u0373'],\n u: ['\\u01b1', '\\u054d'],\n v: ['\\u05d8'],\n w: ['\\u0428', '\\u0460', '\\u047c', '\\u0d70'],\n x: ['\\u04b2', '\\u04fe', '\\u04fc', '\\u04fd'],\n y: ['\\u00a5', '\\u04b0', '\\u04cb'],\n z: ['\\u01b5', '\\u0240'],\n };\n text.forEach(function(c) {\n c = c.toLowerCase();\n var chars = trap[c] || [' '];\n var rand = Math.floor(Math.random() * chars.length);\n if (typeof trap[c] !== 'undefined') {\n result += trap[c][rand];\n } else {\n result += c;\n }\n });\n return result;\n};\n","// please no\nmodule['exports'] = function zalgo(text, options) {\n text = text || ' he is here ';\n var soul = {\n 'up': [\n '̍', '̎', '̄', '̅',\n '̿', '̑', '̆', '̐',\n '͒', '͗', '͑', '̇',\n '̈', '̊', '͂', '̓',\n '̈', '͊', '͋', '͌',\n '̃', '̂', '̌', '͐',\n '̀', '́', '̋', '̏',\n '̒', '̓', '̔', '̽',\n '̉', 'ͣ', 'ͤ', 'ͥ',\n 'ͦ', 'ͧ', 'ͨ', 'ͩ',\n 'ͪ', 'ͫ', 'ͬ', 'ͭ',\n 'ͮ', 'ͯ', '̾', '͛',\n '͆', '̚',\n ],\n 'down': [\n '̖', '̗', '̘', '̙',\n '̜', '̝', '̞', '̟',\n '̠', '̤', '̥', '̦',\n '̩', '̪', '̫', '̬',\n '̭', '̮', '̯', '̰',\n '̱', '̲', '̳', '̹',\n '̺', '̻', '̼', 'ͅ',\n '͇', '͈', '͉', '͍',\n '͎', '͓', '͔', '͕',\n '͖', '͙', '͚', '̣',\n ],\n 'mid': [\n '̕', '̛', '̀', '́',\n '͘', '̡', '̢', '̧',\n '̨', '̴', '̵', '̶',\n '͜', '͝', '͞',\n '͟', '͠', '͢', '̸',\n '̷', '͡', ' ҉',\n ],\n };\n var all = [].concat(soul.up, soul.down, soul.mid);\n\n function randomNumber(range) {\n var r = Math.floor(Math.random() * range);\n return r;\n }\n\n function isChar(character) {\n var bool = false;\n all.filter(function(i) {\n bool = (i === character);\n });\n return bool;\n }\n\n\n function heComes(text, options) {\n var result = '';\n var counts;\n var l;\n options = options || {};\n options['up'] =\n typeof options['up'] !== 'undefined' ? options['up'] : true;\n options['mid'] =\n typeof options['mid'] !== 'undefined' ? options['mid'] : true;\n options['down'] =\n typeof options['down'] !== 'undefined' ? options['down'] : true;\n options['size'] =\n typeof options['size'] !== 'undefined' ? options['size'] : 'maxi';\n text = text.split('');\n for (l in text) {\n if (isChar(l)) {\n continue;\n }\n result = result + text[l];\n counts = {'up': 0, 'down': 0, 'mid': 0};\n switch (options.size) {\n case 'mini':\n counts.up = randomNumber(8);\n counts.mid = randomNumber(2);\n counts.down = randomNumber(8);\n break;\n case 'maxi':\n counts.up = randomNumber(16) + 3;\n counts.mid = randomNumber(4) + 1;\n counts.down = randomNumber(64) + 3;\n break;\n default:\n counts.up = randomNumber(8) + 1;\n counts.mid = randomNumber(6) / 2;\n counts.down = randomNumber(8) + 1;\n break;\n }\n\n var arr = ['up', 'mid', 'down'];\n for (var d in arr) {\n var index = arr[d];\n for (var i = 0; i <= counts[index]; i++) {\n if (options[index]) {\n result = result + soul[index][randomNumber(soul[index].length)];\n }\n }\n }\n }\n return result;\n }\n // don't summon him\n return heComes(text, options);\n};\n\n","module['exports'] = function(colors) {\n return function(letter, i, exploded) {\n if (letter === ' ') return letter;\n switch (i%3) {\n case 0: return colors.red(letter);\n case 1: return colors.white(letter);\n case 2: return colors.blue(letter);\n }\n };\n};\n","module['exports'] = function(colors) {\n return function(letter, i, exploded) {\n return i % 2 === 0 ? letter : colors.inverse(letter);\n };\n};\n","module['exports'] = function(colors) {\n // RoY G BiV\n var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta'];\n return function(letter, i, exploded) {\n if (letter === ' ') {\n return letter;\n } else {\n return colors[rainbowColors[i++ % rainbowColors.length]](letter);\n }\n };\n};\n\n","module['exports'] = function(colors) {\n var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green',\n 'blue', 'white', 'cyan', 'magenta', 'brightYellow', 'brightRed',\n 'brightGreen', 'brightBlue', 'brightWhite', 'brightCyan', 'brightMagenta'];\n return function(letter, i, exploded) {\n return letter === ' ' ? letter :\n colors[\n available[Math.round(Math.random() * (available.length - 2))]\n ](letter);\n };\n};\n","/*\n\nThe MIT License (MIT)\n\nOriginal Library\n - Copyright (c) Marak Squires\n\nAdditional functionality\n - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\nvar colors = {};\nmodule['exports'] = colors;\n\ncolors.themes = {};\n\nvar util = require('util');\nvar ansiStyles = colors.styles = require('./styles');\nvar defineProps = Object.defineProperties;\nvar newLineRegex = new RegExp(/[\\r\\n]+/g);\n\ncolors.supportsColor = require('./system/supports-colors').supportsColor;\n\nif (typeof colors.enabled === 'undefined') {\n colors.enabled = colors.supportsColor() !== false;\n}\n\ncolors.enable = function() {\n colors.enabled = true;\n};\n\ncolors.disable = function() {\n colors.enabled = false;\n};\n\ncolors.stripColors = colors.strip = function(str) {\n return ('' + str).replace(/\\x1B\\[\\d+m/g, '');\n};\n\n// eslint-disable-next-line no-unused-vars\nvar stylize = colors.stylize = function stylize(str, style) {\n if (!colors.enabled) {\n return str+'';\n }\n\n var styleMap = ansiStyles[style];\n\n // Stylize should work for non-ANSI styles, too\n if (!styleMap && style in colors) {\n // Style maps like trap operate as functions on strings;\n // they don't have properties like open or close.\n return colors[style](str);\n }\n\n return styleMap.open + str + styleMap.close;\n};\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\nvar escapeStringRegexp = function(str) {\n if (typeof str !== 'string') {\n throw new TypeError('Expected a string');\n }\n return str.replace(matchOperatorsRe, '\\\\$&');\n};\n\nfunction build(_styles) {\n var builder = function builder() {\n return applyStyle.apply(builder, arguments);\n };\n builder._styles = _styles;\n // __proto__ is used because we must return a function, but there is\n // no way to create a function with a different prototype.\n builder.__proto__ = proto;\n return builder;\n}\n\nvar styles = (function() {\n var ret = {};\n ansiStyles.grey = ansiStyles.gray;\n Object.keys(ansiStyles).forEach(function(key) {\n ansiStyles[key].closeRe =\n new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n ret[key] = {\n get: function() {\n return build(this._styles.concat(key));\n },\n };\n });\n return ret;\n})();\n\nvar proto = defineProps(function colors() {}, styles);\n\nfunction applyStyle() {\n var args = Array.prototype.slice.call(arguments);\n\n var str = args.map(function(arg) {\n // Use weak equality check so we can colorize null/undefined in safe mode\n if (arg != null && arg.constructor === String) {\n return arg;\n } else {\n return util.inspect(arg);\n }\n }).join(' ');\n\n if (!colors.enabled || !str) {\n return str;\n }\n\n var newLinesPresent = str.indexOf('\\n') != -1;\n\n var nestedStyles = this._styles;\n\n var i = nestedStyles.length;\n while (i--) {\n var code = ansiStyles[nestedStyles[i]];\n str = code.open + str.replace(code.closeRe, code.open) + code.close;\n if (newLinesPresent) {\n str = str.replace(newLineRegex, function(match) {\n return code.close + match + code.open;\n });\n }\n }\n\n return str;\n}\n\ncolors.setTheme = function(theme) {\n if (typeof theme === 'string') {\n console.log('colors.setTheme now only accepts an object, not a string. ' +\n 'If you are trying to set a theme from a file, it is now your (the ' +\n 'caller\\'s) responsibility to require the file. The old syntax ' +\n 'looked like colors.setTheme(__dirname + ' +\n '\\'/../themes/generic-logging.js\\'); The new syntax looks like '+\n 'colors.setTheme(require(__dirname + ' +\n '\\'/../themes/generic-logging.js\\'));');\n return;\n }\n for (var style in theme) {\n (function(style) {\n colors[style] = function(str) {\n if (typeof theme[style] === 'object') {\n var out = str;\n for (var i in theme[style]) {\n out = colors[theme[style][i]](out);\n }\n return out;\n }\n return colors[theme[style]](str);\n };\n })(style);\n }\n};\n\nfunction init() {\n var ret = {};\n Object.keys(styles).forEach(function(name) {\n ret[name] = {\n get: function() {\n return build([name]);\n },\n };\n });\n return ret;\n}\n\nvar sequencer = function sequencer(map, str) {\n var exploded = str.split('');\n exploded = exploded.map(map);\n return exploded.join('');\n};\n\n// custom formatter methods\ncolors.trap = require('./custom/trap');\ncolors.zalgo = require('./custom/zalgo');\n\n// maps\ncolors.maps = {};\ncolors.maps.america = require('./maps/america')(colors);\ncolors.maps.zebra = require('./maps/zebra')(colors);\ncolors.maps.rainbow = require('./maps/rainbow')(colors);\ncolors.maps.random = require('./maps/random')(colors);\n\nfor (var map in colors.maps) {\n (function(map) {\n colors[map] = function(str) {\n return sequencer(colors.maps[map], str);\n };\n })(map);\n}\n\ndefineProps(colors, init());\n","//\n// Remark: Requiring this file will use the \"safe\" colors API,\n// which will not touch String.prototype.\n//\n// var colors = require('colors/safe');\n// colors.red(\"foo\")\n//\n//\nvar colors = require('./lib/colors');\nmodule['exports'] = colors;\n","const { info, debug } = require('./debug');\nconst utils = require('./utils');\n\nclass Cell {\n /**\n * A representation of a cell within the table.\n * Implementations must have `init` and `draw` methods,\n * as well as `colSpan`, `rowSpan`, `desiredHeight` and `desiredWidth` properties.\n * @param options\n * @constructor\n */\n constructor(options) {\n this.setOptions(options);\n\n /**\n * Each cell will have it's `x` and `y` values set by the `layout-manager` prior to\n * `init` being called;\n * @type {Number}\n */\n this.x = null;\n this.y = null;\n }\n\n setOptions(options) {\n if (['boolean', 'number', 'bigint', 'string'].indexOf(typeof options) !== -1) {\n options = { content: '' + options };\n }\n options = options || {};\n this.options = options;\n let content = options.content;\n if (['boolean', 'number', 'bigint', 'string'].indexOf(typeof content) !== -1) {\n this.content = String(content);\n } else if (!content) {\n this.content = this.options.href || '';\n } else {\n throw new Error('Content needs to be a primitive, got: ' + typeof content);\n }\n this.colSpan = options.colSpan || 1;\n this.rowSpan = options.rowSpan || 1;\n if (this.options.href) {\n Object.defineProperty(this, 'href', {\n get() {\n return this.options.href;\n },\n });\n }\n }\n\n mergeTableOptions(tableOptions, cells) {\n this.cells = cells;\n\n let optionsChars = this.options.chars || {};\n let tableChars = tableOptions.chars;\n let chars = (this.chars = {});\n CHAR_NAMES.forEach(function (name) {\n setOption(optionsChars, tableChars, name, chars);\n });\n\n this.truncate = this.options.truncate || tableOptions.truncate;\n\n let style = (this.options.style = this.options.style || {});\n let tableStyle = tableOptions.style;\n setOption(style, tableStyle, 'padding-left', this);\n setOption(style, tableStyle, 'padding-right', this);\n this.head = style.head || tableStyle.head;\n this.border = style.border || tableStyle.border;\n\n this.fixedWidth = tableOptions.colWidths[this.x];\n this.lines = this.computeLines(tableOptions);\n\n this.desiredWidth = utils.strlen(this.content) + this.paddingLeft + this.paddingRight;\n this.desiredHeight = this.lines.length;\n }\n\n computeLines(tableOptions) {\n const tableWordWrap = tableOptions.wordWrap || tableOptions.textWrap;\n const { wordWrap = tableWordWrap } = this.options;\n if (this.fixedWidth && wordWrap) {\n this.fixedWidth -= this.paddingLeft + this.paddingRight;\n if (this.colSpan) {\n let i = 1;\n while (i < this.colSpan) {\n this.fixedWidth += tableOptions.colWidths[this.x + i];\n i++;\n }\n }\n const { wrapOnWordBoundary: tableWrapOnWordBoundary = true } = tableOptions;\n const { wrapOnWordBoundary = tableWrapOnWordBoundary } = this.options;\n return this.wrapLines(utils.wordWrap(this.fixedWidth, this.content, wrapOnWordBoundary));\n }\n return this.wrapLines(this.content.split('\\n'));\n }\n\n wrapLines(computedLines) {\n const lines = utils.colorizeLines(computedLines);\n if (this.href) {\n return lines.map((line) => utils.hyperlink(this.href, line));\n }\n return lines;\n }\n\n /**\n * Initializes the Cells data structure.\n *\n * @param tableOptions - A fully populated set of tableOptions.\n * In addition to the standard default values, tableOptions must have fully populated the\n * `colWidths` and `rowWidths` arrays. Those arrays must have lengths equal to the number\n * of columns or rows (respectively) in this table, and each array item must be a Number.\n *\n */\n init(tableOptions) {\n let x = this.x;\n let y = this.y;\n this.widths = tableOptions.colWidths.slice(x, x + this.colSpan);\n this.heights = tableOptions.rowHeights.slice(y, y + this.rowSpan);\n this.width = this.widths.reduce(sumPlusOne, -1);\n this.height = this.heights.reduce(sumPlusOne, -1);\n\n this.hAlign = this.options.hAlign || tableOptions.colAligns[x];\n this.vAlign = this.options.vAlign || tableOptions.rowAligns[y];\n\n this.drawRight = x + this.colSpan == tableOptions.colWidths.length;\n }\n\n /**\n * Draws the given line of the cell.\n * This default implementation defers to methods `drawTop`, `drawBottom`, `drawLine` and `drawEmpty`.\n * @param lineNum - can be `top`, `bottom` or a numerical line number.\n * @param spanningCell - will be a number if being called from a RowSpanCell, and will represent how\n * many rows below it's being called from. Otherwise it's undefined.\n * @returns {String} The representation of this line.\n */\n draw(lineNum, spanningCell) {\n if (lineNum == 'top') return this.drawTop(this.drawRight);\n if (lineNum == 'bottom') return this.drawBottom(this.drawRight);\n let content = utils.truncate(this.content, 10, this.truncate);\n if (!lineNum) {\n info(`${this.y}-${this.x}: ${this.rowSpan - lineNum}x${this.colSpan} Cell ${content}`);\n } else {\n // debug(`${lineNum}-${this.x}: 1x${this.colSpan} RowSpanCell ${content}`);\n }\n let padLen = Math.max(this.height - this.lines.length, 0);\n let padTop;\n switch (this.vAlign) {\n case 'center':\n padTop = Math.ceil(padLen / 2);\n break;\n case 'bottom':\n padTop = padLen;\n break;\n default:\n padTop = 0;\n }\n if (lineNum < padTop || lineNum >= padTop + this.lines.length) {\n return this.drawEmpty(this.drawRight, spanningCell);\n }\n let forceTruncation = this.lines.length > this.height && lineNum + 1 >= this.height;\n return this.drawLine(lineNum - padTop, this.drawRight, forceTruncation, spanningCell);\n }\n\n /**\n * Renders the top line of the cell.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @returns {String}\n */\n drawTop(drawRight) {\n let content = [];\n if (this.cells) {\n //TODO: cells should always exist - some tests don't fill it in though\n this.widths.forEach(function (width, index) {\n content.push(this._topLeftChar(index));\n content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'], width));\n }, this);\n } else {\n content.push(this._topLeftChar(0));\n content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'], this.width));\n }\n if (drawRight) {\n content.push(this.chars[this.y == 0 ? 'topRight' : 'rightMid']);\n }\n return this.wrapWithStyleColors('border', content.join(''));\n }\n\n _topLeftChar(offset) {\n let x = this.x + offset;\n let leftChar;\n if (this.y == 0) {\n leftChar = x == 0 ? 'topLeft' : offset == 0 ? 'topMid' : 'top';\n } else {\n if (x == 0) {\n leftChar = 'leftMid';\n } else {\n leftChar = offset == 0 ? 'midMid' : 'bottomMid';\n if (this.cells) {\n //TODO: cells should always exist - some tests don't fill it in though\n let spanAbove = this.cells[this.y - 1][x] instanceof Cell.ColSpanCell;\n if (spanAbove) {\n leftChar = offset == 0 ? 'topMid' : 'mid';\n }\n if (offset == 0) {\n let i = 1;\n while (this.cells[this.y][x - i] instanceof Cell.ColSpanCell) {\n i++;\n }\n if (this.cells[this.y][x - i] instanceof Cell.RowSpanCell) {\n leftChar = 'leftMid';\n }\n }\n }\n }\n }\n return this.chars[leftChar];\n }\n\n wrapWithStyleColors(styleProperty, content) {\n if (this[styleProperty] && this[styleProperty].length) {\n try {\n let colors = require('@colors/colors/safe');\n for (let i = this[styleProperty].length - 1; i >= 0; i--) {\n colors = colors[this[styleProperty][i]];\n }\n return colors(content);\n } catch (e) {\n return content;\n }\n } else {\n return content;\n }\n }\n\n /**\n * Renders a line of text.\n * @param lineNum - Which line of text to render. This is not necessarily the line within the cell.\n * There may be top-padding above the first line of text.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @param forceTruncationSymbol - `true` if the rendered text should end with the truncation symbol even\n * if the text fits. This is used when the cell is vertically truncated. If `false` the text should\n * only include the truncation symbol if the text will not fit horizontally within the cell width.\n * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.\n * @returns {String}\n */\n drawLine(lineNum, drawRight, forceTruncationSymbol, spanningCell) {\n let left = this.chars[this.x == 0 ? 'left' : 'middle'];\n if (this.x && spanningCell && this.cells) {\n let cellLeft = this.cells[this.y + spanningCell][this.x - 1];\n while (cellLeft instanceof ColSpanCell) {\n cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];\n }\n if (!(cellLeft instanceof RowSpanCell)) {\n left = this.chars['rightMid'];\n }\n }\n let leftPadding = utils.repeat(' ', this.paddingLeft);\n let right = drawRight ? this.chars['right'] : '';\n let rightPadding = utils.repeat(' ', this.paddingRight);\n let line = this.lines[lineNum];\n let len = this.width - (this.paddingLeft + this.paddingRight);\n if (forceTruncationSymbol) line += this.truncate || '…';\n let content = utils.truncate(line, len, this.truncate);\n content = utils.pad(content, len, ' ', this.hAlign);\n content = leftPadding + content + rightPadding;\n return this.stylizeLine(left, content, right);\n }\n\n stylizeLine(left, content, right) {\n left = this.wrapWithStyleColors('border', left);\n right = this.wrapWithStyleColors('border', right);\n if (this.y === 0) {\n content = this.wrapWithStyleColors('head', content);\n }\n return left + content + right;\n }\n\n /**\n * Renders the bottom line of the cell.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @returns {String}\n */\n drawBottom(drawRight) {\n let left = this.chars[this.x == 0 ? 'bottomLeft' : 'bottomMid'];\n let content = utils.repeat(this.chars.bottom, this.width);\n let right = drawRight ? this.chars['bottomRight'] : '';\n return this.wrapWithStyleColors('border', left + content + right);\n }\n\n /**\n * Renders a blank line of text within the cell. Used for top and/or bottom padding.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.\n * @returns {String}\n */\n drawEmpty(drawRight, spanningCell) {\n let left = this.chars[this.x == 0 ? 'left' : 'middle'];\n if (this.x && spanningCell && this.cells) {\n let cellLeft = this.cells[this.y + spanningCell][this.x - 1];\n while (cellLeft instanceof ColSpanCell) {\n cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];\n }\n if (!(cellLeft instanceof RowSpanCell)) {\n left = this.chars['rightMid'];\n }\n }\n let right = drawRight ? this.chars['right'] : '';\n let content = utils.repeat(' ', this.width);\n return this.stylizeLine(left, content, right);\n }\n}\n\nclass ColSpanCell {\n /**\n * A Cell that doesn't do anything. It just draws empty lines.\n * Used as a placeholder in column spanning.\n * @constructor\n */\n constructor() {}\n\n draw(lineNum) {\n if (typeof lineNum === 'number') {\n debug(`${this.y}-${this.x}: 1x1 ColSpanCell`);\n }\n return '';\n }\n\n init() {}\n\n mergeTableOptions() {}\n}\n\nclass RowSpanCell {\n /**\n * A placeholder Cell for a Cell that spans multiple rows.\n * It delegates rendering to the original cell, but adds the appropriate offset.\n * @param originalCell\n * @constructor\n */\n constructor(originalCell) {\n this.originalCell = originalCell;\n }\n\n init(tableOptions) {\n let y = this.y;\n let originalY = this.originalCell.y;\n this.cellOffset = y - originalY;\n this.offset = findDimension(tableOptions.rowHeights, originalY, this.cellOffset);\n }\n\n draw(lineNum) {\n if (lineNum == 'top') {\n return this.originalCell.draw(this.offset, this.cellOffset);\n }\n if (lineNum == 'bottom') {\n return this.originalCell.draw('bottom');\n }\n debug(`${this.y}-${this.x}: 1x${this.colSpan} RowSpanCell for ${this.originalCell.content}`);\n return this.originalCell.draw(this.offset + 1 + lineNum);\n }\n\n mergeTableOptions() {}\n}\n\nfunction firstDefined(...args) {\n return args.filter((v) => v !== undefined && v !== null).shift();\n}\n\n// HELPER FUNCTIONS\nfunction setOption(objA, objB, nameB, targetObj) {\n let nameA = nameB.split('-');\n if (nameA.length > 1) {\n nameA[1] = nameA[1].charAt(0).toUpperCase() + nameA[1].substr(1);\n nameA = nameA.join('');\n targetObj[nameA] = firstDefined(objA[nameA], objA[nameB], objB[nameA], objB[nameB]);\n } else {\n targetObj[nameB] = firstDefined(objA[nameB], objB[nameB]);\n }\n}\n\nfunction findDimension(dimensionTable, startingIndex, span) {\n let ret = dimensionTable[startingIndex];\n for (let i = 1; i < span; i++) {\n ret += 1 + dimensionTable[startingIndex + i];\n }\n return ret;\n}\n\nfunction sumPlusOne(a, b) {\n return a + b + 1;\n}\n\nlet CHAR_NAMES = [\n 'top',\n 'top-mid',\n 'top-left',\n 'top-right',\n 'bottom',\n 'bottom-mid',\n 'bottom-left',\n 'bottom-right',\n 'left',\n 'left-mid',\n 'mid',\n 'mid-mid',\n 'right',\n 'right-mid',\n 'middle',\n];\n\nmodule.exports = Cell;\nmodule.exports.ColSpanCell = ColSpanCell;\nmodule.exports.RowSpanCell = RowSpanCell;\n","const { warn, debug } = require('./debug');\nconst Cell = require('./cell');\nconst { ColSpanCell, RowSpanCell } = Cell;\n\n(function () {\n function next(alloc, col) {\n if (alloc[col] > 0) {\n return next(alloc, col + 1);\n }\n return col;\n }\n\n function layoutTable(table) {\n let alloc = {};\n table.forEach(function (row, rowIndex) {\n let col = 0;\n row.forEach(function (cell) {\n cell.y = rowIndex;\n // Avoid erroneous call to next() on first row\n cell.x = rowIndex ? next(alloc, col) : col;\n const rowSpan = cell.rowSpan || 1;\n const colSpan = cell.colSpan || 1;\n if (rowSpan > 1) {\n for (let cs = 0; cs < colSpan; cs++) {\n alloc[cell.x + cs] = rowSpan;\n }\n }\n col = cell.x + colSpan;\n });\n Object.keys(alloc).forEach((idx) => {\n alloc[idx]--;\n if (alloc[idx] < 1) delete alloc[idx];\n });\n });\n }\n\n function maxWidth(table) {\n let mw = 0;\n table.forEach(function (row) {\n row.forEach(function (cell) {\n mw = Math.max(mw, cell.x + (cell.colSpan || 1));\n });\n });\n return mw;\n }\n\n function maxHeight(table) {\n return table.length;\n }\n\n function cellsConflict(cell1, cell2) {\n let yMin1 = cell1.y;\n let yMax1 = cell1.y - 1 + (cell1.rowSpan || 1);\n let yMin2 = cell2.y;\n let yMax2 = cell2.y - 1 + (cell2.rowSpan || 1);\n let yConflict = !(yMin1 > yMax2 || yMin2 > yMax1);\n\n let xMin1 = cell1.x;\n let xMax1 = cell1.x - 1 + (cell1.colSpan || 1);\n let xMin2 = cell2.x;\n let xMax2 = cell2.x - 1 + (cell2.colSpan || 1);\n let xConflict = !(xMin1 > xMax2 || xMin2 > xMax1);\n\n return yConflict && xConflict;\n }\n\n function conflictExists(rows, x, y) {\n let i_max = Math.min(rows.length - 1, y);\n let cell = { x: x, y: y };\n for (let i = 0; i <= i_max; i++) {\n let row = rows[i];\n for (let j = 0; j < row.length; j++) {\n if (cellsConflict(cell, row[j])) {\n return true;\n }\n }\n }\n return false;\n }\n\n function allBlank(rows, y, xMin, xMax) {\n for (let x = xMin; x < xMax; x++) {\n if (conflictExists(rows, x, y)) {\n return false;\n }\n }\n return true;\n }\n\n function addRowSpanCells(table) {\n table.forEach(function (row, rowIndex) {\n row.forEach(function (cell) {\n for (let i = 1; i < cell.rowSpan; i++) {\n let rowSpanCell = new RowSpanCell(cell);\n rowSpanCell.x = cell.x;\n rowSpanCell.y = cell.y + i;\n rowSpanCell.colSpan = cell.colSpan;\n insertCell(rowSpanCell, table[rowIndex + i]);\n }\n });\n });\n }\n\n function addColSpanCells(cellRows) {\n for (let rowIndex = cellRows.length - 1; rowIndex >= 0; rowIndex--) {\n let cellColumns = cellRows[rowIndex];\n for (let columnIndex = 0; columnIndex < cellColumns.length; columnIndex++) {\n let cell = cellColumns[columnIndex];\n for (let k = 1; k < cell.colSpan; k++) {\n let colSpanCell = new ColSpanCell();\n colSpanCell.x = cell.x + k;\n colSpanCell.y = cell.y;\n cellColumns.splice(columnIndex + 1, 0, colSpanCell);\n }\n }\n }\n }\n\n function insertCell(cell, row) {\n let x = 0;\n while (x < row.length && row[x].x < cell.x) {\n x++;\n }\n row.splice(x, 0, cell);\n }\n\n function fillInTable(table) {\n let h_max = maxHeight(table);\n let w_max = maxWidth(table);\n debug(`Max rows: ${h_max}; Max cols: ${w_max}`);\n for (let y = 0; y < h_max; y++) {\n for (let x = 0; x < w_max; x++) {\n if (!conflictExists(table, x, y)) {\n let opts = { x: x, y: y, colSpan: 1, rowSpan: 1 };\n x++;\n while (x < w_max && !conflictExists(table, x, y)) {\n opts.colSpan++;\n x++;\n }\n let y2 = y + 1;\n while (y2 < h_max && allBlank(table, y2, opts.x, opts.x + opts.colSpan)) {\n opts.rowSpan++;\n y2++;\n }\n let cell = new Cell(opts);\n cell.x = opts.x;\n cell.y = opts.y;\n warn(`Missing cell at ${cell.y}-${cell.x}.`);\n insertCell(cell, table[y]);\n }\n }\n }\n }\n\n function generateCells(rows) {\n return rows.map(function (row) {\n if (!Array.isArray(row)) {\n let key = Object.keys(row)[0];\n row = row[key];\n if (Array.isArray(row)) {\n row = row.slice();\n row.unshift(key);\n } else {\n row = [key, row];\n }\n }\n return row.map(function (cell) {\n return new Cell(cell);\n });\n });\n }\n\n function makeTableLayout(rows) {\n let cellRows = generateCells(rows);\n layoutTable(cellRows);\n fillInTable(cellRows);\n addRowSpanCells(cellRows);\n addColSpanCells(cellRows);\n return cellRows;\n }\n\n module.exports = {\n makeTableLayout: makeTableLayout,\n layoutTable: layoutTable,\n addRowSpanCells: addRowSpanCells,\n maxWidth: maxWidth,\n fillInTable: fillInTable,\n computeWidths: makeComputeWidths('colSpan', 'desiredWidth', 'x', 1),\n computeHeights: makeComputeWidths('rowSpan', 'desiredHeight', 'y', 1),\n };\n})();\n\nfunction makeComputeWidths(colSpan, desiredWidth, x, forcedMin) {\n return function (vals, table) {\n let result = [];\n let spanners = [];\n let auto = {};\n table.forEach(function (row) {\n row.forEach(function (cell) {\n if ((cell[colSpan] || 1) > 1) {\n spanners.push(cell);\n } else {\n result[cell[x]] = Math.max(result[cell[x]] || 0, cell[desiredWidth] || 0, forcedMin);\n }\n });\n });\n\n vals.forEach(function (val, index) {\n if (typeof val === 'number') {\n result[index] = val;\n }\n });\n\n //spanners.forEach(function(cell){\n for (let k = spanners.length - 1; k >= 0; k--) {\n let cell = spanners[k];\n let span = cell[colSpan];\n let col = cell[x];\n let existingWidth = result[col];\n let editableCols = typeof vals[col] === 'number' ? 0 : 1;\n if (typeof existingWidth === 'number') {\n for (let i = 1; i < span; i++) {\n existingWidth += 1 + result[col + i];\n if (typeof vals[col + i] !== 'number') {\n editableCols++;\n }\n }\n } else {\n existingWidth = desiredWidth === 'desiredWidth' ? cell.desiredWidth - 1 : 1;\n if (!auto[col] || auto[col] < existingWidth) {\n auto[col] = existingWidth;\n }\n }\n\n if (cell[desiredWidth] > existingWidth) {\n let i = 0;\n while (editableCols > 0 && cell[desiredWidth] > existingWidth) {\n if (typeof vals[col + i] !== 'number') {\n let dif = Math.round((cell[desiredWidth] - existingWidth) / editableCols);\n existingWidth += dif;\n result[col + i] += dif;\n editableCols--;\n }\n i++;\n }\n }\n }\n\n Object.assign(vals, result, auto);\n for (let j = 0; j < vals.length; j++) {\n vals[j] = Math.max(forcedMin, vals[j] || 0);\n }\n };\n}\n","const debug = require('./debug');\nconst utils = require('./utils');\nconst tableLayout = require('./layout-manager');\n\nclass Table extends Array {\n constructor(opts) {\n super();\n\n const options = utils.mergeOptions(opts);\n Object.defineProperty(this, 'options', {\n value: options,\n enumerable: options.debug,\n });\n\n if (options.debug) {\n switch (typeof options.debug) {\n case 'boolean':\n debug.setDebugLevel(debug.WARN);\n break;\n case 'number':\n debug.setDebugLevel(options.debug);\n break;\n case 'string':\n debug.setDebugLevel(parseInt(options.debug, 10));\n break;\n default:\n debug.setDebugLevel(debug.WARN);\n debug.warn(`Debug option is expected to be boolean, number, or string. Received a ${typeof options.debug}`);\n }\n Object.defineProperty(this, 'messages', {\n get() {\n return debug.debugMessages();\n },\n });\n }\n }\n\n toString() {\n let array = this;\n let headersPresent = this.options.head && this.options.head.length;\n if (headersPresent) {\n array = [this.options.head];\n if (this.length) {\n array.push.apply(array, this);\n }\n } else {\n this.options.style.head = [];\n }\n\n let cells = tableLayout.makeTableLayout(array);\n\n cells.forEach(function (row) {\n row.forEach(function (cell) {\n cell.mergeTableOptions(this.options, cells);\n }, this);\n }, this);\n\n tableLayout.computeWidths(this.options.colWidths, cells);\n tableLayout.computeHeights(this.options.rowHeights, cells);\n\n cells.forEach(function (row) {\n row.forEach(function (cell) {\n cell.init(this.options);\n }, this);\n }, this);\n\n let result = [];\n\n for (let rowIndex = 0; rowIndex < cells.length; rowIndex++) {\n let row = cells[rowIndex];\n let heightOfRow = this.options.rowHeights[rowIndex];\n\n if (rowIndex === 0 || !this.options.style.compact || (rowIndex == 1 && headersPresent)) {\n doDraw(row, 'top', result);\n }\n\n for (let lineNum = 0; lineNum < heightOfRow; lineNum++) {\n doDraw(row, lineNum, result);\n }\n\n if (rowIndex + 1 == cells.length) {\n doDraw(row, 'bottom', result);\n }\n }\n\n return result.join('\\n');\n }\n\n get width() {\n let str = this.toString().split('\\n');\n return str[0].length;\n }\n}\n\nTable.reset = () => debug.reset();\n\nfunction doDraw(row, lineNum, result) {\n let line = [];\n row.forEach(function (cell) {\n line.push(cell.draw(lineNum));\n });\n let str = line.join('');\n if (str.length) result.push(str);\n}\n\nmodule.exports = Table;\n","module.exports = require('./src/table');","/**\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\";\nimport CliTable3 from \"cli-table3\";\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 (cli-table3 powered) ────────────────────────\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\n if (rows.length === 0) {\n return pc.dim(\" (no data)\");\n }\n\n // Build cli-table3 instance\n const table = new CliTable3({\n head: columns.map((c) => pc.bold(c.label)),\n colAligns: columns.map((c) => c.align ?? \"left\"),\n style: {\n \"padding-left\": pad,\n \"padding-right\": pad,\n head: [], // reset default styles; our pc.bold is already applied\n border: [],\n compact: false,\n },\n chars: {\n top: \"─\", \"top-mid\": \"┬\", \"top-left\": \"┌\", \"top-right\": \"┐\",\n \"bottom\": \"─\", \"bottom-mid\": \"┴\", \"bottom-left\": \"└\", \"bottom-right\": \"┘\",\n left: \"│\", \"left-mid\": \"├\", mid: \"─\", \"mid-mid\": \"┼\",\n right: \"│\", \"right-mid\": \"┤\",\n middle: \"│\",\n },\n truncate: \"…\",\n });\n\n for (const row of rows) {\n const values = columns.map((col) => {\n const raw = row[col.key];\n return col.format ? col.format(raw) : String(raw ?? \"-\");\n });\n table.push(values);\n }\n\n const output = table.toString();\n\n // Apply dim to all border lines (head, body, foot)\n const lines = output.split(\"\\n\");\n return lines.map((l) => {\n // Only dim border chars (lines that start with box-drawing chars)\n if (l.length > 0 && (l[0] === \"┌\" || l[0] === \"│\" || l[0] === \"├\" || l[0] === \"└\" || l[0] === \"─\")) {\n // Dim the border characters but keep cell content bright\n return l.replace(/^([│├└┌┐┤┴┬─]+)/, (m) => pc.dim(m));\n }\n return l;\n }).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 * Fennec CLI Banner\n *\n * Pure-text ASCII art banner using picocolors only.\n * No external font libraries — avoids ESM/CJS interop issues\n * (cfonts uses dynamic require(\"os\") which crashes in ESM bundles).\n *\n * Falls back to a compact fox icon for non-TTY environments.\n * All picocolors-based, no additional dependencies.\n */\n\nimport pc from \"picocolors\";\n\n// ─── Hex color helper ──────────────────────────────────────────\n\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 return (s: string) => s;\n}\n\nconst fennecOrange = hexColor(\"#FF6432\");\nconst fennecGold = hexColor(\"#FFB347\");\n\n// ─── Version ────────────────────────────────────────────────────\n\nexport const VERSION = \"1.14.3\";\n\n// ─── Banner generation ──────────────────────────────────────────\n\nlet cachedBanner: string | null = null;\nlet cachedCompact: string | null = null;\n\n/**\n * Generate the full FENNEC ASCII art banner.\n * Pure-text — no external font library needed.\n * Cached after first call.\n */\nfunction generateBanner(): string {\n if (cachedBanner) return cachedBanner;\n\n const logo = [\n \"███████╗███████╗███╗ ██╗███╗ ██╗███████╗ ██████╗\",\n \"██╔════╝██╔════╝████╗ ██║████╗ ██║██╔════╝██╔════╝\",\n \"█████╗ █████╗ ██╔██╗ ██║██╔██╗ ██║█████╗ ██║ \",\n \"██╔══╝ ██╔══╝ ██║╚██╗██║██║╚██╗██║██╔══╝ ██║ \",\n \"██║ ███████╗██║ ╚████║██║ ╚████║███████╗╚██████╗\",\n \"╚═╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═══╝╚══════╝ ╚═════╝\",\n ];\n\n // Apply gradient: orange → gold\n const gradientSteps = logo.length;\n const bannerStr = logo\n .map((line, i) => {\n const ratio = i / (gradientSteps - 1);\n const color = ratio < 0.5 ? fennecOrange : fennecGold;\n return color(line);\n })\n .join(\"\\n\");\n\n const tagline = pc.dim(\"ears everywhere in your stack.\") + pc.dim(` v${VERSION}`);\n\n cachedBanner = `\\n${bannerStr}\\n ${tagline}\\n`;\n return cachedBanner;\n}\n\n/**\n * Compact banner for non-TTY or quick commands.\n */\nfunction generateCompactBanner(): string {\n if (cachedCompact) return cachedCompact;\n cachedCompact = `${pc.redBright(\" 🦊\")} ${pc.bold(\"Fennec\")} ${pc.dim(`v${VERSION}`)}`;\n return cachedCompact;\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Print the full FENNEC banner (ASCII art) to stderr.\n * Uses full logo in TTY mode, compact in non-TTY.\n */\nexport function printBanner(): void {\n if (process.stdout.isTTY) {\n console.error(generateBanner());\n } else {\n console.error(generateCompactBanner());\n }\n}\n\n/**\n * Print a mini/compact banner (fox icon + version only).\n * Suitable for quick commands like ps, status, kill.\n */\nexport function printMiniBanner(): void {\n console.error(generateCompactBanner());\n}\n\n// ─── Exports for reuse ──────────────────────────────────────────\n\nexport const FOX = generateBanner();\nexport const FOX_COMPACT = generateCompactBanner();\n","import pc from \"picocolors\";\nimport { hexColor } from \"./banner.js\";\n\nconst fennecOrange = hexColor(\"#FF6432\");\n\n// ─── Command Registry ────────────────────────────────────────────\n// Single source of truth for CLI documentation. Powers both the full\n// `fennec help` listing and per-command `fennec <cmd> --help` output.\n\nexport interface CommandDoc {\n /** Canonical command name */\n name: string;\n /** Full usage string (without the leading `fennec `) */\n usage: string;\n /** Concise signature for the grouped list (defaults to `usage`) */\n short?: string;\n /** One-line summary shown in the grouped list */\n summary: string;\n /** Longer description shown in per-command help (optional) */\n description?: string;\n /** Alternate names */\n aliases?: string[];\n /** [flag, description] pairs */\n options?: [string, string][];\n /** Example invocations (without the leading `fennec `) */\n examples?: string[];\n}\n\nexport const COMMANDS: Record<string, CommandDoc> = {\n \"start-server\": {\n name: \"start\",\n usage: \"start [options]\",\n summary: \"Start the Fennec MCP server (default when no app command is given)\",\n description: \"Boots the Fennec MCP server so AI agents can connect. Also auto-resurrects tracked apps that died since the last session.\",\n options: [\n [\"--config <path>\", \"Path to a fennec.config.yaml file\"],\n [\"--sse\", \"Use SSE (HTTP) transport instead of stdio\"],\n ],\n examples: [\"start\", \"start --sse\", \"start --config ./fennec.config.yaml\"],\n },\n start: {\n name: \"start\",\n usage: \"start <command> --name <name> [options]\",\n short: \"start <command>\",\n summary: \"Start an app as a background daemon (like)\",\n description: \"Launches <command> as a detached daemon. Its output is written directly to ~/.fennec/logs/<name>.log, so Fennec confirms the app is really running and then exits — no Ctrl+C needed.\",\n aliases: [\"run\"],\n options: [\n [\"--name <name>\", \"App name used for tracking (recommended)\"],\n [\"--port <port>\", \"Port the app listens on — Fennec waits until it accepts connections\"],\n [\"--cwd <dir>\", \"Working directory to run the command in\"],\n [\"--restart\", \"Auto-restart if it crashes or its port stops listening (detached supervisor, survives terminal close)\"],\n [\"--group <group>\", \"Logical group/namespace for bulk ops (kill/spawn/stop --group <group>)\"],\n ],\n examples: [\n 'start \"npm run dev\" --name web --port 3000',\n \"start node server.js --name api --cwd ./backend --restart --group backend\",\n ],\n },\n run: {\n name: \"run\",\n usage: \"run <command> --name <name> [options]\",\n short: \"run <command>\",\n summary: \"Alias of `start <command>` — run an app under Fennec\",\n aliases: [\"start\"],\n options: [\n [\"--name <name>\", \"App name used for tracking (recommended)\"],\n [\"--port <port>\", \"Port the app listens on\"],\n [\"--cwd <dir>\", \"Working directory\"],\n [\"--restart\", \"Auto-restart if it crashes or its port stops listening\"],\n [\"--group <group>\", \"Logical group for bulk ops\"],\n ],\n examples: [\"run npm start --name web --port 8080 --group frontend\"],\n },\n ps: {\n name: \"ps\",\n usage: \"ps [options]\",\n summary: \"List Fennec-tracked apps with live status\",\n description: \"Shows tracked apps and whether they are genuinely running (PID + command identity are verified to avoid false positives from PID reuse). Includes a cross-platform MEM column (resident RSS) so you can spot leaks from long-lived apps.\",\n options: [\n [\"--system, -a, --all\", \"Show all system processes instead of tracked apps\"],\n [\"--name <name>\", \"Filter system processes by name\"],\n [\"--group <g>, -g <g>\", \"Show only tracked apps in group <g>\"],\n [\"--sort <field>\", \"Sort by cpu | mem | pid | name (default: name)\"],\n [\"--json\", \"Output tracked apps as JSON\"],\n [\"-w, --watch\", \"Watch mode — refresh every 3s (with --system)\"],\n ],\n examples: [\"ps\", \"ps --json\", \"ps --system --sort cpu -w\"],\n },\n status: {\n name: \"status\",\n usage: \"status [name] [options]\",\n summary: \"Show system overview & top processes\",\n options: [[\"-w, --watch\", \"Watch mode — refresh every 3s\"]],\n examples: [\"status\", \"status -w\"],\n },\n log: {\n name: \"log\",\n usage: \"log <name|pid> [options]\",\n summary: \"Show (and follow) logs for a tracked app\",\n description: \"Prints the app's status (running/stopped) then its recent logs. Run without an app name to list all tracked apps to choose from. Secrets (API keys, tokens, connection strings, private keys) are redacted by default — safe to pipe to an AI assistant. Use --json for a bounded, machine-readable view (AI mode).\",\n aliases: [\"logs\"],\n options: [\n [\"--lines <n>\", \"Number of lines to show (default: 30, capped at 500)\"],\n [\"-f, --follow\", \"Follow mode — stream new log lines live (Ctrl+C to stop)\"],\n [\"--level <level>\", \"Filter by level: error | warn | info | debug\"],\n [\"--since <dur>\", \"Only show lines from the last duration (e.g. 10m, 1h, 30s)\"],\n [\"--json\", \"Machine-readable JSON (AI mode) — bounded, redacted, no ANSI\"],\n [\"--no-redact\", \"Disable secret redaction (use with care)\"],\n [\"--clear\", \"Delete the log file for this app\"],\n ],\n examples: [\"logs\", \"log web\", \"log web -f\", \"log api --level error --lines 100\"],\n },\n spawn: {\n name: \"spawn\",\n usage: \"spawn [name] [name...] [--all] [--group <g>]\",\n summary: \"Re-spawn a stopped tracked app from its saved config\",\n description: \"Revives a previously stopped app using its saved command/args/cwd. With no name, shows an interactive list of stopped apps.\",\n options: [\n [\"--all, -a\", \"Re-spawn all stopped apps that have a saved command\"],\n [\"--group <g>, -g <g>\", \"Re-spawn only stopped apps in group <g>\"],\n ],\n examples: [\"spawn\", \"spawn web\", \"spawn be-crm fe-crm\", \"spawn --all\", \"spawn --group backend\"],\n },\n stop: {\n name: \"stop\",\n usage: \"stop <name|--all> [name...] [--group <g>]\",\n summary: \"Stop (pause) a tracked app but keep it in the registry\",\n description: \"Sends SIGTERM but keeps the entry in tracked.json so it can be revived later with `fennec spawn`. Stops the ENTIRE process tree so no orphaned children are left. Accepts multiple names at once (e.g. `stop be-crm fe-crm`).\",\n options: [\n [\"--all, -a\", \"Stop all running tracked apps\"],\n [\"--group <g>, -g <g>\", \"Stop only running apps in group <g>\"],\n ],\n examples: [\"stop web\", \"stop be-crm fe-crm -y\", \"stop --all\", \"stop --group backend\"],\n },\n restart: {\n name: \"restart\",\n usage: \"restart <name|pid> [name...] [--group <g>]\",\n summary: \"Stop and re-spawn a tracked app from its saved config\",\n options: [[\"--group <g>, -g <g>\", \"Restart all apps in group <g>\"]],\n examples: [\"restart web\", \"restart be-crm fe-crm -y\", \"restart --group backend\"],\n },\n kill: {\n name: \"kill\",\n usage: \"kill <pid|name|all> [name...] [--group <g>]\",\n summary: \"Kill a process and remove it from the registry\",\n description: \"Permanently removes a tracked app (unlike `stop`, which keeps it). By NAME it only matches Fennec-tracked apps — use an explicit PID to kill a system process. Prompts before killing. Kills the ENTIRE process tree (e.g. npm → vite → esbuild) so no orphaned children are left behind. Accepts multiple names at once (e.g. `kill be-crm fe-crm`).\",\n options: [\n [\"--signal <sig>\", \"Signal to send (default: SIGTERM). e.g. SIGKILL, SIGINT\"],\n [\"--all, -a\", \"Kill ALL tracked apps (asks for confirmation)\"],\n [\"--group <g>, -g <g>\", \"Kill only apps in group <g> (other groups untouched)\"],\n [\"-y, --yes\", \"Skip the confirmation prompt\"],\n ],\n examples: [\"kill web\", \"kill 12345 --signal SIGKILL\", \"kill be-crm fe-crm -y\", \"kill all -y\", \"kill --group backend -y\"],\n },\n supervisor: {\n name: \"supervisor\",\n usage: \"supervisor <start|stop|status|restart>\",\n short: \"supervisor <action>\",\n summary: \"Manage the background daemon that keeps --restart apps alive\",\n description: \"The supervisor is a detached daemon that auto-restarts apps started with --restart, even after you close the terminal. It polls every few seconds, health-checks each app's port (restarting ones that are alive but not listening) and has crash-loop backoff. `fennec start --restart` starts it automatically.\",\n options: [\n [\"start\", \"Start the supervisor daemon\"],\n [\"stop\", \"Stop the supervisor daemon\"],\n [\"status\", \"Show supervisor status and managed apps\"],\n [\"restart\", \"Restart the supervisor daemon\"],\n ],\n examples: [\"supervisor status\", \"supervisor start\", \"supervisor stop\"],\n },\n persist: {\n name: \"persist\",\n usage: \"persist <enable|disable|status>\",\n short: \"persist <action>\",\n summary: \"Make fennec survive reboots (auto-start apps after login)\",\n description: \"Installs a boot unit (systemd user service on Linux, launchd agent on macOS, a startup script on Windows) that starts the supervisor at login. The supervisor then resurrects every app started with --restart, so your whole fleet comes back after a reboot — like `startup` + `save`. `fennec start --restart` enables this automatically.\",\n options: [\n [\"enable\", \"Install the boot unit for the current user\"],\n [\"disable\", \"Remove the boot unit\"],\n [\"status\", \"Show whether boot persistence is active\"],\n ],\n examples: [\"persist enable\", \"persist status\", \"persist disable\"],\n },\n inspect: {\n name: \"inspect\",\n usage: \"inspect <name|pid> [--plain] [--tail N] [--since 10m]\",\n short: \"inspect <name|pid>\",\n summary: \"Compact, AI-safe snapshot of an app (status + logs + errors)\",\n description: \"Returns a single bounded, machine-readable (JSON) view of one app: liveness, port health, uptime, memory, recent log lines and an error scan. Output is capped (token budget), secrets are redacted by default, and the shape is stable — so an AI assistant can observe a real running app (BE, FE, worker, console, ...) cheaply and predictably. Add --plain for a short human summary.\",\n options: [\n [\"--plain\", \"Short human-readable summary instead of JSON\"],\n [\"--tail N\", \"Max recent log lines (default 40, cap 200)\"],\n [\"--since 10m|1h\", \"Only consider log lines from the last duration\"],\n ],\n examples: [\"inspect web --plain\", \"inspect web --since 10m\", \"inspect api --tail 20\"],\n },\n dev: {\n name: \"dev\",\n usage: \"dev <up|down|status> [--config fennec.config.yaml]\",\n short: \"dev <action>\",\n summary: \"Orchestrate a whole dev stack from fennec.config.yaml\",\n description: \"Declarative dev-environment orchestration. `fennec dev up` reads fennec.config.yaml, starts every app (BE/FE/DB/worker) like `fennec start --restart`, respects dependencies (waits for a dependent's port), and brings the whole stack up as one unit. Apps are supervised (auto-restart + port health-check) and boot-persistent. `fennec dev down` stops them (disabling auto-restart). `fennec dev status` shows the stack. This is the AI-friendly way to boot an entire project and then observe it with `fennec observe` / `inspect`.\",\n options: [\n [\"up\", \"Start the whole stack from fennec.config.yaml\"],\n [\"down\", \"Stop the whole stack (auto-restart disabled)\"],\n [\"status\", \"Show stack status (running/stopped, last restart cause)\"],\n [\"--config <path>\", \"Path to the config file (default: ./fennec.config.yaml)\"],\n ],\n examples: [\"dev up\", \"dev up --config ./stack.yaml\", \"dev down\", \"dev status\"],\n },\n info: {\n name: \"info\",\n usage: \"info <name>\",\n summary: \"Show detailed info for a tracked app\",\n examples: [\"info web\"],\n },\n rename: {\n name: \"rename\",\n usage: \"rename <old-name> <new-name>\",\n summary: \"Rename a tracked app\",\n examples: [\"rename web frontend\"],\n },\n group: {\n name: \"group\",\n usage: \"group [name] [group]\",\n summary: \"Assign a logical group to tracked apps (for scoped bulk ops)\",\n description: \"Groups let bulk commands (kill/spawn/stop/ps) target a subset instead of everything. Assign a group to an existing tracked app, clear it with --unset, or run with no args to list every app's group. New apps can also be tagged at start time with `fennec start <cmd> --name <n> --group <g>`. Then `fennec kill --group <g>` / `fennec spawn --group <g>` / `fennec stop --group <g>` / `fennec ps --group <g>` only touch that group.\",\n options: [\n [\"<name> <group>\", \"Assign <group> to the tracked app <name>\"],\n [\"<name> --unset\", \"Remove the group from <name>\"],\n [\"(no args)\", \"List all tracked apps with their group\"],\n ],\n examples: [\"group web backend\", \"group web --unset\", \"group\", \"kill --group backend\"],\n },\n attach: {\n name: \"attach\",\n usage: \"attach <port> --name <name>\",\n short: \"attach <port>\",\n summary: \"Observe a running process by the port it listens on\",\n options: [[\"--name <name>\", \"Name to track the observed process under\"]],\n examples: [\"attach 3000 --name web\"],\n },\n \"attach-pid\": {\n name: \"attach-pid\",\n usage: \"attach-pid <pid>\",\n summary: \"Attach to and observe a process by its PID\",\n examples: [\"attach-pid 12345\"],\n },\n \"attach-port\": {\n name: \"attach-port\",\n usage: \"attach-port <port>\",\n summary: \"Attach to and observe a process by its port\",\n examples: [\"attach-port 8080\"],\n },\n pipe: {\n name: \"pipe\",\n usage: \"pipe --name <name>\",\n summary: \"Pipe stdin into a Fennec log watcher\",\n options: [[\"--name <name>\", \"Watcher name (required)\"]],\n examples: [\"npm run dev | fennec pipe --name web\"],\n },\n watch: {\n name: \"watch\",\n usage: \"watch --file <path> [--name <name>]\",\n short: \"watch --file <path>\",\n summary: \"Watch an existing log file\",\n options: [\n [\"--file <path>\", \"Path to the log file (required)\"],\n [\"--name <name>\", \"Watcher name\"],\n ],\n examples: [\"watch --file ./app.log --name web\"],\n },\n export: {\n name: \"export\",\n usage: \"export --file <path>\",\n summary: \"Export tracked apps to a file\",\n options: [[\"--file <path>\", \"Destination file path (required)\"]],\n examples: [\"export --file ./fennec-apps.json\"],\n },\n import: {\n name: \"import\",\n usage: \"import <file>\",\n summary: \"Import tracked apps from a file\",\n examples: [\"import ./fennec-apps.json\"],\n },\n cleanup: {\n name: \"cleanup\",\n usage: \"cleanup\",\n summary: \"Remove dead/stale entries from the tracked registry\",\n examples: [\"cleanup\"],\n },\n init: {\n name: \"init\",\n usage: \"init\",\n summary: \"Generate a fennec.config.yaml in the current directory\",\n examples: [\"init\"],\n },\n setup: {\n name: \"setup\",\n usage: \"setup\",\n summary: \"Interactively configure your MCP client for Fennec\",\n examples: [\"setup\"],\n },\n \"install-browsers\": {\n name: \"install-browsers\",\n usage: \"install-browsers\",\n summary: \"Install Playwright browser engines\",\n examples: [\"install-browsers\"],\n },\n sessions: {\n name: \"sessions\",\n usage: \"sessions\",\n summary: \"List saved browser auth sessions\",\n examples: [\"sessions\"],\n },\n health: {\n name: \"health\",\n usage: \"health\",\n summary: \"Run a health check of the Fennec environment\",\n examples: [\"health\"],\n },\n help: {\n name: \"help\",\n usage: \"help [command]\",\n summary: \"Show this help, or detailed help for a command\",\n examples: [\"help\", \"help start\", \"start --help\"],\n },\n version: {\n name: \"version\",\n usage: \"version\",\n summary: \"Show the installed Fennec version\",\n examples: [\"version\"],\n },\n};\n\n// Map any alias/lookup key to a canonical registry key.\nconst LOOKUP: Record<string, string> = {\n logs: \"log\",\n \"-v\": \"version\",\n \"--version\": \"version\",\n \"-h\": \"help\",\n \"--help\": \"help\",\n};\n\n/** Resolve a user-typed command to a CommandDoc (handles aliases). */\nexport function findCommandDoc(cmd: string): CommandDoc | undefined {\n if (COMMANDS[cmd]) return COMMANDS[cmd];\n const alias = LOOKUP[cmd];\n return alias ? COMMANDS[alias] : undefined;\n}\n\n// ─── Renderers ───────────────────────────────────────────────────\n\nconst GROUPS: { title: string; keys: string[] }[] = [\n { title: \"Server\", keys: [\"start-server\"] },\n { title: \"Apps & Processes\", keys: [\"start\", \"run\", \"ps\", \"status\", \"log\", \"spawn\", \"stop\", \"restart\", \"kill\", \"group\", \"supervisor\", \"persist\", \"dev\", \"inspect\", \"info\", \"rename\"] },\n { title: \"Observation\", keys: [\"attach\", \"attach-pid\", \"attach-port\", \"pipe\", \"watch\"] },\n { title: \"Data\", keys: [\"export\", \"import\", \"cleanup\"] },\n { title: \"Configuration\", keys: [\"init\", \"setup\", \"install-browsers\", \"sessions\"] },\n { title: \"Other\", keys: [\"health\", \"help\", \"version\"] },\n];\n\nfunction pad(s: string, width: number): string {\n return s.length >= width ? s : s + \" \".repeat(width - s.length);\n}\n\n/** Full grouped help listing. */\nexport function showHelp(): void {\n const sep = fennecOrange(\"─\".repeat(56));\n const lines: string[] = [];\n\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Usage:\")} fennec ${pc.dim(\"<command>\")} ${pc.dim(\"[options]\")}`);\n lines.push(` ${pc.dim(\"Run\")} ${pc.cyan(\"fennec <command> --help\")} ${pc.dim(\"for details on any command.\")}`);\n\n for (const group of GROUPS) {\n lines.push(\"\");\n lines.push(` ${sep}`);\n lines.push(` ${pc.bold(group.title)}`);\n lines.push(` ${sep}`);\n lines.push(\"\");\n for (const key of group.keys) {\n const doc = COMMANDS[key];\n if (!doc) continue;\n const usageLabel = key === \"start-server\" ? \"start\" : (doc.short ?? doc.usage);\n lines.push(` ${pc.cyan(pad(usageLabel, 24))} ${pc.dim(doc.summary)}`);\n }\n }\n\n lines.push(\"\");\n lines.push(` ${pc.dim(\"─\".repeat(56))}`);\n lines.push(` ${pc.dim(\"Learn more:\")} ${pc.cyan(\"https://github.com/plumpslabs/fennec\")}`);\n lines.push(\"\");\n\n console.error(lines.join(\"\\n\"));\n}\n\n/** Detailed help for a single command. */\nexport function showCommandHelp(cmd: string): void {\n const doc = findCommandDoc(cmd);\n if (!doc) {\n console.error(`\\n ${pc.yellow(\"⚠\")} Unknown command: ${pc.bold(cmd)}`);\n console.error(` ${pc.dim(\"Run\")} ${pc.cyan(\"fennec help\")} ${pc.dim(\"to see all commands.\")}\\n`);\n return;\n }\n\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(` ${pc.bold(fennecOrange(doc.name))} ${pc.dim(\"—\")} ${doc.summary}`);\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Usage:\")} ${pc.cyan(`fennec ${doc.usage}`)}`);\n if (doc.aliases?.length) {\n lines.push(` ${pc.bold(\"Aliases:\")} ${doc.aliases.map((a) => pc.cyan(a)).join(\", \")}`);\n }\n if (doc.description) {\n lines.push(\"\");\n lines.push(` ${doc.description}`);\n }\n if (doc.options?.length) {\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Options:\")}`);\n const width = Math.max(...doc.options.map(([f]) => f.length));\n for (const [flag, desc] of doc.options) {\n lines.push(` ${pc.cyan(pad(flag, width))} ${pc.dim(desc)}`);\n }\n }\n if (doc.examples?.length) {\n lines.push(\"\");\n lines.push(` ${pc.bold(\"Examples:\")}`);\n for (const ex of doc.examples) {\n lines.push(` ${pc.dim(\"$\")} ${fennecOrange(`fennec ${ex}`)}`);\n }\n }\n lines.push(\"\");\n console.error(lines.join(\"\\n\"));\n}\n","import { PipeWatcher } from \"@plumpslabs/fennec-core\";\n\nexport 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 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","import { PortDetector } from \"@plumpslabs/fennec-core\";\n\nexport 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 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","import { PortDetector } from \"@plumpslabs/fennec-core\";\n\nexport 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 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\";\nimport { LogWatcher } from \"@plumpslabs/fennec-core\";\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 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 * Command: start / run — Spawn a process as a detached daemon.\n * Includes auto-resurrect: on server start, re-spawns tracked processes\n * that died since last session (like resurrect).\n *\n * With --restart flag: auto-restarts the process if it crashes (watch).\n */\nimport { mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { FennecServer } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { printBanner } from \"../utils/banner.js\";\nimport { symbols, renderKV, renderAppName, renderError, divider, createSpinner } from \"../utils/format.js\";\nimport { readTracked, addTracked, removeTracked, spawnDaemon, resolveArgs, isTrackedRunning, buildSpawnEnv, logFilePathFor, adoptExternalOnPort, extractFlagValue } from \"./tracker.js\";\nimport { ensureSupervisorRunning } from \"./supervisor.js\";\nimport { ensurePersistEnabled } from \"./persist.js\";\nimport { isProcessRunning, checkPort } from \"../utils/system-process.js\";\nimport { psCommand } from \"./ps.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\n\n/** Sleep helper */\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Wait until a freshly spawned daemon is confirmed \"ready\":\n * - If a port is provided, wait until the port accepts connections.\n * - Otherwise, wait a short grace period and confirm the PID is still alive\n * (catches commands that crash immediately, e.g. \"No rule to make target\").\n */\nasync function waitForReady(\n pid: number,\n port: number | undefined,\n timeoutMs = 8000,\n): Promise<{ running: boolean; portReady: boolean }> {\n const start = Date.now();\n const graceMs = 700;\n\n while (Date.now() - start < timeoutMs) {\n if (!isProcessRunning(pid)) return { running: false, portReady: false };\n if (port !== undefined) {\n if (await checkPort(port)) return { running: true, portReady: true };\n await sleep(250);\n continue;\n }\n // No port to probe: just make sure it survives the grace window.\n if (Date.now() - start >= graceMs) return { running: true, portReady: false };\n await sleep(150);\n }\n return { running: isProcessRunning(pid), portReady: port === undefined ? false : false };\n}\n\n// Re-export from tracker for backward compat\nexport type { TrackedProcess };\n\nexport async 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 const useSse = args.includes(\"--sse\");\n\n // Set env var so ConfigLoader picks it up (overrides config file)\n if (useSse) {\n process.env.FENNEC_TRANSPORT_TYPE = \"sse\";\n }\n\n try {\n const server = new FennecServer(configPath);\n\n // Auto-resurrect: re-spawn tracked processes that died since last session\n await resurrectTracked();\n\n await server.start();\n\n if (useSse) {\n const port = server.getConfig().transport.port;\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Fennec server is running\")}`);\n console.error(` ${renderKV(\"Transport\", pc.cyan(\"SSE (HTTP)\"))}`);\n console.error(` ${renderKV(\"URL\", pc.cyan(`http://localhost:${port}/sse`))}`);\n console.error(` ${renderKV(\"MCP Config\", pc.cyan(`{ \\\"type\\\": \\\"remote\\\", \\\"url\\\": \\\"http://localhost:${port}/sse\\\" }`))}`);\n console.error(` ${renderKV(\"OpenCode\", pc.cyan(`type: remote, url: http://localhost:${port}/sse`))}`);\n console.error(`\\n ${pc.dim(\"Press Ctrl+C to stop\")}\\n`);\n } else {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Fennec server is running\")}`);\n console.error(` ${renderKV(\"Transport\", \"stdio\")}`);\n console.error(` ${renderKV(\"AI Agent\", \"Connect via MCP protocol\")}`);\n console.error(` ${renderKV(\"Tip\", pc.dim(\"For SSE mode: fennec start --sse\"))}`);\n console.error(`\\n ${pc.dim(\"Press Ctrl+C to stop\")}\\n`);\n }\n } catch (error) {\n console.error(renderError(\"Failed to start server\", String(error)));\n process.exit(1);\n }\n}\n\nexport async function startCommand(args: string[]): Promise<void> {\n printBanner();\n console.error(` ${pc.dim(\"Starting app...\")}\\n`);\n await runCommand(args);\n}\n\nexport async 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 // Always record a working directory so the app can be re-spawned from\n // ANY terminal/path later (spawn/restart/supervisor). Defaults to the\n // directory where `fennec start` was run.\n const cwd = cwdIndex !== -1 ? resolve(args[cwdIndex + 1]!) : process.cwd();\n const restartFlag = args.includes(\"--restart\");\n const jsonlFlag = args.includes(\"--jsonl\");\n const group = extractFlagValue(args, \"--group\", \"-g\");\n\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 // Idempotent-by-port: if an EXTERNAL process is already listening on our\n // declared port (e.g. an AI agent launched it via raw bash), adopt it\n // instead of starting a duplicate that fails with EADDRINUSE.\n if (port !== undefined) {\n const adopted = adoptExternalOnPort(port, appName);\n if (adopted) {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Adopted\")} ${pc.bold(adopted.name)} ${pc.dim(`(PID ${adopted.pid}) — already listening on :${port}`)}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(`fennec log ${adopted.name}`))}`);\n console.error();\n return;\n }\n }\n\n // Duplicate Prevention\n const tracked = readTracked();\n const existing = tracked.find((t) => t.name === appName);\n if (existing && isTrackedRunning(existing)) {\n console.error();\n console.error(` ${pc.yellow(\"⚠\")} ${pc.bold(appName)} ${pc.dim(`is already running (PID: ${existing.pid})`)}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(`fennec log ${appName}`))}`);\n console.error(` ${renderKV(\"Stop\", pc.cyan(`fennec kill ${appName}`))}`);\n console.error();\n process.exit(0);\n }\n\n const logDir = dirname(logFilePathFor(appName));\n mkdirSync(logDir, { recursive: true });\n const logFilePath = logFilePathFor(appName);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Starting\")} ${renderAppName(appName)} ${pc.dim(\"(daemon)\")}\\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 if (restartFlag) console.error(` ${renderKV(\"Auto-restart\", pc.green(\"enabled\"))}`);\n if (group) console.error(` ${renderKV(\"Group\", group)}`);\n console.error(` ${divider()}`);\n\n try {\n // Snapshot the environment at start time so this app keeps its\n // variables (DB URL, nvm PATH, NODE_ENV, ...) even when later\n // spawned/restarted from a different terminal or the supervisor.\n const startEnv: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (v !== undefined) startEnv[k] = v;\n }\n\n const currentChild = spawnDaemon({ cmdParts, name: appName, cwd, logFilePath, env: buildSpawnEnv(startEnv), logMode: jsonlFlag ? \"jsonl\" : \"text\" });\n\n const pid = currentChild.pid ?? 0;\n\n addTracked({\n name: appName,\n pid,\n command: cmd,\n args: cmdParts,\n port,\n cwd,\n env: startEnv,\n startedAt: new Date().toISOString(),\n autoRestart: restartFlag,\n logMode: jsonlFlag ? \"jsonl\" : \"text\",\n group,\n });\n\n console.error(` ${pc.green(\"✓\")} ${pc.bold(appName)} ${pc.dim(`started (PID: ${pid})`)}`);\n\n // Verify the app actually came up before we hand back control.\n const spinner = createSpinner(port ? `Waiting for ${appName} on port ${port}...` : `Confirming ${appName} is running...`);\n const ready = await waitForReady(pid, port);\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (!ready.running) {\n // Crashed almost immediately (bad command, missing target, etc.)\n removeTracked(appName);\n console.error(` ${pc.red(\"✗\")} ${pc.bold(appName)} ${pc.dim(\"exited immediately after start\")}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(`fennec log ${appName}`))}`);\n console.error();\n process.exit(1);\n }\n\n if (port) {\n if (ready.portReady) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(appName)} ${pc.dim(`is listening on port ${port}`)}`);\n } else {\n console.error(` ${pc.yellow(\"⚠\")} ${pc.bold(appName)} ${pc.dim(`is running but port ${port} is not accepting connections yet`)}`);\n }\n }\n\n // If --restart is set, hand crash-watching to the detached supervisor\n // daemon so it survives this terminal closing (no foreground Ctrl+C).\n if (restartFlag) {\n const supPid = ensureSupervisorRunning();\n ensurePersistEnabled();\n console.error(` ${pc.green(\"✓\")} ${pc.bold(\"Auto-restart\")} ${pc.dim(`managed by supervisor (PID ${supPid}) — survives terminal close`)}`);\n console.error(` ${renderKV(\"Supervisor\", pc.cyan(\"fennec supervisor status\"))}`);\n }\n\n // Show the process table and exit cleanly. Because the daemon logs\n // directly to its own file, we no longer hold any pipes — the event\n // loop drains and the CLI returns immediately without needing Ctrl+C.\n await psCommand([]);\n } catch (error) {\n console.error(renderError(`Failed to start ${appName}`, String(error)));\n process.exit(1);\n }\n}\n\n/**\n * like resurrect: Re-spawn tracked processes that died.\n * Called automatically during `fennec start` (server mode).\n * Reads tracked.json, checks each PID, re-spawns stopped ones.\n */\nexport async function resurrectTracked(): Promise<void> {\n const tracked = readTracked();\n if (tracked.length === 0) return;\n\n const dead = tracked.filter((t) => !isTrackedRunning(t));\n if (dead.length === 0) return;\n\n const spinner = createSpinner(`Resurrecting ${dead.length} stopped process(es)...`);\n let resurrected = 0;\n let failed = 0;\n\n for (const proc of dead) {\n // Only resurrect if the process has a command (not just a PID reference)\n if (!proc.command) {\n removeTracked(proc.name);\n continue;\n }\n\n try {\n const cmdParts = resolveArgs(proc);\n const logFilePath = logFilePathFor(proc.name);\n\n const child = spawnDaemon({ cmdParts, name: proc.name, cwd: proc.cwd, logFilePath, env: buildSpawnEnv(proc.env), logMode: proc.logMode });\n\n // Update PID in tracked.json — preserve autoRestart so the supervisor\n // keeps managing it, and carry restartCause forward.\n addTracked({\n name: proc.name,\n pid: child.pid ?? 0,\n command: proc.command,\n args: cmdParts,\n port: proc.port,\n cwd: proc.cwd,\n env: proc.env,\n startedAt: new Date().toISOString(),\n autoRestart: proc.autoRestart,\n restartCause: proc.restartCause,\n logMode: proc.logMode,\n });\n\n resurrected++;\n } catch {\n failed++;\n }\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (resurrected > 0) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(`Resurrected ${resurrected} process(es)`)}`);\n }\n if (failed > 0) {\n console.error(` ${pc.red(\"●\")} ${pc.bold(`${failed} process(es) failed to resurrect`)}`);\n }\n}\n","/**\n * Process Tracker — Shared state for managing ~/.fennec/tracked.json\n * Extracted from index.ts to be reusable across all CLI command files.\n */\nimport { existsSync, writeFileSync, readFileSync, mkdirSync, renameSync, statSync, rmSync, openSync, closeSync, writeSync } from \"node:fs\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { resolve, dirname, basename } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { isProcessRunning, getProcessCmdline, getProcessEnviron, getProcessCwd, findPidOnPort, killTree } from \"../utils/system-process.js\";\n\nexport interface TrackedProcess {\n name: string;\n pid: number;\n command: string;\n /**\n * The raw argv used to spawn the process. Preferred over `command`\n * (a display string) when re-spawning, because splitting `command`\n * on whitespace breaks arguments that contain spaces/quotes.\n */\n args?: string[];\n port?: number;\n cwd?: string;\n /**\n * Environment captured when the app was first started. Re-applied on\n * spawn/respawn so apps started in one terminal keep their variables\n * (DATABASE_URL, PATH from nvm, NODE_ENV, ...) even when later managed\n * from a different terminal or by the detached supervisor.\n */\n env?: Record<string, string>;\n startedAt: string;\n /** When true, the supervisor daemon auto-restarts this app if it dies. */\n autoRestart?: boolean;\n /** Restart-cause annotation (e.g. \"crash\", \"port-down\") set by supervisor. */\n restartCause?: string;\n /** True when the supervisor has restarted this app repeatedly in a short\n * window (crash-loop / flapping) — surfaced so users know it's unstable. */\n flapping?: boolean;\n /**\n * Log format written by spawnDaemon. \"text\" = raw app output (human\n * readable, default). \"jsonl\" = structured per-line JSON (timestamp +\n * level + source) so AI tools can query/filter reliably. Stored so\n * re-spawns keep the same format.\n */\n logMode?: \"text\" | \"jsonl\";\n /** HTTP readiness URL (resolved at spawn) — supervisor health-checks this\n * instead of a bare TCP port when present. */\n healthCheck?: string;\n /** Optional logical group this entry belongs to (e.g. \"crm\", \"staging\"). */\n group?: string;\n}\n\nexport type TargetKind = \"single\" | \"names\" | \"group\" | \"all\" | \"none\";\nexport interface Target {\n kind: TargetKind;\n /** name or pid string for kind === \"single\" */\n value?: string;\n /** multiple names/pids for kind === \"names\" (e.g. `kill a b c`) */\n values?: string[];\n /** group name for kind === \"group\" */\n group?: string;\n}\n\n/** Extract `--flag value`, `--flag=value`, or `-f value` from args. */\nexport function extractFlagValue(args: string[], long: string, short?: string): string | undefined {\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!;\n if (a === long || (short && a === short)) return args[i + 1];\n if (a.startsWith(`${long}=`)) return a.slice(long.length + 1);\n if (short && a.startsWith(`${short}=`)) return a.slice(short.length + 1);\n }\n return undefined;\n}\n\n/** Distinct non-empty groups present in tracked.json, sorted. */\nexport function getGroups(): string[] {\n const tracked = readTracked();\n const groups = new Set<string>();\n for (const t of tracked) if (t.group) groups.add(t.group);\n return [...groups].sort();\n}\n\n/**\n * Resolve a bulk command's scope from its args:\n * - `--group X` / `-g X` → group X\n * - positional matching a known group → group X (shorthand)\n * - positional otherwise → single name/pid\n * - `--all` / `-a` → all tracked\n * - nothing → none (caller decides)\n */\nexport function resolveTargets(args: string[]): Target {\n const groupFlag = extractFlagValue(args, \"--group\", \"-g\");\n const all = args.includes(\"--all\") || args.includes(\"-a\");\n // All non-flag, non `--key=value` positionals (names/pids passed directly).\n const positionals = args.filter((a) => !a.startsWith(\"-\") && !a.includes(\"=\"));\n const groups = getGroups();\n\n if (groupFlag) return { kind: \"group\", group: groupFlag };\n // Legacy bare `kill all` / `stop all` / `spawn all` — means \"all tracked\".\n if (positionals.length === 1 && positionals[0] === \"all\") return { kind: \"all\" };\n if (all) return { kind: \"all\" };\n // Single positional that matches a known group → group shorthand.\n if (positionals.length === 1 && groups.includes(positionals[0]!)) {\n return { kind: \"group\", group: positionals[0] };\n }\n if (positionals.length === 1) return { kind: \"single\", value: positionals[0] };\n if (positionals.length > 1) return { kind: \"names\", values: positionals };\n return { kind: \"none\" };\n}\n\n/** Assign (or clear, with `undefined`) a group on an existing tracked entry. */\nexport function setGroup(name: string, group?: string): boolean {\n const tracked = readTracked();\n const idx = tracked.findIndex((t) => t.name === name);\n if (idx === -1) return false;\n tracked[idx] = { ...tracked[idx]!, group };\n saveTracked(tracked);\n return true;\n}\n\n/** Marker line written to a log when the supervisor restarts an app. */\nexport const RESTART_CAUSE = \"fennec:restart\";\n\nexport function getFennecDir(): string {\n return process.env.FENNEC_DATA_DIR\n ? resolve(process.env.FENNEC_DATA_DIR)\n : resolve(homedir(), \".fennec\");\n}\n\nexport function getTrackedPath(): string {\n return resolve(getFennecDir(), \"tracked.json\");\n}\n\n/** Path to the supervisor daemon's PID file. */\nexport function getSupervisorPidPath(): string {\n return resolve(getFennecDir(), \"supervisor.pid\");\n}\n\n/** Absolute path to an app's log file (respects FENNEC_DATA_DIR). */\nexport function logFilePathFor(name: string): string {\n return resolve(getFennecDir(), \"logs\", `${name}.log`);\n}\n\nexport function 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\nexport function 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 (err) {\n console.error(\"[fennec] Failed to save tracked processes:\", err instanceof Error ? err.message : String(err));\n }\n}\n\nexport function addTracked(proc: TrackedProcess): void {\n const tracked = readTracked();\n const filtered = tracked.filter((t) => t.name !== proc.name);\n filtered.push(proc);\n saveTracked(filtered);\n}\n\nexport function removeTracked(name: string): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.name !== name));\n}\n\n/**\n * Toggle the auto-restart flag for a tracked app by name.\n * Used so an intentional `stop` isn't immediately undone by the supervisor.\n */\nexport function setAutoRestart(name: string, value: boolean): void {\n const tracked = readTracked();\n let changed = false;\n for (const t of tracked) {\n if (t.name === name) { t.autoRestart = value; changed = true; }\n }\n if (changed) saveTracked(tracked);\n}\n\nexport function removeTrackedByPid(pid: number): void {\n const tracked = readTracked();\n saveTracked(tracked.filter((t) => t.pid !== pid));\n}\n\n/**\n * Resolve the argv for a tracked process. Prefers the stored `args`\n * array (spawn-safe); falls back to whitespace-splitting `command`\n * for entries saved before `args` existed.\n */\nexport function resolveArgs(proc: Pick<TrackedProcess, \"args\" | \"command\">): string[] {\n if (proc.args && proc.args.length > 0) return proc.args;\n return proc.command.split(/\\s+/).filter(Boolean);\n}\n\n/**\n * Adopt an ALREADY-RUNNING process (started via raw bash, another tool, or a\n * previous session) into fennec's tracked registry — without restarting it.\n * This is the human-facing counterpart to the agent's `process_adopt`: it\n * stops an externally-launched server from becoming an untracked orphan (and\n * prevents `start`/`spawn` from creating a duplicate that fails with\n * EADDRINUSE). Enriches the entry from /proc when details are omitted.\n */\nexport function adoptProcess(\n pid: number,\n opts: { name?: string; port?: number; command?: string; cwd?: string; env?: Record<string, string>; autoRestart?: boolean } = {},\n): TrackedProcess | null {\n if (!isProcessRunning(pid)) return null;\n const command = opts.command ?? getProcessCmdline(pid) ?? `pid ${pid}`;\n const cwd = opts.cwd ?? getProcessCwd(pid) ?? undefined;\n const name = opts.name ?? `pid_${pid}`;\n const entry: TrackedProcess = {\n name,\n pid,\n command,\n port: opts.port,\n cwd,\n env: opts.env,\n startedAt: new Date().toISOString(),\n autoRestart: opts.autoRestart ?? true,\n flapping: false,\n };\n addTracked(entry);\n return entry;\n}\n\n/**\n * If something is ALREADY listening on `port` (e.g. an AI agent launched the\n * server via raw bash, or a previous `start` is still bound), adopt that\n * existing process instead of spawning a duplicate that would fail with\n * EADDRINUSE. Returns the adopted entry, or null if nothing is listening (or\n * the listener is already one of our tracked processes).\n */\nexport function adoptExternalOnPort(port: number, name?: string): TrackedProcess | null {\n const occ = findPidOnPort(port);\n if (!occ) return null;\n const tracked = readTracked();\n if (tracked.some((t) => t.pid === occ.pid)) return null; // already ours\n return adoptProcess(occ.pid, { port, name });\n}\n\n/**\n * Verify a tracked process is genuinely still OUR process — not just a\n * live PID. Guards against PID reuse: after a process dies the OS may\n * assign the same PID to an unrelated program, which would otherwise\n * show up as a false \"running\". We confirm the live PID's cmdline still\n * matches the executable we spawned.\n *\n * On platforms without /proc (cmdline unavailable) we can't verify, so\n * we fall back to the plain liveness check to avoid false negatives.\n */\nexport function isTrackedRunning(proc: TrackedProcess): boolean {\n if (!isProcessRunning(proc.pid)) return false;\n\n // Preferred: verify ownership via the FENNEC_APP_NAME marker we inject at\n // spawn. Robust even if the app re-execs a different binary (where cmdline\n // matching would wrongly report \"dead\"). Only treat the marker as\n // authoritative when it is PRESENT — an adopted/external process has no\n // marker, so we must fall through to the cmdline check instead of assuming\n // \"not ours\".\n const environ = getProcessEnviron(proc.pid);\n if (environ && \"FENNEC_APP_NAME\" in environ) {\n return environ.FENNEC_APP_NAME === proc.name;\n }\n\n // Fallback (non-Linux / no /proc/environ): trust cmdline basename match.\n const cmdline = getProcessCmdline(proc.pid);\n if (!cmdline) return true; // cannot verify — trust the PID\n\n const argv = resolveArgs(proc);\n const exe = argv[0];\n if (!exe) return true;\n\n // The process was spawned directly, so argv[0] should appear in the\n // live cmdline. Compare on basename to tolerate absolute-path resolution.\n const exeBase = basename(exe);\n if (exeBase.length === 0) return true;\n return cmdline.includes(exeBase);\n}\n\nexport function 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\n// ─── Log Rotation ─────────────────────────────────────────────────\n// Rotates log files when they exceed maxSize (default: 10MB).\n// Keeps up to maxFiles rotated copies (default: 3) then deletes oldest.\n\nconst DEFAULT_MAX_LOG_SIZE = 10 * 1024 * 1024; // 10MB\nconst DEFAULT_MAX_LOG_FILES = 3;\n\n/**\n * Check if a log file needs rotation and rotate if necessary.\n * Returns true if rotation was performed.\n */\nexport function rotateLogFile(\n filePath: string,\n maxSize = DEFAULT_MAX_LOG_SIZE,\n maxFiles = DEFAULT_MAX_LOG_FILES,\n): boolean {\n try {\n if (!existsSync(filePath)) return false;\n const stats = statSync(filePath);\n if (stats.size < maxSize) return false;\n\n // Rotate: .log -> .log.1 -> .log.2 -> .log.3 (delete oldest)\n const dir = dirname(filePath);\n const base = basename(filePath);\n\n // Delete oldest if exists\n const oldestPath = resolve(dir, `${base}.${maxFiles}`);\n if (existsSync(oldestPath)) {\n try { rmSync(oldestPath); } catch { /* best-effort */ }\n }\n\n // Shift existing rotations\n for (let i = maxFiles - 1; i >= 1; i--) {\n const src = resolve(dir, `${base}.${i}`);\n const dst = resolve(dir, `${base}.${i + 1}`);\n if (existsSync(src)) {\n try { renameSync(src, dst); } catch { /* best-effort */ }\n }\n }\n\n // Rotate current file\n try {\n renameSync(filePath, resolve(dir, `${base}.1`));\n } catch { /* best-effort */ }\n\n return true;\n } catch (err) {\n console.error(\"[fennec] Log rotation failed:\", err instanceof Error ? err.message : String(err));\n return false;\n }\n}\n\n// ─── Daemon Spawner ───────────────────────────────────────────────\n// Spawns a detached daemon whose stdout/stderr are redirected DIRECTLY\n// to the log file descriptor (style). This is critical: it means\n// the child writes its own logs to disk, so the launching CLI process\n// can exit immediately without killing logging — and `fennec log -f`\n// keeps receiving new lines after the launcher is gone.\n\nexport interface SpawnDaemonOptions {\n cmdParts: string[];\n /** App name — injected as FENNEC_APP_NAME so fennec can verify ownership. */\n name: string;\n cwd?: string;\n logFilePath: string;\n env?: Record<string, string>;\n /** \"jsonl\" writes structured per-line JSON (timestamp+level+source+line). */\n logMode?: \"text\" | \"jsonl\";\n}\n\n// ─── Secret redaction (AI-safe) ───────────────────────────────────\n// Mirrors the core package so daemon-written logs never hit disk with\n// raw credentials. Best-effort: keeps a hint of the shape for debugging.\n/**\n * Build the environment for a spawned app. Starts from the environment\n * captured at `start` time (so app-specific vars survive being managed\n * from another terminal/supervisor), then overlays the current process\n * environment so live system paths (PATH, HOME, TERM, ...) are current,\n * and finally pins fennec's own state dirs so the child logs/supervises\n * into the same fennec instance regardless of where it's launched.\n */\nexport function buildSpawnEnv(stored?: Record<string, string>): Record<string, string> {\n // Start from the live environment so system paths (PATH, HOME, TERM, ...)\n // stay current, then overlay the explicitly-provided (start-time/config)\n // env so those values win over anything inherited. This keeps config\n // `env: { PORT: \"47111\" }` authoritative instead of being clobbered.\n const merged: Record<string, string> = { ...process.env } as Record<string, string>;\n for (const [k, v] of Object.entries(stored ?? {})) {\n if (v !== undefined) merged[k] = v;\n }\n if (process.env.FENNEC_DATA_DIR) merged.FENNEC_DATA_DIR = process.env.FENNEC_DATA_DIR;\n if (process.env.HOME) merged.HOME = process.env.HOME;\n return merged;\n}\n\n/**\n * Spawn a detached background process that logs directly to a file.\n * The returned ChildProcess is unref'd so it won't keep the parent\n * event loop alive. The parent may still listen to its \"exit\" event\n * (e.g. for --restart watching) as long as the loop is kept alive by\n * other means.\n */\n/**\n * Respawn a tracked process quietly (no UI) and update its registry entry\n * with the new PID/args. Returns the new PID. Used by the supervisor and\n * by command-level respawns.\n */\nexport function respawnTracked(proc: TrackedProcess, cause?: string): number {\n const cmdParts = resolveArgs(proc);\n const logFilePath = logFilePathFor(proc.name);\n mkdirSync(dirname(logFilePath), { recursive: true });\n if (cause) annotateRestart(logFilePath, cause);\n // Kill the (possibly still-alive) previous instance so a \"port-down\"\n // restart doesn't leave an orphan holding the port (which would then\n // cause an EADDRINUSE cascade on the new instance). Kill the whole\n // tree so grandchildren (npm → vite → esbuild) don't survive.\n if (isProcessRunning(proc.pid)) {\n try { killTree(proc.pid, \"SIGTERM\"); } catch { /* best-effort */ }\n }\n const child = spawnDaemon({\n cmdParts,\n name: proc.name,\n cwd: proc.cwd,\n logFilePath,\n env: buildSpawnEnv(proc.env),\n logMode: proc.logMode,\n });\n const pid = child.pid ?? 0;\n addTracked({\n ...proc,\n pid,\n args: cmdParts,\n startedAt: new Date().toISOString(),\n restartCause: cause,\n });\n return pid;\n}\n\n/**\n * Spawn a process as a detached daemon whose output is written straight to the\n * log file, so logs survive the launching CLI process exiting.\n *\n * - text mode: the child inherits the log file fd directly.\n * - jsonl mode: a tiny detached relay process wraps each line as structured\n * JSON ({ts,level,source,line}) and writes to the file. The relay outlives\n * the launching CLI because it is detached (otherwise the parent relay would\n * die with the CLI and lose all output).\n */\nexport function spawnDaemon(opts: SpawnDaemonOptions): ChildProcess {\n rotateLogFile(opts.logFilePath);\n // Inject a marker so fennec can verify process ownership even if the app\n // later re-execs a different binary (cmdline matching alone is fragile).\n const env = { ...(opts.env ?? buildSpawnEnv()), FENNEC_APP_NAME: opts.name };\n if (opts.logMode === \"jsonl\") {\n return spawnDaemonJsonl(opts, env);\n }\n const fd = openSync(opts.logFilePath, \"a\");\n const child = spawn(opts.cmdParts[0]!, opts.cmdParts.slice(1), {\n cwd: opts.cwd,\n env,\n stdio: [\"ignore\", fd, fd],\n detached: true,\n });\n child.unref();\n // Child now owns a dup of the fd; we can close our copy.\n child.once(\"spawn\", () => {\n try { closeSync(fd); } catch { /* best-effort */ }\n });\n return child;\n}\n\n/** jsonl variant: a detached relay reads the child's stdout+stderr and writes JSONL. */\nfunction spawnDaemonJsonl(opts: SpawnDaemonOptions, env: Record<string, string>): ChildProcess {\n const relay = spawn(\n process.execPath,\n [\"-e\", JSONL_RELAY],\n {\n env: { ...process.env, FENNEC_RELAY_LOG: opts.logFilePath },\n stdio: [\"pipe\", \"ignore\", \"ignore\"],\n detached: true,\n },\n );\n relay.unref();\n const child = spawn(opts.cmdParts[0]!, opts.cmdParts.slice(1), {\n cwd: opts.cwd,\n env,\n stdio: [\"ignore\", relay.stdin!, relay.stdin!],\n detached: true,\n });\n child.unref();\n // Release the parent's hold on the relay's stdin write-end. `spawn` dups the\n // fd into the child, so the child keeps writing; but destroying our copy\n // means the relay receives EOF (and exits) when the child dies — otherwise a\n // long-lived parent (the supervisor) would keep the pipe open forever and\n // leak relays (which also risks SIGPIPE-killing the app).\n try { relay.stdin?.destroy(); } catch { /* best-effort */ }\n // The relay flushes and exits once the child's streams close.\n return child;\n}\n\n/**\n * Self-contained JSONL relay (runs in a detached node process). Reads raw lines\n * from stdin, redacts obvious secrets, classifies level, and appends structured\n * JSON to the file named by FENNEC_RELAY_LOG.\n */\nconst JSONL_RELAY = `\nconst fs = require('fs');\nconst fd = fs.openSync(process.env.FENNEC_RELAY_LOG, 'a');\nlet buf = '';\nconst SECRET = new RegExp('(password|passwd|token|secret|api[_-]?key|access[_-]?key).{0,60}', 'gi');\nfunction redact(s){ return s.replace(SECRET, '$1***'); }\nfunction level(s){\n const t = s.toLowerCase();\n if (t.indexOf('error')>=0 || t.indexOf('fail')>=0 || t.indexOf('fatal')>=0 || t.indexOf('exception')>=0 || t.indexOf('denied')>=0 || t.indexOf('refused')>=0 || t.indexOf('cannot')>=0 || t.indexOf('panic')>=0) return 'error';\n if (t.indexOf('warn')>=0) return 'warn';\n return 'info';\n}\nfunction flush(){\n const parts = buf.split('\\\\n');\n buf = parts.pop() || '';\n for (const r of parts){\n if (!r) continue;\n const line = redact(r);\n try { fs.writeSync(fd, JSON.stringify({ ts: new Date().toISOString(), level: level(line), source: 'app', line }) + '\\\\n'); } catch (e) {}\n }\n}\nprocess.stdin.on('data', (c) => { buf += c.toString('utf8'); flush(); });\nprocess.stdin.on('end', () => { flush(); try { fs.closeSync(fd); } catch (e) {} process.exit(0); });\nprocess.stdin.on('error', () => { process.exit(0); });\n`;\n\n/** Write a restart-cause separator into the log (used by the supervisor). */\nexport function annotateRestart(logFilePath: string, cause: string): void {\n try {\n const fd = openSync(logFilePath, \"a\");\n try {\n writeSync(fd, `\\n${RESTART_CAUSE} cause=${cause} at=${new Date().toISOString()}\\n`);\n } finally {\n closeSync(fd);\n }\n } catch { /* best-effort */ }\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, readlinkSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { cpus } from \"node:os\";\nimport net from \"node:net\";\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 runTasklistProcesses(): SystemProcessInfo[] {\n try {\n const output = execSync(\"tasklist /fo csv /nh 2>nul\", { encoding: \"utf-8\", timeout: 5000 });\n const result: SystemProcessInfo[] = [];\n for (const raw of output.split(\"\\n\")) {\n if (!raw.trim()) continue;\n const parts = raw.split('\",\"').map((p) => p.replace(/^\"|\"$/g, \"\"));\n const pid = parseInt(parts[1] ?? \"\", 10);\n if (isNaN(pid)) continue;\n const image = parts[0] ?? \"\";\n const name = image.replace(/\\.[a-z0-9]+$/i, \"\");\n const memKb = parseInt((parts[4] ?? \"\").replace(/[^\\d]/g, \"\"), 10) || 0;\n result.push({\n pid,\n name,\n command: image,\n cpuPercent: 0,\n memPercent: 0,\n memRss: memKb,\n state: \"R\",\n startedAt: null,\n ports: [],\n isUserProcess: false,\n });\n }\n return result;\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 // Linux uses /proc (richest); macOS/BSD use ps; Windows uses tasklist.\n if (process.platform === \"win32\") {\n processes = runTasklistProcesses();\n } else 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 * Kill a process AND its entire descendant tree (cross-platform).\n *\n * Why this matters: apps are spawned `detached`, which makes the direct child a\n * process-GROUP leader on POSIX. A plain `kill(pid)` only stops that leader\n * (e.g. `npm`), leaving its children (`node` -> `vite` -> `esbuild`) as\n * ORPHANS that keep running and leaking CPU/memory/ports (\"nyampah\").\n *\n * - POSIX (Linux/macOS): signal the whole group via the negative PID\n * (`process.kill(-pid, signal)`). Falls back to a direct PID kill when the\n * target was not a group leader (e.g. ESRCH/EPERM paths).\n * - Windows: `process.kill(-pid)` is unsupported, so use `taskkill /T /F`\n * which kills the process and all descendants natively.\n *\n * Best-effort: returns true if the root was signaled, false if it was\n * already gone. Never throws.\n */\nexport function killTree(pid: number, signal: NodeJS.Signals = \"SIGTERM\"): boolean {\n if (process.platform === \"win32\") {\n try {\n // /T = tree, /F = force. Windows has no clean SIGTERM-tree equivalent;\n // /F is the practical choice for stop/kill here.\n execSync(`taskkill /pid ${pid} /T /F`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n try { process.kill(pid, signal); return true; } catch { return false; }\n }\n }\n\n // POSIX: negative PID targets the entire process group.\n try {\n process.kill(-pid, signal);\n return true;\n } catch (e) {\n const code = (e as NodeJS.ErrnoException).code;\n if (code === \"ESRCH\") return false; // already gone\n // EPERM or other: try a plain single-PID kill as a last resort.\n try { process.kill(pid, signal); return true; } catch { 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 * Cheaply read a single process's resident memory (RSS) in KB.\n *\n * Unlike `getProcessByPid` (which enumerates EVERY process), this only\n * touches the one target process — so calling it for a handful of tracked\n * apps in `ps` stays fast. Returns null if the process is gone or the\n * platform lookup fails.\n */\nexport function getProcessMemRss(pid: number): number | null {\n if (process.platform === \"win32\") {\n try {\n const out = execSync(`tasklist /fi \"PID eq ${pid}\" /fo csv /nh 2>nul`, { encoding: \"utf-8\", timeout: 3000 });\n for (const raw of out.split(\"\\n\")) {\n if (!raw.trim()) continue;\n const parts = raw.split('\",\"').map((p) => p.replace(/^\"|\"$/g, \"\"));\n if (parseInt(parts[1] ?? \"\", 10) !== pid) continue;\n const memKb = parseInt((parts[4] ?? \"\").replace(/[^\\d]/g, \"\"), 10);\n return isNaN(memKb) ? null : memKb;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n if (process.platform === \"darwin\" || process.platform === \"freebsd\" || process.platform === \"openbsd\" || process.platform === \"netbsd\") {\n try {\n const out = execSync(`ps -o rss= -p ${pid} 2>/dev/null`, { encoding: \"utf-8\", timeout: 3000 }).trim();\n const kb = parseInt(out, 10);\n return isNaN(kb) ? null : kb;\n } catch {\n return null;\n }\n }\n\n // Linux / other /proc systems\n try {\n const status = readFileSync(`/proc/${pid}/status`, \"utf-8\");\n const m = status.match(/VmRSS:\\s+(\\d+)/);\n return m ? parseInt(m[1]!, 10) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if something is accepting TCP connections on a port.\n * Tries both IPv4 (127.0.0.1) and IPv6 (::1) loopback so apps that bind to\n * localhost (which often resolves to ::1, e.g. Next.js/Vite) aren't falsely\n * reported as \"not listening\". Resolves true if EITHER connects.\n */\nexport function checkPort(port: number, host: string = \"127.0.0.1\", timeout = 1000): Promise<boolean> {\n const tryHost = (h: string): Promise<boolean> =>\n new Promise((resolve) => {\n const socket = new net.Socket();\n let settled = false;\n const finish = (result: boolean) => {\n if (settled) return;\n settled = true;\n socket.destroy();\n resolve(result);\n };\n socket.setTimeout(timeout);\n socket.once(\"connect\", () => finish(true));\n socket.once(\"timeout\", () => finish(false));\n socket.once(\"error\", () => finish(false));\n socket.connect(port, h);\n });\n\n return tryHost(host).then((ok) => (ok ? true : tryHost(\"::1\")));\n}\n\n/**\n * HTTP readiness/health probe. Resolves true only on a 2xx/3xx response;\n * any network error, timeout, or 4xx/5xx resolves false (so the supervisor\n * treats the app as unhealthy and restarts it). Used when an app declares a\n * `healthCheck` URL — a stronger signal than a bare TCP port check.\n */\nexport async function checkHttp(url: string, timeout = 2000): Promise<boolean> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n const res = await fetch(url, { method: \"GET\", signal: controller.signal, redirect: \"manual\" });\n return res.status >= 200 && res.status < 400;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Resolve a `healthCheck` declaration to a concrete URL.\n * - starts with http(s):// → used verbatim\n * - starts with \"/\" → http://127.0.0.1:<port><path>\n * Returns null when the form can't be resolved (e.g. a path with no port).\n */\nexport function resolveHealthUrl(healthCheck: string, port?: number): string | null {\n if (/^https?:\\/\\//i.test(healthCheck)) return healthCheck;\n if (healthCheck.startsWith(\"/\")) {\n if (!port) return null;\n return `http://127.0.0.1:${port}${healthCheck}`;\n }\n return null;\n}\n\n/**\n * Find the PID (and command) of whatever process is LISTENING on `port`.\n * Cross-platform: Linux via /proc, macOS via `lsof`, Windows via `netstat`.\n * Returns null when nothing is listening or the platform tools are missing.\n * Used to adopt an externally-started server (e.g. one an AI agent launched\n * via raw bash) instead of spawning a duplicate that fails with EADDRINUSE.\n */\nexport function findPidOnPort(port: number): { pid: number; command: string } | null {\n if (process.platform === \"win32\") return findPidOnPortWindows(port);\n if (process.platform === \"darwin\") return findPidOnPortMac(port);\n return findPidOnPortLinux(port);\n}\n\nfunction findPidOnPortLinux(port: number): { pid: number; command: string } | null {\n try {\n const hexPort = port.toString(16).toUpperCase().padStart(4, \"0\");\n const inodes = new Set<number>();\n for (const f of [\"/proc/net/tcp\", \"/proc/net/tcp6\"]) {\n if (!existsSync(f)) continue;\n for (const line of readFileSync(f, \"utf-8\").split(\"\\n\").slice(1)) {\n const cols = line.trim().split(/\\s+/);\n if (cols.length < 10) continue;\n if (cols[3] !== \"0A\") continue; // 0A = LISTEN\n const localPort = cols[1]?.split(\":\")[1];\n const inode = parseInt(cols[9] ?? \"\", 10);\n if (localPort === hexPort && !Number.isNaN(inode)) inodes.add(inode);\n }\n }\n if (inodes.size === 0) return null;\n for (const pidStr of readdirSync(\"/proc\").filter((d) => /^\\d+$/.test(d))) {\n const pid = parseInt(pidStr, 10);\n try {\n const fdDir = `/proc/${pid}/fd`;\n for (const fd of readdirSync(fdDir)) {\n const link = readlinkSync(`${fdDir}/${fd}`);\n const m = link.match(/socket:\\[(\\d+)\\]/);\n if (m && inodes.has(parseInt(m[1]!, 10))) {\n return { pid, command: getProcessCmdline(pid) ?? \"\" };\n }\n }\n } catch { /* pid may have exited */ }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction findPidOnPortMac(port: number): { pid: number; command: string } | null {\n try {\n const out = execSync(`lsof -i :${port} -sTCP:LISTEN -P -n 2>/dev/null`, { encoding: \"utf-8\", timeout: 5000 });\n for (const line of out.split(\"\\n\")) {\n if (!line.includes(\"LISTEN\")) continue;\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 2) {\n const pid = parseInt(parts[1]!, 10);\n if (!isNaN(pid)) return { pid, command: parts[0] ?? \"\" };\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction findPidOnPortWindows(port: number): { pid: number; command: string } | null {\n try {\n const out = execSync(`netstat -ano -p tcp 2>nul`, { encoding: \"utf-8\", timeout: 5000 });\n const target = `:${port} `;\n for (const line of out.split(\"\\n\")) {\n const upper = line.toUpperCase();\n if (!upper.includes(\"LISTENING\")) continue;\n if (!upper.includes(target)) continue;\n const pid = parseInt(line.trim().split(/\\s+/).pop() ?? \"\", 10);\n if (!isNaN(pid)) return { pid, command: getProcessCmdline(pid) ?? \"\" };\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Read the full command line (argv, space-joined) of a running PID.\n * Cross-platform: Linux /proc, macOS `ps`, Windows `wmic`. Returns null when\n * unavailable — callers should treat null as \"cannot verify\", not \"mismatch\".\n */\nexport function getProcessCmdline(pid: number): string | null {\n if (process.platform === \"win32\") return getProcessCmdlineWindows(pid);\n if (process.platform === \"darwin\") return getProcessCmdlineMac(pid);\n return getProcessCmdlineLinux(pid);\n}\n\nfunction getProcessCmdlineLinux(pid: number): string | null {\n try {\n const raw = readFileSync(`/proc/${pid}/cmdline`, \"utf-8\");\n const joined = raw.split(\"\\0\").filter(Boolean).join(\" \").trim();\n return joined.length > 0 ? joined : null;\n } catch {\n return null;\n }\n}\n\nfunction getProcessCmdlineMac(pid: number): string | null {\n try {\n const out = execSync(`ps -p ${pid} -o command=`, { encoding: \"utf-8\", timeout: 3000 });\n const trimmed = out.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch {\n return null;\n }\n}\n\nfunction getProcessCmdlineWindows(pid: number): string | null {\n try {\n const out = execSync(`wmic process where ProcessId=${pid} get CommandLine /value 2>nul`, { encoding: \"utf-8\", timeout: 3000 });\n const line = out.split(\"\\n\").find((l) => l.includes(\"=\"));\n const value = line?.split(\"=\")[1]?.trim();\n return value ? value : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve a process's cwd. Linux /proc, macOS `lsof`; Windows cwd is not\n * easily available via built-ins, so it returns null there. Callers must\n * tolerate null.\n */\nexport function getProcessCwd(pid: number): string | null {\n if (process.platform === \"linux\") {\n try {\n return readlinkSync(`/proc/${pid}/cwd`) || null;\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n try {\n const out = execSync(`lsof -p ${pid} -a -d cwd -F n 2>/dev/null`, { encoding: \"utf-8\", timeout: 3000 });\n const line = out.split(\"\\n\").find((l) => l.startsWith(\"n\"));\n return line ? line.slice(1) : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Read /proc/<pid>/environ (NUL-separated KEY=VALUE pairs) of a running PID.\n * Returns null when unavailable. Used to verify a tracked process is really\n * ours via the FENNEC_APP_NAME marker we inject at spawn time — robust even\n * when the app re-execs a different binary (where cmdline matching fails).\n */\nexport function getProcessEnviron(pid: number): Record<string, string> | null {\n try {\n const raw = readFileSync(`/proc/${pid}/environ`, \"utf-8\");\n const env: Record<string, string> = {};\n for (const pair of raw.split(\"\\0\")) {\n if (!pair) continue;\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n env[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return env;\n } catch {\n return null;\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","/**\n * Command: supervisor — A detached background daemon that keeps\n * auto-restart apps alive even after the launching terminal is closed.\n *\n * Unlike the old foreground `--restart` watcher (which died when you\n * closed the terminal), the supervisor runs as its own detached process.\n * It polls tracked.json and re-spawns any app flagged `autoRestart` that\n * has died — with crash-loop backoff to avoid hammering a broken app.\n *\n * Sub-commands:\n * fennec supervisor start Start the supervisor daemon\n * fennec supervisor stop Stop it\n * fennec supervisor status Show status + managed apps\n * fennec supervisor restart Restart the daemon\n *\n * Internal:\n * fennec __supervisor The daemon loop itself (not user-facing)\n */\nimport pc from \"picocolors\";\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, openSync, closeSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { dirname } from \"node:path\";\nimport { symbols, renderError, renderKV, createSpinner } from \"../utils/format.js\";\nimport { isProcessRunning, checkPort, checkHttp, resolveHealthUrl, killTree } from \"../utils/system-process.js\";\nimport {\n readTracked,\n respawnTracked,\n addTracked,\n isTrackedRunning,\n getSupervisorPidPath,\n logFilePathFor,\n rotateLogFile,\n} from \"./tracker.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\n\nconst POLL_INTERVAL_MS = 3000;\nconst CRASH_WINDOW_MS = 60_000; // window for crash-loop detection\nconst MAX_RESTARTS_IN_WINDOW = 5; // give up after this many crashes in the window\n// Restarts (crash OR port-down) at/above this many within the window mark the\n// app as \"flapping\" so users can see it's unstable in `dev status`.\nconst FLAPPING_THRESHOLD = 3;\n// Don't health-check the port during this window after a (re)start: slow\n// apps may take several seconds to begin listening, and killing them for a\n// transient \"not listening yet\" would cause a restart loop.\nconst PORT_GRACE_MS = 15_000;\n// Periodic log rotation: even long-lived apps that never restart would\n// otherwise grow their log file without bound. Check hourly and rotate any\n// log exceeding the size cap (see rotateLogFile defaults).\nconst LOG_ROTATE_CHECK_MS = 60 * 60 * 1000;\n\n// ─── Public helpers ──────────────────────────────────────────────\n\n/** Read the supervisor PID if the daemon is currently running. */\nexport function getSupervisorPid(): number | null {\n const path = getSupervisorPidPath();\n if (!existsSync(path)) return null;\n const pid = parseInt(readFileSync(path, \"utf-8\").trim(), 10);\n if (isNaN(pid)) return null;\n return isProcessRunning(pid) ? pid : null;\n}\n\nexport function isSupervisorRunning(): boolean {\n return getSupervisorPid() !== null;\n}\n\n/**\n * Ensure the supervisor daemon is running; start it (detached) if not.\n * Returns the running PID. Safe to call repeatedly.\n */\nexport function ensureSupervisorRunning(): number {\n const existing = getSupervisorPid();\n if (existing) return existing;\n return startSupervisorDaemon();\n}\n\n/** Spawn the supervisor as a detached daemon and return its PID. */\nexport function startSupervisorDaemon(): number {\n const logFilePath = logFilePathFor(\"supervisor\");\n mkdirSync(dirname(logFilePath), { recursive: true });\n const fd = openSync(logFilePath, \"a\");\n\n // Re-invoke this same CLI with the internal __supervisor command.\n const child = spawn(process.execPath, [process.argv[1]!, \"__supervisor\"], {\n env: { ...process.env },\n stdio: [\"ignore\", fd, fd],\n detached: true,\n });\n child.unref();\n child.once(\"spawn\", () => { try { closeSync(fd); } catch { /* best-effort */ } });\n return child.pid ?? 0;\n}\n\n// ─── User-facing command ─────────────────────────────────────────\n\nexport async function supervisorCommand(args: string[]): Promise<void> {\n const sub = args[0] ?? \"status\";\n\n switch (sub) {\n case \"start\":\n return supervisorStart();\n case \"stop\":\n return supervisorStop();\n case \"restart\":\n await supervisorStop();\n return supervisorStart();\n case \"status\":\n return supervisorStatus();\n default:\n console.error(renderError(\"Unknown sub-command\", `\"${sub}\" — use: start | stop | status | restart`));\n process.exit(1);\n }\n}\n\nfunction supervisorStart(): void {\n const existing = getSupervisorPid();\n if (existing) {\n console.error(`\\n ${pc.yellow(\"⚠\")} Supervisor already running ${pc.dim(`(PID ${existing})`)}\\n`);\n return;\n }\n const pid = startSupervisorDaemon();\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Supervisor started\")} ${pc.dim(`(PID ${pid})`)}`);\n console.error(` ${renderKV(\"Logs\", pc.cyan(\"fennec log supervisor\"))}`);\n console.error(` ${pc.dim(\"It will auto-restart apps started with\")} ${pc.cyan(\"--restart\")} ${pc.dim(\"even if you close this terminal.\")}\\n`);\n}\n\nfunction supervisorStop(): void {\n const pid = getSupervisorPid();\n if (!pid) {\n console.error(`\\n ${pc.dim(\"Supervisor is not running.\")}\\n`);\n return;\n }\n try {\n killTree(pid, \"SIGTERM\");\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Supervisor stopped\")} ${pc.dim(`(PID ${pid})`)}\\n`);\n } catch (err) {\n console.error(renderError(\"Failed to stop supervisor\", String(err)));\n }\n try { unlinkSync(getSupervisorPidPath()); } catch { /* best-effort */ }\n}\n\nfunction supervisorStatus(): void {\n const pid = getSupervisorPid();\n const tracked = readTracked();\n const managed = tracked.filter((t) => t.autoRestart);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Supervisor\")}`);\n if (pid) {\n console.error(` ${pc.green(\"●\")} running ${pc.dim(`(PID ${pid})`)}`);\n } else {\n console.error(` ${pc.red(\"○\")} not running ${pc.dim(\"— start with\")} ${pc.cyan(\"fennec supervisor start\")}`);\n }\n\n console.error(`\\n ${pc.bold(\"Managed apps\")} ${pc.dim(`(${managed.length} with auto-restart)`)}`);\n if (managed.length === 0) {\n console.error(` ${pc.dim(\"None. Start one with\")} ${pc.cyan(\"fennec start <cmd> --name <name> --restart\")}`);\n } else {\n for (const t of managed) {\n const running = isTrackedRunning(t);\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const state = running ? pc.green(`running (PID ${t.pid})`) : pc.red(\"stopped\");\n console.error(` ${dot} ${pc.bold(t.name)} ${pc.dim(\"—\")} ${state}`);\n }\n }\n console.error();\n}\n\n// ─── The daemon loop (internal `__supervisor`) ───────────────────\n\ninterface CrashRecord {\n windowStart: number;\n count: number;\n gaveUp: boolean;\n /** Consecutive port health-check failures (app alive but not listening). */\n portFails: number;\n}\n\n/** Restart an app after this many consecutive port health-check failures. */\nconst PORT_FAIL_THRESHOLD = 2;\n\nexport async function runSupervisor(): Promise<void> {\n const pidPath = getSupervisorPidPath();\n mkdirSync(dirname(pidPath), { recursive: true });\n\n // Refuse to run twice.\n const existing = getSupervisorPid();\n if (existing && existing !== process.pid) {\n log(`supervisor already running (PID ${existing}); exiting`);\n return;\n }\n writeFileSync(pidPath, String(process.pid), \"utf-8\");\n log(`supervisor started (PID ${process.pid}), polling every ${POLL_INTERVAL_MS}ms`);\n\n const crashes = new Map<string, CrashRecord>();\n let stopped = false;\n\n const cleanup = (): void => {\n stopped = true;\n try { unlinkSync(pidPath); } catch { /* best-effort */ }\n log(\"supervisor stopping\");\n process.exit(0);\n };\n process.on(\"SIGTERM\", cleanup);\n process.on(\"SIGINT\", cleanup);\n\n const tick = async (): Promise<void> => {\n if (stopped) return;\n let tracked;\n try {\n tracked = readTracked();\n } catch (err) {\n log(`failed to read tracked.json: ${String(err)}`);\n return;\n }\n\n for (const t of tracked) {\n if (!t.autoRestart) continue;\n\n // Port health-check: the app is alive but not listening on its\n // advertised port (hung / deadlocked). This catches the \"running\n // but broken\" case that a plain PID check misses. Only apps with a\n // `port` are health-checked; we require a couple of consecutive\n // failures to avoid restarting during slow startup. Skipped during\n // the post-start grace window so slow apps aren't killed prematurely.\n if (t.port && isTrackedRunning(t)) {\n const startedAt = Date.parse(t.startedAt);\n const ageMs = Number.isNaN(startedAt) ? Number.POSITIVE_INFINITY : Date.now() - startedAt;\n if (ageMs >= PORT_GRACE_MS) {\n let rec = crashes.get(t.name);\n if (!rec) {\n rec = { windowStart: Date.now(), count: 0, gaveUp: false, portFails: 0 };\n crashes.set(t.name, rec);\n }\n let listening = false;\n const healthUrl = t.healthCheck ? resolveHealthUrl(t.healthCheck, t.port) : null;\n try {\n listening = healthUrl ? await checkHttp(healthUrl) : await checkPort(t.port);\n } catch {\n listening = false;\n }\n if (listening) {\n rec.portFails = 0;\n // App has been listening steadily through a full window — clear any\n // stale flapping flag.\n if (t.flapping && Date.now() - rec.windowStart > CRASH_WINDOW_MS) setFlapping(t, false);\n } else {\n rec.portFails++;\n const probe = healthUrl ? `health check ${healthUrl}` : `port ${t.port}`;\n if (rec.portFails >= PORT_FAIL_THRESHOLD) {\n rec.portFails = 0;\n rec.count++;\n if (rec.count >= FLAPPING_THRESHOLD) setFlapping(t, true);\n log(`${t.name}: alive but ${probe} not responding ${PORT_FAIL_THRESHOLD}x — restarting`);\n try {\n const newPid = respawnTracked(t, \"port-down\");\n log(`${t.name}: restarted (PID ${newPid}) after ${probe} failure`);\n } catch (err) {\n log(`${t.name}: restart failed: ${String(err)}`);\n }\n } else {\n log(`${t.name}: ${probe} not responding (${rec.portFails}/${PORT_FAIL_THRESHOLD})`);\n }\n }\n }\n continue;\n }\n\n if (isTrackedRunning(t)) continue;\n\n // Crash-loop backoff.\n const now = Date.now();\n let rec = crashes.get(t.name);\n // Allow a retry once the crash window has elapsed since we gave up.\n if (rec?.gaveUp && now - rec.windowStart > CRASH_WINDOW_MS) rec = undefined;\n if (!rec || now - rec.windowStart > CRASH_WINDOW_MS) {\n rec = { windowStart: now, count: 0, gaveUp: false, portFails: 0 };\n crashes.set(t.name, rec);\n if (t.flapping) setFlapping(t, false); // old window elapsed — clear stale flag\n }\n if (rec.gaveUp) continue;\n if (rec.count >= MAX_RESTARTS_IN_WINDOW) {\n rec.gaveUp = true;\n log(`${t.name}: crashed ${rec.count}x in <60s — giving up (will retry after window resets)`);\n continue;\n }\n\n rec.count++;\n if (rec.count >= FLAPPING_THRESHOLD) setFlapping(t, true);\n try {\n const newPid = respawnTracked(t, \"crash\");\n log(`${t.name}: restarted (PID ${newPid}) [${rec.count}/${MAX_RESTARTS_IN_WINDOW} in window]`);\n } catch (err) {\n log(`${t.name}: restart failed: ${String(err)}`);\n }\n }\n };\n\n // Run immediately, then on an interval. The (ref'd) interval keeps the\n // process alive until it receives SIGTERM/SIGINT.\n tick();\n setInterval(tick, POLL_INTERVAL_MS);\n // Rotate logs for long-lived apps that may never restart (bound the growth).\n setInterval(rotateAllLogs, LOG_ROTATE_CHECK_MS);\n await new Promise<void>(() => { /* run until SIGTERM/SIGINT */ });\n}\n\n/** Rotate the log of every tracked app whose log exceeds the size cap. */\nfunction rotateAllLogs(): void {\n try {\n for (const t of readTracked()) {\n try {\n rotateLogFile(logFilePathFor(t.name));\n } catch { /* best-effort per-app */ }\n }\n } catch (err) {\n log(`log rotation pass failed: ${String(err)}`);\n }\n}\n\nfunction setFlapping(t: TrackedProcess, val: boolean): void {\n if (!!t.flapping === val) return;\n t.flapping = val;\n try {\n addTracked({ ...t, flapping: val });\n } catch { /* best-effort */ }\n}\n\nfunction log(msg: string): void {\n // stdout is redirected to the supervisor log file by the daemon spawner.\n process.stdout.write(`[${new Date().toISOString()}] ${msg}\\n`);\n}\n","/**\n * Command: persist — Make fennec survive reboots.\n *\n * Installs a boot unit (systemd user service on Linux, a launchd agent\n * on macOS, a startup script on Windows) that starts the fennec\n * supervisor at login. The supervisor then resurrects every app flagged\n * `autoRestart` (i.e. started with `--restart`), so the whole app fleet\n * comes back automatically after a reboot — like `startup` + `save`.\n *\n * Sub-commands:\n * fennec persist enable Install the boot unit for the current user\n * fennec persist disable Remove it\n * fennec persist status Show whether boot persistence is active\n *\n * The boot unit always targets the fennec data dir that was active when\n * `enable` ran (baked into the unit's environment), so it works whatever\n * `FENNEC_DATA_DIR` is set to later.\n */\nimport pc from \"picocolors\";\nimport { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync, chmodSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { renderError, renderKV } from \"../utils/format.js\";\nimport { getFennecDir } from \"./tracker.js\";\n\ntype Backend = \"systemd\" | \"launchd\" | \"windows\" | \"unsupported\";\n\nfunction detectBackend(): Backend {\n const p = platform();\n if (p === \"linux\" || p === \"freebsd\") {\n // Only user services are safe/simple here.\n return \"systemd\";\n }\n if (p === \"darwin\") return \"launchd\";\n if (p === \"win32\") return \"windows\";\n return \"unsupported\";\n}\n\nfunction unitPaths(backend: Backend): { unit: string; extra?: string } {\n const fennecDir = getFennecDir();\n switch (backend) {\n case \"systemd\":\n return { unit: resolve(homedir(), \".config\", \"systemd\", \"user\", \"fennec-supervisor.service\") };\n case \"launchd\":\n return { unit: resolve(homedir(), \"Library\", \"LaunchAgents\", \"io.fennec.supervisor.plist\") };\n case \"windows\":\n return { unit: resolve(homedir(), \"AppData\", \"Roaming\", \"Microsoft\", \"Windows\", \"Start Menu\", \"Programs\", \"Startup\", \"fennec-supervisor.bat\") };\n default:\n return { unit: resolve(fennecDir, \"persist.unit\") };\n }\n}\n\n/**\n * Build the boot unit content. The unit runs `node <cli> supervisor start`,\n * which launches the detached supervisor (and resurrects auto-restart apps).\n * FENNEC_DATA_DIR is pinned so the supervised apps (and their logs) resolve\n * to the same fennec instance regardless of the boot environment.\n */\nfunction buildUnit(backend: Backend, dataDir: string): string {\n const nodeBin = process.execPath;\n const cli = process.argv[1] ?? \"fennec\";\n const envLine = `FENNEC_DATA_DIR=${dataDir}`;\n\n if (backend === \"systemd\") {\n return `[Unit]\nDescription=Fennec process supervisor (auto-restarts managed apps)\nAfter=network.target\n\n[Service]\nType=simple\nEnvironment=${envLine}\nExecStart=${nodeBin} ${cli} supervisor start\nRestart=on-failure\n\n[Install]\nWantedBy=default.target\n`;\n }\n\n if (backend === \"launchd\") {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>io.fennec.supervisor</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodeBin}</string>\n <string>${cli}</string>\n <string>supervisor</string>\n <string>start</string>\n </array>\n <key>EnvironmentVariables</key>\n <dict>\n <key>FENNEC_DATA_DIR</key>\n <string>${dataDir}</string>\n </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <false/>\n</dict>\n</plist>\n`;\n }\n\n // windows .bat (runs at user login)\n return `@echo off\nset FENNEC_DATA_DIR=${dataDir}\n\"${nodeBin}\" \"${cli}\" supervisor start\n`;\n}\n\nfunction run(cmd: string, args: string[]): { ok: boolean; out: string } {\n try {\n const out = execFileSync(cmd, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] }).toString().trim();\n return { ok: true, out };\n } catch (err) {\n const e = err as { stdout?: Buffer; stderr?: Buffer; status?: number };\n const out = (e.stdout ?? e.stderr ?? Buffer.from(\"\")).toString().trim();\n return { ok: false, out };\n }\n}\n\nexport function persistEnabled(backend = detectBackend()): boolean {\n const { unit } = unitPaths(backend);\n return existsSync(unit);\n}\n\n/**\n * Silently ensure boot persistence is installed. Called from `start --restart`\n * so the first `--restart` app also arms reboot survival without the user\n * having to run `fennec persist enable`. No-ops on unsupported platforms or\n * if persistence is already enabled. Returns true if it just installed it.\n */\nexport function ensurePersistEnabled(): boolean {\n const backend = detectBackend();\n if (backend === \"unsupported\") return false;\n if (persistEnabled(backend)) return false;\n persistEnable(backend);\n return true;\n}\n\nexport async function persistCommand(args: string[]): Promise<void> {\n const sub = args[0] ?? \"status\";\n const backend = detectBackend();\n\n if (backend === \"unsupported\") {\n console.error(renderError(\"Unsupported platform\", `Boot persistence isn't available on ${platform()}. You can still run \"fennec supervisor start\" manually.`));\n process.exit(1);\n }\n\n switch (sub) {\n case \"enable\":\n return persistEnable(backend);\n case \"disable\":\n return persistDisable(backend);\n case \"status\":\n return persistStatus(backend);\n default:\n console.error(renderError(\"Unknown sub-command\", `\"${sub}\" — use: enable | disable | status`));\n process.exit(1);\n }\n}\n\nfunction persistEnable(backend: Backend): void {\n const dataDir = getFennecDir();\n const { unit } = unitPaths(backend);\n mkdirSync(dirname(unit), { recursive: true });\n writeFileSync(unit, buildUnit(backend, dataDir), \"utf-8\");\n if (backend === \"windows\") {\n // Nothing to register; the script runs at next login.\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot script installed\")} ${pc.dim(`(runs at next login)`)}`);\n console.error(` ${renderKV(\"Path\", pc.cyan(unit))}`);\n console.error(` ${pc.dim(\"Supervisor will start automatically when you log in.\")}\\n`);\n return;\n }\n\n if (backend === \"systemd\") {\n const reg = run(\"systemctl\", [\"--user\", \"enable\", \"--now\", resolve(unit)]);\n if (!reg.ok) {\n // Fall back to plain enable (some systems can't --now without a running manager)\n run(\"systemctl\", [\"--user\", \"enable\", resolve(unit)]);\n // Try to start the daemon directly so it's alive now.\n run(\"systemctl\", [\"--user\", \"start\", \"fennec-supervisor.service\"]);\n }\n // Always enable lingering so the user service keeps running after logout —\n // otherwise closing the session kills the supervisor (and every app it\n // manages), defeating the whole point of \"survive reboot\".\n const linger = run(\"loginctl\", [\"enable-linger\"]);\n if (!linger.ok) {\n console.error(` ${pc.yellow(\"⚠\")} ${pc.dim(\"Could not enable user linger — the supervisor may stop when you log out.\")}`);\n }\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot persistence enabled\")} ${pc.dim(\"(systemd user service)\")}`);\n console.error(` ${renderKV(\"Unit\", pc.cyan(\"fennec-supervisor.service\"))}`);\n console.error(` ${renderKV(\"Data dir\", pc.cyan(dataDir))}`);\n console.error(` ${pc.dim(\"The supervisor (and all --restart apps) will start at login and keep running after logout.\")}\\n`);\n return;\n }\n\n if (backend === \"launchd\") {\n run(\"launchctl\", [\"load\", resolve(unit)]);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot persistence enabled\")} ${pc.dim(\"(launchd agent)\")}`);\n console.error(` ${renderKV(\"Label\", pc.cyan(\"io.fennec.supervisor\"))}`);\n console.error(` ${renderKV(\"Data dir\", pc.cyan(dataDir))}`);\n console.error(` ${pc.dim(\"The supervisor will start at login.\")}\\n`);\n return;\n }\n}\n\nfunction persistDisable(backend: Backend): void {\n const { unit } = unitPaths(backend);\n if (backend === \"systemd\") {\n run(\"systemctl\", [\"--user\", \"disable\", \"--now\", \"fennec-supervisor.service\"]);\n } else if (backend === \"launchd\") {\n run(\"launchctl\", [\"unload\", resolve(unit)]);\n }\n try {\n if (existsSync(unit)) unlinkSync(unit);\n } catch { /* best-effort */ }\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Boot persistence disabled\")}\\n`);\n}\n\nfunction persistStatus(backend: Backend): void {\n const { unit } = unitPaths(backend);\n const installed = existsSync(unit);\n const label = backend === \"systemd\" ? \"fennec-supervisor.service\" : backend === \"launchd\" ? \"io.fennec.supervisor\" : \"fennec-supervisor.bat\";\n\n console.error(`\\n ${pc.bold(\"Fennec Boot Persistence\")} ${pc.dim(`(${backend})`)}`);\n if (!installed) {\n console.error(` ${pc.red(\"○\")} ${pc.dim(\"not installed — run \")}${pc.cyan(\"fennec persist enable\")}${pc.dim(\" to auto-start apps after reboot\")}`);\n console.error();\n return;\n }\n\n if (backend === \"systemd\") {\n const en = run(\"systemctl\", [\"--user\", \"is-enabled\", \"fennec-supervisor.service\"]).out;\n const ac = run(\"systemctl\", [\"--user\", \"is-active\", \"fennec-supervisor.service\"]).out;\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"installed\")}`);\n console.error(` ${renderKV(\"Enabled\", en || \"?\")}`);\n console.error(` ${renderKV(\"Active\", ac || \"?\")}`);\n } else if (backend === \"launchd\") {\n const loaded = run(\"launchctl\", [\"list\", \"io.fennec.supervisor\"]).ok;\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"installed\")}`);\n console.error(` ${renderKV(\"Loaded\", loaded ? pc.green(\"yes\") : pc.red(\"no\"))}`);\n } else {\n console.error(` ${pc.green(\"●\")} ${pc.bold(\"installed\")} ${pc.dim(\"(runs at login)\")}`);\n }\n console.error(` ${renderKV(\"Unit\", pc.cyan(label))}`);\n console.error(` ${renderKV(\"Path\", pc.cyan(unit))}`);\n console.error();\n}\n","/**\n * Command: ps, status — List tracked processes and system overview.\n */\nimport pc from \"picocolors\";\nimport { printBanner } from \"../utils/banner.js\";\nimport { symbols, renderTable, renderError, renderCommand, createSpinner, timestamp, type Column, type Row } from \"../utils/format.js\";\nimport { getSystemProcesses, formatProcessState, getProcessMemRss } from \"../utils/system-process.js\";\nimport { readTracked, formatUptime, isTrackedRunning, extractFlagValue } from \"./tracker.js\";\n\nexport async 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 jsonFlag = args.includes(\"--json\");\n const nameFilter = args.includes(\"--name\") ? args[args.indexOf(\"--name\") + 1] : undefined;\n const groupFilter = extractFlagValue(args, \"--group\", \"-g\");\n const sortBy = args.includes(\"--sort\")\n ? (args[args.indexOf(\"--sort\") + 1] as \"cpu\" | \"mem\" | \"pid\" | \"name\")\n : \"name\";\n\n if (jsonFlag) {\n await psJson();\n return;\n }\n\n if (watchFlag && systemFlag) {\n await watchSystemProcesses(sortBy, 15);\n return;\n }\n\n if (systemFlag) {\n const spinner = createSpinner(\"Scanning system processes...\");\n try {\n const processes = getSystemProcesses({ name: nameFilter, userOnly: true, sortBy, limit: 30 });\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n if (processes.length === 0) {\n console.error(`\\n ${pc.dim(\"No system processes found.\")}\\n`);\n return;\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) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"state\", label: \"State\", format: (v) => { const s = String(v); if (s === \"R\" || s === \"Running\") return pc.green(s); if (s === \"Z\" || s === \"Zombie\") return pc.red(s); if (s === \"S\" || s === \"Sleeping\") return pc.cyan(s); return pc.dim(s); } },\n ];\n const rows: Row[] = processes.map((p) => ({ pid: p.pid, name: p.name, cpu: p.cpuPercent, mem: p.memPercent, state: formatProcessState(p.state) }));\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 const trackedAll = readTracked();\n const tracked = groupFilter ? trackedAll.filter((t) => t.group === groupFilter) : trackedAll;\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(groupFilter ? `No tracked processes in group \"${groupFilter}\".` : \"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) => { const s = v as string; return s === \"running\" ? pc.green(\"● running\") : pc.red(\"○ stopped\"); } },\n { key: \"group\", label: \"Group\", format: (v) => { const g = String(v); return g === \"-\" ? pc.dim(\"-\") : pc.cyan(g); } },\n { key: \"port\", label: \"Port\", format: (v) => { const p = v as number | null; return p ? pc.yellow(`:${p}`) : pc.dim(\"-\"); } },\n { key: \"mem\", label: \"MEM\", align: \"right\", format: (v) => { const kb = v as number | null; return kb && kb > 0 ? pc.dim(`${(kb / 1024).toFixed(0)}MB`) : pc.dim(\"-\"); } },\n { key: \"command\", label: \"Command\", format: (v) => { const c = String(v); return c.length > 50 ? c.slice(0, 50) + \"…\" : c; } },\n { key: \"uptime\", label: \"Uptime\", format: (v) => pc.dim(String(v)) },\n ];\n\n const rows: Row[] = tracked.map((t) => {\n const running = isTrackedRunning(t);\n const uptime = running ? formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000)) : \"-\";\n const memKb = running ? (getProcessMemRss(t.pid) ?? null) : null;\n return { name: t.name, pid: running ? String(t.pid) : pc.dim(String(t.pid)), status: running ? \"running\" : \"stopped\", group: t.group ?? \"-\", port: t.port ?? null, mem: memKb, command: t.command, uptime };\n });\n\n const runningCount = tracked.filter((t) => isTrackedRunning(t)).length;\n const scope = groupFilter ? ` in group ${pc.cyan(groupFilter)}` : \"\";\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Apps\")} ${pc.dim(`(${runningCount}/${tracked.length} running${scope})`)}\\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 stop <name>\")} ${pc.dim(\"to pause an app.\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec spawn <name>\")} ${pc.dim(\"to resume a paused app.\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(\"fennec kill <name>\")} ${pc.dim(\"to permanently remove an app.\")}`);\n console.error(` ${pc.dim(\"Filter by group with:\")} ${pc.cyan(\"fennec ps --group <group>\")}`);\n console.error();\n}\n\n/**\n * JSON output of tracked processes.\n */\nasync function psJson(): Promise<void> {\n const tracked = readTracked();\n const data = tracked.map((t) => {\n const running = isTrackedRunning(t);\n return {\n name: t.name,\n pid: t.pid,\n status: running ? \"running\" : \"stopped\",\n port: t.port ?? null,\n command: t.command,\n cwd: t.cwd ?? null,\n group: t.group ?? null,\n memMB: running ? (() => { const kb = getProcessMemRss(t.pid); return kb ? Math.round(kb / 1024) : null; })() : null,\n startedAt: t.startedAt,\n uptime: running ? Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000) : null,\n };\n });\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport async function statusCommand(_args: string[]): Promise<void> {\n const watchFlag = _args.includes(\"-w\") || _args.includes(\"--watch\");\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 if (tracked.length > 0) {\n const runningCount = tracked.filter((t) => isTrackedRunning(t)).length;\n console.error(` ${pc.bold(\"Managed Apps\")} ${pc.dim(`(${runningCount}/${tracked.length} running)`)}\\n`);\n for (const t of tracked) {\n const running = isTrackedRunning(t);\n const statusIcon = running ? pc.green(\"●\") : pc.red(\"○\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n const uptime = running ? pc.dim(formatUptime(Math.floor((Date.now() - new Date(t.startedAt).getTime()) / 1000))) : 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 console.error(` ${pc.bold(\"System\")} ${pc.dim(`(${totalUserProcs} user processes)`)}`);\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) await watchSystemProcesses(\"cpu\", 15);\n console.error();\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({ userOnly: true, sortBy: sortBy as \"cpu\" | \"mem\" | \"pid\" | \"name\", limit });\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) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"mem\", label: \"MEM%\", align: \"right\", format: (v) => { const n = v as number; return n > 10 ? pc.red(String(n)) : n > 5 ? pc.yellow(String(n)) : pc.dim(String(n)); } },\n { key: \"state\", label: \"S\", align: \"center\" },\n ];\n const rows: Row[] = processes.map((p) => ({ pid: p.pid, name: p.name, cpu: p.cpuPercent, mem: p.memPercent, state: p.state }));\n return ` ${timestamp()} ${pc.dim(`${processes.length} processes`)}\\n${renderTable(columns, rows, { compact: true })}`;\n };\n\n console.error(render());\n const interval = setInterval(() => { process.stdout.write(\"\\x1B[J\"); console.error(render()); }, 3000);\n // Keep alive until SIGINT — resolves cleanly (no process.exit)\n await new Promise<void>((resolve) => {\n process.once(\"SIGINT\", () => {\n clearInterval(interval);\n process.stdout.write(\"\\x1B[J\");\n resolve();\n });\n });\n}\n","/**\n * Command: kill — Kill process by PID, name, or kill all Fennec-tracked apps.\n * Supports: a single name/pid, MULTIPLE names (`kill a b c`), a group\n * (`--group <g>` or a bare group name), or `--all` / `all` (everything).\n */\nimport pc from \"picocolors\";\nimport { renderError, createSpinner, selectPrompt, confirmPrompt } from \"../utils/format.js\";\nimport { killTree as sysKill, isProcessRunning } from \"../utils/system-process.js\";\nimport { readTracked, removeTrackedByPid, isTrackedRunning, resolveTargets, getGroups, type TrackedProcess } from \"./tracker.js\";\n\nexport async function killCommand(args: string[]): Promise<void> {\n const signalIndex = args.indexOf(\"--signal\");\n const signalRaw = signalIndex !== -1 ? args[signalIndex + 1] : \"SIGTERM\";\n const signal = (signalRaw ?? \"SIGTERM\") as NodeJS.Signals;\n const force = args.includes(\"-y\") || args.includes(\"--yes\");\n const target = resolveTargets(args);\n\n if (target.kind === \"single\") {\n await killOne(target.value!, signal, force, false);\n return;\n }\n\n if (target.kind === \"names\") {\n for (const name of target.values!) {\n await killOne(name, signal, force, true);\n }\n return;\n }\n\n if (target.kind === \"group\") {\n await killGroup(target.group!, signal, force);\n return;\n }\n\n if (target.kind === \"all\") {\n await killAll(signal, force);\n return;\n }\n\n console.error(renderError(\"Missing target\", \"Usage: fennec kill <pid|name|all> [--signal SIGTERM|SIGKILL|SIGINT] [--group <group>] [-y]\"));\n process.exit(1);\n}\n\n/**\n * Kill ONE target (resolved by tracked name or system PID). In `multi` mode,\n * resolution failures print an error and return (instead of exiting) so the\n * other names in the batch can still be processed.\n */\nasync function killOne(rawTarget: string, signal: NodeJS.Signals, force: boolean, multi: boolean): Promise<void> {\n let targetPid: number;\n let displayName: string;\n const pid = parseInt(rawTarget, 10);\n\n if (!isNaN(pid) && String(pid) === rawTarget) {\n if (!isProcessRunning(pid)) {\n const msg = `No process with PID ${pid} is running`;\n if (multi) { console.error(renderError(\"Process not found\", msg)); return; }\n console.error(renderError(\"Process not found\", msg));\n process.exit(1);\n }\n targetPid = pid;\n displayName = `PID ${pid}`;\n } else {\n const tracked = readTracked();\n const trackedMatch = tracked.find((t) => t.name === rawTarget);\n if (trackedMatch) {\n if (!isTrackedRunning(trackedMatch)) {\n removeTrackedByPid(trackedMatch.pid);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(rawTarget)} ${pc.dim(\"removed from tracked apps (was already stopped)\")}`);\n console.error();\n return;\n }\n targetPid = trackedMatch.pid;\n displayName = `${trackedMatch.name} (PID ${targetPid})`;\n } else {\n const msg = `No tracked process named \"${rawTarget}\".\\nUse ${pc.cyan(\"fennec kill <pid>\")} to kill a system process by its PID.`;\n if (multi) { console.error(renderError(\"Not tracked\", msg)); return; }\n console.error(renderError(\"Not tracked\", msg));\n process.exit(1);\n }\n }\n\n const confirmed = force || (await confirmPrompt(`Kill ${pc.bold(displayName)} with ${pc.yellow(signal)}?`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n const spinner = createSpinner(`Sending ${signal} to ${displayName}...`);\n const success = sysKill(targetPid, signal);\n\n if (success) {\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 = force || (await confirmPrompt(`Send ${pc.red(\"SIGKILL\")} to force stop?`, true));\n if (forceKill) {\n const forceSpinner = createSpinner(`Sending SIGKILL to ${displayName}...`);\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 300));\n isProcessRunning(targetPid) ? forceSpinner.fail(`${displayName} could not be stopped (permission denied?)`) : forceSpinner.succeed(`${displayName} force stopped`);\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 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\nasync function killGroup(group: string, signal: NodeJS.Signals, force: boolean): Promise<void> {\n const tracked = readTracked();\n const inGroup = tracked.filter((t) => t.group === group);\n if (inGroup.length === 0) {\n console.error(renderError(\"Empty group\", `No tracked entries in group \"${group}\".\\nKnown groups: ${pc.cyan(getGroups().join(\", \") || \"(none)\")}`));\n process.exit(1);\n }\n\n const running = inGroup.filter((t) => isTrackedRunning(t));\n const stopped = inGroup.filter((t) => !isTrackedRunning(t));\n\n console.error(`\\n ${pc.bold(`Kill group ${pc.cyan(group)}: ${running.length} running + remove ${stopped.length} stopped?`)}`);\n console.error(` ${pc.dim(\"Permanently removes only apps in this group — other groups are untouched.\")}\\n`);\n\n const confirmed = force || (await confirmPrompt(`${pc.red(\"Are you sure?\")} ${pc.dim(\"This cannot be undone\")}`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled.\")}`); return; }\n\n const spinner = createSpinner(`Killing ${running.length} + removing ${stopped.length} tracked app(s) in ${group}...`);\n let killed = 0, failed = 0;\n for (const t of running) {\n if (sysKill(t.pid, signal)) { killed++; } else { failed++; }\n removeTrackedByPid(t.pid);\n }\n for (const t of stopped) {\n removeTrackedByPid(t.pid);\n }\n await new Promise((r) => setTimeout(r, 300));\n const total = running.length + stopped.length;\n total > 0 ? spinner.succeed(`${killed} killed, ${stopped.length} stopped entries removed from group ${group}`) : spinner.fail(\"Failed to kill apps\");\n if (failed > 0) console.error(` ${pc.yellow(`${failed} running app(s) could not be killed`)}`);\n}\n\nasync function killAll(signal: NodeJS.Signals, force: boolean): Promise<void> {\n // Scope strictly to Fennec-tracked apps — NEVER all user processes.\n const tracked = readTracked();\n if (tracked.length === 0) { console.error(` ${pc.dim(\"No tracked apps to kill.\")}`); return; }\n\n const running = tracked.filter((t) => isTrackedRunning(t));\n const stopped = tracked.filter((t) => !isTrackedRunning(t));\n\n console.error(`\\n ${pc.bold(`Kill ${running.length} running + remove ${stopped.length} stopped tracked app(s)?`)}`);\n console.error(` ${pc.dim(\"Permanently removes every Fennec-tracked app — other processes are untouched.\")}\\n`);\n\n const confirmed = force || (await confirmPrompt(`${pc.red(\"Are you sure?\")} ${pc.dim(\"This cannot be undone\")}`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled.\")}`); return; }\n\n const spinner = createSpinner(`Killing ${running.length} + removing ${stopped.length} tracked app(s)...`);\n let killed = 0, failed = 0;\n for (const t of running) {\n if (sysKill(t.pid, signal)) { killed++; } else { failed++; }\n removeTrackedByPid(t.pid);\n }\n // Stopped entries have nothing to signal — just deregister them.\n for (const t of stopped) {\n removeTrackedByPid(t.pid);\n }\n await new Promise((r) => setTimeout(r, 300));\n const total = running.length + stopped.length;\n total > 0 ? spinner.succeed(`${killed} killed, ${stopped.length} stopped entries removed`) : spinner.fail(\"Failed to kill apps\");\n if (failed > 0) console.error(` ${pc.yellow(`${failed} running app(s) could not be killed`)}`);\n}\n","/**\n * Command: stop — Stop a tracked process but keep it in tracked.json.\n * Unlike `kill`, the process entry remains in tracked.json so it can\n * be re-spawned later via `fennec spawn <name>`.\n */\nimport pc from \"picocolors\";\nimport { renderError, createSpinner, confirmPrompt } from \"../utils/format.js\";\nimport { killTree as sysKill, isProcessRunning } from \"../utils/system-process.js\";\nimport { readTracked, isTrackedRunning, setAutoRestart, resolveTargets } from \"./tracker.js\";\nimport { psCommand } from \"./ps.js\";\n\nexport async function stopCommand(args: string[]): Promise<void> {\n const target = resolveTargets(args);\n\n if (target.kind === \"group\") {\n await stopAllTracked(args, target.group!);\n return;\n }\n\n if (target.kind === \"all\") {\n await stopAllTracked(args);\n return;\n }\n\n if (target.kind === \"single\") {\n await stopOne(target.value!, args);\n return;\n }\n\n if (target.kind === \"names\") {\n for (const name of target.values!) {\n await stopOne(name, args, true);\n }\n return;\n }\n\n console.error(renderError(\"Missing name\", \"Usage: fennec stop <name|--all> [--group <group>] [-y]\"));\n process.exit(1);\n}\n\n/**\n * Stop ONE tracked process by name (used for both single and multi-name stops).\n * In `multi` mode, resolution failures print an error and return (instead of\n * exiting) so the rest of the batch can still be processed.\n */\nasync function stopOne(rawTarget: string, args: string[], multi: boolean = false): Promise<void> {\n // Only works on tracked processes\n const tracked = readTracked();\n const trackedMatch = tracked.find((t) => t.name === rawTarget);\n\n if (!trackedMatch) {\n const msg = `No tracked process named \"${rawTarget}\". Use ${pc.cyan(\"fennec kill <pid>\")} to kill a system process.`;\n if (multi) { console.error(renderError(\"Not found\", msg)); return; }\n console.error(renderError(\"Not found\", msg));\n process.exit(1);\n }\n\n if (!isTrackedRunning(trackedMatch)) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(rawTarget)} ${pc.dim(\"is already stopped\")}`);\n console.error();\n if (!multi) process.exit(0);\n return;\n }\n\n const displayName = `${trackedMatch.name} (PID ${trackedMatch.pid})`;\n const force = args.includes(\"-y\") || args.includes(\"--yes\");\n const confirmed = force || (await confirmPrompt(`Stop ${pc.bold(displayName)}? ${pc.dim(\"It can be re-spawned later via fennec spawn\")}`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n // Disable auto-restart first so the supervisor doesn't immediately revive it.\n setAutoRestart(trackedMatch.name, false);\n await stopSingleProcess(trackedMatch.pid, trackedMatch.name);\n}\n\n/**\n * Stop running tracked processes (keep them in tracked.json). Optionally\n * scoped to a single group via `group`.\n */\nasync function stopAllTracked(args: string[], group?: string): Promise<void> {\n const tracked = readTracked();\n const running = tracked.filter((t) => isTrackedRunning(t) && (!group || t.group === group));\n\n if (running.length === 0) {\n console.error(`\\n ${pc.dim(group ? `No running tracked processes in group \"${group}\".` : \"No running tracked processes to stop.\")}\\n`);\n return;\n }\n\n const scope = group ? ` group ${pc.cyan(group)}` : \"\";\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(`Stop all ${running.length} running process(es)${scope}?`)} ${pc.dim(\"(They can be re-spawned later)\")}\\n`);\n for (const t of running) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(t.name)} ${pc.dim(`(PID ${t.pid})`)}`);\n }\n console.error();\n\n const forceAll = args.includes(\"-y\") || args.includes(\"--yes\");\n const confirmed = forceAll || (await confirmPrompt(\"Stop all?\", false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n const spinner = createSpinner(`Stopping ${running.length} process(es)...`);\n let stopped = 0;\n let failed = 0;\n\n for (const t of running) {\n setAutoRestart(t.name, false);\n if (sysKill(t.pid, \"SIGTERM\")) {\n stopped++;\n } else {\n failed++;\n }\n }\n\n await new Promise((r) => setTimeout(r, 300));\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (stopped > 0) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(`Stopped ${stopped} process(es)`)} ${pc.dim(\"(kept in tracked.json)\")}`);\n }\n if (failed > 0) {\n console.error(` ${pc.red(\"✗\")} ${pc.bold(`${failed} process(es) failed to stop`)}`);\n }\n\n console.error();\n await psCommand([]);\n}\n\nasync function stopSingleProcess(pid: number, name: string): Promise<void> {\n const displayName = `${name} (PID ${pid})`;\n const spinner = createSpinner(`Stopping ${displayName}...`);\n const success = sysKill(pid, \"SIGTERM\");\n\n if (success) {\n await new Promise((r) => setTimeout(r, 200));\n const stillRunning = isProcessRunning(pid);\n if (stillRunning) {\n spinner.warn(`${displayName} did not respond to SIGTERM`);\n const forceKill = await confirmPrompt(`Send ${pc.red(\"SIGKILL\")} to force stop?`, true);\n if (forceKill) {\n const forceSpinner = createSpinner(`Sending SIGKILL to ${displayName}...`);\n sysKill(pid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 300));\n isProcessRunning(pid)\n ? forceSpinner.fail(`${displayName} could not be stopped (permission denied?)`)\n : forceSpinner.succeed(`${displayName} force stopped`);\n } else {\n console.error(` ${pc.yellow(\"⚠\")} ${displayName} ${pc.dim(\"may still be running\")}`);\n }\n } else {\n spinner.succeed(`${displayName} stopped`);\n }\n\n console.error();\n await psCommand([]);\n } else {\n spinner.fail(`Failed to stop ${displayName}`);\n console.error(renderError(\"Permission denied\", \"Try running with sudo or use fennec kill.\"));\n }\n}\n","/**\n * Command: spawn — List stopped tracked processes or re-spawn one.\n *\n * Without args: shows a selectable list of stopped tracked processes.\n * With name: re-spawns the named process from its saved command in tracked.json.\n * With --all: re-spawns all stopped processes that have saved commands.\n *\n * Unlike `fennec start <cmd> --name <name>` which creates a brand new connection,\n * `fennec spawn` revives a previously stopped process.\n */\nimport pc from \"picocolors\";\nimport { mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { symbols, renderError, renderKV, renderAppName, createSpinner, selectPrompt } from \"../utils/format.js\";\nimport { readTracked, addTracked, spawnDaemon, resolveArgs, isTrackedRunning, buildSpawnEnv, resolveTargets, getGroups } from \"./tracker.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\nimport { ensureSupervisorRunning } from \"./supervisor.js\";\nimport { ensurePersistEnabled } from \"./persist.js\";\nimport { psCommand } from \"./ps.js\";\n\nexport async function spawnCommand(args: string[]): Promise<void> {\n const target = resolveTargets(args);\n\n if (target.kind === \"single\") {\n await spawnOne(target.value!, false);\n return;\n }\n\n if (target.kind === \"names\") {\n for (const name of target.values!) {\n await spawnOne(name, true);\n }\n return;\n }\n\n if (target.kind === \"group\") {\n const group = target.group!;\n const tracked = readTracked();\n const inGroup = tracked.filter((t) => t.group === group && !isTrackedRunning(t) && t.command);\n if (inGroup.length === 0) {\n console.error(renderError(\"Empty group\", `No stopped entries with a saved command in group \"${group}\".\\nKnown groups: ${pc.cyan(getGroups().join(\", \") || \"(none)\")}`));\n process.exit(1);\n }\n await spawnAllStopped(inGroup);\n return;\n }\n\n if (target.kind === \"all\") {\n await spawnAllStopped(readTracked().filter((t) => !isTrackedRunning(t) && t.command));\n return;\n }\n\n // none: list stopped processes for selection\n await spawnList();\n}\n\n/**\n * Re-spawn ONE stopped tracked process by name (used for both single and\n * multi-name spawns). In `multi` mode, resolution failures print an\n * error and return (instead of exiting) so the rest of the batch proceeds.\n */\nasync function spawnOne(name: string, multi: boolean): Promise<void> {\n const tracked = readTracked();\n const match = tracked.find((t) => t.name === name);\n\n if (!match) {\n const msg = `No tracked process named \"${name}\". Use ${pc.cyan(\"fennec spawn\")} to see available processes, or ${pc.cyan(\"fennec start <command> --name <name>\")} to create a new one.`;\n if (multi) { console.error(renderError(\"Not found\", msg)); return; }\n console.error(renderError(\"Not found\", msg));\n process.exit(1);\n }\n\n if (isTrackedRunning(match)) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(name)} ${pc.dim(\"is already running (PID:\")} ${match.pid}${pc.dim(\")\")}`);\n console.error(` ${pc.dim(\"Use\")} ${pc.cyan(`fennec stop ${name}`)} ${pc.dim(\"to stop it first.\")}`);\n console.error();\n if (!multi) process.exit(0);\n return;\n }\n\n if (!match.command) {\n const msg = `\"${name}\" has no saved command and cannot be re-spawned.`;\n if (multi) { console.error(renderError(\"No command saved\", msg)); return; }\n console.error(renderError(\"No command saved\", msg));\n process.exit(1);\n }\n\n await respawnProcess(match);\n}\n\n/**\n * Re-spawn ALL stopped tracked processes that have saved commands.\n */\nasync function spawnAllStopped(procs: TrackedProcess[]): Promise<void> {\n const toSpawn = procs;\n\n if (toSpawn.length === 0) {\n console.error(`\\n ${pc.dim(\"No stopped processes with saved commands to spawn.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(`Spawning ${toSpawn.length} process(es)...`)}\\n`);\n for (const t of toSpawn) {\n console.error(` ${pc.dim(\"·\")} ${pc.bold(t.name)} ${pc.dim(`(${t.command})`)}`);\n }\n console.error();\n\n const spinner = createSpinner(\"Spawning...\");\n let spawned = 0;\n let failed = 0;\n\n for (const proc of toSpawn) {\n try {\n const cmdParts = resolveArgs(proc);\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n mkdirSync(logDir, { recursive: true });\n const logFilePath = resolve(logDir, `${proc.name}.log`);\n\n const child = spawnDaemon({ cmdParts, name: proc.name, cwd: proc.cwd, logFilePath, env: buildSpawnEnv(proc.env), logMode: proc.logMode });\n const pid = child.pid ?? 0;\n\n addTracked({\n name: proc.name,\n pid,\n command: proc.command,\n args: cmdParts,\n port: proc.port,\n cwd: proc.cwd,\n env: proc.env,\n startedAt: new Date().toISOString(),\n autoRestart: proc.autoRestart,\n logMode: proc.logMode,\n });\n if (proc.autoRestart) { ensureSupervisorRunning(); ensurePersistEnabled(); }\n\n spawned++;\n } catch {\n failed++;\n }\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n\n if (spawned > 0) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(`Spawned ${spawned} process(es)`)}`);\n }\n if (failed > 0) {\n console.error(` ${pc.red(\"✗\")} ${pc.bold(`${failed} process(es) failed to spawn`)}`);\n }\n\n console.error();\n await psCommand([]);\n}\n\n/**\n * Show a selectable list of stopped tracked processes.\n */\nasync function spawnList(): Promise<void> {\n const tracked = readTracked();\n\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes found.\")}`);\n console.error(` ${pc.dim(\"Start an app first:\")} ${pc.cyan(\"fennec start <command> --name <name>\")}`);\n console.error();\n return;\n }\n\n const stopped = tracked.filter((t) => !isTrackedRunning(t));\n const running = tracked.filter((t) => isTrackedRunning(t));\n\n if (stopped.length === 0) {\n console.error(`\\n ${pc.dim(\"All tracked processes are running. Nothing to spawn.\")}`);\n console.error();\n return;\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Available to spawn\")} ${pc.dim(`(${stopped.length}/${tracked.length} stopped)`)}`);\n\n // Show running ones as info\n if (running.length > 0) {\n console.error(` ${pc.dim(\"Running (use stop first):\")}`);\n for (const r of running) {\n console.error(` ${pc.green(\"●\")} ${pc.bold(r.name)} ${pc.dim(`(PID ${r.pid})`)}`);\n }\n console.error();\n }\n\n // Show stopped ones as selectable\n const selected = await selectPrompt(\"Select a process to spawn:\", stopped.map((t) => ({\n value: t.name,\n label: t.name,\n description: t.command.length > 80 ? t.command.slice(0, 80) + \"...\" : t.command,\n })));\n\n if (selected === null) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n\n const match = stopped.find((t) => t.name === selected);\n if (match) {\n await respawnProcess(match);\n }\n}\n\n/**\n * Re-spawn a stopped tracked process from its saved command/cwd.\n */\nasync function respawnProcess(proc: TrackedProcess): Promise<void> {\n const cmdParts = resolveArgs(proc);\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n mkdirSync(logDir, { recursive: true });\n const logFilePath = resolve(logDir, `${proc.name}.log`);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Spawning\")} ${renderAppName(proc.name)} ${pc.dim(\"(from saved config)\")}\\n`);\n console.error(` ${renderKV(\"Command\", proc.command)}`);\n if (proc.cwd) console.error(` ${renderKV(\"Directory\", proc.cwd)}`);\n if (proc.port) console.error(` ${renderKV(\"Port\", String(proc.port))}`);\n\n try {\n const child = spawnDaemon({ cmdParts, name: proc.name, cwd: proc.cwd, logFilePath, env: buildSpawnEnv(proc.env), logMode: proc.logMode });\n const pid = child.pid ?? 0;\n\n // Update tracked.json with new PID\n addTracked({\n name: proc.name,\n pid,\n command: proc.command,\n args: cmdParts,\n port: proc.port,\n cwd: proc.cwd,\n env: proc.env,\n startedAt: new Date().toISOString(),\n autoRestart: proc.autoRestart,\n logMode: proc.logMode,\n });\n\n if (proc.autoRestart) { ensureSupervisorRunning(); ensurePersistEnabled(); }\n\n console.error(` ${pc.green(\"✓\")} ${pc.bold(proc.name)} ${pc.dim(`spawned (PID: ${pid})`)}`);\n\n // Show the process table\n await psCommand([]);\n } catch (error) {\n console.error(renderError(`Failed to spawn ${proc.name}`, String(error)));\n process.exit(1);\n }\n}\n","/**\n * Command: restart — Stop and re-spawn a tracked app from its saved config.\n * Supports a single name/pid, MULTIPLE names (`restart a b c`), or a\n * group (`--group <g>`). Unlike `fennec kill` (permanent), restart\n * re-spawns from saved config.\n */\nimport pc from \"picocolors\";\nimport { renderError, renderCommand, createSpinner, confirmPrompt } from \"../utils/format.js\";\nimport { killTree as sysKill, isProcessRunning } from \"../utils/system-process.js\";\nimport { readTracked, addTracked, removeTrackedByPid, spawnDaemon, resolveArgs, buildSpawnEnv, extractFlagValue, getGroups, resolveTargets, logFilePathFor, type TrackedProcess } from \"./tracker.js\";\n\nexport async function restartCommand(args: string[]): Promise<void> {\n const force = args.includes(\"-y\") || args.includes(\"--yes\");\n const target = resolveTargets(args);\n\n if (target.kind === \"group\") {\n await restartGroup(target.group!, force);\n return;\n }\n if (target.kind === \"names\") {\n for (const n of target.values!) await restartOne(n, force, true);\n return;\n }\n if (target.kind === \"single\") {\n await restartOne(target.value!, force, false);\n return;\n }\n\n console.error(renderError(\"Missing process name/pid\", \"Usage: fennec restart <name|pid> [-y] [--group <group>]\"));\n process.exit(1);\n}\n\n/**\n * Restart ONE target (resolved by tracked name OR tracked PID). In `multi`\n * mode, failures print an error and return (instead of exiting) so the\n * rest of the batch can still be processed.\n */\nasync function restartOne(raw: string, force: boolean, multi: boolean): Promise<void> {\n const tracked = readTracked();\n const pidNum = parseInt(raw, 10);\n const trackedEntry =\n tracked.find((t) => t.name === raw) ??\n (!isNaN(pidNum) && String(pidNum) === raw ? tracked.find((t) => t.pid === pidNum) : undefined);\n\n if (!trackedEntry) {\n const msg = `No tracked process named or with PID \"${raw}\".\\nfennec restart only re-spawns Fennec-tracked apps (from their saved config).`;\n if (multi) { console.error(renderError(\"Not tracked\", msg)); return; }\n console.error(renderError(\"Not tracked\", msg));\n process.exit(1);\n }\n\n const targetPid = trackedEntry.pid;\n const confirmed = force || (await confirmPrompt(`Restart ${pc.bold(`${trackedEntry.name} (PID ${targetPid})`)}?`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n const spinner = createSpinner(`Stopping ${trackedEntry.name} (PID ${targetPid})...`);\n const killed = sysKill(targetPid, \"SIGTERM\");\n if (!killed) { spinner.fail(`Failed to stop PID ${targetPid}`); return; }\n\n await new Promise((r) => setTimeout(r, 1000));\n if (isProcessRunning(targetPid)) {\n spinner.warn(\"Process didn't stop, sending SIGKILL...\");\n sysKill(targetPid, \"SIGKILL\");\n await new Promise((r) => setTimeout(r, 500));\n }\n\n spinner.succeed(`${trackedEntry.name} stopped`);\n\n const respawnSpinner = createSpinner(`Re-spawning ${trackedEntry.name}...`);\n try {\n const cmdParts = resolveArgs(trackedEntry);\n const logFilePath = logFilePathFor(trackedEntry.name);\n\n const child = spawnDaemon({ cmdParts, name: trackedEntry.name, cwd: trackedEntry.cwd, logFilePath, env: buildSpawnEnv(trackedEntry.env), logMode: trackedEntry.logMode });\n\n removeTrackedByPid(targetPid);\n addTracked({\n name: trackedEntry.name,\n pid: child.pid ?? 0,\n command: trackedEntry.command,\n args: cmdParts,\n port: trackedEntry.port,\n cwd: trackedEntry.cwd,\n env: trackedEntry.env,\n startedAt: new Date().toISOString(),\n autoRestart: trackedEntry.autoRestart,\n logMode: trackedEntry.logMode,\n });\n\n respawnSpinner.succeed(`${trackedEntry.name} restarted (PID: ${child.pid})`);\n } catch (error) {\n respawnSpinner.fail(`Failed to re-spawn ${trackedEntry.name}: ${String(error)}`);\n console.error(` ${pc.dim(\"Config preserved. Re-run manually:\")} ${renderCommand(trackedEntry.command)}`);\n }\n}\n\nasync function restartGroup(group: string, force: boolean): Promise<void> {\n const tracked = readTracked();\n const inGroup = tracked.filter((t) => t.group === group);\n if (inGroup.length === 0) {\n console.error(renderError(\"Empty group\", `No tracked entries in group \"${group}\".\\nKnown groups: ${pc.cyan(getGroups().join(\", \") || \"(none)\")}`));\n process.exit(1);\n }\n\n const confirmed = force || (await confirmPrompt(`Restart ${pc.bold(`${inGroup.length}`)} process(es) in group ${pc.cyan(group)}?`, false));\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}`); return; }\n\n for (const trackedEntry of inGroup) {\n const spinner = createSpinner(`Restarting ${trackedEntry.name}...`);\n try {\n const cmdParts = resolveArgs(trackedEntry);\n const logFilePath = logFilePathFor(trackedEntry.name);\n\n const child = spawnDaemon({ cmdParts, name: trackedEntry.name, cwd: trackedEntry.cwd, logFilePath, env: buildSpawnEnv(trackedEntry.env), logMode: trackedEntry.logMode });\n\n removeTrackedByPid(trackedEntry.pid);\n addTracked({\n name: trackedEntry.name,\n pid: child.pid ?? 0,\n command: trackedEntry.command,\n args: cmdParts,\n port: trackedEntry.port,\n cwd: trackedEntry.cwd,\n env: trackedEntry.env,\n startedAt: new Date().toISOString(),\n autoRestart: trackedEntry.autoRestart,\n logMode: trackedEntry.logMode,\n });\n spinner.succeed(`${trackedEntry.name} restarted (PID: ${child.pid})`);\n } catch (error) {\n spinner.fail(`Failed to re-spawn ${trackedEntry.name}: ${String(error)}`);\n console.error(` ${pc.dim(\"Config preserved. Re-run manually:\")} ${renderCommand(trackedEntry.command)}`);\n }\n }\n}\n","/**\n * Command: adopt — Register an already-running process (started via raw bash,\n * another tool, or a previous session) into fennec's tracked registry WITHOUT\n * restarting it. The human counterpart to the agent's `process_adopt`: it\n * stops an externally-launched server from being an untracked orphan and\n * prevents `start`/`spawn` from creating a duplicate that fails with\n * EADDRINUSE.\n *\n * Usage: fennec adopt <pid> [--name <name>] [--port <port>]\n */\nimport pc from \"picocolors\";\nimport { renderError, symbols } from \"../utils/format.js\";\nimport { adoptProcess, logFilePathFor } from \"./tracker.js\";\n\nexport function adoptCommand(args: string[]): void {\n const pidArg = args.find((a) => /^\\d+$/.test(a));\n if (!pidArg) {\n console.error(renderError(\"Missing PID\", `Usage: fennec adopt <pid> [--name <name>] [--port <port>]`));\n process.exit(1);\n }\n const pid = parseInt(pidArg, 10);\n\n const nameIdx = args.indexOf(\"--name\");\n const name = nameIdx !== -1 ? args[nameIdx + 1] : undefined;\n const portIdx = args.indexOf(\"--port\");\n const port = portIdx !== -1 ? parseInt(args[portIdx + 1] ?? \"\", 10) : undefined;\n\n const entry = adoptProcess(pid, { name, port: Number.isNaN(port) ? undefined : port });\n if (!entry) {\n console.error(renderError(\"Cannot adopt\", `No running process with PID ${pid}`));\n process.exit(1);\n }\n\n console.error(`\\n ${symbols.fox} ${pc.green(\"✓\")} ${pc.bold(\"Adopted\")} ${pc.bold(entry.name)} ${pc.dim(`(PID ${pid})`)}`);\n if (entry.port) console.error(` ${pc.dim(\"port\")} ${pc.yellow(`:${entry.port}`)}`);\n if (entry.command) console.error(` ${pc.dim(\"command\")} ${entry.command}`);\n console.error(` ${pc.dim(\"status\")} now tracked + supervised by the supervisor`);\n console.error(` ${pc.dim(\"logs\")} ${pc.cyan(logFilePathFor(entry.name))}\\n`);\n}\n","/**\n * Command: inspect — Compact, AI-friendly snapshot of one app.\n *\n * Returns a single bounded, machine-readable (JSON) view combining liveness,\n * port health, recent log lines, and a quick error scan. Designed so an AI\n * assistant can \"observe\" a real running app (BE, FE, worker, console, ...)\n * cheaply and predictably: output is capped (token budget), secrets are\n * redacted, and the shape is stable. Use `--plain` for a short human summary.\n *\n * fennec inspect <name|pid> [--plain] [--tail N] [--since 10m]\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport pc from \"picocolors\";\nimport { symbols, renderAppName } from \"../utils/format.js\";\nimport { readTracked, isTrackedRunning, formatUptime } from \"./tracker.js\";\nimport { checkPort } from \"../utils/system-process.js\";\nimport { logFilePathFor } from \"./tracker.js\";\nimport { readLogLines, redactLine, stripAnsi, parseDuration, redactionCount, classifyLevel } from \"../utils/redact.js\";\n\nconst DEFAULT_TAIL = 40;\nconst MAX_TAIL = 200;\n\ninterface ProcMetrics {\n rssMb?: number;\n cpuPct?: number;\n}\n\n/** Best-effort RSS/CPU read from /proc. Returns undefined fields if unavailable. */\nfunction readMetrics(pid: number): ProcMetrics {\n const m: ProcMetrics = {};\n try {\n const status = readFileSync(`/proc/${pid}/status`, \"utf-8\");\n const rssLine = status.split(\"\\n\").find((l) => l.startsWith(\"VmRSS:\"));\n if (rssLine) {\n const kb = parseInt(rssLine.replace(/[^\\d]/g, \"\"), 10);\n if (!isNaN(kb)) m.rssMb = Math.round((kb / 1024) * 10) / 10;\n }\n } catch { /* best-effort */ }\n return m;\n}\n\nexport async function inspectCommand(args: string[]): Promise<void> {\n const target = args[0];\n if (!target || target.startsWith(\"--\")) {\n console.error(pc.dim(`Usage: fennec inspect <name|pid> [--plain] [--tail N] [--since 10m]`));\n process.exit(1);\n }\n const plain = args.includes(\"--plain\");\n const tailIndex = args.indexOf(\"--tail\");\n const tail = tailIndex !== -1 ? Math.min(parseInt(args[tailIndex + 1]!, 10) || DEFAULT_TAIL, MAX_TAIL) : DEFAULT_TAIL;\n const sinceIndex = args.indexOf(\"--since\");\n const sinceMs = sinceIndex !== -1 ? parseDuration(args[sinceIndex + 1]!) : undefined;\n if (sinceIndex !== -1 && sinceMs === undefined) {\n console.error(pc.red(`Invalid --since. Use e.g. 10m, 1h, 30s.`));\n process.exit(1);\n }\n\n const tracked = readTracked();\n const proc = tracked.find((t) => t.name === target || (parseInt(target, 10) === t.pid && !isNaN(parseInt(target, 10))));\n if (!proc) {\n console.error(pc.red(`No tracked app named \"${target}\".`));\n process.exit(1);\n }\n\n const running = isTrackedRunning(proc);\n const logPath = logFilePathFor(proc.name);\n const lines = readLogLines(logPath, { tail: Math.max(tail, sinceMs ? MAX_TAIL : 0), sinceMs: sinceMs ?? undefined, redact: true, parseTimestamp: true });\n const recent = lines.slice(-tail);\n const errorLines = lines.filter((l) => classifyLevel(l) === \"error\").slice(-15);\n const redactedLines = recent.reduce((acc, l) => acc + (redactionCount(stripAnsi(l)) > 0 ? 1 : 0), 0);\n const metrics = running ? readMetrics(proc.pid) : {};\n\n let portHealthy: boolean | null = null;\n if (proc.port) {\n try { portHealthy = await checkPort(proc.port); } catch { portHealthy = false; }\n }\n\n const startedAt = Date.parse(proc.startedAt);\n const uptimeSec = running && !isNaN(startedAt) ? Math.floor((Date.now() - startedAt) / 1000) : 0;\n\n if (plain) {\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const portStr = proc.port ? ` :${proc.port}${portHealthy === false ? pc.red(\" (port down!)\") : portHealthy ? pc.green(\" (up)\") : \"\"}` : \"\";\n console.error(`\\n ${symbols.fox} ${renderAppName(proc.name)}${portStr} ${dot} ${running ? pc.green(`running PID ${proc.pid}`) : pc.red(\"stopped\")}`);\n console.error(` ${pc.dim(\"uptime\")} ${pc.cyan(uptimeSec ? formatUptime(uptimeSec) : \"—\")} ${pc.dim(\"rss\")} ${pc.cyan(metrics.rssMb ? `${metrics.rssMb}MB` : \"—\")} ${pc.dim(\"errors(last)\")} ${pc.cyan(String(errorLines.length))} ${pc.dim(\"redacted\")} ${pc.cyan(String(redactedLines))}`);\n if (errorLines.length) {\n console.error(`\\n ${pc.bold(pc.red(\"Recent errors:\"))}`);\n for (const l of errorLines.slice(-8)) console.error(` ${pc.red(stripAnsi(l).slice(0, 300))}`);\n }\n console.error();\n return;\n }\n\n const payload = {\n name: proc.name,\n running,\n pid: running ? (proc.pid ?? null) : null,\n port: proc.port ?? null,\n portHealthy,\n autoRestart: proc.autoRestart ?? false,\n uptimeSec,\n metrics,\n logTail: recent,\n errorCount: errorLines.length,\n errors: errorLines,\n redacted: true,\n redactedLines,\n note: \"Secrets redacted by default. Bounded snapshot for AI observation.\",\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n}\n","/**\n * Secret redaction + log shaping for AI-safe observability.\n *\n * Logs from real apps routinely contain credentials (DB connection\n * strings, API keys, session tokens). Because fennec is designed to be\n * inspected by an AI assistant — which has a finite, precious context\n * window — leaking those into the context is both a security risk and a\n * token-waste. These helpers strip known secret shapes (best-effort, not\n * a substitute for proper secret management) and bound/shape log output\n * so AI inspection stays controlled and predictable.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\n\nexport interface RedactOptions {\n /** When false, no redaction is performed (e.g. user opted out). */\n enabled?: boolean;\n}\n\n// Order matters: more specific patterns first.\nconst SECRET_PATTERNS: { name: string; re: RegExp }[] = [\n // Bearer / auth tokens\n { name: \"bearer\", re: /\\bBearer\\s+[A-Za-z0-9._\\-]+/gi },\n // Authorization: <scheme> <token>\n { name: \"authorization\", re: /\\bAuthorization\\s*:\\s*\\S+/gi },\n // Generic API keys\n { name: \"apikey\", re: /\\b(api[_-]?key|apikey|access[_-]?key|secret[_-]?key|private[_-]?key)\\s*[:=]\\s*\\S+/gi },\n // AWS\n { name: \"aws\", re: /\\b(AKIA|ASIA)[0-9A-Z]{16}\\b/g },\n // Slack tokens\n { name: \"slack\", re: /\\bxox[baprs]-[0-9A-Za-z\\-]{10,}/g },\n // Stripe\n { name: \"stripe\", re: /\\b(sk|rk|pk)_(live|test)_[0-9A-Za-z]{16,}\\b/g },\n // JWT\n { name: \"jwt\", re: /\\beyJ[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-]*/g },\n // Google API\n { name: \"google\", re: /\\bAIza[0-9A-Za-z_\\-]{35}\\b/g },\n // GitHub PAT\n { name: \"github\", re: /\\bgh[pousr]_[0-9A-Za-z]{36,}\\b/g },\n // Generic long hex/alpha tokens (>=32 chars) in common contexts\n { name: \"token\", re: /\\b(token|secret|password|passwd|pwd|client[_-]?secret)\\s*[:=]\\s*\\S+/gi },\n // Connection strings with credentials\n { name: \"connstr\", re: /\\b(mongodb(\\+srv)?|postgres(ql)?|mysql|redis|amqp|sqlserver):\\/\\/[^\\s:]+:[^\\s@]+@/gi },\n // Private key blocks\n { name: \"pem\", re: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/g },\n];\n\nexport function redactLine(line: string, opts: RedactOptions = {}): string {\n if (opts.enabled === false) return line;\n let out = line;\n for (const { name, re } of SECRET_PATTERNS) {\n out = out.replace(re, (m) => {\n // Keep a hint of what was redacted so logs stay debuggable.\n const head = m.slice(0, Math.min(m.length, name.length + 4));\n return `${head}…[REDACTED]`;\n });\n }\n return out;\n}\n\n/** Count how many secret matches a line would produce (for threat signal). */\nexport function redactionCount(line: string): number {\n let n = 0;\n for (const { re } of SECRET_PATTERNS) {\n const m = line.match(re);\n if (m) n += m.length;\n }\n return n;\n}\n\n// Strip ANSI escape sequences so AI sees plain text.\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"other\";\n\nconst LEVEL_RE: { level: LogLevel; re: RegExp }[] = [\n { level: \"error\", re: /\\b(ERROR|FATAL|CRITICAL|EXCEPTION|UNCAUGHT)\\b/i },\n { level: \"warn\", re: /\\b(WARN|WARNING)\\b/i },\n { level: \"info\", re: /\\b(INFO|NOTICE)\\b/i },\n { level: \"debug\", re: /\\b(DEBUG|TRACE)\\b/i },\n];\n\n/** Classify a log line by level (best-effort, keyword based). */\nexport function classifyLevel(line: string): LogLevel {\n for (const { level, re } of LEVEL_RE) {\n if (re.test(line)) return level;\n }\n if (/\\b(error|fail|failed|failure|denied|reject)\\b/i.test(line)) return \"error\";\n if (/\\b(warn)\\b/i.test(line)) return \"warn\";\n return \"other\";\n}\n\nexport interface ReadLogOptions {\n /** Max lines to keep (token budget). Keeps the most recent. */\n tail?: number;\n /** Only include lines whose timestamp is within the last `sinceMs`. */\n sinceMs?: number;\n /** Redact secrets. */\n redact?: boolean;\n /** Parse an ISO-ish [ts] prefix at the start of a line for --since. */\n parseTimestamp?: boolean;\n}\n\n/**\n * Extract a timestamp from a log line. Handles both plain text logs\n * (`[2026-...] msg` or `2026-... msg`) and structured JSONL (`{\"ts\":\"...\",...}`).\n * Returns the ISO string or null when no timestamp is found.\n */\nexport function extractTimestamp(line: string): string | null {\n const m = line.match(/^\\s*\\[?(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z?)\\]?/);\n if (m) return m[1]!;\n const trimmed = line.trimStart();\n if (trimmed.startsWith(\"{\")) {\n try {\n const obj = JSON.parse(line) as Record<string, unknown>;\n const ts = obj.ts ?? obj.time ?? obj.timestamp;\n if (typeof ts === \"string\") return ts;\n if (typeof ts === \"number\") return new Date(ts).toISOString();\n } catch { /* not JSON */ }\n }\n return null;\n}\n\n/** Read a log file, apply redaction + time filter, and enforce a tail budget. */\nexport function readLogLines(path: string, opts: ReadLogOptions = {}): string[] {\n if (!existsSync(path)) return [];\n const raw = readFileSync(path, \"utf-8\");\n let lines = raw.split(\"\\n\").filter(Boolean);\n const now = Date.now();\n\n if (opts.sinceMs && opts.parseTimestamp) {\n lines = lines.filter((l) => {\n const ts = extractTimestamp(l);\n if (ts === null) return true; // keep un-timestamped lines (don't drop unknown)\n const t = Date.parse(ts);\n return !isNaN(t) && now - t <= opts.sinceMs!;\n });\n }\n\n if (opts.redact === false) {\n // still strip ANSI for machine consumption\n lines = lines.map(stripAnsi);\n } else {\n lines = lines.map((l) => stripAnsi(redactLine(l)));\n }\n\n if (opts.tail && opts.tail > 0 && lines.length > opts.tail) {\n lines = lines.slice(-opts.tail);\n }\n return lines;\n}\n\n/** Parse a human duration like \"10m\", \"1h\", \"30s\", \"2d\" into milliseconds. */\nexport function parseDuration(input: string): number | null {\n const m = input.trim().match(/^(\\d+)\\s*(s|m|h|d)$/i);\n if (!m) return null;\n const n = parseInt(m[1]!, 10);\n const unit = m[2]!.toLowerCase();\n const mul = unit === \"s\" ? 1000 : unit === \"m\" ? 60_000 : unit === \"h\" ? 3_600_000 : 86_400_000;\n return n * mul;\n}\n","/**\n * Command: dev — Declarative dev environment orchestration.\n *\n * Reads a `fennec.config.yaml` describing the whole stack (BE, FE, DB, workers)\n * and brings it up/down as one unit. Each app is started like `fennec start\n * --restart`, so the supervisor keeps them alive, health-checks their ports,\n * and (with boot persistence) survives reboots. Dependencies are started first\n * and an app can wait for another's port before launching — so `fennec dev up`\n * is a single, AI-friendly command to boot an entire project and observe it.\n *\n * fennec dev up [--config fennec.config.yaml]\n * fennec dev down\n * fennec dev status\n *\n * Config shape (fennec.config.yaml):\n * apps:\n * - name: api\n * command: node\n * args: [app.js]\n * cwd: ./backend\n * port: 3000\n * env: { NODE_ENV: development }\n * restart: true # auto-restart (default true)\n * jsonl: true # structured logs (default false)\n * waitForPort: 3000 # wait for this port before starting dependents\n * - name: web\n * command: npm\n * args: [run, dev]\n * cwd: ./frontend\n * port: 5173\n * dependsOn: [api] # started after `api` is up\n */\nimport pc from \"picocolors\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderKV, symbols, createSpinner } from \"../utils/format.js\";\nimport { readTracked, addTracked, isTrackedRunning, spawnDaemon, buildSpawnEnv, logFilePathFor, respawnTracked, adoptExternalOnPort } from \"./tracker.js\";\nimport type { TrackedProcess } from \"./tracker.js\";\nimport { ensureSupervisorRunning } from \"./supervisor.js\";\nimport { ensurePersistEnabled } from \"./persist.js\";\nimport { checkPort, killTree } from \"../utils/system-process.js\";\nimport yaml from \"js-yaml\";\n\ninterface AppConfig {\n name: string;\n command: string;\n args?: string[];\n cwd?: string;\n port?: number;\n env?: Record<string, string>;\n restart?: boolean;\n jsonl?: boolean;\n dependsOn?: string[];\n waitForPort?: number;\n /** HTTP readiness probe. A full URL (http://...) or a path (/health) that's\n * combined with `port`. When set, the supervisor health-checks this URL\n * instead of a bare TCP port check. */\n healthCheck?: string;\n}\n\ninterface DevConfig {\n apps?: AppConfig[];\n}\n\nfunction loadConfig(path: string): DevConfig {\n if (!existsSync(path)) {\n console.error(renderError(\"Config not found\", path));\n process.exit(1);\n }\n try {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = yaml.load(raw) as DevConfig;\n return parsed ?? {};\n } catch (err) {\n console.error(renderError(\"Failed to parse config\", String(err)));\n process.exit(1);\n }\n}\n\nfunction resolveCwd(baseDir: string, cwd?: string): string {\n if (!cwd) return baseDir;\n return resolve(baseDir, cwd);\n}\n\nasync function waitForPort(port: number, timeoutMs = 30_000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n if (await checkPort(port)) return true;\n } catch { /* keep trying */ }\n await new Promise((r) => setTimeout(r, 500));\n }\n return false;\n}\n\ntype StartResult = \"started\" | \"skipped\" | \"restarted\" | \"adopted\";\n\n/** Returns true when an existing tracked entry already runs the same app with\n * an identical spawn config (command, args, cwd, port, env, mode, restart). */\nfunction configMatches(\n existing: TrackedProcess,\n desired: Pick<TrackedProcess, \"command\" | \"args\" | \"cwd\" | \"port\" | \"env\" | \"logMode\" | \"autoRestart\" | \"healthCheck\">,\n): boolean {\n if (existing.command !== desired.command) return false;\n if (JSON.stringify(existing.args ?? []) !== JSON.stringify(desired.args)) return false;\n if (existing.cwd !== desired.cwd) return false;\n if ((existing.port ?? null) !== (desired.port ?? null)) return false;\n if (existing.logMode !== desired.logMode) return false;\n if ((existing.autoRestart ?? true) !== desired.autoRestart) return false;\n if ((existing.healthCheck ?? null) !== (desired.healthCheck ?? null)) return false;\n if (JSON.stringify(existing.env ?? {}) !== JSON.stringify(desired.env)) return false;\n return true;\n}\n\n/** Idempotent start: skip an app that's already running with identical config,\n * restart only if running but changed, otherwise spawn fresh. */\nasync function startApp(app: AppConfig, baseDir: string): Promise<StartResult> {\n const cwd = resolveCwd(baseDir, app.cwd);\n const cmdParts = [app.command, ...(app.args ?? [])];\n const logFilePath = logFilePathFor(app.name);\n const env: Record<string, string> = { ...(app.env ?? {}) };\n const port = app.waitForPort ?? app.port;\n const restart = app.restart ?? true;\n const logMode: \"text\" | \"jsonl\" = app.jsonl ? \"jsonl\" : \"text\";\n const desired = {\n command: cmdParts.join(\" \"),\n args: cmdParts,\n cwd,\n port,\n env,\n logMode,\n autoRestart: restart,\n healthCheck: app.healthCheck,\n };\n\n const existing = readTracked().find((t) => t.name === app.name);\n if (existing && isTrackedRunning(existing) && configMatches(existing, desired)) {\n return \"skipped\"; // already healthy & unchanged — leave it alone\n }\n\n const wasRunning = !!(existing && isTrackedRunning(existing));\n if (wasRunning) {\n try { killTree(existing!.pid, \"SIGTERM\"); } catch { /* best-effort */ }\n }\n\n // Idempotent-by-port: if an EXTERNAL process (e.g. started via raw bash by\n // an agent) is already listening on our port, adopt it instead of spawning\n // a duplicate that fails with EADDRINUSE.\n if (port && !(existing && isTrackedRunning(existing))) {\n const adopted = adoptExternalOnPort(port, app.name);\n if (adopted) {\n return \"adopted\";\n }\n if (await checkPort(port)) {\n console.error(\n ` ${pc.yellow(\"⚠\")} ${pc.dim(`port :${port} already responding — ${app.name} may fail to bind (EADDRINUSE)`)}`,\n );\n }\n }\n\n const child = spawnDaemon({\n cmdParts,\n name: app.name,\n cwd,\n logFilePath,\n env: buildSpawnEnv(env),\n logMode,\n });\n addTracked({\n name: app.name,\n pid: child.pid ?? 0,\n command: desired.command,\n args: cmdParts,\n port,\n cwd,\n env,\n startedAt: new Date().toISOString(),\n autoRestart: restart,\n logMode,\n flapping: false,\n healthCheck: app.healthCheck,\n });\n return wasRunning ? \"restarted\" : \"started\";\n}\n\nexport async function devCommand(args: string[]): Promise<void> {\n const sub = args[0] ?? \"up\";\n const configIndex = args.indexOf(\"--config\");\n const configPath = configIndex !== -1 ? resolve(args[configIndex + 1]!) : resolve(process.cwd(), \"fennec.config.yaml\");\n\n if (sub === \"down\") {\n return devDown();\n }\n if (sub === \"status\") {\n return devStatus();\n }\n if (sub === \"restart\") {\n return devRestart(args.slice(1));\n }\n if (sub !== \"up\") {\n console.error(renderError(\"Unknown sub-command\", `\"${sub}\" — use: up | down | status | restart`));\n process.exit(1);\n }\n\n const config = loadConfig(configPath);\n const apps = config.apps ?? [];\n if (apps.length === 0) {\n console.error(renderError(\"No apps defined\", `Add an \"apps:\" list to ${configPath}`));\n process.exit(1);\n }\n const baseDir = dirname(configPath);\n\n // Topological-ish start: apps without deps first, then dependents.\n const started = new Set<string>();\n const ordered = topoOrder(apps);\n\n // Pre-flight: detect apps in this config that declare the same port.\n const portOwner = new Map<number, string>();\n for (const a of apps) {\n const p = a.waitForPort ?? a.port;\n if (p) {\n const prev = portOwner.get(p);\n if (prev) {\n console.error(renderError(\"Port conflict\", `apps \"${prev}\" and \"${a.name}\" both declare port :${p}`));\n process.exit(1);\n }\n portOwner.set(p, a.name);\n }\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev up\")} ${pc.dim(`— ${apps.length} app(s) from ${configPath}`)}`);\n ensureSupervisorRunning();\n ensurePersistEnabled();\n\n for (const app of ordered) {\n // Wait for declared dependencies' ports.\n for (const dep of app.dependsOn ?? []) {\n const depApp = apps.find((a) => a.name === dep);\n const port = depApp?.waitForPort ?? depApp?.port;\n if (port) {\n const sp = createSpinner(`Waiting for ${dep} :${port}...`);\n const ok = await waitForPort(port);\n sp.stop();\n if (!ok) console.error(` ${pc.yellow(\"⚠\")} ${pc.dim(`${dep} :${port} not ready in time (continuing)`)}`);\n }\n }\n const res = await startApp(app, baseDir);\n const pid = readTracked().find((t) => t.name === app.name)?.pid ?? \"?\";\n const tag =\n res === \"skipped\" ? pc.dim(\"already running (skipped)\")\n : res === \"restarted\" ? pc.yellow(`restarted (PID ${pid})`)\n : res === \"adopted\" ? pc.cyan(`adopted external process on :${app.port ?? app.waitForPort}`)\n : pc.dim(`started (PID ${pid})`);\n console.error(` ${pc.green(\"✓\")} ${pc.bold(app.name)} ${tag}`);\n }\n\n console.error(`\\n ${pc.green(\"✓\")} Stack up. Observe with ${pc.cyan(\"fennec observe\")} or ${pc.cyan(\"fennec dev status\")}.`);\n console.error(` ${pc.dim(\"Apps auto-restart (supervisor) + survive reboot (persist).\")}\\n`);\n}\n\nfunction devDown(): void {\n const tracked = readTracked().filter((t) => t.autoRestart);\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No supervised apps to stop.\")}\\n`);\n return;\n }\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev down\")} ${pc.dim(`— stopping ${tracked.length} app(s)`)}`);\n for (const t of tracked) {\n try {\n if (isTrackedRunning(t)) killTree(t.pid, \"SIGTERM\");\n } catch { /* best-effort */ }\n // Disable auto-restart so the supervisor doesn't revive them.\n t.autoRestart = false;\n addTracked({ ...t, autoRestart: false });\n console.error(` ${pc.red(\"■\")} ${pc.bold(t.name)}`);\n }\n console.error(`\\n ${pc.green(\"✓\")} Stack stopped (auto-restart disabled). Use ${pc.cyan(\"fennec dev up\")} to bring it back.\\n`);\n}\n\n/** Restart one or more tracked apps (or all auto-restart apps if no names\n * given) in place — the supervisor respawns each from its stored config. */\nfunction devRestart(names: string[]): void {\n ensureSupervisorRunning();\n ensurePersistEnabled();\n const tracked = readTracked();\n const targets = names.length\n ? tracked.filter((t) => names.includes(t.name))\n : tracked.filter((t) => t.autoRestart);\n const missing = names.filter((n) => !tracked.some((t) => t.name === n));\n if (missing.length) {\n console.error(renderError(\"Not tracked\", `No such app(s): ${missing.join(\", \")} — run \"fennec dev status\" to list tracked apps.`));\n }\n if (targets.length === 0) {\n console.error(`\\n ${pc.dim(\"Nothing to restart.\")}\\n`);\n return;\n }\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev restart\")} ${pc.dim(`— ${targets.length} app(s)`)}`);\n for (const t of targets) {\n try {\n const newPid = respawnTracked(t, \"manual\");\n console.error(` ${pc.green(\"✓\")} ${pc.bold(t.name)} ${pc.dim(`restarted (PID ${newPid})`)}`);\n } catch (err) {\n console.error(` ${pc.red(\"✗\")} ${pc.bold(t.name)} ${pc.dim(`restart failed: ${String(err)}`)}`);\n }\n }\n console.error();\n}\n\nfunction devStatus(): void {\n const tracked = readTracked();\n console.error(`\\n ${symbols.fox} ${pc.bold(\"fennec dev status\")}`);\n if (tracked.length === 0) {\n console.error(` ${pc.dim(\"Nothing tracked.\")}\\n`);\n return;\n }\n for (const t of tracked) {\n const running = isTrackedRunning(t);\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const state = running ? pc.green(`running (PID ${t.pid})`) : pc.red(\"stopped\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n const cause = t.restartCause ? pc.dim(` · last-restart: ${t.restartCause}`) : \"\";\n const flap = t.flapping ? pc.red(\" · ⚠ flapping\") : \"\";\n console.error(` ${dot} ${pc.bold(t.name)}${portStr} ${pc.dim(\"—\")} ${state}${cause}${flap}`);\n }\n console.error();\n}\n\n/** Order apps so dependencies come before dependents (best-effort, stable). */\nfunction topoOrder(apps: AppConfig[]): AppConfig[] {\n const byName = new Map(apps.map((a) => [a.name, a]));\n const visited = new Set<string>();\n const out: AppConfig[] = [];\n const visit = (app: AppConfig, stack: Set<string>): void => {\n if (visited.has(app.name)) return;\n if (stack.has(app.name)) return; // cycle guard\n stack.add(app.name);\n for (const dep of app.dependsOn ?? []) {\n const d = byName.get(dep);\n if (d) visit(d, stack);\n }\n stack.delete(app.name);\n visited.add(app.name);\n out.push(app);\n };\n for (const app of apps) visit(app, new Set());\n return out;\n}\n","/**\n * Command: log — Show logs for a tracked/managed process.\n * Supports --clear to delete log file, --level to filter by level, and -f for follow mode.\n */\nimport { existsSync, readFileSync, unlinkSync, statSync, openSync, fstatSync, readSync, closeSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport { symbols, renderError, renderAppName, createSpinner } from \"../utils/format.js\";\nimport { readTracked, isTrackedRunning, logFilePathFor } from \"./tracker.js\";\nimport { redactLine, stripAnsi, readLogLines, parseDuration, redactionCount } from \"../utils/redact.js\";\n\n/** Hard cap on lines emitted (token budget) so AI/json inspection stays bounded. */\nconst MAX_LOG_LINES = 500;\n\n/** Known log-level prefixes to color/highlight */\nconst LEVEL_PATTERNS: { level: string; pattern: RegExp }[] = [\n { level: \"error\", pattern: /\\b(ERROR?|FATAL?|CRITICAL?|EXCEPTION)\\b/i },\n { level: \"warn\", pattern: /\\b(WARN(ING)?)\\b/i },\n { level: \"info\", pattern: /\\b(INFO)\\b/i },\n { level: \"debug\", pattern: /\\b(DEBUG)\\b/i },\n];\n\nexport async function logCommand(args: string[]): Promise<void> {\n const target = args[0];\n if (!target || target.startsWith(\"--\")) {\n // No app specified: show available apps so the user knows what to log.\n listAvailableApps();\n return;\n }\n\n const clearFlag = args.includes(\"--clear\");\n const jsonFlag = args.includes(\"--json\");\n const noRedact = args.includes(\"--no-redact\");\n const linesIndex = args.indexOf(\"--lines\");\n const lineCount = linesIndex !== -1 ? Math.min(parseInt(args[linesIndex + 1]!, 10), MAX_LOG_LINES) : 30;\n const followFlag = args.includes(\"-f\") || args.includes(\"--follow\");\n const levelFilter = args.includes(\"--level\") ? args[args.indexOf(\"--level\") + 1]?.toLowerCase() : undefined;\n const sinceIndex = args.indexOf(\"--since\");\n const sinceMs = sinceIndex !== -1 ? parseDuration(args[sinceIndex + 1]!) : undefined;\n\n if (sinceIndex !== -1 && sinceMs === undefined) {\n console.error(renderError(\"Invalid --since\", `Use a duration like 10m, 1h, 30s, 2d`));\n process.exit(1);\n }\n\n // Validate level filter\n if (levelFilter && ![\"error\", \"warn\", \"info\", \"debug\"].includes(levelFilter)) {\n console.error(renderError(\"Invalid level\", `\"${levelFilter}\" is not a valid level. Use: error, warn, info, debug`));\n process.exit(1);\n }\n\n // Secrets are redacted by default (AI-safe). --no-redact opts out.\n const redact = !noRedact;\n\n let logFilePath: string | null = null;\n let displayName = target;\n const tracked = readTracked();\n const trackedMatch = tracked.find((t) => t.name === target || (parseInt(target, 10) === t.pid && !isNaN(parseInt(target, 10))));\n\n if (trackedMatch) {\n displayName = trackedMatch.name;\n logFilePath = logFilePathFor(trackedMatch.name);\n } else {\n const pid = parseInt(target, 10);\n if (!isNaN(pid) && String(pid) === target) {\n const procPath = `/proc/${pid}/fd/1`;\n if (existsSync(procPath)) logFilePath = procPath;\n }\n }\n\n // --clear flag: delete the log file\n if (clearFlag) {\n if (!logFilePath || !existsSync(logFilePath)) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.dim(\"No log file found for\")} ${pc.bold(displayName)}\\n`);\n process.exit(0);\n }\n try {\n unlinkSync(logFilePath);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"Log cleared\")} ${pc.dim(`— ${logFilePath}`)}\\n`);\n } catch (err) {\n console.error(renderError(\"Failed to clear log\", String(err)));\n process.exit(1);\n }\n return;\n }\n\n // ── JSON mode (AI): emit machine-readable, redacted, bounded output.\n // Must run BEFORE any human header so stdout stays valid JSON.\n if (jsonFlag) {\n let logLines: string[] = [];\n if (logFilePath && existsSync(logFilePath)) {\n logLines = readLogLines(logFilePath, {\n tail: Math.max(lineCount, sinceMs ? MAX_LOG_LINES : 0),\n sinceMs: sinceMs ?? undefined,\n redact,\n parseTimestamp: true,\n });\n } else {\n const pid = trackedMatch?.pid ?? parseInt(target, 10);\n if (!isNaN(pid)) {\n try {\n const output = execSync(`journalctl --no-pager -n ${Math.max(lineCount, 500)} _PID=${pid} 2>/dev/null || echo \"\"`, { encoding: \"utf-8\", timeout: 3000 });\n logLines = output.trim().split(\"\\n\").filter(Boolean).map((l) => redact ? redactLine(stripAnsi(l)) : stripAnsi(l));\n } catch { logLines = [\"(no logs available)\"]; }\n } else { logLines = [\"(no logs available)\"]; }\n }\n if (levelFilter) {\n const levelRegex = new RegExp(`\\\\b(${levelFilter.toUpperCase()})\\\\b`, \"i\");\n logLines = logLines.filter((line) => levelRegex.test(line));\n }\n const running = trackedMatch ? isTrackedRunning(trackedMatch) : false;\n const sliced = logLines.slice(-lineCount);\n const redactedHits = sliced.reduce((acc, l) => acc + (redactionCount(stripAnsi(l)) > 0 ? 1 : 0), 0);\n const payload = {\n app: displayName,\n running,\n pid: trackedMatch?.pid != null ? trackedMatch.pid : null,\n port: trackedMatch?.port != null ? trackedMatch.port : null,\n lines: sliced,\n count: sliced.length,\n redacted: redact,\n redactedLines: redactedHits,\n note: \"Secrets are redacted by default; use --no-redact to disable.\",\n };\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\");\n return;\n }\n\n // Status header: tell the user whether the app is actually alive.\n if (trackedMatch) {\n const running = isTrackedRunning(trackedMatch);\n const statusStr = running\n ? pc.green(`● running (PID ${trackedMatch.pid})`)\n : pc.red(\"○ stopped\");\n const portStr = trackedMatch.port ? ` ${pc.yellow(`:${trackedMatch.port}`)}` : \"\";\n console.error(`\\n ${symbols.fox} ${renderAppName(displayName)}${portStr} — ${statusStr}`);\n if (!running) {\n console.error(` ${pc.dim(\"This app is not running. Showing last captured logs.\")} ${pc.cyan(`fennec spawn ${displayName}`)} ${pc.dim(\"to restart.\")}`);\n }\n }\n\n const spinner = createSpinner(`Reading logs for ${displayName}...`);\n try {\n let logLines: string[] = [];\n if (logFilePath && existsSync(logFilePath)) {\n logLines = readLogLines(logFilePath, {\n tail: Math.max(lineCount, sinceMs ? MAX_LOG_LINES : 0),\n sinceMs: sinceMs ?? undefined,\n redact,\n parseTimestamp: true,\n });\n } else {\n const pid = trackedMatch?.pid ?? parseInt(target, 10);\n if (!isNaN(pid)) {\n try {\n const output = execSync(`journalctl --no-pager -n ${Math.max(lineCount, 500)} _PID=${pid} 2>/dev/null || echo \"\"`, { encoding: \"utf-8\", timeout: 3000 });\n logLines = output.trim().split(\"\\n\").filter(Boolean).map((l) => redact ? redactLine(stripAnsi(l)) : stripAnsi(l));\n } catch { logLines = [\"(no logs available)\"]; }\n } else { logLines = [\"(no logs available)\"]; }\n }\n\n // Apply level filter\n if (levelFilter) {\n const levelRegex = new RegExp(`\\\\b(${levelFilter.toUpperCase()})\\\\b`, \"i\");\n logLines = logLines.filter((line) => levelRegex.test(line));\n }\n\n spinner.stop();\n process.stdout.write(\"\\r\\x1b[K\");\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Logs\")} ${renderAppName(displayName)} ${pc.dim(`(last ${logLines.length} line${logLines.length !== 1 ? \"s\" : \"\"})${redact ? pc.dim(\" · secrets redacted\") : \"\"})`)}`);\n\n const sliced = logLines.slice(-lineCount);\n for (const line of sliced) {\n const display = line.length > 300 ? line.slice(0, 300) + \"…\" : line;\n\n // Color by level\n if (line.toLowerCase().includes(\"error\") || line.toLowerCase().includes(\"fail\") || line.toLowerCase().includes(\"fatal\")) {\n console.error(` ${pc.red(display)}`);\n } else if (line.toLowerCase().includes(\"warn\")) {\n console.error(` ${pc.yellow(display)}`);\n } else if (line.toLowerCase().includes(\"info\") || line.includes(\"[\")) {\n console.error(` ${pc.cyan(display)}`);\n } else {\n console.error(` ${display}`);\n }\n }\n\n if (followFlag && logFilePath) {\n await followLog(logFilePath, { redact, levelFilter, json: jsonFlag });\n }\n console.error();\n } catch (error) {\n spinner.fail(`Failed to read logs for ${displayName}`);\n console.error(renderError(\"Log read failed\", String(error)));\n }\n}\n\n/**\n * Portable `tail -f` replacement: prints the initial lines (done by the\n * caller), then polls the file for appended bytes and streams new lines to\n * stderr. Handles log rotation (file shrinks → reset offset). Cross-platform\n * (no `tail` binary dependency). Ctrl+C stops it.\n */\nasync function followLog(\n logFilePath: string,\n opts: { redact: boolean; levelFilter?: string; json: boolean },\n): Promise<void> {\n let lastSize = 0;\n try {\n lastSize = statSync(logFilePath).size;\n } catch { /* file may not exist yet */ }\n\n console.error(`\\n ${pc.dim(\"Following... (Ctrl+C to stop)\")}\\n`);\n const levelRe = opts.levelFilter ? new RegExp(`\\\\b(${opts.levelFilter.toUpperCase()})\\\\b`, \"i\") : null;\n\n const emit = (raw: string): void => {\n const line = opts.redact ? redactLine(raw) : raw;\n if (levelRe && !levelRe.test(line)) return;\n if (opts.json) {\n try {\n process.stdout.write(JSON.stringify(JSON.parse(line)) + \"\\n\");\n return;\n } catch { /* not valid JSON — fall through to plain print */ }\n }\n const display = line.length > 300 ? line.slice(0, 300) + \"…\" : line;\n if (line.toLowerCase().includes(\"error\") || line.toLowerCase().includes(\"fail\") || line.toLowerCase().includes(\"fatal\")) {\n console.error(` ${pc.red(display)}`);\n } else if (line.toLowerCase().includes(\"warn\")) {\n console.error(` ${pc.yellow(display)}`);\n } else if (line.toLowerCase().includes(\"info\") || line.includes(\"[\")) {\n console.error(` ${pc.cyan(display)}`);\n } else {\n console.error(` ${display}`);\n }\n };\n\n const timer = setInterval(() => {\n let fd: number;\n try {\n fd = openSync(logFilePath, \"r\");\n } catch {\n return; // not created yet\n }\n try {\n const size = fstatSync(fd).size;\n if (size < lastSize) lastSize = 0; // rotated\n if (size > lastSize) {\n const buf = Buffer.alloc(size - lastSize);\n readSync(fd, buf, 0, buf.length, lastSize);\n lastSize = size;\n for (const l of buf.toString(\"utf8\").split(\"\\n\")) {\n if (l.length) emit(l);\n }\n }\n } finally {\n closeSync(fd);\n }\n }, 400);\n\n await new Promise<void>((resolve) => {\n const stop = (): void => {\n clearInterval(timer);\n resolve();\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n });\n}\n\n/**\n * When `fennec log` / `fennec logs` is run without an app name, list the\n * tracked apps (with live status) so the user can pick one instead of\n * hitting an error.\n */\nfunction listAvailableApps(): void {\n const tracked = readTracked();\n\n if (tracked.length === 0) {\n console.error(`\\n ${symbols.fox} ${pc.bold(\"No tracked apps to show logs for.\")}`);\n console.error(` ${pc.dim(\"Start one with:\")} ${pc.cyan(\"fennec start <command> --name <name>\")}\\n`);\n return;\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Logs\")} ${pc.dim(\"— pick an app:\")}\\n`);\n for (const t of tracked) {\n const running = isTrackedRunning(t);\n const dot = running ? pc.green(\"●\") : pc.red(\"○\");\n const state = running ? pc.green(`running (PID ${t.pid})`) : pc.red(\"stopped\");\n const portStr = t.port ? ` ${pc.yellow(`:${t.port}`)}` : \"\";\n console.error(` ${dot} ${pc.bold(t.name)}${portStr} ${pc.dim(\"—\")} ${state}`);\n console.error(` ${pc.cyan(`fennec log ${t.name}`)} ${pc.dim(\"·\")} ${pc.cyan(`fennec log ${t.name} -f`)}`);\n }\n console.error(`\\n ${pc.dim(\"Flags:\")} ${pc.cyan(\"-f\")} ${pc.dim(\"follow\")} ${pc.dim(\"·\")} ${pc.cyan(\"--lines N\")} ${pc.dim(\"·\")} ${pc.cyan(\"--since 10m|1h\")} ${pc.dim(\"·\")} ${pc.cyan(\"--level error|warn|info|debug\")} ${pc.dim(\"·\")} ${pc.cyan(\"--json\")} ${pc.dim(\"(AI)\")} ${pc.dim(\"·\")} ${pc.cyan(\"--no-redact\")} ${pc.dim(\"·\")} ${pc.cyan(\"--clear\")}`);\n console.error(` ${pc.dim(\"AI mode:\")} ${pc.cyan(\"fennec log <app> --json --since 10m\")} ${pc.dim(\"— bounded, redacted, machine-readable. Secrets are redacted by default.\")}\\n`);\n}\n","/**\n * Command: attach — Attach to a process by port.\n */\nimport { PortDetector } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { renderError, renderKV, renderAppName, createSpinner } from \"../utils/format.js\";\n\nexport async function attachCommand(args: string[]): Promise<void> {\n const port = parseInt(args[0]!, 10);\n if (isNaN(port)) { console.error(renderError(\"Invalid port\", \"Usage: fennec attach <port> --name <name>\")); process.exit(1); }\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 try {\n const detector = new PortDetector();\n const info = detector.detectByPort(port);\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: store — unified view of everything Fennec persists.\n *\n * fennec store overview (global ~/.fennec)\n * fennec store --local overview of ./fennec (project)\n * fennec store session list saved auth sessions\n * fennec store session info <n> show a session (values masked)\n * fennec store session rm <n> delete a session (confirm)\n *\n * Sessions default to the GLOBAL store (~/.fennec) so they're manageable\n * from any directory. `--local` targets the per-project ./.fennec instead.\n */\nimport { StoreManager, redactSession } from \"@plumpslabs/fennec-core\";\nimport { SessionStore } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { renderError, confirmPrompt, renderSection, renderKV } from \"../utils/format.js\";\nimport { symbols, renderTable, type Column, type Row } from \"../utils/format.js\";\n\nconst KINDS = [\"session\", \"process\", \"workflow\", \"plugin\", \"config\", \"export\"] as const;\ntype Kind = (typeof KINDS)[number];\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction formatAge(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h`;\n return `${Math.floor(h / 24)}d`;\n}\n\nexport async function storeCommand(args: string[]): Promise<void> {\n const local = args.includes(\"--local\");\n const showSecrets = args.includes(\"--show-secrets\");\n const yes = args.includes(\"-y\") || args.includes(\"--yes\");\n\n const positional: string[] = [];\n for (const a of args) {\n if (a.startsWith(\"--\") || a === \"-y\") continue;\n positional.push(a);\n }\n const kind = positional[0] as Kind | undefined;\n const action = positional[1];\n const name = positional[2];\n\n const mgr = new StoreManager(local);\n mgr.ensure();\n\n // `fennec store` (no kind) -> overview scan\n if (!kind) {\n const scan = mgr.scan();\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Fennec Store\")} ${pc.dim(local ? \"(local ./.fennec)\" : \"(global)\")}\\n`);\n const columns: Column[] = [\n { key: \"kind\", label: \"Kind\", format: (v) => pc.bold(String(v)) },\n { key: \"count\", label: \"Items\", format: (v) => pc.cyan(String(v)) },\n { key: \"size\", label: \"Size\", format: (v) => pc.dim(formatBytes(Number(v))) },\n { key: \"oldest\", label: \"Oldest\", format: (v) => pc.dim(formatAge(Number(v))) },\n ];\n const rows: Row[] = scan.map((e) => ({\n kind: e.kind,\n count: e.count,\n size: e.sizeBytes,\n oldest: e.oldestMs,\n }));\n console.error(renderTable(columns, rows));\n console.error(` ${pc.dim(mgr.base)}\\n`);\n return;\n }\n\n if (!KINDS.includes(kind)) {\n console.error(renderError(\"Unknown kind\", `Kind must be one of: ${KINDS.join(\", \")}`));\n process.exit(1);\n }\n\n if (kind !== \"session\") {\n // Phase 1: only sessions have write actions. Others are visible via\n // overview; dedicated commands already manage them (fennec ps, etc.).\n const entry = mgr.scan().find((e) => e.kind === kind);\n console.error(`\\n ${pc.bold(kind)} ${pc.dim(`(${entry?.count ?? 0} item(s))`)}\\n`);\n console.error(` ${pc.dim(mgr.dirFor(kind))}\\n`);\n const tip =\n kind === \"process\" ? \"Managed via `fennec ps` / `fennec kill` / `fennec restart`.\"\n : kind === \"export\" ? \"Created by `fennec export` / `fennec import`.\"\n : \"Read-only in this view (Phase 2).\";\n console.error(` ${pc.dim(tip)}\\n`);\n return;\n }\n\n // ---- session ----\n const store: SessionStore = mgr.sessionStore();\n\n if (!action || action === \"ls\" || action === \"list\") {\n const sessions = store.list();\n if (sessions.length === 0) {\n console.error(`\\n ${pc.dim(`No saved sessions found${local ? \" in ./.fennec/sessions\" : \" in the global store\"}.`)}\\n`);\n return;\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 const rows: Row[] = sessions.map((s) => ({\n name: s.name,\n origin: s.origin,\n savedAt: new Date(s.savedAt).toLocaleString(),\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 return;\n }\n\n if (action === \"info\") {\n if (!name) {\n console.error(renderError(\"Missing name\", \"Usage: fennec store session info <name> [--show-secrets]\"));\n process.exit(1);\n }\n const session = store.load(name);\n if (!session) {\n console.error(renderError(\"Session not found\", `No session named \"${name}\". Use 'fennec store session' to list.`));\n process.exit(1);\n }\n const shown = showSecrets ? session : redactSession(session);\n const cookieDomains = (shown.cookies as Array<Record<string, unknown>>)\n .map((c) => String(c.domain ?? c.name ?? \"?\"))\n .filter((v, i, a) => a.indexOf(v) === i);\n let body = \"\";\n body += renderKV(\"Name\", shown.name);\n body += renderKV(\"Origin\", shown.origin);\n body += renderKV(\"Saved\", new Date(shown.savedAt).toLocaleString());\n if (shown.metadata) {\n for (const [k, v] of Object.entries(shown.metadata)) body += renderKV(k, String(v));\n }\n body += renderKV(\"Cookies\", `${shown.cookies.length} (domains: ${cookieDomains.join(\", \") || \"-\"})`);\n body += renderKV(\"localStorage keys\", String(Object.keys(shown.localStorage).length));\n body += renderKV(\"Values\", showSecrets ? \"shown\" : pc.dim(\"masked — use --show-secrets\"));\n console.error(`\\n ${pc.bold(`Session: ${shown.name}`)}\\n`);\n console.error(renderSection(\"Details\", body));\n return;\n }\n\n if (action === \"rm\" || action === \"remove\" || action === \"delete\") {\n if (!name) {\n console.error(renderError(\"Missing name\", \"Usage: fennec store session rm <name>\"));\n process.exit(1);\n }\n if (!store.load(name)) {\n console.error(renderError(\"Session not found\", `No session named \"${name}\".`));\n process.exit(1);\n }\n const confirmed = yes || (await confirmPrompt(`Delete session ${pc.bold(name)}?`, false));\n if (!confirmed) {\n console.error(` ${pc.dim(\"Cancelled\")}`);\n return;\n }\n const ok = store.delete(name);\n console.error(ok ? ` ${pc.green(\"✓\")} ${pc.bold(name)} deleted\\n` : ` ${pc.red(\"✗\")} failed to delete ${pc.bold(name)}\\n`);\n return;\n }\n\n console.error(renderError(\"Unknown action\", \"Actions: ls | info <name> | rm <name>\"));\n process.exit(1);\n}\n","/**\n * Command: doctor — health + secret-surface checks for the Fennec store.\n *\n * fennec doctor\n *\n * Warns when:\n * - the global store dir is group/other readable (perms)\n * - the store lives under a synced dir (chezmoi/yadm/Dropbox/...) ->\n * auth cookies/tokens could leak across machines\n * - other tools' launch commands (tracked.json) embed secrets (KEY=val)\n * - a local ./.fennec exists in this repo but is NOT gitignored\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { StoreManager } from \"@plumpslabs/fennec-core\";\nimport pc from \"picocolors\";\nimport { renderError } from \"../utils/format.js\";\n\nexport async function doctorCommand(): Promise<void> {\n const mgr = new StoreManager(false);\n const base = mgr.base;\n const problems: string[] = [];\n const notes: string[] = [];\n\n // 1. permissions\n if (!mgr.permsSafe()) {\n problems.push(`Store dir is group/other readable: ${base}\\n Fix: chmod 700 ${base}`);\n }\n\n // 2. synced-home leakage\n if (StoreManager.isSynced(base)) {\n problems.push(\n `Store lives under a synced directory: ${base}\\n` +\n ` Auth cookies/tokens in sessions + process launch commands could leak across machines.\\n` +\n ` Prefer a non-synced location (FENNEC_HOME=/non-synced/fennec) or use --local with care.`,\n );\n }\n\n // 3. secret surface\n const scan = mgr.scan();\n const sess = scan.find((s) => s.kind === \"session\");\n if (sess && sess.count > 0) {\n notes.push(\n `${sess.count} auth session(s) with cookies/localStorage stored on disk.\\n` +\n ` Values are masked by default in 'fennec store session info'; use --show-secrets to reveal.`,\n );\n }\n const proc = scan.find((s) => s.kind === \"process\");\n if (proc && proc.count > 0) {\n const tracked = mgr.fileFor(\"process\", \"\");\n const cmds = existsSync(tracked) ? (JSON.parse(readFileSync(tracked, \"utf-8\")) as Array<{ command?: string }>) : [];\n // Flag bareword env assignments (KEY=value), not `--flag=val` or `x=1` in quotes.\n const secretCmds = cmds.filter(\n (c) => c.command && /(?:^|[\\s;|&])([A-Za-z_][A-Za-z0-9_]*)=/.test(c.command),\n ).length;\n if (secretCmds > 0) {\n notes.push(\n `${secretCmds} tracked process launch command(s) may embed secrets (KEY=value).\\n` +\n ` Stored in ${tracked} — keep the store out of synced/committed locations.`,\n );\n }\n }\n\n // 4. local .fennec not gitignored\n const localFen = join(process.cwd(), \".fennec\");\n if (existsSync(localFen)) {\n let ignored = false;\n try {\n execSync(\"git check-ignore -q .fennec\", { cwd: process.cwd(), stdio: \"ignore\" });\n ignored = true;\n } catch (err) {\n // git absent (ENOENT) -> can't determine; skip the warning rather than false-alarm.\n ignored = (err as NodeJS.ErrnoException)?.code === \"ENOENT\";\n }\n if (!ignored) {\n problems.push(\n `Local ./.fennec exists here and is NOT gitignored.\\n` +\n ` It can hold sessions + tracked processes — add '.fennec/' to .gitignore or remove it.`,\n );\n }\n }\n\n console.error(`\\n ${pc.bold(\"Fennec Doctor\")}\\n`);\n console.error(` ${pc.dim(\"Store:\")} ${base}\\n`);\n\n if (problems.length === 0 && notes.length === 0) {\n console.error(` ${pc.green(\"✓\")} No issues found.\\n`);\n return;\n }\n for (const p of problems) console.error(` ${pc.red(\"✗\")} ${p}\\n`);\n for (const n of notes) console.error(` ${pc.yellow(\"!\")} ${n}\\n`);\n}\n","/**\n * Command: setup — Interactive MCP client setup.\n */\nimport pc from \"picocolors\";\nimport { symbols, renderSuccess, renderCommand, selectPrompt } from \"../utils/format.js\";\n\nexport async 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) { console.error(` ${pc.dim(\"Setup cancelled.\")}\\n`); return; }\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: init, install-browsers — Project setup utilities.\n */\nimport { existsSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport pc from \"picocolors\";\nimport { renderCommand, renderError, renderSuccess, createSpinner, confirmPrompt } from \"../utils/format.js\";\n\nexport async function installBrowsersCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Installing Browser Engines\")}\\n`);\n const spinner = createSpinner(\"Installing Chromium...\");\n try {\n execSync(\"npx playwright install chromium\", { stdio: \"pipe\", timeout: 120000 });\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 console.error(`\\n ${pc.green(\"✓\")} Browser installation complete.\\n`);\n}\n\nexport async function initCommand(): Promise<void> {\n console.error(`\\n ${pc.bold(\"Initialize Fennec Configuration\")}\\n`);\n\n const configFile = resolve(\"./fennec.config.yaml\");\n if (existsSync(configFile)) {\n const overwrite = await confirmPrompt(`${pc.yellow(\"fennec.config.yaml\")} already exists. Overwrite?`, false);\n if (!overwrite) { console.error(` ${pc.dim(\"Cancelled.\")}\\n`); return; }\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 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 * Command: health — Check Fennec system health\n * Returns system status, tracked processes, and resource info.\n */\nimport { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport pc from \"picocolors\";\nimport { printBanner } from \"../utils/banner.js\";\nimport { symbols, renderKV, renderError } from \"../utils/format.js\";\nimport { readTracked } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function healthCommand(): Promise<void> {\n printBanner();\n console.error(` ${pc.bold(\"Fennec Health Check\")}\\n`);\n\n // 1. ADB availability (if needed)\n let adbStatus = \"unknown\";\n try {\n const result = execSync(\"adb --version\", {\n encoding: \"utf-8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const version = result.split(\"\\n\")[0]?.trim() ?? \"installed\";\n adbStatus = pc.green(version);\n } catch {\n adbStatus = pc.dim(\"not found\") + \" (optional)\";\n }\n\n // 2. Tracked processes\n const tracked = readTracked();\n const runningCount = tracked.filter((t) => isProcessRunning(t.pid)).length;\n\n // 3. Disk usage for logs\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n let logSize = \"0 B\";\n try {\n if (existsSync(logDir)) {\n const files = readdirSync(logDir);\n let totalBytes = 0;\n for (const f of files) {\n const fStat = statSync(resolve(logDir, f));\n totalBytes += fStat.size;\n }\n logSize = totalBytes > 1024 * 1024\n ? `${(totalBytes / (1024 * 1024)).toFixed(1)} MB`\n : `${(totalBytes / 1024).toFixed(1)} KB`;\n }\n } catch { /* best-effort */ }\n\n // 4. Memory info\n let memoryInfo = \"unknown\";\n try {\n const mem = process.memoryUsage();\n memoryInfo = `${(mem.rss / (1024 * 1024)).toFixed(0)} MB RSS / ${(mem.heapUsed / (1024 * 1024)).toFixed(0)} MB heap`;\n } catch { /* best-effort */ }\n\n console.error(` ${symbols.fox} ${pc.bold(\"System\")}\\n`);\n console.error(` ${renderKV(\"Node.js\", process.version)}`);\n console.error(` ${renderKV(\"Platform\", `${process.platform} ${process.arch}`)}`);\n console.error(` ${renderKV(\"Memory\", memoryInfo)}`);\n console.error(` ${renderKV(\"ADB\", adbStatus)}`);\n console.error(` ${renderKV(\"PID\", String(process.pid))}`);\n console.error();\n console.error(` ${symbols.fox} ${pc.bold(\"Processes\")}\\n`);\n console.error(` ${renderKV(\"Tracked\", String(tracked.length))}`);\n console.error(` ${renderKV(\"Running\", String(runningCount))}`);\n console.error(` ${renderKV(\"Logs\", logSize)}`);\n console.error();\n\n const allHealthy = runningCount === tracked.length || tracked.length === 0;\n if (allHealthy) {\n console.error(` ${pc.green(\"✓\")} ${pc.bold(\"All systems healthy\")}\\n`);\n } else {\n const stopped = tracked.length - runningCount;\n console.error(` ${pc.yellow(\"⚠\")} ${pc.bold(`${stopped} process(es) stopped`)} ${pc.dim(\"fennec ps\")}\\n`);\n }\n}\n","/**\n * Command: cleanup — Remove dead tracked entries that have no saved command\n * and cannot be re-spawned.\n */\nimport pc from \"picocolors\";\nimport { renderError, confirmPrompt } from \"../utils/format.js\";\nimport { readTracked, saveTracked } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function cleanupCommand(): Promise<void> {\n const tracked = readTracked();\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes to clean up.\")}\\n`);\n return;\n }\n\n const toRemove = tracked.filter((t) => !isProcessRunning(t.pid) && !t.command);\n if (toRemove.length === 0) {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(\"All clean\")} ${pc.dim(\"— no dead entries without saved commands.\")}\\n`);\n return;\n }\n\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.bold(`Found ${toRemove.length} dead entr${toRemove.length > 1 ? \"ies\" : \"y\"} without saved commands`)}\\n`);\n for (const entry of toRemove) {\n console.error(` ${pc.dim(\"·\")} ${pc.bold(entry.name)} ${pc.dim(`(PID ${entry.pid})`)}`);\n }\n console.error();\n\n const confirmed = await confirmPrompt(`Remove ${toRemove.length} entr${toRemove.length > 1 ? \"ies\" : \"y\"}?`, false);\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n const remaining = tracked.filter((t) => !toRemove.includes(t));\n saveTracked(remaining);\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(`Removed ${toRemove.length} entr${toRemove.length > 1 ? \"ies\" : \"y\"}`)} ${pc.dim(`(${remaining.length} remaining)`)}\\n`);\n}\n","/**\n * Command: info — Show detailed info about a tracked process.\n */\nimport pc from \"picocolors\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderKVColor, symbols } from \"../utils/format.js\";\nimport { readTracked, formatUptime } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function infoCommand(args: string[]): Promise<void> {\n const name = args[0];\n if (!name) {\n console.error(renderError(\"Missing name\", \"Usage: fennec info <name>\"));\n process.exit(1);\n }\n\n const tracked = readTracked();\n const match = tracked.find((t) => t.name === name);\n\n if (!match) {\n console.error(renderError(\"Not found\", `No tracked process named \"${name}\".`));\n process.exit(1);\n }\n\n const running = isProcessRunning(match.pid);\n const statusIcon = running ? pc.green(\"●\") : pc.red(\"○\");\n const statusText = running ? pc.green(\"running\") : pc.red(\"stopped\");\n const uptime = running\n ? formatUptime(Math.floor((Date.now() - new Date(match.startedAt).getTime()) / 1000))\n : \"-\";\n const logPath = resolve(homedir(), \".fennec\", \"logs\", `${match.name}.log`);\n\n console.error(`\\n ${symbols.fox} ${pc.bold(match.name)} ${pc.dim(\"— Process Info\")}\\n`);\n console.error(` ${renderKVColor(\"Name\", match.name, pc.bold)}`);\n console.error(` ${renderKVColor(\"Status\", `${statusIcon} ${statusText}`)}`);\n console.error(` ${renderKVColor(\"PID\", String(match.pid))}`);\n console.error(` ${renderKVColor(\"Port\", match.port ? String(match.port) : \"-\")}`);\n console.error(` ${renderKVColor(\"Command\", match.command || pc.dim(\"(none)\"))}`);\n if (match.cwd) console.error(` ${renderKVColor(\"CWD\", match.cwd)}`);\n console.error(` ${renderKVColor(\"Started\", new Date(match.startedAt).toLocaleString())}`);\n console.error(` ${renderKVColor(\"Uptime\", uptime)}`);\n console.error(` ${renderKVColor(\"Log Path\", logPath)}`);\n\n if (!running && match.command) {\n console.error(`\\n ${pc.dim(\"Re-spawn with:\")} ${pc.cyan(`fennec spawn ${match.name}`)}`);\n }\n console.error();\n}\n","/**\n * Command: rename — Rename a tracked process and its log file.\n */\nimport pc from \"picocolors\";\nimport { existsSync, renameSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { renderError, renderKVColor, createSpinner, confirmPrompt, symbols } from \"../utils/format.js\";\nimport { readTracked, saveTracked } from \"./tracker.js\";\nimport { isProcessRunning } from \"../utils/system-process.js\";\n\nexport async function renameCommand(args: string[]): Promise<void> {\n const [oldName, newName] = args;\n\n if (!oldName || !newName) {\n console.error(renderError(\"Missing arguments\", \"Usage: fennec rename <old-name> <new-name>\"));\n process.exit(1);\n }\n\n if (oldName === newName) {\n console.error(`\\n ${pc.yellow(\"⚠\")} ${pc.dim(\"Old and new names are the same.\")}\\n`);\n process.exit(0);\n }\n\n const tracked = readTracked();\n const match = tracked.find((t) => t.name === oldName);\n\n if (!match) {\n console.error(renderError(\"Not found\", `No tracked process named \"${oldName}\".`));\n process.exit(1);\n }\n\n if (tracked.some((t) => t.name === newName)) {\n console.error(renderError(\"Name taken\", `A process named \"${newName}\" already exists.`));\n process.exit(1);\n }\n\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Rename Process\")}\\n`);\n console.error(` ${renderKVColor(\"From\", oldName)}`);\n console.error(` ${renderKVColor(\"To\", newName)}`);\n if (isProcessRunning(match.pid)) {\n console.error(` ${pc.yellow(\"⚠\")} ${pc.dim(\"Process is still running — log entries will go to the old file until stopped.\")}`);\n }\n console.error();\n\n const confirmed = await confirmPrompt(`Rename ${pc.bold(oldName)} ${pc.dim(\"→\")} ${pc.bold(newName)}?`, true);\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n const spinner = createSpinner(`Renaming ${oldName} → ${newName}...`);\n\n // Rename log file if it exists\n const logDir = resolve(homedir(), \".fennec\", \"logs\");\n const oldLog = resolve(logDir, `${oldName}.log`);\n const newLog = resolve(logDir, `${newName}.log`);\n\n if (existsSync(oldLog) && !existsSync(newLog)) {\n try {\n renameSync(oldLog, newLog);\n } catch { /* best-effort */ }\n }\n\n // Update tracked.json\n match.name = newName;\n saveTracked(tracked);\n\n spinner.succeed(`${pc.bold(oldName)} ${pc.dim(\"→\")} ${pc.bold(newName)}`);\n console.error();\n}\n","/**\n * Commands: export, import — Backup and restore tracked.json configuration.\n */\nimport pc from \"picocolors\";\nimport { existsSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { renderError, confirmPrompt, symbols, renderKVColor } from \"../utils/format.js\";\nimport { readTracked, saveTracked } from \"./tracker.js\";\n\n/**\n * fennec export [--file path]\n * Export tracked.json to stdout or a file.\n */\nexport async function exportCommand(args: string[]): Promise<void> {\n const tracked = readTracked();\n const fileIndex = args.indexOf(\"--file\");\n const filePath = fileIndex !== -1 ? args[fileIndex + 1] : undefined;\n\n if (fileIndex !== -1 && !filePath) {\n console.error(renderError(\"Missing file path\", \"Usage: fennec export --file <path>\"));\n process.exit(1);\n }\n\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes to export.\")}\\n`);\n return;\n }\n\n const json = JSON.stringify(tracked, null, 2);\n\n if (filePath) {\n try {\n writeFileSync(resolve(filePath), json, \"utf-8\");\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(`Exported ${tracked.length} process(es)`)} ${pc.dim(`→ ${filePath}`)}\\n`);\n } catch (err) {\n console.error(renderError(\"Export failed\", String(err)));\n process.exit(1);\n }\n } else {\n // Write to stdout as JSON\n console.log(json);\n }\n}\n\n/**\n * fennec import <file>\n * Import processes from a JSON file and merge into tracked.json.\n */\nexport async function importCommand(args: string[]): Promise<void> {\n const filePath = args[0];\n\n if (!filePath) {\n console.error(renderError(\"Missing file\", \"Usage: fennec import <file>\"));\n process.exit(1);\n }\n\n const resolvedPath = resolve(filePath);\n if (!existsSync(resolvedPath)) {\n console.error(renderError(\"File not found\", `\"${filePath}\" does not exist.`));\n process.exit(1);\n }\n\n let imported: { name: string; pid: number; command: string; port?: number; cwd?: string; startedAt: string }[];\n try {\n imported = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (!Array.isArray(imported) || imported.length === 0) {\n console.error(renderError(\"Invalid file\", \"File must contain a non-empty JSON array of process objects.\"));\n process.exit(1);\n }\n } catch (err) {\n console.error(renderError(\"Invalid JSON\", String(err)));\n process.exit(1);\n }\n\n const existing = readTracked();\n console.error(`\\n ${symbols.fox} ${pc.bold(\"Import Processes\")}\\n`);\n console.error(` ${renderKVColor(\"File\", resolvedPath)}`);\n console.error(` ${renderKVColor(\"Importing\", `${imported.length} process(es)`)}`);\n console.error(` ${renderKVColor(\"Existing\", `${existing.length} process(es)`)}`);\n\n // Show what will be imported\n console.error(`\\n ${pc.bold(\"Processes to import:\")}`);\n for (const p of imported) {\n console.error(` ${pc.green(\"+\")} ${pc.bold(p.name)} ${pc.dim(`(${p.command})`)}`);\n }\n console.error();\n\n const confirmed = await confirmPrompt(\"Merge into tracked.json? Existing processes with the same name will be overwritten.\", true);\n if (!confirmed) { console.error(` ${pc.dim(\"Cancelled\")}\\n`); return; }\n\n // Merge: overwrite existing by name, add new\n const merged = [...existing];\n for (const proc of imported) {\n const idx = merged.findIndex((t) => t.name === proc.name);\n if (idx !== -1) {\n merged[idx] = { ...merged[idx], ...proc };\n } else {\n merged.push(proc as any);\n }\n }\n\n saveTracked(merged);\n console.error(` ${pc.green(\"✓\")} ${pc.bold(`Imported ${imported.length} process(es)`)} ${pc.dim(`(${merged.length} total)`)}\\n`);\n}\n","/**\n * Command: group — Tag existing tracked entries with a logical group, or\n * list group membership. Groups let bulk ops (kill/spawn/stop/ps) target a\n * subset instead of everything (--all).\n *\n * fennec group → list all entries with their group\n * fennec group <name> <grp> → assign group <grp> to <name>\n * fennec group <name> --unset → clear the group on <name>\n */\nimport pc from \"picocolors\";\nimport { renderError, renderTable, type Column, type Row } from \"../utils/format.js\";\nimport { readTracked, setGroup, getGroups } from \"./tracker.js\";\n\nexport async function groupCommand(args: string[]): Promise<void> {\n const positional = args.filter((a) => !a.startsWith(\"-\") && !a.includes(\"=\"));\n const unset = args.includes(\"--unset\");\n\n // No args → list every entry with its group\n if (positional.length === 0) {\n const tracked = readTracked();\n if (tracked.length === 0) {\n console.error(`\\n ${pc.dim(\"No tracked processes.\")}\\n`);\n return;\n }\n const columns: Column[] = [\n { key: \"name\", label: \"App\", format: (v) => pc.bold(String(v)) },\n { key: \"group\", label: \"Group\", format: (v) => { const g = String(v); return g === \"-\" ? pc.dim(\"-\") : pc.cyan(g); } },\n { key: \"command\", label: \"Command\", format: (v) => { const c = String(v); return c.length > 50 ? c.slice(0, 50) + \"…\" : c; } },\n ];\n const rows: Row[] = tracked.map((t) => ({ name: t.name, group: t.group ?? \"-\", command: t.command }));\n console.error(`\\n ${pc.bold(\"Fennec Apps by Group\")} ${pc.dim(`(${getGroups().length} group(s))`)}\\n`);\n console.error(renderTable(columns, rows));\n console.error(` ${pc.dim(\"Assign:\")} ${pc.cyan(\"fennec group <name> <group>\")} ${pc.dim(\"Clear:\")} ${pc.cyan(\"fennec group <name> --unset\")}`);\n console.error();\n return;\n }\n\n const name = positional[0]!;\n const newGroup = positional[1];\n\n if (!newGroup && !unset) {\n console.error(renderError(\"Missing group\", \"Usage: fennec group <name> <group> (or: fennec group <name> --unset)\"));\n process.exit(1);\n }\n\n const ok = setGroup(name, unset ? undefined : newGroup);\n if (!ok) {\n console.error(renderError(\"Not found\", `No tracked process named \"${name}\".`));\n process.exit(1);\n }\n\n if (unset) {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(name)} ${pc.dim(\"removed from its group\")}\\n`);\n } else {\n console.error(`\\n ${pc.green(\"✓\")} ${pc.bold(name)} ${pc.dim(\"assigned to group\")} ${pc.cyan(newGroup!)}\\n`);\n }\n}\n","#!/usr/bin/env node\n\nimport { renderError } from \"./utils/format.js\";\nimport { printBanner } from \"./utils/banner.js\";\nimport { showHelp, showCommandHelp } 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 { startServer, startCommand, runCommand } from \"./commands/start.js\";\nimport { psCommand, statusCommand } from \"./commands/ps.js\";\nimport { killCommand } from \"./commands/kill.js\";\nimport { stopCommand } from \"./commands/stop.js\";\nimport { spawnCommand } from \"./commands/spawn.js\";\nimport { restartCommand } from \"./commands/restart.js\";\nimport { adoptCommand } from \"./commands/adopt.js\";\nimport { supervisorCommand, runSupervisor } from \"./commands/supervisor.js\";\nimport { persistCommand } from \"./commands/persist.js\";\nimport { inspectCommand } from \"./commands/inspect.js\";\nimport { devCommand } from \"./commands/dev.js\";\nimport { logCommand } from \"./commands/log.js\";\nimport { attachCommand } from \"./commands/attach.js\";\nimport { storeCommand } from \"./commands/store.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { installBrowsersCommand, initCommand } from \"./commands/management.js\";\nimport { healthCommand } from \"./commands/health.js\";\nimport { cleanupCommand } from \"./commands/cleanup.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { renameCommand } from \"./commands/rename.js\";\nimport { exportCommand, importCommand } from \"./commands/export-import.js\";\nimport { groupCommand } from \"./commands/group.js\";\n\nconst [, , command, ...args] = process.argv;\n\nasync function main(): Promise<void> {\n // Per-command help: `fennec <command> --help` / `-h` (but not bare `start`,\n // which is the server, and not the help command itself).\n if (\n command &&\n command !== \"help\" &&\n command !== \"--help\" &&\n command !== \"-h\" &&\n (args.includes(\"--help\") || args.includes(\"-h\"))\n ) {\n printBanner();\n showCommandHelp(command);\n return;\n }\n\n if (!command || command === \"start\") {\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 printBanner();\n await psCommand(args);\n } else if (command === \"status\") {\n printBanner();\n await statusCommand(args);\n } else if (command === \"log\" || command === \"logs\") {\n await logCommand(args);\n } else if (command === \"spawn\") {\n await spawnCommand(args);\n } else if (command === \"stop\") {\n await stopCommand(args);\n } else if (command === \"kill\") {\n await killCommand(args);\n } else if (command === \"restart\") {\n await restartCommand(args);\n } else if (command === \"adopt\") {\n adoptCommand(args);\n } else if (command === \"supervisor\") {\n printBanner();\n await supervisorCommand(args);\n } else if (command === \"__supervisor\") {\n await runSupervisor();\n } else if (command === \"persist\") {\n printBanner();\n await persistCommand(args);\n } else if (command === \"inspect\") {\n await inspectCommand(args);\n } else if (command === \"dev\") {\n printBanner();\n await devCommand(args);\n } else if (command === \"info\") {\n printBanner();\n await infoCommand(args);\n } else if (command === \"cleanup\") {\n printBanner();\n await cleanupCommand();\n } else if (command === \"rename\") {\n await renameCommand(args);\n } else if (command === \"group\") {\n await groupCommand(args);\n } else if (command === \"export\") {\n await exportCommand(args);\n } else if (command === \"import\") {\n await importCommand(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 === \"store\") {\n printBanner();\n await storeCommand(args);\n } else if (command === \"doctor\") {\n printBanner();\n await doctorCommand();\n } else if (command === \"sessions\") {\n await storeCommand([\"session\"]);\n } else if (command === \"setup\") {\n await setupCommand();\n } else if (command === \"install-browsers\") {\n printBanner();\n await installBrowsersCommand();\n } else if (command === \"health\" || command === \"--health\") {\n await healthCommand();\n } else if (command === \"init\") {\n printBanner();\n await initCommand();\n } else if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n printBanner();\n } else if (command === \"help\" || command === \"--help\" || command === \"-h\") {\n printBanner();\n if (args[0] && !args[0].startsWith(\"-\")) {\n showCommandHelp(args[0]);\n } else {\n showHelp();\n }\n } else {\n console.error(renderError(`Unknown command: ${command}`, \"Run 'fennec help' for usage information\"));\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(renderError(\"Fatal error\", String(error)));\n process.exit(1);\n});\n"],"mappings":"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","names":["stripAnsi","pad","text","options","colors","colors","colors","colors","colors","stylize","builder","args","style","sequencer","map","colors","colors","args","pad","CliTable3","num","resolve","pc","fennecOrange","pc","fennecOrange","pc","args","args","PortDetector","args","args","mkdirSync","resolve","dirname","pc","existsSync","readFileSync","resolve","existsSync","command","resolve","existsSync","args","resolve","existsSync","readFileSync","command","pc","existsSync","readFileSync","writeFileSync","mkdirSync","openSync","closeSync","spawn","dirname","existsSync","readFileSync","mkdirSync","dirname","openSync","spawn","closeSync","args","pc","writeFileSync","rec","pc","existsSync","writeFileSync","unlinkSync","mkdirSync","resolve","dirname","homedir","resolve","homedir","args","existsSync","mkdirSync","dirname","writeFileSync","pc","unlinkSync","pc","args","pc","columns","rows","resolve","args","pc","resolve","dirname","mkdirSync","pc","args","pc","pc","args","pc","pc","mkdirSync","resolve","homedir","args","pc","resolve","homedir","mkdirSync","pc","args","pc","pc","args","pc","readFileSync","pc","existsSync","readFileSync","readFileSync","args","pc","pc","existsSync","readFileSync","resolve","dirname","existsSync","readFileSync","resolve","pc","args","dirname","existsSync","unlinkSync","statSync","openSync","closeSync","execSync","pc","args","existsSync","pc","unlinkSync","execSync","statSync","openSync","closeSync","resolve","PortDetector","pc","args","PortDetector","pc","pc","args","pc","existsSync","readFileSync","execSync","StoreManager","pc","StoreManager","existsSync","readFileSync","execSync","pc","pc","pc","existsSync","writeFileSync","resolve","execSync","pc","pc","execSync","resolve","existsSync","writeFileSync","existsSync","readdirSync","statSync","execSync","resolve","homedir","pc","pc","execSync","resolve","homedir","existsSync","readdirSync","statSync","pc","pc","pc","resolve","homedir","args","pc","resolve","homedir","pc","existsSync","renameSync","resolve","homedir","args","pc","resolve","homedir","existsSync","renameSync","pc","existsSync","writeFileSync","readFileSync","resolve","args","pc","writeFileSync","resolve","existsSync","readFileSync","pc","args","pc"]}
|