@agi_inc/cli 0.5.7 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.tsx
2
- import React9 from "react";
2
+ import React10 from "react";
3
3
  import { render } from "ink";
4
4
  import { isBinaryAvailable } from "@agi_inc/agi-js";
5
5
 
@@ -288,8 +288,8 @@ async function parseArgs() {
288
288
  }
289
289
 
290
290
  // src/app/App.tsx
291
- import React8, { useEffect as useEffect4, useState as useState6, useCallback as useCallback3, useMemo } from "react";
292
- import { Box as Box7, Text as Text8, useApp } from "ink";
291
+ import React9, { useEffect as useEffect4, useState as useState6, useCallback as useCallback3, useMemo } from "react";
292
+ import { Box as Box8, Text as Text9, useApp } from "ink";
293
293
 
294
294
  // src/hooks/useAgent.ts
295
295
  import { useState, useCallback, useRef, useEffect } from "react";
@@ -669,7 +669,7 @@ var QuestionDialog = ({ question, onAnswer }) => {
669
669
  };
670
670
 
671
671
  // src/components/PromptInput.tsx
672
- import React6, { useState as useState5, useEffect as useEffect3 } from "react";
672
+ import React6, { useState as useState5, useEffect as useEffect3, useRef as useRef2 } from "react";
673
673
  import { Text as Text6, Box as Box5, useInput as useInput4 } from "ink";
674
674
  import TextInput2 from "ink-text-input";
675
675
 
@@ -846,6 +846,7 @@ function getAllCommands() {
846
846
  var PromptInput = ({ onSubmit }) => {
847
847
  const [value, setValue] = useState5("");
848
848
  const [selectedIndex, setSelectedIndex] = useState5(-1);
849
+ const [inputKey, setInputKey] = useState5(0);
849
850
  const showSuggestions = value.startsWith("/") && value.length > 0 && !value.includes(" ");
850
851
  const suggestions = showSuggestions ? getAllCommands().filter((cmd) => {
851
852
  const typed = value.slice(1).toLowerCase();
@@ -855,6 +856,21 @@ var PromptInput = ({ onSubmit }) => {
855
856
  useEffect3(() => {
856
857
  setSelectedIndex(suggestions.length > 0 ? 0 : -1);
857
858
  }, [value]);
859
+ const pendingValue = useRef2(null);
860
+ useEffect3(() => {
861
+ if (pendingValue.current !== null) {
862
+ setValue(pendingValue.current);
863
+ pendingValue.current = null;
864
+ }
865
+ }, [inputKey]);
866
+ const completeSelected = () => {
867
+ if (selectedIndex >= 0 && selectedIndex < suggestions.length) {
868
+ const cmd = suggestions[selectedIndex];
869
+ const completed = "/" + cmd.name + (cmd.usage ? " " : "");
870
+ pendingValue.current = completed;
871
+ setInputKey((k) => k + 1);
872
+ }
873
+ };
858
874
  useInput4((input, key) => {
859
875
  if (!showSuggestions || suggestions.length === 0) return;
860
876
  if (key.downArrow) {
@@ -867,9 +883,8 @@ var PromptInput = ({ onSubmit }) => {
867
883
  (prev) => prev > 0 ? prev - 1 : suggestions.length - 1
868
884
  );
869
885
  }
870
- if (key.tab && selectedIndex >= 0 && selectedIndex < suggestions.length) {
871
- const cmd = suggestions[selectedIndex];
872
- setValue("/" + cmd.name + (cmd.usage ? " " : ""));
886
+ if (key.tab) {
887
+ completeSelected();
873
888
  }
874
889
  });
875
890
  const handleSubmit = () => {
@@ -877,14 +892,15 @@ var PromptInput = ({ onSubmit }) => {
877
892
  const cmd = suggestions[selectedIndex];
878
893
  const completed = "/" + cmd.name;
879
894
  if (value !== completed && value !== completed + " ") {
880
- setValue(completed + (cmd.usage ? " " : ""));
895
+ completeSelected();
881
896
  return;
882
897
  }
883
898
  }
884
899
  const trimmed = value.trim();
885
900
  if (trimmed) {
886
901
  onSubmit(trimmed);
887
- setValue("");
902
+ pendingValue.current = "";
903
+ setInputKey((k) => k + 1);
888
904
  setSelectedIndex(-1);
889
905
  }
890
906
  };
@@ -892,6 +908,7 @@ var PromptInput = ({ onSubmit }) => {
892
908
  return /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "cyan", bold: true }, "\u25B8 "), /* @__PURE__ */ React6.createElement(
893
909
  TextInput2,
894
910
  {
911
+ key: inputKey,
895
912
  value,
896
913
  onChange: setValue,
897
914
  onSubmit: handleSubmit,
@@ -911,6 +928,19 @@ var Spinner = ({ text }) => {
911
928
  return /* @__PURE__ */ React7.createElement(Box6, null, /* @__PURE__ */ React7.createElement(Text7, { color: "cyan" }, /* @__PURE__ */ React7.createElement(InkSpinner, { type: "dots" })), text && /* @__PURE__ */ React7.createElement(Text7, { dimColor: true }, " ", text));
912
929
  };
913
930
 
931
+ // src/components/Logo.tsx
932
+ import React8 from "react";
933
+ import { Text as Text8, Box as Box7 } from "ink";
934
+ var LOGO_LINES = [
935
+ " \u2584\u2580\u2580\u2584\u2584\u2580\u2580\u2584 ",
936
+ "\u2588 \u2580\u2584\u2580\u2584 \u2588",
937
+ " \u2580\u2584\u2584\u2580 \u2580\u2584\u2584\u2580 "
938
+ ];
939
+ var Logo = ({ version, model, cwd }) => {
940
+ const shortCwd = cwd ? cwd.replace(process.env.HOME || "", "~") : void 0;
941
+ return /* @__PURE__ */ React8.createElement(Box7, { flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text8, { color: "cyan" }, LOGO_LINES[0]), /* @__PURE__ */ React8.createElement(Text8, null, " "), /* @__PURE__ */ React8.createElement(Text8, { color: "cyan", bold: true }, "AGI"), /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, " v", version)), /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text8, { color: "cyan" }, LOGO_LINES[1]), /* @__PURE__ */ React8.createElement(Text8, null, " "), /* @__PURE__ */ React8.createElement(Text8, null, model)), /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text8, { color: "cyan" }, LOGO_LINES[2]), /* @__PURE__ */ React8.createElement(Text8, null, " "), shortCwd && /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, shortCwd)));
942
+ };
943
+
914
944
  // src/project.ts
