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,190 @@
1
+ "use strict";
2
+ /**
3
+ * Python Manager - Handles Python environment detection and installation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PythonManager = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const path_1 = require("path");
9
+ class PythonManager {
10
+ constructor(config) {
11
+ this.config = config;
12
+ this.MIN_PYTHON_VERSION = 3.10;
13
+ }
14
+ /**
15
+ * Find or install Python for Cascade
16
+ * Priority: 1) Configured path 2) Auto-detect 3) Auto-install
17
+ */
18
+ async findOrInstallPython() {
19
+ // 1. Check configured path
20
+ if (this.config.cascadePythonPath) {
21
+ if (await this.isValidPython(this.config.cascadePythonPath)) {
22
+ return this.config.cascadePythonPath;
23
+ }
24
+ console.warn(`Configured Python path ${this.config.cascadePythonPath} is not valid, searching...`);
25
+ }
26
+ // 2. Auto-detect in common locations
27
+ const detected = await this.autoDetectPython();
28
+ if (detected) {
29
+ return detected;
30
+ }
31
+ // 3. Auto-install
32
+ console.log('Python not found. Installing...');
33
+ return this.installPython();
34
+ }
35
+ /**
36
+ * Auto-detect Python in common locations
37
+ */
38
+ async autoDetectPython() {
39
+ const candidates = this.getPythonCandidates();
40
+ for (const cmd of candidates) {
41
+ if (await this.isValidPython(cmd)) {
42
+ return cmd;
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * Get list of Python commands to try
49
+ */
50
+ getPythonCandidates() {
51
+ const candidates = [
52
+ 'python3.12',
53
+ 'python3.11',
54
+ 'python3.10',
55
+ 'python3',
56
+ ];
57
+ if (process.platform === 'win32') {
58
+ // Windows-specific paths
59
+ const localAppData = process.env.LOCALAPPDATA || '';
60
+ const programFiles = process.env.ProgramFiles || '';
61
+ candidates.push((0, path_1.join)(localAppData, 'Programs', 'Python', 'Python312', 'python.exe'), (0, path_1.join)(localAppData, 'Programs', 'Python', 'Python311', 'python.exe'), (0, path_1.join)(localAppData, 'Programs', 'Python', 'Python310', 'python.exe'), (0, path_1.join)(programFiles, 'Python312', 'python.exe'), (0, path_1.join)(programFiles, 'Python311', 'python.exe'), (0, path_1.join)(programFiles, 'Python310', 'python.exe'), 'python.exe', 'python');
62
+ }
63
+ else {
64
+ // Unix-like paths
65
+ candidates.push('/usr/bin/python3.12', '/usr/bin/python3.11', '/usr/bin/python3.10', '/usr/bin/python3', '/usr/local/bin/python3.12', '/usr/local/bin/python3.11', '/usr/local/bin/python3.10', '/usr/local/bin/python3', '/opt/homebrew/bin/python3.12', '/opt/homebrew/bin/python3.11', '/opt/homebrew/bin/python3.10', '/opt/homebrew/bin/python3');
66
+ }
67
+ return candidates;
68
+ }
69
+ /**
70
+ * Check if Python command is valid and meets version requirements
71
+ */
72
+ async isValidPython(cmd) {
73
+ try {
74
+ const { stdout } = await this.execAsync(`${cmd} --version`);
75
+ const version = this.parsePythonVersion(stdout);
76
+ return version >= this.MIN_PYTHON_VERSION;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ /**
83
+ * Parse Python version from version string
84
+ */
85
+ parsePythonVersion(versionOutput) {
86
+ const match = versionOutput.match(/Python (\d+)\.(\d+)/);
87
+ if (!match)
88
+ return 0;
89
+ const major = parseInt(match[1], 10);
90
+ const minor = parseInt(match[2], 10);
91
+ return major + minor / 100;
92
+ }
93
+ /**
94
+ * Execute command and return stdout
95
+ */
96
+ execAsync(command) {
97
+ return new Promise((resolve, reject) => {
98
+ (0, child_process_1.exec)(command, (error, stdout, stderr) => {
99
+ if (error) {
100
+ reject(error);
101
+ }
102
+ else {
103
+ resolve({ stdout, stderr });
104
+ }
105
+ });
106
+ });
107
+ }
108
+ /**
109
+ * Auto-install Python based on platform
110
+ */
111
+ async installPython() {
112
+ if (process.platform === 'win32') {
113
+ return this.installPythonWindows();
114
+ }
115
+ else if (process.platform === 'darwin') {
116
+ return this.installPythonMacOS();
117
+ }
118
+ else {
119
+ return this.installPythonLinux();
120
+ }
121
+ }
122
+ /**
123
+ * Install Python on Windows
124
+ */
125
+ async installPythonWindows() {
126
+ try {
127
+ const installerPath = await this.downloadPythonInstaller();
128
+ await this.runPythonInstaller(installerPath);
129
+ return 'python';
130
+ }
131
+ catch (error) {
132
+ throw new Error(`Failed to install Python on Windows: ${error instanceof Error ? error.message : 'Unknown error'}. ` +
133
+ 'Please install Python 3.10+ manually from https://python.org');
134
+ }
135
+ }
136
+ /**
137
+ * Download Python installer for Windows
138
+ */
139
+ async downloadPythonInstaller() {
140
+ // In production, this would download from python.org
141
+ // For now, we assume the user needs to install manually
142
+ throw new Error('Automatic installation not implemented. Please install Python manually.');
143
+ }
144
+ /**
145
+ * Run Python installer on Windows
146
+ */
147
+ async runPythonInstaller(installerPath) {
148
+ await this.execAsync(`"${installerPath}" /quiet InstallAllUsers=0 PrependPath=1`);
149
+ }
150
+ /**
151
+ * Install Python on macOS using Homebrew
152
+ */
153
+ async installPythonMacOS() {
154
+ // Check if brew is available
155
+ try {
156
+ await this.execAsync('which brew');
157
+ }
158
+ catch {
159
+ throw new Error('Homebrew not found. Please install Homebrew first: https://brew.sh');
160
+ }
161
+ try {
162
+ await this.execAsync('brew install python@3.12');
163
+ return '/usr/local/bin/python3.12';
164
+ }
165
+ catch (error) {
166
+ throw new Error(`Failed to install Python via Homebrew: ${error instanceof Error ? error.message : 'Unknown error'}`);
167
+ }
168
+ }
169
+ /**
170
+ * Install Python on Linux using apt
171
+ */
172
+ async installPythonLinux() {
173
+ // Check if apt is available
174
+ try {
175
+ await this.execAsync('which apt');
176
+ }
177
+ catch {
178
+ throw new Error('apt not found. Please install Python 3.10+ manually using your package manager.');
179
+ }
180
+ try {
181
+ await this.execAsync('sudo apt-get update && sudo apt-get install -y python3.12 python3.12-venv');
182
+ return '/usr/bin/python3.12';
183
+ }
184
+ catch (error) {
185
+ throw new Error(`Failed to install Python via apt: ${error instanceof Error ? error.message : 'Unknown error'}`);
186
+ }
187
+ }
188
+ }
189
+ exports.PythonManager = PythonManager;
190
+ //# sourceMappingURL=python-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-manager.js","sourceRoot":"","sources":["../src/python-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Test helper utilities
3
+ */
4
+ export interface TestConfig {
5
+ cascadeGrpcEndpoint: string;
6
+ cascadePythonPath?: string;
7
+ firestoreProjectId?: string;
8
+ firestoreCredentialsPath?: string;
9
+ headless?: boolean;
10
+ actionTimeoutMs?: number;
11
+ enableA2A?: boolean;
12
+ verbose?: boolean;
13
+ }
14
+ export declare function createMockConfig(overrides?: Partial<TestConfig>): TestConfig;
15
+ export declare function withTempDir(fn: (dir: string) => Promise<void>): Promise<void>;
16
+ export declare function waitForCondition(condition: () => boolean, timeout?: number, interval?: number): Promise<void>;
17
+ export declare function generateBase64Image(size: number): string;
18
+ export declare function createMockSpawnImplementation(stdoutData: string | string[], exitCode?: number): () => any;
19
+ export declare function delay(ms: number): Promise<void>;
20
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/test-utils/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,UAAU;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAShF;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CASnF;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,OAAO,EACxB,OAAO,SAAO,EACd,QAAQ,SAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYxD;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAC7B,QAAQ,SAAI,GACX,MAAM,GAAG,CAyBX;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * Test helper utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createMockConfig = createMockConfig;
7
+ exports.withTempDir = withTempDir;
8
+ exports.waitForCondition = waitForCondition;
9
+ exports.generateBase64Image = generateBase64Image;
10
+ exports.createMockSpawnImplementation = createMockSpawnImplementation;
11
+ exports.delay = delay;
12
+ const path_1 = require("path");
13
+ const promises_1 = require("fs/promises");
14
+ function createMockConfig(overrides = {}) {
15
+ return {
16
+ cascadeGrpcEndpoint: 'localhost:50051',
17
+ headless: false,
18
+ actionTimeoutMs: 8000,
19
+ enableA2A: true,
20
+ verbose: false,
21
+ ...overrides
22
+ };
23
+ }
24
+ async function withTempDir(fn) {
25
+ const tmpDir = (0, path_1.join)(process.cwd(), '.test-tmp', Date.now().toString());
26
+ await (0, promises_1.mkdir)(tmpDir, { recursive: true });
27
+ try {
28
+ await fn(tmpDir);
29
+ }
30
+ finally {
31
+ await (0, promises_1.rm)(tmpDir, { recursive: true, force: true });
32
+ }
33
+ }
34
+ function waitForCondition(condition, timeout = 5000, interval = 100) {
35
+ return new Promise((resolve, reject) => {
36
+ const start = Date.now();
37
+ const check = () => {
38
+ if (condition()) {
39
+ resolve();
40
+ }
41
+ else if (Date.now() - start > timeout) {
42
+ reject(new Error(`Timeout waiting for condition after ${timeout}ms`));
43
+ }
44
+ else {
45
+ setTimeout(check, interval);
46
+ }
47
+ };
48
+ check();
49
+ });
50
+ }
51
+ function generateBase64Image(size) {
52
+ // Generate fake base64 image data
53
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
54
+ let result = '';
55
+ for (let i = 0; i < size; i++) {
56
+ result += chars[Math.floor(Math.random() * chars.length)];
57
+ }
58
+ // Pad to multiple of 4 for valid base64
59
+ while (result.length % 4 !== 0) {
60
+ result += '=';
61
+ }
62
+ return result;
63
+ }
64
+ function createMockSpawnImplementation(stdoutData, exitCode = 0) {
65
+ return () => {
66
+ const { EventEmitter } = require('events');
67
+ const stdout = new EventEmitter();
68
+ const stderr = new EventEmitter();
69
+ const proc = Object.assign(new EventEmitter(), {
70
+ stdout,
71
+ stderr,
72
+ stdin: { write: jest.fn() },
73
+ kill: jest.fn()
74
+ });
75
+ // Emit stdout data after a brief delay
76
+ setTimeout(() => {
77
+ const lines = Array.isArray(stdoutData) ? stdoutData : [stdoutData];
78
+ lines.forEach(line => stdout.emit('data', line + '\n'));
79
+ setTimeout(() => {
80
+ proc.emit('close', exitCode);
81
+ }, 10);
82
+ }, 10);
83
+ return proc;
84
+ };
85
+ }
86
+ function delay(ms) {
87
+ return new Promise(resolve => setTimeout(resolve, ms));
88
+ }
89
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/test-utils/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './mocks';
2
+ export * from './helpers';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mocks"), exports);
18
+ __exportStar(require("./helpers"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,4CAA0B"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Mock implementations for testing
3
+ */
4
+ import { EventEmitter } from 'events';
5
+ export interface MockChildProcess {
6
+ stdout: EventEmitter;
7
+ stderr: EventEmitter;
8
+ stdin: {
9
+ write: jest.Mock;
10
+ };
11
+ on: jest.Mock;
12
+ once: jest.Mock;
13
+ emit: jest.Mock;
14
+ kill: jest.Mock;
15
+ pid: number;
16
+ connected: boolean;
17
+ disconnect: jest.Mock;
18
+ unref: jest.Mock;
19
+ ref: jest.Mock;
20
+ send: jest.Mock;
21
+ }
22
+ export declare function createMockChildProcess(): MockChildProcess;
23
+ export declare class MockCascadeMcpClient {
24
+ private tools;
25
+ callTool: jest.Mock<any, any, any>;
26
+ listTools: jest.Mock<any, any, any>;
27
+ isConnected: jest.Mock<any, any, any>;
28
+ registerMockTool(name: string, handler: Function): void;
29
+ simulateError(error: Error): void;
30
+ simulateConnectionError(): void;
31
+ }
32
+ export declare class MockFirestore {
33
+ private data;
34
+ setDocument(path: string, data: any): void;
35
+ collection(path: string): {
36
+ get: () => Promise<{
37
+ docs: {
38
+ id: string | undefined;
39
+ data: () => any;
40
+ }[];
41
+ }>;
42
+ doc: (id: string) => {
43
+ get: () => Promise<{
44
+ exists: boolean;
45
+ data: () => any;
46
+ }>;
47
+ set: (data: any) => Promise<void>;
48
+ };
49
+ };
50
+ }
51
+ //# sourceMappingURL=mocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../src/test-utils/mocks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;KAClB,CAAC;IACF,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC;IACtB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACjB,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;IACf,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;CACjB;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAqBzD;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAA+B;IACrC,QAAQ,2BAAa;IACrB,SAAS,2BAAa;IACtB,WAAW,2BAAmC;IAErD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;IAUhD,aAAa,CAAC,KAAK,EAAE,KAAK;IAI1B,uBAAuB;CAGxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAA0B;IAEtC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM;;;;;;;kBAUT,MAAM;;;;;wBAKI,GAAG;;;CAM5B"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * Mock implementations for testing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MockFirestore = exports.MockCascadeMcpClient = void 0;
7
+ exports.createMockChildProcess = createMockChildProcess;
8
+ const events_1 = require("events");
9
+ function createMockChildProcess() {
10
+ const stdout = new events_1.EventEmitter();
11
+ const stderr = new events_1.EventEmitter();
12
+ return {
13
+ stdout,
14
+ stderr,
15
+ stdin: {
16
+ write: jest.fn()
17
+ },
18
+ on: jest.fn(),
19
+ once: jest.fn(),
20
+ emit: jest.fn(),
21
+ kill: jest.fn(),
22
+ pid: 12345,
23
+ connected: true,
24
+ disconnect: jest.fn(),
25
+ unref: jest.fn(),
26
+ ref: jest.fn(),
27
+ send: jest.fn()
28
+ };
29
+ }
30
+ class MockCascadeMcpClient {
31
+ constructor() {
32
+ this.tools = new Map();
33
+ this.callTool = jest.fn();
34
+ this.listTools = jest.fn();
35
+ this.isConnected = jest.fn().mockReturnValue(true);
36
+ }
37
+ registerMockTool(name, handler) {
38
+ this.tools.set(name, handler);
39
+ this.callTool.mockImplementation(async (toolName, args) => {
40
+ if (toolName === name) {
41
+ return handler(args);
42
+ }
43
+ throw new Error(`Unknown tool: ${toolName}`);
44
+ });
45
+ }
46
+ simulateError(error) {
47
+ this.callTool.mockRejectedValue(error);
48
+ }
49
+ simulateConnectionError() {
50
+ this.isConnected.mockReturnValue(false);
51
+ }
52
+ }
53
+ exports.MockCascadeMcpClient = MockCascadeMcpClient;
54
+ class MockFirestore {
55
+ constructor() {
56
+ this.data = new Map();
57
+ }
58
+ setDocument(path, data) {
59
+ this.data.set(path, data);
60
+ }
61
+ collection(path) {
62
+ return {
63
+ get: async () => ({
64
+ docs: Array.from(this.data.entries())
65
+ .filter(([key]) => key.startsWith(path))
66
+ .map(([key, value]) => ({
67
+ id: key.split('/').pop(),
68
+ data: () => value
69
+ }))
70
+ }),
71
+ doc: (id) => ({
72
+ get: async () => ({
73
+ exists: this.data.has(`${path}/${id}`),
74
+ data: () => this.data.get(`${path}/${id}`)
75
+ }),
76
+ set: async (data) => {
77
+ this.data.set(`${path}/${id}`, data);
78
+ }
79
+ })
80
+ };
81
+ }
82
+ }
83
+ exports.MockFirestore = MockFirestore;
84
+ //# sourceMappingURL=mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/test-utils/mocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * A2A Tools (Agent-to-Agent)
3
+ *
4
+ * 3 tools for calling Cascade agents
5
+ */
6
+ import { ToolRegistry } from './tool-registry';
7
+ import { CascadeA2AClient } from '../a2a-client';
8
+ export declare function registerA2ATools(registry: ToolRegistry, a2aClient: CascadeA2AClient): void;
9
+ //# sourceMappingURL=a2a-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-tools.d.ts","sourceRoot":"","sources":["../../src/tools/a2a-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAsJ1F"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ /**
3
+ * A2A Tools (Agent-to-Agent)
4
+ *
5
+ * 3 tools for calling Cascade agents
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.registerA2ATools = registerA2ATools;
9
+ const response_helpers_1 = require("./response-helpers");
10
+ function registerA2ATools(registry, a2aClient) {
11
+ // 1. cascade_run_explorer
12
+ registry.register({
13
+ name: 'cascade_run_explorer',
14
+ description: 'Launch Cascade Explorer agent to learn an application',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ app_name: {
19
+ type: 'string',
20
+ description: 'Application name to explore'
21
+ },
22
+ instructions: {
23
+ type: 'string',
24
+ description: 'Specific instructions for exploration'
25
+ },
26
+ max_steps: {
27
+ type: 'integer',
28
+ default: 50,
29
+ description: 'Maximum exploration steps'
30
+ }
31
+ },
32
+ required: ['app_name']
33
+ },
34
+ handler: async (args) => {
35
+ try {
36
+ if (!args.app_name) {
37
+ return (0, response_helpers_1.errorResponse)('app_name is required');
38
+ }
39
+ await a2aClient.sendToAgent('explorer', {
40
+ type: 'start_exploration',
41
+ appName: args.app_name,
42
+ instructions: args.instructions || `Learn how to use ${args.app_name}`,
43
+ maxSteps: args.max_steps || 50
44
+ });
45
+ return (0, response_helpers_1.formatSuccess)({
46
+ message: 'Explorer agent started',
47
+ app_name: args.app_name,
48
+ status: 'running'
49
+ });
50
+ }
51
+ catch (error) {
52
+ return (0, response_helpers_1.errorResponse)(error instanceof Error ? error.message : 'Failed to start explorer', 'Ensure A2A is enabled in configuration (enableA2A: true)');
53
+ }
54
+ }
55
+ });
56
+ // 2. cascade_run_worker
57
+ registry.register({
58
+ name: 'cascade_run_worker',
59
+ description: 'Execute a task using Cascade Worker agent',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ task: {
64
+ type: 'string',
65
+ description: 'Task description to execute'
66
+ },
67
+ skill_id: {
68
+ type: 'string',
69
+ description: 'Optional skill ID to use'
70
+ },
71
+ app_name: {
72
+ type: 'string',
73
+ description: 'Target application name'
74
+ },
75
+ inputs: {
76
+ type: 'object',
77
+ description: 'Optional inputs for the task',
78
+ additionalProperties: true
79
+ }
80
+ },
81
+ required: ['task']
82
+ },
83
+ handler: async (args) => {
84
+ try {
85
+ if (!args.task) {
86
+ return (0, response_helpers_1.errorResponse)('task is required');
87
+ }
88
+ await a2aClient.sendToAgent('worker', {
89
+ type: 'execute_task',
90
+ task: args.task,
91
+ skillId: args.skill_id,
92
+ appName: args.app_name,
93
+ inputs: args.inputs || {}
94
+ });
95
+ return (0, response_helpers_1.formatSuccess)({
96
+ message: 'Worker agent started',
97
+ task: args.task,
98
+ status: 'running'
99
+ });
100
+ }
101
+ catch (error) {
102
+ return (0, response_helpers_1.errorResponse)(error instanceof Error ? error.message : 'Failed to start worker', 'Ensure A2A is enabled in configuration (enableA2A: true)');
103
+ }
104
+ }
105
+ });
106
+ // 3. cascade_run_orchestrator
107
+ registry.register({
108
+ name: 'cascade_run_orchestrator',
109
+ description: 'Use Cascade Orchestrator to coordinate multi-step tasks',
110
+ inputSchema: {
111
+ type: 'object',
112
+ properties: {
113
+ goal: {
114
+ type: 'string',
115
+ description: 'High-level goal to achieve'
116
+ },
117
+ require_approval: {
118
+ type: 'boolean',
119
+ default: true,
120
+ description: 'Require approval before executing steps'
121
+ }
122
+ },
123
+ required: ['goal']
124
+ },
125
+ handler: async (args) => {
126
+ try {
127
+ if (!args.goal) {
128
+ return (0, response_helpers_1.errorResponse)('goal is required');
129
+ }
130
+ await a2aClient.sendToAgent('orchestrator', {
131
+ type: 'coordinate',
132
+ goal: args.goal,
133
+ requireApproval: args.require_approval !== false
134
+ });
135
+ return (0, response_helpers_1.formatSuccess)({
136
+ message: 'Orchestrator started',
137
+ goal: args.goal,
138
+ status: 'running'
139
+ });
140
+ }
141
+ catch (error) {
142
+ return (0, response_helpers_1.errorResponse)(error instanceof Error ? error.message : 'Failed to start orchestrator', 'Ensure A2A is enabled in configuration (enableA2A: true)');
143
+ }
144
+ }
145
+ });
146
+ }
147
+ //# sourceMappingURL=a2a-tools.js.map