openclaw-cascade-plugin 1.0.2 → 1.0.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.
Files changed (46) hide show
  1. package/README.md +21 -16
  2. package/dist/config.d.ts +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +3 -10
  5. package/dist/config.js.map +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +55 -39
  8. package/dist/index.js.map +1 -1
  9. package/dist/tools/a2a-tools.d.ts +1 -1
  10. package/dist/tools/a2a-tools.d.ts.map +1 -1
  11. package/dist/tools/a2a-tools.js +4 -4
  12. package/dist/tools/a2a-tools.js.map +1 -1
  13. package/dist/tools/api-tools.d.ts +1 -1
  14. package/dist/tools/api-tools.d.ts.map +1 -1
  15. package/dist/tools/api-tools.js +3 -3
  16. package/dist/tools/api-tools.js.map +1 -1
  17. package/dist/tools/desktop-automation.d.ts +1 -1
  18. package/dist/tools/desktop-automation.d.ts.map +1 -1
  19. package/dist/tools/desktop-automation.js +10 -10
  20. package/dist/tools/desktop-automation.js.map +1 -1
  21. package/dist/tools/sandbox-tools.d.ts +1 -1
  22. package/dist/tools/sandbox-tools.d.ts.map +1 -1
  23. package/dist/tools/sandbox-tools.js +2 -2
  24. package/dist/tools/sandbox-tools.js.map +1 -1
  25. package/dist/tools/web-automation.d.ts +1 -1
  26. package/dist/tools/web-automation.d.ts.map +1 -1
  27. package/dist/tools/web-automation.js +16 -16
  28. package/dist/tools/web-automation.js.map +1 -1
  29. package/dist/types/index.d.ts +1 -0
  30. package/dist/types/index.d.ts.map +1 -1
  31. package/dist/types/index.js.map +1 -1
  32. package/openclaw-cascade-plugin-1.0.4.tgz +0 -0
  33. package/openclaw.plugin.json +9 -1
  34. package/package.json +3 -2
  35. package/scripts/postinstall.js +84 -0
  36. package/src/config.test.ts +3 -8
  37. package/src/config.ts +4 -14
  38. package/src/index.ts +59 -46
  39. package/src/tools/a2a-tools.ts +4 -4
  40. package/src/tools/api-tools.ts +3 -3
  41. package/src/tools/desktop-automation.test.ts +2 -2
  42. package/src/tools/desktop-automation.ts +10 -10
  43. package/src/tools/sandbox-tools.ts +2 -2
  44. package/src/tools/web-automation.test.ts +1 -1
  45. package/src/tools/web-automation.ts +16 -16
  46. package/src/types/index.ts +1 -0
@@ -9,7 +9,7 @@ import { CascadeMcpClient } from '../cascade-client';
9
9
  import { ToolResponse } from '../types';
10
10
  import { errorResponse, formatSuccess } from './response-helpers';
11
11
 
