@oagi/oagi 0.1.3 → 0.1.4

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-SDBYP57G.js";
17
+ } from "./chunk-JVNTVY6W.js";
18
18
 
19
19
  // src/cli/main.ts
20
20
  import { Command } from "commander";
@@ -138,7 +138,7 @@ Get your API key at ${API_KEY_HELP_URL}
138
138
  process.exitCode = 1;
139
139
  return;
140
140
  }
141
- const baseUrl = opts.oagiBaseUrl ?? process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL;
141
+ const baseURL = opts.oagiBaseUrl ?? process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL;
142
142
  const mode = opts.mode ?? MODE_ACTOR;
143
143
  const stepDelay = opts.stepDelay ?? DEFAULT_STEP_DELAY;
144
144
  const exportFormat = opts.export;
@@ -147,7 +147,7 @@ Get your API key at ${API_KEY_HELP_URL}
147
147
  const agentObserver = exportFormat ? new AsyncAgentObserver() : null;
148
148
  const createOpts = {
149
149
  apiKey,
150
- baseUrl,
150
+ baseURL,
151
151
  stepObserver: stepTracker.chain(agentObserver),
152
152
  stepDelay
153
153
  };
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';\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"]}
package/dist/index.cjs CHANGED
@@ -397,8 +397,18 @@ ${taskDescription}
397
397
  // src/client.ts
398
398
  var logger2 = logger_default("client");
399
399
  var _Client = class _Client {
400
- constructor(baseUrl = process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL, apiKey = process.env.OAGI_API_KEY ?? null, maxRetries = DEFAULT_MAX_RETRIES) {
401
- this.baseUrl = baseUrl;
400
+ baseURL;
401
+ apiKey;
402
+ timeout = HTTP_CLIENT_TIMEOUT;
403
+ client;
404
+ constructor(baseURL, apiKey, maxRetries) {
405
+ if (typeof baseURL === "object") {
406
+ ({ baseURL, apiKey, maxRetries } = baseURL);
407
+ }
408
+ baseURL ??= process.env.OAGI_BASE_URL ?? DEFAULT_BASE_URL;
409
+ apiKey ??= process.env.OAGI_API_KEY;
410
+ maxRetries ??= DEFAULT_MAX_RETRIES;
411
+ this.baseURL = baseURL;
402
412
  this.apiKey = apiKey;
403
413
  if (!apiKey) {
404
414
  throw new ConfigurationError(
@@ -406,19 +416,17 @@ var _Client = class _Client {
406
416
  );
407
417
  }
408
418
  this.client = new import_openai.default({
409
- baseURL: new URL("./v1", baseUrl).href,
419
+ baseURL: new URL("./v1", baseURL).href,
410
420
  apiKey,
411
421
  maxRetries
412
422
  });
413
- logger2.info(`Client initialized with base_url: ${baseUrl}`);
423
+ logger2.info(`Client initialized with base_url: ${baseURL}`);
414
424
  }
415
- timeout = HTTP_CLIENT_TIMEOUT;
416
- client;
417
425
  fetch(input, init) {
418
426
  if (typeof input === "string" || input instanceof URL) {
419
- input = new URL(input, this.baseUrl);
427
+ input = new URL(input, this.baseURL);
420
428
  } else {
421
- input = new URL(input.url, this.baseUrl);
429
+ input = new URL(input.url, this.baseURL);
422
430
  }
423
431
  init ??= {};
424
432
  const signal = AbortSignal.timeout(this.timeout * 1e3);
@@ -487,7 +495,10 @@ var _Client = class _Client {
487
495
  task_id: taskId
488
496
  });
489
497
  const rawOutput = response.choices[0].message.content ?? "";
490
- const step = parseRawOutput(rawOutput);
498
+ const step = {
499
+ ...parseRawOutput(rawOutput),
500
+ usage: response.usage
501
+ };
491
502
  taskId = response.task_id;
492
503
  const task = taskId ? `task_id: ${taskId}, ` : "";
493
504
  const usage = response.usage ? `, tokens: ${response.usage.prompt_tokens}+${response.usage.completion_tokens}` : "";
@@ -641,10 +652,10 @@ var Client = _Client;
641
652
  // src/actor.ts
642
653
  var logger3 = logger_default("task");
643
654
  var Actor = class {
644
- constructor(apiKey, baseUrl, model = MODEL_ACTOR, temperature) {
655
+ constructor(apiKey, baseURL, model = MODEL_ACTOR, temperature) {
645
656
  this.model = model;
646
657
  this.temperature = temperature;
647
- this.client = new Client(baseUrl, apiKey);
658
+ this.client = new Client(baseURL, apiKey);
648
659
  }
649
660
  /**
650
661
  * Client-side generated UUID
@@ -809,7 +820,7 @@ var DefaultAgent = class {
809
820
  async execute(instruction, action_handler, image_provider) {
810
821
  const actor = new Actor(this.api_key, this.base_url, this.model);
811
822
  logger4.info(`Starting async task execution: ${instruction}`);
812
- await actor.initTask(instruction, this.max_steps);
823
+ actor.initTask(instruction, this.max_steps);
813
824
  resetHandler(action_handler);
814
825
  for (let i = 0; i < this.max_steps; i++) {
815
826
  const step_num = i + 1;
@@ -888,7 +899,7 @@ var asyncAgentRegister = (mode) => {
888
899
  asyncAgentRegister("actor")((options = {}) => {
889
900
  const {
890
901
  apiKey,
891
- baseUrl,
902
+ baseURL,
892
903
  model = MODEL_ACTOR,
893
904
  maxSteps = DEFAULT_MAX_STEPS,
894
905
  temperature = DEFAULT_TEMPERATURE_LOW,
@@ -897,7 +908,7 @@ asyncAgentRegister("actor")((options = {}) => {
897
908
  } = options;
898
909
  return new DefaultAgent(
899
910
  apiKey,
900
- baseUrl,
911
+ baseURL,
901
912
  model,
902
913
  maxSteps,
903
914
  temperature,
@@ -908,7 +919,7 @@ asyncAgentRegister("actor")((options = {}) => {
908
919
  asyncAgentRegister("thinker")((options = {}) => {
909
920
  const {
910
921
  apiKey,
911
- baseUrl,
922
+ baseURL,
912
923
  model = MODEL_THINKER,
913
924
  maxSteps = DEFAULT_MAX_STEPS_THINKER,
914
925
  temperature = DEFAULT_TEMPERATURE_LOW,
@@ -917,7 +928,7 @@ asyncAgentRegister("thinker")((options = {}) => {
917
928
  } = options;
918
929
  return new DefaultAgent(
919
930
  apiKey,
920
- baseUrl,
931
+ baseURL,
921
932
  model,
922
933
  maxSteps,
923
934
  temperature,