915
945
  import { readFileSync as readFileSync3, existsSync, readdirSync } from "fs";
916
946
  import { join as join2 } from "path";
@@ -963,6 +993,9 @@ function withProjectInstructions(goal, config) {
963
993
  }
964
994
 
965
995
  // src/app/App.tsx
996
+ import { createRequire } from "module";
997
+ var require2 = createRequire(import.meta.url);
998
+ var { version: CLI_VERSION } = require2("../../package.json");
966
999
  var App = ({ args }) => {
967
1000
  const { exit } = useApp();
968
1001
  const [phase, setPhase] = useState6(args.goal ? "executing" : "input");
@@ -1051,7 +1084,7 @@ var App = ({ args }) => {
1051
1084
  disabled: phase === "input" || !!pendingConfirm || !!pendingQuestion
1052
1085
  });
1053
1086
  const isTerminal = state === "finished" || state === "stopped" || state === "error";
1054
- return /* @__PURE__ */ React8.createElement(Box7, { flexDirection: "column" }, phase === "input" && events.length === 0 && /* @__PURE__ */ React8.createElement(Box7, { flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Box7, { borderStyle: "bold", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React8.createElement(Text8, { color: "cyan", bold: true }, "\u25B8 AGI"), /* @__PURE__ */ React8.createElement(Text8, null, " interactive mode")), projectConfig.instructions && /* @__PURE__ */ React8.createElement(Box7, { marginLeft: 2 }, /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, "\u25B8 loaded "), /* @__PURE__ */ React8.createElement(Text8, { color: "green" }, projectConfig.instructionsPath)), projectConfig.commandFiles.length > 0 && /* @__PURE__ */ React8.createElement(Box7, { marginLeft: 2 }, /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, "\u25B8 "), /* @__PURE__ */ React8.createElement(Text8, { color: "green" }, projectConfig.commandFiles.length), /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, " custom command(s) from .agi/commands/"))), phase === "executing" && /* @__PURE__ */ React8.createElement(StatusBar, { state, step, goal: currentGoal }), /* @__PURE__ */ React8.createElement(Box7, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React8.createElement(EventDisplay, { events }), phase === "executing" && state === "running" && /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, " \u2503 "), /* @__PURE__ */ React8.createElement(Spinner, null)), phase === "executing" && state === "paused" && /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, " \u2503 "), /* @__PURE__ */ React8.createElement(Text8, { color: "yellow", bold: true }, "\u25AE\u25AE"), /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, " paused \u2014 space to resume"))), pendingConfirm && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(ConfirmDialog, { reason: pendingConfirm, onConfirm: respondConfirm })), pendingQuestion && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(QuestionDialog, { question: pendingQuestion, onAnswer: respondAnswer })), commandMessage && phase === "input" && /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text8, { color: "gray" }, commandMessage)), phase === "input" && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(PromptInput, { onSubmit: handleSubmitGoal })), phase === "executing" && !isTerminal && !pendingConfirm && !pendingQuestion && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(Text8, { dimColor: true }, " space pause \xB7 q stop \xB7 ^c quit")));
1087
+ return /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column" }, phase === "input" && events.length === 0 && /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column" }, /* @__PURE__ */ React9.createElement(Logo, { version: CLI_VERSION, model, cwd: process.cwd() }), 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.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/"))), phase === "executing" && /* @__PURE__ */ React9.createElement(StatusBar, { state, step, goal: currentGoal }), /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React9.createElement(EventDisplay, { events }), 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 })), 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")));
1055
1088
  };
