@oagi/oagi 0.2.0 → 0.2.1

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/cli.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  createAgent,
15
15
  listAgentModes,
16
16
  logger_default
17
- } from "./chunk-LA6CBP44.js";
17
+ } from "./chunk-CNCUINOM.js";
18
18
 
19
19
  // src/cli/main.ts
20
20
  import { Command } from "commander";
@@ -90,7 +90,6 @@ var StepTracker = class extends StepObserver {
90
90
  };
91
91
 
92
92
  // src/cli/agent.ts
93
- import macPerm from "@hurdlegroup/node-mac-permissions";
94
93
  var logger = logger_default("cli.agent");
95
94
  var checkPermissions = async () => {
96
95
  if (process.platform !== "darwin") {
@@ -102,6 +101,16 @@ var checkPermissions = async () => {
102
101
  );
103
102
  return;
104
103
  }
104
+ let macPerm;
105
+ try {
106
+ macPerm = (await import("@hurdlegroup/node-mac-permissions")).default;
107
+ } catch {
108
+ console.error(
109
+ "node-mac-permissions not available. Install with: npm install @hurdlegroup/node-mac-permissions"
110
+ );
111
+ process.exitCode = 1;
112
+ return;
113
+ }
105
114
  const screenPermission = macPerm.getAuthStatus("screen");
106
115
  const accessibilityPermission = macPerm.getAuthStatus("accessibility");
107
116
  console.log("Checking permissions...");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/main.ts","../src/cli/display.ts","../src/cli/tracking.ts","../src/cli/agent.ts","../src/cli/utils.ts","../src/cli/config.ts","../src/cli/version.ts","../src/cli.ts"],"sourcesContent":["/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport { Command } from 'commander';\nimport { addAgentCommand } from './agent.js';\nimport { addConfigCommand } from './config.js';\nimport { addVersionCommand } from './version.js';\nimport { setupLogging } from './utils.js';\n\nexport const createProgram = (): Command => {\n const program = new Command();\n\n program\n .name('oagi')\n .description('OAGI SDK Command Line Interface')\n .option('-v, --verbose', 'Enable verbose (debug) logging');\n\n addAgentCommand(program);\n addVersionCommand(program);\n addConfigCommand(program);\n\n return program;\n};\n\nexport const main = async (argv: string[] = process.argv): Promise<void> => {\n const program = createProgram();\n\n try {\n program.hook('preAction', (thisCommand: any) => {\n const opts = thisCommand.opts();\n setupLogging(Boolean(opts?.verbose));\n });\n\n await program.parseAsync(argv);\n } catch (err) {\n if (err instanceof Error && err.name === 'CommanderError') {\n process.exitCode = 1;\n return;\n }\n\n if (err instanceof Error && err.message === 'Interrupted') {\n process.exitCode = 130;\n return;\n }\n\n process.stderr.write(`Unexpected error: ${String(err)}\\n`);\n process.exitCode = 1;\n }\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport Table from 'cli-table3';\nimport type { StepData } from './tracking.js';\n\nexport const displayStepTable = (\n steps: StepData[],\n success: boolean,\n durationSeconds?: number,\n): void => {\n const table = new Table({\n head: ['Step', 'Reasoning', 'Actions', 'Status'],\n colWidths: [6, 60, 40, 10],\n wordWrap: true,\n });\n\n for (const step of steps) {\n const reason = step.reasoning ?? 'N/A';\n\n const actionsDisplay: string[] = [];\n for (const action of step.actions.slice(0, 3)) {\n const arg = action.argument ? String(action.argument).slice(0, 20) : '';\n const countStr =\n action.count && action.count > 1 ? ` x${action.count}` : '';\n actionsDisplay.push(`${action.type}(${arg})${countStr}`);\n }\n\n let actionsStr = actionsDisplay.join(', ');\n if (step.actions.length > 3) {\n actionsStr += ` (+${step.actions.length - 3} more)`;\n }\n\n const statusDisplay = step.status === 'completed' ? 'ok' : step.status;\n\n table.push([String(step.step_num), reason, actionsStr, statusDisplay]);\n }\n\n process.stdout.write(String(table) + '\\n');\n\n const statusText = success ? 'Success' : 'Failed/Interrupted';\n process.stdout.write(\n `\\nTotal Steps: ${steps.length} | Status: ${statusText}\\n`,\n );\n\n if (typeof durationSeconds === 'number') {\n process.stdout.write(`Duration: ${durationSeconds.toFixed(2)}s\\n`);\n }\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport {\n StepObserver,\n type Action,\n type ActionEvent,\n type ObserverEvent,\n type StepEvent,\n} from '../types/index.js';\n\nexport type StepData = {\n step_num: number;\n timestamp: Date;\n reasoning: string | null;\n actions: Action[];\n action_count: number;\n status: string;\n};\n\nexport class StepTracker extends StepObserver {\n /** Tracks agent step execution by implementing AsyncObserver protocol. */\n\n steps: StepData[] = [];\n\n async onEvent(event: ObserverEvent): Promise<void> {\n switch (event.type) {\n case 'step': {\n const e = event as StepEvent;\n this.steps.push({\n step_num: e.step_num,\n timestamp: e.timestamp,\n reasoning: e.step.reason ?? null,\n actions: e.step.actions,\n action_count: e.step.actions.length,\n status: 'running',\n });\n return;\n }\n case 'action': {\n const e = event as ActionEvent;\n for (const step of this.steps) {\n if (step.step_num === e.step_num) {\n step.status = e.error ? 'error' : 'completed';\n break;\n }\n }\n return;\n }\n default:\n return;\n }\n }\n}\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport type { Command } from 'commander';\nimport { AsyncAgentObserver } from '../agent/observer/agent_observer.js';\nimport { createAgent, listAgentModes } from '../agent/index.js';\nimport {\n API_KEY_HELP_URL,\n DEFAULT_BASE_URL,\n DEFAULT_MAX_STEPS_THINKER,\n DEFAULT_STEP_DELAY,\n MODE_ACTOR,\n MODEL_THINKER,\n} from '../consts.js';\nimport { DefaultActionHandler, ScreenshotMaker } from '../handler.js';\nimport getLogger from '../logger.js';\nimport { displayStepTable } from './display.js';\nimport { StepTracker } from './tracking.js';\nimport macPerm from '@hurdlegroup/node-mac-permissions';\nimport { AgentCreateOptions } from '../agent/registry.js';\n\nconst logger = getLogger('cli.agent');\n\nconst checkPermissions = async (): Promise<void> => {\n if (process.platform !== 'darwin') {\n process.stdout.write(\n 'Warning: Permission check is only applicable on macOS.\\n',\n );\n process.stdout.write(\n 'On other platforms, no special permissions are required.\\n',\n );\n return;\n }\n\n const screenPermission = macPerm.getAuthStatus('screen');\n const accessibilityPermission = macPerm.getAuthStatus('accessibility');\n\n console.log('Checking permissions...');\n console.log(` ${screenPermission ? '[OK]' : '[MISSING]'} Screen Recording`);\n console.log(\n ` ${accessibilityPermission ? '[OK]' : '[MISSING]'} Accessibility`,\n );\n\n if (!screenPermission) {\n macPerm.askForScreenCaptureAccess(true);\n }\n if (!accessibilityPermission) {\n macPerm.askForAccessibilityAccess();\n }\n\n if (screenPermission && accessibilityPermission) {\n console.log('All permissions granted. You can run the agent.');\n } else {\n console.log('After granting, run this command again to continue.');\n console.log(\n 'Note: You may need to restart your terminal after granting permissions.',\n );\n process.exitCode = 1;\n return;\n }\n};\n\ntype AgentRunOptions = {\n model?: string;\n maxSteps?: number;\n temperature?: number;\n mode: string;\n oagiApiKey?: string;\n oagiBaseUrl?: string;\n export?: 'markdown' | 'html' | 'json';\n exportFile?: string;\n stepDelay?: number;\n};\n\nconst runAgent = async (\n instruction: string,\n opts: AgentRunOptions,\n): Promise<void> => {\n const apiKey = opts.oagiApiKey ?? process.env.OAGI_API_KEY;\n if (!apiKey) {\n process.stderr.write(\n 'Error: OAGI API key not provided.\\n' +\n 'Set OAGI_API_KEY environment variable or use --oagi-api-key flag.\\n' +\n `Get your API key at ${API_KEY_HELP_URL}\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n const baseURL =\n opts.oagiBaseUrl ?? process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL;\n const mode = opts.mode ?? MODE_ACTOR;\n const stepDelay = opts.stepDelay ?? DEFAULT_STEP_DELAY;\n\n const exportFormat = opts.export;\n const exportFile = opts.exportFile;\n\n const stepTracker = new StepTracker();\n const agentObserver = exportFormat ? new AsyncAgentObserver() : null;\n\n const createOpts: AgentCreateOptions = {\n apiKey,\n baseURL,\n stepObserver: stepTracker.chain(agentObserver),\n stepDelay,\n };\n\n if (opts.model) {\n createOpts.model = opts.model;\n if (opts.model === MODEL_THINKER && !opts.maxSteps) {\n createOpts.maxSteps = DEFAULT_MAX_STEPS_THINKER;\n }\n }\n if (typeof opts.maxSteps === 'number') {\n createOpts.maxSteps = opts.maxSteps;\n }\n if (typeof opts.temperature === 'number') {\n createOpts.temperature = opts.temperature;\n }\n\n const agent = createAgent(mode, createOpts);\n\n let actionHandler: DefaultActionHandler;\n let imageProvider: ScreenshotMaker;\n try {\n actionHandler = new DefaultActionHandler();\n imageProvider = new ScreenshotMaker();\n } catch (e) {\n process.stderr.write(\n `Error: desktop automation dependencies failed to load: ${String(e)}\\n` +\n \"If you're using pnpm and robotjs is installed, you may need to run: pnpm approve-builds\\n\",\n );\n process.exitCode = 1;\n return;\n }\n\n if (instruction) {\n process.stdout.write(`Starting agent with instruction: ${instruction}\\n`);\n } else {\n process.stdout.write(\n `Starting agent with mode: ${mode} (using pre-configured instruction)\\n`,\n );\n }\n process.stdout.write(`Mode: ${mode}\\n`);\n process.stdout.write('-'.repeat(60) + '\\n');\n\n const start = Date.now();\n let success = false;\n let interrupted = false;\n\n const onSigint = () => {\n interrupted = true;\n process.stdout.write('\\nAgent execution interrupted by user (Ctrl+C)\\n');\n };\n\n process.once('SIGINT', onSigint);\n\n try {\n if (interrupted) throw new Error('Interrupted');\n success = await agent.execute(instruction, actionHandler, imageProvider);\n } catch (err) {\n if (interrupted) {\n process.exitCode = 130;\n } else {\n logger.error(`Error during agent execution: ${String(err)}`);\n process.exitCode = 1;\n }\n } finally {\n process.off('SIGINT', onSigint);\n const durationSeconds = (Date.now() - start) / 1000;\n\n if (stepTracker.steps.length) {\n process.stdout.write('\\n' + '='.repeat(60) + '\\n');\n displayStepTable(stepTracker.steps, success, durationSeconds);\n } else {\n process.stdout.write('\\nNo steps were executed.\\n');\n }\n\n if (exportFormat && agentObserver) {\n const extMap: Record<string, string> = {\n markdown: 'md',\n html: 'html',\n json: 'json',\n };\n\n const outputPath =\n exportFile ?? `execution_report.${extMap[exportFormat]}`;\n try {\n agentObserver.export(exportFormat, outputPath);\n process.stdout.write(\n `\\nExecution history exported to: ${outputPath}\\n`,\n );\n } catch (e) {\n process.stderr.write(\n `\\nError exporting execution history: ${String(e)}\\n`,\n );\n }\n }\n\n if (interrupted) {\n process.exitCode = 130;\n } else if (!success && !process.exitCode) {\n process.exitCode = 1;\n }\n }\n};\n\nexport const addAgentCommand = (program: Command): void => {\n const agent = program\n .command('agent')\n .description('Agent execution commands');\n\n agent\n .command('run')\n .description('Run an agent with the given instruction')\n .argument('[instruction]', 'Task instruction for the agent to execute')\n .option('--model <model>', 'Model to use (default: determined by mode)')\n .option(\n '--max-steps <number>',\n 'Maximum number of steps (default: determined by mode)',\n (v: string) => Number(v),\n )\n .option(\n '--temperature <number>',\n 'Sampling temperature (default: determined by mode)',\n (v: string) => Number(v),\n )\n .option(\n '--mode <mode>',\n `Agent mode to use (default: ${MODE_ACTOR})`,\n MODE_ACTOR,\n )\n .option(\n '--oagi-api-key <key>',\n 'OAGI API key (default: OAGI_API_KEY env var)',\n )\n .option(\n '--oagi-base-url <url>',\n `OAGI base URL (default: ${DEFAULT_BASE_URL}, or OAGI_BASE_URL env var)`,\n )\n .option(\n '--export <format>',\n 'Export execution history to file (markdown, html, or json)',\n )\n .option(\n '--export-file <path>',\n 'Output file path for export (default: execution_report.[md|html|json])',\n )\n .option(\n '--step-delay <number>',\n `Delay in seconds after each step before next screenshot (default: ${DEFAULT_STEP_DELAY})`,\n (v: string) => Number(v),\n )\n .action(async (instruction: string | undefined, options: any) => {\n await runAgent(instruction ?? '', {\n model: options.model,\n maxSteps: options.maxSteps,\n temperature: options.temperature,\n mode: options.mode,\n oagiApiKey: options.oagiApiKey,\n oagiBaseUrl: options.oagiBaseUrl,\n export: options.export,\n exportFile: options.exportFile,\n stepDelay: options.stepDelay,\n });\n });\n\n agent\n .command('modes')\n .description('List available agent modes')\n .action(() => {\n const modes = listAgentModes();\n process.stdout.write('Available agent modes:\\n');\n for (const m of modes) process.stdout.write(` - ${m}\\n`);\n });\n\n agent\n .command('permission')\n .description(\n 'Check macOS permissions for screen recording and accessibility',\n )\n .action(async () => {\n await checkPermissions();\n });\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nexport const setupLogging = (verbose: boolean): void => {\n if (verbose) {\n process.env.OAGI_LOG = 'debug';\n }\n};\n\nexport const maskApiKey = (value: string): string => {\n if (!value) return '';\n return value.length > 8 ? `${value.slice(0, 8)}...` : '***';\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport type { Command } from 'commander';\nimport { DEFAULT_BASE_URL, MODEL_ACTOR } from '../consts.js';\nimport { maskApiKey } from './utils.js';\n\nconst displayConfig = (): void => {\n const configVars: Record<string, string> = {\n OAGI_API_KEY: process.env.OAGI_API_KEY ?? '',\n OAGI_BASE_URL: process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL,\n OAGI_DEFAULT_MODEL: process.env.OAGI_DEFAULT_MODEL ?? MODEL_ACTOR,\n OAGI_LOG: process.env.OAGI_LOG ?? 'info',\n OAGI_MAX_STEPS: process.env.OAGI_MAX_STEPS ?? '30',\n };\n\n process.stdout.write('Current Configuration:\\n');\n process.stdout.write('-'.repeat(50) + '\\n');\n\n for (const [key, value] of Object.entries(configVars)) {\n if (key === 'OAGI_API_KEY' && value) {\n process.stdout.write(`${key}: ${maskApiKey(value)}\\n`);\n } else {\n const displayValue = value ? value : '(not set)';\n process.stdout.write(`${key}: ${displayValue}\\n`);\n }\n }\n};\n\nexport const addConfigCommand = (program: Command): void => {\n const config = program\n .command('config')\n .description('Configuration management');\n\n config\n .command('show')\n .description('Display current configuration')\n .action(() => {\n displayConfig();\n });\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport type { Command } from 'commander';\nimport { createRequire } from 'module';\n\nconst getSdkVersion = (): string => {\n try {\n const require = createRequire(import.meta.url);\n\n // In dist, files may live under dist/*, so try both\n for (const p of ['../package.json', '../../package.json']) {\n try {\n const pkg = require(p) as { version?: string };\n if (pkg.version && pkg.version !== '0.0.0') return pkg.version;\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n return 'unknown';\n};\n\nconst displayVersion = (): void => {\n const sdkVersion = getSdkVersion();\n\n process.stdout.write(`OAGI SDK version: ${sdkVersion}\\n`);\n process.stdout.write(`Node version: ${process.version}\\n`);\n process.stdout.write(`Platform: ${process.platform}\\n`);\n};\n\nexport const addVersionCommand = (program: Command): void => {\n program\n .command('version')\n .description('Show SDK version and environment info')\n .action(() => {\n displayVersion();\n });\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport { main } from './cli/main.js';\n\nmain().catch(err => {\n process.stderr.write(`Unexpected error: ${String(err)}\\n`);\n process.exitCode = 1;\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAUA,SAAS,eAAe;;;ACAxB,OAAO,WAAW;AAGX,IAAM,mBAAmB,CAC9B,OACA,SACA,oBACS;AACT,QAAM,QAAQ,IAAI,MAAM;AAAA,IACtB,MAAM,CAAC,QAAQ,aAAa,WAAW,QAAQ;AAAA,IAC/C,WAAW,CAAC,GAAG,IAAI,IAAI,EAAE;AAAA,IACzB,UAAU;AAAA,EACZ,CAAC;AAED,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,aAAa;AAEjC,UAAM,iBAA2B,CAAC;AAClC,eAAW,UAAU,KAAK,QAAQ,MAAM,GAAG,CAAC,GAAG;AAC7C,YAAM,MAAM,OAAO,WAAW,OAAO,OAAO,QAAQ,EAAE,MAAM,GAAG,EAAE,IAAI;AACrE,YAAM,WACJ,OAAO,SAAS,OAAO,QAAQ,IAAI,KAAK,OAAO,KAAK,KAAK;AAC3D,qBAAe,KAAK,GAAG,OAAO,IAAI,IAAI,GAAG,IAAI,QAAQ,EAAE;AAAA,IACzD;AAEA,QAAI,aAAa,eAAe,KAAK,IAAI;AACzC,QAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,oBAAc,MAAM,KAAK,QAAQ,SAAS,CAAC;AAAA,IAC7C;AAEA,UAAM,gBAAgB,KAAK,WAAW,cAAc,OAAO,KAAK;AAEhE,UAAM,KAAK,CAAC,OAAO,KAAK,QAAQ,GAAG,QAAQ,YAAY,aAAa,CAAC;AAAA,EACvE;AAEA,UAAQ,OAAO,MAAM,OAAO,KAAK,IAAI,IAAI;AAEzC,QAAM,aAAa,UAAU,YAAY;AACzC,UAAQ,OAAO;AAAA,IACb;AAAA,eAAkB,MAAM,MAAM,cAAc,UAAU;AAAA;AAAA,EACxD;AAEA,MAAI,OAAO,oBAAoB,UAAU;AACvC,YAAQ,OAAO,MAAM,aAAa,gBAAgB,QAAQ,CAAC,CAAC;AAAA,CAAK;AAAA,EACnE;AACF;;;AC5BO,IAAM,cAAN,cAA0B,aAAa;AAAA;AAAA,EAG5C,QAAoB,CAAC;AAAA,EAErB,MAAM,QAAQ,OAAqC;AACjD,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,QAAQ;AACX,cAAM,IAAI;AACV,aAAK,MAAM,KAAK;AAAA,UACd,UAAU,EAAE;AAAA,UACZ,WAAW,EAAE;AAAA,UACb,WAAW,EAAE,KAAK,UAAU;AAAA,UAC5B,SAAS,EAAE,KAAK;AAAA,UAChB,cAAc,EAAE,KAAK,QAAQ;AAAA,UAC7B,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,IAAI;AACV,mBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAI,KAAK,aAAa,EAAE,UAAU;AAChC,iBAAK,SAAS,EAAE,QAAQ,UAAU;AAClC;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAAA,EACF;AACF;;;ACnCA,OAAO,aAAa;AAGpB,IAAM,SAAS,eAAU,WAAW;AAEpC,IAAM,mBAAmB,YAA2B;AAClD,MAAI,QAAQ,aAAa,UAAU;AACjC,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,mBAAmB,QAAQ,cAAc,QAAQ;AACvD,QAAM,0BAA0B,QAAQ,cAAc,eAAe;AAErE,UAAQ,IAAI,yBAAyB;AACrC,UAAQ,IAAI,KAAK,mBAAmB,SAAS,WAAW,mBAAmB;AAC3E,UAAQ;AAAA,IACN,KAAK,0BAA0B,SAAS,WAAW;AAAA,EACrD;AAEA,MAAI,CAAC,kBAAkB;AACrB,YAAQ,0BAA0B,IAAI;AAAA,EACxC;AACA,MAAI,CAAC,yBAAyB;AAC5B,YAAQ,0BAA0B;AAAA,EACpC;AAEA,MAAI,oBAAoB,yBAAyB;AAC/C,YAAQ,IAAI,iDAAiD;AAAA,EAC/D,OAAO;AACL,YAAQ,IAAI,qDAAqD;AACjE,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AACF;AAcA,IAAM,WAAW,OACf,aACA,SACkB;AAClB,QAAM,SAAS,KAAK,cAAc,QAAQ,IAAI;AAC9C,MAAI,CAAC,QAAQ;AACX,YAAQ,OAAO;AAAA,MACb;AAAA;AAAA,sBAEyB,gBAAgB;AAAA;AAAA,IAC3C;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UACJ,KAAK,eAAe,QAAQ,IAAI,iBAAiB;AACnD,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,YAAY,KAAK,aAAa;AAEpC,QAAM,eAAe,KAAK;AAC1B,QAAM,aAAa,KAAK;AAExB,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,gBAAgB,eAAe,IAAI,mBAAmB,IAAI;AAEhE,QAAM,aAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,cAAc,YAAY,MAAM,aAAa;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,KAAK,OAAO;AACd,eAAW,QAAQ,KAAK;AACxB,QAAI,KAAK,UAAU,iBAAiB,CAAC,KAAK,UAAU;AAClD,iBAAW,WAAW;AAAA,IACxB;AAAA,EACF;AACA,MAAI,OAAO,KAAK,aAAa,UAAU;AACrC,eAAW,WAAW,KAAK;AAAA,EAC7B;AACA,MAAI,OAAO,KAAK,gBAAgB,UAAU;AACxC,eAAW,cAAc,KAAK;AAAA,EAChC;AAEA,QAAM,QAAQ,YAAY,MAAM,UAAU;AAE1C,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,oBAAgB,IAAI,qBAAqB;AACzC,oBAAgB,IAAI,gBAAgB;AAAA,EACtC,SAAS,GAAG;AACV,YAAQ,OAAO;AAAA,MACb,0DAA0D,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA,IAErE;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,aAAa;AACf,YAAQ,OAAO,MAAM,oCAAoC,WAAW;AAAA,CAAI;AAAA,EAC1E,OAAO;AACL,YAAQ,OAAO;AAAA,MACb,6BAA6B,IAAI;AAAA;AAAA,IACnC;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,CAAI;AACtC,UAAQ,OAAO,MAAM,IAAI,OAAO,EAAE,IAAI,IAAI;AAE1C,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,UAAU;AACd,MAAI,cAAc;AAElB,QAAM,WAAW,MAAM;AACrB,kBAAc;AACd,YAAQ,OAAO,MAAM,kDAAkD;AAAA,EACzE;AAEA,UAAQ,KAAK,UAAU,QAAQ;AAE/B,MAAI;AACF,QAAI,YAAa,OAAM,IAAI,MAAM,aAAa;AAC9C,cAAU,MAAM,MAAM,QAAQ,aAAa,eAAe,aAAa;AAAA,EACzE,SAAS,KAAK;AACZ,QAAI,aAAa;AACf,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,aAAO,MAAM,iCAAiC,OAAO,GAAG,CAAC,EAAE;AAC3D,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,UAAE;AACA,YAAQ,IAAI,UAAU,QAAQ;AAC9B,UAAM,mBAAmB,KAAK,IAAI,IAAI,SAAS;AAE/C,QAAI,YAAY,MAAM,QAAQ;AAC5B,cAAQ,OAAO,MAAM,OAAO,IAAI,OAAO,EAAE,IAAI,IAAI;AACjD,uBAAiB,YAAY,OAAO,SAAS,eAAe;AAAA,IAC9D,OAAO;AACL,cAAQ,OAAO,MAAM,6BAA6B;AAAA,IACpD;AAEA,QAAI,gBAAgB,eAAe;AACjC,YAAM,SAAiC;AAAA,QACrC,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAEA,YAAM,aACJ,cAAc,oBAAoB,OAAO,YAAY,CAAC;AACxD,UAAI;AACF,sBAAc,OAAO,cAAc,UAAU;AAC7C,gBAAQ,OAAO;AAAA,UACb;AAAA,iCAAoC,UAAU;AAAA;AAAA,QAChD;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,OAAO;AAAA,UACb;AAAA,qCAAwC,OAAO,CAAC,CAAC;AAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa;AACf,cAAQ,WAAW;AAAA,IACrB,WAAW,CAAC,WAAW,CAAC,QAAQ,UAAU;AACxC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB,CAAC,YAA2B;AACzD,QAAM,QAAQ,QACX,QAAQ,OAAO,EACf,YAAY,0BAA0B;AAEzC,QACG,QAAQ,KAAK,EACb,YAAY,yCAAyC,EACrD,SAAS,iBAAiB,2CAA2C,EACrE,OAAO,mBAAmB,4CAA4C,EACtE;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,MAAc,OAAO,CAAC;AAAA,EACzB,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,MAAc,OAAO,CAAC;AAAA,EACzB,EACC;AAAA,IACC;AAAA,IACA,+BAA+B,UAAU;AAAA,IACzC;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA,2BAA2B,gBAAgB;AAAA,EAC7C,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA,qEAAqE,kBAAkB;AAAA,IACvF,CAAC,MAAc,OAAO,CAAC;AAAA,EACzB,EACC,OAAO,OAAO,aAAiC,YAAiB;AAC/D,UAAM,SAAS,eAAe,IAAI;AAAA,MAChC,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ;AAAA,MAClB,aAAa,QAAQ;AAAA,MACrB,MAAM,QAAQ;AAAA,MACd,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,4BAA4B,EACxC,OAAO,MAAM;AACZ,UAAM,QAAQ,eAAe;AAC7B,YAAQ,OAAO,MAAM,0BAA0B;AAC/C,eAAW,KAAK,MAAO,SAAQ,OAAO,MAAM,OAAO,CAAC;AAAA,CAAI;AAAA,EAC1D,CAAC;AAEH,QACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EACF,EACC,OAAO,YAAY;AAClB,UAAM,iBAAiB;AAAA,EACzB,CAAC;AACL;;;ACzRO,IAAM,eAAe,CAAC,YAA2B;AACtD,MAAI,SAAS;AACX,YAAQ,IAAI,WAAW;AAAA,EACzB;AACF;AAEO,IAAM,aAAa,CAAC,UAA0B;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,SAAS,IAAI,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ;AACxD;;;ACLA,IAAM,gBAAgB,MAAY;AAChC,QAAM,aAAqC;AAAA,IACzC,cAAc,QAAQ,IAAI,gBAAgB;AAAA,IAC1C,eAAe,QAAQ,IAAI,iBAAiB;AAAA,IAC5C,oBAAoB,QAAQ,IAAI,sBAAsB;AAAA,IACtD,UAAU,QAAQ,IAAI,YAAY;AAAA,IAClC,gBAAgB,QAAQ,IAAI,kBAAkB;AAAA,EAChD;AAEA,UAAQ,OAAO,MAAM,0BAA0B;AAC/C,UAAQ,OAAO,MAAM,IAAI,OAAO,EAAE,IAAI,IAAI;AAE1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,QAAQ,kBAAkB,OAAO;AACnC,cAAQ,OAAO,MAAM,GAAG,GAAG,KAAK,WAAW,KAAK,CAAC;AAAA,CAAI;AAAA,IACvD,OAAO;AACL,YAAM,eAAe,QAAQ,QAAQ;AACrC,cAAQ,OAAO,MAAM,GAAG,GAAG,KAAK,YAAY;AAAA,CAAI;AAAA,IAClD;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB,CAAC,YAA2B;AAC1D,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,0BAA0B;AAEzC,SACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,kBAAc;AAAA,EAChB,CAAC;AACL;;;ACpCA,SAAS,qBAAqB;AAE9B,IAAM,gBAAgB,MAAc;AAClC,MAAI;AACF,UAAMA,WAAU,cAAc,YAAY,GAAG;AAG7C,eAAW,KAAK,CAAC,mBAAmB,oBAAoB,GAAG;AACzD,UAAI;AACF,cAAM,MAAMA,SAAQ,CAAC;AACrB,YAAI,IAAI,WAAW,IAAI,YAAY,QAAS,QAAO,IAAI;AAAA,MACzD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,IAAM,iBAAiB,MAAY;AACjC,QAAM,aAAa,cAAc;AAEjC,UAAQ,OAAO,MAAM,qBAAqB,UAAU;AAAA,CAAI;AACxD,UAAQ,OAAO,MAAM,iBAAiB,QAAQ,OAAO;AAAA,CAAI;AACzD,UAAQ,OAAO,MAAM,aAAa,QAAQ,QAAQ;AAAA,CAAI;AACxD;AAEO,IAAM,oBAAoB,CAAC,YAA2B;AAC3D,UACG,QAAQ,SAAS,EACjB,YAAY,uCAAuC,EACnD,OAAO,MAAM;AACZ,mBAAe;AAAA,EACjB,CAAC;AACL;;;ANhCO,IAAM,gBAAgB,MAAe;AAC1C,QAAM,UAAU,IAAI,QAAQ;AAE5B,UACG,KAAK,MAAM,EACX,YAAY,iCAAiC,EAC7C,OAAO,iBAAiB,gCAAgC;AAE3D,kBAAgB,OAAO;AACvB,oBAAkB,OAAO;AACzB,mBAAiB,OAAO;AAExB,SAAO;AACT;AAEO,IAAM,OAAO,OAAO,OAAiB,QAAQ,SAAwB;AAC1E,QAAM,UAAU,cAAc;AAE9B,MAAI;AACF,YAAQ,KAAK,aAAa,CAAC,gBAAqB;AAC9C,YAAM,OAAO,YAAY,KAAK;AAC9B,mBAAa,QAAQ,MAAM,OAAO,CAAC;AAAA,IACrC,CAAC;AAED,UAAM,QAAQ,WAAW,IAAI;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,SAAS,kBAAkB;AACzD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,eAAe,SAAS,IAAI,YAAY,eAAe;AACzD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,YAAQ,OAAO,MAAM,qBAAqB,OAAO,GAAG,CAAC;AAAA,CAAI;AACzD,YAAQ,WAAW;AAAA,EACrB;AACF;;;AO3CA,KAAK,EAAE,MAAM,SAAO;AAClB,UAAQ,OAAO,MAAM,qBAAqB,OAAO,GAAG,CAAC;AAAA,CAAI;AACzD,UAAQ,WAAW;AACrB,CAAC;","names":["require"]}
1
+ {"version":3,"sources":["../src/cli/main.ts","../src/cli/display.ts","../src/cli/tracking.ts","../src/cli/agent.ts","../src/cli/utils.ts","../src/cli/config.ts","../src/cli/version.ts","../src/cli.ts"],"sourcesContent":["/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport { Command } from 'commander';\nimport { addAgentCommand } from './agent.js';\nimport { addConfigCommand } from './config.js';\nimport { addVersionCommand } from './version.js';\nimport { setupLogging } from './utils.js';\n\nexport const createProgram = (): Command => {\n const program = new Command();\n\n program\n .name('oagi')\n .description('OAGI SDK Command Line Interface')\n .option('-v, --verbose', 'Enable verbose (debug) logging');\n\n addAgentCommand(program);\n addVersionCommand(program);\n addConfigCommand(program);\n\n return program;\n};\n\nexport const main = async (argv: string[] = process.argv): Promise<void> => {\n const program = createProgram();\n\n try {\n program.hook('preAction', (thisCommand: any) => {\n const opts = thisCommand.opts();\n setupLogging(Boolean(opts?.verbose));\n });\n\n await program.parseAsync(argv);\n } catch (err) {\n if (err instanceof Error && err.name === 'CommanderError') {\n process.exitCode = 1;\n return;\n }\n\n if (err instanceof Error && err.message === 'Interrupted') {\n process.exitCode = 130;\n return;\n }\n\n process.stderr.write(`Unexpected error: ${String(err)}\\n`);\n process.exitCode = 1;\n }\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport Table from 'cli-table3';\nimport type { StepData } from './tracking.js';\n\nexport const displayStepTable = (\n steps: StepData[],\n success: boolean,\n durationSeconds?: number,\n): void => {\n const table = new Table({\n head: ['Step', 'Reasoning', 'Actions', 'Status'],\n colWidths: [6, 60, 40, 10],\n wordWrap: true,\n });\n\n for (const step of steps) {\n const reason = step.reasoning ?? 'N/A';\n\n const actionsDisplay: string[] = [];\n for (const action of step.actions.slice(0, 3)) {\n const arg = action.argument ? String(action.argument).slice(0, 20) : '';\n const countStr =\n action.count && action.count > 1 ? ` x${action.count}` : '';\n actionsDisplay.push(`${action.type}(${arg})${countStr}`);\n }\n\n let actionsStr = actionsDisplay.join(', ');\n if (step.actions.length > 3) {\n actionsStr += ` (+${step.actions.length - 3} more)`;\n }\n\n const statusDisplay = step.status === 'completed' ? 'ok' : step.status;\n\n table.push([String(step.step_num), reason, actionsStr, statusDisplay]);\n }\n\n process.stdout.write(String(table) + '\\n');\n\n const statusText = success ? 'Success' : 'Failed/Interrupted';\n process.stdout.write(\n `\\nTotal Steps: ${steps.length} | Status: ${statusText}\\n`,\n );\n\n if (typeof durationSeconds === 'number') {\n process.stdout.write(`Duration: ${durationSeconds.toFixed(2)}s\\n`);\n }\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport {\n StepObserver,\n type Action,\n type ActionEvent,\n type ObserverEvent,\n type StepEvent,\n} from '../types/index.js';\n\nexport type StepData = {\n step_num: number;\n timestamp: Date;\n reasoning: string | null;\n actions: Action[];\n action_count: number;\n status: string;\n};\n\nexport class StepTracker extends StepObserver {\n /** Tracks agent step execution by implementing AsyncObserver protocol. */\n\n steps: StepData[] = [];\n\n async onEvent(event: ObserverEvent): Promise<void> {\n switch (event.type) {\n case 'step': {\n const e = event as StepEvent;\n this.steps.push({\n step_num: e.step_num,\n timestamp: e.timestamp,\n reasoning: e.step.reason ?? null,\n actions: e.step.actions,\n action_count: e.step.actions.length,\n status: 'running',\n });\n return;\n }\n case 'action': {\n const e = event as ActionEvent;\n for (const step of this.steps) {\n if (step.step_num === e.step_num) {\n step.status = e.error ? 'error' : 'completed';\n break;\n }\n }\n return;\n }\n default:\n return;\n }\n }\n}\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport type { Command } from 'commander';\nimport { AsyncAgentObserver } from '../agent/observer/agent_observer.js';\nimport { createAgent, listAgentModes } from '../agent/index.js';\nimport {\n API_KEY_HELP_URL,\n DEFAULT_BASE_URL,\n DEFAULT_MAX_STEPS_THINKER,\n DEFAULT_STEP_DELAY,\n MODE_ACTOR,\n MODEL_THINKER,\n} from '../consts.js';\nimport { DefaultActionHandler, ScreenshotMaker } from '../handler.js';\nimport getLogger from '../logger.js';\nimport { displayStepTable } from './display.js';\nimport { StepTracker } from './tracking.js';\n// Lazy-loaded: macOS-only, not available on other platforms\ntype MacPerm = typeof import('@hurdlegroup/node-mac-permissions');\nimport { AgentCreateOptions } from '../agent/registry.js';\n\nconst logger = getLogger('cli.agent');\n\nconst checkPermissions = async (): Promise<void> => {\n if (process.platform !== 'darwin') {\n process.stdout.write(\n 'Warning: Permission check is only applicable on macOS.\\n',\n );\n process.stdout.write(\n 'On other platforms, no special permissions are required.\\n',\n );\n return;\n }\n\n let macPerm: MacPerm['default'];\n try {\n macPerm = (await import('@hurdlegroup/node-mac-permissions')).default;\n } catch {\n console.error(\n 'node-mac-permissions not available. Install with: npm install @hurdlegroup/node-mac-permissions',\n );\n process.exitCode = 1;\n return;\n }\n\n const screenPermission = macPerm.getAuthStatus('screen');\n const accessibilityPermission = macPerm.getAuthStatus('accessibility');\n\n console.log('Checking permissions...');\n console.log(` ${screenPermission ? '[OK]' : '[MISSING]'} Screen Recording`);\n console.log(\n ` ${accessibilityPermission ? '[OK]' : '[MISSING]'} Accessibility`,\n );\n\n if (!screenPermission) {\n macPerm.askForScreenCaptureAccess(true);\n }\n if (!accessibilityPermission) {\n macPerm.askForAccessibilityAccess();\n }\n\n if (screenPermission && accessibilityPermission) {\n console.log('All permissions granted. You can run the agent.');\n } else {\n console.log('After granting, run this command again to continue.');\n console.log(\n 'Note: You may need to restart your terminal after granting permissions.',\n );\n process.exitCode = 1;\n return;\n }\n};\n\ntype AgentRunOptions = {\n model?: string;\n maxSteps?: number;\n temperature?: number;\n mode: string;\n oagiApiKey?: string;\n oagiBaseUrl?: string;\n export?: 'markdown' | 'html' | 'json';\n exportFile?: string;\n stepDelay?: number;\n};\n\nconst runAgent = async (\n instruction: string,\n opts: AgentRunOptions,\n): Promise<void> => {\n const apiKey = opts.oagiApiKey ?? process.env.OAGI_API_KEY;\n if (!apiKey) {\n process.stderr.write(\n 'Error: OAGI API key not provided.\\n' +\n 'Set OAGI_API_KEY environment variable or use --oagi-api-key flag.\\n' +\n `Get your API key at ${API_KEY_HELP_URL}\\n`,\n );\n process.exitCode = 1;\n return;\n }\n\n const baseURL =\n opts.oagiBaseUrl ?? process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL;\n const mode = opts.mode ?? MODE_ACTOR;\n const stepDelay = opts.stepDelay ?? DEFAULT_STEP_DELAY;\n\n const exportFormat = opts.export;\n const exportFile = opts.exportFile;\n\n const stepTracker = new StepTracker();\n const agentObserver = exportFormat ? new AsyncAgentObserver() : null;\n\n const createOpts: AgentCreateOptions = {\n apiKey,\n baseURL,\n stepObserver: stepTracker.chain(agentObserver),\n stepDelay,\n };\n\n if (opts.model) {\n createOpts.model = opts.model;\n if (opts.model === MODEL_THINKER && !opts.maxSteps) {\n createOpts.maxSteps = DEFAULT_MAX_STEPS_THINKER;\n }\n }\n if (typeof opts.maxSteps === 'number') {\n createOpts.maxSteps = opts.maxSteps;\n }\n if (typeof opts.temperature === 'number') {\n createOpts.temperature = opts.temperature;\n }\n\n const agent = createAgent(mode, createOpts);\n\n let actionHandler: DefaultActionHandler;\n let imageProvider: ScreenshotMaker;\n try {\n actionHandler = new DefaultActionHandler();\n imageProvider = new ScreenshotMaker();\n } catch (e) {\n process.stderr.write(\n `Error: desktop automation dependencies failed to load: ${String(e)}\\n` +\n \"If you're using pnpm and robotjs is installed, you may need to run: pnpm approve-builds\\n\",\n );\n process.exitCode = 1;\n return;\n }\n\n if (instruction) {\n process.stdout.write(`Starting agent with instruction: ${instruction}\\n`);\n } else {\n process.stdout.write(\n `Starting agent with mode: ${mode} (using pre-configured instruction)\\n`,\n );\n }\n process.stdout.write(`Mode: ${mode}\\n`);\n process.stdout.write('-'.repeat(60) + '\\n');\n\n const start = Date.now();\n let success = false;\n let interrupted = false;\n\n const onSigint = () => {\n interrupted = true;\n process.stdout.write('\\nAgent execution interrupted by user (Ctrl+C)\\n');\n };\n\n process.once('SIGINT', onSigint);\n\n try {\n if (interrupted) throw new Error('Interrupted');\n success = await agent.execute(instruction, actionHandler, imageProvider);\n } catch (err) {\n if (interrupted) {\n process.exitCode = 130;\n } else {\n logger.error(`Error during agent execution: ${String(err)}`);\n process.exitCode = 1;\n }\n } finally {\n process.off('SIGINT', onSigint);\n const durationSeconds = (Date.now() - start) / 1000;\n\n if (stepTracker.steps.length) {\n process.stdout.write('\\n' + '='.repeat(60) + '\\n');\n displayStepTable(stepTracker.steps, success, durationSeconds);\n } else {\n process.stdout.write('\\nNo steps were executed.\\n');\n }\n\n if (exportFormat && agentObserver) {\n const extMap: Record<string, string> = {\n markdown: 'md',\n html: 'html',\n json: 'json',\n };\n\n const outputPath =\n exportFile ?? `execution_report.${extMap[exportFormat]}`;\n try {\n agentObserver.export(exportFormat, outputPath);\n process.stdout.write(\n `\\nExecution history exported to: ${outputPath}\\n`,\n );\n } catch (e) {\n process.stderr.write(\n `\\nError exporting execution history: ${String(e)}\\n`,\n );\n }\n }\n\n if (interrupted) {\n process.exitCode = 130;\n } else if (!success && !process.exitCode) {\n process.exitCode = 1;\n }\n }\n};\n\nexport const addAgentCommand = (program: Command): void => {\n const agent = program\n .command('agent')\n .description('Agent execution commands');\n\n agent\n .command('run')\n .description('Run an agent with the given instruction')\n .argument('[instruction]', 'Task instruction for the agent to execute')\n .option('--model <model>', 'Model to use (default: determined by mode)')\n .option(\n '--max-steps <number>',\n 'Maximum number of steps (default: determined by mode)',\n (v: string) => Number(v),\n )\n .option(\n '--temperature <number>',\n 'Sampling temperature (default: determined by mode)',\n (v: string) => Number(v),\n )\n .option(\n '--mode <mode>',\n `Agent mode to use (default: ${MODE_ACTOR})`,\n MODE_ACTOR,\n )\n .option(\n '--oagi-api-key <key>',\n 'OAGI API key (default: OAGI_API_KEY env var)',\n )\n .option(\n '--oagi-base-url <url>',\n `OAGI base URL (default: ${DEFAULT_BASE_URL}, or OAGI_BASE_URL env var)`,\n )\n .option(\n '--export <format>',\n 'Export execution history to file (markdown, html, or json)',\n )\n .option(\n '--export-file <path>',\n 'Output file path for export (default: execution_report.[md|html|json])',\n )\n .option(\n '--step-delay <number>',\n `Delay in seconds after each step before next screenshot (default: ${DEFAULT_STEP_DELAY})`,\n (v: string) => Number(v),\n )\n .action(async (instruction: string | undefined, options: any) => {\n await runAgent(instruction ?? '', {\n model: options.model,\n maxSteps: options.maxSteps,\n temperature: options.temperature,\n mode: options.mode,\n oagiApiKey: options.oagiApiKey,\n oagiBaseUrl: options.oagiBaseUrl,\n export: options.export,\n exportFile: options.exportFile,\n stepDelay: options.stepDelay,\n });\n });\n\n agent\n .command('modes')\n .description('List available agent modes')\n .action(() => {\n const modes = listAgentModes();\n process.stdout.write('Available agent modes:\\n');\n for (const m of modes) process.stdout.write(` - ${m}\\n`);\n });\n\n agent\n .command('permission')\n .description(\n 'Check macOS permissions for screen recording and accessibility',\n )\n .action(async () => {\n await checkPermissions();\n });\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nexport const setupLogging = (verbose: boolean): void => {\n if (verbose) {\n process.env.OAGI_LOG = 'debug';\n }\n};\n\nexport const maskApiKey = (value: string): string => {\n if (!value) return '';\n return value.length > 8 ? `${value.slice(0, 8)}...` : '***';\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport type { Command } from 'commander';\nimport { DEFAULT_BASE_URL, MODEL_ACTOR } from '../consts.js';\nimport { maskApiKey } from './utils.js';\n\nconst displayConfig = (): void => {\n const configVars: Record<string, string> = {\n OAGI_API_KEY: process.env.OAGI_API_KEY ?? '',\n OAGI_BASE_URL: process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL,\n OAGI_DEFAULT_MODEL: process.env.OAGI_DEFAULT_MODEL ?? MODEL_ACTOR,\n OAGI_LOG: process.env.OAGI_LOG ?? 'info',\n OAGI_MAX_STEPS: process.env.OAGI_MAX_STEPS ?? '30',\n };\n\n process.stdout.write('Current Configuration:\\n');\n process.stdout.write('-'.repeat(50) + '\\n');\n\n for (const [key, value] of Object.entries(configVars)) {\n if (key === 'OAGI_API_KEY' && value) {\n process.stdout.write(`${key}: ${maskApiKey(value)}\\n`);\n } else {\n const displayValue = value ? value : '(not set)';\n process.stdout.write(`${key}: ${displayValue}\\n`);\n }\n }\n};\n\nexport const addConfigCommand = (program: Command): void => {\n const config = program\n .command('config')\n .description('Configuration management');\n\n config\n .command('show')\n .description('Display current configuration')\n .action(() => {\n displayConfig();\n });\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport type { Command } from 'commander';\nimport { createRequire } from 'module';\n\nconst getSdkVersion = (): string => {\n try {\n const require = createRequire(import.meta.url);\n\n // In dist, files may live under dist/*, so try both\n for (const p of ['../package.json', '../../package.json']) {\n try {\n const pkg = require(p) as { version?: string };\n if (pkg.version && pkg.version !== '0.0.0') return pkg.version;\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n return 'unknown';\n};\n\nconst displayVersion = (): void => {\n const sdkVersion = getSdkVersion();\n\n process.stdout.write(`OAGI SDK version: ${sdkVersion}\\n`);\n process.stdout.write(`Node version: ${process.version}\\n`);\n process.stdout.write(`Platform: ${process.platform}\\n`);\n};\n\nexport const addVersionCommand = (program: Command): void => {\n program\n .command('version')\n .description('Show SDK version and environment info')\n .action(() => {\n displayVersion();\n });\n};\n","/**\n * -----------------------------------------------------------------------------\n * Copyright (c) OpenAGI Foundation\n * All rights reserved.\n *\n * This file is part of the official API project.\n * Licensed under the MIT License.\n * -----------------------------------------------------------------------------\n */\n\nimport { main } from './cli/main.js';\n\nmain().catch(err => {\n process.stderr.write(`Unexpected error: ${String(err)}\\n`);\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["require"]}
package/dist/index.cjs CHANGED
@@ -2270,8 +2270,32 @@ var AsyncAgentObserver = class extends StepObserver {
2270
2270
  };
2271
2271
 
2272
2272
  // src/handler.ts
2273
- var import_robotjs = __toESM(require("robotjs"), 1);
2274
- var import_sharp = __toESM(require("sharp"), 1);
2273
+ var _robot;
2274
+ async function getRobot() {
2275
+ if (!_robot) {
2276
+ try {
2277
+ _robot = (await import("robotjs")).default;
2278
+ } catch {
2279
+ throw new Error(
2280
+ "robotjs is not available. Install it with: npm install robotjs\nOn Linux, ensure libx11-dev and libxtst-dev are installed."
2281
+ );
2282
+ }
2283
+ }
2284
+ return _robot;
2285
+ }
2286
+ var _sharp;
2287
+ async function getSharp() {
2288
+ if (!_sharp) {
2289
+ try {
2290
+ _sharp = (await import("sharp")).default;
2291
+ } catch {
2292
+ throw new Error(
2293
+ "sharp is not available. Install it with: npm install sharp"
2294
+ );
2295
+ }
2296
+ }
2297
+ return _sharp;
2298
+ }
2275
2299
  var sleep3 = (ms) => new Promise((r) => setTimeout(r, ms));
2276
2300
  var toSharpKernel = (resample) => {
2277
2301
  switch (resample) {
@@ -2330,8 +2354,10 @@ var ScreenshotMaker = class _ScreenshotMaker {
2330
2354
  return arraybuffer;
2331
2355
  }
2332
2356
  async provide() {
2333
- const { width, height } = import_robotjs.default.getScreenSize();
2334
- const screenshot = import_robotjs.default.screen.capture(0, 0, width, height);
2357
+ const robot = await getRobot();
2358
+ const sharp = await getSharp();
2359
+ const { width, height } = robot.getScreenSize();
2360
+ const screenshot = robot.screen.capture(0, 0, width, height);
2335
2361
  const channels = 3;
2336
2362
  const data = new Uint8Array(
2337
2363
  screenshot.width * screenshot.height * channels
@@ -2345,7 +2371,7 @@ var ScreenshotMaker = class _ScreenshotMaker {
2345
2371
  data[offset + 2] = screenshot.image.readUInt8(offset2 + 0);
2346
2372
  }
2347
2373
  }
2348
- let p = (0, import_sharp.default)(Buffer.from(data), {
2374
+ let p = sharp(Buffer.from(data), {
2349
2375
  raw: {
2350
2376
  width: screenshot.width,
2351
2377
  height: screenshot.height,
@@ -2379,8 +2405,9 @@ var DefaultActionHandler = class {
2379
2405
  }
2380
2406
  }
2381
2407
  }
2382
- #denormalize(x, y) {
2383
- const { width, height } = import_robotjs.default.getScreenSize();
2408
+ async #denormalize(x, y) {
2409
+ const robot = await getRobot();
2410
+ const { width, height } = robot.getScreenSize();
2384
2411
  let px = Math.floor(x * width / 1e3);
2385
2412
  let py = Math.floor(y * height / 1e3);
2386
2413
  if (px < 1) px = 1;
@@ -2390,51 +2417,52 @@ var DefaultActionHandler = class {
2390
2417
  return { x: px, y: py };
2391
2418
  }
2392
2419
  async #handleOne(action) {
2420
+ const robot = await getRobot();
2393
2421
  const arg = stripOuterParens(action.argument);
2394
2422
  switch (action.type) {
2395
2423
  case "click": {
2396
2424
  const coords = parseCoords(arg);
2397
2425
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2398
- const p = this.#denormalize(coords[0], coords[1]);
2399
- import_robotjs.default.moveMouse(p.x, p.y);
2400
- import_robotjs.default.mouseClick("left", false);
2426
+ const p = await this.#denormalize(coords[0], coords[1]);
2427
+ robot.moveMouse(p.x, p.y);
2428
+ robot.mouseClick("left", false);
2401
2429
  return;
2402
2430
  }
2403
2431
  case "left_double": {
2404
2432
  const coords = parseCoords(arg);
2405
2433
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2406
- const p = this.#denormalize(coords[0], coords[1]);
2407
- import_robotjs.default.moveMouse(p.x, p.y);
2408
- import_robotjs.default.mouseClick("left", true);
2434
+ const p = await this.#denormalize(coords[0], coords[1]);
2435
+ robot.moveMouse(p.x, p.y);
2436
+ robot.mouseClick("left", true);
2409
2437
  return;
2410
2438
  }
2411
2439
  case "left_triple": {
2412
2440
  const coords = parseCoords(arg);
2413
2441
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2414
- const p = this.#denormalize(coords[0], coords[1]);
2415
- import_robotjs.default.moveMouse(p.x, p.y);
2416
- import_robotjs.default.mouseClick("left", true);
2417
- import_robotjs.default.mouseClick("left", false);
2442
+ const p = await this.#denormalize(coords[0], coords[1]);
2443
+ robot.moveMouse(p.x, p.y);
2444
+ robot.mouseClick("left", true);
2445
+ robot.mouseClick("left", false);
2418
2446
  return;
2419
2447
  }
2420
2448
  case "right_single": {
2421
2449
  const coords = parseCoords(arg);
2422
2450
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2423
- const p = this.#denormalize(coords[0], coords[1]);
2424
- import_robotjs.default.moveMouse(p.x, p.y);
2425
- import_robotjs.default.mouseClick("right", false);
2451
+ const p = await this.#denormalize(coords[0], coords[1]);
2452
+ robot.moveMouse(p.x, p.y);
2453
+ robot.mouseClick("right", false);
2426
2454
  return;
2427
2455
  }
2428
2456
  case "drag": {
2429
2457
  const coords = parseDragCoords(arg);
2430
2458
  if (!coords) throw new Error(`Invalid drag coords: ${arg}`);
2431
- const p1 = this.#denormalize(coords[0], coords[1]);
2432
- const p2 = this.#denormalize(coords[2], coords[3]);
2433
- import_robotjs.default.moveMouse(p1.x, p1.y);
2434
- import_robotjs.default.mouseToggle("down", "left");
2435
- import_robotjs.default.dragMouse(p2.x, p2.y);
2459
+ const p1 = await this.#denormalize(coords[0], coords[1]);
2460
+ const p2 = await this.#denormalize(coords[2], coords[3]);
2461
+ robot.moveMouse(p1.x, p1.y);
2462
+ robot.mouseToggle("down", "left");
2463
+ robot.dragMouse(p2.x, p2.y);
2436
2464
  await sleep3(this.#cfg.dragDurationMs);
2437
- import_robotjs.default.mouseToggle("up", "left");
2465
+ robot.mouseToggle("up", "left");
2438
2466
  return;
2439
2467
  }
2440
2468
  case "hotkey": {
@@ -2443,7 +2471,7 @@ var DefaultActionHandler = class {
2443
2471
  });
2444
2472
  if (keys.length === 1 && keys[0] === "capslock") {
2445
2473
  if (this.#cfg.capslockMode === "system") {
2446
- import_robotjs.default.keyTap("capslock");
2474
+ robot.keyTap("capslock");
2447
2475
  } else {
2448
2476
  this.#sessionCapsEnabled = !this.#sessionCapsEnabled;
2449
2477
  }
@@ -2452,24 +2480,24 @@ var DefaultActionHandler = class {
2452
2480
  const last = keys.at(-1);
2453
2481
  if (!last) return;
2454
2482
  const modifiers = keys.slice(0, -1);
2455
- import_robotjs.default.keyTap(last, modifiers.length ? modifiers : []);
2483
+ robot.keyTap(last, modifiers.length ? modifiers : []);
2456
2484
  await sleep3(this.#cfg.hotkeyDelayMs);
2457
2485
  return;
2458
2486
  }
2459
2487
  case "type": {
2460
2488
  const raw = arg.replace(/^['"]/, "").replace(/['"]$/, "");
2461
2489
  const text = applySessionCaps(raw, this.#sessionCapsEnabled);
2462
- import_robotjs.default.typeString(text);
2490
+ robot.typeString(text);
2463
2491
  return;
2464
2492
  }
2465
2493
  case "scroll": {
2466
2494
  const parsed = parseScroll(arg);
2467
2495
  if (!parsed) throw new Error(`Invalid scroll: ${arg}`);
2468
- const p = this.#denormalize(parsed[0], parsed[1]);
2496
+ const p = await this.#denormalize(parsed[0], parsed[1]);
2469
2497
  const direction = parsed[2];
2470
- import_robotjs.default.moveMouse(p.x, p.y);
2498
+ robot.moveMouse(p.x, p.y);
2471
2499
  const amount = direction === "up" ? this.#cfg.scrollAmount : -this.#cfg.scrollAmount;
2472
- import_robotjs.default.scrollMouse(0, amount);
2500
+ robot.scrollMouse(0, amount);
2473
2501
  return;
2474
2502
  }
2475
2503
  case "wait": {