@oagi/oagi 0.1.5 → 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-SRTB44IH.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":"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","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":";;;;;;;;;;;;;;;;;;;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;;;AC/BA,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,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,OAAO,mCAAmC,GAAG;AAAA,EAChE,QAAQ;AACN,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,WAAW;AACnB;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;;;ACrSO,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"]}
package/dist/index.cjs CHANGED
@@ -76,11 +76,11 @@ var MODEL_THINKER = "lux-thinker-1";
76
76
  var DEFAULT_MAX_STEPS = 20;
77
77
  var DEFAULT_MAX_STEPS_THINKER = 100;
78
78
  var DEFAULT_MAX_STEPS_TASKER = 60;
79
- var MAX_STEPS_ACTOR = 30;
80
- var MAX_STEPS_THINKER = 120;
79
+ var MAX_STEPS_ACTOR = 100;
80
+ var MAX_STEPS_THINKER = 300;
81
81
  var DEFAULT_REFLECTION_INTERVAL = 4;
82
82
  var DEFAULT_REFLECTION_INTERVAL_TASKER = 20;
83
- var DEFAULT_STEP_DELAY = 0.3;
83
+ var DEFAULT_STEP_DELAY = 1;
84
84
  var DEFAULT_TEMPERATURE = 0.5;
85
85
  var DEFAULT_TEMPERATURE_LOW = 0.1;
86
86
  var HTTP_CLIENT_TIMEOUT = 60;
@@ -205,6 +205,7 @@ var ActionTypeSchema = z.enum([
205
205
  "type",
206
206
  "scroll",
207
207
  "finish",
208
+ "fail",
208
209
  "wait",
209
210
  "call_user"
210
211
  ]);
@@ -421,7 +422,9 @@ var parseRawOutput = (rawOutput) => {
421
422
  return {
422
423
  reason,
423
424
  actions,
424
- stop: actions.some((action2) => action2.type === "finish")
425
+ stop: actions.some(
426
+ (action2) => action2.type === "finish" || action2.type === "fail"
427
+ )
425
428
  };
426
429
  };
427
430
 
@@ -1015,8 +1018,7 @@ var PlannerMemory = class {
1015
1018
  pending: 0,
1016
1019
  in_progress: 0,
1017
1020
  completed: 0,
1018
- skipped: 0,
1019
- blocked: 0
1021
+ skipped: 0
1020
1022
  };
1021
1023
  for (const todo of this.todos) {
1022
1024
  summary[todo.status] = (summary[todo.status] ?? 0) + 1;
@@ -2268,8 +2270,32 @@ var AsyncAgentObserver = class extends StepObserver {
2268
2270
  };
2269
2271
 
2270
2272
  // src/handler.ts
2271
- var import_robotjs = __toESM(require("robotjs"), 1);
2272
- 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
+ }
2273
2299
  var sleep3 = (ms) => new Promise((r) => setTimeout(r, ms));
