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.
- package/PHASE1_SUMMARY.md +191 -0
- package/PHASE3_SUMMARY.md +195 -0
- package/README.md +43 -0
- package/dist/a2a-client.d.ts +17 -0
- package/dist/a2a-client.d.ts.map +1 -0
- package/dist/a2a-client.js +47 -0
- package/dist/a2a-client.js.map +1 -0
- package/dist/cascade-client.d.ts +53 -0
- package/dist/cascade-client.d.ts.map +1 -0
- package/dist/cascade-client.js +179 -0
- package/dist/cascade-client.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +116 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +136 -0
- package/dist/index.js.map +1 -0
- package/dist/python-manager.d.ts +59 -0
- package/dist/python-manager.d.ts.map +1 -0
- package/dist/python-manager.js +190 -0
- package/dist/python-manager.js.map +1 -0
- package/dist/test-utils/helpers.d.ts +20 -0
- package/dist/test-utils/helpers.d.ts.map +1 -0
- package/dist/test-utils/helpers.js +89 -0
- package/dist/test-utils/helpers.js.map +1 -0
- package/dist/test-utils/index.d.ts +3 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +19 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/mocks.d.ts +51 -0
- package/dist/test-utils/mocks.d.ts.map +1 -0
- package/dist/test-utils/mocks.js +84 -0
- package/dist/test-utils/mocks.js.map +1 -0
- package/dist/tools/a2a-tools.d.ts +9 -0
- package/dist/tools/a2a-tools.d.ts.map +1 -0
- package/dist/tools/a2a-tools.js +147 -0
- package/dist/tools/a2a-tools.js.map +1 -0
- package/dist/tools/api-tools.d.ts +9 -0
- package/dist/tools/api-tools.d.ts.map +1 -0
- package/dist/tools/api-tools.js +102 -0
- package/dist/tools/api-tools.js.map +1 -0
- package/dist/tools/desktop-automation.d.ts +10 -0
- package/dist/tools/desktop-automation.d.ts.map +1 -0
- package/dist/tools/desktop-automation.js +330 -0
- package/dist/tools/desktop-automation.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +35 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/response-helpers.d.ts +25 -0
- package/dist/tools/response-helpers.d.ts.map +1 -0
- package/dist/tools/response-helpers.js +71 -0
- package/dist/tools/response-helpers.js.map +1 -0
- package/dist/tools/sandbox-tools.d.ts +9 -0
- package/dist/tools/sandbox-tools.d.ts.map +1 -0
- package/dist/tools/sandbox-tools.js +79 -0
- package/dist/tools/sandbox-tools.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +34 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +50 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/web-automation.d.ts +9 -0
- package/dist/tools/web-automation.d.ts.map +1 -0
- package/dist/tools/web-automation.js +471 -0
- package/dist/tools/web-automation.js.map +1 -0
- package/dist/types/index.d.ts +111 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +38 -0
- package/dist/types/index.js.map +1 -0
- package/jest.setup.js +19 -0
- package/openclaw-cascade-plugin-1.0.0.tgz +0 -0
- package/openclaw.plugin.json +116 -0
- package/package.json +74 -0
- package/src/a2a-client.ts +66 -0
- package/src/cascade-client.test.ts +400 -0
- package/src/cascade-client.ts +198 -0
- package/src/config.test.ts +194 -0
- package/src/config.ts +135 -0
- package/src/index.ts +164 -0
- package/src/python-manager.test.ts +187 -0
- package/src/python-manager.ts +230 -0
- package/src/test-utils/helpers.ts +107 -0
- package/src/test-utils/index.ts +2 -0
- package/src/test-utils/mocks.ts +101 -0
- package/src/tools/a2a-tools.ts +162 -0
- package/src/tools/api-tools.ts +110 -0
- package/src/tools/desktop-automation.test.ts +305 -0
- package/src/tools/desktop-automation.ts +366 -0
- package/src/tools/index.ts +13 -0
- package/src/tools/response-helpers.ts +78 -0
- package/src/tools/sandbox-tools.ts +83 -0
- package/src/tools/tool-registry.ts +51 -0
- package/src/tools/web-automation.test.ts +177 -0
- package/src/tools/web-automation.ts +518 -0
- package/src/types/index.ts +132 -0
- 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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|