@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/{chunk-SRTB44IH.js → chunk-CNCUINOM.js} +49 -18
- package/dist/chunk-CNCUINOM.js.map +1 -0
- package/dist/cli.cjs +84 -44
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +11 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +70 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1 -1
- package/package.json +6 -4
- package/dist/chunk-SRTB44IH.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
createAgent,
|
|
15
15
|
listAgentModes,
|
|
16
16
|
logger_default
|
|
17
|
-
} from "./chunk-
|
|
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":"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","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 =
|
|
80
|
-
var MAX_STEPS_THINKER =
|
|
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 =
|
|
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(
|
|
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
|
|
2272
|
-
|
|
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
|
|
2332
|
-
const
|
|
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 = (
|
|
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
|
|
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
|
-
|
|
2398
|
-
|
|
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
|
-
|
|
2406
|
-
|
|
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
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
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
|
-
|
|
2423
|
-
|
|
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
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2498
|
+
robot.moveMouse(p.x, p.y);
|
|
2469
2499
|
const amount = direction === "up" ? this.#cfg.scrollAmount : -this.#cfg.scrollAmount;
|
|
2470
|
-
|
|
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
|
}
|