12
- export function registerApiTools(registry: ToolRegistry, client: CascadeMcpClient): void {
12
+ export function registerApiTools(registry: ToolRegistry, getClient: () => Promise<CascadeMcpClient>): void {
13
13
  // 1. cascade_web_search
14
14
  registry.register({
15
15
  name: 'cascade_web_search',
@@ -35,7 +35,7 @@ export function registerApiTools(registry: ToolRegistry, client: CascadeMcpClien
35
35
  return errorResponse('query is required');
36
36
  }
37
37
 
38
- const result = await client.callTool('web_search', {
38
+ const result = await await (await getClient()).callTool('web_search', {
39
39
  query: args.query,
40
40
  top_k: args.top_k || 5
41
41
  });
@@ -91,7 +91,7 @@ export function registerApiTools(registry: ToolRegistry, client: CascadeMcpClien
91
91
  return errorResponse('url is required');
92
92
  }
93
93
 
94
- const result = await client.callTool('call_http_api', {
94
+ const result = await await (await getClient()).callTool('call_http_api', {
95
95
  method: args.method,
96
96
  url: args.url,
97
97
  headers: args.headers,
@@ -13,7 +13,7 @@ describe('Desktop Automation Tools', () => {
13
13
  beforeEach(() => {
14
14
  registry = new ToolRegistry();
15
15
  mockClient = new MockCascadeMcpClient();
16
- registerDesktopTools(registry, mockClient as any);
16
+ registerDesktopTools(registry, async () => mockClient as any);
17
17
  });
18
18
 
19
19
  describe('cascade_click_element', () => {
@@ -174,7 +174,7 @@ describe('Desktop Automation Tools', () => {
174
174
  // Arrange
175
175
  const largeImage = 'A'.repeat(5000000); // 5MB base64 = ~3.75MB actual
176
176
  const diskRegistry = new ToolRegistry();
177
- registerDesktopTools(diskRegistry, mockClient as any, { screenshotMode: 'disk' } as any);
177
+ registerDesktopTools(diskRegistry, async () => mockClient as any, { screenshotMode: 'disk' } as any);
178
178
 
179
179
  mockClient.registerMockTool('get_screenshot', () => ({
180
180
  image: largeImage,
@@ -17,7 +17,7 @@ const MAX_EMBED_SIZE = 4 * 1024 * 1024;
17
17
 
18
18
  export function registerDesktopTools(
19
19
  registry: ToolRegistry,
20
- client: CascadeMcpClient,
20
+ getClient: () => Promise<CascadeMcpClient>,
21
21
  config?: CascadePluginConfig
22
22
  ): void {
23
23
  const screenshotMode = config?.screenshotMode || 'auto';
@@ -58,7 +58,7 @@ export function registerDesktopTools(
58
58
  return errorResponse('platform_source is required');
59
59
  }
60
60
 
61
- const result = await client.callTool('click_element', args);
61
+ const result = await await (await getClient()).callTool('click_element', args);
62
62
  return formatSuccess(result);
63
63
  } catch (error) {
64
64
  return errorResponse(
@@ -112,7 +112,7 @@ export function registerDesktopTools(
112
112
  return errorResponse('text is required');
113
113
  }
114
114
 
115
- const result = await client.callTool('type_text', args);
115
+ const result = await await (await getClient()).callTool('type_text', args);
116
116
  return formatSuccess(result);
117
117
  } catch (error) {
118
118
  return errorResponse(
@@ -132,7 +132,7 @@ export function registerDesktopTools(
132
132
  },
133
133
  handler: async (): Promise<ToolResponse> => {
134
134
  try {
135
- const result = await client.callTool('get_semantic_tree', {});
135
+ const result = await await (await getClient()).callTool('get_semantic_tree', {});
136
136
  return formatSuccess(result);
137
137
  } catch (error) {
138
138
  return errorResponse(
@@ -152,7 +152,7 @@ export function registerDesktopTools(
152
152
  },
153
153
  handler: async (): Promise<ToolResponse> => {
154
154
  try {
155
- const result = await client.callTool('get_screenshot', {});
155
+ const result = await await (await getClient()).callTool('get_screenshot', {});
156
156
 
157
157
  if (!result.image) {
158
158
  return errorResponse('No image data received');
@@ -209,7 +209,7 @@ export function registerDesktopTools(
209
209
  return errorResponse('app_name is required');
210
210
  }
211
211
 
212
- const result = await client.callTool('start_app', args);
212
+ const result = await await (await getClient()).callTool('start_app', args);
213
213
  return formatSuccess(result);
214
214
  } catch (error) {
215
215
  return errorResponse(
@@ -246,7 +246,7 @@ export function registerDesktopTools(
246
246
  },
247
247
  handler: async (args): Promise<ToolResponse> => {
248
248
  try {
249
- const result = await client.callTool('hover_element', args);
249
+ const result = await await (await getClient()).callTool('hover_element', args);
250
250
  return formatSuccess(result);
251
251
  } catch (error) {
252
252
  return errorResponse(
@@ -282,7 +282,7 @@ export function registerDesktopTools(
282
282
  },
283
283
  handler: async (args): Promise<ToolResponse> => {
284
284
  try {
285
- const result = await client.callTool('focus_element', args);
285
+ const result = await await (await getClient()).callTool('focus_element', args);
286
286
  return formatSuccess(result);
287
287
  } catch (error) {
288
288
  return errorResponse(
@@ -318,7 +318,7 @@ export function registerDesktopTools(
318
318
  },
319
319
  handler: async (args): Promise<ToolResponse> => {
320
320
  try {
321
- const result = await client.callTool('scroll_element', args);
321
+ const result = await await (await getClient()).callTool('scroll_element', args);
322
322
  return formatSuccess(result);
323
323
  } catch (error) {
324
324
  return errorResponse(
@@ -354,7 +354,7 @@ export function registerDesktopTools(
354
354
  },
355
355
  handler: async (args): Promise<ToolResponse> => {
356
356
  try {
357
- const result = await client.callTool('wait_visible', args);
357
+ const result = await await (await getClient()).callTool('wait_visible', args);
358
358
  return formatSuccess(result);
359
359
  } catch (error) {
360
360
  return errorResponse(
@@ -9,7 +9,7 @@ import { CascadeMcpClient } from '../cascade-client';
9
9
  import { ToolResponse } from '../types';
10
10
  import { errorResponse, formatSuccess } from './response-helpers';
11
11
 
12
- export function registerSandboxTools(registry: ToolRegistry, client: CascadeMcpClient): void {
12
+ export function registerSandboxTools(registry: ToolRegistry, getClient: () => Promise<CascadeMcpClient>): void {
13
13
  registry.register({
14
14
  name: 'cascade_execute_sandbox_skill',
15
15
  description: 'Execute a Python sandbox skill for programmatic file automation',
@@ -63,7 +63,7 @@ export function registerSandboxTools(registry: ToolRegistry, client: CascadeMcpC
63
63
  return errorResponse('task is required');
64
64
  }
65
65
 
66
- const result = await client.callTool('execute_sandbox_skill', {
66
+ const result = await await (await getClient()).callTool('execute_sandbox_skill', {
67
67
  skill_id: args.skill_id,
68
68
  task: args.task,
69
69
  inputs: args.inputs || {},
@@ -13,7 +13,7 @@ describe('Web Automation Tools', () => {
13
13
  beforeEach(() => {
14
14
  registry = new ToolRegistry();
15
15
  mockClient = new MockCascadeMcpClient();
16
- registerWebTools(registry, mockClient as any);
16
+ registerWebTools(registry, async () => mockClient as any);
17
17
  });
18
18
 
19
19
  describe('Navigation Tools', () => {
@@ -9,7 +9,7 @@ import { CascadeMcpClient } from '../cascade-client';
9
9
  import { ToolResponse } from '../types';
10
10
  import { errorResponse, formatSuccess } from './response-helpers';
11
11
 
12
- export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClient): void {
12
+ export function registerWebTools(registry: ToolRegistry, getClient: () => Promise<CascadeMcpClient>): void {
13
13
  // Navigation Tools (5)
14
14
 
15
15
  // 1. cascade_pw_goto
@@ -38,7 +38,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
38
38
  return errorResponse('url is required');
39
39
  }
40
40
 
41
- const result = await client.callTool('pw_goto', {
41
+ const result = await await (await getClient()).callTool('pw_goto', {
42
42
  url: args.url,
43
43
  wait_until: args.wait_until || 'networkidle'
44
44
  });
@@ -62,7 +62,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
62
62
  },
63
63
  handler: async (): Promise<ToolResponse> => {
64
64
  try {
65
- const result = await client.callTool('pw_back', {});
65
+ const result = await await (await getClient()).callTool('pw_back', {});
66
66
  return formatSuccess(result);
67
67
  } catch (error) {
68
68
  return errorResponse(
@@ -82,7 +82,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
82
82
  },
83
83
  handler: async (): Promise<ToolResponse> => {
84
84
  try {
85
- const result = await client.callTool('pw_forward', {});
85
+ const result = await await (await getClient()).callTool('pw_forward', {});
86
86
  return formatSuccess(result);
87
87
  } catch (error) {
88
88
  return errorResponse(
@@ -108,7 +108,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
108
108
  },
109
109
  handler: async (args): Promise<ToolResponse> => {
110
110
  try {
111
- const result = await client.callTool('pw_reload', {
111
+ const result = await await (await getClient()).callTool('pw_reload', {
112
112
  wait_until: args.wait_until || 'networkidle'
113
113
  });
114
114
  return formatSuccess(result);
@@ -145,7 +145,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
145
145
  return errorResponse('url is required');
146
146
  }
147
147
 
148
- const result = await client.callTool('pw_wait_for_url', {
148
+ const result = await await (await getClient()).callTool('pw_wait_for_url', {
149
149
  url: args.url,
150
150
  timeout_ms: args.timeout_ms || 10000
151
151
  });
@@ -181,7 +181,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
181
181
  return errorResponse('selector is required');
182
182
  }
183
183
 
184
- const result = await client.callTool('pw_locator_count', {
184
+ const result = await await (await getClient()).callTool('pw_locator_count', {
185
185
  selector: args.selector
186
186
  });
187
187
  return formatSuccess({ count: result.count });
@@ -218,7 +218,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
218
218
  return errorResponse('selector is required');
219
219
  }
220
220
 
221
- const result = await client.callTool('pw_locator_text', {
221
+ const result = await await (await getClient()).callTool('pw_locator_text', {
222
222
  selector: args.selector,
223
223
  timeout_ms: args.timeout_ms || 8000
224
224
  });
@@ -257,7 +257,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
257
257
  return errorResponse('selector is required');
258
258
  }
259
259
 
260
- const result = await client.callTool('pw_click', {
260
+ const result = await await (await getClient()).callTool('pw_click', {
261
261
  selector: args.selector,
262
262
  timeout_ms: args.timeout_ms || 8000
263
263
  });
@@ -302,7 +302,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
302
302
  return errorResponse('text is required');
303
303
  }
304
304
 
305
- const result = await client.callTool('pw_fill', {
305
+ const result = await await (await getClient()).callTool('pw_fill', {
306
306
  selector: args.selector,
307
307
  text: args.text,
308
308
  timeout_ms: args.timeout_ms || 8000
@@ -347,7 +347,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
347
347
  return errorResponse('key is required');
348
348
  }
349
349
 
350
- const result = await client.callTool('pw_press', {
350
+ const result = await await (await getClient()).callTool('pw_press', {
351
351
  selector: args.selector,
352
352
  key: args.key,
353
353
  timeout_ms: args.timeout_ms || 8000
@@ -389,7 +389,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
389
389
  return errorResponse('values is required and must be an array');
390
390
  }
391
391
 
392
- const result = await client.callTool('pw_select_option', {
392
+ const result = await await (await getClient()).callTool('pw_select_option', {
393
393
  selector: args.selector,
394
394
  values: args.values
395
395
  });
@@ -424,7 +424,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
424
424
  return errorResponse('expression is required');
425
425
  }
426
426
 
427
- const result = await client.callTool('pw_eval', {
427
+ const result = await await (await getClient()).callTool('pw_eval', {
428
428
  expression: args.expression
429
429
  });
430
430
  return formatSuccess({ result: result.result });
@@ -463,7 +463,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
463
463
  return errorResponse('expression is required');
464
464
  }
465
465
 
466
- const result = await client.callTool('pw_eval_on_selector', {
466
+ const result = await await (await getClient()).callTool('pw_eval_on_selector', {
467
467
  selector: args.selector,
468
468
  expression: args.expression
469
469
  });
@@ -486,7 +486,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
486
486
  },
487
487
  handler: async (): Promise<ToolResponse> => {
488
488
  try {
489
- const result = await client.callTool('pw_list_frames', {});
489
+ const result = await await (await getClient()).callTool('pw_list_frames', {});
490
490
  return formatSuccess({ frames: result.frames });
491
491
  } catch (error) {
492
492
  return errorResponse(
@@ -506,7 +506,7 @@ export function registerWebTools(registry: ToolRegistry, client: CascadeMcpClien
506
506
  },
507
507
  handler: async (): Promise<ToolResponse> => {
508
508
  try {
509
- const result = await client.callTool('pw_get_cookies', {});
509
+ const result = await await (await getClient()).callTool('pw_get_cookies', {});
510
510
  return formatSuccess({ cookies: result.cookies });
511
511
  } catch (error) {
512
512
  return errorResponse(
@@ -6,6 +6,7 @@
6
6
  export interface CascadePluginConfig {
7
7
  cascadeGrpcEndpoint: string;
8
8
  cascadePythonPath?: string;
9
+ cascadePythonModulePath?: string;
9
10
  firestoreProjectId?: string;
10
11
  firestoreCredentialsPath?: string;
11
12
  headless?: boolean;