1056
1089
 
1057
1090
  // src/index.tsx
@@ -1084,7 +1117,7 @@ async function main() {
1084
1117
  console.error("");
1085
1118
  process.exit(1);
1086
1119
  }
1087
- const { waitUntilExit } = render(/* @__PURE__ */ React9.createElement(App, { args }));
1120
+ const { waitUntilExit } = render(/* @__PURE__ */ React10.createElement(App, { args }));
1088
1121
  await waitUntilExit();
1089
1122
  } catch (error) {
1090
1123
  console.error("Error:", error);
@@ -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/components/Spinner.tsx","../src/project.ts"],"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 } 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 { parseSlashCommand, loadUserCommands, registerCommands } from '../commands/slash.js';\nimport type { CommandContext } from '../commands/slash.js';\nimport { loadProjectConfig, withProjectInstructions } from '../project.js';\nimport type { ProjectConfig } from '../project.js';\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 // Load project config and user commands once on mount\n const projectConfig: ProjectConfig = useMemo(() => {\n const config = loadProjectConfig();\n if (config.commandFiles.length > 0) {\n const userCmds = loadUserCommands(config.commandFiles);\n registerCommands(userCmds);\n }\n return config;\n }, []);\n\n // Mutable settings that slash commands can change\n const [model, setModel] = useState(args.model);\n const [verbose, setVerbose] = useState(args.verbose);\n const [noConfirm, setNoConfirm] = useState(args.noConfirm);\n\n // Transient message shown after a slash command runs\n const [commandMessage, setCommandMessage] = useState<string | 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: () => {\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 start(withProjectInstructions(currentGoal, projectConfig));\n }\n }, [phase, currentGoal, start, projectConfig]);\n\n const runGoal = useCallback((goal: string) => {\n setCommandMessage(null);\n setCurrentGoal(goal);\n setPhase('executing');\n }, []);\n\n const commandContext: CommandContext = {\n model,\n verbose,\n noConfirm,\n setModel,\n setVerbose,\n setNoConfirm,\n clearEvents,\n quit: () => exit(),\n runGoal,\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 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 return (\n <Box flexDirection=\"column\">\n {/* Header: show interactive mode box when in input phase with no events */}\n {phase === 'input' && events.length === 0 && (\n <Box flexDirection=\"column\">\n <Box borderStyle=\"bold\" borderColor=\"gray\" paddingX={1}>\n <Text color=\"cyan\" bold>{'\\u25B8 AGI'}</Text>\n <Text>{' interactive mode'}</Text>\n </Box>\n {projectConfig.instructions && (\n <Box marginLeft={2}>\n <Text dimColor>{'\\u25B8 loaded '}</Text>\n <Text color=\"green\">{projectConfig.instructionsPath}</Text>\n </Box>\n )}\n {projectConfig.commandFiles.length > 0 && (\n <Box marginLeft={2}>\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 </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} />\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} />\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 } 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}\n\nexport const PromptInput: React.FC<PromptInputProps> = ({ onSubmit }) => {\n const [value, setValue] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(-1);\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 // Handle arrow keys and tab for suggestion navigation\n useInput((input, key) => {\n if (!showSuggestions || suggestions.length === 0) return;\n\n if (key.downArrow) {\n setSelectedIndex((prev) =>\n prev < suggestions.length - 1 ? prev + 1 : 0\n );\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) =>\n prev > 0 ? prev - 1 : suggestions.length - 1\n );\n }\n\n // Tab completes the selected suggestion\n if (key.tab && selectedIndex >= 0 && selectedIndex < suggestions.length) {\n const cmd = suggestions[selectedIndex];\n setValue('/' + cmd.name + (cmd.usage ? ' ' : ''));\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 the typed value is a partial match, fill it in\n if (value !== completed && value !== completed + ' ') {\n setValue(completed + (cmd.usage ? ' ' : ''));\n return;\n }\n }\n\n const trimmed = value.trim();\n if (trimmed) {\n onSubmit(trimmed);\n setValue('');\n setSelectedIndex(-1);\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 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 both built-in commands and user-defined commands loaded\n * from .agi/commands/*.md files (following the agentskills.io convention).\n */\n\nimport { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\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 /** 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 setModel: (model: string) => void;\n setVerbose: (verbose: boolean) => void;\n setNoConfirm: (noConfirm: 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}\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);\n const userDefined = all.filter((c) => c.isUserDefined);\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 lines.push('');\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: '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: '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/** Mutable registry that includes both built-in and user-defined 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) */\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","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","/**\n * Project instructions 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:\n * 1. AGI.md in cwd\n * 2. .agi/AGI.md\n * 3. .agi/instructions.md\n *\n * Also scans .agi/commands/ for user-defined slash commands (handled\n * separately by the slash command system).\n */\n\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\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}\n\nconst INSTRUCTION_FILES = ['AGI.md', '.agi/AGI.md', '.agi/instructions.md'];\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 return {\n instructions,\n instructionsPath,\n agiDir: agiDirExists ? agiDir : null,\n commandFiles,\n };\n}\n\n/**\n * Format project instructions as a prefix for the agent goal.\n * Returns the original goal if no instructions are found.\n */\nexport function withProjectInstructions(goal: string, config: ProjectConfig): string {\n if (!config.instructions) return goal;\n\n return [\n '--- Project Instructions (from ' + (config.instructionsPath ?? 'AGI.md') + ') ---',\n config.instructions,\n '--- End Project Instructions ---',\n '',\n 'Task: ' + goal,\n ].join('\\n');\n}\n"],"mappings":"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","names":["React","yargs","React","useEffect","useState","useCallback","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","Text","Box","useInput","TextInput","readFileSync","useState","useEffect","useInput","React","Box","Text","TextInput","React","Text","Box","readFileSync","join","useState","useEffect","useCallback","React","Box","Text","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/components/Spinner.tsx","../src/components/Logo.tsx","../src/project.ts"],"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 } 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 { parseSlashCommand, loadUserCommands, 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 { 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 // Load project config and user commands once on mount\n const projectConfig: ProjectConfig = useMemo(() => {\n const config = loadProjectConfig();\n if (config.commandFiles.length > 0) {\n const userCmds = loadUserCommands(config.commandFiles);\n registerCommands(userCmds);\n }\n return config;\n }, []);\n\n // Mutable settings that slash commands can change\n const [model, setModel] = useState(args.model);\n const [verbose, setVerbose] = useState(args.verbose);\n const [noConfirm, setNoConfirm] = useState(args.noConfirm);\n\n // Transient message shown after a slash command runs\n const [commandMessage, setCommandMessage] = useState<string | 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: () => {\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 start(withProjectInstructions(currentGoal, projectConfig));\n }\n }, [phase, currentGoal, start, projectConfig]);\n\n const runGoal = useCallback((goal: string) => {\n setCommandMessage(null);\n setCurrentGoal(goal);\n setPhase('executing');\n }, []);\n\n const commandContext: CommandContext = {\n model,\n verbose,\n noConfirm,\n setModel,\n setVerbose,\n setNoConfirm,\n clearEvents,\n quit: () => exit(),\n runGoal,\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 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 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()} />\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.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 </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} />\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} />\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}\n\nexport const PromptInput: React.FC<PromptInputProps> = ({ onSubmit }) => {\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\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\n useInput((input, key) => {\n if (!showSuggestions || suggestions.length === 0) return;\n\n if (key.downArrow) {\n setSelectedIndex((prev) =>\n prev < suggestions.length - 1 ? prev + 1 : 0\n );\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) =>\n prev > 0 ? prev - 1 : suggestions.length - 1\n );\n }\n\n // Tab completes the selected suggestion\n if (key.tab) {\n completeSelected();\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 }\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 both built-in commands and user-defined commands loaded\n * from .agi/commands/*.md files (following the agentskills.io convention).\n */\n\nimport { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\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 /** 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 setModel: (model: string) => void;\n setVerbose: (verbose: boolean) => void;\n setNoConfirm: (noConfirm: 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}\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);\n const userDefined = all.filter((c) => c.isUserDefined);\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 lines.push('');\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: '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: '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/** Mutable registry that includes both built-in and user-defined 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) */\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","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 from 'react';\nimport { Text, Box } from 'ink';\n\ninterface LogoProps {\n version: string;\n model: string;\n cwd?: string;\n}\n\n// ASCII infinity logo using Unicode block characters\n// Inspired by the AGI infinity symbol brand mark\nconst LOGO_LINES = [\n ' \\u2584\\u2580\\u2580\\u2584\\u2584\\u2580\\u2580\\u2584 ',\n '\\u2588 \\u2580\\u2584\\u2580\\u2584 \\u2588',\n ' \\u2580\\u2584\\u2584\\u2580 \\u2580\\u2584\\u2584\\u2580 ',\n];\n\nexport const Logo: React.FC<LogoProps> = ({ version, model, cwd }) => {\n const shortCwd = cwd\n ? cwd.replace(process.env.HOME || '', '~')\n : undefined;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">{LOGO_LINES[0]}</Text>\n <Text>{' '}</Text>\n <Text color=\"cyan\" bold>AGI</Text>\n <Text dimColor>{' v'}{version}</Text>\n </Box>\n <Box>\n <Text color=\"cyan\">{LOGO_LINES[1]}</Text>\n <Text>{' '}</Text>\n <Text>{model}</Text>\n </Box>\n <Box>\n <Text color=\"cyan\">{LOGO_LINES[2]}</Text>\n <Text>{' '}</Text>\n {shortCwd && <Text dimColor>{shortCwd}</Text>}\n </Box>\n </Box>\n );\n};\n","/**\n * Project instructions 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:\n * 1. AGI.md in cwd\n * 2. .agi/AGI.md\n * 3. .agi/instructions.md\n *\n * Also scans .agi/commands/ for user-defined slash commands (handled\n * separately by the slash command system).\n */\n\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\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}\n\nconst INSTRUCTION_FILES = ['AGI.md', '.agi/AGI.md', '.agi/instructions.md'];\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 return {\n instructions,\n instructionsPath,\n agiDir: agiDirExists ? agiDir : null,\n commandFiles,\n };\n}\n\n/**\n * Format project instructions as a prefix for the agent goal.\n * Returns the original goal if no instructions are found.\n */\nexport function withProjectInstructions(goal: string, config: ProjectConfig): string {\n if (!config.instructions) return goal;\n\n return [\n '--- Project Instructions (from ' + (config.instructionsPath ?? 'AGI.md') + ') ---',\n config.instructions,\n '--- End Project Instructions ---',\n '',\n 'Task: ' + goal,\n ].join('\\n');\n}\n"],"mappings":";AAWA,OAAOA,aAAW;AAClB,SAAS,cAAc;AACvB,SAAS,yBAAyB;;;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,eAAe;AACjE,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;AAEpD,EAAAC,WAAU,MAAM;AACd,qBAAiB,CAAC;AAAA,EACpB,GAAG,CAAC,IAAI,CAAC;AAET,EAAAA,WAAU,MAAM;AACd,QAAI,iBAAiB,KAAK,QAAQ;AAChC,mBAAa;AACb;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,MAAM;AAE7B,YAAM,OAAO,KAAK,SAAS,KAAK,IAAI,KAAK,SAAS,KAAK,IAAI;AAC3D,uBAAiB,CAAC,SAAS,KAAK,IAAI,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,IAC/D,GAAG,KAAK;AAER,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;;;ADjCA,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,UAAQ,QAAE,iBAAkB,GAClC,gBAAAF,OAAA,cAACE,OAAA,EAAK,MAAI,QAAE,MAAM,IAAK,GACvB,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,eAAgB,CAClC;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;;;AEjHA,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,gBAAgB;AA4BzB,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,aAAa;AACnD,YAAM,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,aAAa;AAErD,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,YAAM,KAAK,EAAE;AACb,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,aAAa,CAAC,IAAI,SAAS;AAC/B,aAAO,kBAAkB,CAAC,IAAI,YAAY,OAAO,KAAK;AAAA,IACxD;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,SAAS,iBAAiB,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,UAAUA,cAAa,UAAU,OAAO;AAC9C,YAAM,EAAE,MAAM,KAAK,IAAI,iBAAiB,OAAO;AAC/C,YAAM,OAAO,SAAS,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;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;;;ADtOO,IAAM,cAA0C,CAAC,EAAE,SAAS,MAAM;AACvE,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,EAAE;AAErD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,CAAC;AAG1C,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,eAAeC,QAAsB,IAAI;AAE/C,EAAAD,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,EAAAE,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,CAAC,mBAAmB,YAAY,WAAW,EAAG;AAElD,QAAI,IAAI,WAAW;AACjB;AAAA,QAAiB,CAAC,SAChB,OAAO,YAAY,SAAS,IAAI,OAAO,IAAI;AAAA,MAC7C;AAAA,IACF;AAEA,QAAI,IAAI,SAAS;AACf;AAAA,QAAiB,CAAC,SAChB,OAAO,IAAI,OAAO,IAAI,YAAY,SAAS;AAAA,MAC7C;AAAA,IACF;AAGA,QAAI,IAAI,KAAK;AACX,uBAAiB;AAAA,IACnB;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;AAAA,IACrB;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;;;AE1IA,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,YAAW;AAClB,SAAS,QAAAC,OAAM,OAAAC,YAAW;AAU1B,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,OAA4B,CAAC,EAAE,SAAS,OAAO,IAAI,MAAM;AACpE,QAAM,WAAW,MACb,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI,GAAG,IACvC;AAEJ,SACE,gBAAAF,OAAA,cAACE,MAAA,EAAI,eAAc,YACjB,gBAAAF,OAAA,cAACE,MAAA,MACC,gBAAAF,OAAA,cAACC,OAAA,EAAK,OAAM,UAAQ,WAAW,CAAC,CAAE,GAClC,gBAAAD,OAAA,cAACC,OAAA,MAAM,IAAK,GACZ,gBAAAD,OAAA,cAACC,OAAA,EAAK,OAAM,QAAO,MAAI,QAAC,KAAG,GAC3B,gBAAAD,OAAA,cAACC,OAAA,EAAK,UAAQ,QAAE,MAAM,OAAQ,CAChC,GACA,gBAAAD,OAAA,cAACE,MAAA,MACC,gBAAAF,OAAA,cAACC,OAAA,EAAK,OAAM,UAAQ,WAAW,CAAC,CAAE,GAClC,gBAAAD,OAAA,cAACC,OAAA,MAAM,IAAK,GACZ,gBAAAD,OAAA,cAACC,OAAA,MAAM,KAAM,CACf,GACA,gBAAAD,OAAA,cAACE,MAAA,MACC,gBAAAF,OAAA,cAACC,OAAA,EAAK,OAAM,UAAQ,WAAW,CAAC,CAAE,GAClC,gBAAAD,OAAA,cAACC,OAAA,MAAM,IAAK,GACX,YAAY,gBAAAD,OAAA,cAACC,OAAA,EAAK,UAAQ,QAAE,QAAS,CACxC,CACF;AAEJ;;;AC1BA,SAAS,gBAAAE,eAAc,YAAY,mBAAmB;AACtD,SAAS,QAAAC,aAAY;AAarB,IAAM,oBAAoB,CAAC,UAAU,eAAe,sBAAsB;AAKnE,SAAS,kBAAkB,MAAc,QAAQ,IAAI,GAAkB;AAC5E,MAAI,eAA8B;AAClC,MAAI,mBAAkC;AAGtC,aAAW,WAAW,mBAAmB;AACvC,UAAM,WAAWA,MAAK,KAAK,OAAO;AAClC,QAAI,WAAW,QAAQ,GAAG;AACxB,UAAI;AACF,uBAAeD,cAAa,UAAU,OAAO,EAAE,KAAK;AACpD,2BAAmB;AACnB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAASC,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;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,eAAe,SAAS;AAAA,IAChC;AAAA,EACF;AACF;AAMO,SAAS,wBAAwB,MAAc,QAA+B;AACnF,MAAI,CAAC,OAAO,aAAc,QAAO;AAEjC,SAAO;AAAA,IACL,qCAAqC,OAAO,oBAAoB,YAAY;AAAA,IAC5E,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,EAAE,KAAK,IAAI;AACb;;;AZ/EA,SAAS,qBAAqB;AAE9B,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,SAAS,YAAY,IAAIA,SAAQ,oBAAoB;AAQtD,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,gBAA+B,QAAQ,MAAM;AACjD,UAAM,SAAS,kBAAkB;AACjC,QAAI,OAAO,aAAa,SAAS,GAAG;AAClC,YAAM,WAAW,iBAAiB,OAAO,YAAY;AACrD,uBAAiB,QAAQ;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAGL,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,KAAK,KAAK;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK,OAAO;AACnD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK,SAAS;AAGzD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,IAAI;AAExE,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,MAAM;AAChB,eAAS,OAAO;AAAA,IAClB;AAAA,EACF,CAAC;AAGD,EAAAC,WAAU,MAAM;AACd,QAAI,UAAU,eAAe,aAAa;AACxC,YAAM,wBAAwB,aAAa,aAAa,CAAC;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,OAAO,aAAa,CAAC;AAE7C,QAAM,UAAUC,aAAY,CAAC,SAAiB;AAC5C,sBAAkB,IAAI;AACtB,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,MAAM,MAAM,KAAK;AAAA,IACjB;AAAA,EACF;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,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;AAE5E,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,YAEhB,UAAU,WAAW,OAAO,WAAW,KACtC,gBAAAD,OAAA,cAACC,MAAA,EAAI,eAAc,YACjB,gBAAAD,OAAA,cAAC,QAAK,SAAS,aAAa,OAAc,KAAK,QAAQ,IAAI,GAAG,GAC7D,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,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,CAEJ,GAID,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,GAE7B,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,CAC3C,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;;;ANpMA,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,CAAC,kBAAkB,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","yargs","React","useEffect","useState","useCallback","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","useState","useEffect","useRef","useInput","React","Box","Text","TextInput","React","Text","Box","React","Text","Box","readFileSync","join","require","useState","useEffect","useCallback","React","Box","Text","React"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agi_inc/cli",
3
- "version": "0.5.7",
3
+ "version": "0.5.8",
4
4
  "description": "Terminal-based agent interaction for AGI desktop automation",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {