@agi_inc/cli 0.5.11 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +18 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -517,18 +517,24 @@ var TypewriterText = ({
|
|
|
517
517
|
onComplete
|
|
518
518
|
}) => {
|
|
519
519
|
const [visibleLength, setVisibleLength] = useState2(0);
|
|
520
|
+
const startTime = React2.useRef(Date.now());
|
|
520
521
|
useEffect2(() => {
|
|
521
522
|
setVisibleLength(0);
|
|
523
|
+
startTime.current = Date.now();
|
|
522
524
|
}, [text]);
|
|
523
525
|
useEffect2(() => {
|
|
524
526
|
if (visibleLength >= text.length) {
|
|
525
527
|
onComplete?.();
|
|
526
528
|
return;
|
|
527
529
|
}
|
|
530
|
+
const elapsed = (Date.now() - startTime.current) / 1e3;
|
|
531
|
+
const multiplier = Math.pow(2, elapsed);
|
|
532
|
+
const baseJump = text.length > 60 ? 3 : text.length > 30 ? 2 : 1;
|
|
533
|
+
const jump = Math.max(baseJump, Math.round(baseJump * multiplier));
|
|
534
|
+
const interval = Math.max(4, Math.round(speed / multiplier));
|
|
528
535
|
const timer = setTimeout(() => {
|
|
529
|
-
const jump = text.length > 60 ? 3 : text.length > 30 ? 2 : 1;
|
|
530
536
|
setVisibleLength((prev) => Math.min(prev + jump, text.length));
|
|
531
|
-
},
|
|
537
|
+
}, interval);
|
|
532
538
|
return () => clearTimeout(timer);
|
|
533
539
|
}, [visibleLength, text, speed, onComplete]);
|
|
534
540
|
const displayed = text.slice(0, visibleLength);
|
|
@@ -578,7 +584,7 @@ var EventDisplay = ({ events, maxEvents = 12 }) => {
|
|
|
578
584
|
if (displayEvents.length === 0) return null;
|
|
579
585
|
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column" }, displayEvents.map((event, index) => {
|
|
580
586
|
if (event.type === "separator") {
|
|
581
|
-
return /* @__PURE__ */ React3.createElement(Box2, { key: index, marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, {
|
|
587
|
+
return /* @__PURE__ */ React3.createElement(Box2, { key: index, marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: "cyan", bold: true }, "\u25B8 "), /* @__PURE__ */ React3.createElement(Text3, null, event.goal));
|
|
582
588
|
}
|
|
583
589
|
const style = getEventStyle(event);
|
|
584
590
|
const text = getEventText(event);
|
|
@@ -1634,6 +1640,7 @@ var MOODS = {
|
|
|
1634
1640
|
shimmer: 0.3,
|
|
1635
1641
|
breathe: 0.5,
|
|
1636
1642
|
breatheSpeed: 0.15,
|
|
1643
|
+
fps: 3,
|
|
1637
1644
|
colors: ["#005566", "#008899", "#00aacc", "#00ccee", "#66eeff"]
|
|
1638
1645
|
},
|
|
1639
1646
|
thinking: {
|
|
@@ -1642,6 +1649,7 @@ var MOODS = {
|
|
|
1642
1649
|
shimmer: 0.6,
|
|
1643
1650
|
breathe: 0.3,
|
|
1644
1651
|
breatheSpeed: 0.4,
|
|
1652
|
+
fps: 10,
|
|
1645
1653
|
colors: ["#665500", "#998800", "#ccaa00", "#eedd00", "#ffff44"]
|
|
1646
1654
|
},
|
|
1647
1655
|
active: {
|
|
@@ -1650,6 +1658,7 @@ var MOODS = {
|
|
|
1650
1658
|
shimmer: 0.2,
|
|
1651
1659
|
breathe: 0.4,
|
|
1652
1660
|
breatheSpeed: 0.25,
|
|
1661
|
+
fps: 12,
|
|
1653
1662
|
colors: ["#004400", "#007700", "#00aa00", "#00dd00", "#44ff66"]
|
|
1654
1663
|
},
|
|
1655
1664
|
success: {
|
|
@@ -1658,6 +1667,7 @@ var MOODS = {
|
|
|
1658
1667
|
shimmer: 0.1,
|
|
1659
1668
|
breathe: 0.6,
|
|
1660
1669
|
breatheSpeed: 0.1,
|
|
1670
|
+
fps: 3,
|
|
1661
1671
|
colors: ["#005500", "#008800", "#00bb00", "#00ee00", "#66ff88"]
|
|
1662
1672
|
},
|
|
1663
1673
|
error: {
|
|
@@ -1666,6 +1676,7 @@ var MOODS = {
|
|
|
1666
1676
|
shimmer: 0.8,
|
|
1667
1677
|
breathe: 0.2,
|
|
1668
1678
|
breatheSpeed: 0.6,
|
|
1679
|
+
fps: 15,
|
|
1669
1680
|
colors: ["#660000", "#990000", "#cc0000", "#ff2200", "#ff6644"]
|
|
1670
1681
|
}
|
|
1671
1682
|
};
|
|
@@ -1695,9 +1706,10 @@ var Logo = ({
|
|
|
1695
1706
|
const [time, setTime] = useState6(() => Date.now() / 1e3);
|
|
1696
1707
|
const cfg = MOODS[mood];
|
|
1697
1708
|
useEffect4(() => {
|
|
1698
|
-
const
|
|
1709
|
+
const interval = Math.round(1e3 / cfg.fps);
|
|
1710
|
+
const id = setInterval(() => setTime(Date.now() / 1e3), interval);
|
|
1699
1711
|
return () => clearInterval(id);
|
|
1700
|
-
}, []);
|
|
1712
|
+
}, [cfg.fps]);
|
|
1701
1713
|
const cells = useMemo(() => computeFrame(time, cfg), [time, cfg]);
|
|
1702
1714
|
const shortCwd = cwd ? cwd.replace(process.env.HOME || "", "~") : void 0;
|
|
1703
1715
|
const info = [
|
|
@@ -1850,7 +1862,7 @@ var App = ({ args }) => {
|
|
|
1850
1862
|
if (state === "paused") return "thinking";
|
|
1851
1863
|
return "active";
|
|
1852
1864
|
})();
|
|
1853
|
-
return /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column" },
|
|
1865
|
+
return /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column" }, /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column" }, /* @__PURE__ */ React9.createElement(Logo, { version: CLI_VERSION, model, cwd: process.cwd(), mood: logoMood }), phase === "input" && events.length === 0 && /* @__PURE__ */ React9.createElement(React9.Fragment, null, projectConfig.instructions && /* @__PURE__ */ React9.createElement(Box8, { marginTop: 1, marginLeft: 1 }, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, "\u25B8 loaded "), /* @__PURE__ */ React9.createElement(Text9, { color: "green" }, projectConfig.instructionsPath)), projectConfig.rules.length > 0 && /* @__PURE__ */ React9.createElement(Box8, { marginLeft: 1 }, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, "\u25B8 "), /* @__PURE__ */ React9.createElement(Text9, { color: "green" }, projectConfig.rules.length), /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " rule(s) from .agi/rules/")), projectConfig.commandFiles.length > 0 && /* @__PURE__ */ React9.createElement(Box8, { marginLeft: 1 }, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, "\u25B8 "), /* @__PURE__ */ React9.createElement(Text9, { color: "green" }, projectConfig.commandFiles.length), /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " custom command(s) from .agi/commands/")), projectConfig.skills.length > 0 && /* @__PURE__ */ React9.createElement(Box8, { marginLeft: 1 }, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, "\u25B8 "), /* @__PURE__ */ React9.createElement(Text9, { color: "green" }, projectConfig.skills.length), /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " skill(s) from .agi/skills/")))), phase === "executing" && /* @__PURE__ */ React9.createElement(StatusBar, { state, step, goal: currentGoal }), /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React9.createElement(EventDisplay, { events, maxEvents: compact ? 6 : 12 }), phase === "executing" && state === "running" && /* @__PURE__ */ React9.createElement(Box8, null, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " \u2503 "), /* @__PURE__ */ React9.createElement(Spinner, null)), phase === "executing" && state === "paused" && /* @__PURE__ */ React9.createElement(Box8, null, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " \u2503 "), /* @__PURE__ */ React9.createElement(Text9, { color: "yellow", bold: true }, "\u25AE\u25AE"), /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " paused \u2014 space to resume"))), pendingConfirm && /* @__PURE__ */ React9.createElement(Box8, { marginTop: 1 }, /* @__PURE__ */ React9.createElement(ConfirmDialog, { reason: pendingConfirm, onConfirm: respondConfirm })), pendingQuestion && /* @__PURE__ */ React9.createElement(Box8, { marginTop: 1 }, /* @__PURE__ */ React9.createElement(QuestionDialog, { question: pendingQuestion, onAnswer: respondAnswer })), commandMessage && phase === "input" && /* @__PURE__ */ React9.createElement(Box8, null, /* @__PURE__ */ React9.createElement(Text9, { color: "gray" }, commandMessage)), phase === "input" && /* @__PURE__ */ React9.createElement(Box8, { marginTop: 1 }, /* @__PURE__ */ React9.createElement(PromptInput, { onSubmit: handleSubmitGoal, goalHistory })), phase === "executing" && !isTerminal && !pendingConfirm && !pendingQuestion && /* @__PURE__ */ React9.createElement(Box8, { marginTop: 1 }, /* @__PURE__ */ React9.createElement(Text9, { dimColor: true }, " space pause \xB7 q stop \xB7 ^c quit")));
|
|
1854
1866
|
};
|
|
1855
1867
|
|
|
1856
1868
|
// src/index.tsx
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/cli.ts","../src/config.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/update.ts","../src/app/App.tsx","../src/hooks/useAgent.ts","../src/hooks/useKeybindings.ts","../src/components/StatusBar.tsx","../src/components/EventDisplay.tsx","../src/components/TypewriterText.tsx","../src/components/ConfirmDialog.tsx","../src/components/QuestionDialog.tsx","../src/components/PromptInput.tsx","../src/commands/slash.ts","../src/history.ts","../src/project.ts","../src/skills.ts","../src/userConfig.ts","../src/hooks.ts","../src/components/Spinner.tsx","../src/components/Logo.tsx"],"sourcesContent":["/**\n * AGI CLI - Terminal-based agent interaction for AGI desktop automation.\n *\n * Usage:\n * agi \"Open calculator and compute 2+2\"\n * agi \"Find flights from SFO to JFK\" --model claude-opus\n * agi \"Install Node.js\" --verbose\n * agi login\n * agi logout\n */\n\nimport React from 'react';\nimport { render } from 'ink';\nimport { isBinaryAvailable } from '@agi_inc/agi-js';\nimport { parseArgs } from './cli.js';\nimport { App } from './app/App.js';\nimport { loadApiKey } from './config.js';\n\nasync function main(): Promise<void> {\n try {\n const result = await parseArgs();\n\n // login/logout subcommands are self-contained\n if (result.kind === 'handled') {\n return;\n }\n\n const { args } = result;\n\n // Check for API key\n const apiKey = loadApiKey();\n if (!apiKey) {\n console.error('Error: No API key found');\n console.error('');\n console.error('Run `agi login` to authenticate, or set an environment variable:');\n console.error(' export AGI_API_KEY=your_key');\n console.error('');\n process.exit(1);\n }\n\n // Make the key available to downstream code via env\n if (!process.env.AGI_API_KEY && !process.env.ANTHROPIC_API_KEY) {\n process.env.AGI_API_KEY = apiKey;\n }\n\n // Check for driver binary\n if (!isBinaryAvailable()) {\n console.error('Error: AGI driver binary not found');\n console.error('');\n console.error('The driver binary is required for local agent execution.');\n console.error('It should be installed automatically with the agi package.');\n console.error('');\n console.error('Try reinstalling: npm install -g @agi_inc/cli');\n console.error('');\n process.exit(1);\n }\n\n // Render the app\n const { waitUntilExit } = render(<App args={args} />);\n await waitUntilExit();\n } catch (error) {\n console.error('Error:', error);\n process.exit(1);\n }\n}\n\nmain();\n","/**\n * CLI argument parsing and configuration.\n */\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { updateCommand } from './commands/update.js';\n\nexport interface CliArgs {\n goal: string | undefined;\n model: string;\n verbose: boolean;\n noConfirm: boolean;\n}\n\nexport type ParseResult =\n | { kind: 'run'; args: CliArgs }\n | { kind: 'handled' };\n\nexport async function parseArgs(): Promise<ParseResult> {\n const argv = await yargs(hideBin(process.argv))\n .scriptName('agi')\n .command('login', 'Authenticate and save your API key', {}, async () => {\n await loginCommand();\n })\n .command('logout', 'Remove saved credentials', {}, async () => {\n await logoutCommand();\n })\n .command('update', 'Update AGI CLI to the latest version', {}, async () => {\n await updateCommand();\n })\n .command(\n '$0 [goal]',\n 'Run an agent with the given goal',\n (yargs) => {\n return yargs.positional('goal', {\n describe: 'The task for the agent to accomplish',\n type: 'string',\n demandOption: false,\n });\n },\n )\n .option('model', {\n alias: 'm',\n describe: 'Model to use',\n type: 'string',\n default: 'claude-sonnet',\n choices: ['claude-sonnet', 'claude-opus'],\n })\n .option('verbose', {\n alias: 'v',\n describe: 'Show verbose output including agent thinking',\n type: 'boolean',\n default: false,\n })\n .option('no-confirm', {\n describe: 'Auto-approve all confirmation requests',\n type: 'boolean',\n default: false,\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'V')\n .example('$0 \"Open calculator and compute 2+2\"', 'Basic task')\n .example('$0 \"Find flights from SFO to JFK\" --model claude-opus', 'Use a specific model')\n .example('$0 \"Install Node.js\" --verbose', 'Verbose output')\n .example('$0', 'Start interactive mode')\n .example('$0 login', 'Authenticate with your API key')\n .example('$0 update', 'Update to the latest version')\n .parse();\n\n // If a subcommand (login/logout) was handled, yargs already ran its handler\n const command = argv._?.[0];\n if (command === 'login' || command === 'logout' || command === 'update') {\n return { kind: 'handled' };\n }\n\n return {\n kind: 'run',\n args: {\n goal: argv.goal as string | undefined,\n model: argv.model as string,\n verbose: argv.verbose as boolean,\n noConfirm: argv['no-confirm'] as boolean,\n },\n };\n}\n","/**\n * Credentials file management for AGI CLI.\n *\n * Checks AGI_API_KEY env -> ANTHROPIC_API_KEY env -> ~/.agi/credentials file.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\ninterface Credentials {\n api_key: string;\n}\n\nexport function getCredentialsPath(): string {\n return path.join(os.homedir(), '.agi', 'credentials');\n}\n\n/**\n * Load API key from environment variables or credentials file.\n * Priority: AGI_API_KEY env -> ANTHROPIC_API_KEY env -> ~/.agi/credentials\n */\nexport function loadApiKey(): string | undefined {\n if (process.env.AGI_API_KEY) {\n return process.env.AGI_API_KEY;\n }\n\n if (process.env.ANTHROPIC_API_KEY) {\n return process.env.ANTHROPIC_API_KEY;\n }\n\n const credPath = getCredentialsPath();\n try {\n const raw = fs.readFileSync(credPath, 'utf-8');\n const credentials: Credentials = JSON.parse(raw);\n if (credentials.api_key) {\n return credentials.api_key;\n }\n } catch {\n // File doesn't exist or is invalid\n }\n\n return undefined;\n}\n\n/**\n * Save API key to ~/.agi/credentials.\n * Creates the ~/.agi/ directory if it doesn't exist.\n */\nexport function saveApiKey(apiKey: string): void {\n const credPath = getCredentialsPath();\n const dir = path.dirname(credPath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n\n const credentials: Credentials = { api_key: apiKey };\n fs.writeFileSync(credPath, JSON.stringify(credentials, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\n/**\n * Delete the credentials file.\n */\nexport function deleteCredentials(): boolean {\n const credPath = getCredentialsPath();\n try {\n fs.unlinkSync(credPath);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * `agi login` command — device code auth flow.\n *\n * 1. POST /v1/auth/device -> get device_code + user_code\n * 2. Open browser to verification_url\n * 3. Poll POST /v1/auth/device/token every 5s\n * 4. On approval -> save API key to ~/.agi/credentials\n */\n\nimport { saveApiKey } from '../config.js';\n\nconst API_BASE = 'https://api.agi.tech';\n\ninterface DeviceAuthResponse {\n device_code: string;\n user_code: string;\n verification_url: string;\n expires_in: number;\n interval: number;\n}\n\ninterface DeviceAuthTokenResponse {\n api_key: string;\n email: string | null;\n}\n\nasync function openBrowser(url: string): Promise<void> {\n const open = (await import('open')).default;\n await open(url);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function loginCommand(): Promise<void> {\n // Step 1: Initiate device auth\n let deviceAuth: DeviceAuthResponse;\n try {\n const res = await fetch(`${API_BASE}/v1/auth/device`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!res.ok) {\n const detail = await res.text();\n console.error(`Failed to start login flow (${res.status}): ${detail}`);\n process.exit(1);\n }\n\n deviceAuth = (await res.json()) as DeviceAuthResponse;\n } catch (err) {\n console.error(`Failed to connect to AGI API: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // Step 2: Show code and open browser\n console.log('');\n console.log(`Your confirmation code: ${deviceAuth.user_code}`);\n console.log('');\n console.log('Opening browser to authorize...');\n console.log(` ${deviceAuth.verification_url}`);\n console.log('');\n\n try {\n await openBrowser(deviceAuth.verification_url);\n } catch {\n console.log('Could not open browser automatically. Please visit the URL above.');\n }\n\n console.log('Waiting for authorization...');\n\n // Handle Ctrl+C gracefully during polling\n const sigintHandler = () => {\n console.log('\\nLogin cancelled.');\n process.exit(130);\n };\n process.on('SIGINT', sigintHandler);\n\n // Step 3: Poll for token\n const maxAttempts = Math.ceil(deviceAuth.expires_in / deviceAuth.interval);\n const interval = deviceAuth.interval * 1000;\n let consecutiveErrors = 0;\n\n try {\n for (let i = 0; i < maxAttempts; i++) {\n await sleep(interval);\n\n try {\n const res = await fetch(`${API_BASE}/v1/auth/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ device_code: deviceAuth.device_code }),\n });\n\n consecutiveErrors = 0;\n\n if (res.status === 428) {\n // Still pending\n process.stdout.write('.');\n continue;\n }\n\n if (res.status === 410) {\n console.log('');\n console.error('Login expired. Please run `agi login` again.');\n process.exit(1);\n }\n\n if (res.ok) {\n const token = (await res.json()) as DeviceAuthTokenResponse;\n console.log('');\n\n saveApiKey(token.api_key);\n\n const identity = token.email || 'your account';\n console.log(`Logged in as ${identity}`);\n console.log('Your API key has been saved to ~/.agi/credentials');\n return;\n }\n\n // Unexpected status\n const detail = await res.text();\n console.log('');\n console.error(`Unexpected response (${res.status}): ${detail}`);\n process.exit(1);\n } catch {\n consecutiveErrors++;\n if (consecutiveErrors >= 3) {\n console.log('');\n console.error('Unable to reach AGI API. Check your internet connection.');\n console.error('Retrying...');\n consecutiveErrors = 0;\n } else {\n process.stdout.write('!');\n }\n }\n }\n\n console.log('');\n console.error('Login timed out. Please run `agi login` again.');\n process.exit(1);\n } finally {\n process.removeListener('SIGINT', sigintHandler);\n }\n}\n","/**\n * `agi logout` command — remove stored credentials.\n */\n\nimport { deleteCredentials } from '../config.js';\n\nexport async function logoutCommand(): Promise<void> {\n const deleted = deleteCredentials();\n\n if (deleted) {\n console.log('Logged out. Credentials removed from ~/.agi/credentials');\n } else {\n console.log('No credentials file found. Already logged out.');\n }\n}\n","/**\n * Self-update command for AGI CLI.\n *\n * Checks the npm registry for the latest version, detects install method\n * (npm or Homebrew), and runs the appropriate update command.\n */\n\nimport { execSync } from 'node:child_process';\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nfunction getCurrentVersion(): string {\n // Resolve symlinks (npm global bin is a symlink to the package)\n const realScript = realpathSync(process.argv[1]);\n const pkgPath = join(dirname(realScript), '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version;\n}\n\nasync function getLatestVersion(): Promise<string> {\n const res = await fetch('https://registry.npmjs.org/@agi_inc/cli');\n if (!res.ok) {\n throw new Error(`npm registry returned ${res.status}`);\n }\n const data = (await res.json()) as { 'dist-tags': { latest: string } };\n return data['dist-tags'].latest;\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n }\n return 0;\n}\n\nfunction detectInstallMethod(): 'npm' | 'homebrew' | 'unknown' {\n try {\n const agiPath = execSync('which agi', { encoding: 'utf-8' }).trim();\n if (agiPath.includes('homebrew') || agiPath.includes('Cellar')) {\n return 'homebrew';\n }\n return 'npm';\n } catch {\n return 'unknown';\n }\n}\n\nexport async function updateCommand(): Promise<void> {\n const current = getCurrentVersion();\n\n console.log('');\n console.log(` \\u25B8 AGI CLI v${current}`);\n console.log('');\n console.log(' Checking for updates...');\n\n try {\n const latest = await getLatestVersion();\n\n if (compareVersions(current, latest) >= 0) {\n console.log(` \\u25CF Up to date`);\n console.log('');\n return;\n }\n\n console.log(` Update available: ${current} \\u2192 ${latest}`);\n console.log('');\n\n const method = detectInstallMethod();\n\n if (method === 'homebrew') {\n console.log(' Updating via Homebrew...');\n console.log('');\n execSync('brew upgrade agi', { stdio: 'inherit' });\n } else {\n console.log(' Updating via npm...');\n console.log('');\n execSync('npm install -g @agi_inc/cli@latest', { stdio: 'inherit' });\n }\n\n console.log('');\n console.log(` \\u25CF Updated to v${latest}`);\n console.log('');\n } catch (error) {\n console.error('');\n console.error(` \\u2715 Update failed: ${error instanceof Error ? error.message : error}`);\n console.error('');\n console.error(' Try manually:');\n console.error(' npm install -g @agi_inc/cli@latest');\n console.error('');\n process.exit(1);\n }\n}\n","import React, { useEffect, useState, useCallback, useMemo, useRef } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport type { CliArgs } from '../cli.js';\nimport { useAgent } from '../hooks/useAgent.js';\nimport { useKeybindings } from '../hooks/useKeybindings.js';\nimport { StatusBar } from '../components/StatusBar.js';\nimport { EventDisplay } from '../components/EventDisplay.js';\nimport { ConfirmDialog } from '../components/ConfirmDialog.js';\nimport { QuestionDialog } from '../components/QuestionDialog.js';\nimport { PromptInput } from '../components/PromptInput.js';\nimport { Spinner } from '../components/Spinner.js';\nimport { Logo } from '../components/Logo.js';\nimport type { LogoMood } from '../components/Logo.js';\nimport { parseSlashCommand, loadUserCommands, loadSkillCommands, registerCommands } from '../commands/slash.js';\nimport type { CommandContext } from '../commands/slash.js';\nimport { loadProjectConfig, withProjectInstructions } from '../project.js';\nimport type { ProjectConfig } from '../project.js';\nimport { appendHistory } from '../history.js';\nimport type { HistoryEntry } from '../history.js';\nimport { loadUserConfig } from '../userConfig.js';\nimport { loadHooks, runHooks } from '../hooks.js';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json');\n\ninterface AppProps {\n args: CliArgs;\n}\n\ntype Phase = 'input' | 'executing';\n\nexport const App: React.FC<AppProps> = ({ args }) => {\n const { exit } = useApp();\n const [phase, setPhase] = useState<Phase>(args.goal ? 'executing' : 'input');\n const [currentGoal, setCurrentGoal] = useState(args.goal ?? '');\n\n // In-session goal history for up-arrow recall (most recent first)\n const [goalHistory, setGoalHistory] = useState<string[]>([]);\n\n // Load user config and hooks on mount\n const userConfig = useMemo(() => loadUserConfig(), []);\n useMemo(() => loadHooks(), []);\n\n // Fire SessionStart hooks\n useEffect(() => {\n runHooks('SessionStart');\n }, []);\n\n // Load project config, user commands, and skill commands on mount\n const projectConfig: ProjectConfig = useMemo(() => {\n const config = loadProjectConfig();\n const cmds = [];\n if (config.commandFiles.length > 0) {\n cmds.push(...loadUserCommands(config.commandFiles));\n }\n if (config.skills.length > 0) {\n cmds.push(...loadSkillCommands(config.skills));\n }\n if (cmds.length > 0) {\n registerCommands(cmds);\n }\n return config;\n }, []);\n\n // Mutable settings — CLI args override user config defaults\n const [model, setModel] = useState(args.model !== 'claude-sonnet' ? args.model : (userConfig.model ?? args.model));\n const [verbose, setVerbose] = useState(args.verbose || (userConfig.verbose ?? false));\n const [noConfirm, setNoConfirm] = useState(args.noConfirm || (userConfig.noConfirm ?? false));\n const [compact, setCompact] = useState(userConfig.compact ?? false);\n\n // Transient message shown after a slash command runs\n const [commandMessage, setCommandMessage] = useState<string | null>(null);\n\n // History tracking\n const taskStartTime = useRef<number | null>(null);\n\n const {\n state,\n step,\n events,\n pendingConfirm,\n pendingQuestion,\n start,\n stop,\n pause,\n resume,\n respondConfirm,\n respondAnswer,\n clearEvents,\n } = useAgent({\n model,\n verbose,\n noConfirm,\n onFinished: (result) => {\n // Record in history\n if (currentGoal) {\n const entry: HistoryEntry = {\n timestamp: new Date().toISOString(),\n goal: currentGoal,\n model,\n durationMs: taskStartTime.current\n ? Date.now() - taskStartTime.current\n : undefined,\n success: result?.success,\n };\n appendHistory(entry);\n taskStartTime.current = null;\n\n // Fire TaskComplete hooks\n runHooks('TaskComplete', {\n AGI_GOAL: currentGoal,\n AGI_SUCCESS: String(result?.success ?? ''),\n });\n }\n setPhase('input');\n },\n });\n\n // Start executing when phase transitions to 'executing' with a goal\n useEffect(() => {\n if (phase === 'executing' && currentGoal) {\n taskStartTime.current = Date.now();\n start(withProjectInstructions(currentGoal, projectConfig));\n }\n }, [phase, currentGoal, start, projectConfig]);\n\n const runGoal = useCallback((goal: string) => {\n setCommandMessage(null);\n setGoalHistory((prev) => [goal, ...prev.filter((g) => g !== goal)]);\n setCurrentGoal(goal);\n setPhase('executing');\n }, []);\n\n const commandContext: CommandContext = {\n model,\n verbose,\n noConfirm,\n compact,\n setModel,\n setVerbose,\n setNoConfirm,\n setCompact,\n clearEvents,\n quit: () => exit(),\n runGoal,\n projectConfig,\n version: CLI_VERSION,\n lastGoal: goalHistory[0],\n };\n\n const handleSubmitGoal = useCallback(\n (input: string) => {\n // Try slash command first\n const parsed = parseSlashCommand(input);\n if (parsed) {\n const result = parsed.command.execute(parsed.args, commandContext);\n setCommandMessage(result);\n // Auto-clear message after a short time\n if (result) {\n setTimeout(() => setCommandMessage(null), 4000);\n }\n return;\n }\n\n setCommandMessage(null);\n setGoalHistory((prev) => [input, ...prev.filter((g) => g !== input)]);\n setCurrentGoal(input);\n setPhase('executing');\n },\n [commandContext]\n );\n\n useKeybindings({\n onPause: pause,\n onResume: resume,\n onStop: async () => {\n if (phase === 'executing') {\n await stop();\n }\n exit();\n },\n isPaused: state === 'paused',\n disabled: phase === 'input' || !!pendingConfirm || !!pendingQuestion,\n });\n\n const isTerminal = state === 'finished' || state === 'stopped' || state === 'error';\n\n // Derive logo mood from agent state\n const logoMood: LogoMood = (() => {\n if (phase === 'input') return 'idle';\n if (state === 'error') return 'error';\n if (state === 'finished') return 'success';\n if (state === 'paused') return 'thinking';\n return 'active';\n })();\n\n return (\n <Box flexDirection=\"column\">\n {/* Header: show logo when in input phase with no events */}\n {phase === 'input' && events.length === 0 && (\n <Box flexDirection=\"column\">\n <Logo version={CLI_VERSION} model={model} cwd={process.cwd()} mood={logoMood} />\n {projectConfig.instructions && (\n <Box marginTop={1} marginLeft={1}>\n <Text dimColor>{'\\u25B8 loaded '}</Text>\n <Text color=\"green\">{projectConfig.instructionsPath}</Text>\n </Box>\n )}\n {projectConfig.rules.length > 0 && (\n <Box marginLeft={1}>\n <Text dimColor>{'\\u25B8 '}</Text>\n <Text color=\"green\">{projectConfig.rules.length}</Text>\n <Text dimColor>{' rule(s) from .agi/rules/'}</Text>\n </Box>\n )}\n {projectConfig.commandFiles.length > 0 && (\n <Box marginLeft={1}>\n <Text dimColor>{'\\u25B8 '}</Text>\n <Text color=\"green\">{projectConfig.commandFiles.length}</Text>\n <Text dimColor>{' custom command(s) from .agi/commands/'}</Text>\n </Box>\n )}\n {projectConfig.skills.length > 0 && (\n <Box marginLeft={1}>\n <Text dimColor>{'\\u25B8 '}</Text>\n <Text color=\"green\">{projectConfig.skills.length}</Text>\n <Text dimColor>{' skill(s) from .agi/skills/'}</Text>\n </Box>\n )}\n </Box>\n )}\n\n {/* Status bar during execution */}\n {phase === 'executing' && (\n <StatusBar state={state} step={step} goal={currentGoal} />\n )}\n\n {/* Activity log */}\n <Box flexDirection=\"column\" marginTop={1}>\n <EventDisplay events={events} maxEvents={compact ? 6 : 12} />\n\n {phase === 'executing' && state === 'running' && (\n <Box>\n <Text dimColor>{' \\u2503 '}</Text>\n <Spinner />\n </Box>\n )}\n\n {phase === 'executing' && state === 'paused' && (\n <Box>\n <Text dimColor>{' \\u2503 '}</Text>\n <Text color=\"yellow\" bold>{'\\u25AE\\u25AE'}</Text>\n <Text dimColor>{' paused \\u2014 space to resume'}</Text>\n </Box>\n )}\n </Box>\n\n {pendingConfirm && (\n <Box marginTop={1}>\n <ConfirmDialog reason={pendingConfirm} onConfirm={respondConfirm} />\n </Box>\n )}\n\n {pendingQuestion && (\n <Box marginTop={1}>\n <QuestionDialog question={pendingQuestion} onAnswer={respondAnswer} />\n </Box>\n )}\n\n {/* Command feedback message */}\n {commandMessage && phase === 'input' && (\n <Box>\n <Text color=\"gray\">{commandMessage}</Text>\n </Box>\n )}\n\n {/* Prompt input when in input phase */}\n {phase === 'input' && (\n <Box marginTop={1}>\n <PromptInput onSubmit={handleSubmitGoal} goalHistory={goalHistory} />\n </Box>\n )}\n\n {/* Help bar: only during execution, not in terminal states or dialogs */}\n {phase === 'executing' && !isTerminal && !pendingConfirm && !pendingQuestion && (\n <Box marginTop={1}>\n <Text dimColor>{' space pause \\u00B7 q stop \\u00B7 ^c quit'}</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { AgentDriver } from '@agi_inc/agi-js';\nimport type { DriverState, DriverAction, DriverResult } from '@agi_inc/agi-js';\nimport type { EventItem } from '../components/EventDisplay.js';\n\ninterface UseAgentOptions {\n model: string;\n agentName?: string;\n apiUrl?: string;\n verbose: boolean;\n noConfirm: boolean;\n onFinished?: (result: DriverResult) => void;\n}\n\ninterface UseAgentReturn {\n state: DriverState;\n step: number;\n events: EventItem[];\n pendingConfirm: string | null;\n pendingQuestion: string | null;\n start: (goal: string) => Promise<void>;\n stop: () => Promise<void>;\n pause: () => void;\n resume: () => void;\n respondConfirm: (approved: boolean) => void;\n respondAnswer: (answer: string) => void;\n clearEvents: () => void;\n}\n\nexport function useAgent(options: UseAgentOptions): UseAgentReturn {\n const { model, agentName, apiUrl, verbose, noConfirm, onFinished } = options;\n\n const [state, setState] = useState<DriverState>('idle');\n const [step, setStep] = useState(0);\n const [events, setEvents] = useState<EventItem[]>([]);\n const [pendingConfirm, setPendingConfirm] = useState<string | null>(null);\n const [pendingQuestion, setPendingQuestion] = useState<string | null>(null);\n\n const driverRef = useRef<AgentDriver | null>(null);\n const onFinishedRef = useRef(onFinished);\n\n // Keep the ref up to date so start() never captures a stale callback\n useEffect(() => {\n onFinishedRef.current = onFinished;\n }, [onFinished]);\n\n const addEvent = useCallback((event: EventItem) => {\n setEvents((prev) => [...prev, event]);\n }, []);\n\n const start = useCallback(\n async (goal: string) => {\n // Stop previous driver if one exists\n if (driverRef.current) {\n try {\n await driverRef.current.stop('New task started');\n } catch {\n // Ignore errors from stopping previous driver\n }\n driverRef.current = null;\n }\n\n // Reset per-task state but keep events\n setState('idle');\n setStep(0);\n setPendingConfirm(null);\n setPendingQuestion(null);\n\n // Insert separator if there are already events from a previous task\n setEvents((prev) => {\n if (prev.length > 0) {\n return [...prev, { type: 'separator', goal }];\n }\n return prev;\n });\n\n const driver = new AgentDriver({ model, mode: 'local', agentName, apiUrl });\n driverRef.current = driver;\n\n // Set up event handlers\n driver.on('state_change', (newState: DriverState) => {\n setState(newState);\n });\n\n driver.on('thinking', (text: string) => {\n if (verbose) {\n addEvent({ type: 'thinking', text });\n }\n });\n\n driver.on('action', async (action: DriverAction) => {\n const actionStr = action.type + (action.x !== undefined ? ` (${action.x}, ${action.y})` : '');\n const parts: string[] = [];\n if (action.text) parts.push(`\"${action.text}\"`);\n if (action.key) parts.push(`[${action.key}]`);\n addEvent({ type: 'action', action: actionStr, params: parts.length ? parts.join(' ') : undefined });\n // In local mode, the driver binary executes actions and captures screenshots\n });\n\n driver.on('confirm', async (reason: string) => {\n if (noConfirm) {\n driver.respondConfirm(true);\n return true;\n }\n addEvent({ type: 'confirm', reason });\n setPendingConfirm(reason);\n return true;\n });\n\n driver.on('ask_question', async (question: string) => {\n addEvent({ type: 'question', question });\n setPendingQuestion(question);\n return '';\n });\n\n driver.on('finished', (evt) => {\n addEvent({\n type: 'finished',\n summary: evt.summary,\n success: evt.success,\n });\n });\n\n driver.on('error', (evt) => {\n addEvent({ type: 'error', message: evt.message });\n });\n\n // Start the agent in local mode — no screenshot needed, driver handles it\n try {\n const result = await driver.start(goal);\n\n if (onFinishedRef.current) {\n onFinishedRef.current(result);\n }\n } catch (error) {\n addEvent({ type: 'error', message: String(error) });\n }\n },\n [model, agentName, apiUrl, verbose, noConfirm, addEvent]\n );\n\n const stop = useCallback(async () => {\n if (driverRef.current) {\n await driverRef.current.stop('User cancelled');\n }\n }, []);\n\n const pause = useCallback(() => {\n if (driverRef.current) {\n driverRef.current.pause();\n }\n }, []);\n\n const resume = useCallback(() => {\n if (driverRef.current) {\n driverRef.current.resume();\n }\n }, []);\n\n const respondConfirm = useCallback((approved: boolean) => {\n if (driverRef.current && pendingConfirm) {\n driverRef.current.respondConfirm(approved);\n setPendingConfirm(null);\n }\n }, [pendingConfirm]);\n\n const respondAnswer = useCallback((answer: string) => {\n if (driverRef.current && pendingQuestion) {\n driverRef.current.respondAnswer(answer);\n setPendingQuestion(null);\n }\n }, [pendingQuestion]);\n\n const clearEvents = useCallback(() => {\n setEvents([]);\n }, []);\n\n // Update step from driver\n useEffect(() => {\n const interval = setInterval(() => {\n if (driverRef.current) {\n setStep(driverRef.current.currentStep);\n }\n }, 100);\n return () => clearInterval(interval);\n }, []);\n\n return {\n state,\n step,\n events,\n pendingConfirm,\n pendingQuestion,\n start,\n stop,\n pause,\n resume,\n respondConfirm,\n respondAnswer,\n clearEvents,\n };\n}\n","import { useInput } from 'ink';\nimport { useCallback } from 'react';\n\ninterface UseKeybindingsOptions {\n onPause?: () => void;\n onResume?: () => void;\n onStop?: () => void;\n isPaused?: boolean;\n disabled?: boolean;\n}\n\n/**\n * Hook for handling keyboard shortcuts.\n *\n * - Space: Pause/Resume\n * - Q/Ctrl+C: Stop\n * - Escape: Stop\n */\nexport function useKeybindings(options: UseKeybindingsOptions): void {\n const { onPause, onResume, onStop, isPaused = false, disabled = false } = options;\n\n const handleInput = useCallback(\n (input: string, key: { ctrl: boolean; escape: boolean }) => {\n if (disabled) return;\n\n // Space: Toggle pause/resume\n if (input === ' ') {\n if (isPaused) {\n onResume?.();\n } else {\n onPause?.();\n }\n }\n\n // Q or Ctrl+C: Stop\n if (input === 'q' || input === 'Q' || (key.ctrl && input === 'c')) {\n onStop?.();\n }\n\n // Escape: Stop\n if (key.escape) {\n onStop?.();\n }\n },\n [disabled, isPaused, onPause, onResume, onStop]\n );\n\n useInput(handleInput);\n}\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport type { DriverState } from '@agi_inc/agi-js';\n\ninterface StatusBarProps {\n state: DriverState;\n step: number;\n goal: string;\n}\n\nconst stateColors: Record<DriverState, string> = {\n idle: 'gray',\n running: 'green',\n paused: 'yellow',\n waiting_confirmation: 'yellow',\n waiting_answer: 'yellow',\n finished: 'green',\n stopped: 'gray',\n error: 'red',\n};\n\nconst stateLabels: Record<DriverState, string> = {\n idle: 'IDLE',\n running: 'ACTIVE',\n paused: 'PAUSED',\n waiting_confirmation: 'AWAITING',\n waiting_answer: 'AWAITING',\n finished: 'COMPLETE',\n stopped: 'STOPPED',\n error: 'ERROR',\n};\n\nconst stateIndicators: Record<DriverState, string> = {\n idle: '○',\n running: '●',\n paused: '◉',\n waiting_confirmation: '◎',\n waiting_answer: '◎',\n finished: '●',\n stopped: '○',\n error: '●',\n};\n\nexport const StatusBar: React.FC<StatusBarProps> = ({ state, step, goal }) => {\n const color = stateColors[state] || 'white';\n const label = stateLabels[state] || state.toUpperCase();\n const indicator = stateIndicators[state] || '○';\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor=\"gray\" paddingX={1}>\n <Box>\n <Text color=\"cyan\" bold>{'▸ AGI'}</Text>\n <Text>{' '}</Text>\n <Text color={color}>{indicator} </Text>\n <Text color={color} bold>{label}</Text>\n <Box flexGrow={1} />\n <Text dimColor>STEP </Text>\n <Text bold>{String(step).padStart(2, '0')}</Text>\n </Box>\n <Box>\n <Text dimColor>{goal.length > 72 ? goal.slice(0, 72) + '\\u2026' : goal}</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport { TypewriterText } from './TypewriterText.js';\n\nexport type EventItem =\n | { type: 'thinking'; text: string }\n | { type: 'action'; action: string; params?: string }\n | { type: 'confirm'; reason: string }\n | { type: 'question'; question: string }\n | { type: 'finished'; summary: string; success: boolean }\n | { type: 'error'; message: string }\n | { type: 'separator'; goal: string };\n\ninterface EventDisplayProps {\n events: EventItem[];\n maxEvents?: number;\n}\n\nconst typeConfig: Record<string, { prefix: string; color: string }> = {\n thinking: { prefix: '\\u00B7', color: 'gray' },\n action: { prefix: '\\u25B8', color: 'white' },\n confirm: { prefix: '\\u25C6', color: 'yellow' },\n question: { prefix: '\\u25C7', color: 'cyan' },\n error: { prefix: '\\u2715', color: 'red' },\n};\n\nfunction getEventText(event: EventItem): string {\n switch (event.type) {\n case 'thinking':\n return event.text;\n case 'action':\n return event.action;\n case 'confirm':\n return event.reason;\n case 'question':\n return event.question;\n case 'finished':\n return event.summary;\n case 'error':\n return event.message;\n case 'separator':\n return event.goal;\n }\n}\n\nfunction getEventStyle(event: EventItem): { prefix: string; color: string } {\n if (event.type === 'finished') {\n return event.success\n ? { prefix: '\\u25CF', color: 'green' }\n : { prefix: '\\u2715', color: 'red' };\n }\n return typeConfig[event.type];\n}\n\n/** Event types that get the typewriter animation when they are the latest event */\nfunction shouldAnimate(event: EventItem): boolean {\n if (event.type === 'finished' && event.success) return true;\n if (event.type === 'action') return true;\n if (event.type === 'error') return true;\n return false;\n}\n\nexport const EventDisplay: React.FC<EventDisplayProps> = ({ events, maxEvents = 12 }) => {\n const displayEvents = events.slice(-maxEvents);\n\n if (displayEvents.length === 0) return null;\n\n return (\n <Box flexDirection=\"column\">\n {displayEvents.map((event, index) => {\n if (event.type === 'separator') {\n return (\n <Box key={index} marginTop={1}>\n <Text dimColor>{' \\u2500\\u2500 '}</Text>\n <Text bold>{event.goal}</Text>\n <Text dimColor>{' \\u2500\\u2500'}</Text>\n </Box>\n );\n }\n\n const style = getEventStyle(event);\n const text = getEventText(event);\n const isLatest = index === displayEvents.length - 1;\n const animate = isLatest && shouldAnimate(event);\n\n return (\n <Box key={index}>\n <Text dimColor>{' \\u2503 '}</Text>\n <Text color={style.color}>{style.prefix} </Text>\n {animate ? (\n <TypewriterText\n text={text}\n color={style.color === 'white' ? undefined : style.color}\n bold={isLatest && event.type === 'action'}\n speed={event.type === 'finished' ? 8 : 12}\n />\n ) : (\n <Text\n color={style.color === 'white' ? undefined : style.color}\n bold={isLatest && event.type === 'action'}\n dimColor={event.type === 'thinking'}\n >\n {text}\n </Text>\n )}\n {event.type === 'action' && event.params && (\n <Text color=\"gray\">{' '}{event.params}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Text } from 'ink';\n\ninterface TypewriterTextProps {\n text: string;\n /** Milliseconds per character (default: 12) */\n speed?: number;\n color?: string;\n bold?: boolean;\n dimColor?: boolean;\n /** Called when the animation finishes */\n onComplete?: () => void;\n}\n\nexport const TypewriterText: React.FC<TypewriterTextProps> = ({\n text,\n speed = 12,\n color,\n bold,\n dimColor,\n onComplete,\n}) => {\n const [visibleLength, setVisibleLength] = useState(0);\n\n useEffect(() => {\n setVisibleLength(0);\n }, [text]);\n\n useEffect(() => {\n if (visibleLength >= text.length) {\n onComplete?.();\n return;\n }\n\n const timer = setTimeout(() => {\n // Advance by 1-3 chars for a slightly irregular, computery feel\n const jump = text.length > 60 ? 3 : text.length > 30 ? 2 : 1;\n setVisibleLength((prev) => Math.min(prev + jump, text.length));\n }, speed);\n\n return () => clearTimeout(timer);\n }, [visibleLength, text, speed, onComplete]);\n\n const displayed = text.slice(0, visibleLength);\n\n return (\n <Text color={color} bold={bold} dimColor={dimColor}>\n {displayed}\n {visibleLength < text.length ? '\\u2588' : ''}\n </Text>\n );\n};\n","import React, { useState } from 'react';\nimport { Text, Box, useInput } from 'ink';\n\ninterface ConfirmDialogProps {\n reason: string;\n onConfirm: (approved: boolean) => void;\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({ reason, onConfirm }) => {\n const [selected, setSelected] = useState<'yes' | 'no'>('yes');\n\n useInput((input, key) => {\n if (key.leftArrow || input === 'h') {\n setSelected('yes');\n } else if (key.rightArrow || input === 'l') {\n setSelected('no');\n } else if (key.return) {\n onConfirm(selected === 'yes');\n } else if (input === 'y' || input === 'Y') {\n onConfirm(true);\n } else if (input === 'n' || input === 'N') {\n onConfirm(false);\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor=\"yellow\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"yellow\" bold>CONFIRM</Text>\n </Box>\n <Box marginBottom={1}>\n <Text>{reason}</Text>\n </Box>\n <Box>\n <Box marginRight={2}>\n <Text\n backgroundColor={selected === 'yes' ? 'green' : undefined}\n color={selected === 'yes' ? 'black' : 'gray'}\n bold={selected === 'yes'}\n >\n {' [Y] approve '}\n </Text>\n </Box>\n <Text\n backgroundColor={selected === 'no' ? 'red' : undefined}\n color={selected === 'no' ? 'black' : 'gray'}\n bold={selected === 'no'}\n >\n {' [N] deny '}\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Y/N or arrows + enter</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface QuestionDialogProps {\n question: string;\n onAnswer: (answer: string) => void;\n}\n\nexport const QuestionDialog: React.FC<QuestionDialogProps> = ({ question, onAnswer }) => {\n const [answer, setAnswer] = useState('');\n\n const handleSubmit = () => {\n if (answer.trim()) {\n onAnswer(answer.trim());\n }\n };\n\n useInput((_, key) => {\n if (key.return && answer.trim()) {\n handleSubmit();\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor=\"cyan\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"cyan\" bold>INPUT REQUIRED</Text>\n </Box>\n <Box marginBottom={1}>\n <Text>{question}</Text>\n </Box>\n <Box>\n <Text color=\"cyan\">{'\\u25B8 '}</Text>\n <TextInput\n value={answer}\n onChange={setAnswer}\n onSubmit={handleSubmit}\n placeholder=\"Type your answer...\"\n />\n </Box>\n <Box marginTop={1}>\n <Text dimColor>enter to submit</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { getAllCommands } from '../commands/slash.js';\n\ninterface PromptInputProps {\n onSubmit: (goal: string) => void;\n /** Past goals for up-arrow recall */\n goalHistory?: string[];\n}\n\nexport const PromptInput: React.FC<PromptInputProps> = ({ onSubmit, goalHistory = [] }) => {\n const [value, setValue] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(-1);\n // Increment to force TextInput remount (resets internal cursor to end)\n const [inputKey, setInputKey] = useState(0);\n // Index into goalHistory for up-arrow recall (-1 = current input)\n const [historyIndex, setHistoryIndex] = useState(-1);\n const savedInput = useRef('');\n\n // Show matching commands as the user types a slash prefix\n const showSuggestions = value.startsWith('/') && value.length > 0 && !value.includes(' ');\n const suggestions = showSuggestions\n ? getAllCommands().filter((cmd) => {\n const typed = value.slice(1).toLowerCase();\n if (!typed) return true;\n return (\n cmd.name.startsWith(typed) ||\n cmd.aliases?.some((a) => a.startsWith(typed))\n );\n })\n : [];\n\n // Reset selection when suggestions change\n useEffect(() => {\n setSelectedIndex(suggestions.length > 0 ? 0 : -1);\n }, [value]);\n\n // Queue a value to set after a TextInput remount\n const pendingValue = useRef<string | null>(null);\n\n useEffect(() => {\n if (pendingValue.current !== null) {\n setValue(pendingValue.current);\n pendingValue.current = null;\n }\n }, [inputKey]);\n\n const completeSelected = () => {\n if (selectedIndex >= 0 && selectedIndex < suggestions.length) {\n const cmd = suggestions[selectedIndex];\n const completed = '/' + cmd.name + (cmd.usage ? ' ' : '');\n // Force remount TextInput so cursor moves to end of new value\n pendingValue.current = completed;\n setInputKey((k) => k + 1);\n }\n };\n\n // Handle arrow keys and tab for suggestion navigation + goal history recall\n useInput((input, key) => {\n // Slash command suggestions take priority\n if (showSuggestions && suggestions.length > 0) {\n if (key.downArrow) {\n setSelectedIndex((prev) =>\n prev < suggestions.length - 1 ? prev + 1 : 0\n );\n return;\n }\n if (key.upArrow) {\n setSelectedIndex((prev) =>\n prev > 0 ? prev - 1 : suggestions.length - 1\n );\n return;\n }\n if (key.tab) {\n completeSelected();\n return;\n }\n return;\n }\n\n // Up-arrow goal history recall (only when not showing suggestions)\n if (key.upArrow && goalHistory.length > 0) {\n if (historyIndex === -1) {\n savedInput.current = value;\n }\n const next = Math.min(historyIndex + 1, goalHistory.length - 1);\n setHistoryIndex(next);\n pendingValue.current = goalHistory[next];\n setInputKey((k) => k + 1);\n return;\n }\n\n if (key.downArrow && historyIndex >= 0) {\n const next = historyIndex - 1;\n setHistoryIndex(next);\n pendingValue.current = next === -1 ? savedInput.current : goalHistory[next];\n setInputKey((k) => k + 1);\n return;\n }\n });\n\n const handleSubmit = () => {\n // If suggestions are shown and one is selected, complete it first\n if (showSuggestions && selectedIndex >= 0 && selectedIndex < suggestions.length) {\n const cmd = suggestions[selectedIndex];\n const completed = '/' + cmd.name;\n if (value !== completed && value !== completed + ' ') {\n completeSelected();\n return;\n }\n }\n\n const trimmed = value.trim();\n if (trimmed) {\n onSubmit(trimmed);\n // Force remount to reset cursor\n pendingValue.current = '';\n setInputKey((k) => k + 1);\n setSelectedIndex(-1);\n setHistoryIndex(-1);\n savedInput.current = '';\n }\n };\n\n const visibleSuggestions = suggestions.slice(0, 6);\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\" bold>{'\\u25B8 '}</Text>\n <TextInput\n key={inputKey}\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"Enter a task or /help for commands...\"\n />\n </Box>\n {visibleSuggestions.length > 0 && showSuggestions && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {visibleSuggestions.map((cmd, idx) => {\n const isSelected = idx === selectedIndex;\n return (\n <Box key={cmd.name}>\n <Text color={isSelected ? 'cyan' : 'gray'}>\n {isSelected ? ' \\u25B8 ' : ' '}\n </Text>\n <Text color={isSelected ? 'cyan' : 'white'} bold={isSelected}>\n /{cmd.name}\n </Text>\n {cmd.usage && (\n <Text color={isSelected ? 'cyan' : 'gray'} dimColor={!isSelected}>\n {' '}{cmd.usage}\n </Text>\n )}\n <Text dimColor>{' \\u2014 '}{cmd.description}</Text>\n </Box>\n );\n })}\n <Box marginTop={0}>\n <Text dimColor>{' \\u2191\\u2193 navigate \\u21B9 complete \\u21B5 run'}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Slash command system for the interactive REPL.\n *\n * Supports built-in commands, user-defined commands from .agi/commands/*.md,\n * and skill-based commands from .agi/skills/.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport os from 'node:os';\nimport { isBinaryAvailable } from '@agi_inc/agi-js';\nimport { loadHistory, formatHistory, clearHistory } from '../history.js';\nimport { initProject } from '../project.js';\nimport type { ProjectConfig } from '../project.js';\nimport { formatSkillsList, loadSkill } from '../skills.js';\nimport type { SkillMetadata } from '../skills.js';\nimport { setConfigValue, formatConfig, loadUserConfig } from '../userConfig.js';\nimport { formatHooks } from '../hooks.js';\n\nexport interface SlashCommand {\n name: string;\n aliases?: string[];\n description: string;\n usage?: string;\n /** Whether this is a user-defined command (from .agi/commands/) */\n isUserDefined?: boolean;\n /** Whether this is a skill-based command */\n isSkill?: boolean;\n /** For user-defined commands: the prompt template */\n prompt?: string;\n /** Execute the command. Returns a message to display, or null for silent commands. */\n execute: (args: string, context: CommandContext) => string | null;\n}\n\nexport interface CommandContext {\n model: string;\n verbose: boolean;\n noConfirm: boolean;\n compact: boolean;\n setModel: (model: string) => void;\n setVerbose: (verbose: boolean) => void;\n setNoConfirm: (noConfirm: boolean) => void;\n setCompact: (compact: boolean) => void;\n clearEvents: () => void;\n quit: () => void;\n /** Run a goal (for user-defined commands that produce agent tasks) */\n runGoal?: (goal: string) => void;\n /** Project config for status display */\n projectConfig?: ProjectConfig;\n /** CLI version string */\n version?: string;\n /** Last completed goal (for /redo) */\n lastGoal?: string;\n}\n\nconst VALID_MODELS = ['claude-sonnet', 'claude-opus'];\n\n/** Built-in commands */\nconst builtinCommands: SlashCommand[] = [\n {\n name: 'help',\n aliases: ['h', '?'],\n description: 'Show available commands',\n execute: () => {\n const all = getAllCommands();\n const lines = [\n '',\n ' Available commands:',\n '',\n ];\n\n const builtins = all.filter((c) => !c.isUserDefined && !c.isSkill);\n const userDefined = all.filter((c) => c.isUserDefined);\n const skills = all.filter((c) => c.isSkill);\n\n for (const cmd of builtins) {\n const aliases = cmd.aliases?.length ? ` (${cmd.aliases.map(a => '/' + a).join(', ')})` : '';\n const usage = cmd.usage ? ` ${cmd.usage}` : '';\n lines.push(` /${cmd.name}${usage}${aliases}`);\n lines.push(` ${cmd.description}`);\n }\n\n if (userDefined.length > 0) {\n lines.push('');\n lines.push(' Custom commands (.agi/commands/):');\n lines.push('');\n for (const cmd of userDefined) {\n const usage = cmd.usage ? ` ${cmd.usage}` : '';\n lines.push(` /${cmd.name}${usage}`);\n lines.push(` ${cmd.description}`);\n }\n }\n\n if (skills.length > 0) {\n lines.push('');\n lines.push(' Skills (.agi/skills/):');\n lines.push('');\n for (const cmd of skills) {\n const usage = cmd.usage ? ` ${cmd.usage}` : '';\n lines.push(` /${cmd.name}${usage}`);\n lines.push(` ${cmd.description}`);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n },\n },\n {\n name: 'history',\n aliases: ['hist'],\n description: 'Show session history',\n usage: '[clear]',\n execute: (args) => {\n if (args.trim().toLowerCase() === 'clear') {\n clearHistory();\n return ' History cleared.';\n }\n const entries = loadHistory();\n return formatHistory(entries);\n },\n },\n {\n name: 'status',\n aliases: ['info'],\n description: 'Show environment and session info',\n execute: (_args, ctx) => {\n const lines: string[] = ['', ' Environment:', ''];\n\n lines.push(` Version ${ctx.version || 'unknown'}`);\n lines.push(` Model ${ctx.model}`);\n lines.push(` Working dir ${process.cwd().replace(os.homedir(), '~')}`);\n lines.push(` Node.js ${process.version}`);\n lines.push(` Platform ${process.platform} ${process.arch}`);\n lines.push(` Driver ${isBinaryAvailable() ? '\\u2714 available' : '\\u2718 not found'}`);\n lines.push(` API key ${process.env.AGI_API_KEY ? '\\u2714 set' : process.env.ANTHROPIC_API_KEY ? '\\u2714 set (ANTHROPIC_API_KEY)' : '\\u2718 not set'}`);\n\n lines.push('');\n lines.push(' Session:');\n lines.push('');\n lines.push(` Verbose ${ctx.verbose ? 'on' : 'off'}`);\n lines.push(` Auto-confirm ${ctx.noConfirm ? 'on' : 'off'}`);\n lines.push(` Compact mode ${ctx.compact ? 'on' : 'off'}`);\n\n if (ctx.projectConfig) {\n lines.push('');\n lines.push(' Project:');\n lines.push('');\n lines.push(` Instructions ${ctx.projectConfig.instructionsPath?.replace(process.cwd(), '.') || 'none'}`);\n lines.push(` Rules ${ctx.projectConfig.rules.length} loaded`);\n lines.push(` Commands ${ctx.projectConfig.commandFiles.length} custom`);\n lines.push(` Skills ${ctx.projectConfig.skills.length} discovered`);\n }\n\n const history = loadHistory();\n lines.push('');\n lines.push(` History ${history.length} past sessions`);\n lines.push('');\n\n return lines.join('\\n');\n },\n },\n {\n name: 'model',\n aliases: ['m'],\n description: 'Show or change the current model',\n usage: '[claude-sonnet|claude-opus]',\n execute: (args, ctx) => {\n if (!args) {\n return ` Current model: ${ctx.model}`;\n }\n const model = args.trim().toLowerCase();\n if (!VALID_MODELS.includes(model)) {\n return ` Unknown model \"${model}\". Available: ${VALID_MODELS.join(', ')}`;\n }\n ctx.setModel(model);\n return ` Model set to ${model}`;\n },\n },\n {\n name: 'verbose',\n aliases: ['v'],\n description: 'Toggle verbose output (show agent thinking)',\n execute: (_args, ctx) => {\n ctx.setVerbose(!ctx.verbose);\n return ` Verbose output ${!ctx.verbose ? 'on' : 'off'}`;\n },\n },\n {\n name: 'compact',\n description: 'Toggle compact output mode',\n execute: (_args, ctx) => {\n ctx.setCompact(!ctx.compact);\n return ` Compact mode ${!ctx.compact ? 'on' : 'off'}`;\n },\n },\n {\n name: 'confirm',\n description: 'Toggle auto-confirm mode',\n execute: (_args, ctx) => {\n ctx.setNoConfirm(!ctx.noConfirm);\n return ` Auto-confirm ${!ctx.noConfirm ? 'on' : 'off'}`;\n },\n },\n {\n name: 'init',\n description: 'Initialize AGI.md and .agi/ project structure',\n execute: () => {\n const created = initProject();\n if (created.length === 0) {\n return ' Project already initialized — AGI.md and .agi/ exist.';\n }\n const lines = ['', ' Initialized project:', ''];\n for (const item of created) {\n lines.push(` \\u2714 Created ${item}`);\n }\n lines.push('');\n lines.push(' Edit AGI.md to add project instructions for the agent.');\n lines.push(' Add custom commands in .agi/commands/*.md');\n lines.push(' Add rules in .agi/rules/*.md');\n lines.push(' Add skills in .agi/skills/<name>/SKILL.md');\n lines.push('');\n return lines.join('\\n');\n },\n },\n {\n name: 'doctor',\n aliases: ['check'],\n description: 'Check system health and configuration',\n execute: (_args, ctx) => {\n const checks: Array<{ label: string; ok: boolean; detail: string }> = [];\n\n // API key\n const hasKey = !!(process.env.AGI_API_KEY || process.env.ANTHROPIC_API_KEY);\n checks.push({\n label: 'API key',\n ok: hasKey,\n detail: hasKey ? 'configured' : 'missing — run `agi login` or set AGI_API_KEY',\n });\n\n // Driver binary\n const hasDriver = isBinaryAvailable();\n checks.push({\n label: 'Driver binary',\n ok: hasDriver,\n detail: hasDriver ? 'found' : 'not found — reinstall @agi_inc/cli',\n });\n\n // Node.js version\n const nodeVer = process.versions.node;\n const [major] = nodeVer.split('.').map(Number);\n checks.push({\n label: 'Node.js',\n ok: major >= 18,\n detail: `v${nodeVer}${major < 18 ? ' — v18+ required' : ''}`,\n });\n\n // Project config\n if (ctx.projectConfig) {\n checks.push({\n label: 'Project instructions',\n ok: !!ctx.projectConfig.instructions,\n detail: ctx.projectConfig.instructionsPath?.replace(process.cwd(), '.') || 'none — run /init',\n });\n }\n\n const lines = ['', ' System health:', ''];\n for (const check of checks) {\n const icon = check.ok ? '\\u2714' : '\\u2718';\n const color = check.ok ? '' : ''; // Colors handled by Ink, here just text\n lines.push(` ${icon} ${check.label.padEnd(22)} ${check.detail}`);\n }\n\n const allOk = checks.every((c) => c.ok);\n lines.push('');\n lines.push(allOk ? ' All checks passed.' : ' Some checks failed — see above.');\n lines.push('');\n\n return lines.join('\\n');\n },\n },\n {\n name: 'skills',\n description: 'List discovered skills',\n execute: (_args, ctx) => {\n if (!ctx.projectConfig) return ' No project config loaded.';\n return formatSkillsList(ctx.projectConfig.skills);\n },\n },\n {\n name: 'config',\n aliases: ['cfg'],\n description: 'Show or set persistent config',\n usage: '[key] [value]',\n execute: (args) => {\n const parts = args.trim().split(/\\s+/);\n if (!args.trim()) {\n const config = loadUserConfig();\n return formatConfig(config);\n }\n if (parts.length === 1) {\n const config = loadUserConfig();\n const val = (config as Record<string, unknown>)[parts[0]];\n if (val === undefined) return ` ${parts[0]} is not set`;\n return ` ${parts[0]} = ${String(val)}`;\n }\n return setConfigValue(parts[0], parts.slice(1).join(' '));\n },\n },\n {\n name: 'redo',\n aliases: ['r'],\n description: 'Re-run the last goal',\n execute: (_args, ctx) => {\n if (!ctx.lastGoal) return ' No previous goal to re-run.';\n if (!ctx.runGoal) return ' Error: cannot run goals in this context';\n ctx.runGoal(ctx.lastGoal);\n return null;\n },\n },\n {\n name: 'hooks',\n description: 'Show configured hooks',\n execute: () => {\n return formatHooks();\n },\n },\n {\n name: 'bug',\n description: 'Report a bug or issue',\n execute: () => {\n return [\n '',\n ' Report issues at:',\n ' https://github.com/agi-inc/cli/issues',\n '',\n ' Include: agi version, OS, Node.js version, and steps to reproduce.',\n ' Run /doctor to check your environment.',\n '',\n ].join('\\n');\n },\n },\n {\n name: 'clear',\n aliases: ['c'],\n description: 'Clear the event log',\n execute: (_args, ctx) => {\n ctx.clearEvents();\n return null;\n },\n },\n {\n name: 'quit',\n aliases: ['q', 'exit'],\n description: 'Exit agi',\n execute: (_args, ctx) => {\n ctx.quit();\n return null;\n },\n },\n];\n\n/** Parse simple YAML frontmatter from a markdown file */\nfunction parseFrontmatter(content: string): { meta: Record<string, string>; body: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) return { meta: {}, body: content.trim() };\n\n const meta: Record<string, string> = {};\n for (const line of match[1].split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n meta[key] = value;\n }\n }\n\n return { meta, body: match[2].trim() };\n}\n\n/** Load user-defined commands from .agi/commands/*.md files */\nexport function loadUserCommands(commandFiles: string[]): SlashCommand[] {\n const userCommands: SlashCommand[] = [];\n\n for (const filePath of commandFiles) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const { meta, body } = parseFrontmatter(content);\n const name = basename(filePath, '.md');\n const description = meta['description'] || body.split('\\n')[0].slice(0, 60);\n const usage = meta['argument-hint'];\n\n userCommands.push({\n name,\n description,\n usage,\n isUserDefined: true,\n prompt: body,\n execute: (args, ctx) => {\n if (!ctx.runGoal) return ` Error: cannot run custom commands in this context`;\n // Substitute $ARGUMENTS and $1, $2, etc.\n let prompt = body;\n prompt = prompt.replace(/\\$ARGUMENTS/g, args);\n const argParts = args.split(/\\s+/).filter(Boolean);\n for (let i = 0; i < argParts.length; i++) {\n prompt = prompt.replace(new RegExp(`\\\\$${i + 1}`, 'g'), argParts[i]);\n }\n ctx.runGoal(prompt);\n return null;\n },\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return userCommands;\n}\n\n/** Create slash commands from discovered skills */\nexport function loadSkillCommands(skills: SkillMetadata[]): SlashCommand[] {\n return skills\n .filter((s) => s.userInvocable)\n .map((skill) => ({\n name: skill.name,\n description: skill.description,\n usage: skill.argumentHint,\n isSkill: true,\n execute: (args: string, ctx: CommandContext) => {\n if (!ctx.runGoal) return ` Error: cannot run skill commands in this context`;\n // Load full skill body (tier 2)\n const loaded = loadSkill(skill);\n let prompt = loaded.body;\n // Substitute arguments\n prompt = prompt.replace(/\\$ARGUMENTS/g, args);\n const argParts = args.split(/\\s+/).filter(Boolean);\n for (let i = 0; i < argParts.length; i++) {\n prompt = prompt.replace(new RegExp(`\\\\$${i + 1}`, 'g'), argParts[i]);\n }\n ctx.runGoal(prompt);\n return null;\n },\n }));\n}\n\n/** Mutable registry that includes built-in, user-defined, and skill commands */\nlet allCommands: SlashCommand[] = [...builtinCommands];\nlet commandMap = new Map<string, SlashCommand>();\n\nfunction rebuildMap(): void {\n commandMap = new Map();\n for (const cmd of allCommands) {\n commandMap.set(cmd.name, cmd);\n if (cmd.aliases) {\n for (const alias of cmd.aliases) {\n commandMap.set(alias, cmd);\n }\n }\n }\n}\n\n// Initialize with builtins\nrebuildMap();\n\n/** Register additional commands (called during app init with user commands + skills) */\nexport function registerCommands(cmds: SlashCommand[]): void {\n allCommands = [...builtinCommands, ...cmds];\n rebuildMap();\n}\n\nexport interface ParsedCommand {\n command: SlashCommand;\n args: string;\n}\n\n/**\n * Attempt to parse a user input string as a slash command.\n * Returns the command and arguments if it matches, or null if not a command.\n */\nexport function parseSlashCommand(input: string): ParsedCommand | null {\n if (!input.startsWith('/')) return null;\n\n const trimmed = input.slice(1);\n const spaceIdx = trimmed.indexOf(' ');\n const name = spaceIdx === -1 ? trimmed.toLowerCase() : trimmed.slice(0, spaceIdx).toLowerCase();\n const args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1).trim();\n\n const cmd = commandMap.get(name);\n if (!cmd) return null;\n\n return { command: cmd, args };\n}\n\n/** Get all commands for autocomplete/display purposes */\nexport function getAllCommands(): SlashCommand[] {\n return allCommands;\n}\n","/**\n * Persistent session history.\n *\n * Stores past goals/tasks in ~/.agi/history.json so users can recall\n * previous sessions with /history.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface HistoryEntry {\n timestamp: string;\n goal: string;\n model: string;\n durationMs?: number;\n success?: boolean;\n}\n\nconst HISTORY_DIR = path.join(os.homedir(), '.agi');\nconst HISTORY_FILE = path.join(HISTORY_DIR, 'history.json');\nconst MAX_ENTRIES = 200;\n\nfunction ensureDir(): void {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function loadHistory(): HistoryEntry[] {\n try {\n const raw = fs.readFileSync(HISTORY_FILE, 'utf-8');\n const data = JSON.parse(raw);\n if (Array.isArray(data)) return data;\n } catch {\n // File missing or corrupt\n }\n return [];\n}\n\nexport function appendHistory(entry: HistoryEntry): void {\n ensureDir();\n const history = loadHistory();\n history.push(entry);\n // Keep only the latest entries\n const trimmed = history.slice(-MAX_ENTRIES);\n fs.writeFileSync(HISTORY_FILE, JSON.stringify(trimmed, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\nexport function clearHistory(): void {\n try {\n fs.unlinkSync(HISTORY_FILE);\n } catch {\n // Already gone\n }\n}\n\n/** Format history entries for display */\nexport function formatHistory(entries: HistoryEntry[], limit = 20): string {\n if (entries.length === 0) return ' No history yet.';\n\n const recent = entries.slice(-limit).reverse();\n const lines: string[] = ['', ' Recent sessions:', ''];\n\n for (const entry of recent) {\n const date = new Date(entry.timestamp);\n const timeStr = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n }) + ' ' + date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n\n const status = entry.success === true\n ? '\\u25CF' // ●\n : entry.success === false\n ? '\\u2715' // ✕\n : '\\u25CB'; // ○\n\n const duration = entry.durationMs\n ? ` (${Math.round(entry.durationMs / 1000)}s)`\n : '';\n\n const goal = entry.goal.length > 55\n ? entry.goal.slice(0, 55) + '\\u2026'\n : entry.goal;\n\n lines.push(` ${status} ${timeStr} ${goal}${duration}`);\n }\n\n lines.push('');\n if (entries.length > limit) {\n lines.push(` Showing ${limit} of ${entries.length} entries`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Project instructions and configuration loader.\n *\n * Follows the agentskills.io convention: looks for AGI.md and .agi/\n * directory in the current working directory to load project-specific\n * instructions for the agent.\n *\n * Search order for instructions:\n * 1. AGI.md in cwd\n * 2. .agi/AGI.md\n * 3. .agi/instructions.md\n *\n * Additionally loads:\n * - .agi/rules/*.md — modular topic-specific project rules\n * - .agi/commands/*.md — user-defined slash commands\n * - .agi/skills/ — agentskills.io skill directories\n */\n\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { SkillMetadata } from './skills.js';\nimport { discoverSkills, generateSkillsPrompt } from './skills.js';\n\nexport interface ProjectConfig {\n /** Project instructions to prepend to the agent goal */\n instructions: string | null;\n /** Path where instructions were found */\n instructionsPath: string | null;\n /** Root of the .agi directory, if it exists */\n agiDir: string | null;\n /** User-defined command files found in .agi/commands/ */\n commandFiles: string[];\n /** Loaded rule files from .agi/rules/ */\n rules: RuleFile[];\n /** Discovered skills (metadata only — tier 1) */\n skills: SkillMetadata[];\n}\n\nexport interface RuleFile {\n /** Name derived from filename */\n name: string;\n /** Full path to the rule file */\n path: string;\n /** Content of the rule */\n content: string;\n /** Optional glob patterns — rule only applies to matching paths */\n paths?: string[];\n}\n\nconst INSTRUCTION_FILES = ['AGI.md', '.agi/AGI.md', '.agi/instructions.md'];\n\n// ── Rule file loader ───────────────────────────────────────────────\n\nfunction loadRules(cwd: string): RuleFile[] {\n const rulesDir = join(cwd, '.agi', 'rules');\n if (!existsSync(rulesDir)) return [];\n\n const rules: RuleFile[] = [];\n\n try {\n const files = readdirSync(rulesDir).filter((f) => f.endsWith('.md')).sort();\n\n for (const file of files) {\n const filePath = join(rulesDir, file);\n try {\n const raw = readFileSync(filePath, 'utf-8');\n const name = basename(file, '.md');\n\n // Check for optional frontmatter with paths filter\n let content = raw.trim();\n let paths: string[] | undefined;\n\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (fmMatch) {\n const meta = fmMatch[1];\n content = fmMatch[2].trim();\n\n // Parse paths from frontmatter\n const pathsMatch = meta.match(/^paths:\\s*(.+)$/m);\n if (pathsMatch) {\n paths = pathsMatch[1]\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n }\n }\n\n if (content) {\n rules.push({ name, path: filePath, content, paths });\n }\n } catch {\n // Skip unreadable files\n }\n }\n } catch {\n // Skip unreadable directories\n }\n\n return rules;\n}\n\n// ── Main loader ────────────────────────────────────────────────────\n\n/**\n * Load project configuration from the current working directory.\n */\nexport function loadProjectConfig(cwd: string = process.cwd()): ProjectConfig {\n let instructions: string | null = null;\n let instructionsPath: string | null = null;\n\n // Find the first instruction file that exists\n for (const relPath of INSTRUCTION_FILES) {\n const fullPath = join(cwd, relPath);\n if (existsSync(fullPath)) {\n try {\n instructions = readFileSync(fullPath, 'utf-8').trim();\n instructionsPath = fullPath;\n break;\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // Check for .agi directory\n const agiDir = join(cwd, '.agi');\n const agiDirExists = existsSync(agiDir);\n\n // Scan for command files\n const commandFiles: string[] = [];\n const commandsDir = join(cwd, '.agi', 'commands');\n if (existsSync(commandsDir)) {\n try {\n const files = readdirSync(commandsDir);\n for (const file of files) {\n if (file.endsWith('.md')) {\n commandFiles.push(join(commandsDir, file));\n }\n }\n } catch {\n // Skip unreadable directories\n }\n }\n\n // Load rules\n const rules = loadRules(cwd);\n\n // Discover skills (tier 1 — metadata only)\n const skills = discoverSkills(cwd);\n\n return {\n instructions,\n instructionsPath,\n agiDir: agiDirExists ? agiDir : null,\n commandFiles,\n rules,\n skills,\n };\n}\n\n// ── Prompt generation ──────────────────────────────────────────────\n\n/**\n * Format project instructions as a prefix for the agent goal.\n * Includes: AGI.md instructions, rules, and skill metadata.\n */\nexport function withProjectInstructions(goal: string, config: ProjectConfig): string {\n const sections: string[] = [];\n\n // Main instructions\n if (config.instructions) {\n sections.push(\n '--- Project Instructions (from ' + (config.instructionsPath ?? 'AGI.md') + ') ---',\n config.instructions,\n '--- End Project Instructions ---',\n );\n }\n\n // Rules\n if (config.rules.length > 0) {\n sections.push('--- Project Rules ---');\n for (const rule of config.rules) {\n sections.push(`[${rule.name}]`);\n sections.push(rule.content);\n sections.push('');\n }\n sections.push('--- End Project Rules ---');\n }\n\n // Skills metadata (tier 1)\n if (config.skills.length > 0) {\n sections.push(generateSkillsPrompt(config.skills));\n }\n\n if (sections.length === 0) return goal;\n\n sections.push('', 'Task: ' + goal);\n return sections.join('\\n');\n}\n\n// ── Project initialization ─────────────────────────────────────────\n\nimport { mkdirSync, writeFileSync } from 'node:fs';\n\n/**\n * Initialize a .agi/ project structure in the given directory.\n * Creates AGI.md and .agi/ subdirectories if they don't exist.\n */\nexport function initProject(cwd: string = process.cwd()): string[] {\n const created: string[] = [];\n\n // Create AGI.md if it doesn't exist\n const agiMd = join(cwd, 'AGI.md');\n if (!existsSync(agiMd)) {\n writeFileSync(\n agiMd,\n [\n '# Project Instructions',\n '',\n '<!-- Add project-specific instructions for the AGI agent here. -->',\n '<!-- These instructions are loaded automatically when you run `agi`. -->',\n '',\n ].join('\\n'),\n );\n created.push('AGI.md');\n }\n\n // Create .agi/ directories\n const dirs = [\n '.agi',\n '.agi/commands',\n '.agi/rules',\n '.agi/skills',\n ];\n\n for (const dir of dirs) {\n const fullPath = join(cwd, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(dir + '/');\n }\n }\n\n // Create .gitignore in .agi/ if it doesn't exist\n const gitignore = join(cwd, '.agi', '.gitignore');\n if (!existsSync(gitignore)) {\n writeFileSync(\n gitignore,\n [\n '# Local files that should not be committed',\n 'local.md',\n '',\n ].join('\\n'),\n );\n created.push('.agi/.gitignore');\n }\n\n return created;\n}\n","/**\n * Agent Skills (agentskills.io) implementation.\n *\n * Discovers, parses, and manages SKILL.md files following the\n * agentskills.io specification. Supports progressive disclosure:\n *\n * 1. Metadata (~100 tokens) — name + description loaded at startup\n * 2. Instructions (<5000 tokens) — full SKILL.md body on activation\n * 3. Resources (on demand) — scripts/, references/, assets/\n *\n * Skill locations (priority order):\n * - ~/.agi/skills/<name>/SKILL.md (personal / user-level)\n * - .agi/skills/<name>/SKILL.md (project-level)\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface SkillMetadata {\n /** Skill name (must match directory name, lowercase + hyphens) */\n name: string;\n /** Short description of what the skill does */\n description: string;\n /** Path to the SKILL.md file */\n path: string;\n /** Root directory of the skill */\n root: string;\n /** Whether this is a user-level (personal) or project-level skill */\n scope: 'personal' | 'project';\n /** Optional license */\n license?: string;\n /** Optional compatibility requirements */\n compatibility?: string;\n /** Whether the skill can be invoked as /name */\n userInvocable: boolean;\n /** Argument hint for autocomplete */\n argumentHint?: string;\n /** Arbitrary metadata from frontmatter */\n metadata?: Record<string, string>;\n}\n\nexport interface LoadedSkill extends SkillMetadata {\n /** Full body content of SKILL.md (loaded on activation) */\n body: string;\n}\n\n// ── Frontmatter parser ─────────────────────────────────────────────\n\ninterface Frontmatter {\n meta: Record<string, string>;\n body: string;\n}\n\nfunction parseFrontmatter(content: string): Frontmatter {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) return { meta: {}, body: content.trim() };\n\n const meta: Record<string, string> = {};\n for (const line of match[1].split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n meta[key] = value;\n }\n }\n\n return { meta, body: match[2].trim() };\n}\n\n// ── Validation ─────────────────────────────────────────────────────\n\nconst NAME_RE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n\nfunction isValidSkillName(name: string): boolean {\n if (name.length > 64) return false;\n if (!NAME_RE.test(name)) return false;\n if (name.includes('--')) return false;\n return true;\n}\n\n// ── Discovery ──────────────────────────────────────────────────────\n\nfunction discoverSkillsInDir(\n skillsDir: string,\n scope: 'personal' | 'project',\n): SkillMetadata[] {\n const skills: SkillMetadata[] = [];\n\n if (!fs.existsSync(skillsDir)) return skills;\n\n let entries: string[];\n try {\n entries = fs.readdirSync(skillsDir);\n } catch {\n return skills;\n }\n\n for (const entry of entries) {\n const skillDir = path.join(skillsDir, entry);\n const skillFile = path.join(skillDir, 'SKILL.md');\n\n // Must be a directory containing SKILL.md\n try {\n if (!fs.statSync(skillDir).isDirectory()) continue;\n if (!fs.existsSync(skillFile)) continue;\n } catch {\n continue;\n }\n\n // Validate directory name\n if (!isValidSkillName(entry)) continue;\n\n // Parse metadata (tier 1 — only frontmatter)\n try {\n const content = fs.readFileSync(skillFile, 'utf-8');\n const { meta } = parseFrontmatter(content);\n\n // Name in frontmatter must match directory name (if specified)\n const name = meta['name'] || entry;\n if (name !== entry) continue;\n\n const description = meta['description'] || '';\n if (!description) continue; // Description is required\n\n skills.push({\n name,\n description,\n path: skillFile,\n root: skillDir,\n scope,\n license: meta['license'],\n compatibility: meta['compatibility'],\n userInvocable: meta['user-invocable'] !== 'false',\n argumentHint: meta['argument-hint'],\n metadata: Object.keys(meta).length > 0 ? meta : undefined,\n });\n } catch {\n // Skip unreadable skills\n }\n }\n\n return skills;\n}\n\n/**\n * Discover all available skills from personal and project locations.\n * Project skills override personal skills with the same name.\n */\nexport function discoverSkills(cwd: string = process.cwd()): SkillMetadata[] {\n const personalDir = path.join(os.homedir(), '.agi', 'skills');\n const projectDir = path.join(cwd, '.agi', 'skills');\n\n const personal = discoverSkillsInDir(personalDir, 'personal');\n const project = discoverSkillsInDir(projectDir, 'project');\n\n // Project skills override personal skills with the same name\n const byName = new Map<string, SkillMetadata>();\n for (const skill of personal) byName.set(skill.name, skill);\n for (const skill of project) byName.set(skill.name, skill);\n\n return Array.from(byName.values());\n}\n\n// ── Loading (tier 2) ───────────────────────────────────────────────\n\n/**\n * Load the full body of a skill (tier 2 — instructions).\n */\nexport function loadSkill(skill: SkillMetadata): LoadedSkill {\n const content = fs.readFileSync(skill.path, 'utf-8');\n const { body } = parseFrontmatter(content);\n return { ...skill, body };\n}\n\n// ── Prompt generation ──────────────────────────────────────────────\n\n/**\n * Generate the available_skills context block for the agent system prompt.\n * This is the tier-1 metadata (~100 tokens per skill).\n */\nexport function generateSkillsPrompt(skills: SkillMetadata[]): string {\n if (skills.length === 0) return '';\n\n const lines = ['<available_skills>'];\n for (const skill of skills) {\n lines.push(' <skill>');\n lines.push(` <name>${skill.name}</name>`);\n lines.push(` <description>${skill.description}</description>`);\n lines.push(` <location>${skill.path}</location>`);\n lines.push(' </skill>');\n }\n lines.push('</available_skills>');\n return lines.join('\\n');\n}\n\n/**\n * Generate a display-friendly list of skills.\n */\nexport function formatSkillsList(skills: SkillMetadata[]): string {\n if (skills.length === 0) return ' No skills found.';\n\n const lines: string[] = ['', ' Available skills:', ''];\n\n for (const skill of skills) {\n const scope = skill.scope === 'personal' ? '~' : '.';\n const hint = skill.argumentHint ? ` ${skill.argumentHint}` : '';\n lines.push(` ${scope} /${skill.name}${hint}`);\n lines.push(` ${skill.description}`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\n// ── Resource listing (tier 3) ──────────────────────────────────────\n\nexport interface SkillResource {\n type: 'script' | 'reference' | 'asset';\n name: string;\n path: string;\n}\n\n/**\n * List resources available in a skill directory.\n */\nexport function listSkillResources(skill: SkillMetadata): SkillResource[] {\n const resources: SkillResource[] = [];\n\n const dirs: Array<{ dir: string; type: SkillResource['type'] }> = [\n { dir: 'scripts', type: 'script' },\n { dir: 'references', type: 'reference' },\n { dir: 'assets', type: 'asset' },\n ];\n\n for (const { dir, type } of dirs) {\n const fullDir = path.join(skill.root, dir);\n if (!fs.existsSync(fullDir)) continue;\n\n try {\n const files = fs.readdirSync(fullDir);\n for (const file of files) {\n resources.push({\n type,\n name: file,\n path: path.join(fullDir, file),\n });\n }\n } catch {\n // Skip unreadable directories\n }\n }\n\n return resources;\n}\n","/**\n * Persistent user configuration.\n *\n * Stored in ~/.agi/config.json — survives across sessions.\n * Provides defaults that can be overridden by CLI args or /config command.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface UserConfig {\n /** Default model */\n model?: string;\n /** Default verbose mode */\n verbose?: boolean;\n /** Default auto-confirm */\n noConfirm?: boolean;\n /** Default compact mode */\n compact?: boolean;\n /** Custom theme/mood for the logo */\n theme?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.agi');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n\nconst VALID_KEYS: Array<keyof UserConfig> = [\n 'model',\n 'verbose',\n 'noConfirm',\n 'compact',\n 'theme',\n];\n\nfunction ensureDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function loadUserConfig(): UserConfig {\n try {\n const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nexport function saveUserConfig(config: UserConfig): void {\n ensureDir();\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\nexport function setConfigValue(key: string, value: string): string {\n if (!VALID_KEYS.includes(key as keyof UserConfig)) {\n return ` Unknown key \"${key}\". Valid keys: ${VALID_KEYS.join(', ')}`;\n }\n\n const config = loadUserConfig();\n\n // Parse value based on key type\n if (key === 'verbose' || key === 'noConfirm' || key === 'compact') {\n const bool = value.toLowerCase();\n if (bool !== 'true' && bool !== 'false' && bool !== 'on' && bool !== 'off') {\n return ` \"${key}\" must be true/false or on/off`;\n }\n (config as Record<string, unknown>)[key] = bool === 'true' || bool === 'on';\n } else {\n (config as Record<string, unknown>)[key] = value;\n }\n\n saveUserConfig(config);\n return ` Config: ${key} = ${value} (saved to ~/.agi/config.json)`;\n}\n\nexport function formatConfig(config: UserConfig): string {\n const lines: string[] = ['', ' User configuration (~/.agi/config.json):', ''];\n\n if (Object.keys(config).length === 0) {\n lines.push(' (no custom configuration — using defaults)');\n } else {\n for (const [key, value] of Object.entries(config)) {\n lines.push(` ${key.padEnd(14)} ${String(value)}`);\n }\n }\n\n lines.push('');\n lines.push(' Set with: /config <key> <value>');\n lines.push(` Keys: ${VALID_KEYS.join(', ')}`);\n lines.push('');\n return lines.join('\\n');\n}\n","/**\n * Hook system for agi-cli.\n *\n * Hooks allow running scripts at specific lifecycle events:\n * - SessionStart — when the CLI starts\n * - PreAction — before the agent executes a desktop action\n * - PostAction — after an action completes\n * - TaskComplete — when a goal finishes (success or failure)\n *\n * Hooks are defined in .agi/hooks.json:\n * {\n * \"hooks\": {\n * \"SessionStart\": [\n * { \"command\": \"echo 'session started'\" }\n * ],\n * \"TaskComplete\": [\n * { \"command\": \"notify-send 'AGI' 'Task completed'\" }\n * ]\n * }\n * }\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport type HookEvent = 'SessionStart' | 'PreAction' | 'PostAction' | 'TaskComplete';\n\ninterface HookEntry {\n command: string;\n}\n\ninterface HooksConfig {\n hooks: Partial<Record<HookEvent, HookEntry[]>>;\n}\n\nlet loadedHooks: HooksConfig | null = null;\n\n/**\n * Load hooks from .agi/hooks.json in the given directory.\n */\nexport function loadHooks(cwd: string = process.cwd()): HooksConfig {\n if (loadedHooks) return loadedHooks;\n\n const hooksFile = path.join(cwd, '.agi', 'hooks.json');\n try {\n const raw = fs.readFileSync(hooksFile, 'utf-8');\n loadedHooks = JSON.parse(raw);\n return loadedHooks!;\n } catch {\n loadedHooks = { hooks: {} };\n return loadedHooks;\n }\n}\n\n/**\n * Execute all hooks registered for the given event.\n * Hooks run synchronously and silently — errors are swallowed.\n */\nexport function runHooks(\n event: HookEvent,\n env: Record<string, string> = {},\n): void {\n const config = loadedHooks || loadHooks();\n const entries = config.hooks[event];\n if (!entries || entries.length === 0) return;\n\n for (const entry of entries) {\n try {\n execSync(entry.command, {\n stdio: 'ignore',\n timeout: 5000,\n env: { ...process.env, ...env, AGI_HOOK_EVENT: event },\n });\n } catch {\n // Hooks should not block the CLI — silently continue\n }\n }\n}\n\n/**\n * Format hooks config for display.\n */\nexport function formatHooks(): string {\n const config = loadedHooks || loadHooks();\n const events = Object.keys(config.hooks) as HookEvent[];\n\n if (events.length === 0) {\n return ' No hooks configured. Add hooks in .agi/hooks.json';\n }\n\n const lines: string[] = ['', ' Configured hooks:', ''];\n for (const event of events) {\n const entries = config.hooks[event] || [];\n lines.push(` ${event} (${entries.length} hook${entries.length !== 1 ? 's' : ''}):`);\n for (const entry of entries) {\n lines.push(` \\u25B8 ${entry.command}`);\n }\n }\n lines.push('');\n return lines.join('\\n');\n}\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport InkSpinner from 'ink-spinner';\n\ninterface SpinnerProps {\n text?: string;\n}\n\nexport const Spinner: React.FC<SpinnerProps> = ({ text }) => {\n return (\n <Box>\n <Text color=\"cyan\">\n <InkSpinner type=\"dots\" />\n </Text>\n {text && <Text dimColor> {text}</Text>}\n </Box>\n );\n};\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Text, Box } from 'ink';\n\n// ── Block character set (CP437 style) ──────────────────────────────\nconst BLOCK_CHARS = ' \\u2591\\u2592\\u2593\\u2588'; // ' ░▒▓█'\n\n// ── Base logo shape ────────────────────────────────────────────────\n// Generated from the_agi_company_logo.jpg with CP437 ramp\n// 24 chars wide × 5 lines – trimmed bounding box of the infinity symbol\nconst BASE_LOGO = [\n ' \\u2588\\u2588\\u2588\\u2588\\u2591 \\u2588\\u2588\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2592 \\u2588\\u2588\\u2588 \\u2591\\u2588\\u2588 \\u2588\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2588 \\u2591\\u2588\\u2588\\u2588 \\u2588\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2588 \\u2588\\u2588 \\u2588\\u2588\\u2588 \\u2592\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2588\\u2588 \\u2591\\u2588\\u2588\\u2588\\u2588 ',\n];\n\n// Parse base into intensity grid (0–4) and active mask\nconst BASE_GRID: number[][] = BASE_LOGO.map((line) =>\n [...line].map((ch) => {\n const idx = BLOCK_CHARS.indexOf(ch);\n return idx >= 0 ? idx : 0;\n }),\n);\nconst MASK: boolean[][] = BASE_GRID.map((row) => row.map((v) => v > 0));\nconst WIDTH = BASE_GRID[0].length;\n\n// ── Mood / affective state system ──────────────────────────────────\nexport type LogoMood = 'idle' | 'thinking' | 'active' | 'success' | 'error';\n\ninterface MoodConfig {\n /** Primary wave speed (cycles per second) */\n speed: number;\n /** Intensity variation from wave */\n amplitude: number;\n /** High-frequency shimmer amount */\n shimmer: number;\n /** Global breathing amplitude */\n breathe: number;\n /** Breathing speed (cycles per second) */\n breatheSpeed: number;\n /** Color gradient from dim (index 0) to bright (index 4) */\n colors: string[];\n}\n\nconst MOODS: Record<LogoMood, MoodConfig> = {\n idle: {\n speed: 0.3,\n amplitude: 1.2,\n shimmer: 0.3,\n breathe: 0.5,\n breatheSpeed: 0.15,\n colors: ['#005566', '#008899', '#00aacc', '#00ccee', '#66eeff'],\n },\n thinking: {\n speed: 1.5,\n amplitude: 1.8,\n shimmer: 0.6,\n breathe: 0.3,\n breatheSpeed: 0.4,\n colors: ['#665500', '#998800', '#ccaa00', '#eedd00', '#ffff44'],\n },\n active: {\n speed: 0.8,\n amplitude: 1.0,\n shimmer: 0.2,\n breathe: 0.4,\n breatheSpeed: 0.25,\n colors: ['#004400', '#007700', '#00aa00', '#00dd00', '#44ff66'],\n },\n success: {\n speed: 0.2,\n amplitude: 0.6,\n shimmer: 0.1,\n breathe: 0.6,\n breatheSpeed: 0.1,\n colors: ['#005500', '#008800', '#00bb00', '#00ee00', '#66ff88'],\n },\n error: {\n speed: 2.5,\n amplitude: 2.0,\n shimmer: 0.8,\n breathe: 0.2,\n breatheSpeed: 0.6,\n colors: ['#660000', '#990000', '#cc0000', '#ff2200', '#ff6644'],\n },\n};\n\n// ── Animation math ─────────────────────────────────────────────────\n\ninterface AnimatedCell {\n char: string;\n color: string;\n}\n\nfunction computeFrame(time: number, cfg: MoodConfig): AnimatedCell[][] {\n // Global breathing oscillation\n const breathe =\n Math.sin(time * cfg.breatheSpeed * Math.PI * 2) * cfg.breathe;\n\n return BASE_GRID.map((row, r) =>\n row.map((base, c) => {\n if (!MASK[r][c]) return { char: ' ', color: '' };\n\n // Horizontal flow wave with slight diagonal skew\n const phase = (c / WIDTH + r * 0.08) - time * cfg.speed;\n const wave = Math.sin(phase * Math.PI * 2) * cfg.amplitude;\n\n // High-frequency shimmer\n const shimmer =\n Math.sin(c * 7.3 + r * 13.1 + time * 5.7) * cfg.shimmer;\n\n // Combine and clamp to 1–4 (never go below ░ for active cells)\n const raw = base + wave + shimmer + breathe;\n const intensity = Math.max(1, Math.min(4, Math.round(raw)));\n\n return {\n char: BLOCK_CHARS[intensity],\n color: cfg.colors[intensity],\n };\n }),\n );\n}\n\n// ── Component ──────────────────────────────────────────────────────\n\ninterface LogoProps {\n version: string;\n model: string;\n cwd?: string;\n mood?: LogoMood;\n}\n\nexport const Logo: React.FC<LogoProps> = ({\n version,\n model,\n cwd,\n mood = 'idle',\n}) => {\n const [time, setTime] = useState(() => Date.now() / 1000);\n const cfg = MOODS[mood];\n\n // ~15 fps animation loop\n useEffect(() => {\n const id = setInterval(() => setTime(Date.now() / 1000), 67);\n return () => clearInterval(id);\n }, []);\n\n const cells = useMemo(() => computeFrame(time, cfg), [time, cfg]);\n\n const shortCwd = cwd\n ? cwd.replace(process.env.HOME || '', '~')\n : undefined;\n\n // Info lines aligned to logo rows (5 rows)\n const info: Array<React.ReactNode | null> = [\n null, // top padding row\n <><Text color=\"cyan\" bold>AGI</Text><Text dimColor>{' v'}{version}</Text></>,\n <Text>{model}</Text>,\n shortCwd ? <Text dimColor>{shortCwd}</Text> : null,\n null, // bottom padding row\n ];\n\n return (\n <Box flexDirection=\"column\">\n {cells.map((row, r) => (\n <Box key={r}>\n <Text>\n {row.map((cell, c) =>\n cell.char === ' ' ? (\n <Text key={c}>{' '}</Text>\n ) : (\n <Text key={c} color={cell.color}>\n {cell.char}\n </Text>\n ),\n )}\n </Text>\n {info[r] != null && (\n <>\n <Text>{' '}</Text>\n {info[r]}\n </>\n )}\n </Box>\n ))}\n </Box>\n );\n};\n"],"mappings":"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","names":["React","isBinaryAvailable","yargs","React","useEffect","useState","useCallback","useMemo","useRef","Box","Text","useCallback","React","Text","Box","React","useState","useEffect","Text","React","Box","Text","React","useState","Text","Box","useInput","React","useState","Text","Box","useInput","React","useState","useEffect","useRef","Text","Box","useInput","TextInput","readFileSync","basename","os","fs","path","os","readFileSync","join","fs","path","os","join","readFileSync","fs","path","os","ensureDir","fs","path","execSync","os","parseFrontmatter","readFileSync","basename","useState","useRef","useEffect","useInput","React","Box","Text","TextInput","React","Text","Box","React","useState","useEffect","Text","Box","require","useState","useMemo","useEffect","useRef","useCallback","React","Box","Text","isBinaryAvailable","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/cli.ts","../src/config.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/update.ts","../src/app/App.tsx","../src/hooks/useAgent.ts","../src/hooks/useKeybindings.ts","../src/components/StatusBar.tsx","../src/components/EventDisplay.tsx","../src/components/TypewriterText.tsx","../src/components/ConfirmDialog.tsx","../src/components/QuestionDialog.tsx","../src/components/PromptInput.tsx","../src/commands/slash.ts","../src/history.ts","../src/project.ts","../src/skills.ts","../src/userConfig.ts","../src/hooks.ts","../src/components/Spinner.tsx","../src/components/Logo.tsx"],"sourcesContent":["/**\n * AGI CLI - Terminal-based agent interaction for AGI desktop automation.\n *\n * Usage:\n * agi \"Open calculator and compute 2+2\"\n * agi \"Find flights from SFO to JFK\" --model claude-opus\n * agi \"Install Node.js\" --verbose\n * agi login\n * agi logout\n */\n\nimport React from 'react';\nimport { render } from 'ink';\nimport { isBinaryAvailable } from '@agi_inc/agi-js';\nimport { parseArgs } from './cli.js';\nimport { App } from './app/App.js';\nimport { loadApiKey } from './config.js';\n\nasync function main(): Promise<void> {\n try {\n const result = await parseArgs();\n\n // login/logout subcommands are self-contained\n if (result.kind === 'handled') {\n return;\n }\n\n const { args } = result;\n\n // Check for API key\n const apiKey = loadApiKey();\n if (!apiKey) {\n console.error('Error: No API key found');\n console.error('');\n console.error('Run `agi login` to authenticate, or set an environment variable:');\n console.error(' export AGI_API_KEY=your_key');\n console.error('');\n process.exit(1);\n }\n\n // Make the key available to downstream code via env\n if (!process.env.AGI_API_KEY && !process.env.ANTHROPIC_API_KEY) {\n process.env.AGI_API_KEY = apiKey;\n }\n\n // Check for driver binary\n if (!isBinaryAvailable()) {\n console.error('Error: AGI driver binary not found');\n console.error('');\n console.error('The driver binary is required for local agent execution.');\n console.error('It should be installed automatically with the agi package.');\n console.error('');\n console.error('Try reinstalling: npm install -g @agi_inc/cli');\n console.error('');\n process.exit(1);\n }\n\n // Render the app\n const { waitUntilExit } = render(<App args={args} />);\n await waitUntilExit();\n } catch (error) {\n console.error('Error:', error);\n process.exit(1);\n }\n}\n\nmain();\n","/**\n * CLI argument parsing and configuration.\n */\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { updateCommand } from './commands/update.js';\n\nexport interface CliArgs {\n goal: string | undefined;\n model: string;\n verbose: boolean;\n noConfirm: boolean;\n}\n\nexport type ParseResult =\n | { kind: 'run'; args: CliArgs }\n | { kind: 'handled' };\n\nexport async function parseArgs(): Promise<ParseResult> {\n const argv = await yargs(hideBin(process.argv))\n .scriptName('agi')\n .command('login', 'Authenticate and save your API key', {}, async () => {\n await loginCommand();\n })\n .command('logout', 'Remove saved credentials', {}, async () => {\n await logoutCommand();\n })\n .command('update', 'Update AGI CLI to the latest version', {}, async () => {\n await updateCommand();\n })\n .command(\n '$0 [goal]',\n 'Run an agent with the given goal',\n (yargs) => {\n return yargs.positional('goal', {\n describe: 'The task for the agent to accomplish',\n type: 'string',\n demandOption: false,\n });\n },\n )\n .option('model', {\n alias: 'm',\n describe: 'Model to use',\n type: 'string',\n default: 'claude-sonnet',\n choices: ['claude-sonnet', 'claude-opus'],\n })\n .option('verbose', {\n alias: 'v',\n describe: 'Show verbose output including agent thinking',\n type: 'boolean',\n default: false,\n })\n .option('no-confirm', {\n describe: 'Auto-approve all confirmation requests',\n type: 'boolean',\n default: false,\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'V')\n .example('$0 \"Open calculator and compute 2+2\"', 'Basic task')\n .example('$0 \"Find flights from SFO to JFK\" --model claude-opus', 'Use a specific model')\n .example('$0 \"Install Node.js\" --verbose', 'Verbose output')\n .example('$0', 'Start interactive mode')\n .example('$0 login', 'Authenticate with your API key')\n .example('$0 update', 'Update to the latest version')\n .parse();\n\n // If a subcommand (login/logout) was handled, yargs already ran its handler\n const command = argv._?.[0];\n if (command === 'login' || command === 'logout' || command === 'update') {\n return { kind: 'handled' };\n }\n\n return {\n kind: 'run',\n args: {\n goal: argv.goal as string | undefined,\n model: argv.model as string,\n verbose: argv.verbose as boolean,\n noConfirm: argv['no-confirm'] as boolean,\n },\n };\n}\n","/**\n * Credentials file management for AGI CLI.\n *\n * Checks AGI_API_KEY env -> ANTHROPIC_API_KEY env -> ~/.agi/credentials file.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\ninterface Credentials {\n api_key: string;\n}\n\nexport function getCredentialsPath(): string {\n return path.join(os.homedir(), '.agi', 'credentials');\n}\n\n/**\n * Load API key from environment variables or credentials file.\n * Priority: AGI_API_KEY env -> ANTHROPIC_API_KEY env -> ~/.agi/credentials\n */\nexport function loadApiKey(): string | undefined {\n if (process.env.AGI_API_KEY) {\n return process.env.AGI_API_KEY;\n }\n\n if (process.env.ANTHROPIC_API_KEY) {\n return process.env.ANTHROPIC_API_KEY;\n }\n\n const credPath = getCredentialsPath();\n try {\n const raw = fs.readFileSync(credPath, 'utf-8');\n const credentials: Credentials = JSON.parse(raw);\n if (credentials.api_key) {\n return credentials.api_key;\n }\n } catch {\n // File doesn't exist or is invalid\n }\n\n return undefined;\n}\n\n/**\n * Save API key to ~/.agi/credentials.\n * Creates the ~/.agi/ directory if it doesn't exist.\n */\nexport function saveApiKey(apiKey: string): void {\n const credPath = getCredentialsPath();\n const dir = path.dirname(credPath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n\n const credentials: Credentials = { api_key: apiKey };\n fs.writeFileSync(credPath, JSON.stringify(credentials, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\n/**\n * Delete the credentials file.\n */\nexport function deleteCredentials(): boolean {\n const credPath = getCredentialsPath();\n try {\n fs.unlinkSync(credPath);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * `agi login` command — device code auth flow.\n *\n * 1. POST /v1/auth/device -> get device_code + user_code\n * 2. Open browser to verification_url\n * 3. Poll POST /v1/auth/device/token every 5s\n * 4. On approval -> save API key to ~/.agi/credentials\n */\n\nimport { saveApiKey } from '../config.js';\n\nconst API_BASE = 'https://api.agi.tech';\n\ninterface DeviceAuthResponse {\n device_code: string;\n user_code: string;\n verification_url: string;\n expires_in: number;\n interval: number;\n}\n\ninterface DeviceAuthTokenResponse {\n api_key: string;\n email: string | null;\n}\n\nasync function openBrowser(url: string): Promise<void> {\n const open = (await import('open')).default;\n await open(url);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function loginCommand(): Promise<void> {\n // Step 1: Initiate device auth\n let deviceAuth: DeviceAuthResponse;\n try {\n const res = await fetch(`${API_BASE}/v1/auth/device`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!res.ok) {\n const detail = await res.text();\n console.error(`Failed to start login flow (${res.status}): ${detail}`);\n process.exit(1);\n }\n\n deviceAuth = (await res.json()) as DeviceAuthResponse;\n } catch (err) {\n console.error(`Failed to connect to AGI API: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // Step 2: Show code and open browser\n console.log('');\n console.log(`Your confirmation code: ${deviceAuth.user_code}`);\n console.log('');\n console.log('Opening browser to authorize...');\n console.log(` ${deviceAuth.verification_url}`);\n console.log('');\n\n try {\n await openBrowser(deviceAuth.verification_url);\n } catch {\n console.log('Could not open browser automatically. Please visit the URL above.');\n }\n\n console.log('Waiting for authorization...');\n\n // Handle Ctrl+C gracefully during polling\n const sigintHandler = () => {\n console.log('\\nLogin cancelled.');\n process.exit(130);\n };\n process.on('SIGINT', sigintHandler);\n\n // Step 3: Poll for token\n const maxAttempts = Math.ceil(deviceAuth.expires_in / deviceAuth.interval);\n const interval = deviceAuth.interval * 1000;\n let consecutiveErrors = 0;\n\n try {\n for (let i = 0; i < maxAttempts; i++) {\n await sleep(interval);\n\n try {\n const res = await fetch(`${API_BASE}/v1/auth/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ device_code: deviceAuth.device_code }),\n });\n\n consecutiveErrors = 0;\n\n if (res.status === 428) {\n // Still pending\n process.stdout.write('.');\n continue;\n }\n\n if (res.status === 410) {\n console.log('');\n console.error('Login expired. Please run `agi login` again.');\n process.exit(1);\n }\n\n if (res.ok) {\n const token = (await res.json()) as DeviceAuthTokenResponse;\n console.log('');\n\n saveApiKey(token.api_key);\n\n const identity = token.email || 'your account';\n console.log(`Logged in as ${identity}`);\n console.log('Your API key has been saved to ~/.agi/credentials');\n return;\n }\n\n // Unexpected status\n const detail = await res.text();\n console.log('');\n console.error(`Unexpected response (${res.status}): ${detail}`);\n process.exit(1);\n } catch {\n consecutiveErrors++;\n if (consecutiveErrors >= 3) {\n console.log('');\n console.error('Unable to reach AGI API. Check your internet connection.');\n console.error('Retrying...');\n consecutiveErrors = 0;\n } else {\n process.stdout.write('!');\n }\n }\n }\n\n console.log('');\n console.error('Login timed out. Please run `agi login` again.');\n process.exit(1);\n } finally {\n process.removeListener('SIGINT', sigintHandler);\n }\n}\n","/**\n * `agi logout` command — remove stored credentials.\n */\n\nimport { deleteCredentials } from '../config.js';\n\nexport async function logoutCommand(): Promise<void> {\n const deleted = deleteCredentials();\n\n if (deleted) {\n console.log('Logged out. Credentials removed from ~/.agi/credentials');\n } else {\n console.log('No credentials file found. Already logged out.');\n }\n}\n","/**\n * Self-update command for AGI CLI.\n *\n * Checks the npm registry for the latest version, detects install method\n * (npm or Homebrew), and runs the appropriate update command.\n */\n\nimport { execSync } from 'node:child_process';\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nfunction getCurrentVersion(): string {\n // Resolve symlinks (npm global bin is a symlink to the package)\n const realScript = realpathSync(process.argv[1]);\n const pkgPath = join(dirname(realScript), '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version;\n}\n\nasync function getLatestVersion(): Promise<string> {\n const res = await fetch('https://registry.npmjs.org/@agi_inc/cli');\n if (!res.ok) {\n throw new Error(`npm registry returned ${res.status}`);\n }\n const data = (await res.json()) as { 'dist-tags': { latest: string } };\n return data['dist-tags'].latest;\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n }\n return 0;\n}\n\nfunction detectInstallMethod(): 'npm' | 'homebrew' | 'unknown' {\n try {\n const agiPath = execSync('which agi', { encoding: 'utf-8' }).trim();\n if (agiPath.includes('homebrew') || agiPath.includes('Cellar')) {\n return 'homebrew';\n }\n return 'npm';\n } catch {\n return 'unknown';\n }\n}\n\nexport async function updateCommand(): Promise<void> {\n const current = getCurrentVersion();\n\n console.log('');\n console.log(` \\u25B8 AGI CLI v${current}`);\n console.log('');\n console.log(' Checking for updates...');\n\n try {\n const latest = await getLatestVersion();\n\n if (compareVersions(current, latest) >= 0) {\n console.log(` \\u25CF Up to date`);\n console.log('');\n return;\n }\n\n console.log(` Update available: ${current} \\u2192 ${latest}`);\n console.log('');\n\n const method = detectInstallMethod();\n\n if (method === 'homebrew') {\n console.log(' Updating via Homebrew...');\n console.log('');\n execSync('brew upgrade agi', { stdio: 'inherit' });\n } else {\n console.log(' Updating via npm...');\n console.log('');\n execSync('npm install -g @agi_inc/cli@latest', { stdio: 'inherit' });\n }\n\n console.log('');\n console.log(` \\u25CF Updated to v${latest}`);\n console.log('');\n } catch (error) {\n console.error('');\n console.error(` \\u2715 Update failed: ${error instanceof Error ? error.message : error}`);\n console.error('');\n console.error(' Try manually:');\n console.error(' npm install -g @agi_inc/cli@latest');\n console.error('');\n process.exit(1);\n }\n}\n","import React, { useEffect, useState, useCallback, useMemo, useRef } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport type { CliArgs } from '../cli.js';\nimport { useAgent } from '../hooks/useAgent.js';\nimport { useKeybindings } from '../hooks/useKeybindings.js';\nimport { StatusBar } from '../components/StatusBar.js';\nimport { EventDisplay } from '../components/EventDisplay.js';\nimport { ConfirmDialog } from '../components/ConfirmDialog.js';\nimport { QuestionDialog } from '../components/QuestionDialog.js';\nimport { PromptInput } from '../components/PromptInput.js';\nimport { Spinner } from '../components/Spinner.js';\nimport { Logo } from '../components/Logo.js';\nimport type { LogoMood } from '../components/Logo.js';\nimport { parseSlashCommand, loadUserCommands, loadSkillCommands, registerCommands } from '../commands/slash.js';\nimport type { CommandContext } from '../commands/slash.js';\nimport { loadProjectConfig, withProjectInstructions } from '../project.js';\nimport type { ProjectConfig } from '../project.js';\nimport { appendHistory } from '../history.js';\nimport type { HistoryEntry } from '../history.js';\nimport { loadUserConfig } from '../userConfig.js';\nimport { loadHooks, runHooks } from '../hooks.js';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json');\n\ninterface AppProps {\n args: CliArgs;\n}\n\ntype Phase = 'input' | 'executing';\n\nexport const App: React.FC<AppProps> = ({ args }) => {\n const { exit } = useApp();\n const [phase, setPhase] = useState<Phase>(args.goal ? 'executing' : 'input');\n const [currentGoal, setCurrentGoal] = useState(args.goal ?? '');\n\n // In-session goal history for up-arrow recall (most recent first)\n const [goalHistory, setGoalHistory] = useState<string[]>([]);\n\n // Load user config and hooks on mount\n const userConfig = useMemo(() => loadUserConfig(), []);\n useMemo(() => loadHooks(), []);\n\n // Fire SessionStart hooks\n useEffect(() => {\n runHooks('SessionStart');\n }, []);\n\n // Load project config, user commands, and skill commands on mount\n const projectConfig: ProjectConfig = useMemo(() => {\n const config = loadProjectConfig();\n const cmds = [];\n if (config.commandFiles.length > 0) {\n cmds.push(...loadUserCommands(config.commandFiles));\n }\n if (config.skills.length > 0) {\n cmds.push(...loadSkillCommands(config.skills));\n }\n if (cmds.length > 0) {\n registerCommands(cmds);\n }\n return config;\n }, []);\n\n // Mutable settings — CLI args override user config defaults\n const [model, setModel] = useState(args.model !== 'claude-sonnet' ? args.model : (userConfig.model ?? args.model));\n const [verbose, setVerbose] = useState(args.verbose || (userConfig.verbose ?? false));\n const [noConfirm, setNoConfirm] = useState(args.noConfirm || (userConfig.noConfirm ?? false));\n const [compact, setCompact] = useState(userConfig.compact ?? false);\n\n // Transient message shown after a slash command runs\n const [commandMessage, setCommandMessage] = useState<string | null>(null);\n\n // History tracking\n const taskStartTime = useRef<number | null>(null);\n\n const {\n state,\n step,\n events,\n pendingConfirm,\n pendingQuestion,\n start,\n stop,\n pause,\n resume,\n respondConfirm,\n respondAnswer,\n clearEvents,\n } = useAgent({\n model,\n verbose,\n noConfirm,\n onFinished: (result) => {\n // Record in history\n if (currentGoal) {\n const entry: HistoryEntry = {\n timestamp: new Date().toISOString(),\n goal: currentGoal,\n model,\n durationMs: taskStartTime.current\n ? Date.now() - taskStartTime.current\n : undefined,\n success: result?.success,\n };\n appendHistory(entry);\n taskStartTime.current = null;\n\n // Fire TaskComplete hooks\n runHooks('TaskComplete', {\n AGI_GOAL: currentGoal,\n AGI_SUCCESS: String(result?.success ?? ''),\n });\n }\n setPhase('input');\n },\n });\n\n // Start executing when phase transitions to 'executing' with a goal\n useEffect(() => {\n if (phase === 'executing' && currentGoal) {\n taskStartTime.current = Date.now();\n start(withProjectInstructions(currentGoal, projectConfig));\n }\n }, [phase, currentGoal, start, projectConfig]);\n\n const runGoal = useCallback((goal: string) => {\n setCommandMessage(null);\n setGoalHistory((prev) => [goal, ...prev.filter((g) => g !== goal)]);\n setCurrentGoal(goal);\n setPhase('executing');\n }, []);\n\n const commandContext: CommandContext = {\n model,\n verbose,\n noConfirm,\n compact,\n setModel,\n setVerbose,\n setNoConfirm,\n setCompact,\n clearEvents,\n quit: () => exit(),\n runGoal,\n projectConfig,\n version: CLI_VERSION,\n lastGoal: goalHistory[0],\n };\n\n const handleSubmitGoal = useCallback(\n (input: string) => {\n // Try slash command first\n const parsed = parseSlashCommand(input);\n if (parsed) {\n const result = parsed.command.execute(parsed.args, commandContext);\n setCommandMessage(result);\n // Auto-clear message after a short time\n if (result) {\n setTimeout(() => setCommandMessage(null), 4000);\n }\n return;\n }\n\n setCommandMessage(null);\n setGoalHistory((prev) => [input, ...prev.filter((g) => g !== input)]);\n setCurrentGoal(input);\n setPhase('executing');\n },\n [commandContext]\n );\n\n useKeybindings({\n onPause: pause,\n onResume: resume,\n onStop: async () => {\n if (phase === 'executing') {\n await stop();\n }\n exit();\n },\n isPaused: state === 'paused',\n disabled: phase === 'input' || !!pendingConfirm || !!pendingQuestion,\n });\n\n const isTerminal = state === 'finished' || state === 'stopped' || state === 'error';\n\n // Derive logo mood from agent state\n const logoMood: LogoMood = (() => {\n if (phase === 'input') return 'idle';\n if (state === 'error') return 'error';\n if (state === 'finished') return 'success';\n if (state === 'paused') return 'thinking';\n return 'active';\n })();\n\n return (\n <Box flexDirection=\"column\">\n {/* Logo — always visible at the top */}\n <Box flexDirection=\"column\">\n <Logo version={CLI_VERSION} model={model} cwd={process.cwd()} mood={logoMood} />\n {phase === 'input' && events.length === 0 && (\n <>\n {projectConfig.instructions && (\n <Box marginTop={1} marginLeft={1}>\n <Text dimColor>{'\\u25B8 loaded '}</Text>\n <Text color=\"green\">{projectConfig.instructionsPath}</Text>\n </Box>\n )}\n {projectConfig.rules.length > 0 && (\n <Box marginLeft={1}>\n <Text dimColor>{'\\u25B8 '}</Text>\n <Text color=\"green\">{projectConfig.rules.length}</Text>\n <Text dimColor>{' rule(s) from .agi/rules/'}</Text>\n </Box>\n )}\n {projectConfig.commandFiles.length > 0 && (\n <Box marginLeft={1}>\n <Text dimColor>{'\\u25B8 '}</Text>\n <Text color=\"green\">{projectConfig.commandFiles.length}</Text>\n <Text dimColor>{' custom command(s) from .agi/commands/'}</Text>\n </Box>\n )}\n {projectConfig.skills.length > 0 && (\n <Box marginLeft={1}>\n <Text dimColor>{'\\u25B8 '}</Text>\n <Text color=\"green\">{projectConfig.skills.length}</Text>\n <Text dimColor>{' skill(s) from .agi/skills/'}</Text>\n </Box>\n )}\n </>\n )}\n </Box>\n\n {/* Status bar during execution */}\n {phase === 'executing' && (\n <StatusBar state={state} step={step} goal={currentGoal} />\n )}\n\n {/* Activity log */}\n <Box flexDirection=\"column\" marginTop={1}>\n <EventDisplay events={events} maxEvents={compact ? 6 : 12} />\n\n {phase === 'executing' && state === 'running' && (\n <Box>\n <Text dimColor>{' \\u2503 '}</Text>\n <Spinner />\n </Box>\n )}\n\n {phase === 'executing' && state === 'paused' && (\n <Box>\n <Text dimColor>{' \\u2503 '}</Text>\n <Text color=\"yellow\" bold>{'\\u25AE\\u25AE'}</Text>\n <Text dimColor>{' paused \\u2014 space to resume'}</Text>\n </Box>\n )}\n </Box>\n\n {pendingConfirm && (\n <Box marginTop={1}>\n <ConfirmDialog reason={pendingConfirm} onConfirm={respondConfirm} />\n </Box>\n )}\n\n {pendingQuestion && (\n <Box marginTop={1}>\n <QuestionDialog question={pendingQuestion} onAnswer={respondAnswer} />\n </Box>\n )}\n\n {/* Command feedback message */}\n {commandMessage && phase === 'input' && (\n <Box>\n <Text color=\"gray\">{commandMessage}</Text>\n </Box>\n )}\n\n {/* Prompt input when in input phase */}\n {phase === 'input' && (\n <Box marginTop={1}>\n <PromptInput onSubmit={handleSubmitGoal} goalHistory={goalHistory} />\n </Box>\n )}\n\n {/* Help bar: only during execution, not in terminal states or dialogs */}\n {phase === 'executing' && !isTerminal && !pendingConfirm && !pendingQuestion && (\n <Box marginTop={1}>\n <Text dimColor>{' space pause \\u00B7 q stop \\u00B7 ^c quit'}</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { AgentDriver } from '@agi_inc/agi-js';\nimport type { DriverState, DriverAction, DriverResult } from '@agi_inc/agi-js';\nimport type { EventItem } from '../components/EventDisplay.js';\n\ninterface UseAgentOptions {\n model: string;\n agentName?: string;\n apiUrl?: string;\n verbose: boolean;\n noConfirm: boolean;\n onFinished?: (result: DriverResult) => void;\n}\n\ninterface UseAgentReturn {\n state: DriverState;\n step: number;\n events: EventItem[];\n pendingConfirm: string | null;\n pendingQuestion: string | null;\n start: (goal: string) => Promise<void>;\n stop: () => Promise<void>;\n pause: () => void;\n resume: () => void;\n respondConfirm: (approved: boolean) => void;\n respondAnswer: (answer: string) => void;\n clearEvents: () => void;\n}\n\nexport function useAgent(options: UseAgentOptions): UseAgentReturn {\n const { model, agentName, apiUrl, verbose, noConfirm, onFinished } = options;\n\n const [state, setState] = useState<DriverState>('idle');\n const [step, setStep] = useState(0);\n const [events, setEvents] = useState<EventItem[]>([]);\n const [pendingConfirm, setPendingConfirm] = useState<string | null>(null);\n const [pendingQuestion, setPendingQuestion] = useState<string | null>(null);\n\n const driverRef = useRef<AgentDriver | null>(null);\n const onFinishedRef = useRef(onFinished);\n\n // Keep the ref up to date so start() never captures a stale callback\n useEffect(() => {\n onFinishedRef.current = onFinished;\n }, [onFinished]);\n\n const addEvent = useCallback((event: EventItem) => {\n setEvents((prev) => [...prev, event]);\n }, []);\n\n const start = useCallback(\n async (goal: string) => {\n // Stop previous driver if one exists\n if (driverRef.current) {\n try {\n await driverRef.current.stop('New task started');\n } catch {\n // Ignore errors from stopping previous driver\n }\n driverRef.current = null;\n }\n\n // Reset per-task state but keep events\n setState('idle');\n setStep(0);\n setPendingConfirm(null);\n setPendingQuestion(null);\n\n // Insert separator if there are already events from a previous task\n setEvents((prev) => {\n if (prev.length > 0) {\n return [...prev, { type: 'separator', goal }];\n }\n return prev;\n });\n\n const driver = new AgentDriver({ model, mode: 'local', agentName, apiUrl });\n driverRef.current = driver;\n\n // Set up event handlers\n driver.on('state_change', (newState: DriverState) => {\n setState(newState);\n });\n\n driver.on('thinking', (text: string) => {\n if (verbose) {\n addEvent({ type: 'thinking', text });\n }\n });\n\n driver.on('action', async (action: DriverAction) => {\n const actionStr = action.type + (action.x !== undefined ? ` (${action.x}, ${action.y})` : '');\n const parts: string[] = [];\n if (action.text) parts.push(`\"${action.text}\"`);\n if (action.key) parts.push(`[${action.key}]`);\n addEvent({ type: 'action', action: actionStr, params: parts.length ? parts.join(' ') : undefined });\n // In local mode, the driver binary executes actions and captures screenshots\n });\n\n driver.on('confirm', async (reason: string) => {\n if (noConfirm) {\n driver.respondConfirm(true);\n return true;\n }\n addEvent({ type: 'confirm', reason });\n setPendingConfirm(reason);\n return true;\n });\n\n driver.on('ask_question', async (question: string) => {\n addEvent({ type: 'question', question });\n setPendingQuestion(question);\n return '';\n });\n\n driver.on('finished', (evt) => {\n addEvent({\n type: 'finished',\n summary: evt.summary,\n success: evt.success,\n });\n });\n\n driver.on('error', (evt) => {\n addEvent({ type: 'error', message: evt.message });\n });\n\n // Start the agent in local mode — no screenshot needed, driver handles it\n try {\n const result = await driver.start(goal);\n\n if (onFinishedRef.current) {\n onFinishedRef.current(result);\n }\n } catch (error) {\n addEvent({ type: 'error', message: String(error) });\n }\n },\n [model, agentName, apiUrl, verbose, noConfirm, addEvent]\n );\n\n const stop = useCallback(async () => {\n if (driverRef.current) {\n await driverRef.current.stop('User cancelled');\n }\n }, []);\n\n const pause = useCallback(() => {\n if (driverRef.current) {\n driverRef.current.pause();\n }\n }, []);\n\n const resume = useCallback(() => {\n if (driverRef.current) {\n driverRef.current.resume();\n }\n }, []);\n\n const respondConfirm = useCallback((approved: boolean) => {\n if (driverRef.current && pendingConfirm) {\n driverRef.current.respondConfirm(approved);\n setPendingConfirm(null);\n }\n }, [pendingConfirm]);\n\n const respondAnswer = useCallback((answer: string) => {\n if (driverRef.current && pendingQuestion) {\n driverRef.current.respondAnswer(answer);\n setPendingQuestion(null);\n }\n }, [pendingQuestion]);\n\n const clearEvents = useCallback(() => {\n setEvents([]);\n }, []);\n\n // Update step from driver\n useEffect(() => {\n const interval = setInterval(() => {\n if (driverRef.current) {\n setStep(driverRef.current.currentStep);\n }\n }, 100);\n return () => clearInterval(interval);\n }, []);\n\n return {\n state,\n step,\n events,\n pendingConfirm,\n pendingQuestion,\n start,\n stop,\n pause,\n resume,\n respondConfirm,\n respondAnswer,\n clearEvents,\n };\n}\n","import { useInput } from 'ink';\nimport { useCallback } from 'react';\n\ninterface UseKeybindingsOptions {\n onPause?: () => void;\n onResume?: () => void;\n onStop?: () => void;\n isPaused?: boolean;\n disabled?: boolean;\n}\n\n/**\n * Hook for handling keyboard shortcuts.\n *\n * - Space: Pause/Resume\n * - Q/Ctrl+C: Stop\n * - Escape: Stop\n */\nexport function useKeybindings(options: UseKeybindingsOptions): void {\n const { onPause, onResume, onStop, isPaused = false, disabled = false } = options;\n\n const handleInput = useCallback(\n (input: string, key: { ctrl: boolean; escape: boolean }) => {\n if (disabled) return;\n\n // Space: Toggle pause/resume\n if (input === ' ') {\n if (isPaused) {\n onResume?.();\n } else {\n onPause?.();\n }\n }\n\n // Q or Ctrl+C: Stop\n if (input === 'q' || input === 'Q' || (key.ctrl && input === 'c')) {\n onStop?.();\n }\n\n // Escape: Stop\n if (key.escape) {\n onStop?.();\n }\n },\n [disabled, isPaused, onPause, onResume, onStop]\n );\n\n useInput(handleInput);\n}\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport type { DriverState } from '@agi_inc/agi-js';\n\ninterface StatusBarProps {\n state: DriverState;\n step: number;\n goal: string;\n}\n\nconst stateColors: Record<DriverState, string> = {\n idle: 'gray',\n running: 'green',\n paused: 'yellow',\n waiting_confirmation: 'yellow',\n waiting_answer: 'yellow',\n finished: 'green',\n stopped: 'gray',\n error: 'red',\n};\n\nconst stateLabels: Record<DriverState, string> = {\n idle: 'IDLE',\n running: 'ACTIVE',\n paused: 'PAUSED',\n waiting_confirmation: 'AWAITING',\n waiting_answer: 'AWAITING',\n finished: 'COMPLETE',\n stopped: 'STOPPED',\n error: 'ERROR',\n};\n\nconst stateIndicators: Record<DriverState, string> = {\n idle: '○',\n running: '●',\n paused: '◉',\n waiting_confirmation: '◎',\n waiting_answer: '◎',\n finished: '●',\n stopped: '○',\n error: '●',\n};\n\nexport const StatusBar: React.FC<StatusBarProps> = ({ state, step, goal }) => {\n const color = stateColors[state] || 'white';\n const label = stateLabels[state] || state.toUpperCase();\n const indicator = stateIndicators[state] || '○';\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor=\"gray\" paddingX={1}>\n <Box>\n <Text color=\"cyan\" bold>{'▸ AGI'}</Text>\n <Text>{' '}</Text>\n <Text color={color}>{indicator} </Text>\n <Text color={color} bold>{label}</Text>\n <Box flexGrow={1} />\n <Text dimColor>STEP </Text>\n <Text bold>{String(step).padStart(2, '0')}</Text>\n </Box>\n <Box>\n <Text dimColor>{goal.length > 72 ? goal.slice(0, 72) + '\\u2026' : goal}</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport { TypewriterText } from './TypewriterText.js';\n\nexport type EventItem =\n | { type: 'thinking'; text: string }\n | { type: 'action'; action: string; params?: string }\n | { type: 'confirm'; reason: string }\n | { type: 'question'; question: string }\n | { type: 'finished'; summary: string; success: boolean }\n | { type: 'error'; message: string }\n | { type: 'separator'; goal: string };\n\ninterface EventDisplayProps {\n events: EventItem[];\n maxEvents?: number;\n}\n\nconst typeConfig: Record<string, { prefix: string; color: string }> = {\n thinking: { prefix: '\\u00B7', color: 'gray' },\n action: { prefix: '\\u25B8', color: 'white' },\n confirm: { prefix: '\\u25C6', color: 'yellow' },\n question: { prefix: '\\u25C7', color: 'cyan' },\n error: { prefix: '\\u2715', color: 'red' },\n};\n\nfunction getEventText(event: EventItem): string {\n switch (event.type) {\n case 'thinking':\n return event.text;\n case 'action':\n return event.action;\n case 'confirm':\n return event.reason;\n case 'question':\n return event.question;\n case 'finished':\n return event.summary;\n case 'error':\n return event.message;\n case 'separator':\n return event.goal;\n }\n}\n\nfunction getEventStyle(event: EventItem): { prefix: string; color: string } {\n if (event.type === 'finished') {\n return event.success\n ? { prefix: '\\u25CF', color: 'green' }\n : { prefix: '\\u2715', color: 'red' };\n }\n return typeConfig[event.type];\n}\n\n/** Event types that get the typewriter animation when they are the latest event */\nfunction shouldAnimate(event: EventItem): boolean {\n if (event.type === 'finished' && event.success) return true;\n if (event.type === 'action') return true;\n if (event.type === 'error') return true;\n return false;\n}\n\nexport const EventDisplay: React.FC<EventDisplayProps> = ({ events, maxEvents = 12 }) => {\n const displayEvents = events.slice(-maxEvents);\n\n if (displayEvents.length === 0) return null;\n\n return (\n <Box flexDirection=\"column\">\n {displayEvents.map((event, index) => {\n if (event.type === 'separator') {\n return (\n <Box key={index} marginTop={1}>\n <Text color=\"cyan\" bold>{'\\u25B8 '}</Text>\n <Text>{event.goal}</Text>\n </Box>\n );\n }\n\n const style = getEventStyle(event);\n const text = getEventText(event);\n const isLatest = index === displayEvents.length - 1;\n const animate = isLatest && shouldAnimate(event);\n\n return (\n <Box key={index}>\n <Text dimColor>{' \\u2503 '}</Text>\n <Text color={style.color}>{style.prefix} </Text>\n {animate ? (\n <TypewriterText\n text={text}\n color={style.color === 'white' ? undefined : style.color}\n bold={isLatest && event.type === 'action'}\n speed={event.type === 'finished' ? 8 : 12}\n />\n ) : (\n <Text\n color={style.color === 'white' ? undefined : style.color}\n bold={isLatest && event.type === 'action'}\n dimColor={event.type === 'thinking'}\n >\n {text}\n </Text>\n )}\n {event.type === 'action' && event.params && (\n <Text color=\"gray\">{' '}{event.params}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Text } from 'ink';\n\ninterface TypewriterTextProps {\n text: string;\n /** Milliseconds per character (default: 12) */\n speed?: number;\n color?: string;\n bold?: boolean;\n dimColor?: boolean;\n /** Called when the animation finishes */\n onComplete?: () => void;\n}\n\nexport const TypewriterText: React.FC<TypewriterTextProps> = ({\n text,\n speed = 12,\n color,\n bold,\n dimColor,\n onComplete,\n}) => {\n const [visibleLength, setVisibleLength] = useState(0);\n const startTime = React.useRef(Date.now());\n\n useEffect(() => {\n setVisibleLength(0);\n startTime.current = Date.now();\n }, [text]);\n\n useEffect(() => {\n if (visibleLength >= text.length) {\n onComplete?.();\n return;\n }\n\n // Speed up 2x per second elapsed — chars jump faster over time\n const elapsed = (Date.now() - startTime.current) / 1000;\n const multiplier = Math.pow(2, elapsed);\n const baseJump = text.length > 60 ? 3 : text.length > 30 ? 2 : 1;\n const jump = Math.max(baseJump, Math.round(baseJump * multiplier));\n const interval = Math.max(4, Math.round(speed / multiplier));\n\n const timer = setTimeout(() => {\n setVisibleLength((prev) => Math.min(prev + jump, text.length));\n }, interval);\n\n return () => clearTimeout(timer);\n }, [visibleLength, text, speed, onComplete]);\n\n const displayed = text.slice(0, visibleLength);\n\n return (\n <Text color={color} bold={bold} dimColor={dimColor}>\n {displayed}\n {visibleLength < text.length ? '\\u2588' : ''}\n </Text>\n );\n};\n","import React, { useState } from 'react';\nimport { Text, Box, useInput } from 'ink';\n\ninterface ConfirmDialogProps {\n reason: string;\n onConfirm: (approved: boolean) => void;\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({ reason, onConfirm }) => {\n const [selected, setSelected] = useState<'yes' | 'no'>('yes');\n\n useInput((input, key) => {\n if (key.leftArrow || input === 'h') {\n setSelected('yes');\n } else if (key.rightArrow || input === 'l') {\n setSelected('no');\n } else if (key.return) {\n onConfirm(selected === 'yes');\n } else if (input === 'y' || input === 'Y') {\n onConfirm(true);\n } else if (input === 'n' || input === 'N') {\n onConfirm(false);\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor=\"yellow\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"yellow\" bold>CONFIRM</Text>\n </Box>\n <Box marginBottom={1}>\n <Text>{reason}</Text>\n </Box>\n <Box>\n <Box marginRight={2}>\n <Text\n backgroundColor={selected === 'yes' ? 'green' : undefined}\n color={selected === 'yes' ? 'black' : 'gray'}\n bold={selected === 'yes'}\n >\n {' [Y] approve '}\n </Text>\n </Box>\n <Text\n backgroundColor={selected === 'no' ? 'red' : undefined}\n color={selected === 'no' ? 'black' : 'gray'}\n bold={selected === 'no'}\n >\n {' [N] deny '}\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Y/N or arrows + enter</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface QuestionDialogProps {\n question: string;\n onAnswer: (answer: string) => void;\n}\n\nexport const QuestionDialog: React.FC<QuestionDialogProps> = ({ question, onAnswer }) => {\n const [answer, setAnswer] = useState('');\n\n const handleSubmit = () => {\n if (answer.trim()) {\n onAnswer(answer.trim());\n }\n };\n\n useInput((_, key) => {\n if (key.return && answer.trim()) {\n handleSubmit();\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor=\"cyan\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text color=\"cyan\" bold>INPUT REQUIRED</Text>\n </Box>\n <Box marginBottom={1}>\n <Text>{question}</Text>\n </Box>\n <Box>\n <Text color=\"cyan\">{'\\u25B8 '}</Text>\n <TextInput\n value={answer}\n onChange={setAnswer}\n onSubmit={handleSubmit}\n placeholder=\"Type your answer...\"\n />\n </Box>\n <Box marginTop={1}>\n <Text dimColor>enter to submit</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { getAllCommands } from '../commands/slash.js';\n\ninterface PromptInputProps {\n onSubmit: (goal: string) => void;\n /** Past goals for up-arrow recall */\n goalHistory?: string[];\n}\n\nexport const PromptInput: React.FC<PromptInputProps> = ({ onSubmit, goalHistory = [] }) => {\n const [value, setValue] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(-1);\n // Increment to force TextInput remount (resets internal cursor to end)\n const [inputKey, setInputKey] = useState(0);\n // Index into goalHistory for up-arrow recall (-1 = current input)\n const [historyIndex, setHistoryIndex] = useState(-1);\n const savedInput = useRef('');\n\n // Show matching commands as the user types a slash prefix\n const showSuggestions = value.startsWith('/') && value.length > 0 && !value.includes(' ');\n const suggestions = showSuggestions\n ? getAllCommands().filter((cmd) => {\n const typed = value.slice(1).toLowerCase();\n if (!typed) return true;\n return (\n cmd.name.startsWith(typed) ||\n cmd.aliases?.some((a) => a.startsWith(typed))\n );\n })\n : [];\n\n // Reset selection when suggestions change\n useEffect(() => {\n setSelectedIndex(suggestions.length > 0 ? 0 : -1);\n }, [value]);\n\n // Queue a value to set after a TextInput remount\n const pendingValue = useRef<string | null>(null);\n\n useEffect(() => {\n if (pendingValue.current !== null) {\n setValue(pendingValue.current);\n pendingValue.current = null;\n }\n }, [inputKey]);\n\n const completeSelected = () => {\n if (selectedIndex >= 0 && selectedIndex < suggestions.length) {\n const cmd = suggestions[selectedIndex];\n const completed = '/' + cmd.name + (cmd.usage ? ' ' : '');\n // Force remount TextInput so cursor moves to end of new value\n pendingValue.current = completed;\n setInputKey((k) => k + 1);\n }\n };\n\n // Handle arrow keys and tab for suggestion navigation + goal history recall\n useInput((input, key) => {\n // Slash command suggestions take priority\n if (showSuggestions && suggestions.length > 0) {\n if (key.downArrow) {\n setSelectedIndex((prev) =>\n prev < suggestions.length - 1 ? prev + 1 : 0\n );\n return;\n }\n if (key.upArrow) {\n setSelectedIndex((prev) =>\n prev > 0 ? prev - 1 : suggestions.length - 1\n );\n return;\n }\n if (key.tab) {\n completeSelected();\n return;\n }\n return;\n }\n\n // Up-arrow goal history recall (only when not showing suggestions)\n if (key.upArrow && goalHistory.length > 0) {\n if (historyIndex === -1) {\n savedInput.current = value;\n }\n const next = Math.min(historyIndex + 1, goalHistory.length - 1);\n setHistoryIndex(next);\n pendingValue.current = goalHistory[next];\n setInputKey((k) => k + 1);\n return;\n }\n\n if (key.downArrow && historyIndex >= 0) {\n const next = historyIndex - 1;\n setHistoryIndex(next);\n pendingValue.current = next === -1 ? savedInput.current : goalHistory[next];\n setInputKey((k) => k + 1);\n return;\n }\n });\n\n const handleSubmit = () => {\n // If suggestions are shown and one is selected, complete it first\n if (showSuggestions && selectedIndex >= 0 && selectedIndex < suggestions.length) {\n const cmd = suggestions[selectedIndex];\n const completed = '/' + cmd.name;\n if (value !== completed && value !== completed + ' ') {\n completeSelected();\n return;\n }\n }\n\n const trimmed = value.trim();\n if (trimmed) {\n onSubmit(trimmed);\n // Force remount to reset cursor\n pendingValue.current = '';\n setInputKey((k) => k + 1);\n setSelectedIndex(-1);\n setHistoryIndex(-1);\n savedInput.current = '';\n }\n };\n\n const visibleSuggestions = suggestions.slice(0, 6);\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\" bold>{'\\u25B8 '}</Text>\n <TextInput\n key={inputKey}\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"Enter a task or /help for commands...\"\n />\n </Box>\n {visibleSuggestions.length > 0 && showSuggestions && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {visibleSuggestions.map((cmd, idx) => {\n const isSelected = idx === selectedIndex;\n return (\n <Box key={cmd.name}>\n <Text color={isSelected ? 'cyan' : 'gray'}>\n {isSelected ? ' \\u25B8 ' : ' '}\n </Text>\n <Text color={isSelected ? 'cyan' : 'white'} bold={isSelected}>\n /{cmd.name}\n </Text>\n {cmd.usage && (\n <Text color={isSelected ? 'cyan' : 'gray'} dimColor={!isSelected}>\n {' '}{cmd.usage}\n </Text>\n )}\n <Text dimColor>{' \\u2014 '}{cmd.description}</Text>\n </Box>\n );\n })}\n <Box marginTop={0}>\n <Text dimColor>{' \\u2191\\u2193 navigate \\u21B9 complete \\u21B5 run'}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Slash command system for the interactive REPL.\n *\n * Supports built-in commands, user-defined commands from .agi/commands/*.md,\n * and skill-based commands from .agi/skills/.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport os from 'node:os';\nimport { isBinaryAvailable } from '@agi_inc/agi-js';\nimport { loadHistory, formatHistory, clearHistory } from '../history.js';\nimport { initProject } from '../project.js';\nimport type { ProjectConfig } from '../project.js';\nimport { formatSkillsList, loadSkill } from '../skills.js';\nimport type { SkillMetadata } from '../skills.js';\nimport { setConfigValue, formatConfig, loadUserConfig } from '../userConfig.js';\nimport { formatHooks } from '../hooks.js';\n\nexport interface SlashCommand {\n name: string;\n aliases?: string[];\n description: string;\n usage?: string;\n /** Whether this is a user-defined command (from .agi/commands/) */\n isUserDefined?: boolean;\n /** Whether this is a skill-based command */\n isSkill?: boolean;\n /** For user-defined commands: the prompt template */\n prompt?: string;\n /** Execute the command. Returns a message to display, or null for silent commands. */\n execute: (args: string, context: CommandContext) => string | null;\n}\n\nexport interface CommandContext {\n model: string;\n verbose: boolean;\n noConfirm: boolean;\n compact: boolean;\n setModel: (model: string) => void;\n setVerbose: (verbose: boolean) => void;\n setNoConfirm: (noConfirm: boolean) => void;\n setCompact: (compact: boolean) => void;\n clearEvents: () => void;\n quit: () => void;\n /** Run a goal (for user-defined commands that produce agent tasks) */\n runGoal?: (goal: string) => void;\n /** Project config for status display */\n projectConfig?: ProjectConfig;\n /** CLI version string */\n version?: string;\n /** Last completed goal (for /redo) */\n lastGoal?: string;\n}\n\nconst VALID_MODELS = ['claude-sonnet', 'claude-opus'];\n\n/** Built-in commands */\nconst builtinCommands: SlashCommand[] = [\n {\n name: 'help',\n aliases: ['h', '?'],\n description: 'Show available commands',\n execute: () => {\n const all = getAllCommands();\n const lines = [\n '',\n ' Available commands:',\n '',\n ];\n\n const builtins = all.filter((c) => !c.isUserDefined && !c.isSkill);\n const userDefined = all.filter((c) => c.isUserDefined);\n const skills = all.filter((c) => c.isSkill);\n\n for (const cmd of builtins) {\n const aliases = cmd.aliases?.length ? ` (${cmd.aliases.map(a => '/' + a).join(', ')})` : '';\n const usage = cmd.usage ? ` ${cmd.usage}` : '';\n lines.push(` /${cmd.name}${usage}${aliases}`);\n lines.push(` ${cmd.description}`);\n }\n\n if (userDefined.length > 0) {\n lines.push('');\n lines.push(' Custom commands (.agi/commands/):');\n lines.push('');\n for (const cmd of userDefined) {\n const usage = cmd.usage ? ` ${cmd.usage}` : '';\n lines.push(` /${cmd.name}${usage}`);\n lines.push(` ${cmd.description}`);\n }\n }\n\n if (skills.length > 0) {\n lines.push('');\n lines.push(' Skills (.agi/skills/):');\n lines.push('');\n for (const cmd of skills) {\n const usage = cmd.usage ? ` ${cmd.usage}` : '';\n lines.push(` /${cmd.name}${usage}`);\n lines.push(` ${cmd.description}`);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n },\n },\n {\n name: 'history',\n aliases: ['hist'],\n description: 'Show session history',\n usage: '[clear]',\n execute: (args) => {\n if (args.trim().toLowerCase() === 'clear') {\n clearHistory();\n return ' History cleared.';\n }\n const entries = loadHistory();\n return formatHistory(entries);\n },\n },\n {\n name: 'status',\n aliases: ['info'],\n description: 'Show environment and session info',\n execute: (_args, ctx) => {\n const lines: string[] = ['', ' Environment:', ''];\n\n lines.push(` Version ${ctx.version || 'unknown'}`);\n lines.push(` Model ${ctx.model}`);\n lines.push(` Working dir ${process.cwd().replace(os.homedir(), '~')}`);\n lines.push(` Node.js ${process.version}`);\n lines.push(` Platform ${process.platform} ${process.arch}`);\n lines.push(` Driver ${isBinaryAvailable() ? '\\u2714 available' : '\\u2718 not found'}`);\n lines.push(` API key ${process.env.AGI_API_KEY ? '\\u2714 set' : process.env.ANTHROPIC_API_KEY ? '\\u2714 set (ANTHROPIC_API_KEY)' : '\\u2718 not set'}`);\n\n lines.push('');\n lines.push(' Session:');\n lines.push('');\n lines.push(` Verbose ${ctx.verbose ? 'on' : 'off'}`);\n lines.push(` Auto-confirm ${ctx.noConfirm ? 'on' : 'off'}`);\n lines.push(` Compact mode ${ctx.compact ? 'on' : 'off'}`);\n\n if (ctx.projectConfig) {\n lines.push('');\n lines.push(' Project:');\n lines.push('');\n lines.push(` Instructions ${ctx.projectConfig.instructionsPath?.replace(process.cwd(), '.') || 'none'}`);\n lines.push(` Rules ${ctx.projectConfig.rules.length} loaded`);\n lines.push(` Commands ${ctx.projectConfig.commandFiles.length} custom`);\n lines.push(` Skills ${ctx.projectConfig.skills.length} discovered`);\n }\n\n const history = loadHistory();\n lines.push('');\n lines.push(` History ${history.length} past sessions`);\n lines.push('');\n\n return lines.join('\\n');\n },\n },\n {\n name: 'model',\n aliases: ['m'],\n description: 'Show or change the current model',\n usage: '[claude-sonnet|claude-opus]',\n execute: (args, ctx) => {\n if (!args) {\n return ` Current model: ${ctx.model}`;\n }\n const model = args.trim().toLowerCase();\n if (!VALID_MODELS.includes(model)) {\n return ` Unknown model \"${model}\". Available: ${VALID_MODELS.join(', ')}`;\n }\n ctx.setModel(model);\n return ` Model set to ${model}`;\n },\n },\n {\n name: 'verbose',\n aliases: ['v'],\n description: 'Toggle verbose output (show agent thinking)',\n execute: (_args, ctx) => {\n ctx.setVerbose(!ctx.verbose);\n return ` Verbose output ${!ctx.verbose ? 'on' : 'off'}`;\n },\n },\n {\n name: 'compact',\n description: 'Toggle compact output mode',\n execute: (_args, ctx) => {\n ctx.setCompact(!ctx.compact);\n return ` Compact mode ${!ctx.compact ? 'on' : 'off'}`;\n },\n },\n {\n name: 'confirm',\n description: 'Toggle auto-confirm mode',\n execute: (_args, ctx) => {\n ctx.setNoConfirm(!ctx.noConfirm);\n return ` Auto-confirm ${!ctx.noConfirm ? 'on' : 'off'}`;\n },\n },\n {\n name: 'init',\n description: 'Initialize AGI.md and .agi/ project structure',\n execute: () => {\n const created = initProject();\n if (created.length === 0) {\n return ' Project already initialized — AGI.md and .agi/ exist.';\n }\n const lines = ['', ' Initialized project:', ''];\n for (const item of created) {\n lines.push(` \\u2714 Created ${item}`);\n }\n lines.push('');\n lines.push(' Edit AGI.md to add project instructions for the agent.');\n lines.push(' Add custom commands in .agi/commands/*.md');\n lines.push(' Add rules in .agi/rules/*.md');\n lines.push(' Add skills in .agi/skills/<name>/SKILL.md');\n lines.push('');\n return lines.join('\\n');\n },\n },\n {\n name: 'doctor',\n aliases: ['check'],\n description: 'Check system health and configuration',\n execute: (_args, ctx) => {\n const checks: Array<{ label: string; ok: boolean; detail: string }> = [];\n\n // API key\n const hasKey = !!(process.env.AGI_API_KEY || process.env.ANTHROPIC_API_KEY);\n checks.push({\n label: 'API key',\n ok: hasKey,\n detail: hasKey ? 'configured' : 'missing — run `agi login` or set AGI_API_KEY',\n });\n\n // Driver binary\n const hasDriver = isBinaryAvailable();\n checks.push({\n label: 'Driver binary',\n ok: hasDriver,\n detail: hasDriver ? 'found' : 'not found — reinstall @agi_inc/cli',\n });\n\n // Node.js version\n const nodeVer = process.versions.node;\n const [major] = nodeVer.split('.').map(Number);\n checks.push({\n label: 'Node.js',\n ok: major >= 18,\n detail: `v${nodeVer}${major < 18 ? ' — v18+ required' : ''}`,\n });\n\n // Project config\n if (ctx.projectConfig) {\n checks.push({\n label: 'Project instructions',\n ok: !!ctx.projectConfig.instructions,\n detail: ctx.projectConfig.instructionsPath?.replace(process.cwd(), '.') || 'none — run /init',\n });\n }\n\n const lines = ['', ' System health:', ''];\n for (const check of checks) {\n const icon = check.ok ? '\\u2714' : '\\u2718';\n const color = check.ok ? '' : ''; // Colors handled by Ink, here just text\n lines.push(` ${icon} ${check.label.padEnd(22)} ${check.detail}`);\n }\n\n const allOk = checks.every((c) => c.ok);\n lines.push('');\n lines.push(allOk ? ' All checks passed.' : ' Some checks failed — see above.');\n lines.push('');\n\n return lines.join('\\n');\n },\n },\n {\n name: 'skills',\n description: 'List discovered skills',\n execute: (_args, ctx) => {\n if (!ctx.projectConfig) return ' No project config loaded.';\n return formatSkillsList(ctx.projectConfig.skills);\n },\n },\n {\n name: 'config',\n aliases: ['cfg'],\n description: 'Show or set persistent config',\n usage: '[key] [value]',\n execute: (args) => {\n const parts = args.trim().split(/\\s+/);\n if (!args.trim()) {\n const config = loadUserConfig();\n return formatConfig(config);\n }\n if (parts.length === 1) {\n const config = loadUserConfig();\n const val = (config as Record<string, unknown>)[parts[0]];\n if (val === undefined) return ` ${parts[0]} is not set`;\n return ` ${parts[0]} = ${String(val)}`;\n }\n return setConfigValue(parts[0], parts.slice(1).join(' '));\n },\n },\n {\n name: 'redo',\n aliases: ['r'],\n description: 'Re-run the last goal',\n execute: (_args, ctx) => {\n if (!ctx.lastGoal) return ' No previous goal to re-run.';\n if (!ctx.runGoal) return ' Error: cannot run goals in this context';\n ctx.runGoal(ctx.lastGoal);\n return null;\n },\n },\n {\n name: 'hooks',\n description: 'Show configured hooks',\n execute: () => {\n return formatHooks();\n },\n },\n {\n name: 'bug',\n description: 'Report a bug or issue',\n execute: () => {\n return [\n '',\n ' Report issues at:',\n ' https://github.com/agi-inc/cli/issues',\n '',\n ' Include: agi version, OS, Node.js version, and steps to reproduce.',\n ' Run /doctor to check your environment.',\n '',\n ].join('\\n');\n },\n },\n {\n name: 'clear',\n aliases: ['c'],\n description: 'Clear the event log',\n execute: (_args, ctx) => {\n ctx.clearEvents();\n return null;\n },\n },\n {\n name: 'quit',\n aliases: ['q', 'exit'],\n description: 'Exit agi',\n execute: (_args, ctx) => {\n ctx.quit();\n return null;\n },\n },\n];\n\n/** Parse simple YAML frontmatter from a markdown file */\nfunction parseFrontmatter(content: string): { meta: Record<string, string>; body: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) return { meta: {}, body: content.trim() };\n\n const meta: Record<string, string> = {};\n for (const line of match[1].split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n meta[key] = value;\n }\n }\n\n return { meta, body: match[2].trim() };\n}\n\n/** Load user-defined commands from .agi/commands/*.md files */\nexport function loadUserCommands(commandFiles: string[]): SlashCommand[] {\n const userCommands: SlashCommand[] = [];\n\n for (const filePath of commandFiles) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const { meta, body } = parseFrontmatter(content);\n const name = basename(filePath, '.md');\n const description = meta['description'] || body.split('\\n')[0].slice(0, 60);\n const usage = meta['argument-hint'];\n\n userCommands.push({\n name,\n description,\n usage,\n isUserDefined: true,\n prompt: body,\n execute: (args, ctx) => {\n if (!ctx.runGoal) return ` Error: cannot run custom commands in this context`;\n // Substitute $ARGUMENTS and $1, $2, etc.\n let prompt = body;\n prompt = prompt.replace(/\\$ARGUMENTS/g, args);\n const argParts = args.split(/\\s+/).filter(Boolean);\n for (let i = 0; i < argParts.length; i++) {\n prompt = prompt.replace(new RegExp(`\\\\$${i + 1}`, 'g'), argParts[i]);\n }\n ctx.runGoal(prompt);\n return null;\n },\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return userCommands;\n}\n\n/** Create slash commands from discovered skills */\nexport function loadSkillCommands(skills: SkillMetadata[]): SlashCommand[] {\n return skills\n .filter((s) => s.userInvocable)\n .map((skill) => ({\n name: skill.name,\n description: skill.description,\n usage: skill.argumentHint,\n isSkill: true,\n execute: (args: string, ctx: CommandContext) => {\n if (!ctx.runGoal) return ` Error: cannot run skill commands in this context`;\n // Load full skill body (tier 2)\n const loaded = loadSkill(skill);\n let prompt = loaded.body;\n // Substitute arguments\n prompt = prompt.replace(/\\$ARGUMENTS/g, args);\n const argParts = args.split(/\\s+/).filter(Boolean);\n for (let i = 0; i < argParts.length; i++) {\n prompt = prompt.replace(new RegExp(`\\\\$${i + 1}`, 'g'), argParts[i]);\n }\n ctx.runGoal(prompt);\n return null;\n },\n }));\n}\n\n/** Mutable registry that includes built-in, user-defined, and skill commands */\nlet allCommands: SlashCommand[] = [...builtinCommands];\nlet commandMap = new Map<string, SlashCommand>();\n\nfunction rebuildMap(): void {\n commandMap = new Map();\n for (const cmd of allCommands) {\n commandMap.set(cmd.name, cmd);\n if (cmd.aliases) {\n for (const alias of cmd.aliases) {\n commandMap.set(alias, cmd);\n }\n }\n }\n}\n\n// Initialize with builtins\nrebuildMap();\n\n/** Register additional commands (called during app init with user commands + skills) */\nexport function registerCommands(cmds: SlashCommand[]): void {\n allCommands = [...builtinCommands, ...cmds];\n rebuildMap();\n}\n\nexport interface ParsedCommand {\n command: SlashCommand;\n args: string;\n}\n\n/**\n * Attempt to parse a user input string as a slash command.\n * Returns the command and arguments if it matches, or null if not a command.\n */\nexport function parseSlashCommand(input: string): ParsedCommand | null {\n if (!input.startsWith('/')) return null;\n\n const trimmed = input.slice(1);\n const spaceIdx = trimmed.indexOf(' ');\n const name = spaceIdx === -1 ? trimmed.toLowerCase() : trimmed.slice(0, spaceIdx).toLowerCase();\n const args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1).trim();\n\n const cmd = commandMap.get(name);\n if (!cmd) return null;\n\n return { command: cmd, args };\n}\n\n/** Get all commands for autocomplete/display purposes */\nexport function getAllCommands(): SlashCommand[] {\n return allCommands;\n}\n","/**\n * Persistent session history.\n *\n * Stores past goals/tasks in ~/.agi/history.json so users can recall\n * previous sessions with /history.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface HistoryEntry {\n timestamp: string;\n goal: string;\n model: string;\n durationMs?: number;\n success?: boolean;\n}\n\nconst HISTORY_DIR = path.join(os.homedir(), '.agi');\nconst HISTORY_FILE = path.join(HISTORY_DIR, 'history.json');\nconst MAX_ENTRIES = 200;\n\nfunction ensureDir(): void {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function loadHistory(): HistoryEntry[] {\n try {\n const raw = fs.readFileSync(HISTORY_FILE, 'utf-8');\n const data = JSON.parse(raw);\n if (Array.isArray(data)) return data;\n } catch {\n // File missing or corrupt\n }\n return [];\n}\n\nexport function appendHistory(entry: HistoryEntry): void {\n ensureDir();\n const history = loadHistory();\n history.push(entry);\n // Keep only the latest entries\n const trimmed = history.slice(-MAX_ENTRIES);\n fs.writeFileSync(HISTORY_FILE, JSON.stringify(trimmed, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\nexport function clearHistory(): void {\n try {\n fs.unlinkSync(HISTORY_FILE);\n } catch {\n // Already gone\n }\n}\n\n/** Format history entries for display */\nexport function formatHistory(entries: HistoryEntry[], limit = 20): string {\n if (entries.length === 0) return ' No history yet.';\n\n const recent = entries.slice(-limit).reverse();\n const lines: string[] = ['', ' Recent sessions:', ''];\n\n for (const entry of recent) {\n const date = new Date(entry.timestamp);\n const timeStr = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n }) + ' ' + date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n\n const status = entry.success === true\n ? '\\u25CF' // ●\n : entry.success === false\n ? '\\u2715' // ✕\n : '\\u25CB'; // ○\n\n const duration = entry.durationMs\n ? ` (${Math.round(entry.durationMs / 1000)}s)`\n : '';\n\n const goal = entry.goal.length > 55\n ? entry.goal.slice(0, 55) + '\\u2026'\n : entry.goal;\n\n lines.push(` ${status} ${timeStr} ${goal}${duration}`);\n }\n\n lines.push('');\n if (entries.length > limit) {\n lines.push(` Showing ${limit} of ${entries.length} entries`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Project instructions and configuration loader.\n *\n * Follows the agentskills.io convention: looks for AGI.md and .agi/\n * directory in the current working directory to load project-specific\n * instructions for the agent.\n *\n * Search order for instructions:\n * 1. AGI.md in cwd\n * 2. .agi/AGI.md\n * 3. .agi/instructions.md\n *\n * Additionally loads:\n * - .agi/rules/*.md — modular topic-specific project rules\n * - .agi/commands/*.md — user-defined slash commands\n * - .agi/skills/ — agentskills.io skill directories\n */\n\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { SkillMetadata } from './skills.js';\nimport { discoverSkills, generateSkillsPrompt } from './skills.js';\n\nexport interface ProjectConfig {\n /** Project instructions to prepend to the agent goal */\n instructions: string | null;\n /** Path where instructions were found */\n instructionsPath: string | null;\n /** Root of the .agi directory, if it exists */\n agiDir: string | null;\n /** User-defined command files found in .agi/commands/ */\n commandFiles: string[];\n /** Loaded rule files from .agi/rules/ */\n rules: RuleFile[];\n /** Discovered skills (metadata only — tier 1) */\n skills: SkillMetadata[];\n}\n\nexport interface RuleFile {\n /** Name derived from filename */\n name: string;\n /** Full path to the rule file */\n path: string;\n /** Content of the rule */\n content: string;\n /** Optional glob patterns — rule only applies to matching paths */\n paths?: string[];\n}\n\nconst INSTRUCTION_FILES = ['AGI.md', '.agi/AGI.md', '.agi/instructions.md'];\n\n// ── Rule file loader ───────────────────────────────────────────────\n\nfunction loadRules(cwd: string): RuleFile[] {\n const rulesDir = join(cwd, '.agi', 'rules');\n if (!existsSync(rulesDir)) return [];\n\n const rules: RuleFile[] = [];\n\n try {\n const files = readdirSync(rulesDir).filter((f) => f.endsWith('.md')).sort();\n\n for (const file of files) {\n const filePath = join(rulesDir, file);\n try {\n const raw = readFileSync(filePath, 'utf-8');\n const name = basename(file, '.md');\n\n // Check for optional frontmatter with paths filter\n let content = raw.trim();\n let paths: string[] | undefined;\n\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (fmMatch) {\n const meta = fmMatch[1];\n content = fmMatch[2].trim();\n\n // Parse paths from frontmatter\n const pathsMatch = meta.match(/^paths:\\s*(.+)$/m);\n if (pathsMatch) {\n paths = pathsMatch[1]\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n }\n }\n\n if (content) {\n rules.push({ name, path: filePath, content, paths });\n }\n } catch {\n // Skip unreadable files\n }\n }\n } catch {\n // Skip unreadable directories\n }\n\n return rules;\n}\n\n// ── Main loader ────────────────────────────────────────────────────\n\n/**\n * Load project configuration from the current working directory.\n */\nexport function loadProjectConfig(cwd: string = process.cwd()): ProjectConfig {\n let instructions: string | null = null;\n let instructionsPath: string | null = null;\n\n // Find the first instruction file that exists\n for (const relPath of INSTRUCTION_FILES) {\n const fullPath = join(cwd, relPath);\n if (existsSync(fullPath)) {\n try {\n instructions = readFileSync(fullPath, 'utf-8').trim();\n instructionsPath = fullPath;\n break;\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // Check for .agi directory\n const agiDir = join(cwd, '.agi');\n const agiDirExists = existsSync(agiDir);\n\n // Scan for command files\n const commandFiles: string[] = [];\n const commandsDir = join(cwd, '.agi', 'commands');\n if (existsSync(commandsDir)) {\n try {\n const files = readdirSync(commandsDir);\n for (const file of files) {\n if (file.endsWith('.md')) {\n commandFiles.push(join(commandsDir, file));\n }\n }\n } catch {\n // Skip unreadable directories\n }\n }\n\n // Load rules\n const rules = loadRules(cwd);\n\n // Discover skills (tier 1 — metadata only)\n const skills = discoverSkills(cwd);\n\n return {\n instructions,\n instructionsPath,\n agiDir: agiDirExists ? agiDir : null,\n commandFiles,\n rules,\n skills,\n };\n}\n\n// ── Prompt generation ──────────────────────────────────────────────\n\n/**\n * Format project instructions as a prefix for the agent goal.\n * Includes: AGI.md instructions, rules, and skill metadata.\n */\nexport function withProjectInstructions(goal: string, config: ProjectConfig): string {\n const sections: string[] = [];\n\n // Main instructions\n if (config.instructions) {\n sections.push(\n '--- Project Instructions (from ' + (config.instructionsPath ?? 'AGI.md') + ') ---',\n config.instructions,\n '--- End Project Instructions ---',\n );\n }\n\n // Rules\n if (config.rules.length > 0) {\n sections.push('--- Project Rules ---');\n for (const rule of config.rules) {\n sections.push(`[${rule.name}]`);\n sections.push(rule.content);\n sections.push('');\n }\n sections.push('--- End Project Rules ---');\n }\n\n // Skills metadata (tier 1)\n if (config.skills.length > 0) {\n sections.push(generateSkillsPrompt(config.skills));\n }\n\n if (sections.length === 0) return goal;\n\n sections.push('', 'Task: ' + goal);\n return sections.join('\\n');\n}\n\n// ── Project initialization ─────────────────────────────────────────\n\nimport { mkdirSync, writeFileSync } from 'node:fs';\n\n/**\n * Initialize a .agi/ project structure in the given directory.\n * Creates AGI.md and .agi/ subdirectories if they don't exist.\n */\nexport function initProject(cwd: string = process.cwd()): string[] {\n const created: string[] = [];\n\n // Create AGI.md if it doesn't exist\n const agiMd = join(cwd, 'AGI.md');\n if (!existsSync(agiMd)) {\n writeFileSync(\n agiMd,\n [\n '# Project Instructions',\n '',\n '<!-- Add project-specific instructions for the AGI agent here. -->',\n '<!-- These instructions are loaded automatically when you run `agi`. -->',\n '',\n ].join('\\n'),\n );\n created.push('AGI.md');\n }\n\n // Create .agi/ directories\n const dirs = [\n '.agi',\n '.agi/commands',\n '.agi/rules',\n '.agi/skills',\n ];\n\n for (const dir of dirs) {\n const fullPath = join(cwd, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(dir + '/');\n }\n }\n\n // Create .gitignore in .agi/ if it doesn't exist\n const gitignore = join(cwd, '.agi', '.gitignore');\n if (!existsSync(gitignore)) {\n writeFileSync(\n gitignore,\n [\n '# Local files that should not be committed',\n 'local.md',\n '',\n ].join('\\n'),\n );\n created.push('.agi/.gitignore');\n }\n\n return created;\n}\n","/**\n * Agent Skills (agentskills.io) implementation.\n *\n * Discovers, parses, and manages SKILL.md files following the\n * agentskills.io specification. Supports progressive disclosure:\n *\n * 1. Metadata (~100 tokens) — name + description loaded at startup\n * 2. Instructions (<5000 tokens) — full SKILL.md body on activation\n * 3. Resources (on demand) — scripts/, references/, assets/\n *\n * Skill locations (priority order):\n * - ~/.agi/skills/<name>/SKILL.md (personal / user-level)\n * - .agi/skills/<name>/SKILL.md (project-level)\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface SkillMetadata {\n /** Skill name (must match directory name, lowercase + hyphens) */\n name: string;\n /** Short description of what the skill does */\n description: string;\n /** Path to the SKILL.md file */\n path: string;\n /** Root directory of the skill */\n root: string;\n /** Whether this is a user-level (personal) or project-level skill */\n scope: 'personal' | 'project';\n /** Optional license */\n license?: string;\n /** Optional compatibility requirements */\n compatibility?: string;\n /** Whether the skill can be invoked as /name */\n userInvocable: boolean;\n /** Argument hint for autocomplete */\n argumentHint?: string;\n /** Arbitrary metadata from frontmatter */\n metadata?: Record<string, string>;\n}\n\nexport interface LoadedSkill extends SkillMetadata {\n /** Full body content of SKILL.md (loaded on activation) */\n body: string;\n}\n\n// ── Frontmatter parser ─────────────────────────────────────────────\n\ninterface Frontmatter {\n meta: Record<string, string>;\n body: string;\n}\n\nfunction parseFrontmatter(content: string): Frontmatter {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) return { meta: {}, body: content.trim() };\n\n const meta: Record<string, string> = {};\n for (const line of match[1].split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n meta[key] = value;\n }\n }\n\n return { meta, body: match[2].trim() };\n}\n\n// ── Validation ─────────────────────────────────────────────────────\n\nconst NAME_RE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n\nfunction isValidSkillName(name: string): boolean {\n if (name.length > 64) return false;\n if (!NAME_RE.test(name)) return false;\n if (name.includes('--')) return false;\n return true;\n}\n\n// ── Discovery ──────────────────────────────────────────────────────\n\nfunction discoverSkillsInDir(\n skillsDir: string,\n scope: 'personal' | 'project',\n): SkillMetadata[] {\n const skills: SkillMetadata[] = [];\n\n if (!fs.existsSync(skillsDir)) return skills;\n\n let entries: string[];\n try {\n entries = fs.readdirSync(skillsDir);\n } catch {\n return skills;\n }\n\n for (const entry of entries) {\n const skillDir = path.join(skillsDir, entry);\n const skillFile = path.join(skillDir, 'SKILL.md');\n\n // Must be a directory containing SKILL.md\n try {\n if (!fs.statSync(skillDir).isDirectory()) continue;\n if (!fs.existsSync(skillFile)) continue;\n } catch {\n continue;\n }\n\n // Validate directory name\n if (!isValidSkillName(entry)) continue;\n\n // Parse metadata (tier 1 — only frontmatter)\n try {\n const content = fs.readFileSync(skillFile, 'utf-8');\n const { meta } = parseFrontmatter(content);\n\n // Name in frontmatter must match directory name (if specified)\n const name = meta['name'] || entry;\n if (name !== entry) continue;\n\n const description = meta['description'] || '';\n if (!description) continue; // Description is required\n\n skills.push({\n name,\n description,\n path: skillFile,\n root: skillDir,\n scope,\n license: meta['license'],\n compatibility: meta['compatibility'],\n userInvocable: meta['user-invocable'] !== 'false',\n argumentHint: meta['argument-hint'],\n metadata: Object.keys(meta).length > 0 ? meta : undefined,\n });\n } catch {\n // Skip unreadable skills\n }\n }\n\n return skills;\n}\n\n/**\n * Discover all available skills from personal and project locations.\n * Project skills override personal skills with the same name.\n */\nexport function discoverSkills(cwd: string = process.cwd()): SkillMetadata[] {\n const personalDir = path.join(os.homedir(), '.agi', 'skills');\n const projectDir = path.join(cwd, '.agi', 'skills');\n\n const personal = discoverSkillsInDir(personalDir, 'personal');\n const project = discoverSkillsInDir(projectDir, 'project');\n\n // Project skills override personal skills with the same name\n const byName = new Map<string, SkillMetadata>();\n for (const skill of personal) byName.set(skill.name, skill);\n for (const skill of project) byName.set(skill.name, skill);\n\n return Array.from(byName.values());\n}\n\n// ── Loading (tier 2) ───────────────────────────────────────────────\n\n/**\n * Load the full body of a skill (tier 2 — instructions).\n */\nexport function loadSkill(skill: SkillMetadata): LoadedSkill {\n const content = fs.readFileSync(skill.path, 'utf-8');\n const { body } = parseFrontmatter(content);\n return { ...skill, body };\n}\n\n// ── Prompt generation ──────────────────────────────────────────────\n\n/**\n * Generate the available_skills context block for the agent system prompt.\n * This is the tier-1 metadata (~100 tokens per skill).\n */\nexport function generateSkillsPrompt(skills: SkillMetadata[]): string {\n if (skills.length === 0) return '';\n\n const lines = ['<available_skills>'];\n for (const skill of skills) {\n lines.push(' <skill>');\n lines.push(` <name>${skill.name}</name>`);\n lines.push(` <description>${skill.description}</description>`);\n lines.push(` <location>${skill.path}</location>`);\n lines.push(' </skill>');\n }\n lines.push('</available_skills>');\n return lines.join('\\n');\n}\n\n/**\n * Generate a display-friendly list of skills.\n */\nexport function formatSkillsList(skills: SkillMetadata[]): string {\n if (skills.length === 0) return ' No skills found.';\n\n const lines: string[] = ['', ' Available skills:', ''];\n\n for (const skill of skills) {\n const scope = skill.scope === 'personal' ? '~' : '.';\n const hint = skill.argumentHint ? ` ${skill.argumentHint}` : '';\n lines.push(` ${scope} /${skill.name}${hint}`);\n lines.push(` ${skill.description}`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\n// ── Resource listing (tier 3) ──────────────────────────────────────\n\nexport interface SkillResource {\n type: 'script' | 'reference' | 'asset';\n name: string;\n path: string;\n}\n\n/**\n * List resources available in a skill directory.\n */\nexport function listSkillResources(skill: SkillMetadata): SkillResource[] {\n const resources: SkillResource[] = [];\n\n const dirs: Array<{ dir: string; type: SkillResource['type'] }> = [\n { dir: 'scripts', type: 'script' },\n { dir: 'references', type: 'reference' },\n { dir: 'assets', type: 'asset' },\n ];\n\n for (const { dir, type } of dirs) {\n const fullDir = path.join(skill.root, dir);\n if (!fs.existsSync(fullDir)) continue;\n\n try {\n const files = fs.readdirSync(fullDir);\n for (const file of files) {\n resources.push({\n type,\n name: file,\n path: path.join(fullDir, file),\n });\n }\n } catch {\n // Skip unreadable directories\n }\n }\n\n return resources;\n}\n","/**\n * Persistent user configuration.\n *\n * Stored in ~/.agi/config.json — survives across sessions.\n * Provides defaults that can be overridden by CLI args or /config command.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface UserConfig {\n /** Default model */\n model?: string;\n /** Default verbose mode */\n verbose?: boolean;\n /** Default auto-confirm */\n noConfirm?: boolean;\n /** Default compact mode */\n compact?: boolean;\n /** Custom theme/mood for the logo */\n theme?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.agi');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n\nconst VALID_KEYS: Array<keyof UserConfig> = [\n 'model',\n 'verbose',\n 'noConfirm',\n 'compact',\n 'theme',\n];\n\nfunction ensureDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function loadUserConfig(): UserConfig {\n try {\n const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nexport function saveUserConfig(config: UserConfig): void {\n ensureDir();\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', {\n mode: 0o600,\n });\n}\n\nexport function setConfigValue(key: string, value: string): string {\n if (!VALID_KEYS.includes(key as keyof UserConfig)) {\n return ` Unknown key \"${key}\". Valid keys: ${VALID_KEYS.join(', ')}`;\n }\n\n const config = loadUserConfig();\n\n // Parse value based on key type\n if (key === 'verbose' || key === 'noConfirm' || key === 'compact') {\n const bool = value.toLowerCase();\n if (bool !== 'true' && bool !== 'false' && bool !== 'on' && bool !== 'off') {\n return ` \"${key}\" must be true/false or on/off`;\n }\n (config as Record<string, unknown>)[key] = bool === 'true' || bool === 'on';\n } else {\n (config as Record<string, unknown>)[key] = value;\n }\n\n saveUserConfig(config);\n return ` Config: ${key} = ${value} (saved to ~/.agi/config.json)`;\n}\n\nexport function formatConfig(config: UserConfig): string {\n const lines: string[] = ['', ' User configuration (~/.agi/config.json):', ''];\n\n if (Object.keys(config).length === 0) {\n lines.push(' (no custom configuration — using defaults)');\n } else {\n for (const [key, value] of Object.entries(config)) {\n lines.push(` ${key.padEnd(14)} ${String(value)}`);\n }\n }\n\n lines.push('');\n lines.push(' Set with: /config <key> <value>');\n lines.push(` Keys: ${VALID_KEYS.join(', ')}`);\n lines.push('');\n return lines.join('\\n');\n}\n","/**\n * Hook system for agi-cli.\n *\n * Hooks allow running scripts at specific lifecycle events:\n * - SessionStart — when the CLI starts\n * - PreAction — before the agent executes a desktop action\n * - PostAction — after an action completes\n * - TaskComplete — when a goal finishes (success or failure)\n *\n * Hooks are defined in .agi/hooks.json:\n * {\n * \"hooks\": {\n * \"SessionStart\": [\n * { \"command\": \"echo 'session started'\" }\n * ],\n * \"TaskComplete\": [\n * { \"command\": \"notify-send 'AGI' 'Task completed'\" }\n * ]\n * }\n * }\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport type HookEvent = 'SessionStart' | 'PreAction' | 'PostAction' | 'TaskComplete';\n\ninterface HookEntry {\n command: string;\n}\n\ninterface HooksConfig {\n hooks: Partial<Record<HookEvent, HookEntry[]>>;\n}\n\nlet loadedHooks: HooksConfig | null = null;\n\n/**\n * Load hooks from .agi/hooks.json in the given directory.\n */\nexport function loadHooks(cwd: string = process.cwd()): HooksConfig {\n if (loadedHooks) return loadedHooks;\n\n const hooksFile = path.join(cwd, '.agi', 'hooks.json');\n try {\n const raw = fs.readFileSync(hooksFile, 'utf-8');\n loadedHooks = JSON.parse(raw);\n return loadedHooks!;\n } catch {\n loadedHooks = { hooks: {} };\n return loadedHooks;\n }\n}\n\n/**\n * Execute all hooks registered for the given event.\n * Hooks run synchronously and silently — errors are swallowed.\n */\nexport function runHooks(\n event: HookEvent,\n env: Record<string, string> = {},\n): void {\n const config = loadedHooks || loadHooks();\n const entries = config.hooks[event];\n if (!entries || entries.length === 0) return;\n\n for (const entry of entries) {\n try {\n execSync(entry.command, {\n stdio: 'ignore',\n timeout: 5000,\n env: { ...process.env, ...env, AGI_HOOK_EVENT: event },\n });\n } catch {\n // Hooks should not block the CLI — silently continue\n }\n }\n}\n\n/**\n * Format hooks config for display.\n */\nexport function formatHooks(): string {\n const config = loadedHooks || loadHooks();\n const events = Object.keys(config.hooks) as HookEvent[];\n\n if (events.length === 0) {\n return ' No hooks configured. Add hooks in .agi/hooks.json';\n }\n\n const lines: string[] = ['', ' Configured hooks:', ''];\n for (const event of events) {\n const entries = config.hooks[event] || [];\n lines.push(` ${event} (${entries.length} hook${entries.length !== 1 ? 's' : ''}):`);\n for (const entry of entries) {\n lines.push(` \\u25B8 ${entry.command}`);\n }\n }\n lines.push('');\n return lines.join('\\n');\n}\n","import React from 'react';\nimport { Text, Box } from 'ink';\nimport InkSpinner from 'ink-spinner';\n\ninterface SpinnerProps {\n text?: string;\n}\n\nexport const Spinner: React.FC<SpinnerProps> = ({ text }) => {\n return (\n <Box>\n <Text color=\"cyan\">\n <InkSpinner type=\"dots\" />\n </Text>\n {text && <Text dimColor> {text}</Text>}\n </Box>\n );\n};\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Text, Box } from 'ink';\n\n// ── Block character set (CP437 style) ──────────────────────────────\nconst BLOCK_CHARS = ' \\u2591\\u2592\\u2593\\u2588'; // ' ░▒▓█'\n\n// ── Base logo shape ────────────────────────────────────────────────\n// Generated from the_agi_company_logo.jpg with CP437 ramp\n// 24 chars wide × 5 lines – trimmed bounding box of the infinity symbol\nconst BASE_LOGO = [\n ' \\u2588\\u2588\\u2588\\u2588\\u2591 \\u2588\\u2588\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2592 \\u2588\\u2588\\u2588 \\u2591\\u2588\\u2588 \\u2588\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2588 \\u2591\\u2588\\u2588\\u2588 \\u2588\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2588 \\u2588\\u2588 \\u2588\\u2588\\u2588 \\u2592\\u2588\\u2588 ',\n ' \\u2588\\u2588\\u2588\\u2588 \\u2591\\u2588\\u2588\\u2588\\u2588 ',\n];\n\n// Parse base into intensity grid (0–4) and active mask\nconst BASE_GRID: number[][] = BASE_LOGO.map((line) =>\n [...line].map((ch) => {\n const idx = BLOCK_CHARS.indexOf(ch);\n return idx >= 0 ? idx : 0;\n }),\n);\nconst MASK: boolean[][] = BASE_GRID.map((row) => row.map((v) => v > 0));\nconst WIDTH = BASE_GRID[0].length;\n\n// ── Mood / affective state system ──────────────────────────────────\nexport type LogoMood = 'idle' | 'thinking' | 'active' | 'success' | 'error';\n\ninterface MoodConfig {\n /** Primary wave speed (cycles per second) */\n speed: number;\n /** Intensity variation from wave */\n amplitude: number;\n /** High-frequency shimmer amount */\n shimmer: number;\n /** Global breathing amplitude */\n breathe: number;\n /** Breathing speed (cycles per second) */\n breatheSpeed: number;\n /** Animation frames per second — lower = fewer re-renders = less flicker */\n fps: number;\n /** Color gradient from dim (index 0) to bright (index 4) */\n colors: string[];\n}\n\nconst MOODS: Record<LogoMood, MoodConfig> = {\n idle: {\n speed: 0.3,\n amplitude: 1.2,\n shimmer: 0.3,\n breathe: 0.5,\n breatheSpeed: 0.15,\n fps: 3,\n colors: ['#005566', '#008899', '#00aacc', '#00ccee', '#66eeff'],\n },\n thinking: {\n speed: 1.5,\n amplitude: 1.8,\n shimmer: 0.6,\n breathe: 0.3,\n breatheSpeed: 0.4,\n fps: 10,\n colors: ['#665500', '#998800', '#ccaa00', '#eedd00', '#ffff44'],\n },\n active: {\n speed: 0.8,\n amplitude: 1.0,\n shimmer: 0.2,\n breathe: 0.4,\n breatheSpeed: 0.25,\n fps: 12,\n colors: ['#004400', '#007700', '#00aa00', '#00dd00', '#44ff66'],\n },\n success: {\n speed: 0.2,\n amplitude: 0.6,\n shimmer: 0.1,\n breathe: 0.6,\n breatheSpeed: 0.1,\n fps: 3,\n colors: ['#005500', '#008800', '#00bb00', '#00ee00', '#66ff88'],\n },\n error: {\n speed: 2.5,\n amplitude: 2.0,\n shimmer: 0.8,\n breathe: 0.2,\n breatheSpeed: 0.6,\n fps: 15,\n colors: ['#660000', '#990000', '#cc0000', '#ff2200', '#ff6644'],\n },\n};\n\n// ── Animation math ─────────────────────────────────────────────────\n\ninterface AnimatedCell {\n char: string;\n color: string;\n}\n\nfunction computeFrame(time: number, cfg: MoodConfig): AnimatedCell[][] {\n // Global breathing oscillation\n const breathe =\n Math.sin(time * cfg.breatheSpeed * Math.PI * 2) * cfg.breathe;\n\n return BASE_GRID.map((row, r) =>\n row.map((base, c) => {\n if (!MASK[r][c]) return { char: ' ', color: '' };\n\n // Horizontal flow wave with slight diagonal skew\n const phase = (c / WIDTH + r * 0.08) - time * cfg.speed;\n const wave = Math.sin(phase * Math.PI * 2) * cfg.amplitude;\n\n // High-frequency shimmer\n const shimmer =\n Math.sin(c * 7.3 + r * 13.1 + time * 5.7) * cfg.shimmer;\n\n // Combine and clamp to 1–4 (never go below ░ for active cells)\n const raw = base + wave + shimmer + breathe;\n const intensity = Math.max(1, Math.min(4, Math.round(raw)));\n\n return {\n char: BLOCK_CHARS[intensity],\n color: cfg.colors[intensity],\n };\n }),\n );\n}\n\n// ── Component ──────────────────────────────────────────────────────\n\ninterface LogoProps {\n version: string;\n model: string;\n cwd?: string;\n mood?: LogoMood;\n}\n\nexport const Logo: React.FC<LogoProps> = ({\n version,\n model,\n cwd,\n mood = 'idle',\n}) => {\n const [time, setTime] = useState(() => Date.now() / 1000);\n const cfg = MOODS[mood];\n\n // Mood-dependent FPS — idle/success are slow (3 FPS) to avoid flicker while typing\n useEffect(() => {\n const interval = Math.round(1000 / cfg.fps);\n const id = setInterval(() => setTime(Date.now() / 1000), interval);\n return () => clearInterval(id);\n }, [cfg.fps]);\n\n const cells = useMemo(() => computeFrame(time, cfg), [time, cfg]);\n\n const shortCwd = cwd\n ? cwd.replace(process.env.HOME || '', '~')\n : undefined;\n\n // Info lines aligned to logo rows (5 rows)\n const info: Array<React.ReactNode | null> = [\n null, // top padding row\n <><Text color=\"cyan\" bold>AGI</Text><Text dimColor>{' v'}{version}</Text></>,\n <Text>{model}</Text>,\n shortCwd ? <Text dimColor>{shortCwd}</Text> : null,\n null, // bottom padding row\n ];\n\n return (\n <Box flexDirection=\"column\">\n {cells.map((row, r) => (\n <Box key={r}>\n <Text>\n {row.map((cell, c) =>\n cell.char === ' ' ? (\n <Text key={c}>{' '}</Text>\n ) : (\n <Text key={c} color={cell.color}>\n {cell.char}\n </Text>\n ),\n )}\n </Text>\n {info[r] != null && (\n <>\n <Text>{' '}</Text>\n {info[r]}\n </>\n )}\n </Box>\n ))}\n </Box>\n );\n};\n"],"mappings":";AAWA,OAAOA,aAAW;AAClB,SAAS,cAAc;AACvB,SAAS,qBAAAC,0BAAyB;;;ACTlC,OAAO,WAAW;AAClB,SAAS,eAAe;;;ACCxB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAMR,SAAS,qBAA6B;AAC3C,SAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ,aAAa;AACtD;AAMO,SAAS,aAAiC;AAC/C,MAAI,QAAQ,IAAI,aAAa;AAC3B,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,MAAI,QAAQ,IAAI,mBAAmB;AACjC,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,QAAM,WAAW,mBAAmB;AACpC,MAAI;AACF,UAAM,MAAM,GAAG,aAAa,UAAU,OAAO;AAC7C,UAAM,cAA2B,KAAK,MAAM,GAAG;AAC/C,QAAI,YAAY,SAAS;AACvB,aAAO,YAAY;AAAA,IACrB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAMO,SAAS,WAAW,QAAsB;AAC/C,QAAM,WAAW,mBAAmB;AACpC,QAAM,MAAM,KAAK,QAAQ,QAAQ;AAEjC,MAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,OAAG,UAAU,KAAK,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACpD;AAEA,QAAM,cAA2B,EAAE,SAAS,OAAO;AACnD,KAAG,cAAc,UAAU,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,MAAM;AAAA,IACtE,MAAM;AAAA,EACR,CAAC;AACH;AAKO,SAAS,oBAA6B;AAC3C,QAAM,WAAW,mBAAmB;AACpC,MAAI;AACF,OAAG,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC/DA,IAAM,WAAW;AAejB,eAAe,YAAY,KAA4B;AACrD,QAAM,QAAQ,MAAM,OAAO,MAAM,GAAG;AACpC,QAAM,KAAK,GAAG;AAChB;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,eAAsB,eAA8B;AAElD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,mBAAmB;AAAA,MACpD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,cAAQ,MAAM,+BAA+B,IAAI,MAAM,MAAM,MAAM,EAAE;AACrE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,iBAAc,MAAM,IAAI,KAAK;AAAA,EAC/B,SAAS,KAAK;AACZ,YAAQ,MAAM,iCAAkC,IAAc,OAAO,EAAE;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,2BAA2B,WAAW,SAAS,EAAE;AAC7D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,iCAAiC;AAC7C,UAAQ,IAAI,KAAK,WAAW,gBAAgB,EAAE;AAC9C,UAAQ,IAAI,EAAE;AAEd,MAAI;AACF,UAAM,YAAY,WAAW,gBAAgB;AAAA,EAC/C,QAAQ;AACN,YAAQ,IAAI,mEAAmE;AAAA,EACjF;AAEA,UAAQ,IAAI,8BAA8B;AAG1C,QAAM,gBAAgB,MAAM;AAC1B,YAAQ,IAAI,oBAAoB;AAChC,YAAQ,KAAK,GAAG;AAAA,EAClB;AACA,UAAQ,GAAG,UAAU,aAAa;AAGlC,QAAM,cAAc,KAAK,KAAK,WAAW,aAAa,WAAW,QAAQ;AACzE,QAAM,WAAW,WAAW,WAAW;AACvC,MAAI,oBAAoB;AAExB,MAAI;AACF,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,YAAM,MAAM,QAAQ;AAEpB,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,yBAAyB;AAAA,UAC1D,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,aAAa,WAAW,YAAY,CAAC;AAAA,QAC9D,CAAC;AAED,4BAAoB;AAEpB,YAAI,IAAI,WAAW,KAAK;AAEtB,kBAAQ,OAAO,MAAM,GAAG;AACxB;AAAA,QACF;AAEA,YAAI,IAAI,WAAW,KAAK;AACtB,kBAAQ,IAAI,EAAE;AACd,kBAAQ,MAAM,8CAA8C;AAC5D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,YAAI,IAAI,IAAI;AACV,gBAAM,QAAS,MAAM,IAAI,KAAK;AAC9B,kBAAQ,IAAI,EAAE;AAEd,qBAAW,MAAM,OAAO;AAExB,gBAAM,WAAW,MAAM,SAAS;AAChC,kBAAQ,IAAI,gBAAgB,QAAQ,EAAE;AACtC,kBAAQ,IAAI,mDAAmD;AAC/D;AAAA,QACF;AAGA,cAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,gBAAQ,IAAI,EAAE;AACd,gBAAQ,MAAM,wBAAwB,IAAI,MAAM,MAAM,MAAM,EAAE;AAC9D,gBAAQ,KAAK,CAAC;AAAA,MAChB,QAAQ;AACN;AACA,YAAI,qBAAqB,GAAG;AAC1B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,MAAM,0DAA0D;AACxE,kBAAQ,MAAM,aAAa;AAC3B,8BAAoB;AAAA,QACtB,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,MAAM,gDAAgD;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB,UAAE;AACA,YAAQ,eAAe,UAAU,aAAa;AAAA,EAChD;AACF;;;AC3IA,eAAsB,gBAA+B;AACnD,QAAM,UAAU,kBAAkB;AAElC,MAAI,SAAS;AACX,YAAQ,IAAI,yDAAyD;AAAA,EACvE,OAAO;AACL,YAAQ,IAAI,gDAAgD;AAAA,EAC9D;AACF;;;ACPA,SAAS,gBAAgB;AACzB,SAAS,cAAc,oBAAoB;AAC3C,SAAS,SAAS,YAAY;AAE9B,SAAS,oBAA4B;AAEnC,QAAM,aAAa,aAAa,QAAQ,KAAK,CAAC,CAAC;AAC/C,QAAM,UAAU,KAAK,QAAQ,UAAU,GAAG,MAAM,cAAc;AAC9D,QAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AACrD,SAAO,IAAI;AACb;AAEA,eAAe,mBAAoC;AACjD,QAAM,MAAM,MAAM,MAAM,yCAAyC;AACjE,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,EAAE;AAAA,EACvD;AACA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,SAAO,KAAK,WAAW,EAAE;AAC3B;AAEA,SAAS,gBAAgB,GAAW,GAAmB;AACrD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAClC,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAClC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,SAAK,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,KAAK,GAAI,QAAO;AACxC,SAAK,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,KAAK,GAAI,QAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,sBAAsD;AAC7D,MAAI;AACF,UAAM,UAAU,SAAS,aAAa,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAClE,QAAI,QAAQ,SAAS,UAAU,KAAK,QAAQ,SAAS,QAAQ,GAAG;AAC9D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBAA+B;AACnD,QAAM,UAAU,kBAAkB;AAElC,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,qBAAqB,OAAO,EAAE;AAC1C,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,2BAA2B;AAEvC,MAAI;AACF,UAAM,SAAS,MAAM,iBAAiB;AAEtC,QAAI,gBAAgB,SAAS,MAAM,KAAK,GAAG;AACzC,cAAQ,IAAI,qBAAqB;AACjC,cAAQ,IAAI,EAAE;AACd;AAAA,IACF;AAEA,YAAQ,IAAI,uBAAuB,OAAO,WAAW,MAAM,EAAE;AAC7D,YAAQ,IAAI,EAAE;AAEd,UAAM,SAAS,oBAAoB;AAEnC,QAAI,WAAW,YAAY;AACzB,cAAQ,IAAI,4BAA4B;AACxC,cAAQ,IAAI,EAAE;AACd,eAAS,oBAAoB,EAAE,OAAO,UAAU,CAAC;AAAA,IACnD,OAAO;AACL,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,IAAI,EAAE;AACd,eAAS,sCAAsC,EAAE,OAAO,UAAU,CAAC;AAAA,IACrE;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,wBAAwB,MAAM,EAAE;AAC5C,YAAQ,IAAI,EAAE;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE;AACzF,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,iBAAiB;AAC/B,YAAQ,MAAM,wCAAwC;AACtD,YAAQ,MAAM,EAAE;AAChB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AJzEA,eAAsB,YAAkC;AACtD,QAAM,OAAO,MAAM,MAAM,QAAQ,QAAQ,IAAI,CAAC,EAC3C,WAAW,KAAK,EAChB,QAAQ,SAAS,sCAAsC,CAAC,GAAG,YAAY;AACtE,UAAM,aAAa;AAAA,EACrB,CAAC,EACA,QAAQ,UAAU,4BAA4B,CAAC,GAAG,YAAY;AAC7D,UAAM,cAAc;AAAA,EACtB,CAAC,EACA,QAAQ,UAAU,wCAAwC,CAAC,GAAG,YAAY;AACzE,UAAM,cAAc;AAAA,EACtB,CAAC,EACA;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAACC,WAAU;AACT,aAAOA,OAAM,WAAW,QAAQ;AAAA,QAC9B,UAAU;AAAA,QACV,MAAM;AAAA,QACN,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,EACC,OAAO,SAAS;AAAA,IACf,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,CAAC,iBAAiB,aAAa;AAAA,EAC1C,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC,EACA,OAAO,cAAc;AAAA,IACpB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC,EACA,KAAK,EACL,MAAM,QAAQ,GAAG,EACjB,QAAQ,EACR,MAAM,WAAW,GAAG,EACpB,QAAQ,wCAAwC,YAAY,EAC5D,QAAQ,yDAAyD,sBAAsB,EACvF,QAAQ,kCAAkC,gBAAgB,EAC1D,QAAQ,MAAM,wBAAwB,EACtC,QAAQ,YAAY,gCAAgC,EACpD,QAAQ,aAAa,8BAA8B,EACnD,MAAM;AAGT,QAAM,UAAU,KAAK,IAAI,CAAC;AAC1B,MAAI,YAAY,WAAW,YAAY,YAAY,YAAY,UAAU;AACvE,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,WAAW,KAAK,YAAY;AAAA,IAC9B;AAAA,EACF;AACF;;;AKzFA,OAAOC,UAAS,aAAAC,YAAW,YAAAC,WAAU,eAAAC,cAAa,WAAAC,UAAS,UAAAC,eAAc;AACzE,SAAS,OAAAC,MAAK,QAAAC,OAAM,cAAc;;;ACDlC,SAAS,UAAU,aAAa,QAAQ,iBAAiB;AACzD,SAAS,mBAAmB;AA4BrB,SAAS,SAAS,SAA0C;AACjE,QAAM,EAAE,OAAO,WAAW,QAAQ,SAAS,WAAW,WAAW,IAAI;AAErE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAsB,MAAM;AACtD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAsB,CAAC,CAAC;AACpD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAwB,IAAI;AACxE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAE1E,QAAM,YAAY,OAA2B,IAAI;AACjD,QAAM,gBAAgB,OAAO,UAAU;AAGvC,YAAU,MAAM;AACd,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,WAAW,YAAY,CAAC,UAAqB;AACjD,cAAU,CAAC,SAAS,CAAC,GAAG,MAAM,KAAK,CAAC;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ;AAAA,IACZ,OAAO,SAAiB;AAEtB,UAAI,UAAU,SAAS;AACrB,YAAI;AACF,gBAAM,UAAU,QAAQ,KAAK,kBAAkB;AAAA,QACjD,QAAQ;AAAA,QAER;AACA,kBAAU,UAAU;AAAA,MACtB;AAGA,eAAS,MAAM;AACf,cAAQ,CAAC;AACT,wBAAkB,IAAI;AACtB,yBAAmB,IAAI;AAGvB,gBAAU,CAAC,SAAS;AAClB,YAAI,KAAK,SAAS,GAAG;AACnB,iBAAO,CAAC,GAAG,MAAM,EAAE,MAAM,aAAa,KAAK,CAAC;AAAA,QAC9C;AACA,eAAO;AAAA,MACT,CAAC;AAED,YAAM,SAAS,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,WAAW,OAAO,CAAC;AAC1E,gBAAU,UAAU;AAGpB,aAAO,GAAG,gBAAgB,CAAC,aAA0B;AACnD,iBAAS,QAAQ;AAAA,MACnB,CAAC;AAED,aAAO,GAAG,YAAY,CAAC,SAAiB;AACtC,YAAI,SAAS;AACX,mBAAS,EAAE,MAAM,YAAY,KAAK,CAAC;AAAA,QACrC;AAAA,MACF,CAAC;AAED,aAAO,GAAG,UAAU,OAAO,WAAyB;AAClD,cAAM,YAAY,OAAO,QAAQ,OAAO,MAAM,SAAY,KAAK,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM;AAC1F,cAAM,QAAkB,CAAC;AACzB,YAAI,OAAO,KAAM,OAAM,KAAK,IAAI,OAAO,IAAI,GAAG;AAC9C,YAAI,OAAO,IAAK,OAAM,KAAK,IAAI,OAAO,GAAG,GAAG;AAC5C,iBAAS,EAAE,MAAM,UAAU,QAAQ,WAAW,QAAQ,MAAM,SAAS,MAAM,KAAK,GAAG,IAAI,OAAU,CAAC;AAAA,MAEpG,CAAC;AAED,aAAO,GAAG,WAAW,OAAO,WAAmB;AAC7C,YAAI,WAAW;AACb,iBAAO,eAAe,IAAI;AAC1B,iBAAO;AAAA,QACT;AACA,iBAAS,EAAE,MAAM,WAAW,OAAO,CAAC;AACpC,0BAAkB,MAAM;AACxB,eAAO;AAAA,MACT,CAAC;AAED,aAAO,GAAG,gBAAgB,OAAO,aAAqB;AACpD,iBAAS,EAAE,MAAM,YAAY,SAAS,CAAC;AACvC,2BAAmB,QAAQ;AAC3B,eAAO;AAAA,MACT,CAAC;AAED,aAAO,GAAG,YAAY,CAAC,QAAQ;AAC7B,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,SAAS,IAAI;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAED,aAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,iBAAS,EAAE,MAAM,SAAS,SAAS,IAAI,QAAQ,CAAC;AAAA,MAClD,CAAC;AAGD,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,MAAM,IAAI;AAEtC,YAAI,cAAc,SAAS;AACzB,wBAAc,QAAQ,MAAM;AAAA,QAC9B;AAAA,MACF,SAAS,OAAO;AACd,iBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,KAAK,EAAE,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,IACA,CAAC,OAAO,WAAW,QAAQ,SAAS,WAAW,QAAQ;AAAA,EACzD;AAEA,QAAM,OAAO,YAAY,YAAY;AACnC,QAAI,UAAU,SAAS;AACrB,YAAM,UAAU,QAAQ,KAAK,gBAAgB;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ,MAAM;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,MAAM;AAC/B,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ,OAAO;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,YAAY,CAAC,aAAsB;AACxD,QAAI,UAAU,WAAW,gBAAgB;AACvC,gBAAU,QAAQ,eAAe,QAAQ;AACzC,wBAAkB,IAAI;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,gBAAgB,YAAY,CAAC,WAAmB;AACpD,QAAI,UAAU,WAAW,iBAAiB;AACxC,gBAAU,QAAQ,cAAc,MAAM;AACtC,yBAAmB,IAAI;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,cAAc,YAAY,MAAM;AACpC,cAAU,CAAC,CAAC;AAAA,EACd,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM;AACjC,UAAI,UAAU,SAAS;AACrB,gBAAQ,UAAU,QAAQ,WAAW;AAAA,MACvC;AAAA,IACF,GAAG,GAAG;AACN,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzMA,SAAS,gBAAgB;AACzB,SAAS,eAAAC,oBAAmB;AAiBrB,SAAS,eAAe,SAAsC;AACnE,QAAM,EAAE,SAAS,UAAU,QAAQ,WAAW,OAAO,WAAW,MAAM,IAAI;AAE1E,QAAM,cAAcA;AAAA,IAClB,CAAC,OAAe,QAA4C;AAC1D,UAAI,SAAU;AAGd,UAAI,UAAU,KAAK;AACjB,YAAI,UAAU;AACZ,qBAAW;AAAA,QACb,OAAO;AACL,oBAAU;AAAA,QACZ;AAAA,MACF;AAGA,UAAI,UAAU,OAAO,UAAU,OAAQ,IAAI,QAAQ,UAAU,KAAM;AACjE,iBAAS;AAAA,MACX;AAGA,UAAI,IAAI,QAAQ;AACd,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,CAAC,UAAU,UAAU,SAAS,UAAU,MAAM;AAAA,EAChD;AAEA,WAAS,WAAW;AACtB;;;AChDA,OAAO,WAAW;AAClB,SAAS,MAAM,WAAW;AAS1B,IAAM,cAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAM,cAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAM,kBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AACT;AAEO,IAAM,YAAsC,CAAC,EAAE,OAAO,MAAM,KAAK,MAAM;AAC5E,QAAM,QAAQ,YAAY,KAAK,KAAK;AACpC,QAAM,QAAQ,YAAY,KAAK,KAAK,MAAM,YAAY;AACtD,QAAM,YAAY,gBAAgB,KAAK,KAAK;AAE5C,SACE,oCAAC,OAAI,eAAc,UAAS,aAAY,QAAO,aAAY,QAAO,UAAU,KAC1E,oCAAC,WACC,oCAAC,QAAK,OAAM,QAAO,MAAI,QAAE,YAAQ,GACjC,oCAAC,YAAM,KAAM,GACb,oCAAC,QAAK,SAAe,WAAU,GAAC,GAChC,oCAAC,QAAK,OAAc,MAAI,QAAE,KAAM,GAChC,oCAAC,OAAI,UAAU,GAAG,GAClB,oCAAC,QAAK,UAAQ,QAAC,OAAK,GACpB,oCAAC,QAAK,MAAI,QAAE,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAE,CAC5C,GACA,oCAAC,WACC,oCAAC,QAAK,UAAQ,QAAE,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,WAAW,IAAK,CACzE,CACF;AAEJ;;;AChEA,OAAOC,YAAW;AAClB,SAAS,QAAAC,OAAM,OAAAC,YAAW;;;ACD1B,OAAOC,UAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,QAAAC,aAAY;AAad,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,eAAe,gBAAgB,IAAIF,UAAS,CAAC;AACpD,QAAM,YAAYD,OAAM,OAAO,KAAK,IAAI,CAAC;AAEzC,EAAAE,WAAU,MAAM;AACd,qBAAiB,CAAC;AAClB,cAAU,UAAU,KAAK,IAAI;AAAA,EAC/B,GAAG,CAAC,IAAI,CAAC;AAET,EAAAA,WAAU,MAAM;AACd,QAAI,iBAAiB,KAAK,QAAQ;AAChC,mBAAa;AACb;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,IAAI,IAAI,UAAU,WAAW;AACnD,UAAM,aAAa,KAAK,IAAI,GAAG,OAAO;AACtC,UAAM,WAAW,KAAK,SAAS,KAAK,IAAI,KAAK,SAAS,KAAK,IAAI;AAC/D,UAAM,OAAO,KAAK,IAAI,UAAU,KAAK,MAAM,WAAW,UAAU,CAAC;AACjE,UAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,UAAU,CAAC;AAE3D,UAAM,QAAQ,WAAW,MAAM;AAC7B,uBAAiB,CAAC,SAAS,KAAK,IAAI,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,IAC/D,GAAG,QAAQ;AAEX,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,eAAe,MAAM,OAAO,UAAU,CAAC;AAE3C,QAAM,YAAY,KAAK,MAAM,GAAG,aAAa;AAE7C,SACE,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAc,MAAY,YAC7B,WACA,gBAAgB,KAAK,SAAS,WAAW,EAC5C;AAEJ;;;ADxCA,IAAM,aAAgE;AAAA,EACpE,UAAU,EAAE,QAAQ,QAAU,OAAO,OAAO;AAAA,EAC5C,QAAQ,EAAE,QAAQ,UAAU,OAAO,QAAQ;AAAA,EAC3C,SAAS,EAAE,QAAQ,UAAU,OAAO,SAAS;AAAA,EAC7C,UAAU,EAAE,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC5C,OAAO,EAAE,QAAQ,UAAU,OAAO,MAAM;AAC1C;AAEA,SAAS,aAAa,OAA0B;AAC9C,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,cAAc,OAAqD;AAC1E,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,MAAM,UACT,EAAE,QAAQ,UAAU,OAAO,QAAQ,IACnC,EAAE,QAAQ,UAAU,OAAO,MAAM;AAAA,EACvC;AACA,SAAO,WAAW,MAAM,IAAI;AAC9B;AAGA,SAAS,cAAc,OAA2B;AAChD,MAAI,MAAM,SAAS,cAAc,MAAM,QAAS,QAAO;AACvD,MAAI,MAAM,SAAS,SAAU,QAAO;AACpC,MAAI,MAAM,SAAS,QAAS,QAAO;AACnC,SAAO;AACT;AAEO,IAAM,eAA4C,CAAC,EAAE,QAAQ,YAAY,GAAG,MAAM;AACvF,QAAM,gBAAgB,OAAO,MAAM,CAAC,SAAS;AAE7C,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,YAChB,cAAc,IAAI,CAAC,OAAO,UAAU;AACnC,QAAI,MAAM,SAAS,aAAa;AAC9B,aACE,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,OAAO,WAAW,KAC1B,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,QAAO,MAAI,QAAE,SAAU,GACnC,gBAAAF,OAAA,cAACE,OAAA,MAAM,MAAM,IAAK,CACpB;AAAA,IAEJ;AAEA,UAAM,QAAQ,cAAc,KAAK;AACjC,UAAM,OAAO,aAAa,KAAK;AAC/B,UAAM,WAAW,UAAU,cAAc,SAAS;AAClD,UAAM,UAAU,YAAY,cAAc,KAAK;AAE/C,WACE,gBAAAF,OAAA,cAACC,MAAA,EAAI,KAAK,SACR,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,YAAa,GAC7B,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,SAAQ,MAAM,QAAO,GAAC,GACxC,UACC,gBAAAF,OAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO,MAAM,UAAU,UAAU,SAAY,MAAM;AAAA,QACnD,MAAM,YAAY,MAAM,SAAS;AAAA,QACjC,OAAO,MAAM,SAAS,aAAa,IAAI;AAAA;AAAA,IACzC,IAEA,gBAAAA,OAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,OAAO,MAAM,UAAU,UAAU,SAAY,MAAM;AAAA,QACnD,MAAM,YAAY,MAAM,SAAS;AAAA,QACjC,UAAU,MAAM,SAAS;AAAA;AAAA,MAExB;AAAA,IACH,GAED,MAAM,SAAS,YAAY,MAAM,UAChC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,KAAK,MAAM,MAAO,CAE1C;AAAA,EAEJ,CAAC,CACH;AAEJ;;;AEhHA,OAAOC,UAAS,YAAAC,iBAAgB;AAChC,SAAS,QAAAC,OAAM,OAAAC,MAAK,YAAAC,iBAAgB;AAO7B,IAAM,gBAA8C,CAAC,EAAE,QAAQ,UAAU,MAAM;AACpF,QAAM,CAAC,UAAU,WAAW,IAAIH,UAAuB,KAAK;AAE5D,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,kBAAY,KAAK;AAAA,IACnB,WAAW,IAAI,cAAc,UAAU,KAAK;AAC1C,kBAAY,IAAI;AAAA,IAClB,WAAW,IAAI,QAAQ;AACrB,gBAAU,aAAa,KAAK;AAAA,IAC9B,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,gBAAU,IAAI;AAAA,IAChB,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,CAAC;AAED,SACE,gBAAAJ,OAAA,cAACG,MAAA,EAAI,eAAc,UAAS,aAAY,QAAO,aAAY,UAAS,UAAU,GAAG,UAAU,KACzF,gBAAAH,OAAA,cAACG,MAAA,EAAI,cAAc,KACjB,gBAAAH,OAAA,cAACE,OAAA,EAAK,OAAM,UAAS,MAAI,QAAC,SAAO,CACnC,GACA,gBAAAF,OAAA,cAACG,MAAA,EAAI,cAAc,KACjB,gBAAAH,OAAA,cAACE,OAAA,MAAM,MAAO,CAChB,GACA,gBAAAF,OAAA,cAACG,MAAA,MACC,gBAAAH,OAAA,cAACG,MAAA,EAAI,aAAa,KAChB,gBAAAH,OAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,iBAAiB,aAAa,QAAQ,UAAU;AAAA,MAChD,OAAO,aAAa,QAAQ,UAAU;AAAA,MACtC,MAAM,aAAa;AAAA;AAAA,IAElB;AAAA,EACH,CACF,GACA,gBAAAF,OAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,iBAAiB,aAAa,OAAO,QAAQ;AAAA,MAC7C,OAAO,aAAa,OAAO,UAAU;AAAA,MACrC,MAAM,aAAa;AAAA;AAAA,IAElB;AAAA,EACH,CACF,GACA,gBAAAF,OAAA,cAACG,MAAA,EAAI,WAAW,KACd,gBAAAH,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,uBAAqB,CACtC,CACF;AAEJ;;;ACxDA,OAAOG,UAAS,YAAAC,iBAAgB;AAChC,SAAS,QAAAC,OAAM,OAAAC,MAAK,YAAAC,iBAAgB;AACpC,OAAO,eAAe;AAOf,IAAM,iBAAgD,CAAC,EAAE,UAAU,SAAS,MAAM;AACvF,QAAM,CAAC,QAAQ,SAAS,IAAIH,UAAS,EAAE;AAEvC,QAAM,eAAe,MAAM;AACzB,QAAI,OAAO,KAAK,GAAG;AACjB,eAAS,OAAO,KAAK,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,EAAAG,UAAS,CAAC,GAAG,QAAQ;AACnB,QAAI,IAAI,UAAU,OAAO,KAAK,GAAG;AAC/B,mBAAa;AAAA,IACf;AAAA,EACF,CAAC;AAED,SACE,gBAAAJ,OAAA,cAACG,MAAA,EAAI,eAAc,UAAS,aAAY,QAAO,aAAY,QAAO,UAAU,GAAG,UAAU,KACvF,gBAAAH,OAAA,cAACG,MAAA,EAAI,cAAc,KACjB,gBAAAH,OAAA,cAACE,OAAA,EAAK,OAAM,QAAO,MAAI,QAAC,gBAAc,CACxC,GACA,gBAAAF,OAAA,cAACG,MAAA,EAAI,cAAc,KACjB,gBAAAH,OAAA,cAACE,OAAA,MAAM,QAAS,CAClB,GACA,gBAAAF,OAAA,cAACG,MAAA,MACC,gBAAAH,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,SAAU,GAC9B,gBAAAF,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAY;AAAA;AAAA,EACd,CACF,GACA,gBAAAA,OAAA,cAACG,MAAA,EAAI,WAAW,KACd,gBAAAH,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,iBAAe,CAChC,CACF;AAEJ;;;AC9CA,OAAOG,UAAS,YAAAC,WAAU,aAAAC,YAAW,UAAAC,eAAc;AACnD,SAAS,QAAAC,OAAM,OAAAC,MAAK,YAAAC,iBAAgB;AACpC,OAAOC,gBAAe;;;ACKtB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,SAAQ;AACf,SAAS,yBAAyB;;;ACHlC,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAUf,IAAM,cAAcD,MAAK,KAAKC,IAAG,QAAQ,GAAG,MAAM;AAClD,IAAM,eAAeD,MAAK,KAAK,aAAa,cAAc;AAC1D,IAAM,cAAc;AAEpB,SAAS,YAAkB;AACzB,MAAI,CAACD,IAAG,WAAW,WAAW,GAAG;AAC/B,IAAAA,IAAG,UAAU,aAAa,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,cAA8B;AAC5C,MAAI;AACF,UAAM,MAAMA,IAAG,aAAa,cAAc,OAAO;AACjD,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAAA,EAClC,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAEO,SAAS,cAAc,OAA2B;AACvD,YAAU;AACV,QAAM,UAAU,YAAY;AAC5B,UAAQ,KAAK,KAAK;AAElB,QAAM,UAAU,QAAQ,MAAM,CAAC,WAAW;AAC1C,EAAAA,IAAG,cAAc,cAAc,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM;AAAA,IACtE,MAAM;AAAA,EACR,CAAC;AACH;AAEO,SAAS,eAAqB;AACnC,MAAI;AACF,IAAAA,IAAG,WAAW,YAAY;AAAA,EAC5B,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,cAAc,SAAyB,QAAQ,IAAY;AACzE,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,SAAS,QAAQ,MAAM,CAAC,KAAK,EAAE,QAAQ;AAC7C,QAAM,QAAkB,CAAC,IAAI,sBAAsB,EAAE;AAErD,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,IAAI,KAAK,MAAM,SAAS;AACrC,UAAM,UAAU,KAAK,mBAAmB,SAAS;AAAA,MAC/C,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC,IAAI,MAAM,KAAK,mBAAmB,SAAS;AAAA,MAC1C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,SAAS,MAAM,YAAY,OAC7B,WACA,MAAM,YAAY,QAChB,WACA;AAEN,UAAM,WAAW,MAAM,aACnB,KAAK,KAAK,MAAM,MAAM,aAAa,GAAI,CAAC,OACxC;AAEJ,UAAM,OAAO,MAAM,KAAK,SAAS,KAC7B,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,WAC1B,MAAM;AAEV,UAAM,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,EAAE;AAAA,EACzD;AAEA,QAAM,KAAK,EAAE;AACb,MAAI,QAAQ,SAAS,OAAO;AAC1B,UAAM,KAAK,aAAa,KAAK,OAAO,QAAQ,MAAM,UAAU;AAC5D,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACnFA,SAAS,gBAAAG,eAAc,YAAY,mBAAmB;AACtD,SAAS,QAAAC,OAAM,gBAAgB;;;ACJ/B,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAqCf,SAAS,iBAAiB,SAA8B;AACtD,QAAM,QAAQ,QAAQ,MAAM,mCAAmC;AAC/D,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,CAAC,GAAG,MAAM,QAAQ,KAAK,EAAE;AAEpD,QAAM,OAA+B,CAAC;AACtC,aAAW,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG;AACvC,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,WAAW,GAAG;AAChB,YAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK;AACzC,YAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE;AACvC;AAIA,IAAM,UAAU;AAEhB,SAAS,iBAAiB,MAAuB;AAC/C,MAAI,KAAK,SAAS,GAAI,QAAO;AAC7B,MAAI,CAAC,QAAQ,KAAK,IAAI,EAAG,QAAO;AAChC,MAAI,KAAK,SAAS,IAAI,EAAG,QAAO;AAChC,SAAO;AACT;AAIA,SAAS,oBACP,WACA,OACiB;AACjB,QAAM,SAA0B,CAAC;AAEjC,MAAI,CAACF,IAAG,WAAW,SAAS,EAAG,QAAO;AAEtC,MAAI;AACJ,MAAI;AACF,cAAUA,IAAG,YAAY,SAAS;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,MAAK,KAAK,WAAW,KAAK;AAC3C,UAAM,YAAYA,MAAK,KAAK,UAAU,UAAU;AAGhD,QAAI;AACF,UAAI,CAACD,IAAG,SAAS,QAAQ,EAAE,YAAY,EAAG;AAC1C,UAAI,CAACA,IAAG,WAAW,SAAS,EAAG;AAAA,IACjC,QAAQ;AACN;AAAA,IACF;AAGA,QAAI,CAAC,iBAAiB,KAAK,EAAG;AAG9B,QAAI;AACF,YAAM,UAAUA,IAAG,aAAa,WAAW,OAAO;AAClD,YAAM,EAAE,KAAK,IAAI,iBAAiB,OAAO;AAGzC,YAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,UAAI,SAAS,MAAO;AAEpB,YAAM,cAAc,KAAK,aAAa,KAAK;AAC3C,UAAI,CAAC,YAAa;AAElB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,SAAS,KAAK,SAAS;AAAA,QACvB,eAAe,KAAK,eAAe;AAAA,QACnC,eAAe,KAAK,gBAAgB,MAAM;AAAA,QAC1C,cAAc,KAAK,eAAe;AAAA,QAClC,UAAU,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AAAA,MAClD,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,eAAe,MAAc,QAAQ,IAAI,GAAoB;AAC3E,QAAM,cAAcC,MAAK,KAAKC,IAAG,QAAQ,GAAG,QAAQ,QAAQ;AAC5D,QAAM,aAAaD,MAAK,KAAK,KAAK,QAAQ,QAAQ;AAElD,QAAM,WAAW,oBAAoB,aAAa,UAAU;AAC5D,QAAM,UAAU,oBAAoB,YAAY,SAAS;AAGzD,QAAM,SAAS,oBAAI,IAA2B;AAC9C,aAAW,SAAS,SAAU,QAAO,IAAI,MAAM,MAAM,KAAK;AAC1D,aAAW,SAAS,QAAS,QAAO,IAAI,MAAM,MAAM,KAAK;AAEzD,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAOO,SAAS,UAAU,OAAmC;AAC3D,QAAM,UAAUD,IAAG,aAAa,MAAM,MAAM,OAAO;AACnD,QAAM,EAAE,KAAK,IAAI,iBAAiB,OAAO;AACzC,SAAO,EAAE,GAAG,OAAO,KAAK;AAC1B;AAQO,SAAS,qBAAqB,QAAiC;AACpE,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,QAAQ,CAAC,oBAAoB;AACnC,aAAW,SAAS,QAAQ;AAC1B,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,aAAa,MAAM,IAAI,SAAS;AAC3C,UAAM,KAAK,oBAAoB,MAAM,WAAW,gBAAgB;AAChE,UAAM,KAAK,iBAAiB,MAAM,IAAI,aAAa;AACnD,UAAM,KAAK,YAAY;AAAA,EACzB;AACA,QAAM,KAAK,qBAAqB;AAChC,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,iBAAiB,QAAiC;AAChE,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,QAAkB,CAAC,IAAI,uBAAuB,EAAE;AAEtD,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,MAAM,UAAU,aAAa,MAAM;AACjD,UAAM,OAAO,MAAM,eAAe,IAAI,MAAM,YAAY,KAAK;AAC7D,UAAM,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI,EAAE;AAC7C,UAAM,KAAK,SAAS,MAAM,WAAW,EAAE;AAAA,EACzC;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;ADZA,SAAS,WAAW,qBAAqB;AAzJzC,IAAM,oBAAoB,CAAC,UAAU,eAAe,sBAAsB;AAI1E,SAAS,UAAU,KAAyB;AAC1C,QAAM,WAAWG,MAAK,KAAK,QAAQ,OAAO;AAC1C,MAAI,CAAC,WAAW,QAAQ,EAAG,QAAO,CAAC;AAEnC,QAAM,QAAoB,CAAC;AAE3B,MAAI;AACF,UAAM,QAAQ,YAAY,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,KAAK;AAE1E,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAWA,MAAK,UAAU,IAAI;AACpC,UAAI;AACF,cAAM,MAAMC,cAAa,UAAU,OAAO;AAC1C,cAAM,OAAO,SAAS,MAAM,KAAK;AAGjC,YAAI,UAAU,IAAI,KAAK;AACvB,YAAI;AAEJ,cAAM,UAAU,QAAQ,MAAM,mCAAmC;AACjE,YAAI,SAAS;AACX,gBAAM,OAAO,QAAQ,CAAC;AACtB,oBAAU,QAAQ,CAAC,EAAE,KAAK;AAG1B,gBAAM,aAAa,KAAK,MAAM,kBAAkB;AAChD,cAAI,YAAY;AACd,oBAAQ,WAAW,CAAC,EACjB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAAA,UACnB;AAAA,QACF;AAEA,YAAI,SAAS;AACX,gBAAM,KAAK,EAAE,MAAM,MAAM,UAAU,SAAS,MAAM,CAAC;AAAA,QACrD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAOO,SAAS,kBAAkB,MAAc,QAAQ,IAAI,GAAkB;AAC5E,MAAI,eAA8B;AAClC,MAAI,mBAAkC;AAGtC,aAAW,WAAW,mBAAmB;AACvC,UAAM,WAAWD,MAAK,KAAK,OAAO;AAClC,QAAI,WAAW,QAAQ,GAAG;AACxB,UAAI;AACF,uBAAeC,cAAa,UAAU,OAAO,EAAE,KAAK;AACpD,2BAAmB;AACnB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAASD,MAAK,KAAK,MAAM;AAC/B,QAAM,eAAe,WAAW,MAAM;AAGtC,QAAM,eAAyB,CAAC;AAChC,QAAM,cAAcA,MAAK,KAAK,QAAQ,UAAU;AAChD,MAAI,WAAW,WAAW,GAAG;AAC3B,QAAI;AACF,YAAM,QAAQ,YAAY,WAAW;AACrC,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,SAAS,KAAK,GAAG;AACxB,uBAAa,KAAKA,MAAK,aAAa,IAAI,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,QAAQ,UAAU,GAAG;AAG3B,QAAM,SAAS,eAAe,GAAG;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,eAAe,SAAS;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQO,SAAS,wBAAwB,MAAc,QAA+B;AACnF,QAAM,WAAqB,CAAC;AAG5B,MAAI,OAAO,cAAc;AACvB,aAAS;AAAA,MACP,qCAAqC,OAAO,oBAAoB,YAAY;AAAA,MAC5E,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,aAAS,KAAK,uBAAuB;AACrC,eAAW,QAAQ,OAAO,OAAO;AAC/B,eAAS,KAAK,IAAI,KAAK,IAAI,GAAG;AAC9B,eAAS,KAAK,KAAK,OAAO;AAC1B,eAAS,KAAK,EAAE;AAAA,IAClB;AACA,aAAS,KAAK,2BAA2B;AAAA,EAC3C;AAGA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,aAAS,KAAK,qBAAqB,OAAO,MAAM,CAAC;AAAA,EACnD;AAEA,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,WAAS,KAAK,IAAI,WAAW,IAAI;AACjC,SAAO,SAAS,KAAK,IAAI;AAC3B;AAUO,SAAS,YAAY,MAAc,QAAQ,IAAI,GAAa;AACjE,QAAM,UAAoB,CAAC;AAG3B,QAAM,QAAQA,MAAK,KAAK,QAAQ;AAChC,MAAI,CAAC,WAAW,KAAK,GAAG;AACtB;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAGA,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,MAAM;AACtB,UAAM,WAAWA,MAAK,KAAK,GAAG;AAC9B,QAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,gBAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,cAAQ,KAAK,MAAM,GAAG;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,YAAYA,MAAK,KAAK,QAAQ,YAAY;AAChD,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,YAAQ,KAAK,iBAAiB;AAAA,EAChC;AAEA,SAAO;AACT;;;AE3PA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAef,IAAM,aAAaD,MAAK,KAAKC,IAAG,QAAQ,GAAG,MAAM;AACjD,IAAM,cAAcD,MAAK,KAAK,YAAY,aAAa;AAEvD,IAAM,aAAsC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASE,aAAkB;AACzB,MAAI,CAACH,IAAG,WAAW,UAAU,GAAG;AAC9B,IAAAA,IAAG,UAAU,YAAY,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EAC3D;AACF;AAEO,SAAS,iBAA6B;AAC3C,MAAI;AACF,UAAM,MAAMA,IAAG,aAAa,aAAa,OAAO;AAChD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,eAAe,QAA0B;AACvD,EAAAG,WAAU;AACV,EAAAH,IAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM;AAAA,IACpE,MAAM;AAAA,EACR,CAAC;AACH;AAEO,SAAS,eAAe,KAAa,OAAuB;AACjE,MAAI,CAAC,WAAW,SAAS,GAAuB,GAAG;AACjD,WAAO,kBAAkB,GAAG,kBAAkB,WAAW,KAAK,IAAI,CAAC;AAAA,EACrE;AAEA,QAAM,SAAS,eAAe;AAG9B,MAAI,QAAQ,aAAa,QAAQ,eAAe,QAAQ,WAAW;AACjE,UAAM,OAAO,MAAM,YAAY;AAC/B,QAAI,SAAS,UAAU,SAAS,WAAW,SAAS,QAAQ,SAAS,OAAO;AAC1E,aAAO,MAAM,GAAG;AAAA,IAClB;AACA,IAAC,OAAmC,GAAG,IAAI,SAAS,UAAU,SAAS;AAAA,EACzE,OAAO;AACL,IAAC,OAAmC,GAAG,IAAI;AAAA,EAC7C;AAEA,iBAAe,MAAM;AACrB,SAAO,aAAa,GAAG,MAAM,KAAK;AACpC;AAEO,SAAS,aAAa,QAA4B;AACvD,QAAM,QAAkB,CAAC,IAAI,8CAA8C,EAAE;AAE7E,MAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,UAAM,KAAK,mDAA8C;AAAA,EAC3D,OAAO;AACL,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAM,KAAK,KAAK,IAAI,OAAO,EAAE,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,WAAW,WAAW,KAAK,IAAI,CAAC,EAAE;AAC7C,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACzEA,OAAOI,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,YAAAC,iBAAgB;AAYzB,IAAI,cAAkC;AAK/B,SAAS,UAAU,MAAc,QAAQ,IAAI,GAAgB;AAClE,MAAI,YAAa,QAAO;AAExB,QAAM,YAAYD,MAAK,KAAK,KAAK,QAAQ,YAAY;AACrD,MAAI;AACF,UAAM,MAAMD,IAAG,aAAa,WAAW,OAAO;AAC9C,kBAAc,KAAK,MAAM,GAAG;AAC5B,WAAO;AAAA,EACT,QAAQ;AACN,kBAAc,EAAE,OAAO,CAAC,EAAE;AAC1B,WAAO;AAAA,EACT;AACF;AAMO,SAAS,SACd,OACA,MAA8B,CAAC,GACzB;AACN,QAAM,SAAS,eAAe,UAAU;AACxC,QAAM,UAAU,OAAO,MAAM,KAAK;AAClC,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,aAAW,SAAS,SAAS;AAC3B,QAAI;AACF,MAAAE,UAAS,MAAM,SAAS;AAAA,QACtB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,gBAAgB,MAAM;AAAA,MACvD,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKO,SAAS,cAAsB;AACpC,QAAM,SAAS,eAAe,UAAU;AACxC,QAAM,SAAS,OAAO,KAAK,OAAO,KAAK;AAEvC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC,IAAI,uBAAuB,EAAE;AACtD,aAAW,SAAS,QAAQ;AAC1B,UAAM,UAAU,OAAO,MAAM,KAAK,KAAK,CAAC;AACxC,UAAM,KAAK,KAAK,KAAK,KAAK,QAAQ,MAAM,QAAQ,QAAQ,WAAW,IAAI,MAAM,EAAE,IAAI;AACnF,eAAW,SAAS,SAAS;AAC3B,YAAM,KAAK,cAAc,MAAM,OAAO,EAAE;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;AL9CA,IAAM,eAAe,CAAC,iBAAiB,aAAa;AAGpD,IAAM,kBAAkC;AAAA,EACtC;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,KAAK,GAAG;AAAA,IAClB,aAAa;AAAA,IACb,SAAS,MAAM;AACb,YAAM,MAAM,eAAe;AAC3B,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,EAAE,OAAO;AACjE,YAAM,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,aAAa;AACrD,YAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;AAE1C,iBAAW,OAAO,UAAU;AAC1B,cAAM,UAAU,IAAI,SAAS,SAAS,KAAK,IAAI,QAAQ,IAAI,OAAK,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM;AACzF,cAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK;AAC7C,cAAM,KAAK,MAAM,IAAI,IAAI,GAAG,KAAK,GAAG,OAAO,EAAE;AAC7C,cAAM,KAAK,SAAS,IAAI,WAAW,EAAE;AAAA,MACvC;AAEA,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,qCAAqC;AAChD,cAAM,KAAK,EAAE;AACb,mBAAW,OAAO,aAAa;AAC7B,gBAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK;AAC7C,gBAAM,KAAK,MAAM,IAAI,IAAI,GAAG,KAAK,EAAE;AACnC,gBAAM,KAAK,SAAS,IAAI,WAAW,EAAE;AAAA,QACvC;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,0BAA0B;AACrC,cAAM,KAAK,EAAE;AACb,mBAAW,OAAO,QAAQ;AACxB,gBAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK;AAC7C,gBAAM,KAAK,MAAM,IAAI,IAAI,GAAG,KAAK,EAAE;AACnC,gBAAM,KAAK,SAAS,IAAI,WAAW,EAAE;AAAA,QACvC;AAAA,MACF;AAEA,YAAM,KAAK,EAAE;AACb,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,MAAM;AAAA,IAChB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS,CAAC,SAAS;AACjB,UAAI,KAAK,KAAK,EAAE,YAAY,MAAM,SAAS;AACzC,qBAAa;AACb,eAAO;AAAA,MACT;AACA,YAAM,UAAU,YAAY;AAC5B,aAAO,cAAc,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,MAAM;AAAA,IAChB,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,YAAM,QAAkB,CAAC,IAAI,kBAAkB,EAAE;AAEjD,YAAM,KAAK,mBAAmB,IAAI,WAAW,SAAS,EAAE;AACxD,YAAM,KAAK,mBAAmB,IAAI,KAAK,EAAE;AACzC,YAAM,KAAK,mBAAmB,QAAQ,IAAI,EAAE,QAAQC,IAAG,QAAQ,GAAG,GAAG,CAAC,EAAE;AACxE,YAAM,KAAK,mBAAmB,QAAQ,OAAO,EAAE;AAC/C,YAAM,KAAK,mBAAmB,QAAQ,QAAQ,IAAI,QAAQ,IAAI,EAAE;AAChE,YAAM,KAAK,mBAAmB,kBAAkB,IAAI,qBAAqB,kBAAkB,EAAE;AAC7F,YAAM,KAAK,mBAAmB,QAAQ,IAAI,cAAc,eAAe,QAAQ,IAAI,oBAAoB,mCAAmC,gBAAgB,EAAE;AAE5J,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,mBAAmB,IAAI,UAAU,OAAO,KAAK,EAAE;AAC1D,YAAM,KAAK,mBAAmB,IAAI,YAAY,OAAO,KAAK,EAAE;AAC5D,YAAM,KAAK,mBAAmB,IAAI,UAAU,OAAO,KAAK,EAAE;AAE1D,UAAI,IAAI,eAAe;AACrB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,YAAY;AACvB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,mBAAmB,IAAI,cAAc,kBAAkB,QAAQ,QAAQ,IAAI,GAAG,GAAG,KAAK,MAAM,EAAE;AACzG,cAAM,KAAK,mBAAmB,IAAI,cAAc,MAAM,MAAM,SAAS;AACrE,cAAM,KAAK,mBAAmB,IAAI,cAAc,aAAa,MAAM,SAAS;AAC5E,cAAM,KAAK,mBAAmB,IAAI,cAAc,OAAO,MAAM,aAAa;AAAA,MAC5E;AAEA,YAAM,UAAU,YAAY;AAC5B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,mBAAmB,QAAQ,MAAM,gBAAgB;AAC5D,YAAM,KAAK,EAAE;AAEb,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,GAAG;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS,CAAC,MAAM,QAAQ;AACtB,UAAI,CAAC,MAAM;AACT,eAAO,oBAAoB,IAAI,KAAK;AAAA,MACtC;AACA,YAAM,QAAQ,KAAK,KAAK,EAAE,YAAY;AACtC,UAAI,CAAC,aAAa,SAAS,KAAK,GAAG;AACjC,eAAO,oBAAoB,KAAK,iBAAiB,aAAa,KAAK,IAAI,CAAC;AAAA,MAC1E;AACA,UAAI,SAAS,KAAK;AAClB,aAAO,kBAAkB,KAAK;AAAA,IAChC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,GAAG;AAAA,IACb,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,WAAW,CAAC,IAAI,OAAO;AAC3B,aAAO,oBAAoB,CAAC,IAAI,UAAU,OAAO,KAAK;AAAA,IACxD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,WAAW,CAAC,IAAI,OAAO;AAC3B,aAAO,kBAAkB,CAAC,IAAI,UAAU,OAAO,KAAK;AAAA,IACtD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,aAAa,CAAC,IAAI,SAAS;AAC/B,aAAO,kBAAkB,CAAC,IAAI,YAAY,OAAO,KAAK;AAAA,IACxD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,MAAM;AACb,YAAM,UAAU,YAAY;AAC5B,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO;AAAA,MACT;AACA,YAAM,QAAQ,CAAC,IAAI,0BAA0B,EAAE;AAC/C,iBAAW,QAAQ,SAAS;AAC1B,cAAM,KAAK,oBAAoB,IAAI,EAAE;AAAA,MACvC;AACA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,0DAA0D;AACrE,YAAM,KAAK,6CAA6C;AACxD,YAAM,KAAK,gCAAgC;AAC3C,YAAM,KAAK,6CAA6C;AACxD,YAAM,KAAK,EAAE;AACb,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,OAAO;AAAA,IACjB,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,YAAM,SAAgE,CAAC;AAGvE,YAAM,SAAS,CAAC,EAAE,QAAQ,IAAI,eAAe,QAAQ,IAAI;AACzD,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,QAAQ,SAAS,eAAe;AAAA,MAClC,CAAC;AAGD,YAAM,YAAY,kBAAkB;AACpC,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,QAAQ,YAAY,UAAU;AAAA,MAChC,CAAC;AAGD,YAAM,UAAU,QAAQ,SAAS;AACjC,YAAM,CAAC,KAAK,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAC7C,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,IAAI,SAAS;AAAA,QACb,QAAQ,IAAI,OAAO,GAAG,QAAQ,KAAK,0BAAqB,EAAE;AAAA,MAC5D,CAAC;AAGD,UAAI,IAAI,eAAe;AACrB,eAAO,KAAK;AAAA,UACV,OAAO;AAAA,UACP,IAAI,CAAC,CAAC,IAAI,cAAc;AAAA,UACxB,QAAQ,IAAI,cAAc,kBAAkB,QAAQ,QAAQ,IAAI,GAAG,GAAG,KAAK;AAAA,QAC7E,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,CAAC,IAAI,oBAAoB,EAAE;AACzC,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,MAAM,KAAK,WAAW;AACnC,cAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,cAAM,KAAK,KAAK,IAAI,IAAI,MAAM,MAAM,OAAO,EAAE,CAAC,IAAI,MAAM,MAAM,EAAE;AAAA,MAClE;AAEA,YAAM,QAAQ,OAAO,MAAM,CAAC,MAAM,EAAE,EAAE;AACtC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,QAAQ,yBAAyB,wCAAmC;AAC/E,YAAM,KAAK,EAAE;AAEb,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,CAAC,IAAI,cAAe,QAAO;AAC/B,aAAO,iBAAiB,IAAI,cAAc,MAAM;AAAA,IAClD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,KAAK;AAAA,IACf,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS,CAAC,SAAS;AACjB,YAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,UAAI,CAAC,KAAK,KAAK,GAAG;AAChB,cAAM,SAAS,eAAe;AAC9B,eAAO,aAAa,MAAM;AAAA,MAC5B;AACA,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,SAAS,eAAe;AAC9B,cAAM,MAAO,OAAmC,MAAM,CAAC,CAAC;AACxD,YAAI,QAAQ,OAAW,QAAO,KAAK,MAAM,CAAC,CAAC;AAC3C,eAAO,KAAK,MAAM,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC;AAAA,MACvC;AACA,aAAO,eAAe,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,GAAG;AAAA,IACb,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,CAAC,IAAI,SAAU,QAAO;AAC1B,UAAI,CAAC,IAAI,QAAS,QAAO;AACzB,UAAI,QAAQ,IAAI,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,MAAM;AACb,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,MAAM;AACb,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,GAAG;AAAA,IACb,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,YAAY;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,KAAK,MAAM;AAAA,IACrB,aAAa;AAAA,IACb,SAAS,CAAC,OAAO,QAAQ;AACvB,UAAI,KAAK;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,SAASC,kBAAiB,SAAiE;AACzF,QAAM,QAAQ,QAAQ,MAAM,mCAAmC;AAC/D,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,CAAC,GAAG,MAAM,QAAQ,KAAK,EAAE;AAEpD,QAAM,OAA+B,CAAC;AACtC,aAAW,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG;AACvC,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,WAAW,GAAG;AAChB,YAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK;AACzC,YAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE;AACvC;AAGO,SAAS,iBAAiB,cAAwC;AACvE,QAAM,eAA+B,CAAC;AAEtC,aAAW,YAAY,cAAc;AACnC,QAAI;AACF,YAAM,UAAUC,cAAa,UAAU,OAAO;AAC9C,YAAM,EAAE,MAAM,KAAK,IAAID,kBAAiB,OAAO;AAC/C,YAAM,OAAOE,UAAS,UAAU,KAAK;AACrC,YAAM,cAAc,KAAK,aAAa,KAAK,KAAK,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE;AAC1E,YAAM,QAAQ,KAAK,eAAe;AAElC,mBAAa,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf,QAAQ;AAAA,QACR,SAAS,CAAC,MAAM,QAAQ;AACtB,cAAI,CAAC,IAAI,QAAS,QAAO;AAEzB,cAAI,SAAS;AACb,mBAAS,OAAO,QAAQ,gBAAgB,IAAI;AAC5C,gBAAM,WAAW,KAAK,MAAM,KAAK,EAAE,OAAO,OAAO;AACjD,mBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,qBAAS,OAAO,QAAQ,IAAI,OAAO,MAAM,IAAI,CAAC,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC;AAAA,UACrE;AACA,cAAI,QAAQ,MAAM;AAClB,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAAyC;AACzE,SAAO,OACJ,OAAO,CAAC,MAAM,EAAE,aAAa,EAC7B,IAAI,CAAC,WAAW;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,SAAS;AAAA,IACT,SAAS,CAAC,MAAc,QAAwB;AAC9C,UAAI,CAAC,IAAI,QAAS,QAAO;AAEzB,YAAM,SAAS,UAAU,KAAK;AAC9B,UAAI,SAAS,OAAO;AAEpB,eAAS,OAAO,QAAQ,gBAAgB,IAAI;AAC5C,YAAM,WAAW,KAAK,MAAM,KAAK,EAAE,OAAO,OAAO;AACjD,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,iBAAS,OAAO,QAAQ,IAAI,OAAO,MAAM,IAAI,CAAC,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC;AAAA,MACrE;AACA,UAAI,QAAQ,MAAM;AAClB,aAAO;AAAA,IACT;AAAA,EACF,EAAE;AACN;AAGA,IAAI,cAA8B,CAAC,GAAG,eAAe;AACrD,IAAI,aAAa,oBAAI,IAA0B;AAE/C,SAAS,aAAmB;AAC1B,eAAa,oBAAI,IAAI;AACrB,aAAW,OAAO,aAAa;AAC7B,eAAW,IAAI,IAAI,MAAM,GAAG;AAC5B,QAAI,IAAI,SAAS;AACf,iBAAW,SAAS,IAAI,SAAS;AAC/B,mBAAW,IAAI,OAAO,GAAG;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;AAGA,WAAW;AAGJ,SAAS,iBAAiB,MAA4B;AAC3D,gBAAc,CAAC,GAAG,iBAAiB,GAAG,IAAI;AAC1C,aAAW;AACb;AAWO,SAAS,kBAAkB,OAAqC;AACrE,MAAI,CAAC,MAAM,WAAW,GAAG,EAAG,QAAO;AAEnC,QAAM,UAAU,MAAM,MAAM,CAAC;AAC7B,QAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,QAAM,OAAO,aAAa,KAAK,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,QAAQ,EAAE,YAAY;AAC9F,QAAM,OAAO,aAAa,KAAK,KAAK,QAAQ,MAAM,WAAW,CAAC,EAAE,KAAK;AAErE,QAAM,MAAM,WAAW,IAAI,IAAI;AAC/B,MAAI,CAAC,IAAK,QAAO;AAEjB,SAAO,EAAE,SAAS,KAAK,KAAK;AAC9B;AAGO,SAAS,iBAAiC;AAC/C,SAAO;AACT;;;ADreO,IAAM,cAA0C,CAAC,EAAE,UAAU,cAAc,CAAC,EAAE,MAAM;AACzF,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,EAAE;AAErD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,CAAC;AAE1C,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE;AACnD,QAAM,aAAaC,QAAO,EAAE;AAG5B,QAAM,kBAAkB,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC,MAAM,SAAS,GAAG;AACxF,QAAM,cAAc,kBAChB,eAAe,EAAE,OAAO,CAAC,QAAQ;AAC/B,UAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,YAAY;AACzC,QAAI,CAAC,MAAO,QAAO;AACnB,WACE,IAAI,KAAK,WAAW,KAAK,KACzB,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EAEhD,CAAC,IACD,CAAC;AAGL,EAAAC,WAAU,MAAM;AACd,qBAAiB,YAAY,SAAS,IAAI,IAAI,EAAE;AAAA,EAClD,GAAG,CAAC,KAAK,CAAC;AAGV,QAAM,eAAeD,QAAsB,IAAI;AAE/C,EAAAC,WAAU,MAAM;AACd,QAAI,aAAa,YAAY,MAAM;AACjC,eAAS,aAAa,OAAO;AAC7B,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,mBAAmB,MAAM;AAC7B,QAAI,iBAAiB,KAAK,gBAAgB,YAAY,QAAQ;AAC5D,YAAM,MAAM,YAAY,aAAa;AACrC,YAAM,YAAY,MAAM,IAAI,QAAQ,IAAI,QAAQ,MAAM;AAEtD,mBAAa,UAAU;AACvB,kBAAY,CAAC,MAAM,IAAI,CAAC;AAAA,IAC1B;AAAA,EACF;AAGA,EAAAC,UAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,mBAAmB,YAAY,SAAS,GAAG;AAC7C,UAAI,IAAI,WAAW;AACjB;AAAA,UAAiB,CAAC,SAChB,OAAO,YAAY,SAAS,IAAI,OAAO,IAAI;AAAA,QAC7C;AACA;AAAA,MACF;AACA,UAAI,IAAI,SAAS;AACf;AAAA,UAAiB,CAAC,SAChB,OAAO,IAAI,OAAO,IAAI,YAAY,SAAS;AAAA,QAC7C;AACA;AAAA,MACF;AACA,UAAI,IAAI,KAAK;AACX,yBAAiB;AACjB;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,YAAY,SAAS,GAAG;AACzC,UAAI,iBAAiB,IAAI;AACvB,mBAAW,UAAU;AAAA,MACvB;AACA,YAAM,OAAO,KAAK,IAAI,eAAe,GAAG,YAAY,SAAS,CAAC;AAC9D,sBAAgB,IAAI;AACpB,mBAAa,UAAU,YAAY,IAAI;AACvC,kBAAY,CAAC,MAAM,IAAI,CAAC;AACxB;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,gBAAgB,GAAG;AACtC,YAAM,OAAO,eAAe;AAC5B,sBAAgB,IAAI;AACpB,mBAAa,UAAU,SAAS,KAAK,WAAW,UAAU,YAAY,IAAI;AAC1E,kBAAY,CAAC,MAAM,IAAI,CAAC;AACxB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM;AAEzB,QAAI,mBAAmB,iBAAiB,KAAK,gBAAgB,YAAY,QAAQ;AAC/E,YAAM,MAAM,YAAY,aAAa;AACrC,YAAM,YAAY,MAAM,IAAI;AAC5B,UAAI,UAAU,aAAa,UAAU,YAAY,KAAK;AACpD,yBAAiB;AACjB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,SAAS;AACX,eAAS,OAAO;AAEhB,mBAAa,UAAU;AACvB,kBAAY,CAAC,MAAM,IAAI,CAAC;AACxB,uBAAiB,EAAE;AACnB,sBAAgB,EAAE;AAClB,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,qBAAqB,YAAY,MAAM,GAAG,CAAC;AAEjD,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,YACjB,gBAAAD,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,QAAO,MAAI,QAAE,SAAU,GACnC,gBAAAF,OAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAY;AAAA;AAAA,EACd,CACF,GACC,mBAAmB,SAAS,KAAK,mBAChC,gBAAAH,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,YAAY,KACrC,mBAAmB,IAAI,CAAC,KAAK,QAAQ;AACpC,UAAM,aAAa,QAAQ;AAC3B,WACE,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,IAAI,QACZ,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,aAAa,SAAS,UAChC,aAAa,aAAa,KAC7B,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAO,aAAa,SAAS,SAAS,MAAM,cAAY,KAC1D,IAAI,IACR,GACC,IAAI,SACH,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAO,aAAa,SAAS,QAAQ,UAAU,CAAC,cACnD,KAAK,IAAI,KACZ,GAEF,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,YAAY,IAAI,WAAY,CAC9C;AAAA,EAEJ,CAAC,GACD,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACd,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,uDAAwD,CAC1E,CACF,CAEJ;AAEJ;;;AOvKA,OAAOE,YAAW;AAClB,SAAS,QAAAC,OAAM,OAAAC,YAAW;AAC1B,OAAO,gBAAgB;AAMhB,IAAM,UAAkC,CAAC,EAAE,KAAK,MAAM;AAC3D,SACE,gBAAAF,OAAA,cAACE,MAAA,MACC,gBAAAF,OAAA,cAACC,OAAA,EAAK,OAAM,UACV,gBAAAD,OAAA,cAAC,cAAW,MAAK,QAAO,CAC1B,GACC,QAAQ,gBAAAA,OAAA,cAACC,OAAA,EAAK,UAAQ,QAAC,KAAE,IAAK,CACjC;AAEJ;;;ACjBA,OAAOE,UAAS,YAAAC,WAAU,aAAAC,YAAW,eAAe;AACpD,SAAS,QAAAC,OAAM,OAAAC,YAAW;AAG1B,IAAM,cAAc;AAKpB,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,YAAwB,UAAU;AAAA,EAAI,CAAC,SAC3C,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,OAAO;AACpB,UAAM,MAAM,YAAY,QAAQ,EAAE;AAClC,WAAO,OAAO,IAAI,MAAM;AAAA,EAC1B,CAAC;AACH;AACA,IAAM,OAAoB,UAAU,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AACtE,IAAM,QAAQ,UAAU,CAAC,EAAE;AAsB3B,IAAM,QAAsC;AAAA,EAC1C,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAChE;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAChE;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAChE;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAChE;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAChE;AACF;AASA,SAAS,aAAa,MAAc,KAAmC;AAErE,QAAM,UACJ,KAAK,IAAI,OAAO,IAAI,eAAe,KAAK,KAAK,CAAC,IAAI,IAAI;AAExD,SAAO,UAAU;AAAA,IAAI,CAAC,KAAK,MACzB,IAAI,IAAI,CAAC,MAAM,MAAM;AACnB,UAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAG,QAAO,EAAE,MAAM,KAAK,OAAO,GAAG;AAG/C,YAAM,QAAS,IAAI,QAAQ,IAAI,OAAQ,OAAO,IAAI;AAClD,YAAM,OAAO,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,IAAI;AAGjD,YAAM,UACJ,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO,OAAO,GAAG,IAAI,IAAI;AAGlD,YAAM,MAAM,OAAO,OAAO,UAAU;AACpC,YAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC;AAE1D,aAAO;AAAA,QACL,MAAM,YAAY,SAAS;AAAA,QAC3B,OAAO,IAAI,OAAO,SAAS;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAWO,IAAM,OAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIH,UAAS,MAAM,KAAK,IAAI,IAAI,GAAI;AACxD,QAAM,MAAM,MAAM,IAAI;AAGtB,EAAAC,WAAU,MAAM;AACd,UAAM,WAAW,KAAK,MAAM,MAAO,IAAI,GAAG;AAC1C,UAAM,KAAK,YAAY,MAAM,QAAQ,KAAK,IAAI,IAAI,GAAI,GAAG,QAAQ;AACjE,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,IAAI,GAAG,CAAC;AAEZ,QAAM,QAAQ,QAAQ,MAAM,aAAa,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC;AAEhE,QAAM,WAAW,MACb,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI,GAAG,IACvC;AAGJ,QAAM,OAAsC;AAAA,IAC1C;AAAA;AAAA,IACA,gBAAAF,OAAA,cAAAA,OAAA,gBAAE,gBAAAA,OAAA,cAACG,OAAA,EAAK,OAAM,QAAO,MAAI,QAAC,KAAG,GAAO,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAE,MAAM,OAAQ,CAAO;AAAA,IACzE,gBAAAH,OAAA,cAACG,OAAA,MAAM,KAAM;AAAA,IACb,WAAW,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAE,QAAS,IAAU;AAAA,IAC9C;AAAA;AAAA,EACF;AAEA,SACE,gBAAAH,OAAA,cAACI,MAAA,EAAI,eAAc,YAChB,MAAM,IAAI,CAAC,KAAK,MACf,gBAAAJ,OAAA,cAACI,MAAA,EAAI,KAAK,KACR,gBAAAJ,OAAA,cAACG,OAAA,MACE,IAAI;AAAA,IAAI,CAAC,MAAM,MACd,KAAK,SAAS,MACZ,gBAAAH,OAAA,cAACG,OAAA,EAAK,KAAK,KAAI,GAAI,IAEnB,gBAAAH,OAAA,cAACG,OAAA,EAAK,KAAK,GAAG,OAAO,KAAK,SACvB,KAAK,IACR;AAAA,EAEJ,CACF,GACC,KAAK,CAAC,KAAK,QACV,gBAAAH,OAAA,cAAAA,OAAA,gBACE,gBAAAA,OAAA,cAACG,OAAA,MAAM,IAAK,GACX,KAAK,CAAC,CACT,CAEJ,CACD,CACH;AAEJ;;;AhB/KA,SAAS,qBAAqB;AAE9B,IAAME,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,SAAS,YAAY,IAAIA,SAAQ,iBAAiB;AAQnD,IAAM,MAA0B,CAAC,EAAE,KAAK,MAAM;AACnD,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAgB,KAAK,OAAO,cAAc,OAAO;AAC3E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK,QAAQ,EAAE;AAG9D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAmB,CAAC,CAAC;AAG3D,QAAM,aAAaC,SAAQ,MAAM,eAAe,GAAG,CAAC,CAAC;AACrD,EAAAA,SAAQ,MAAM,UAAU,GAAG,CAAC,CAAC;AAG7B,EAAAC,WAAU,MAAM;AACd,aAAS,cAAc;AAAA,EACzB,GAAG,CAAC,CAAC;AAGL,QAAM,gBAA+BD,SAAQ,MAAM;AACjD,UAAM,SAAS,kBAAkB;AACjC,UAAM,OAAO,CAAC;AACd,QAAI,OAAO,aAAa,SAAS,GAAG;AAClC,WAAK,KAAK,GAAG,iBAAiB,OAAO,YAAY,CAAC;AAAA,IACpD;AACA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,WAAK,KAAK,GAAG,kBAAkB,OAAO,MAAM,CAAC;AAAA,IAC/C;AACA,QAAI,KAAK,SAAS,GAAG;AACnB,uBAAiB,IAAI;AAAA,IACvB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAGL,QAAM,CAAC,OAAO,QAAQ,IAAID,UAAS,KAAK,UAAU,kBAAkB,KAAK,QAAS,WAAW,SAAS,KAAK,KAAM;AACjH,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK,YAAY,WAAW,WAAW,MAAM;AACpF,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK,cAAc,WAAW,aAAa,MAAM;AAC5F,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,WAAW,WAAW,KAAK;AAGlE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,IAAI;AAGxE,QAAM,gBAAgBG,QAAsB,IAAI;AAEhD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,CAAC,WAAW;AAEtB,UAAI,aAAa;AACf,cAAM,QAAsB;AAAA,UAC1B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,MAAM;AAAA,UACN;AAAA,UACA,YAAY,cAAc,UACtB,KAAK,IAAI,IAAI,cAAc,UAC3B;AAAA,UACJ,SAAS,QAAQ;AAAA,QACnB;AACA,sBAAc,KAAK;AACnB,sBAAc,UAAU;AAGxB,iBAAS,gBAAgB;AAAA,UACvB,UAAU;AAAA,UACV,aAAa,OAAO,QAAQ,WAAW,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH;AACA,eAAS,OAAO;AAAA,IAClB;AAAA,EACF,CAAC;AAGD,EAAAD,WAAU,MAAM;AACd,QAAI,UAAU,eAAe,aAAa;AACxC,oBAAc,UAAU,KAAK,IAAI;AACjC,YAAM,wBAAwB,aAAa,aAAa,CAAC;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,OAAO,aAAa,CAAC;AAE7C,QAAM,UAAUE,aAAY,CAAC,SAAiB;AAC5C,sBAAkB,IAAI;AACtB,mBAAe,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC;AAClE,mBAAe,IAAI;AACnB,aAAS,WAAW;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,MAAM,KAAK;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,UAAU,YAAY,CAAC;AAAA,EACzB;AAEA,QAAM,mBAAmBA;AAAA,IACvB,CAAC,UAAkB;AAEjB,YAAM,SAAS,kBAAkB,KAAK;AACtC,UAAI,QAAQ;AACV,cAAM,SAAS,OAAO,QAAQ,QAAQ,OAAO,MAAM,cAAc;AACjE,0BAAkB,MAAM;AAExB,YAAI,QAAQ;AACV,qBAAW,MAAM,kBAAkB,IAAI,GAAG,GAAI;AAAA,QAChD;AACA;AAAA,MACF;AAEA,wBAAkB,IAAI;AACtB,qBAAe,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AACpE,qBAAe,KAAK;AACpB,eAAS,WAAW;AAAA,IACtB;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,iBAAe;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ,YAAY;AAClB,UAAI,UAAU,aAAa;AACzB,cAAM,KAAK;AAAA,MACb;AACA,WAAK;AAAA,IACP;AAAA,IACA,UAAU,UAAU;AAAA,IACpB,UAAU,UAAU,WAAW,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAAA,EACvD,CAAC;AAED,QAAM,aAAa,UAAU,cAAc,UAAU,aAAa,UAAU;AAG5E,QAAM,YAAsB,MAAM;AAChC,QAAI,UAAU,QAAS,QAAO;AAC9B,QAAI,UAAU,QAAS,QAAO;AAC9B,QAAI,UAAU,WAAY,QAAO;AACjC,QAAI,UAAU,SAAU,QAAO;AAC/B,WAAO;AAAA,EACT,GAAG;AAEH,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,YAEjB,gBAAAD,OAAA,cAACC,MAAA,EAAI,eAAc,YACjB,gBAAAD,OAAA,cAAC,QAAK,SAAS,aAAa,OAAc,KAAK,QAAQ,IAAI,GAAG,MAAM,UAAU,GAC7E,UAAU,WAAW,OAAO,WAAW,KACtC,gBAAAA,OAAA,cAAAA,OAAA,gBACG,cAAc,gBACb,gBAAAA,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,YAAY,KAC7B,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,gBAAiB,GACjC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,cAAc,gBAAiB,CACtD,GAED,cAAc,MAAM,SAAS,KAC5B,gBAAAF,OAAA,cAACC,MAAA,EAAI,YAAY,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,SAAU,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,cAAc,MAAM,MAAO,GAChD,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,2BAA4B,CAC9C,GAED,cAAc,aAAa,SAAS,KACnC,gBAAAF,OAAA,cAACC,MAAA,EAAI,YAAY,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,SAAU,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,cAAc,aAAa,MAAO,GACvD,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,wCAAyC,CAC3D,GAED,cAAc,OAAO,SAAS,KAC7B,gBAAAF,OAAA,cAACC,MAAA,EAAI,YAAY,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,SAAU,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,cAAc,OAAO,MAAO,GACjD,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,6BAA8B,CAChD,CAEJ,CAEJ,GAGC,UAAU,eACT,gBAAAF,OAAA,cAAC,aAAU,OAAc,MAAY,MAAM,aAAa,GAI1D,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,WAAW,KACrC,gBAAAD,OAAA,cAAC,gBAAa,QAAgB,WAAW,UAAU,IAAI,IAAI,GAE1D,UAAU,eAAe,UAAU,aAClC,gBAAAA,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,YAAa,GAC7B,gBAAAF,OAAA,cAAC,aAAQ,CACX,GAGD,UAAU,eAAe,UAAU,YAClC,gBAAAA,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,YAAa,GAC7B,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAS,MAAI,QAAE,cAAe,GAC1C,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,gCAAiC,CACnD,CAEJ,GAEC,kBACC,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACd,gBAAAD,OAAA,cAAC,iBAAc,QAAQ,gBAAgB,WAAW,gBAAgB,CACpE,GAGD,mBACC,gBAAAA,OAAA,cAACC,MAAA,EAAI,WAAW,KACd,gBAAAD,OAAA,cAAC,kBAAe,UAAU,iBAAiB,UAAU,eAAe,CACtE,GAID,kBAAkB,UAAU,WAC3B,gBAAAA,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,cAAe,CACrC,GAID,UAAU,WACT,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACd,gBAAAD,OAAA,cAAC,eAAY,UAAU,kBAAkB,aAA0B,CACrE,GAID,UAAU,eAAe,CAAC,cAAc,CAAC,kBAAkB,CAAC,mBAC3D,gBAAAA,OAAA,cAACC,MAAA,EAAI,WAAW,KACd,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,4CAAiD,CACnE,CAEJ;AAEJ;;;ANpRA,eAAe,OAAsB;AACnC,MAAI;AACF,UAAM,SAAS,MAAM,UAAU;AAG/B,QAAI,OAAO,SAAS,WAAW;AAC7B;AAAA,IACF;AAEA,UAAM,EAAE,KAAK,IAAI;AAGjB,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,yBAAyB;AACvC,cAAQ,MAAM,EAAE;AAChB,cAAQ,MAAM,kEAAkE;AAChF,cAAQ,MAAM,+BAA+B;AAC7C,cAAQ,MAAM,EAAE;AAChB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,CAAC,QAAQ,IAAI,eAAe,CAAC,QAAQ,IAAI,mBAAmB;AAC9D,cAAQ,IAAI,cAAc;AAAA,IAC5B;AAGA,QAAI,CAACC,mBAAkB,GAAG;AACxB,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,MAAM,EAAE;AAChB,cAAQ,MAAM,0DAA0D;AACxE,cAAQ,MAAM,4DAA4D;AAC1E,cAAQ,MAAM,EAAE;AAChB,cAAQ,MAAM,+CAA+C;AAC7D,cAAQ,MAAM,EAAE;AAChB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,EAAE,cAAc,IAAI,OAAO,gBAAAC,QAAA,cAAC,OAAI,MAAY,CAAE;AACpD,UAAM,cAAc;AAAA,EACtB,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,KAAK;AAC7B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":["React","isBinaryAvailable","yargs","React","useEffect","useState","useCallback","useMemo","useRef","Box","Text","useCallback","React","Text","Box","React","useState","useEffect","Text","React","Box","Text","React","useState","Text","Box","useInput","React","useState","Text","Box","useInput","React","useState","useEffect","useRef","Text","Box","useInput","TextInput","readFileSync","basename","os","fs","path","os","readFileSync","join","fs","path","os","join","readFileSync","fs","path","os","ensureDir","fs","path","execSync","os","parseFrontmatter","readFileSync","basename","useState","useRef","useEffect","useInput","React","Box","Text","TextInput","React","Text","Box","React","useState","useEffect","Text","Box","require","useState","useMemo","useEffect","useRef","useCallback","React","Box","Text","isBinaryAvailable","React"]}
|