2274
2300
  var toSharpKernel = (resample) => {
2275
2301
  switch (resample) {
@@ -2328,8 +2354,10 @@ var ScreenshotMaker = class _ScreenshotMaker {
2328
2354
  return arraybuffer;
2329
2355
  }
2330
2356
  async provide() {
2331
- const { width, height } = import_robotjs.default.getScreenSize();
2332
- 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);
2333
2361
  const channels = 3;
2334
2362
  const data = new Uint8Array(
2335
2363
  screenshot.width * screenshot.height * channels
@@ -2343,7 +2371,7 @@ var ScreenshotMaker = class _ScreenshotMaker {
2343
2371
  data[offset + 2] = screenshot.image.readUInt8(offset2 + 0);
2344
2372
  }
2345
2373
  }
2346
- let p = (0, import_sharp.default)(Buffer.from(data), {
2374
+ let p = sharp(Buffer.from(data), {
2347
2375
  raw: {
2348
2376
  width: screenshot.width,
2349
2377
  height: screenshot.height,
@@ -2377,8 +2405,9 @@ var DefaultActionHandler = class {
2377
2405
  }
2378
2406
  }
2379
2407
  }
2380
- #denormalize(x, y) {
2381
- const { width, height } = import_robotjs.default.getScreenSize();
2408
+ async #denormalize(x, y) {
2409
+ const robot = await getRobot();
2410
+ const { width, height } = robot.getScreenSize();
2382
2411
  let px = Math.floor(x * width / 1e3);
2383
2412
  let py = Math.floor(y * height / 1e3);
2384
2413
  if (px < 1) px = 1;
@@ -2388,51 +2417,52 @@ var DefaultActionHandler = class {
2388
2417
  return { x: px, y: py };
2389
2418
  }
2390
2419
  async #handleOne(action) {
2420
+ const robot = await getRobot();
2391
2421
  const arg = stripOuterParens(action.argument);
2392
2422
  switch (action.type) {
2393
2423
  case "click": {
2394
2424
  const coords = parseCoords(arg);
2395
2425
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2396
- const p = this.#denormalize(coords[0], coords[1]);
2397
- import_robotjs.default.moveMouse(p.x, p.y);
2398
- 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);
2399
2429
  return;
2400
2430
  }
2401
2431
  case "left_double": {
2402
2432
  const coords = parseCoords(arg);
2403
2433
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2404
- const p = this.#denormalize(coords[0], coords[1]);
2405
- import_robotjs.default.moveMouse(p.x, p.y);
2406
- 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);
2407
2437
  return;
2408
2438
  }
2409
2439
  case "left_triple": {
2410
2440
  const coords = parseCoords(arg);
2411
2441
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2412
- const p = this.#denormalize(coords[0], coords[1]);
2413
- import_robotjs.default.moveMouse(p.x, p.y);
2414
- import_robotjs.default.mouseClick("left", true);
2415
- 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);
2416
2446
  return;
2417
2447
  }
2418
2448
  case "right_single": {
2419
2449
  const coords = parseCoords(arg);
2420
2450
  if (!coords) throw new Error(`Invalid coords: ${arg}`);
2421
- const p = this.#denormalize(coords[0], coords[1]);
2422
- import_robotjs.default.moveMouse(p.x, p.y);
2423
- 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);
2424
2454
  return;
2425
2455
  }
2426
2456
  case "drag": {
2427
2457
  const coords = parseDragCoords(arg);
2428
2458
  if (!coords) throw new Error(`Invalid drag coords: ${arg}`);
2429
- const p1 = this.#denormalize(coords[0], coords[1]);
2430
- const p2 = this.#denormalize(coords[2], coords[3]);
2431
- import_robotjs.default.moveMouse(p1.x, p1.y);
2432
- import_robotjs.default.mouseToggle("down", "left");
2433
- 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);
2434
2464
  await sleep3(this.#cfg.dragDurationMs);
2435
- import_robotjs.default.mouseToggle("up", "left");
2465
+ robot.mouseToggle("up", "left");
2436
2466
  return;
2437
2467
  }
2438
2468
  case "hotkey": {
@@ -2441,7 +2471,7 @@ var DefaultActionHandler = class {
2441
2471
  });
2442
2472
  if (keys.length === 1 && keys[0] === "capslock") {
2443
2473
  if (this.#cfg.capslockMode === "system") {
2444
- import_robotjs.default.keyTap("capslock");
2474
+ robot.keyTap("capslock");
2445
2475
  } else {
2446
2476
  this.#sessionCapsEnabled = !this.#sessionCapsEnabled;
2447
2477
  }
@@ -2450,31 +2480,32 @@ var DefaultActionHandler = class {
2450
2480
  const last = keys.at(-1);
2451
2481
  if (!last) return;
2452
2482
  const modifiers = keys.slice(0, -1);
2453
- import_robotjs.default.keyTap(last, modifiers.length ? modifiers : []);
2483
+ robot.keyTap(last, modifiers.length ? modifiers : []);
2454
2484
  await sleep3(this.#cfg.hotkeyDelayMs);
2455
2485
  return;
2456
2486
  }
2457
2487
  case "type": {
2458
2488
  const raw = arg.replace(/^['"]/, "").replace(/['"]$/, "");
2459
2489
  const text = applySessionCaps(raw, this.#sessionCapsEnabled);
2460
- import_robotjs.default.typeString(text);
2490
+ robot.typeString(text);
2461
2491
  return;
2462
2492
  }
2463
2493
  case "scroll": {
2464
2494
  const parsed = parseScroll(arg);
2465
2495
  if (!parsed) throw new Error(`Invalid scroll: ${arg}`);
2466
- const p = this.#denormalize(parsed[0], parsed[1]);
2496
+ const p = await this.#denormalize(parsed[0], parsed[1]);
2467
2497
  const direction = parsed[2];
2468
- import_robotjs.default.moveMouse(p.x, p.y);
2498
+ robot.moveMouse(p.x, p.y);
2469
2499
  const amount = direction === "up" ? this.#cfg.scrollAmount : -this.#cfg.scrollAmount;
2470
- import_robotjs.default.scrollMouse(0, amount);
2500
+ robot.scrollMouse(0, amount);
2471
2501
  return;
2472
2502
  }
2473
2503
  case "wait": {
2474
2504
  await sleep3(this.#cfg.waitDurationMs);
2475
2505
  return;
2476
2506
  }
2477
- case "finish": {
2507
+ case "finish":
2508
+ case "fail": {
2478
2509
  this.reset();
2479
2510
  return;
2480
2511
  }