@dokobot/cli 1.0.2 → 1.2.0

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.
@@ -0,0 +1,313 @@
1
+ import { input, select } from '@inquirer/prompts';
2
+ import { ServerClient } from './server-client.js';
3
+ import { getApiKey, getServerUrl } from './config.js';
4
+ import * as fs from 'fs';
5
+ const G = '\x1b[32m';
6
+ const Y = '\x1b[33m';
7
+ const R = '\x1b[31m';
8
+ const C = '\x1b[36m';
9
+ const D = '\x1b[2m';
10
+ const B = '\x1b[1m';
11
+ const X = '\x1b[0m';
12
+ function displayWidth(str) {
13
+ let w = 0;
14
+ for (const ch of str) {
15
+ const code = ch.codePointAt(0);
16
+ // CJK Unified Ideographs, CJK symbols, Hiragana, Katakana, Hangul, fullwidth forms
17
+ if ((code >= 0x1100 && code <= 0x115f) ||
18
+ (code >= 0x2e80 && code <= 0x303e) ||
19
+ (code >= 0x3040 && code <= 0x33bf) ||
20
+ (code >= 0x3400 && code <= 0x4dbf) ||
21
+ (code >= 0x4e00 && code <= 0xa4cf) ||
22
+ (code >= 0xac00 && code <= 0xd7af) ||
23
+ (code >= 0xf900 && code <= 0xfaff) ||
24
+ (code >= 0xfe30 && code <= 0xfe6f) ||
25
+ (code >= 0xff01 && code <= 0xff60) ||
26
+ (code >= 0xffe0 && code <= 0xffe6) ||
27
+ (code >= 0x20000 && code <= 0x2fa1f)) {
28
+ w += 2;
29
+ }
30
+ else {
31
+ w += 1;
32
+ }
33
+ }
34
+ return w;
35
+ }
36
+ function padEndDisplay(str, width) {
37
+ const diff = width - displayWidth(str);
38
+ return diff > 0 ? str + ' '.repeat(diff) : str;
39
+ }
40
+ function sliceDisplay(str, maxWidth) {
41
+ let w = 0;
42
+ let i = 0;
43
+ for (const ch of str) {
44
+ const cw = displayWidth(ch);
45
+ if (w + cw > maxWidth)
46
+ break;
47
+ w += cw;
48
+ i += ch.length;
49
+ }
50
+ return str.slice(0, i);
51
+ }
52
+ function getClient(globalOpts) {
53
+ const apiKey = getApiKey(globalOpts.apiKey);
54
+ if (!apiKey) {
55
+ console.error('API key is required. Run `dokobot config` or set DOKO_API_KEY.');
56
+ process.exit(1);
57
+ }
58
+ const serverUrl = getServerUrl(globalOpts.server);
59
+ return new ServerClient(serverUrl, apiKey);
60
+ }
61
+ function statusColor(status) {
62
+ switch (status) {
63
+ case 'completed': return G;
64
+ case 'running':
65
+ case 'aggregating': return C;
66
+ case 'queued': return Y;
67
+ case 'failed': return R;
68
+ case 'cancelled': return D;
69
+ default: return '';
70
+ }
71
+ }
72
+ function formatTime(ts) {
73
+ return new Date(ts).toLocaleString();
74
+ }
75
+ function formatSize(bytes) {
76
+ if (bytes < 1024)
77
+ return `${bytes} B`;
78
+ if (bytes < 1024 * 1024)
79
+ return `${(bytes / 1024).toFixed(1)} KB`;
80
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
81
+ }
82
+ function shortId(id) {
83
+ return id.length > 12 ? id.slice(0, 12) : id;
84
+ }
85
+ async function selectOnlineDoko(dokos) {
86
+ const onlineDokos = dokos.filter(d => d.isOnline);
87
+ if (onlineDokos.length === 0) {
88
+ console.error('No online extension doko found. Please ensure your browser extension is running.');
89
+ process.exit(1);
90
+ }
91
+ if (onlineDokos.length === 1) {
92
+ console.log(` Using doko: ${onlineDokos[0].name} (${shortId(onlineDokos[0].id)})`);
93
+ return onlineDokos[0].id;
94
+ }
95
+ return select({
96
+ message: 'Select a doko:',
97
+ choices: onlineDokos.map(d => ({ name: `${d.name} (${shortId(d.id)})`, value: d.id })),
98
+ });
99
+ }
100
+ export function registerCrawlCommands(program) {
101
+ const crawl = program
102
+ .command('crawl')
103
+ .description('Manage crawl tasks');
104
+ crawl
105
+ .command('create')
106
+ .description('Create a new crawl task')
107
+ .option('--url <urls...>', 'Target URLs')
108
+ .option('--fields <json>', 'Extraction fields JSON')
109
+ .option('--format <type>', 'Output format: csv|json|markdown', 'csv')
110
+ .option('--max-items <n>', 'Max items per page', '50')
111
+ .option('--device <id>', 'Device ID')
112
+ .action(async (options) => {
113
+ const globalOpts = program.opts();
114
+ const client = getClient(globalOpts);
115
+ let urls = options.url || [];
116
+ if (urls.length === 0) {
117
+ const raw = await input({ message: 'Target URLs (comma-separated):' });
118
+ urls = raw.split(',').map((u) => u.trim()).filter(Boolean);
119
+ if (urls.length === 0) {
120
+ console.error('At least one URL is required.');
121
+ process.exit(1);
122
+ }
123
+ }
124
+ let fields;
125
+ if (options.fields) {
126
+ try {
127
+ fields = JSON.parse(options.fields);
128
+ }
129
+ catch {
130
+ console.error('Invalid fields JSON.');
131
+ process.exit(1);
132
+ }
133
+ }
134
+ else {
135
+ const raw = await input({
136
+ message: 'Extraction fields JSON (e.g. [{"name":"title","description":"Page title","type":"string","required":true}]):',
137
+ });
138
+ try {
139
+ fields = JSON.parse(raw);
140
+ }
141
+ catch {
142
+ console.error('Invalid fields JSON.');
143
+ process.exit(1);
144
+ }
145
+ }
146
+ const format = options.format;
147
+ const maxItemsPerPage = parseInt(options.maxItems, 10);
148
+ let deviceId = options.device;
149
+ if (!deviceId) {
150
+ const dokos = await client.listCrawlDokos();
151
+ deviceId = await selectOnlineDoko(dokos);
152
+ }
153
+ const plan = {
154
+ urls,
155
+ fields,
156
+ maxItemsPerPage,
157
+ outputFormat: format,
158
+ };
159
+ try {
160
+ const task = await client.createCrawlTask({
161
+ deviceIds: [deviceId],
162
+ plan,
163
+ request: { outputFormat: format },
164
+ });
165
+ console.log(`\n ${G}✓${X} Task created: ${B}${task.id}${X}`);
166
+ console.log(` Status: ${statusColor(task.status)}${task.status}${X}`);
167
+ console.log(` URLs: ${urls.length}`);
168
+ console.log(`\n Track progress: dokobot crawl status ${task.id}`);
169
+ }
170
+ catch (error) {
171
+ console.error('Failed to create task:', error instanceof Error ? error.message : error);
172
+ process.exit(1);
173
+ }
174
+ });
175
+ crawl
176
+ .command('list')
177
+ .description('List crawl tasks')
178
+ .option('--status <status>', 'Filter by status')
179
+ .option('--limit <n>', 'Number of tasks', '20')
180
+ .action(async (options) => {
181
+ const globalOpts = program.opts();
182
+ const client = getClient(globalOpts);
183
+ try {
184
+ const { tasks, total } = await client.listCrawlTasks({
185
+ status: options.status,
186
+ limit: parseInt(options.limit, 10),
187
+ });
188
+ if (tasks.length === 0) {
189
+ console.log('No crawl tasks found.');
190
+ return;
191
+ }
192
+ console.log(`\n Crawl Tasks (${tasks.length}/${total}):\n`);
193
+ console.log(` ${'ID'.padEnd(22)} ${'Domain'.padEnd(30)} ${'Status'.padEnd(12)} ${'URLs'.padEnd(6)} Created`);
194
+ console.log(` ${'─'.repeat(22)} ${'─'.repeat(30)} ${'─'.repeat(12)} ${'─'.repeat(6)} ${'─'.repeat(19)}`);
195
+ for (const task of tasks) {
196
+ const urlCount = task.plan?.urls.length ?? 0;
197
+ const sc = statusColor(task.status);
198
+ const domain = task.plan?.urls[0] ? new URL(task.plan.urls[0]).hostname.replace(/^www\./, '') : '—';
199
+ const domainDisplay = padEndDisplay(sliceDisplay(domain, 30), 30);
200
+ console.log(` ${D}${task.id.padEnd(22)}${X} ${domainDisplay} ${sc}${task.status.padEnd(12)}${X} ${String(urlCount).padEnd(6)} ${D}${formatTime(task.createdAt)}${X}`);
201
+ }
202
+ console.log('');
203
+ }
204
+ catch (error) {
205
+ console.error('Failed to list tasks:', error instanceof Error ? error.message : error);
206
+ process.exit(1);
207
+ }
208
+ });
209
+ crawl
210
+ .command('status <taskId>')
211
+ .description('Show task details')
212
+ .action(async (taskId) => {
213
+ const globalOpts = program.opts();
214
+ const client = getClient(globalOpts);
215
+ try {
216
+ const task = await client.getCrawlTask(taskId);
217
+ printTaskDetail(task);
218
+ }
219
+ catch (error) {
220
+ console.error('Failed to get task:', error instanceof Error ? error.message : error);
221
+ process.exit(1);
222
+ }
223
+ });
224
+ crawl
225
+ .command('result <taskId>')
226
+ .description('Download task result')
227
+ .option('--output <file>', 'Output file path')
228
+ .action(async (taskId, options) => {
229
+ const globalOpts = program.opts();
230
+ const client = getClient(globalOpts);
231
+ try {
232
+ const result = await client.getCrawlResult(taskId);
233
+ console.log(` Format: ${result.format} Items: ${result.itemCount} Size: ${formatSize(result.fileSizeBytes)}`);
234
+ console.log(` Summary: ${result.summary}`);
235
+ const res = await client.downloadUrl(result.downloadUrl);
236
+ const content = await res.text();
237
+ if (options.output) {
238
+ fs.writeFileSync(options.output, content, 'utf-8');
239
+ console.log(`\n ${G}✓${X} Saved to ${options.output}`);
240
+ }
241
+ else {
242
+ console.log('');
243
+ console.log(content);
244
+ }
245
+ }
246
+ catch (error) {
247
+ console.error('Failed to get result:', error instanceof Error ? error.message : error);
248
+ process.exit(1);
249
+ }
250
+ });
251
+ crawl
252
+ .command('cancel <taskId>')
253
+ .description('Cancel a crawl task')
254
+ .action(async (taskId) => {
255
+ const globalOpts = program.opts();
256
+ const client = getClient(globalOpts);
257
+ try {
258
+ const task = await client.cancelCrawlTask(taskId);
259
+ console.log(` ${G}✓${X} Task ${shortId(task.id)} cancelled.`);
260
+ }
261
+ catch (error) {
262
+ console.error('Failed to cancel task:', error instanceof Error ? error.message : error);
263
+ process.exit(1);
264
+ }
265
+ });
266
+ }
267
+ function printTaskDetail(task) {
268
+ const sc = statusColor(task.status);
269
+ const domain = task.plan?.urls[0] ? new URL(task.plan.urls[0]).hostname.replace(/^www\./, '') : task.id;
270
+ console.log(`\n ${B}Task: ${domain}${X}`);
271
+ console.log(` ID: ${task.id}`);
272
+ console.log(` Status: ${sc}${task.status}${X}`);
273
+ console.log(` Format: ${task.plan?.outputFormat ?? task.request.outputFormat}`);
274
+ console.log(` Created: ${formatTime(task.createdAt)}`);
275
+ if (task.execution.startedAt) {
276
+ console.log(` Started: ${formatTime(task.execution.startedAt)}`);
277
+ }
278
+ if (task.execution.completedAt) {
279
+ console.log(` Done: ${formatTime(task.execution.completedAt)}`);
280
+ }
281
+ if (task.error) {
282
+ console.log(` Error: ${R}${task.error}${X}`);
283
+ }
284
+ if (task.plan?.urls.length) {
285
+ console.log(`\n URLs (${task.plan.urls.length}):`);
286
+ for (const url of task.plan.urls) {
287
+ console.log(` ${D}${url}${X}`);
288
+ }
289
+ }
290
+ if (task.plan?.fields.length) {
291
+ console.log(`\n Fields (${task.plan.fields.length}):`);
292
+ for (const f of task.plan.fields) {
293
+ const req = f.required ? ' *' : '';
294
+ console.log(` ${f.name} ${D}(${f.type}${req})${X} - ${f.description}`);
295
+ }
296
+ }
297
+ if (task.execution.pages.length > 0) {
298
+ console.log(`\n Pages:`);
299
+ for (const page of task.execution.pages) {
300
+ const psc = statusColor(page.status);
301
+ const items = page.extractedItems != null ? ` [${page.extractedItems} items]` : '';
302
+ const err = page.error ? ` ${R}${page.error}${X}` : '';
303
+ console.log(` ${psc}${page.status.padEnd(8)}${X} ${page.url}${items}${err}`);
304
+ }
305
+ }
306
+ if (task.result) {
307
+ console.log(`\n Result: ${task.result.itemCount} items, ${formatSize(task.result.fileSizeBytes)}`);
308
+ console.log(` Summary: ${task.result.summary}`);
309
+ console.log(`\n Download: dokobot crawl result ${task.id}`);
310
+ }
311
+ console.log('');
312
+ }
313
+ //# sourceMappingURL=crawl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/crawl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDokoCommands(program: Command): void;
@@ -0,0 +1,223 @@
1
+ import { input, select } from '@inquirer/prompts';
2
+ import { McpClient } from './mcp-client.js';
3
+ import { ServerClient } from './server-client.js';
4
+ import { CommandPoller } from './command-poller.js';
5
+ import { Heartbeat } from './heartbeat.js';
6
+ import { Executor, DOKO_TOOLS } from './executor.js';
7
+ import { getApiKey, getServerUrl, loadConfig, saveConfig, saveDevice, listDevices, removeDevice, findDeviceByName, } from './config.js';
8
+ import { setLogLevel } from './logger.js';
9
+ import { getCurrentVersion } from './version.js';
10
+ import { getUpdateResult, formatUpdateNotification } from './update-checker.js';
11
+ const G = '\x1b[32m';
12
+ const W = '\x1b[97;1m';
13
+ const B = '\x1b[1m';
14
+ const D = '\x1b[2m';
15
+ const R = '\x1b[0m';
16
+ const BANNER = `
17
+ ${G}▄████████▄${R}
18
+ ${G}███${W}██${R}${G}█${W}██${R}${G}███${R} ${B}Dokobot CLI${R} ${D}v${getCurrentVersion()}${R}
19
+ ${G}███████████${R} ${D}Open the full web to AI agent${R}
20
+ ${G}▀████████▀${R}
21
+ `;
22
+ export function registerDokoCommands(program) {
23
+ const doko = program
24
+ .command('doko')
25
+ .description('Manage doko devices');
26
+ doko
27
+ .command('connect')
28
+ .description('Connect a Chrome browser via Chrome DevTools MCP')
29
+ .option('--name <name>', 'Name for the doko')
30
+ .option('--device-id <id>', 'Reuse an existing device ID')
31
+ .option('--browser-url <url>', 'Connect to a running Chrome instance (e.g. http://127.0.0.1:9222)')
32
+ .option('--mcp-args <args>', 'Extra arguments for chrome-devtools-mcp (comma-separated)')
33
+ .action(async (options) => {
34
+ const globalOpts = program.opts();
35
+ if (globalOpts.verbose)
36
+ setLogLevel('debug');
37
+ await connectCommand(globalOpts, options);
38
+ });
39
+ doko
40
+ .command('list')
41
+ .description('List registered devices')
42
+ .action(() => {
43
+ const devices = listDevices();
44
+ if (devices.length === 0) {
45
+ console.log('No registered devices.');
46
+ return;
47
+ }
48
+ console.log('Registered devices:');
49
+ for (const d of devices) {
50
+ console.log(` ${d.name} (${d.id}) [${d.type}]`);
51
+ }
52
+ });
53
+ doko
54
+ .command('remove <id>')
55
+ .description('Remove a registered device')
56
+ .action((id) => {
57
+ if (removeDevice(id)) {
58
+ console.log(`Removed device: ${id}`);
59
+ }
60
+ else {
61
+ console.log(`Device not found: ${id}`);
62
+ }
63
+ });
64
+ }
65
+ async function connectCommand(globalOpts, options) {
66
+ console.log(BANNER);
67
+ const serverUrl = getServerUrl(globalOpts.server);
68
+ let deviceId = options.deviceId;
69
+ let deviceName = options.name;
70
+ let apiKey = getApiKey(globalOpts.apiKey);
71
+ if (!apiKey) {
72
+ if (deviceId) {
73
+ const guideUrl = `${serverUrl}/guide?source=cli&deviceId=${deviceId}`;
74
+ console.log(` No API key found. Opening setup guide...`);
75
+ console.log(` ${D}${guideUrl}${R}`);
76
+ console.log('');
77
+ const { exec } = await import('child_process');
78
+ exec(`open "${guideUrl}"`);
79
+ apiKey = await input({ message: 'Paste your API key:' });
80
+ if (!apiKey) {
81
+ console.error('API key is required.');
82
+ process.exit(1);
83
+ }
84
+ const config = loadConfig();
85
+ saveConfig({ ...config, apiKey });
86
+ console.log(' ✓ API key saved');
87
+ }
88
+ else {
89
+ const { randomUUID } = await import('crypto');
90
+ const preferredId = randomUUID();
91
+ const guideUrl = `${serverUrl}/guide?source=cli&deviceId=${preferredId}`;
92
+ console.log(` No API key found. Opening setup guide...`);
93
+ console.log(` ${D}${guideUrl}${R}`);
94
+ console.log('');
95
+ console.log(' Follow the guide to complete the setup.');
96
+ const { exec } = await import('child_process');
97
+ exec(`open "${guideUrl}"`);
98
+ process.exit(0);
99
+ }
100
+ }
101
+ const serverClient = new ServerClient(serverUrl, apiKey);
102
+ if (!deviceId && deviceName) {
103
+ const existing = findDeviceByName(deviceName);
104
+ if (existing) {
105
+ deviceId = existing.id;
106
+ }
107
+ }
108
+ if (!deviceId && !deviceName) {
109
+ const devices = listDevices();
110
+ const choices = [
111
+ { name: '+ Create new doko', value: '__new__' },
112
+ ...devices.map(d => ({ name: `${d.name} (${d.id})`, value: d.id })),
113
+ ];
114
+ const selected = await select({
115
+ message: 'Choose a doko:',
116
+ choices,
117
+ });
118
+ if (selected === '__new__') {
119
+ deviceName = await input({
120
+ message: 'Name your new doko:',
121
+ default: 'My Chrome',
122
+ });
123
+ }
124
+ else {
125
+ deviceId = selected;
126
+ const existing = devices.find(d => d.id === deviceId);
127
+ deviceName = existing?.name;
128
+ }
129
+ }
130
+ const mcpExtraArgs = options.mcpArgs ? options.mcpArgs.split(',') : [];
131
+ const mcpClient = new McpClient();
132
+ console.log(' Connecting to Chrome...');
133
+ try {
134
+ await mcpClient.connect({
135
+ browserUrl: options.browserUrl,
136
+ extraArgs: mcpExtraArgs,
137
+ });
138
+ }
139
+ catch (error) {
140
+ console.error('Failed to connect to Chrome DevTools MCP:', error instanceof Error ? error.message : error);
141
+ process.exit(1);
142
+ }
143
+ let tools;
144
+ try {
145
+ tools = await mcpClient.listTools();
146
+ }
147
+ catch (error) {
148
+ console.error(' ✗ Failed to connect to Chrome DevTools MCP:', error instanceof Error ? error.message : error);
149
+ await mcpClient.disconnect();
150
+ process.exit(1);
151
+ }
152
+ try {
153
+ const check = await mcpClient.callTool('list_pages', {});
154
+ if (check.isError) {
155
+ const msg = check.content?.[0]?.text ?? '';
156
+ console.error(' ✗ Chrome is not reachable.');
157
+ console.error('');
158
+ console.error(' Please enable remote debugging in Chrome:');
159
+ console.error(' 1. Open chrome://inspect/#remote-debugging');
160
+ console.error(' 2. Check "Allow remote debugging for this browser instance"');
161
+ console.error(' 3. Re-run this command');
162
+ console.error('');
163
+ console.error(` Detail: ${msg}`);
164
+ await mcpClient.disconnect();
165
+ process.exit(1);
166
+ }
167
+ console.log(` ✓ Connected to Chrome (${tools.length} tools available)`);
168
+ }
169
+ catch (error) {
170
+ console.error(' ✗ Chrome health check failed:', error instanceof Error ? error.message : error);
171
+ await mcpClient.disconnect();
172
+ process.exit(1);
173
+ }
174
+ try {
175
+ const result = await serverClient.connect({
176
+ type: 'chrome',
177
+ deviceId,
178
+ name: deviceName,
179
+ tools: [...tools, ...DOKO_TOOLS],
180
+ });
181
+ deviceId = result.deviceId;
182
+ deviceName = result.name;
183
+ saveDevice({
184
+ id: result.deviceId,
185
+ name: result.name,
186
+ type: result.type,
187
+ createdAt: Date.now(),
188
+ });
189
+ console.log(` ✓ Registered "${deviceName}" (${deviceId})`);
190
+ }
191
+ catch (error) {
192
+ console.error('Registration failed:', error instanceof Error ? error.message : error);
193
+ await mcpClient.disconnect();
194
+ process.exit(1);
195
+ }
196
+ const executor = new Executor(mcpClient, serverUrl);
197
+ const heartbeat = new Heartbeat(serverClient, deviceId);
198
+ const statusLine = ` ${G}●${R} Listening for commands... (Ctrl+C to quit)`;
199
+ const poller = new CommandPoller(serverClient, executor, deviceId, {
200
+ onReconnect: () => process.stdout.write(statusLine),
201
+ });
202
+ heartbeat.start();
203
+ poller.start();
204
+ const updateInfo = getUpdateResult();
205
+ if (updateInfo) {
206
+ console.error(formatUpdateNotification(updateInfo));
207
+ }
208
+ console.log('');
209
+ process.stdout.write(statusLine);
210
+ const shutdown = async () => {
211
+ process.stdout.write(`\r\x1b[2K`);
212
+ console.log(' Shutting down...');
213
+ poller.stop();
214
+ heartbeat.stop();
215
+ await serverClient.disconnect(deviceId);
216
+ await mcpClient.disconnect();
217
+ process.exit(0);
218
+ };
219
+ process.on('SIGINT', shutdown);
220
+ process.on('SIGTERM', shutdown);
221
+ await new Promise(() => { });
222
+ }
223
+ //# sourceMappingURL=doko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doko.js","sourceRoot":"","sources":["../../src/doko.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  import { McpClient } from './mcp-client.js';
2
+ interface McpTool {
3
+ name: string;
4
+ description?: string;
5
+ inputSchema?: Record<string, unknown>;
6
+ }
2
7
  interface ServerCommand {
3
8
  type: string;
4
9
  requestId: string;
@@ -8,9 +13,17 @@ interface ServerCommand {
8
13
  arguments: Record<string, unknown>;
9
14
  };
10
15
  }
16
+ export declare const DOKO_TOOLS: McpTool[];
11
17
  export declare class Executor {
12
18
  private mcpClient;
13
- constructor(mcpClient: McpClient);
19
+ private serverUrl;
20
+ private dokoHandlers;
21
+ private cachedExtensionDokoId;
22
+ constructor(mcpClient: McpClient, serverUrl?: string);
23
+ private parsePages;
24
+ private extractEvalValue;
25
+ private resolveExtensionDokoId;
26
+ private handleGetExtensionDokoId;
14
27
  execute(command: ServerCommand): Promise<Record<string, unknown>>;
15
28
  }
16
29
  export {};