@cloudbase/agent-tools 0.0.2
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/CHANGELOG.md +416 -0
- package/dist/agent_tool.d.ts +7 -0
- package/dist/agent_tool.d.ts.map +1 -0
- package/dist/agent_tool.js +16 -0
- package/dist/agent_tool.js.map +1 -0
- package/dist/bash/bash-tool.d.ts +61 -0
- package/dist/bash/bash-tool.d.ts.map +1 -0
- package/dist/bash/bash-tool.js +191 -0
- package/dist/bash/bash-tool.js.map +1 -0
- package/dist/bash/index.d.ts +7 -0
- package/dist/bash/index.d.ts.map +1 -0
- package/dist/bash/index.js +17 -0
- package/dist/bash/index.js.map +1 -0
- package/dist/bash/operator/base-operator.d.ts +44 -0
- package/dist/bash/operator/base-operator.d.ts.map +1 -0
- package/dist/bash/operator/base-operator.js +14 -0
- package/dist/bash/operator/base-operator.js.map +1 -0
- package/dist/bash/operator/local-operator.d.ts +15 -0
- package/dist/bash/operator/local-operator.d.ts.map +1 -0
- package/dist/bash/operator/local-operator.js +145 -0
- package/dist/bash/operator/local-operator.js.map +1 -0
- package/dist/bash/operator/sandbox-operator.d.ts +22 -0
- package/dist/bash/operator/sandbox-operator.d.ts.map +1 -0
- package/dist/bash/operator/sandbox-operator.js +112 -0
- package/dist/bash/operator/sandbox-operator.js.map +1 -0
- package/dist/bash/utils.d.ts +106 -0
- package/dist/bash/utils.d.ts.map +1 -0
- package/dist/bash/utils.js +197 -0
- package/dist/bash/utils.js.map +1 -0
- package/dist/browser/browser-instance-manager.d.ts +79 -0
- package/dist/browser/browser-instance-manager.d.ts.map +1 -0
- package/dist/browser/browser-instance-manager.js +242 -0
- package/dist/browser/browser-instance-manager.js.map +1 -0
- package/dist/browser/browser-tool-executor.d.ts +57 -0
- package/dist/browser/browser-tool-executor.d.ts.map +1 -0
- package/dist/browser/browser-tool-executor.js +205 -0
- package/dist/browser/browser-tool-executor.js.map +1 -0
- package/dist/browser/browser_client_unified.d.ts +52 -0
- package/dist/browser/browser_client_unified.d.ts.map +1 -0
- package/dist/browser/browser_client_unified.js +381 -0
- package/dist/browser/browser_client_unified.js.map +1 -0
- package/dist/browser/browser_tool_unified.d.ts +93 -0
- package/dist/browser/browser_tool_unified.d.ts.map +1 -0
- package/dist/browser/browser_tool_unified.js +181 -0
- package/dist/browser/browser_tool_unified.js.map +1 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/sandbox-connector.d.ts +93 -0
- package/dist/browser/sandbox-connector.d.ts.map +1 -0
- package/dist/browser/sandbox-connector.js +272 -0
- package/dist/browser/sandbox-connector.js.map +1 -0
- package/dist/browser/types.d.ts +53 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +3 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/code_executers/base_code_executor.d.ts +17 -0
- package/dist/code_executers/base_code_executor.d.ts.map +1 -0
- package/dist/code_executers/base_code_executor.js +20 -0
- package/dist/code_executers/base_code_executor.js.map +1 -0
- package/dist/code_executers/built_in_code_executor.d.ts +25 -0
- package/dist/code_executers/built_in_code_executor.d.ts.map +1 -0
- package/dist/code_executers/built_in_code_executor.js +106 -0
- package/dist/code_executers/built_in_code_executor.js.map +1 -0
- package/dist/code_executers/unsafe_local_code_executor.d.ts +118 -0
- package/dist/code_executers/unsafe_local_code_executor.d.ts.map +1 -0
- package/dist/code_executers/unsafe_local_code_executor.js +605 -0
- package/dist/code_executers/unsafe_local_code_executor.js.map +1 -0
- package/dist/fs/edit-tool.d.ts +26 -0
- package/dist/fs/edit-tool.d.ts.map +1 -0
- package/dist/fs/edit-tool.js +202 -0
- package/dist/fs/edit-tool.js.map +1 -0
- package/dist/fs/glob-tool.d.ts +31 -0
- package/dist/fs/glob-tool.d.ts.map +1 -0
- package/dist/fs/glob-tool.js +287 -0
- package/dist/fs/glob-tool.js.map +1 -0
- package/dist/fs/grep-tool.d.ts +32 -0
- package/dist/fs/grep-tool.d.ts.map +1 -0
- package/dist/fs/grep-tool.js +353 -0
- package/dist/fs/grep-tool.js.map +1 -0
- package/dist/fs/index.d.ts +11 -0
- package/dist/fs/index.d.ts.map +1 -0
- package/dist/fs/index.js +38 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/ls-tool.d.ts +26 -0
- package/dist/fs/ls-tool.d.ts.map +1 -0
- package/dist/fs/ls-tool.js +235 -0
- package/dist/fs/ls-tool.js.map +1 -0
- package/dist/fs/multiedit-tool.d.ts +34 -0
- package/dist/fs/multiedit-tool.d.ts.map +1 -0
- package/dist/fs/multiedit-tool.js +158 -0
- package/dist/fs/multiedit-tool.js.map +1 -0
- package/dist/fs/operator/base-operator.d.ts +28 -0
- package/dist/fs/operator/base-operator.d.ts.map +1 -0
- package/dist/fs/operator/base-operator.js +21 -0
- package/dist/fs/operator/base-operator.js.map +1 -0
- package/dist/fs/operator/in-memory-operator.d.ts +39 -0
- package/dist/fs/operator/in-memory-operator.d.ts.map +1 -0
- package/dist/fs/operator/in-memory-operator.js +115 -0
- package/dist/fs/operator/in-memory-operator.js.map +1 -0
- package/dist/fs/operator/index.d.ts +6 -0
- package/dist/fs/operator/index.d.ts.map +1 -0
- package/dist/fs/operator/index.js +28 -0
- package/dist/fs/operator/index.js.map +1 -0
- package/dist/fs/operator/local-operator.d.ts +25 -0
- package/dist/fs/operator/local-operator.d.ts.map +1 -0
- package/dist/fs/operator/local-operator.js +62 -0
- package/dist/fs/operator/local-operator.js.map +1 -0
- package/dist/fs/operator/sanbox-operator.d.ts +31 -0
- package/dist/fs/operator/sanbox-operator.d.ts.map +1 -0
- package/dist/fs/operator/sanbox-operator.js +172 -0
- package/dist/fs/operator/sanbox-operator.js.map +1 -0
- package/dist/fs/operator/transaction/index.d.ts +6 -0
- package/dist/fs/operator/transaction/index.d.ts.map +1 -0
- package/dist/fs/operator/transaction/index.js +28 -0
- package/dist/fs/operator/transaction/index.js.map +1 -0
- package/dist/fs/operator/transaction/snapshot-strategies.d.ts +54 -0
- package/dist/fs/operator/transaction/snapshot-strategies.d.ts.map +1 -0
- package/dist/fs/operator/transaction/snapshot-strategies.js +278 -0
- package/dist/fs/operator/transaction/snapshot-strategies.js.map +1 -0
- package/dist/fs/operator/transaction/transaction-operator.d.ts +53 -0
- package/dist/fs/operator/transaction/transaction-operator.d.ts.map +1 -0
- package/dist/fs/operator/transaction/transaction-operator.js +195 -0
- package/dist/fs/operator/transaction/transaction-operator.js.map +1 -0
- package/dist/fs/operator/transaction/transaction-utils.d.ts +80 -0
- package/dist/fs/operator/transaction/transaction-utils.d.ts.map +1 -0
- package/dist/fs/operator/transaction/transaction-utils.js +156 -0
- package/dist/fs/operator/transaction/transaction-utils.js.map +1 -0
- package/dist/fs/read-tool.d.ts +32 -0
- package/dist/fs/read-tool.d.ts.map +1 -0
- package/dist/fs/read-tool.js +271 -0
- package/dist/fs/read-tool.js.map +1 -0
- package/dist/fs/str-replace-editor.d.ts +23 -0
- package/dist/fs/str-replace-editor.d.ts.map +1 -0
- package/dist/fs/str-replace-editor.js +74 -0
- package/dist/fs/str-replace-editor.js.map +1 -0
- package/dist/fs/toolkit.d.ts +61 -0
- package/dist/fs/toolkit.d.ts.map +1 -0
- package/dist/fs/toolkit.js +113 -0
- package/dist/fs/toolkit.js.map +1 -0
- package/dist/fs/utils.d.ts +32 -0
- package/dist/fs/utils.d.ts.map +1 -0
- package/dist/fs/utils.js +133 -0
- package/dist/fs/utils.js.map +1 -0
- package/dist/fs/write-tool.d.ts +26 -0
- package/dist/fs/write-tool.d.ts.map +1 -0
- package/dist/fs/write-tool.js +110 -0
- package/dist/fs/write-tool.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/agkit-mcp-server.d.ts +291 -0
- package/dist/mcp/agkit-mcp-server.d.ts.map +1 -0
- package/dist/mcp/agkit-mcp-server.js +821 -0
- package/dist/mcp/agkit-mcp-server.js.map +1 -0
- package/dist/mcp/client-tool.d.ts +65 -0
- package/dist/mcp/client-tool.d.ts.map +1 -0
- package/dist/mcp/client-tool.js +220 -0
- package/dist/mcp/client-tool.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +26 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-client-manager.d.ts +153 -0
- package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
- package/dist/mcp/mcp-client-manager.js +606 -0
- package/dist/mcp/mcp-client-manager.js.map +1 -0
- package/dist/mcp/mcp-toolkit.d.ts +112 -0
- package/dist/mcp/mcp-toolkit.d.ts.map +1 -0
- package/dist/mcp/mcp-toolkit.js +188 -0
- package/dist/mcp/mcp-toolkit.js.map +1 -0
- package/dist/mcp/types.d.ts +157 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +34 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/utils.d.ts +17 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +48 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/zod.d.ts +18 -0
- package/dist/types/zod.d.ts.map +1 -0
- package/dist/types/zod.js +3 -0
- package/dist/types/zod.js.map +1 -0
- package/dist/utils.d.ts +141 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +379 -0
- package/dist/utils.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CommandBuilders = void 0;
|
|
4
|
+
exports.createLocalBashContext = createLocalBashContext;
|
|
5
|
+
exports.createSandboxBashContext = createSandboxBashContext;
|
|
6
|
+
exports.validateCommand = validateCommand;
|
|
7
|
+
exports.escapeShellArg = escapeShellArg;
|
|
8
|
+
exports.buildCommand = buildCommand;
|
|
9
|
+
exports.parseCommandOutput = parseCommandOutput;
|
|
10
|
+
exports.formatExecutionTime = formatExecutionTime;
|
|
11
|
+
const local_operator_1 = require("./operator/local-operator");
|
|
12
|
+
const sandbox_operator_1 = require("./operator/sandbox-operator");
|
|
13
|
+
/**
|
|
14
|
+
* Create a local bash execution context
|
|
15
|
+
*/
|
|
16
|
+
function createLocalBashContext(options) {
|
|
17
|
+
const bashOperator = new local_operator_1.LocalBashOperator({
|
|
18
|
+
cwd: options?.cwd,
|
|
19
|
+
env: options?.env,
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
bashOperator,
|
|
23
|
+
workingDirectory: options?.cwd || process.cwd(),
|
|
24
|
+
environmentVariables: options?.env || {},
|
|
25
|
+
defaultTimeout: options?.defaultTimeout || 30000,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a sandbox bash execution context
|
|
30
|
+
*/
|
|
31
|
+
function createSandboxBashContext(options) {
|
|
32
|
+
const bashOperator = new sandbox_operator_1.SandboxBashOperator({
|
|
33
|
+
sandbox: options.sandbox,
|
|
34
|
+
cwd: options.cwd,
|
|
35
|
+
env: options.env,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
bashOperator,
|
|
39
|
+
workingDirectory: options.cwd || "/home/user",
|
|
40
|
+
environmentVariables: options.env || {},
|
|
41
|
+
defaultTimeout: options.defaultTimeout || 30000,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate command for security (basic checks)
|
|
46
|
+
*/
|
|
47
|
+
function validateCommand(command) {
|
|
48
|
+
// Basic security checks
|
|
49
|
+
const dangerousPatterns = [
|
|
50
|
+
/rm\s+-rf\s+\//, // rm -rf /
|
|
51
|
+
/:\(\)\{.*\}/, // Fork bomb pattern
|
|
52
|
+
/sudo\s+rm/, // sudo rm
|
|
53
|
+
/mkfs/, // Format filesystem
|
|
54
|
+
/dd\s+if=.*of=\/dev/, // Direct disk write
|
|
55
|
+
/>\s*\/dev\/sd[a-z]/, // Write to disk device
|
|
56
|
+
];
|
|
57
|
+
for (const pattern of dangerousPatterns) {
|
|
58
|
+
if (pattern.test(command)) {
|
|
59
|
+
return {
|
|
60
|
+
isValid: false,
|
|
61
|
+
reason: `Command contains potentially dangerous pattern: ${pattern.source}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { isValid: true };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Escape shell arguments
|
|
69
|
+
*/
|
|
70
|
+
function escapeShellArg(arg) {
|
|
71
|
+
return `'${arg.replace(/'/g, "'\"'\"'")}'`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Build command with escaped arguments
|
|
75
|
+
*/
|
|
76
|
+
function buildCommand(command, args = []) {
|
|
77
|
+
if (args.length === 0) {
|
|
78
|
+
return command;
|
|
79
|
+
}
|
|
80
|
+
const escapedArgs = args.map(escapeShellArg);
|
|
81
|
+
return `${command} ${escapedArgs.join(" ")}`;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parse command output for common patterns
|
|
85
|
+
*/
|
|
86
|
+
function parseCommandOutput(stdout, stderr) {
|
|
87
|
+
return {
|
|
88
|
+
lines: stdout.split("\n").filter((line) => line.trim()),
|
|
89
|
+
errorLines: stderr.split("\n").filter((line) => line.trim()),
|
|
90
|
+
isEmpty: !stdout.trim() && !stderr.trim(),
|
|
91
|
+
hasErrors: stderr.trim().length > 0,
|
|
92
|
+
exitedCleanly: stderr.trim().length === 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Format execution time
|
|
97
|
+
*/
|
|
98
|
+
function formatExecutionTime(ms) {
|
|
99
|
+
if (ms < 1000) {
|
|
100
|
+
return `${ms}ms`;
|
|
101
|
+
}
|
|
102
|
+
else if (ms < 60000) {
|
|
103
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const minutes = Math.floor(ms / 60000);
|
|
107
|
+
const seconds = ((ms % 60000) / 1000).toFixed(2);
|
|
108
|
+
return `${minutes}m ${seconds}s`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Common command builders
|
|
113
|
+
*/
|
|
114
|
+
exports.CommandBuilders = {
|
|
115
|
+
/**
|
|
116
|
+
* List files with details
|
|
117
|
+
*/
|
|
118
|
+
listFiles: (path = ".", options) => {
|
|
119
|
+
let cmd = "ls";
|
|
120
|
+
if (options?.all)
|
|
121
|
+
cmd += " -a";
|
|
122
|
+
if (options?.long)
|
|
123
|
+
cmd += " -l";
|
|
124
|
+
if (options?.human)
|
|
125
|
+
cmd += " -h";
|
|
126
|
+
return `${cmd} ${escapeShellArg(path)}`;
|
|
127
|
+
},
|
|
128
|
+
/**
|
|
129
|
+
* Find files by pattern
|
|
130
|
+
*/
|
|
131
|
+
findFiles: (pattern, path = ".") => {
|
|
132
|
+
return `find ${escapeShellArg(path)} -name ${escapeShellArg(pattern)}`;
|
|
133
|
+
},
|
|
134
|
+
/**
|
|
135
|
+
* Search in files
|
|
136
|
+
*/
|
|
137
|
+
grep: (pattern, files = "*", options) => {
|
|
138
|
+
let cmd = "grep";
|
|
139
|
+
if (options?.recursive)
|
|
140
|
+
cmd += " -r";
|
|
141
|
+
if (options?.ignoreCase)
|
|
142
|
+
cmd += " -i";
|
|
143
|
+
if (options?.lineNumbers)
|
|
144
|
+
cmd += " -n";
|
|
145
|
+
return `${cmd} ${escapeShellArg(pattern)} ${escapeShellArg(files)}`;
|
|
146
|
+
},
|
|
147
|
+
/**
|
|
148
|
+
* Check if file/directory exists
|
|
149
|
+
*/
|
|
150
|
+
exists: (path) => {
|
|
151
|
+
return `test -e ${escapeShellArg(path)} && echo "exists" || echo "not found"`;
|
|
152
|
+
},
|
|
153
|
+
/**
|
|
154
|
+
* Get file info
|
|
155
|
+
*/
|
|
156
|
+
stat: (path) => {
|
|
157
|
+
return `stat ${escapeShellArg(path)}`;
|
|
158
|
+
},
|
|
159
|
+
/**
|
|
160
|
+
* Create directory
|
|
161
|
+
*/
|
|
162
|
+
mkdir: (path, options) => {
|
|
163
|
+
let cmd = "mkdir";
|
|
164
|
+
if (options?.parents)
|
|
165
|
+
cmd += " -p";
|
|
166
|
+
return `${cmd} ${escapeShellArg(path)}`;
|
|
167
|
+
},
|
|
168
|
+
/**
|
|
169
|
+
* Copy files
|
|
170
|
+
*/
|
|
171
|
+
copy: (source, destination, options) => {
|
|
172
|
+
let cmd = "cp";
|
|
173
|
+
if (options?.recursive)
|
|
174
|
+
cmd += " -r";
|
|
175
|
+
if (options?.preserve)
|
|
176
|
+
cmd += " -p";
|
|
177
|
+
return `${cmd} ${escapeShellArg(source)} ${escapeShellArg(destination)}`;
|
|
178
|
+
},
|
|
179
|
+
/**
|
|
180
|
+
* Move/rename files
|
|
181
|
+
*/
|
|
182
|
+
move: (source, destination) => {
|
|
183
|
+
return `mv ${escapeShellArg(source)} ${escapeShellArg(destination)}`;
|
|
184
|
+
},
|
|
185
|
+
/**
|
|
186
|
+
* Remove files/directories
|
|
187
|
+
*/
|
|
188
|
+
remove: (path, options) => {
|
|
189
|
+
let cmd = "rm";
|
|
190
|
+
if (options?.recursive)
|
|
191
|
+
cmd += " -r";
|
|
192
|
+
if (options?.force)
|
|
193
|
+
cmd += " -f";
|
|
194
|
+
return `${cmd} ${escapeShellArg(path)}`;
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/bash/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { SandboxConnector, SandboxConnectorConfig, SandboxConnectionInfo } from "./sandbox-connector";
|
|
3
|
+
export interface BrowserInstanceConfig extends SandboxConnectorConfig {
|
|
4
|
+
maxInstances?: number;
|
|
5
|
+
instanceTtl?: number;
|
|
6
|
+
cleanupInterval?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface BrowserInstanceInfo {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
connector: SandboxConnector;
|
|
11
|
+
connectionInfo: SandboxConnectionInfo;
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
lastUsed: Date;
|
|
14
|
+
isActive: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* BrowserInstanceManager provides multi-instance isolation and lifecycle management
|
|
18
|
+
* Supports concurrent users with isolated browser environments
|
|
19
|
+
*/
|
|
20
|
+
export declare class BrowserInstanceManager extends EventEmitter {
|
|
21
|
+
private config;
|
|
22
|
+
private instances;
|
|
23
|
+
private cleanupTimer?;
|
|
24
|
+
constructor(config: BrowserInstanceConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Create or get existing browser instance for session
|
|
27
|
+
*/
|
|
28
|
+
getInstance(sessionId: string): Promise<BrowserInstanceInfo>;
|
|
29
|
+
/**
|
|
30
|
+
* Get existing instance without creating new one
|
|
31
|
+
*/
|
|
32
|
+
getExistingInstance(sessionId: string): BrowserInstanceInfo | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Remove and cleanup specific instance
|
|
35
|
+
*/
|
|
36
|
+
removeInstance(sessionId: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get all active instances
|
|
39
|
+
*/
|
|
40
|
+
getActiveInstances(): BrowserInstanceInfo[];
|
|
41
|
+
/**
|
|
42
|
+
* Get instance count
|
|
43
|
+
*/
|
|
44
|
+
getInstanceCount(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Health check for specific instance
|
|
47
|
+
*/
|
|
48
|
+
checkInstanceHealth(sessionId: string): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Cleanup expired instances
|
|
51
|
+
*/
|
|
52
|
+
cleanupExpiredInstances(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Cleanup all instances
|
|
55
|
+
*/
|
|
56
|
+
cleanup(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Setup event handlers for connector
|
|
59
|
+
*/
|
|
60
|
+
private setupConnectorEvents;
|
|
61
|
+
/**
|
|
62
|
+
* Start cleanup timer
|
|
63
|
+
*/
|
|
64
|
+
private startCleanupTimer;
|
|
65
|
+
/**
|
|
66
|
+
* Stop cleanup timer
|
|
67
|
+
*/
|
|
68
|
+
private stopCleanupTimer;
|
|
69
|
+
/**
|
|
70
|
+
* Get statistics
|
|
71
|
+
*/
|
|
72
|
+
getStatistics(): {
|
|
73
|
+
totalInstances: number;
|
|
74
|
+
activeInstances: number;
|
|
75
|
+
oldestInstance?: Date;
|
|
76
|
+
newestInstance?: Date;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=browser-instance-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-instance-manager.d.ts","sourceRoot":"","sources":["../../src/browser/browser-instance-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEtG,MAAM,WAAW,qBAAsB,SAAQ,sBAAsB;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,cAAc,EAAE,qBAAqB,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,YAAY,CAAC,CAAiB;gBAE1B,MAAM,EAAE,qBAAqB;IAazC;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqDlE;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IASvE;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtD;;OAEG;IACH,kBAAkB,IAAI,mBAAmB,EAAE;IAI3C;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9D;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,aAAa,IAAI;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,IAAI,CAAC;QACtB,cAAc,CAAC,EAAE,IAAI,CAAC;KACvB;CAcF"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BrowserInstanceManager = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const sandbox_connector_1 = require("./sandbox-connector");
|
|
6
|
+
/**
|
|
7
|
+
* BrowserInstanceManager provides multi-instance isolation and lifecycle management
|
|
8
|
+
* Supports concurrent users with isolated browser environments
|
|
9
|
+
*/
|
|
10
|
+
class BrowserInstanceManager extends events_1.EventEmitter {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
super();
|
|
13
|
+
this.instances = new Map();
|
|
14
|
+
this.config = {
|
|
15
|
+
maxInstances: 10,
|
|
16
|
+
instanceTtl: 3600, // 1 hour
|
|
17
|
+
cleanupInterval: 300, // 5 minutes
|
|
18
|
+
...config,
|
|
19
|
+
};
|
|
20
|
+
// Start cleanup timer
|
|
21
|
+
this.startCleanupTimer();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create or get existing browser instance for session
|
|
25
|
+
*/
|
|
26
|
+
async getInstance(sessionId) {
|
|
27
|
+
// Check if instance already exists
|
|
28
|
+
const existing = this.instances.get(sessionId);
|
|
29
|
+
if (existing && existing.isActive) {
|
|
30
|
+
// Update last used time
|
|
31
|
+
existing.lastUsed = new Date();
|
|
32
|
+
return existing;
|
|
33
|
+
}
|
|
34
|
+
// Check instance limit
|
|
35
|
+
if (this.instances.size >= this.config.maxInstances) {
|
|
36
|
+
await this.cleanupExpiredInstances();
|
|
37
|
+
if (this.instances.size >= this.config.maxInstances) {
|
|
38
|
+
throw new Error(`Maximum number of browser instances reached: ${this.config.maxInstances}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Create new instance
|
|
42
|
+
const connector = new sandbox_connector_1.SandboxConnector({
|
|
43
|
+
apiKey: this.config.apiKey,
|
|
44
|
+
domain: this.config.domain,
|
|
45
|
+
timeout: this.config.timeout,
|
|
46
|
+
sessionId,
|
|
47
|
+
});
|
|
48
|
+
// Set up event handlers
|
|
49
|
+
this.setupConnectorEvents(sessionId, connector);
|
|
50
|
+
// Connect to sandbox
|
|
51
|
+
await connector.connect();
|
|
52
|
+
const connectionInfo = connector.getConnectionInfo();
|
|
53
|
+
if (!connectionInfo) {
|
|
54
|
+
throw new Error("Failed to get connection info from connector");
|
|
55
|
+
}
|
|
56
|
+
const instanceInfo = {
|
|
57
|
+
sessionId,
|
|
58
|
+
connector,
|
|
59
|
+
connectionInfo,
|
|
60
|
+
createdAt: new Date(),
|
|
61
|
+
lastUsed: new Date(),
|
|
62
|
+
isActive: true,
|
|
63
|
+
};
|
|
64
|
+
this.instances.set(sessionId, instanceInfo);
|
|
65
|
+
this.emit('instance-created', instanceInfo);
|
|
66
|
+
console.log(`✅ Created browser instance for session: ${sessionId}`);
|
|
67
|
+
return instanceInfo;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get existing instance without creating new one
|
|
71
|
+
*/
|
|
72
|
+
getExistingInstance(sessionId) {
|
|
73
|
+
const instance = this.instances.get(sessionId);
|
|
74
|
+
if (instance && instance.isActive) {
|
|
75
|
+
instance.lastUsed = new Date();
|
|
76
|
+
return instance;
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Remove and cleanup specific instance
|
|
82
|
+
*/
|
|
83
|
+
async removeInstance(sessionId) {
|
|
84
|
+
const instance = this.instances.get(sessionId);
|
|
85
|
+
if (!instance) {
|
|
86
|
+
console.warn(`Instance not found for session: ${sessionId}`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
// Disconnect and cleanup
|
|
91
|
+
await instance.connector.disconnect();
|
|
92
|
+
instance.isActive = false;
|
|
93
|
+
this.instances.delete(sessionId);
|
|
94
|
+
this.emit('instance-removed', sessionId);
|
|
95
|
+
console.log(`✅ Removed browser instance for session: ${sessionId}`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(`Failed to remove instance for session ${sessionId}:`, error);
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get all active instances
|
|
104
|
+
*/
|
|
105
|
+
getActiveInstances() {
|
|
106
|
+
return Array.from(this.instances.values()).filter(instance => instance.isActive);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get instance count
|
|
110
|
+
*/
|
|
111
|
+
getInstanceCount() {
|
|
112
|
+
return this.instances.size;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Health check for specific instance
|
|
116
|
+
*/
|
|
117
|
+
async checkInstanceHealth(sessionId) {
|
|
118
|
+
const instance = this.instances.get(sessionId);
|
|
119
|
+
if (!instance || !instance.isActive) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
return await instance.connector.healthCheck();
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(`Health check failed for session ${sessionId}:`, error);
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Cleanup expired instances
|
|
132
|
+
*/
|
|
133
|
+
async cleanupExpiredInstances() {
|
|
134
|
+
const now = new Date();
|
|
135
|
+
const expiredSessions = [];
|
|
136
|
+
for (const [sessionId, instance] of this.instances.entries()) {
|
|
137
|
+
const ageInSeconds = (now.getTime() - instance.lastUsed.getTime()) / 1000;
|
|
138
|
+
if (ageInSeconds > this.config.instanceTtl) {
|
|
139
|
+
expiredSessions.push(sessionId);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
console.log(`Cleaning up ${expiredSessions.length} expired instances`);
|
|
143
|
+
for (const sessionId of expiredSessions) {
|
|
144
|
+
try {
|
|
145
|
+
await this.removeInstance(sessionId);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.error(`Failed to cleanup expired instance ${sessionId}:`, error);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (expiredSessions.length > 0) {
|
|
152
|
+
this.emit('cleanup-completed', expiredSessions);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Cleanup all instances
|
|
157
|
+
*/
|
|
158
|
+
async cleanup() {
|
|
159
|
+
console.log(`Cleaning up all ${this.instances.size} browser instances`);
|
|
160
|
+
const sessionIds = Array.from(this.instances.keys());
|
|
161
|
+
for (const sessionId of sessionIds) {
|
|
162
|
+
try {
|
|
163
|
+
await this.removeInstance(sessionId);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error(`Failed to cleanup instance ${sessionId}:`, error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
this.stopCleanupTimer();
|
|
170
|
+
console.log("✅ All browser instances cleaned up");
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Setup event handlers for connector
|
|
174
|
+
*/
|
|
175
|
+
setupConnectorEvents(sessionId, connector) {
|
|
176
|
+
connector.on('error', (error) => {
|
|
177
|
+
console.error(`Connector error for session ${sessionId}:`, error);
|
|
178
|
+
this.emit('instance-error', sessionId, error);
|
|
179
|
+
});
|
|
180
|
+
connector.on('disconnected', () => {
|
|
181
|
+
console.log(`Connector disconnected for session ${sessionId}`);
|
|
182
|
+
const instance = this.instances.get(sessionId);
|
|
183
|
+
if (instance) {
|
|
184
|
+
instance.isActive = false;
|
|
185
|
+
}
|
|
186
|
+
this.emit('instance-disconnected', sessionId);
|
|
187
|
+
});
|
|
188
|
+
connector.on('reconnected', () => {
|
|
189
|
+
console.log(`Connector reconnected for session ${sessionId}`);
|
|
190
|
+
const instance = this.instances.get(sessionId);
|
|
191
|
+
if (instance) {
|
|
192
|
+
instance.isActive = true;
|
|
193
|
+
instance.lastUsed = new Date();
|
|
194
|
+
}
|
|
195
|
+
this.emit('instance-reconnected', sessionId);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Start cleanup timer
|
|
200
|
+
*/
|
|
201
|
+
startCleanupTimer() {
|
|
202
|
+
if (this.cleanupTimer) {
|
|
203
|
+
clearInterval(this.cleanupTimer);
|
|
204
|
+
}
|
|
205
|
+
this.cleanupTimer = setInterval(async () => {
|
|
206
|
+
try {
|
|
207
|
+
await this.cleanupExpiredInstances();
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error("Error during scheduled cleanup:", error);
|
|
211
|
+
}
|
|
212
|
+
}, this.config.cleanupInterval * 1000);
|
|
213
|
+
console.log(`Started cleanup timer with interval: ${this.config.cleanupInterval}s`);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Stop cleanup timer
|
|
217
|
+
*/
|
|
218
|
+
stopCleanupTimer() {
|
|
219
|
+
if (this.cleanupTimer) {
|
|
220
|
+
clearInterval(this.cleanupTimer);
|
|
221
|
+
this.cleanupTimer = undefined;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get statistics
|
|
226
|
+
*/
|
|
227
|
+
getStatistics() {
|
|
228
|
+
const instances = this.getActiveInstances();
|
|
229
|
+
return {
|
|
230
|
+
totalInstances: this.instances.size,
|
|
231
|
+
activeInstances: instances.length,
|
|
232
|
+
oldestInstance: instances.length > 0
|
|
233
|
+
? new Date(Math.min(...instances.map(i => i.createdAt.getTime())))
|
|
234
|
+
: undefined,
|
|
235
|
+
newestInstance: instances.length > 0
|
|
236
|
+
? new Date(Math.max(...instances.map(i => i.createdAt.getTime())))
|
|
237
|
+
: undefined,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.BrowserInstanceManager = BrowserInstanceManager;
|
|
242
|
+
//# sourceMappingURL=browser-instance-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-instance-manager.js","sourceRoot":"","sources":["../../src/browser/browser-instance-manager.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AACtC,2DAAsG;AAiBtG;;;GAGG;AACH,MAAa,sBAAuB,SAAQ,qBAAY;IAKtD,YAAY,MAA6B;QACvC,KAAK,EAAE,CAAC;QAJF,cAAS,GAAqC,IAAI,GAAG,EAAE,CAAC;QAK9D,IAAI,CAAC,MAAM,GAAG;YACZ,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,IAAI,EAAE,SAAS;YAC5B,eAAe,EAAE,GAAG,EAAE,YAAY;YAClC,GAAG,MAAM;SACV,CAAC;QAEF,sBAAsB;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAClC,wBAAwB;YACxB,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAa,EAAE,CAAC;YACrD,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAErC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAa,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,oCAAgB,CAAC;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,SAAS;SACV,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEhD,qBAAqB;QACrB,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAE1B,MAAM,cAAc,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;QACrD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,YAAY,GAAwB;YACxC,SAAS;YACT,SAAS;YACT,cAAc;YACd,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,QAAQ,EAAE,IAAI;SACf,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;QACpE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,SAAiB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAClC,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YACtC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;YAE1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YAEzC,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,SAAiB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB;QAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;YAE1E,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAY,EAAE,CAAC;gBAC5C,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,eAAe,CAAC,MAAM,oBAAoB,CAAC,CAAC;QAEvE,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,CAAC;QAExE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAErD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,SAAiB,EAAE,SAA2B;QACzE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACzB,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAgB,GAAG,IAAI,CAAC,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,wCAAwC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QAMX,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE5C,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;YACnC,eAAe,EAAE,SAAS,CAAC,MAAM;YACjC,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,SAAS;YACb,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;CACF;AAhRD,wDAgRC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Browser, BrowserContext, Page } from 'playwright';
|
|
2
|
+
/**
|
|
3
|
+
* Browser tool call interface
|
|
4
|
+
*/
|
|
5
|
+
export interface BrowserToolCall {
|
|
6
|
+
name: string;
|
|
7
|
+
arguments?: Record<string, any>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Browser tool result interface
|
|
11
|
+
*/
|
|
12
|
+
export interface BrowserToolResult {
|
|
13
|
+
content: Array<{
|
|
14
|
+
type: string;
|
|
15
|
+
text?: string;
|
|
16
|
+
data?: string;
|
|
17
|
+
mimeType?: string;
|
|
18
|
+
}>;
|
|
19
|
+
isError?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Browser page provider interface
|
|
23
|
+
* Different clients implement this to provide access to browser pages
|
|
24
|
+
*/
|
|
25
|
+
export interface BrowserPageProvider {
|
|
26
|
+
getPage(pageIndex?: number): Page;
|
|
27
|
+
getPages(): Page[];
|
|
28
|
+
createPage(): Promise<Page>;
|
|
29
|
+
closePage(pageIndex: number): Promise<void>;
|
|
30
|
+
getBrowser(): Browser | null;
|
|
31
|
+
getContext(): BrowserContext | null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Shared browser tool executor
|
|
35
|
+
* Handles all Playwright operations regardless of connection method
|
|
36
|
+
*/
|
|
37
|
+
export declare class BrowserToolExecutor {
|
|
38
|
+
private pageProvider;
|
|
39
|
+
constructor(pageProvider: BrowserPageProvider);
|
|
40
|
+
/**
|
|
41
|
+
* Get list of available tools
|
|
42
|
+
*/
|
|
43
|
+
listTools(): any[];
|
|
44
|
+
/**
|
|
45
|
+
* Execute a browser tool
|
|
46
|
+
*/
|
|
47
|
+
executeTool(toolCall: BrowserToolCall): Promise<BrowserToolResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Execute Playwright tool operations
|
|
50
|
+
*/
|
|
51
|
+
private executePlaywrightTool;
|
|
52
|
+
/**
|
|
53
|
+
* Handle tabs operations
|
|
54
|
+
*/
|
|
55
|
+
private handleTabsOperation;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=browser-tool-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-tool-executor.d.ts","sourceRoot":"","sources":["../../src/browser/browser-tool-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,IAAI,IAAI,EAAE,CAAC;IACnB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,UAAU,IAAI,OAAO,GAAG,IAAI,CAAC;IAC7B,UAAU,IAAI,cAAc,GAAG,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAsB;gBAE9B,YAAY,EAAE,mBAAmB;IAI7C;;OAEG;IACH,SAAS,IAAI,GAAG,EAAE;IAiBlB;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0BxE;;OAEG;YACW,qBAAqB;IAmHnC;;OAEG;YACW,mBAAmB;CA4ClC"}
|