@dokobot/cli 1.0.1 → 1.1.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.
@@ -1,3 +1,4 @@
1
+ import { logger } from './logger.js';
1
2
  const STATUS_LINE = ` \x1b[32m●\x1b[0m Listening for commands... (Ctrl+C to quit)`;
2
3
  function clearLine() {
3
4
  process.stdout.write(`\r\x1b[2K`);
@@ -5,10 +6,89 @@ function clearLine() {
5
6
  function showStatus() {
6
7
  process.stdout.write(STATUS_LINE);
7
8
  }
9
+ const DEFAULT_SERVER_URL = 'https://dokobot.ai';
10
+ export const DOKO_TOOLS = [
11
+ {
12
+ name: 'doko_get_extension_id',
13
+ description: 'Get the Dokobot extension device ID from the connected browser. Returns the extension doko ID that can be used with the read API to get rich page content via the extension.',
14
+ inputSchema: { type: 'object', properties: {}, required: [] },
15
+ },
16
+ ];
8
17
  export class Executor {
9
18
  mcpClient;
10
- constructor(mcpClient) {
19
+ serverUrl;
20
+ dokoHandlers;
21
+ cachedExtensionDokoId = null;
22
+ constructor(mcpClient, serverUrl = DEFAULT_SERVER_URL) {
11
23
  this.mcpClient = mcpClient;
24
+ this.serverUrl = serverUrl;
25
+ this.dokoHandlers = {
26
+ doko_get_extension_id: () => this.handleGetExtensionDokoId(),
27
+ };
28
+ }
29
+ parsePages(text) {
30
+ const pages = [];
31
+ for (const line of text.split('\n')) {
32
+ const m = line.match(/^(\d+):\s+(\S+)(.*)$/);
33
+ if (m) {
34
+ pages.push({ pageId: Number(m[1]), url: m[2], selected: line.includes('[selected]') });
35
+ }
36
+ }
37
+ return pages;
38
+ }
39
+ extractEvalValue(result) {
40
+ if (result.isError)
41
+ return null;
42
+ const raw = result.content?.[0]?.text ?? '';
43
+ const jsonMatch = raw.match(/```json\s*\n([\s\S]*?)\n```/);
44
+ const text = (jsonMatch ? jsonMatch[1] : raw).trim();
45
+ if (!text || text === 'null' || text === 'undefined')
46
+ return null;
47
+ try {
48
+ const parsed = JSON.parse(text);
49
+ return typeof parsed === 'string' ? parsed : null;
50
+ }
51
+ catch {
52
+ return text || null;
53
+ }
54
+ }
55
+ async resolveExtensionDokoId() {
56
+ if (this.cachedExtensionDokoId)
57
+ return this.cachedExtensionDokoId;
58
+ try {
59
+ const beforeResult = await this.mcpClient.callTool('list_pages', {});
60
+ const beforePages = this.parsePages(beforeResult.content?.[0]?.text ?? '');
61
+ const previousPageId = beforePages.find(p => p.selected)?.pageId;
62
+ await this.mcpClient.callTool('new_page', { url: this.serverUrl });
63
+ await this.mcpClient.callTool('wait_for', { selector: 'body', timeout: 5000 }).catch(() => { });
64
+ const result = await this.mcpClient.callTool('evaluate_script', {
65
+ function: "() => localStorage.getItem('dokobot_ext_deviceId')",
66
+ });
67
+ const afterResult = await this.mcpClient.callTool('list_pages', {});
68
+ const afterPages = this.parsePages(afterResult.content?.[0]?.text ?? '');
69
+ const tempPage = afterPages.find(p => p.selected && p.url.startsWith(this.serverUrl));
70
+ if (tempPage) {
71
+ await this.mcpClient.callTool('close_page', { pageId: tempPage.pageId }).catch(() => { });
72
+ }
73
+ if (previousPageId !== undefined) {
74
+ await this.mcpClient.callTool('select_page', { pageId: previousPageId }).catch(() => { });
75
+ }
76
+ const value = this.extractEvalValue(result);
77
+ if (value)
78
+ this.cachedExtensionDokoId = value;
79
+ return value;
80
+ }
81
+ catch (error) {
82
+ logger.debug('Failed to resolve extension doko ID', error);
83
+ return null;
84
+ }
85
+ }
86
+ async handleGetExtensionDokoId() {
87
+ const id = await this.resolveExtensionDokoId();
88
+ if (!id) {
89
+ return { content: [{ type: 'text', text: 'Dokobot extension not found in this browser' }], isError: true };
90
+ }
91
+ return { content: [{ type: 'text', text: id }] };
12
92
  }
13
93
  async execute(command) {
14
94
  if (command.command !== 'mcpToolCall') {
@@ -20,7 +100,10 @@ export class Executor {
20
100
  clearLine();
21
101
  process.stdout.write(` \x1b[2m${timestamp}\x1b[0m \x1b[32m→\x1b[0m ${tool}${argsStr}`);
22
102
  try {
23
- const result = await this.mcpClient.callTool(tool, args || {});
103
+ const handler = this.dokoHandlers[tool];
104
+ const result = handler
105
+ ? await handler(args || {})
106
+ : await this.mcpClient.callTool(tool, args || {});
24
107
  console.log(` \x1b[32m✓\x1b[0m`);
25
108
  showStatus();
26
109
  return { success: true, data: result };
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,+DAA+D,CAAC;AAEpF,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAYD,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C,KAAK,CAAC,OAAO,CAAC,OAAsB;QAClC,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAElD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,4BAA4B,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;QAExF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YAC5C,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,GAAG,+DAA+D,CAAC;AAEpF,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAyBD,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAc;IACnC;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,8KAA8K;QAC3L,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC9D;CACF,CAAC;AAEF,MAAM,OAAO,QAAQ;IAIC;IAA8B;IAH1C,YAAY,CAAkC;IAC9C,qBAAqB,GAAkB,IAAI,CAAC;IAEpD,YAAoB,SAAoB,EAAU,YAAoB,kBAAkB;QAApE,cAAS,GAAT,SAAS,CAAW;QAAU,cAAS,GAAT,SAAS,CAA6B;QACtF,IAAI,CAAC,YAAY,GAAG;YAClB,qBAAqB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE;SAC7D,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,MAAM,KAAK,GAAyD,EAAE,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAC,MAAiB;QACxC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,IAAI,IAAI,CAAC,qBAAqB;YAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAc,CAAC;YAClF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3E,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAEjE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAE/F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE;gBAC9D,QAAQ,EAAE,oDAAoD;aAC/D,CAAc,CAAC;YAEhB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAc,CAAC;YACjF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACtF,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3F,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,KAAK;gBAAE,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7G,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAsB;QAClC,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAElD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,4BAA4B,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;QAExF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO;gBACpB,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC3B,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YAC5C,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;CACF"}
@@ -23,5 +23,76 @@ export declare class ServerClient {
23
23
  heartbeat(deviceId: string): Promise<void>;
24
24
  pollCommand(deviceId: string, signal?: AbortSignal): Promise<Record<string, unknown> | null>;
25
25
  sendResult(requestId: string, result: Record<string, unknown>): Promise<void>;
26
+ listCrawlDokos(): Promise<CrawlDoko[]>;
27
+ createCrawlTask(body: {
28
+ deviceIds: string[];
29
+ plan: Record<string, unknown>;
30
+ request: {
31
+ prompt: string;
32
+ outputFormat: string;
33
+ };
34
+ }): Promise<CrawlTask>;
35
+ listCrawlTasks(params?: {
36
+ status?: string;
37
+ limit?: number;
38
+ offset?: number;
39
+ }): Promise<{
40
+ tasks: CrawlTask[];
41
+ total: number;
42
+ }>;
43
+ getCrawlTask(taskId: string): Promise<CrawlTask>;
44
+ cancelCrawlTask(taskId: string): Promise<CrawlTask>;
45
+ getCrawlResult(taskId: string): Promise<CrawlResult>;
46
+ downloadUrl(url: string): Promise<Response>;
47
+ }
48
+ export interface CrawlDoko {
49
+ id: string;
50
+ name: string;
51
+ isOnline: boolean;
52
+ }
53
+ export interface CrawlTask {
54
+ id: string;
55
+ name: string;
56
+ status: string;
57
+ request: {
58
+ prompt: string;
59
+ outputFormat: string;
60
+ urls?: string[];
61
+ };
62
+ plan?: {
63
+ name: string;
64
+ goal: string;
65
+ urls: string[];
66
+ fields: {
67
+ name: string;
68
+ description: string;
69
+ type: string;
70
+ required: boolean;
71
+ }[];
72
+ maxItemsPerPage: number;
73
+ outputFormat: string;
74
+ };
75
+ execution: {
76
+ pages: {
77
+ url: string;
78
+ deviceId: string;
79
+ status: string;
80
+ extractedItems?: number;
81
+ error?: string;
82
+ }[];
83
+ startedAt?: number;
84
+ completedAt?: number;
85
+ };
86
+ result?: CrawlResult;
87
+ error?: string;
88
+ createdAt: number;
89
+ updatedAt: number;
90
+ }
91
+ export interface CrawlResult {
92
+ downloadUrl: string;
93
+ format: string;
94
+ itemCount: number;
95
+ summary: string;
96
+ fileSizeBytes: number;
26
97
  }
27
98
  export {};
@@ -8,15 +8,27 @@ export class ServerClient {
8
8
  }
9
9
  async request(path, options = {}) {
10
10
  const url = `${this.serverUrl}${path}`;
11
- const res = await fetch(url, {
12
- ...options,
13
- headers: {
14
- 'Authorization': `Bearer ${this.apiKey}`,
15
- 'Content-Type': 'application/json',
16
- ...options.headers,
17
- },
18
- });
19
- return res;
11
+ const { timeoutMs, signal: externalSignal, ...fetchOptions } = options;
12
+ const timeout = timeoutMs ?? 30_000;
13
+ const timeoutController = new AbortController();
14
+ const timer = setTimeout(() => timeoutController.abort(), timeout);
15
+ const mergedSignal = externalSignal
16
+ ? AbortSignal.any([externalSignal, timeoutController.signal])
17
+ : timeoutController.signal;
18
+ try {
19
+ return await fetch(url, {
20
+ ...fetchOptions,
21
+ signal: mergedSignal,
22
+ headers: {
23
+ 'Authorization': `Bearer ${this.apiKey}`,
24
+ 'Content-Type': 'application/json',
25
+ ...fetchOptions.headers,
26
+ },
27
+ });
28
+ }
29
+ finally {
30
+ clearTimeout(timer);
31
+ }
20
32
  }
21
33
  async connect(params) {
22
34
  const res = await this.request('/api/dokos/connect', {
@@ -51,6 +63,7 @@ export class ServerClient {
51
63
  const res = await this.request(`/api/commands/poll?deviceId=${encodeURIComponent(deviceId)}`, {
52
64
  method: 'GET',
53
65
  signal,
66
+ timeoutMs: 90_000,
54
67
  });
55
68
  if (res.status === 204)
56
69
  return null;
@@ -80,5 +93,79 @@ export class ServerClient {
80
93
  }
81
94
  logger.error(`sendResult failed after all retries for ${requestId}`);
82
95
  }
96
+ // -- Crawl API --
97
+ async listCrawlDokos() {
98
+ const res = await this.request('/api/crawl/dokos');
99
+ if (!res.ok) {
100
+ const body = await res.json().catch(() => ({}));
101
+ throw new Error(`Failed to list dokos (${res.status}): ${body.error || res.statusText}`);
102
+ }
103
+ const data = await res.json();
104
+ return data.dokos;
105
+ }
106
+ async createCrawlTask(body) {
107
+ const res = await this.request('/api/crawl/tasks', {
108
+ method: 'POST',
109
+ body: JSON.stringify(body),
110
+ });
111
+ if (!res.ok) {
112
+ const data = await res.json().catch(() => ({}));
113
+ throw new Error(`Failed to create task (${res.status}): ${data.error || res.statusText}`);
114
+ }
115
+ const data = await res.json();
116
+ return data.task;
117
+ }
118
+ async listCrawlTasks(params) {
119
+ const query = new URLSearchParams();
120
+ if (params?.status)
121
+ query.set('status', params.status);
122
+ if (params?.limit)
123
+ query.set('limit', String(params.limit));
124
+ if (params?.offset)
125
+ query.set('offset', String(params.offset));
126
+ const qs = query.toString();
127
+ const res = await this.request(`/api/crawl/tasks${qs ? `?${qs}` : ''}`);
128
+ if (!res.ok) {
129
+ const body = await res.json().catch(() => ({}));
130
+ throw new Error(`Failed to list tasks (${res.status}): ${body.error || res.statusText}`);
131
+ }
132
+ return res.json();
133
+ }
134
+ async getCrawlTask(taskId) {
135
+ const res = await this.request(`/api/crawl/tasks/${encodeURIComponent(taskId)}`);
136
+ if (!res.ok) {
137
+ const body = await res.json().catch(() => ({}));
138
+ throw new Error(`Failed to get task (${res.status}): ${body.error || res.statusText}`);
139
+ }
140
+ const data = await res.json();
141
+ return data.task;
142
+ }
143
+ async cancelCrawlTask(taskId) {
144
+ const res = await this.request(`/api/crawl/tasks/${encodeURIComponent(taskId)}`, {
145
+ method: 'PATCH',
146
+ body: JSON.stringify({ action: 'cancel' }),
147
+ });
148
+ if (!res.ok) {
149
+ const body = await res.json().catch(() => ({}));
150
+ throw new Error(`Failed to cancel task (${res.status}): ${body.error || res.statusText}`);
151
+ }
152
+ const data = await res.json();
153
+ return data.task;
154
+ }
155
+ async getCrawlResult(taskId) {
156
+ const res = await this.request(`/api/crawl/tasks/${encodeURIComponent(taskId)}/result`);
157
+ if (!res.ok) {
158
+ const body = await res.json().catch(() => ({}));
159
+ throw new Error(`Failed to get result (${res.status}): ${body.error || res.statusText}`);
160
+ }
161
+ return res.json();
162
+ }
163
+ async downloadUrl(url) {
164
+ const res = await fetch(url);
165
+ if (!res.ok) {
166
+ throw new Error(`Download failed (${res.status})`);
167
+ }
168
+ return res;
169
+ }
83
170
  }
84
171
  //# sourceMappingURL=server-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-client.js","sourceRoot":"","sources":["../../src/server-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-client.js","sourceRoot":"","sources":["../../src/server-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dokobot/cli",
3
- "version": "1.0.1",
4
- "description": "Dokobot CLI - Connect Chrome browser as a doko via Chrome DevTools MCP",
3
+ "version": "1.1.0",
4
+ "description": "Dokobot CLI - Connect Chrome as a doko and extract structured data from any web page",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "dokobot": "./dist/bin/dokobot.js"
@@ -38,7 +38,8 @@
38
38
  "typescript": "^5"
39
39
  },
40
40
  "files": [
41
- "dist"
41
+ "dist",
42
+ "README.md"
42
43
  ],
43
44
  "license": "MIT",
44
45
  "publishConfig": {