openclaw-cascade-plugin 1.0.1 → 1.0.3
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/README.md +16 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/openclaw.plugin.json +9 -1
- package/package.json +3 -2
- package/scripts/postinstall.js +84 -0
- package/src/config.ts +3 -2
- package/src/index.ts +22 -6
- package/src/tools/desktop-automation.test.ts +4 -1
- package/src/types/index.ts +1 -0
package/README.md
CHANGED
|
@@ -12,7 +12,22 @@ openclaw plugins install openclaw-cascade-plugin
|
|
|
12
12
|
|
|
13
13
|
## Configuration
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
The installer auto-creates the plugin entry in `~/.openclaw/openclaw.json`. If you want to edit manually, the entry key must match the manifest id (`openclaw-cascade-plugin`).
|
|
16
|
+
|
|
17
|
+
If `mcp_server` is not found, set `cascadePythonModulePath` to your Cascade repo's `python/` directory.
|
|
18
|
+
|
|
19
|
+
If you previously installed `cascade` (v1.0.0), uninstall it and reinstall v1.0.3:
|
|
20
|
+
```bash
|
|
21
|
+
openclaw plugins uninstall cascade
|
|
22
|
+
openclaw plugins install openclaw-cascade-plugin@1.0.3
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
For one-command install (auto-config):
|
|
26
|
+
```bash
|
|
27
|
+
export CASCADE_REPO_PATH=/path/to/cascade
|
|
28
|
+
openclaw plugins install openclaw-cascade-plugin@1.0.3
|
|
29
|
+
```
|
|
30
|
+
|
|
16
31
|
|
|
17
32
|
```json5
|
|
18
33
|
{
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,CAYpE"}
|
package/dist/config.js
CHANGED
|
@@ -106,10 +106,11 @@ function loadConfig(input) {
|
|
|
106
106
|
* Load configuration from OpenClaw API
|
|
107
107
|
*/
|
|
108
108
|
function loadConfigFromOpenClaw(api) {
|
|
109
|
-
const
|
|
109
|
+
const entries = api.config?.plugins?.entries || {};
|
|
110
|
+
const pluginConfig = entries['openclaw-cascade-plugin']?.config || entries.cascade?.config;
|
|
110
111
|
if (!pluginConfig) {
|
|
111
112
|
throw new Error('Cascade plugin configuration not found. ' +
|
|
112
|
-
'Please add cascade configuration to your OpenClaw config.');
|
|
113
|
+
'Please add openclaw-cascade-plugin configuration to your OpenClaw config.');
|
|
113
114
|
}
|
|
114
115
|
return loadConfig(pluginConfig);
|
|
115
116
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAUH,kCASC;AAKD,wCAoCC;AAMD,sCAkBC;AAKD,gCA2BC;AAKD,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAatC,UAAU,WAAW;IACnB,MAAM,EAAE;QACN,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,OAAO,CAAC,EAAE;oBAAE,MAAM,CAAC,EAAE,GAAG,CAAA;iBAAE,CAAC;gBAC3B,yBAAyB,CAAC,EAAE;oBAAE,MAAM,CAAC,EAAE,GAAG,CAAA;iBAAE,CAAC;gBAC7C,CAAC,GAAG,EAAE,MAAM,GAAG;oBAAE,MAAM,CAAC,EAAE,GAAG,CAAA;iBAAE,GAAG,SAAS,CAAC;aAC7C,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,iBAuItD;AAGD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,7 @@ Object.defineProperty(exports, "CascadeA2AClient", { enumerable: true, get: func
|
|
|
31
31
|
const config_1 = require("./config");
|
|
32
32
|
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
33
33
|
const types_1 = require("./types");
|
|
34
|
+
const path_1 = require("path");
|
|
34
35
|
const tools_1 = require("./tools");
|
|
35
36
|
const tool_registry_1 = require("./tools/tool-registry");
|
|
36
37
|
async function register(api) {
|
|
@@ -38,7 +39,10 @@ async function register(api) {
|
|
|
38
39
|
let a2aClient = null;
|
|
39
40
|
try {
|
|
40
41
|
// Load and validate configuration
|
|
41
|
-
const
|
|
42
|
+
const entries = api.config.plugins.entries || {};
|
|
43
|
+
const config = (0, config_1.loadConfig)(entries['openclaw-cascade-plugin']?.config ||
|
|
44
|
+
entries.cascade?.config ||
|
|
45
|
+
{});
|
|
42
46
|
console.log('Initializing Cascade plugin...');
|
|
43
47
|
console.log(`gRPC Endpoint: ${config.cascadeGrpcEndpoint}`);
|
|
44
48
|
// Initialize Python Manager
|
|
@@ -46,14 +50,22 @@ async function register(api) {
|
|
|
46
50
|
const pythonPath = await pythonManager.findOrInstallPython();
|
|
47
51
|
console.log(`Python: ${pythonPath}`);
|
|
48
52
|
// Initialize MCP Client
|
|
49
|
-
|
|
53
|
+
const pythonEnv = {
|
|
50
54
|
CASCADE_GRPC_ENDPOINT: config.cascadeGrpcEndpoint,
|
|
51
55
|
CASCADE_APP_ID: config.firestoreProjectId || 'openclaw',
|
|
52
56
|
CASCADE_USER_ID: 'openclaw-user',
|
|
53
57
|
...(config.firestoreCredentialsPath && {
|
|
54
58
|
GOOGLE_APPLICATION_CREDENTIALS: config.firestoreCredentialsPath
|
|
55
59
|
})
|
|
56
|
-
}
|
|
60
|
+
};
|
|
61
|
+
const modulePath = config.cascadePythonModulePath || process.env.CASCADE_PYTHON_MODULE_PATH;
|
|
62
|
+
if (modulePath) {
|
|
63
|
+
const existingPath = process.env.PYTHONPATH || '';
|
|
64
|
+
pythonEnv.PYTHONPATH = existingPath
|
|
65
|
+
? `${modulePath}${path_1.delimiter}${existingPath}`
|
|
66
|
+
: modulePath;
|
|
67
|
+
}
|
|
68
|
+
mcpClient = new cascade_client_1.CascadeMcpClient(pythonPath, pythonEnv);
|
|
57
69
|
await mcpClient.start();
|
|
58
70
|
console.log('Cascade MCP client connected');
|
|
59
71
|
// Initialize A2A Client if enabled
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAkCH,2BAuIC;AAvKD,qDAAiD;AA2KxC,8FA3KA,8BAAa,OA2KA;AA1KtB,qDAAoD;AA0K5B,iGA1Kf,iCAAgB,OA0Ke;AAzKxC,6CAAgD;AAyKN,iGAzKjC,6BAAgB,OAyKiC;AAxK1D,qCAAsC;AAwKsB,2FAxKnD,mBAAU,OAwKmD;AAvKtE,mCAAuC;AACvC,+BAAkD;AAClD,mCAMiB;AACjB,yDAAqD;AAmBtC,KAAK,UAAU,QAAQ,CAAC,GAAgB;IACrD,IAAI,SAAS,GAA4B,IAAI,CAAC;IAC9C,IAAI,SAAS,GAA4B,IAAI,CAAC;IAE9C,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAA,mBAAU,EACvB,OAAO,CAAC,yBAAyB,CAAC,EAAE,MAAM;YAC1C,OAAO,CAAC,OAAO,EAAE,MAAM;YACvB,EAAE,CACH,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAE5D,4BAA4B;QAC5B,MAAM,aAAa,GAAG,IAAI,8BAAa,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QAErC,wBAAwB;QACxB,MAAM,SAAS,GAAsB;YACnC,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;YACjD,cAAc,EAAE,MAAM,CAAC,kBAAkB,IAAI,UAAU;YACvD,eAAe,EAAE,eAAe;YAChC,GAAG,CAAC,MAAM,CAAC,wBAAwB,IAAI;gBACrC,8BAA8B,EAAE,MAAM,CAAC,wBAAwB;aAChE,CAAC;SACH,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAC5F,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;YAClD,SAAS,CAAC,UAAU,GAAG,YAAY;gBACjC,CAAC,CAAC,GAAG,UAAU,GAAG,gBAAa,GAAG,YAAY,EAAE;gBAChD,CAAC,CAAC,UAAU,CAAC;QACjB,CAAC;QAED,SAAS,GAAG,IAAI,iCAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAExD,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAE5C,mCAAmC;QACnC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,SAAS,GAAG,IAAI,6BAAgB,CAC9B,MAAM,CAAC,mBAAmB,EAC1B,eAAe,EACf,MAAM,CAAC,kBAAkB,IAAI,UAAU,EACvC,EAAE,CAAC,oCAAoC;aACxC,CAAC;YACF,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAChD,CAAC;QAED,uBAAuB;QACvB,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;QAExC,qBAAqB;QACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,IAAA,4BAAoB,EAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACtD,IAAA,wBAAgB,EAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAA,wBAAgB,EAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAA,4BAAoB,EAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE9C,IAAI,SAAS,EAAE,CAAC;YACd,IAAA,wBAAgB,EAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,+BAA+B;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,sBAAsB,CAAC,CAAC;QAE/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,YAAY,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,GAAG,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,KAAK;YAC5C,eAAe,EAAE,KAAK,CAAC,MAAM;YAC7B,UAAU;YACV,YAAY,EAAE,MAAM,CAAC,mBAAmB;YACxC,UAAU,EAAE,MAAM,CAAC,SAAS;SAC7B,CAAC,CAAC,CAAC;QAEJ,uBAAuB;QACvB,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,EAAoB,EAAE,EAAE;YAChD,OAAO;iBACJ,OAAO,CAAC,gBAAgB,CAAC;iBACzB,WAAW,CAAC,6BAA6B,CAAC;iBAC1C,MAAM,CAAC,GAAG,EAAE;gBACX,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEL,OAAO;iBACJ,OAAO,CAAC,eAAe,CAAC;iBACxB,WAAW,CAAC,2BAA2B,CAAC;iBACxC,MAAM,CAAC,GAAG,EAAE;gBACX,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gDAAgD,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;IAEpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAE7D,mBAAmB;QACnB,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,KAAK,YAAY,oBAAY,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,KAAK,CACb,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACpG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,0CAAwB;AAExB,4EAA4E"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAmGH,cAAc;AACd,MAAa,YAAa,SAAQ,KAAK;IACrC,YACE,OAAe,EACR,IAAY,EACZ,UAAmB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAS;QAG1B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AATD,oCASC;AAED,MAAa,gBAAiB,SAAQ,YAAY;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AALD,4CAKC;AAED,MAAa,oBAAqB,SAAQ,YAAY;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "openclaw-cascade-plugin",
|
|
3
3
|
"name": "Cascade Desktop Automation",
|
|
4
4
|
"description": "Control Windows desktop apps and web browsers through OpenClaw. Provides desktop automation, web automation with Playwright, and skill learning capabilities.",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.3",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"additionalProperties": false,
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
"type": "string",
|
|
18
18
|
"description": "Path to Python executable (optional, auto-detected if not set)"
|
|
19
19
|
},
|
|
20
|
+
"cascadePythonModulePath": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Path to Cascade Python modules (e.g., /path/to/cascade/python)"
|
|
23
|
+
},
|
|
20
24
|
"firestoreProjectId": {
|
|
21
25
|
"type": "string",
|
|
22
26
|
"description": "Firebase project ID for skill storage (optional)"
|
|
@@ -80,6 +84,10 @@
|
|
|
80
84
|
"label": "Python Path",
|
|
81
85
|
"placeholder": "/usr/bin/python3 (auto-detected)"
|
|
82
86
|
},
|
|
87
|
+
"cascadePythonModulePath": {
|
|
88
|
+
"label": "Python Module Path",
|
|
89
|
+
"placeholder": "/path/to/cascade/python"
|
|
90
|
+
},
|
|
83
91
|
"firestoreProjectId": {
|
|
84
92
|
"label": "Firestore Project ID"
|
|
85
93
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openclaw-cascade-plugin",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Desktop automation plugin for OpenClaw powered by Cascade",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"test:coverage": "jest --coverage",
|
|
13
13
|
"lint": "eslint src/**/*.ts",
|
|
14
14
|
"lint:fix": "eslint src/**/*.ts --fix",
|
|
15
|
-
"clean": "rm -rf dist coverage"
|
|
15
|
+
"clean": "rm -rf dist coverage",
|
|
16
|
+
"postinstall": "node scripts/postinstall.js"
|
|
16
17
|
},
|
|
17
18
|
"openclaw": {
|
|
18
19
|
"extensions": [
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const os = require('os');
|
|
4
|
+
|
|
5
|
+
const PLUGIN_ID = 'openclaw-cascade-plugin';
|
|
6
|
+
const DEFAULT_ENDPOINT = 'localhost:50051';
|
|
7
|
+
const defaultConfigPath = path.join(os.homedir(), '.openclaw', 'openclaw.json');
|
|
8
|
+
const legacyConfigPath = path.join(os.homedir(), '.openclaw', 'config.json');
|
|
9
|
+
const configPath = process.env.OPENCLAW_CONFIG_PATH ||
|
|
10
|
+
(fs.existsSync(defaultConfigPath) ? defaultConfigPath : legacyConfigPath);
|
|
11
|
+
|
|
12
|
+
function readConfig(filePath) {
|
|
13
|
+
if (!fs.existsSync(filePath)) {
|
|
14
|
+
return { plugins: { entries: {} } };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(content);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.warn('[cascade] Could not parse OpenClaw config; skipping auto-update:', error.message);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function writeConfig(filePath, config) {
|
|
27
|
+
const dir = path.dirname(filePath);
|
|
28
|
+
if (!fs.existsSync(dir)) {
|
|
29
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fs.writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function ensurePluginEntry(config) {
|
|
36
|
+
config.plugins = config.plugins || {};
|
|
37
|
+
config.plugins.entries = config.plugins.entries || {};
|
|
38
|
+
|
|
39
|
+
// Migrate legacy entry if present
|
|
40
|
+
if (config.plugins.entries.cascade && !config.plugins.entries[PLUGIN_ID]) {
|
|
41
|
+
config.plugins.entries[PLUGIN_ID] = config.plugins.entries.cascade;
|
|
42
|
+
delete config.plugins.entries.cascade;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const entry = config.plugins.entries[PLUGIN_ID] || {};
|
|
46
|
+
const existingConfig = entry.config || {};
|
|
47
|
+
|
|
48
|
+
const cascadeRepoPath = process.env.CASCADE_REPO_PATH;
|
|
49
|
+
const cascadePythonModulePath = process.env.CASCADE_PYTHON_MODULE_PATH ||
|
|
50
|
+
(cascadeRepoPath ? path.join(cascadeRepoPath, 'python') : undefined);
|
|
51
|
+
|
|
52
|
+
config.plugins.entries[PLUGIN_ID] = {
|
|
53
|
+
enabled: entry.enabled !== false,
|
|
54
|
+
config: {
|
|
55
|
+
cascadeGrpcEndpoint: existingConfig.cascadeGrpcEndpoint || DEFAULT_ENDPOINT,
|
|
56
|
+
cascadePythonModulePath: existingConfig.cascadePythonModulePath || cascadePythonModulePath,
|
|
57
|
+
cascadePythonPath: existingConfig.cascadePythonPath,
|
|
58
|
+
firestoreProjectId: existingConfig.firestoreProjectId,
|
|
59
|
+
firestoreCredentialsPath: existingConfig.firestoreCredentialsPath,
|
|
60
|
+
headless: existingConfig.headless,
|
|
61
|
+
actionTimeoutMs: existingConfig.actionTimeoutMs,
|
|
62
|
+
enableA2A: existingConfig.enableA2A,
|
|
63
|
+
allowedAgents: existingConfig.allowedAgents,
|
|
64
|
+
requireAgentConfirmation: existingConfig.requireAgentConfirmation,
|
|
65
|
+
verbose: existingConfig.verbose,
|
|
66
|
+
screenshotMode: existingConfig.screenshotMode,
|
|
67
|
+
screenshotDir: existingConfig.screenshotDir
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const config = readConfig(configPath);
|
|
73
|
+
if (!config) {
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
ensurePluginEntry(config);
|
|
78
|
+
writeConfig(configPath, config);
|
|
79
|
+
|
|
80
|
+
console.log(`[cascade] OpenClaw config updated: ${configPath}`);
|
|
81
|
+
console.log('[cascade] Plugin entry ensured under plugins.entries.openclaw-cascade-plugin');
|
|
82
|
+
if (!process.env.CASCADE_REPO_PATH && !process.env.CASCADE_PYTHON_MODULE_PATH) {
|
|
83
|
+
console.log('[cascade] Tip: set CASCADE_REPO_PATH to your repo to auto-configure PYTHONPATH.');
|
|
84
|
+
}
|
package/src/config.ts
CHANGED
|
@@ -122,12 +122,13 @@ export function loadConfig(input: Partial<CascadePluginConfig>): CascadePluginCo
|
|
|
122
122
|
* Load configuration from OpenClaw API
|
|
123
123
|
*/
|
|
124
124
|
export function loadConfigFromOpenClaw(api: any): CascadePluginConfig {
|
|
125
|
-
const
|
|
125
|
+
const entries = api.config?.plugins?.entries || {};
|
|
126
|
+
const pluginConfig = entries['openclaw-cascade-plugin']?.config || entries.cascade?.config;
|
|
126
127
|
|
|
127
128
|
if (!pluginConfig) {
|
|
128
129
|
throw new Error(
|
|
129
130
|
'Cascade plugin configuration not found. ' +
|
|
130
|
-
'Please add cascade configuration to your OpenClaw config.'
|
|
131
|
+
'Please add openclaw-cascade-plugin configuration to your OpenClaw config.'
|
|
131
132
|
);
|
|
132
133
|
}
|
|
133
134
|
|
package/src/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { CascadeMcpClient } from './cascade-client';
|
|
|
10
10
|
import { CascadeA2AClient } from './a2a-client';
|
|
11
11
|
import { loadConfig } from './config';
|
|
12
12
|
import { CascadeError } from './types';
|
|
13
|
+
import { delimiter as pathDelimiter } from 'path';
|
|
13
14
|
import {
|
|
14
15
|
registerDesktopTools,
|
|
15
16
|
registerWebTools,
|
|
@@ -24,9 +25,9 @@ interface OpenClawApi {
|
|
|
24
25
|
config: {
|
|
25
26
|
plugins: {
|
|
26
27
|
entries: {
|
|
27
|
-
cascade?: {
|
|
28
|
-
|
|
29
|
-
};
|
|
28
|
+
cascade?: { config?: any };
|
|
29
|
+
'openclaw-cascade-plugin'?: { config?: any };
|
|
30
|
+
[key: string]: { config?: any } | undefined;
|
|
30
31
|
};
|
|
31
32
|
};
|
|
32
33
|
};
|
|
@@ -42,7 +43,12 @@ export default async function register(api: OpenClawApi) {
|
|
|
42
43
|
|
|
43
44
|
try {
|
|
44
45
|
// Load and validate configuration
|
|
45
|
-
const
|
|
46
|
+
const entries = api.config.plugins.entries || {};
|
|
47
|
+
const config = loadConfig(
|
|
48
|
+
entries['openclaw-cascade-plugin']?.config ||
|
|
49
|
+
entries.cascade?.config ||
|
|
50
|
+
{}
|
|
51
|
+
);
|
|
46
52
|
|
|
47
53
|
console.log('Initializing Cascade plugin...');
|
|
48
54
|
console.log(`gRPC Endpoint: ${config.cascadeGrpcEndpoint}`);
|
|
@@ -53,14 +59,24 @@ export default async function register(api: OpenClawApi) {
|
|
|
53
59
|
console.log(`Python: ${pythonPath}`);
|
|
54
60
|
|
|
55
61
|
// Initialize MCP Client
|
|
56
|
-
|
|
62
|
+
const pythonEnv: NodeJS.ProcessEnv = {
|
|
57
63
|
CASCADE_GRPC_ENDPOINT: config.cascadeGrpcEndpoint,
|
|
58
64
|
CASCADE_APP_ID: config.firestoreProjectId || 'openclaw',
|
|
59
65
|
CASCADE_USER_ID: 'openclaw-user',
|
|
60
66
|
...(config.firestoreCredentialsPath && {
|
|
61
67
|
GOOGLE_APPLICATION_CREDENTIALS: config.firestoreCredentialsPath
|
|
62
68
|
})
|
|
63
|
-
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const modulePath = config.cascadePythonModulePath || process.env.CASCADE_PYTHON_MODULE_PATH;
|
|
72
|
+
if (modulePath) {
|
|
73
|
+
const existingPath = process.env.PYTHONPATH || '';
|
|
74
|
+
pythonEnv.PYTHONPATH = existingPath
|
|
75
|
+
? `${modulePath}${pathDelimiter}${existingPath}`
|
|
76
|
+
: modulePath;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
mcpClient = new CascadeMcpClient(pythonPath, pythonEnv);
|
|
64
80
|
|
|
65
81
|
await mcpClient.start();
|
|
66
82
|
console.log('Cascade MCP client connected');
|
|
@@ -173,6 +173,9 @@ describe('Desktop Automation Tools', () => {
|
|
|
173
173
|
test('should save large screenshot to disk', async () => {
|
|
174
174
|
// Arrange
|
|
175
175
|
const largeImage = 'A'.repeat(5000000); // 5MB base64 = ~3.75MB actual
|
|
176
|
+
const diskRegistry = new ToolRegistry();
|
|
177
|
+
registerDesktopTools(diskRegistry, mockClient as any, { screenshotMode: 'disk' } as any);
|
|
178
|
+
|
|
176
179
|
mockClient.registerMockTool('get_screenshot', () => ({
|
|
177
180
|
image: largeImage,
|
|
178
181
|
format: 'PNG',
|
|
@@ -180,7 +183,7 @@ describe('Desktop Automation Tools', () => {
|
|
|
180
183
|
}));
|
|
181
184
|
|
|
182
185
|
// Act
|
|
183
|
-
const result = await
|
|
186
|
+
const result = await diskRegistry.call('cascade_get_screenshot', {});
|
|
184
187
|
|
|
185
188
|
// Assert
|
|
186
189
|
expect(result.content[0].type).toBe('text');
|