openclaw-cascade-plugin 1.0.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.
Files changed (98) hide show
  1. package/PHASE1_SUMMARY.md +191 -0
  2. package/PHASE3_SUMMARY.md +195 -0
  3. package/README.md +43 -0
  4. package/dist/a2a-client.d.ts +17 -0
  5. package/dist/a2a-client.d.ts.map +1 -0
  6. package/dist/a2a-client.js +47 -0
  7. package/dist/a2a-client.js.map +1 -0
  8. package/dist/cascade-client.d.ts +53 -0
  9. package/dist/cascade-client.d.ts.map +1 -0
  10. package/dist/cascade-client.js +179 -0
  11. package/dist/cascade-client.js.map +1 -0
  12. package/dist/config.d.ts +26 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +116 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/index.d.ts +29 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +136 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/python-manager.d.ts +59 -0
  21. package/dist/python-manager.d.ts.map +1 -0
  22. package/dist/python-manager.js +190 -0
  23. package/dist/python-manager.js.map +1 -0
  24. package/dist/test-utils/helpers.d.ts +20 -0
  25. package/dist/test-utils/helpers.d.ts.map +1 -0
  26. package/dist/test-utils/helpers.js +89 -0
  27. package/dist/test-utils/helpers.js.map +1 -0
  28. package/dist/test-utils/index.d.ts +3 -0
  29. package/dist/test-utils/index.d.ts.map +1 -0
  30. package/dist/test-utils/index.js +19 -0
  31. package/dist/test-utils/index.js.map +1 -0
  32. package/dist/test-utils/mocks.d.ts +51 -0
  33. package/dist/test-utils/mocks.d.ts.map +1 -0
  34. package/dist/test-utils/mocks.js +84 -0
  35. package/dist/test-utils/mocks.js.map +1 -0
  36. package/dist/tools/a2a-tools.d.ts +9 -0
  37. package/dist/tools/a2a-tools.d.ts.map +1 -0
  38. package/dist/tools/a2a-tools.js +147 -0
  39. package/dist/tools/a2a-tools.js.map +1 -0
  40. package/dist/tools/api-tools.d.ts +9 -0
  41. package/dist/tools/api-tools.d.ts.map +1 -0
  42. package/dist/tools/api-tools.js +102 -0
  43. package/dist/tools/api-tools.js.map +1 -0
  44. package/dist/tools/desktop-automation.d.ts +10 -0
  45. package/dist/tools/desktop-automation.d.ts.map +1 -0
  46. package/dist/tools/desktop-automation.js +330 -0
  47. package/dist/tools/desktop-automation.js.map +1 -0
  48. package/dist/tools/index.d.ts +12 -0
  49. package/dist/tools/index.d.ts.map +1 -0
  50. package/dist/tools/index.js +35 -0
  51. package/dist/tools/index.js.map +1 -0
  52. package/dist/tools/response-helpers.d.ts +25 -0
  53. package/dist/tools/response-helpers.d.ts.map +1 -0
  54. package/dist/tools/response-helpers.js +71 -0
  55. package/dist/tools/response-helpers.js.map +1 -0
  56. package/dist/tools/sandbox-tools.d.ts +9 -0
  57. package/dist/tools/sandbox-tools.d.ts.map +1 -0
  58. package/dist/tools/sandbox-tools.js +79 -0
  59. package/dist/tools/sandbox-tools.js.map +1 -0
  60. package/dist/tools/tool-registry.d.ts +34 -0
  61. package/dist/tools/tool-registry.d.ts.map +1 -0
  62. package/dist/tools/tool-registry.js +50 -0
  63. package/dist/tools/tool-registry.js.map +1 -0
  64. package/dist/tools/web-automation.d.ts +9 -0
  65. package/dist/tools/web-automation.d.ts.map +1 -0
  66. package/dist/tools/web-automation.js +471 -0
  67. package/dist/tools/web-automation.js.map +1 -0
  68. package/dist/types/index.d.ts +111 -0
  69. package/dist/types/index.d.ts.map +1 -0
  70. package/dist/types/index.js +38 -0
  71. package/dist/types/index.js.map +1 -0
  72. package/jest.setup.js +19 -0
  73. package/openclaw-cascade-plugin-1.0.0.tgz +0 -0
  74. package/openclaw.plugin.json +116 -0
  75. package/package.json +74 -0
  76. package/src/a2a-client.ts +66 -0
  77. package/src/cascade-client.test.ts +400 -0
  78. package/src/cascade-client.ts +198 -0
  79. package/src/config.test.ts +194 -0
  80. package/src/config.ts +135 -0
  81. package/src/index.ts +164 -0
  82. package/src/python-manager.test.ts +187 -0
  83. package/src/python-manager.ts +230 -0
  84. package/src/test-utils/helpers.ts +107 -0
  85. package/src/test-utils/index.ts +2 -0
  86. package/src/test-utils/mocks.ts +101 -0
  87. package/src/tools/a2a-tools.ts +162 -0
  88. package/src/tools/api-tools.ts +110 -0
  89. package/src/tools/desktop-automation.test.ts +305 -0
  90. package/src/tools/desktop-automation.ts +366 -0
  91. package/src/tools/index.ts +13 -0
  92. package/src/tools/response-helpers.ts +78 -0
  93. package/src/tools/sandbox-tools.ts +83 -0
  94. package/src/tools/tool-registry.ts +51 -0
  95. package/src/tools/web-automation.test.ts +177 -0
  96. package/src/tools/web-automation.ts +518 -0
  97. package/src/types/index.ts +132 -0
  98. package/tsconfig.json +27 -0
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * Cascade MCP Client
4
+ *
5
+ * Handles communication with Cascade MCP server via stdio JSON-RPC
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CascadeMcpClient = void 0;
9
+ const child_process_1 = require("child_process");
10
+ class CascadeMcpClient {
11
+ constructor(pythonPath, env) {
12
+ this.pythonPath = pythonPath;
13
+ this.env = env;
14
+ this.process = null;
15
+ this.messageId = 0;
16
+ this.pendingRequests = new Map();
17
+ this.isInitialized = false;
18
+ this.REQUEST_TIMEOUT = 30000; // 30 seconds
19
+ this.buffer = '';
20
+ }
21
+ /**
22
+ * Start the MCP client and initialize connection
23
+ */
24
+ async start() {
25
+ try {
26
+ // Spawn Cascade MCP server
27
+ this.process = (0, child_process_1.spawn)(this.pythonPath, ['-m', 'mcp_server.cli'], {
28
+ env: { ...process.env, ...this.env },
29
+ stdio: ['pipe', 'pipe', 'pipe']
30
+ });
31
+ // Handle stdout for JSON-RPC responses
32
+ if (this.process.stdout) {
33
+ this.process.stdout.on('data', (data) => {
34
+ this.handleData(data.toString());
35
+ });
36
+ }
37
+ // Handle stderr
38
+ if (this.process.stderr) {
39
+ this.process.stderr.on('data', (data) => {
40
+ console.error('Cascade MCP stderr:', data.toString());
41
+ });
42
+ }
43
+ // Handle process errors
44
+ this.process.on('error', (error) => {
45
+ console.error('Cascade MCP process error:', error);
46
+ this.rejectAllPending(error);
47
+ });
48
+ // Initialize MCP connection
49
+ await this.sendRequest('initialize', {
50
+ protocolVersion: '2024-11-05',
51
+ capabilities: {},
52
+ clientInfo: { name: 'openclaw-cascade', version: '1.0.0' }
53
+ });
54
+ this.isInitialized = true;
55
+ }
56
+ catch (error) {
57
+ this.stop();
58
+ throw error;
59
+ }
60
+ }
61
+ /**
62
+ * Call a tool by name with arguments
63
+ */
64
+ async callTool(name, args) {
65
+ if (!this.isInitialized) {
66
+ throw new Error('MCP client not initialized. Call start() first.');
67
+ }
68
+ return this.sendRequest('tools/call', { name, arguments: args });
69
+ }
70
+ /**
71
+ * List all available tools
72
+ */
73
+ async listTools() {
74
+ if (!this.isInitialized) {
75
+ throw new Error('MCP client not initialized. Call start() first.');
76
+ }
77
+ const result = await this.sendRequest('tools/list', {});
78
+ return result.tools || [];
79
+ }
80
+ /**
81
+ * Check if client is connected
82
+ */
83
+ isConnected() {
84
+ return this.isInitialized && this.process !== null && !this.process.killed;
85
+ }
86
+ /**
87
+ * Stop the MCP client
88
+ */
89
+ stop() {
90
+ this.rejectAllPending(new Error('Client stopped'));
91
+ if (this.process && !this.process.killed) {
92
+ this.process.kill();
93
+ }
94
+ this.process = null;
95
+ this.isInitialized = false;
96
+ this.buffer = '';
97
+ }
98
+ /**
99
+ * Handle incoming data from stdout
100
+ */
101
+ handleData(data) {
102
+ this.buffer += data;
103
+ // Process complete lines
104
+ const lines = this.buffer.split('\n');
105
+ this.buffer = lines.pop() || ''; // Keep incomplete line in buffer
106
+ for (const line of lines) {
107
+ if (line.trim()) {
108
+ this.handleResponse(line);
109
+ }
110
+ }
111
+ }
112
+ /**
113
+ * Send a JSON-RPC request
114
+ */
115
+ async sendRequest(method, params) {
116
+ const id = ++this.messageId;
117
+ const request = { jsonrpc: '2.0', id, method, params };
118
+ return new Promise((resolve, reject) => {
119
+ // Set timeout
120
+ const timeoutId = setTimeout(() => {
121
+ this.pendingRequests.delete(id);
122
+ reject(new Error(`Request ${method} timed out after ${this.REQUEST_TIMEOUT}ms`));
123
+ }, this.REQUEST_TIMEOUT);
124
+ // Store pending request
125
+ this.pendingRequests.set(id, {
126
+ resolve: (result) => {
127
+ clearTimeout(timeoutId);
128
+ resolve(result);
129
+ },
130
+ reject: (error) => {
131
+ clearTimeout(timeoutId);
132
+ reject(error);
133
+ }
134
+ });
135
+ // Send request
136
+ if (this.process?.stdin) {
137
+ this.process.stdin.write(JSON.stringify(request) + '\n');
138
+ }
139
+ else {
140
+ this.pendingRequests.delete(id);
141
+ clearTimeout(timeoutId);
142
+ reject(new Error('Process stdin not available'));
143
+ }
144
+ });
145
+ }
146
+ /**
147
+ * Handle incoming JSON-RPC response
148
+ */
149
+ handleResponse(line) {
150
+ try {
151
+ const response = JSON.parse(line);
152
+ if (response.id && this.pendingRequests.has(response.id)) {
153
+ const { resolve, reject } = this.pendingRequests.get(response.id);
154
+ this.pendingRequests.delete(response.id);
155
+ if (response.error) {
156
+ reject(new Error(response.error.message || 'Unknown error'));
157
+ }
158
+ else {
159
+ resolve(response.result);
160
+ }
161
+ }
162
+ }
163
+ catch (e) {
164
+ // Ignore parse errors for non-JSON lines
165
+ console.debug('Failed to parse MCP response:', line.substring(0, 100));
166
+ }
167
+ }
168
+ /**
169
+ * Reject all pending requests
170
+ */
171
+ rejectAllPending(error) {
172
+ for (const [_id, { reject }] of this.pendingRequests) {
173
+ reject(error);
174
+ }
175
+ this.pendingRequests.clear();
176
+ }
177
+ }
178
+ exports.CascadeMcpClient = CascadeMcpClient;
179
+ //# sourceMappingURL=cascade-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-client.js","sourceRoot":"","sources":["../src/cascade-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Configuration management for OpenClaw Cascade Plugin
3
+ */
4
+ import { CascadePluginConfig } from './types';
5
+ /**
6
+ * Get default configuration values
7
+ */
8
+ export declare function getDefaults(): Partial<CascadePluginConfig>;
9
+ /**
10
+ * Validate configuration object
11
+ */
12
+ export declare function validateConfig(config: CascadePluginConfig): void;
13
+ /**
14
+ * Expand environment variables in a string
15
+ * Supports both $VAR and %VAR% syntax
16
+ */
17
+ export declare function expandEnvVars(value: string): string;
18
+ /**
19
+ * Load and validate configuration
20
+ */
21
+ export declare function loadConfig(input: Partial<CascadePluginConfig>): CascadePluginConfig;
22
+ /**
23
+ * Load configuration from OpenClaw API
24
+ */
25
+ export declare function loadConfigFromOpenClaw(api: any): CascadePluginConfig;
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAK9C;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAS1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAoChE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBnD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CA2BnF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB,CAWpE"}
package/dist/config.js ADDED
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration management for OpenClaw Cascade Plugin
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDefaults = getDefaults;
7
+ exports.validateConfig = validateConfig;
8
+ exports.expandEnvVars = expandEnvVars;
9
+ exports.loadConfig = loadConfig;
10
+ exports.loadConfigFromOpenClaw = loadConfigFromOpenClaw;
11
+ const VALID_AGENTS = ['explorer', 'worker', 'orchestrator'];
12
+ const VALID_SCREENSHOT_MODES = ['embed', 'disk', 'auto'];
13
+ /**
14
+ * Get default configuration values
15
+ */
16
+ function getDefaults() {
17
+ return {
18
+ cascadeGrpcEndpoint: 'localhost:50051',
19
+ headless: false,
20
+ actionTimeoutMs: 8000,
21
+ enableA2A: true,
22
+ verbose: false,
23
+ screenshotMode: 'auto'
24
+ };
25
+ }
26
+ /**
27
+ * Validate configuration object
28
+ */
29
+ function validateConfig(config) {
30
+ // Required fields
31
+ if (!config.cascadeGrpcEndpoint || config.cascadeGrpcEndpoint.trim() === '') {
32
+ throw new Error('cascadeGrpcEndpoint is required');
33
+ }
34
+ // Validate gRPC endpoint format
35
+ const endpointPattern = /^[\w.-]+:\d+$/;
36
+ if (!endpointPattern.test(config.cascadeGrpcEndpoint)) {
37
+ throw new Error(`Invalid cascadeGrpcEndpoint format: ${config.cascadeGrpcEndpoint}. ` +
38
+ 'Expected format: host:port (e.g., localhost:50051)');
39
+ }
40
+ // Validate allowed agents if provided
41
+ if (config.allowedAgents) {
42
+ for (const agent of config.allowedAgents) {
43
+ if (!VALID_AGENTS.includes(agent)) {
44
+ throw new Error(`Invalid agent in allowedAgents: ${agent}. Valid agents: ${VALID_AGENTS.join(', ')}`);
45
+ }
46
+ }
47
+ }
48
+ // Validate screenshot mode if provided
49
+ if (config.screenshotMode && !VALID_SCREENSHOT_MODES.includes(config.screenshotMode)) {
50
+ throw new Error(`Invalid screenshotMode: ${config.screenshotMode}. ` +
51
+ `Valid modes: ${VALID_SCREENSHOT_MODES.join(', ')}`);
52
+ }
53
+ // Validate action timeout
54
+ if (config.actionTimeoutMs !== undefined && config.actionTimeoutMs < 1000) {
55
+ throw new Error('actionTimeoutMs must be at least 1000ms');
56
+ }
57
+ }
58
+ /**
59
+ * Expand environment variables in a string
60
+ * Supports both $VAR and %VAR% syntax
61
+ */
62
+ function expandEnvVars(value) {
63
+ if (!value)
64
+ return value;
65
+ // Unix-style: $VAR or ${VAR}
66
+ let expanded = value.replace(/\$\{(\w+)\}/g, (match, varName) => {
67
+ return process.env[varName] || match;
68
+ });
69
+ expanded = expanded.replace(/\$(\w+)/g, (match, varName) => {
70
+ return process.env[varName] || match;
71
+ });
72
+ // Windows-style: %VAR%
73
+ expanded = expanded.replace(/%(\w+)%/g, (match, varName) => {
74
+ return process.env[varName] || match;
75
+ });
76
+ return expanded;
77
+ }
78
+ /**
79
+ * Load and validate configuration
80
+ */
81
+ function loadConfig(input) {
82
+ // Check required field before merging
83
+ if (!input.cascadeGrpcEndpoint) {
84
+ throw new Error('cascadeGrpcEndpoint is required');
85
+ }
86
+ // Expand environment variables in string fields
87
+ const expanded = {};
88
+ for (const [key, value] of Object.entries(input)) {
89
+ if (typeof value === 'string') {
90
+ expanded[key] = expandEnvVars(value);
91
+ }
92
+ else {
93
+ expanded[key] = value;
94
+ }
95
+ }
96
+ // Merge with defaults
97
+ const config = {
98
+ ...getDefaults(),
99
+ ...expanded
100
+ };
101
+ // Validate
102
+ validateConfig(config);
103
+ return config;
104
+ }
105
+ /**
106
+ * Load configuration from OpenClaw API
107
+ */
108
+ function loadConfigFromOpenClaw(api) {
109
+ const pluginConfig = api.config?.plugins?.entries?.cascade?.config;
110
+ if (!pluginConfig) {
111
+ throw new Error('Cascade plugin configuration not found. ' +
112
+ 'Please add cascade configuration to your OpenClaw config.');
113
+ }
114
+ return loadConfig(pluginConfig);
115
+ }
116
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * OpenClaw Plugin Entry Point
3
+ *
4
+ * This is the main entry point for the @cascade/openclaw-plugin
5
+ * It initializes the plugin and registers all tools with OpenClaw
6
+ */
7
+ import { PythonManager } from './python-manager';
8
+ import { CascadeMcpClient } from './cascade-client';
9
+ import { CascadeA2AClient } from './a2a-client';
10
+ import { loadConfig } from './config';
11
+ interface OpenClawApi {
12
+ config: {
13
+ plugins: {
14
+ entries: {
15
+ cascade?: {
16
+ config?: any;
17
+ };
18
+ };
19
+ };
20
+ };
21
+ registerTool: (tool: any) => void;
22
+ registerGatewayMethod: (name: string, handler: Function) => void;
23
+ registerCli: (handler: Function) => void;
24
+ notify: (message: string) => void;
25
+ }
26
+ export default function register(api: OpenClawApi): Promise<void>;
27
+ export * from './types';
28
+ export { PythonManager, CascadeMcpClient, CascadeA2AClient, loadConfig };
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAYtC,UAAU,WAAW;IACnB,MAAM,EAAE;QACN,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,OAAO,CAAC,EAAE;oBACR,MAAM,CAAC,EAAE,GAAG,CAAC;iBACd,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IACjE,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAA8B,QAAQ,CAAC,GAAG,EAAE,WAAW,iBAwHtD;AAGD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * OpenClaw Plugin Entry Point
4
+ *
5
+ * This is the main entry point for the @cascade/openclaw-plugin
6
+ * It initializes the plugin and registers all tools with OpenClaw
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.loadConfig = exports.CascadeA2AClient = exports.CascadeMcpClient = exports.PythonManager = void 0;
24
+ exports.default = register;
25
+ const python_manager_1 = require("./python-manager");
26
+ Object.defineProperty(exports, "PythonManager", { enumerable: true, get: function () { return python_manager_1.PythonManager; } });
27
+ const cascade_client_1 = require("./cascade-client");
28
+ Object.defineProperty(exports, "CascadeMcpClient", { enumerable: true, get: function () { return cascade_client_1.CascadeMcpClient; } });
29
+ const a2a_client_1 = require("./a2a-client");
30
+ Object.defineProperty(exports, "CascadeA2AClient", { enumerable: true, get: function () { return a2a_client_1.CascadeA2AClient; } });
31
+ const config_1 = require("./config");
32
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
33
+ const types_1 = require("./types");
34
+ const tools_1 = require("./tools");
35
+ const tool_registry_1 = require("./tools/tool-registry");
36
+ async function register(api) {
37
+ let mcpClient = null;
38
+ let a2aClient = null;
39
+ try {
40
+ // Load and validate configuration
41
+ const config = (0, config_1.loadConfig)(api.config.plugins.entries.cascade?.config || {});
42
+ console.log('Initializing Cascade plugin...');
43
+ console.log(`gRPC Endpoint: ${config.cascadeGrpcEndpoint}`);
44
+ // Initialize Python Manager
45
+ const pythonManager = new python_manager_1.PythonManager(config);
46
+ const pythonPath = await pythonManager.findOrInstallPython();
47
+ console.log(`Python: ${pythonPath}`);
48
+ // Initialize MCP Client
49
+ mcpClient = new cascade_client_1.CascadeMcpClient(pythonPath, {
50
+ CASCADE_GRPC_ENDPOINT: config.cascadeGrpcEndpoint,
51
+ CASCADE_APP_ID: config.firestoreProjectId || 'openclaw',
52
+ CASCADE_USER_ID: 'openclaw-user',
53
+ ...(config.firestoreCredentialsPath && {
54
+ GOOGLE_APPLICATION_CREDENTIALS: config.firestoreCredentialsPath
55
+ })
56
+ });
57
+ await mcpClient.start();
58
+ console.log('Cascade MCP client connected');
59
+ // Initialize A2A Client if enabled
60
+ if (config.enableA2A) {
61
+ a2aClient = new a2a_client_1.CascadeA2AClient(config.cascadeGrpcEndpoint, 'openclaw-user', config.firestoreProjectId || 'openclaw', '' // auth token would come from config
62
+ );
63
+ await a2aClient.initialize();
64
+ console.log('Cascade A2A client initialized');
65
+ }
66
+ // Create tool registry
67
+ const toolRegistry = new tool_registry_1.ToolRegistry();
68
+ // Register all tools
69
+ console.log('Registering tools...');
70
+ (0, tools_1.registerDesktopTools)(toolRegistry, mcpClient, config);
71
+ (0, tools_1.registerWebTools)(toolRegistry, mcpClient);
72
+ (0, tools_1.registerApiTools)(toolRegistry, mcpClient);
73
+ (0, tools_1.registerSandboxTools)(toolRegistry, mcpClient);
74
+ if (a2aClient) {
75
+ (0, tools_1.registerA2ATools)(toolRegistry, a2aClient);
76
+ }
77
+ // Register tools with OpenClaw
78
+ const tools = toolRegistry.getAll();
79
+ console.log(`Registering ${tools.length} tools with OpenClaw`);
80
+ for (const tool of tools) {
81
+ api.registerTool({
82
+ name: tool.name,
83
+ description: tool.description,
84
+ inputSchema: tool.inputSchema,
85
+ handler: tool.handler
86
+ });
87
+ }
88
+ // Register status check
89
+ api.registerGatewayMethod('cascade.status', () => ({
90
+ connected: mcpClient?.isConnected() || false,
91
+ toolsRegistered: tools.length,
92
+ pythonPath,
93
+ grpcEndpoint: config.cascadeGrpcEndpoint,
94
+ a2aEnabled: config.enableA2A
95
+ }));
96
+ // Register CLI command
97
+ api.registerCli(({ program }) => {
98
+ program
99
+ .command('cascade:status')
100
+ .description('Check Cascade plugin status')
101
+ .action(() => {
102
+ console.log('Cascade Plugin Status:');
103
+ console.log(' Connected:', mcpClient?.isConnected() || false);
104
+ console.log(' Tools:', tools.length);
105
+ console.log(' Python:', pythonPath);
106
+ console.log(' gRPC:', config.cascadeGrpcEndpoint);
107
+ console.log(' A2A:', config.enableA2A ? 'enabled' : 'disabled');
108
+ });
109
+ program
110
+ .command('cascade:tools')
111
+ .description('List all registered tools')
112
+ .action(() => {
113
+ console.log('Registered Tools:');
114
+ tools.forEach((tool, index) => {
115
+ console.log(` ${index + 1}. ${tool.name}`);
116
+ });
117
+ });
118
+ });
119
+ console.log(`Cascade plugin initialized successfully with ${tools.length} tools`);
120
+ }
121
+ catch (error) {
122
+ console.error('Failed to initialize Cascade plugin:', error);
123
+ // Cleanup on error
124
+ if (mcpClient) {
125
+ mcpClient.stop();
126
+ }
127
+ if (error instanceof types_1.CascadeError) {
128
+ throw error;
129
+ }
130
+ throw new Error(`Cascade plugin initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
131
+ }
132
+ }
133
+ // Export types for TypeScript users
134
+ __exportStar(require("./types"), exports);
135
+ // Note: ToolRegistry is internal use only - not exported to avoid conflicts
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Python Manager - Handles Python environment detection and installation
3
+ */
4
+ import { CascadePluginConfig } from './types';
5
+ export declare class PythonManager {
6
+ private config;
7
+ private readonly MIN_PYTHON_VERSION;
8
+ constructor(config: CascadePluginConfig);
9
+ /**
10
+ * Find or install Python for Cascade
11
+ * Priority: 1) Configured path 2) Auto-detect 3) Auto-install
12
+ */
13
+ findOrInstallPython(): Promise<string>;
14
+ /**
15
+ * Auto-detect Python in common locations
16
+ */
17
+ private autoDetectPython;
18
+ /**
19
+ * Get list of Python commands to try
20
+ */
21
+ private getPythonCandidates;
22
+ /**
23
+ * Check if Python command is valid and meets version requirements
24
+ */
25
+ isValidPython(cmd: string): Promise<boolean>;
26
+ /**
27
+ * Parse Python version from version string
28
+ */
29
+ parsePythonVersion(versionOutput: string): number;
30
+ /**
31
+ * Execute command and return stdout
32
+ */
33
+ private execAsync;
34
+ /**
35
+ * Auto-install Python based on platform
36
+ */
37
+ private installPython;
38
+ /**
39
+ * Install Python on Windows
40
+ */
41
+ private installPythonWindows;
42
+ /**
43
+ * Download Python installer for Windows
44
+ */
45
+ private downloadPythonInstaller;
46
+ /**
47
+ * Run Python installer on Windows
48
+ */
49
+ private runPythonInstaller;
50
+ /**
51
+ * Install Python on macOS using Homebrew
52
+ */
53
+ private installPythonMacOS;
54
+ /**
55
+ * Install Python on Linux using apt
56
+ */
57
+ private installPythonLinux;
58
+ }
59
+ //# sourceMappingURL=python-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-manager.d.ts","sourceRoot":"","sources":["../src/python-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,qBAAa,aAAa;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;gBAEvB,MAAM,EAAE,mBAAmB;IAE/C;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAoB5C;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4C3B;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlD;;OAEG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IASjD;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;OAEG;YACW,aAAa;IAU3B;;OAEG;YACW,oBAAoB;IAalC;;OAEG;YACW,uBAAuB;IAMrC;;OAEG;YACW,kBAAkB;IAIhC;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;YACW,kBAAkB;CAmBjC"}