@jungjaehoon/mama-os 0.29.2 → 0.30.1
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/dist/agent/agent-loop.d.ts +1 -12
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +6 -21
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/code-act/constants.d.ts.map +1 -1
- package/dist/agent/code-act/constants.js +2 -4
- package/dist/agent/code-act/constants.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +1 -257
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/types.d.ts +1 -1
- package/dist/agent/code-act/types.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts +1 -124
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +17 -1161
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +0 -34
- package/dist/agent/os-agent-capabilities.md +0 -14
- package/dist/agent/tool-registry.d.ts +1 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +0 -176
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +2 -110
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/commands/start.d.ts +18 -13
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +193 -45
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/types.d.ts +21 -0
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +7 -0
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +0 -3
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/operator/board-reground.d.ts +19 -0
- package/dist/operator/board-reground.d.ts.map +1 -0
- package/dist/operator/board-reground.js +31 -0
- package/dist/operator/board-reground.js.map +1 -0
- package/dist/operator/conductor-inbox.d.ts +73 -0
- package/dist/operator/conductor-inbox.d.ts.map +1 -0
- package/dist/operator/conductor-inbox.js +184 -0
- package/dist/operator/conductor-inbox.js.map +1 -0
- package/dist/operator/conductor-session.d.ts +55 -0
- package/dist/operator/conductor-session.d.ts.map +1 -0
- package/dist/operator/conductor-session.js +110 -0
- package/dist/operator/conductor-session.js.map +1 -0
- package/dist/operator/conductor.d.ts +68 -0
- package/dist/operator/conductor.d.ts.map +1 -0
- package/dist/operator/conductor.js +84 -0
- package/dist/operator/conductor.js.map +1 -0
- package/dist/operator/operator-trigger-loop.d.ts +13 -0
- package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
- package/dist/operator/operator-trigger-loop.js +39 -8
- package/dist/operator/operator-trigger-loop.js.map +1 -1
- package/dist/operator/report-run.d.ts +8 -2
- package/dist/operator/report-run.d.ts.map +1 -1
- package/dist/operator/report-run.js +9 -9
- package/dist/operator/report-run.js.map +1 -1
- package/package.json +1 -2
- package/dist/multi-agent/conductor-persona.d.ts +0 -13
- package/dist/multi-agent/conductor-persona.d.ts.map +0 -1
- package/dist/multi-agent/conductor-persona.js +0 -157
- package/dist/multi-agent/conductor-persona.js.map +0 -1
- package/dist/tools/browser-tool.d.ts +0 -164
- package/dist/tools/browser-tool.d.ts.map +0 -1
- package/dist/tools/browser-tool.js +0 -315
- package/dist/tools/browser-tool.js.map +0 -1
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser Tool
|
|
3
|
-
*
|
|
4
|
-
* Playwright-based browser automation for MAMA
|
|
5
|
-
* Migrated from Puppeteer for better stability and multi-browser support
|
|
6
|
-
*/
|
|
7
|
-
export interface BrowserToolConfig {
|
|
8
|
-
/** Headless mode (default: true) */
|
|
9
|
-
headless?: boolean;
|
|
10
|
-
/** Default viewport width */
|
|
11
|
-
viewportWidth?: number;
|
|
12
|
-
/** Default viewport height */
|
|
13
|
-
viewportHeight?: number;
|
|
14
|
-
/** Screenshot output directory */
|
|
15
|
-
screenshotDir?: string;
|
|
16
|
-
/** Browser type: chromium, firefox, webkit (default: chromium) */
|
|
17
|
-
browserType?: 'chromium' | 'firefox' | 'webkit';
|
|
18
|
-
}
|
|
19
|
-
export declare class BrowserTool {
|
|
20
|
-
private config;
|
|
21
|
-
private browser;
|
|
22
|
-
private context;
|
|
23
|
-
private page;
|
|
24
|
-
constructor(config?: BrowserToolConfig);
|
|
25
|
-
/**
|
|
26
|
-
* Launch browser if not already running
|
|
27
|
-
*/
|
|
28
|
-
launch(): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Close browser
|
|
31
|
-
*/
|
|
32
|
-
close(): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Ensure browser is running
|
|
35
|
-
*/
|
|
36
|
-
private ensureBrowser;
|
|
37
|
-
private screenshotPaths;
|
|
38
|
-
private removeOwnedArtifact;
|
|
39
|
-
/**
|
|
40
|
-
* Navigate to URL
|
|
41
|
-
*/
|
|
42
|
-
navigate(url: string): Promise<{
|
|
43
|
-
success: boolean;
|
|
44
|
-
title: string;
|
|
45
|
-
url: string;
|
|
46
|
-
}>;
|
|
47
|
-
/**
|
|
48
|
-
* Take screenshot
|
|
49
|
-
*/
|
|
50
|
-
screenshot(filename?: string, signal?: AbortSignal): Promise<{
|
|
51
|
-
success: boolean;
|
|
52
|
-
path: string;
|
|
53
|
-
}>;
|
|
54
|
-
/**
|
|
55
|
-
* Take full page screenshot
|
|
56
|
-
*/
|
|
57
|
-
screenshotFullPage(filename?: string, signal?: AbortSignal): Promise<{
|
|
58
|
-
success: boolean;
|
|
59
|
-
path: string;
|
|
60
|
-
}>;
|
|
61
|
-
/**
|
|
62
|
-
* Click element by selector
|
|
63
|
-
* Playwright auto-waits for element to be actionable
|
|
64
|
-
*/
|
|
65
|
-
click(selector: string): Promise<{
|
|
66
|
-
success: boolean;
|
|
67
|
-
}>;
|
|
68
|
-
/**
|
|
69
|
-
* Type text into element
|
|
70
|
-
* Playwright auto-waits for element to be ready
|
|
71
|
-
*/
|
|
72
|
-
type(selector: string, text: string): Promise<{
|
|
73
|
-
success: boolean;
|
|
74
|
-
}>;
|
|
75
|
-
/**
|
|
76
|
-
* Wait for selector
|
|
77
|
-
*/
|
|
78
|
-
waitFor(selector: string, timeout?: number): Promise<{
|
|
79
|
-
success: boolean;
|
|
80
|
-
}>;
|
|
81
|
-
/**
|
|
82
|
-
* Get page content (HTML)
|
|
83
|
-
*/
|
|
84
|
-
getContent(): Promise<{
|
|
85
|
-
success: boolean;
|
|
86
|
-
html: string;
|
|
87
|
-
}>;
|
|
88
|
-
/**
|
|
89
|
-
* Get page text content
|
|
90
|
-
*/
|
|
91
|
-
getText(): Promise<{
|
|
92
|
-
success: boolean;
|
|
93
|
-
text: string;
|
|
94
|
-
}>;
|
|
95
|
-
/**
|
|
96
|
-
* Evaluate JavaScript in page
|
|
97
|
-
*/
|
|
98
|
-
evaluate(script: string): Promise<{
|
|
99
|
-
success: boolean;
|
|
100
|
-
result: unknown;
|
|
101
|
-
}>;
|
|
102
|
-
/**
|
|
103
|
-
* Get element text by selector
|
|
104
|
-
*/
|
|
105
|
-
getElementText(selector: string): Promise<{
|
|
106
|
-
success: boolean;
|
|
107
|
-
text: string | null;
|
|
108
|
-
}>;
|
|
109
|
-
/**
|
|
110
|
-
* Get all elements matching selector
|
|
111
|
-
*/
|
|
112
|
-
queryAll(selector: string): Promise<{
|
|
113
|
-
success: boolean;
|
|
114
|
-
count: number;
|
|
115
|
-
texts: string[];
|
|
116
|
-
}>;
|
|
117
|
-
/**
|
|
118
|
-
* Scroll page
|
|
119
|
-
*/
|
|
120
|
-
scroll(direction: 'up' | 'down' | 'top' | 'bottom', amount?: number): Promise<{
|
|
121
|
-
success: boolean;
|
|
122
|
-
}>;
|
|
123
|
-
/**
|
|
124
|
-
* Press keyboard key
|
|
125
|
-
*/
|
|
126
|
-
press(key: string): Promise<{
|
|
127
|
-
success: boolean;
|
|
128
|
-
}>;
|
|
129
|
-
/**
|
|
130
|
-
* Go back
|
|
131
|
-
*/
|
|
132
|
-
goBack(): Promise<{
|
|
133
|
-
success: boolean;
|
|
134
|
-
}>;
|
|
135
|
-
/**
|
|
136
|
-
* Go forward
|
|
137
|
-
*/
|
|
138
|
-
goForward(): Promise<{
|
|
139
|
-
success: boolean;
|
|
140
|
-
}>;
|
|
141
|
-
/**
|
|
142
|
-
* Reload page
|
|
143
|
-
*/
|
|
144
|
-
reload(): Promise<{
|
|
145
|
-
success: boolean;
|
|
146
|
-
}>;
|
|
147
|
-
/**
|
|
148
|
-
* Get current URL
|
|
149
|
-
*/
|
|
150
|
-
getUrl(): string | null;
|
|
151
|
-
/**
|
|
152
|
-
* Check if browser is running
|
|
153
|
-
*/
|
|
154
|
-
isRunning(): boolean;
|
|
155
|
-
/**
|
|
156
|
-
* Take a PDF of the page (Chromium only)
|
|
157
|
-
*/
|
|
158
|
-
pdf(filename?: string): Promise<{
|
|
159
|
-
success: boolean;
|
|
160
|
-
path: string;
|
|
161
|
-
}>;
|
|
162
|
-
}
|
|
163
|
-
export declare function getBrowserTool(config?: BrowserToolConfig): BrowserTool;
|
|
164
|
-
//# sourceMappingURL=browser-tool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-tool.d.ts","sourceRoot":"","sources":["../../src/tools/browser-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Browser Tool
|
|
4
|
-
*
|
|
5
|
-
* Playwright-based browser automation for MAMA
|
|
6
|
-
* Migrated from Puppeteer for better stability and multi-browser support
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.BrowserTool = void 0;
|
|
10
|
-
exports.getBrowserTool = getBrowserTool;
|
|
11
|
-
const node_fs_1 = require("node:fs");
|
|
12
|
-
const node_path_1 = require("node:path");
|
|
13
|
-
const node_crypto_1 = require("node:crypto");
|
|
14
|
-
const DEFAULT_CONFIG = {
|
|
15
|
-
headless: true,
|
|
16
|
-
viewportWidth: 1280,
|
|
17
|
-
viewportHeight: 800,
|
|
18
|
-
screenshotDir: '/tmp/mama-screenshots',
|
|
19
|
-
browserType: 'chromium',
|
|
20
|
-
};
|
|
21
|
-
class BrowserTool {
|
|
22
|
-
config;
|
|
23
|
-
browser = null;
|
|
24
|
-
context = null;
|
|
25
|
-
page = null;
|
|
26
|
-
constructor(config = {}) {
|
|
27
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Launch browser if not already running
|
|
31
|
-
*/
|
|
32
|
-
async launch() {
|
|
33
|
-
if (this.browser) {
|
|
34
|
-
console.log('[Browser] Already running');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
console.log(`[Browser] Launching ${this.config.browserType}...`);
|
|
38
|
-
// Dynamic import to avoid bundling issues
|
|
39
|
-
const playwright = await import('playwright');
|
|
40
|
-
// Select browser type
|
|
41
|
-
const browserType = playwright[this.config.browserType];
|
|
42
|
-
this.browser = await browserType.launch({
|
|
43
|
-
headless: this.config.headless,
|
|
44
|
-
});
|
|
45
|
-
this.context = await this.browser.newContext({
|
|
46
|
-
viewport: {
|
|
47
|
-
width: this.config.viewportWidth,
|
|
48
|
-
height: this.config.viewportHeight,
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
this.page = await this.context.newPage();
|
|
52
|
-
console.log('[Browser] Ready');
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Close browser
|
|
56
|
-
*/
|
|
57
|
-
async close() {
|
|
58
|
-
if (this.browser) {
|
|
59
|
-
await this.browser.close();
|
|
60
|
-
this.browser = null;
|
|
61
|
-
this.context = null;
|
|
62
|
-
this.page = null;
|
|
63
|
-
console.log('[Browser] Closed');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Ensure browser is running
|
|
68
|
-
*/
|
|
69
|
-
async ensureBrowser() {
|
|
70
|
-
if (!this.browser || !this.page) {
|
|
71
|
-
await this.launch();
|
|
72
|
-
}
|
|
73
|
-
return this.page;
|
|
74
|
-
}
|
|
75
|
-
screenshotPaths(filename, prefix) {
|
|
76
|
-
const configuredRoot = (0, node_path_1.resolve)(this.config.screenshotDir);
|
|
77
|
-
(0, node_fs_1.mkdirSync)(configuredRoot, { recursive: true });
|
|
78
|
-
const root = (0, node_fs_1.realpathSync)(configuredRoot);
|
|
79
|
-
const name = filename?.trim() || `${prefix}-${Date.now()}-${(0, node_crypto_1.randomUUID)()}.png`;
|
|
80
|
-
if (name !== (0, node_path_1.basename)(name)) {
|
|
81
|
-
throw new Error('Screenshot filename must not contain directory components');
|
|
82
|
-
}
|
|
83
|
-
const outputPath = (0, node_path_1.resolve)(root, name);
|
|
84
|
-
const relativePath = (0, node_path_1.relative)(root, outputPath);
|
|
85
|
-
if (!relativePath || relativePath.startsWith('..') || (0, node_path_1.isAbsolute)(relativePath)) {
|
|
86
|
-
throw new Error('Screenshot filename must resolve inside the configured screenshot directory');
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
outputPath,
|
|
90
|
-
temporaryPath: (0, node_path_1.resolve)(root, `.mama-screenshot-${(0, node_crypto_1.randomUUID)()}.tmp.png`),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
removeOwnedArtifact(path) {
|
|
94
|
-
if ((0, node_fs_1.existsSync)(path)) {
|
|
95
|
-
(0, node_fs_1.unlinkSync)(path);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Navigate to URL
|
|
100
|
-
*/
|
|
101
|
-
async navigate(url) {
|
|
102
|
-
const page = await this.ensureBrowser();
|
|
103
|
-
console.log(`[Browser] Navigating to: ${url}`);
|
|
104
|
-
// Use 'load' instead of 'networkidle' for faster page capture
|
|
105
|
-
// networkidle waits for ALL network requests to finish (ads, analytics, etc.)
|
|
106
|
-
// which can take 30+ seconds on heavy sites like Naver
|
|
107
|
-
await page.goto(url, { waitUntil: 'load', timeout: 15000 });
|
|
108
|
-
const title = await page.title();
|
|
109
|
-
const currentUrl = page.url();
|
|
110
|
-
return { success: true, title, url: currentUrl };
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Take screenshot
|
|
114
|
-
*/
|
|
115
|
-
async screenshot(filename, signal) {
|
|
116
|
-
signal?.throwIfAborted();
|
|
117
|
-
const page = await this.ensureBrowser();
|
|
118
|
-
signal?.throwIfAborted();
|
|
119
|
-
const { outputPath, temporaryPath } = this.screenshotPaths(filename, 'screenshot');
|
|
120
|
-
try {
|
|
121
|
-
await page.screenshot({ path: temporaryPath, fullPage: false });
|
|
122
|
-
signal?.throwIfAborted();
|
|
123
|
-
(0, node_fs_1.copyFileSync)(temporaryPath, outputPath, node_fs_1.constants.COPYFILE_EXCL);
|
|
124
|
-
this.removeOwnedArtifact(temporaryPath);
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
this.removeOwnedArtifact(temporaryPath);
|
|
128
|
-
throw error;
|
|
129
|
-
}
|
|
130
|
-
console.log(`[Browser] Screenshot saved: ${outputPath}`);
|
|
131
|
-
return { success: true, path: outputPath };
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Take full page screenshot
|
|
135
|
-
*/
|
|
136
|
-
async screenshotFullPage(filename, signal) {
|
|
137
|
-
signal?.throwIfAborted();
|
|
138
|
-
const page = await this.ensureBrowser();
|
|
139
|
-
signal?.throwIfAborted();
|
|
140
|
-
const { outputPath, temporaryPath } = this.screenshotPaths(filename, 'fullpage');
|
|
141
|
-
try {
|
|
142
|
-
await page.screenshot({ path: temporaryPath, fullPage: true });
|
|
143
|
-
signal?.throwIfAborted();
|
|
144
|
-
(0, node_fs_1.copyFileSync)(temporaryPath, outputPath, node_fs_1.constants.COPYFILE_EXCL);
|
|
145
|
-
this.removeOwnedArtifact(temporaryPath);
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
this.removeOwnedArtifact(temporaryPath);
|
|
149
|
-
throw error;
|
|
150
|
-
}
|
|
151
|
-
console.log(`[Browser] Full page screenshot saved: ${outputPath}`);
|
|
152
|
-
return { success: true, path: outputPath };
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Click element by selector
|
|
156
|
-
* Playwright auto-waits for element to be actionable
|
|
157
|
-
*/
|
|
158
|
-
async click(selector) {
|
|
159
|
-
const page = await this.ensureBrowser();
|
|
160
|
-
console.log(`[Browser] Clicking: ${selector}`);
|
|
161
|
-
await page.click(selector);
|
|
162
|
-
return { success: true };
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Type text into element
|
|
166
|
-
* Playwright auto-waits for element to be ready
|
|
167
|
-
*/
|
|
168
|
-
async type(selector, text) {
|
|
169
|
-
const page = await this.ensureBrowser();
|
|
170
|
-
console.log(`[Browser] Typing into: ${selector}`);
|
|
171
|
-
await page.fill(selector, text);
|
|
172
|
-
return { success: true };
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Wait for selector
|
|
176
|
-
*/
|
|
177
|
-
async waitFor(selector, timeout = 10000) {
|
|
178
|
-
const page = await this.ensureBrowser();
|
|
179
|
-
console.log(`[Browser] Waiting for: ${selector}`);
|
|
180
|
-
await page.waitForSelector(selector, { timeout });
|
|
181
|
-
return { success: true };
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Get page content (HTML)
|
|
185
|
-
*/
|
|
186
|
-
async getContent() {
|
|
187
|
-
const page = await this.ensureBrowser();
|
|
188
|
-
const html = await page.content();
|
|
189
|
-
return { success: true, html };
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Get page text content
|
|
193
|
-
*/
|
|
194
|
-
async getText() {
|
|
195
|
-
const page = await this.ensureBrowser();
|
|
196
|
-
const text = await page.innerText('body');
|
|
197
|
-
return { success: true, text };
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Evaluate JavaScript in page
|
|
201
|
-
*/
|
|
202
|
-
async evaluate(script) {
|
|
203
|
-
const page = await this.ensureBrowser();
|
|
204
|
-
console.log(`[Browser] Evaluating script...`);
|
|
205
|
-
const result = await page.evaluate(script);
|
|
206
|
-
return { success: true, result };
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Get element text by selector
|
|
210
|
-
*/
|
|
211
|
-
async getElementText(selector) {
|
|
212
|
-
const page = await this.ensureBrowser();
|
|
213
|
-
const text = await page.textContent(selector);
|
|
214
|
-
return { success: true, text };
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Get all elements matching selector
|
|
218
|
-
*/
|
|
219
|
-
async queryAll(selector) {
|
|
220
|
-
const page = await this.ensureBrowser();
|
|
221
|
-
const elements = await page.locator(selector).all();
|
|
222
|
-
const texts = await Promise.all(elements.map((el) => el.textContent() || ''));
|
|
223
|
-
return { success: true, count: elements.length, texts: texts.filter(Boolean) };
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Scroll page
|
|
227
|
-
*/
|
|
228
|
-
async scroll(direction, amount = 500) {
|
|
229
|
-
const page = await this.ensureBrowser();
|
|
230
|
-
switch (direction) {
|
|
231
|
-
case 'up':
|
|
232
|
-
await page.evaluate(`window.scrollBy(0, -${amount})`);
|
|
233
|
-
break;
|
|
234
|
-
case 'down':
|
|
235
|
-
await page.evaluate(`window.scrollBy(0, ${amount})`);
|
|
236
|
-
break;
|
|
237
|
-
case 'top':
|
|
238
|
-
await page.evaluate('window.scrollTo(0, 0)');
|
|
239
|
-
break;
|
|
240
|
-
case 'bottom':
|
|
241
|
-
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
return { success: true };
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Press keyboard key
|
|
248
|
-
*/
|
|
249
|
-
async press(key) {
|
|
250
|
-
const page = await this.ensureBrowser();
|
|
251
|
-
await page.keyboard.press(key);
|
|
252
|
-
return { success: true };
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Go back
|
|
256
|
-
*/
|
|
257
|
-
async goBack() {
|
|
258
|
-
const page = await this.ensureBrowser();
|
|
259
|
-
await page.goBack();
|
|
260
|
-
return { success: true };
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Go forward
|
|
264
|
-
*/
|
|
265
|
-
async goForward() {
|
|
266
|
-
const page = await this.ensureBrowser();
|
|
267
|
-
await page.goForward();
|
|
268
|
-
return { success: true };
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Reload page
|
|
272
|
-
*/
|
|
273
|
-
async reload() {
|
|
274
|
-
const page = await this.ensureBrowser();
|
|
275
|
-
await page.reload();
|
|
276
|
-
return { success: true };
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Get current URL
|
|
280
|
-
*/
|
|
281
|
-
getUrl() {
|
|
282
|
-
return this.page?.url() || null;
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Check if browser is running
|
|
286
|
-
*/
|
|
287
|
-
isRunning() {
|
|
288
|
-
return this.browser !== null;
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Take a PDF of the page (Chromium only)
|
|
292
|
-
*/
|
|
293
|
-
async pdf(filename) {
|
|
294
|
-
const page = await this.ensureBrowser();
|
|
295
|
-
const { mkdirSync, existsSync } = await import('fs');
|
|
296
|
-
if (!existsSync(this.config.screenshotDir)) {
|
|
297
|
-
mkdirSync(this.config.screenshotDir, { recursive: true });
|
|
298
|
-
}
|
|
299
|
-
const name = filename || `page-${Date.now()}.pdf`;
|
|
300
|
-
const path = `${this.config.screenshotDir}/${name}`;
|
|
301
|
-
await page.pdf({ path, format: 'A4' });
|
|
302
|
-
console.log(`[Browser] PDF saved: ${path}`);
|
|
303
|
-
return { success: true, path };
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
exports.BrowserTool = BrowserTool;
|
|
307
|
-
// Singleton instance
|
|
308
|
-
let instance = null;
|
|
309
|
-
function getBrowserTool(config) {
|
|
310
|
-
if (!instance) {
|
|
311
|
-
instance = new BrowserTool(config);
|
|
312
|
-
}
|
|
313
|
-
return instance;
|
|
314
|
-
}
|
|
315
|
-
//# sourceMappingURL=browser-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-tool.js","sourceRoot":"","sources":["../../src/tools/browser-tool.ts"],"names":[],"mappings":"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"}
|