dipclaw 0.1.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 (53) hide show
  1. package/config.example.json +26 -0
  2. package/dist/agent/agent.d.ts +85 -0
  3. package/dist/agent/agent.js +725 -0
  4. package/dist/agent/agent.js.map +1 -0
  5. package/dist/agent/memory.d.ts +17 -0
  6. package/dist/agent/memory.js +92 -0
  7. package/dist/agent/memory.js.map +1 -0
  8. package/dist/agent/scheduler.d.ts +35 -0
  9. package/dist/agent/scheduler.js +154 -0
  10. package/dist/agent/scheduler.js.map +1 -0
  11. package/dist/agent/skill-generator.d.ts +37 -0
  12. package/dist/agent/skill-generator.js +263 -0
  13. package/dist/agent/skill-generator.js.map +1 -0
  14. package/dist/agent/task-runner.d.ts +31 -0
  15. package/dist/agent/task-runner.js +242 -0
  16. package/dist/agent/task-runner.js.map +1 -0
  17. package/dist/browser/actions.d.ts +28 -0
  18. package/dist/browser/actions.js +212 -0
  19. package/dist/browser/actions.js.map +1 -0
  20. package/dist/browser/manager.d.ts +17 -0
  21. package/dist/browser/manager.js +249 -0
  22. package/dist/browser/manager.js.map +1 -0
  23. package/dist/browser/script-runner.d.ts +49 -0
  24. package/dist/browser/script-runner.js +137 -0
  25. package/dist/browser/script-runner.js.map +1 -0
  26. package/dist/browser/snapshot.d.ts +15 -0
  27. package/dist/browser/snapshot.js +38 -0
  28. package/dist/browser/snapshot.js.map +1 -0
  29. package/dist/config/types.d.ts +62 -0
  30. package/dist/config/types.js +47 -0
  31. package/dist/config/types.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.js +219 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/llm/client.d.ts +3 -0
  36. package/dist/llm/client.js +503 -0
  37. package/dist/llm/client.js.map +1 -0
  38. package/dist/llm/tools.d.ts +5 -0
  39. package/dist/llm/tools.js +94 -0
  40. package/dist/llm/tools.js.map +1 -0
  41. package/dist/llm/types.d.ts +49 -0
  42. package/dist/llm/types.js +2 -0
  43. package/dist/llm/types.js.map +1 -0
  44. package/dist/logging/logger.d.ts +17 -0
  45. package/dist/logging/logger.js +46 -0
  46. package/dist/logging/logger.js.map +1 -0
  47. package/dist/telegram/bot.d.ts +15 -0
  48. package/dist/telegram/bot.js +279 -0
  49. package/dist/telegram/bot.js.map +1 -0
  50. package/dist/tui/tui.d.ts +12 -0
  51. package/dist/tui/tui.js +176 -0
  52. package/dist/tui/tui.js.map +1 -0
  53. package/package.json +53 -0
@@ -0,0 +1,212 @@
1
+ import { takeSnapshot, getElementRef } from "./snapshot.js";
2
+ export class BrowserActions {
3
+ browser;
4
+ logger = null;
5
+ constructor(browser) {
6
+ this.browser = browser;
7
+ }
8
+ setLogger(logger) {
9
+ this.logger = logger;
10
+ }
11
+ async navigate(url) {
12
+ const page = await this.browser.getActivePage();
13
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
14
+ this.logger?.log("navigate", { url });
15
+ return `Navigated to ${url}`;
16
+ }
17
+ async snapshot() {
18
+ const page = await this.browser.getActivePage();
19
+ const result = await takeSnapshot(page);
20
+ const url = page.url();
21
+ const title = await page.title();
22
+ this.logger?.log("snapshot", {
23
+ url,
24
+ title,
25
+ elements: result.elementRefs.size,
26
+ });
27
+ return `Page: ${title}\nURL: ${url}\n\n${result.text}`;
28
+ }
29
+ async click(ref) {
30
+ const elemRef = getElementRef(ref);
31
+ if (!elemRef) {
32
+ this.logger?.log("click", { ref, error: "ref not found" }, false);
33
+ return `Error: element reference '${ref}' not found. Take a snapshot first.`;
34
+ }
35
+ const page = await this.browser.getActivePage();
36
+ try {
37
+ const locator = page.getByRole(elemRef.role, {
38
+ name: elemRef.name,
39
+ exact: false,
40
+ });
41
+ await locator.first().click({ timeout: 5000 });
42
+ this.logger?.log("click", {
43
+ ref,
44
+ role: elemRef.role,
45
+ name: elemRef.name,
46
+ });
47
+ return `Clicked ${elemRef.role}: "${elemRef.name}"`;
48
+ }
49
+ catch (err) {
50
+ const msg = err instanceof Error ? err.message : String(err);
51
+ this.logger?.log("click", { ref, role: elemRef.role, name: elemRef.name, error: msg }, false);
52
+ return `Error clicking ${ref}: ${msg}`;
53
+ }
54
+ }
55
+ async type(ref, text, clear = true) {
56
+ const elemRef = getElementRef(ref);
57
+ if (!elemRef) {
58
+ this.logger?.log("type", { ref, text, error: "ref not found" }, false);
59
+ return `Error: element reference '${ref}' not found. Take a snapshot first.`;
60
+ }
61
+ const page = await this.browser.getActivePage();
62
+ try {
63
+ const locator = page.getByRole(elemRef.role, {
64
+ name: elemRef.name,
65
+ exact: false,
66
+ });
67
+ if (clear) {
68
+ await locator.first().fill(text, { timeout: 5000 });
69
+ }
70
+ else {
71
+ await locator.first().pressSequentially(text, { timeout: 5000 });
72
+ }
73
+ this.logger?.log("type", {
74
+ ref,
75
+ text,
76
+ clear,
77
+ role: elemRef.role,
78
+ name: elemRef.name,
79
+ });
80
+ return `Typed "${text}" into ${elemRef.role}: "${elemRef.name}"`;
81
+ }
82
+ catch (err) {
83
+ const msg = err instanceof Error ? err.message : String(err);
84
+ this.logger?.log("type", { ref, text, role: elemRef.role, name: elemRef.name, error: msg }, false);
85
+ return `Error typing into ${ref}: ${msg}`;
86
+ }
87
+ }
88
+ async scroll(direction, amount = 500, ref) {
89
+ const page = await this.browser.getActivePage();
90
+ const delta = direction === "down" ? amount : -amount;
91
+ if (ref) {
92
+ const elemRef = getElementRef(ref);
93
+ if (!elemRef) {
94
+ return `Error: element reference '${ref}' not found.`;
95
+ }
96
+ const locator = page.getByRole(elemRef.role, {
97
+ name: elemRef.name,
98
+ });
99
+ await locator.first().evaluate((el, d) => el.scrollBy(0, d), delta);
100
+ }
101
+ else {
102
+ await page.mouse.wheel(0, delta);
103
+ }
104
+ this.logger?.log("scroll", { direction, amount, ref });
105
+ return `Scrolled ${direction} by ${amount}px`;
106
+ }
107
+ async screenshot(fullPage = false) {
108
+ const page = await this.browser.getActivePage();
109
+ const buffer = await page.screenshot({
110
+ fullPage,
111
+ type: "jpeg",
112
+ quality: 75,
113
+ });
114
+ const base64 = buffer.toString("base64");
115
+ this.logger?.log("screenshot", { fullPage, size: buffer.length });
116
+ return { base64, text: `Screenshot taken (${buffer.length} bytes)` };
117
+ }
118
+ async evaluate(script) {
119
+ const page = await this.browser.getActivePage();
120
+ try {
121
+ const result = await page.evaluate(script);
122
+ const resultStr = typeof result === "string" ? result : JSON.stringify(result, null, 2);
123
+ this.logger?.log("evaluate", { script, resultLength: resultStr.length });
124
+ return resultStr || "(no return value)";
125
+ }
126
+ catch (err) {
127
+ const msg = err instanceof Error ? err.message : String(err);
128
+ this.logger?.log("evaluate", { script, error: msg }, false);
129
+ return `Error: ${msg}`;
130
+ }
131
+ }
132
+ async wait(opts) {
133
+ const page = await this.browser.getActivePage();
134
+ const timeout = opts.timeout || 10000;
135
+ try {
136
+ if (opts.selector) {
137
+ await page.waitForSelector(opts.selector, { timeout });
138
+ this.logger?.log("wait", { selector: opts.selector });
139
+ return `Found element matching: ${opts.selector}`;
140
+ }
141
+ else if (opts.text) {
142
+ await page.getByText(opts.text).first().waitFor({ timeout });
143
+ this.logger?.log("wait", { text: opts.text });
144
+ return `Found text: "${opts.text}"`;
145
+ }
146
+ else {
147
+ await page.waitForLoadState("networkidle", { timeout });
148
+ this.logger?.log("wait", { state: "networkidle" });
149
+ return "Page loaded (network idle)";
150
+ }
151
+ }
152
+ catch (err) {
153
+ const msg = err instanceof Error ? err.message : String(err);
154
+ this.logger?.log("wait", { ...opts, error: msg }, false);
155
+ return `Wait timeout: ${msg}`;
156
+ }
157
+ }
158
+ async pressKey(key) {
159
+ const page = await this.browser.getActivePage();
160
+ await page.keyboard.press(key);
161
+ this.logger?.log("press", { key });
162
+ return `Pressed key: ${key}`;
163
+ }
164
+ async selectOption(ref, value) {
165
+ const elemRef = getElementRef(ref);
166
+ if (!elemRef) {
167
+ return `Error: element reference '${ref}' not found.`;
168
+ }
169
+ const page = await this.browser.getActivePage();
170
+ try {
171
+ const locator = page.getByRole(elemRef.role, {
172
+ name: elemRef.name,
173
+ });
174
+ await locator.first().selectOption(value, { timeout: 5000 });
175
+ this.logger?.log("select", { ref, value, name: elemRef.name });
176
+ return `Selected "${value}" in ${elemRef.role}: "${elemRef.name}"`;
177
+ }
178
+ catch (err) {
179
+ const msg = err instanceof Error ? err.message : String(err);
180
+ return `Error selecting option: ${msg}`;
181
+ }
182
+ }
183
+ async listTabs() {
184
+ const pages = await this.browser.getPages();
185
+ const tabs = await Promise.all(pages.map(async (p, i) => {
186
+ const title = await p.title();
187
+ return `[${i}] ${title} - ${p.url()}`;
188
+ }));
189
+ return tabs.length > 0 ? tabs.join("\n") : "(no tabs open)";
190
+ }
191
+ async closeTab(index) {
192
+ const pages = await this.browser.getPages();
193
+ if (index < 0 || index >= pages.length) {
194
+ return `Error: invalid tab index ${index}. Have ${pages.length} tabs.`;
195
+ }
196
+ const title = await pages[index].title();
197
+ await pages[index].close();
198
+ this.logger?.log("close_tab", { index, title });
199
+ return `Closed tab [${index}]: ${title}`;
200
+ }
201
+ async focusTab(index) {
202
+ const pages = await this.browser.getPages();
203
+ if (index < 0 || index >= pages.length) {
204
+ return `Error: invalid tab index ${index}. Have ${pages.length} tabs.`;
205
+ }
206
+ await pages[index].bringToFront();
207
+ const title = await pages[index].title();
208
+ this.logger?.log("focus_tab", { index, title });
209
+ return `Focused tab [${index}]: ${title}`;
210
+ }
211
+ }
212
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/browser/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Page } from "playwright";
2
+ import { type DipclawConfig } from "../config/types.js";
3
+ export declare class BrowserManager {
4
+ private browser;
5
+ private context;
6
+ private chromeProcess;
7
+ private config;
8
+ private proxyAuth;
9
+ constructor(config: DipclawConfig);
10
+ launch(): Promise<void>;
11
+ getActivePage(): Promise<Page>;
12
+ getPages(): Promise<Page[]>;
13
+ newPage(): Promise<Page>;
14
+ close(): Promise<void>;
15
+ private setupProxyAuth;
16
+ isLaunched(): boolean;
17
+ }
@@ -0,0 +1,249 @@
1
+ import { chromium, } from "playwright";
2
+ import { spawn } from "node:child_process";
3
+ import path from "node:path";
4
+ import fs from "node:fs";
5
+ import net from "node:net";
6
+ import os from "node:os";
7
+ export class BrowserManager {
8
+ browser = null;
9
+ context = null;
10
+ chromeProcess = null;
11
+ config;
12
+ proxyAuth = null;
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ async launch() {
17
+ if (this.context)
18
+ return;
19
+ const userDataDir = path.join(this.config.workspace, "browser-data");
20
+ fs.mkdirSync(userDataDir, { recursive: true });
21
+ const chromePath = findChromeExecutable();
22
+ if (!chromePath) {
23
+ throw new Error("Chrome not found. Please install Google Chrome or set --chrome-path.");
24
+ }
25
+ const port = await findFreePort();
26
+ // Extract proxy credentials if configured
27
+ if (this.config.browser.proxy) {
28
+ const p = this.config.browser.proxy;
29
+ if (p.username && p.password) {
30
+ this.proxyAuth = { username: p.username, password: p.password };
31
+ }
32
+ }
33
+ const args = buildChromeArgs(userDataDir, port, this.config);
34
+ // Spawn system Chrome
35
+ this.chromeProcess = spawn(chromePath, args, {
36
+ stdio: ["ignore", "ignore", "pipe"],
37
+ env: { ...process.env, HOME: os.homedir() },
38
+ detached: false,
39
+ });
40
+ // Wait for Chrome to start and expose the CDP port
41
+ const endpoint = await waitForCdpEndpoint(port);
42
+ // Connect Playwright via CDP
43
+ this.browser = await chromium.connectOverCDP(endpoint);
44
+ this.context = this.browser.contexts()[0] ?? (await this.browser.newContext());
45
+ // Set up proxy authentication if credentials are present
46
+ if (this.proxyAuth) {
47
+ for (const page of this.context.pages()) {
48
+ await this.setupProxyAuth(page);
49
+ }
50
+ this.context.on("page", (page) => this.setupProxyAuth(page));
51
+ }
52
+ const proxyInfo = this.config.browser.proxy
53
+ ? `${this.config.browser.proxy.protocol}://${this.config.browser.proxy.host}:${this.config.browser.proxy.port}`
54
+ : "none";
55
+ console.log(`🌐 Browser launched (Chrome @ ${chromePath}, profile: ${this.config.name}, CDP port: ${port}, proxy: ${proxyInfo})`);
56
+ }
57
+ async getActivePage() {
58
+ if (!this.context) {
59
+ await this.launch();
60
+ }
61
+ const pages = this.context.pages();
62
+ if (pages.length === 0) {
63
+ return await this.context.newPage();
64
+ }
65
+ return pages[pages.length - 1];
66
+ }
67
+ async getPages() {
68
+ if (!this.context) {
69
+ await this.launch();
70
+ }
71
+ return this.context.pages();
72
+ }
73
+ async newPage() {
74
+ if (!this.context) {
75
+ await this.launch();
76
+ }
77
+ return await this.context.newPage();
78
+ }
79
+ async close() {
80
+ if (this.browser) {
81
+ await this.browser.close().catch(() => { });
82
+ this.browser = null;
83
+ this.context = null;
84
+ }
85
+ if (this.chromeProcess) {
86
+ const proc = this.chromeProcess;
87
+ this.chromeProcess = null;
88
+ // Wait for Chrome to fully exit and flush data (cookies, sessions) to disk
89
+ await new Promise((resolve) => {
90
+ proc.on("exit", () => resolve());
91
+ proc.kill("SIGTERM");
92
+ // Force kill after 5s if Chrome hangs
93
+ setTimeout(() => {
94
+ proc.kill("SIGKILL");
95
+ resolve();
96
+ }, 5000);
97
+ });
98
+ }
99
+ }
100
+ async setupProxyAuth(page) {
101
+ if (!this.proxyAuth)
102
+ return;
103
+ const { username, password } = this.proxyAuth;
104
+ const client = await this.context.newCDPSession(page);
105
+ await client.send("Fetch.enable", { handleAuthRequests: true });
106
+ client.on("Fetch.authRequired", (event) => {
107
+ client
108
+ .send("Fetch.continueWithAuth", {
109
+ requestId: event.requestId,
110
+ authChallengeResponse: {
111
+ response: "ProvideCredentials",
112
+ username,
113
+ password,
114
+ },
115
+ })
116
+ .catch(() => { });
117
+ });
118
+ client.on("Fetch.requestPaused", (event) => {
119
+ client
120
+ .send("Fetch.continueRequest", { requestId: event.requestId })
121
+ .catch(() => { });
122
+ });
123
+ }
124
+ isLaunched() {
125
+ return this.context !== null;
126
+ }
127
+ }
128
+ // --- Chrome executable detection ---
129
+ function findChromeExecutable() {
130
+ const platform = process.platform;
131
+ if (platform === "darwin") {
132
+ const paths = [
133
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
134
+ "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
135
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
136
+ "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
137
+ "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
138
+ ];
139
+ for (const p of paths) {
140
+ if (fs.existsSync(p))
141
+ return p;
142
+ }
143
+ }
144
+ else if (platform === "linux") {
145
+ const paths = [
146
+ "/usr/bin/google-chrome",
147
+ "/usr/bin/google-chrome-stable",
148
+ "/usr/bin/chromium",
149
+ "/usr/bin/chromium-browser",
150
+ "/snap/bin/chromium",
151
+ "/usr/bin/microsoft-edge",
152
+ ];
153
+ for (const p of paths) {
154
+ if (fs.existsSync(p))
155
+ return p;
156
+ }
157
+ }
158
+ else if (platform === "win32") {
159
+ const prefixes = [
160
+ process.env["PROGRAMFILES"] || "C:\\Program Files",
161
+ process.env["PROGRAMFILES(X86)"] || "C:\\Program Files (x86)",
162
+ process.env["LOCALAPPDATA"] || "",
163
+ ];
164
+ const suffixes = [
165
+ "Google\\Chrome\\Application\\chrome.exe",
166
+ "Microsoft\\Edge\\Application\\msedge.exe",
167
+ "BraveSoftware\\Brave-Browser\\Application\\brave.exe",
168
+ ];
169
+ for (const prefix of prefixes) {
170
+ if (!prefix)
171
+ continue;
172
+ for (const suffix of suffixes) {
173
+ const p = path.join(prefix, suffix);
174
+ if (fs.existsSync(p))
175
+ return p;
176
+ }
177
+ }
178
+ }
179
+ return null;
180
+ }
181
+ // --- Chrome launch arguments ---
182
+ function buildChromeArgs(userDataDir, port, config) {
183
+ const args = [
184
+ `--remote-debugging-port=${port}`,
185
+ `--user-data-dir=${userDataDir}`,
186
+ "--no-first-run",
187
+ "--no-default-browser-check",
188
+ "--use-mock-keychain",
189
+ "--disable-background-networking",
190
+ "--disable-default-apps",
191
+ "--disable-sync",
192
+ "--disable-translate",
193
+ "--metrics-recording-only",
194
+ "--no-default-browser-check",
195
+ ];
196
+ if (config.browser.headless) {
197
+ args.push("--headless=new");
198
+ }
199
+ if (config.browser.proxy) {
200
+ // Chrome's --proxy-server doesn't support inline auth, pass host:port only
201
+ const p = config.browser.proxy;
202
+ args.push(`--proxy-server=${p.protocol}://${p.host}:${p.port}`);
203
+ }
204
+ if (config.browser.viewport) {
205
+ const vp = config.browser.viewport;
206
+ args.push(`--window-size=${vp.width},${vp.height}`);
207
+ }
208
+ else {
209
+ args.push("--start-maximized");
210
+ }
211
+ return args;
212
+ }
213
+ // --- Port & CDP helpers ---
214
+ function findFreePort() {
215
+ return new Promise((resolve, reject) => {
216
+ const server = net.createServer();
217
+ server.listen(0, () => {
218
+ const addr = server.address();
219
+ if (addr && typeof addr === "object") {
220
+ const port = addr.port;
221
+ server.close(() => resolve(port));
222
+ }
223
+ else {
224
+ reject(new Error("Failed to find free port"));
225
+ }
226
+ });
227
+ server.on("error", reject);
228
+ });
229
+ }
230
+ async function waitForCdpEndpoint(port, timeoutMs = 15000) {
231
+ const start = Date.now();
232
+ while (Date.now() - start < timeoutMs) {
233
+ try {
234
+ const res = await fetch(`http://127.0.0.1:${port}/json/version`);
235
+ if (res.ok) {
236
+ const json = (await res.json());
237
+ if (json.webSocketDebuggerUrl) {
238
+ return json.webSocketDebuggerUrl;
239
+ }
240
+ }
241
+ }
242
+ catch {
243
+ // Chrome not ready yet
244
+ }
245
+ await new Promise((r) => setTimeout(r, 200));
246
+ }
247
+ throw new Error(`Chrome did not start within ${timeoutMs}ms (CDP port ${port})`);
248
+ }
249
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/browser/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { BrowserActions } from "./actions.js";
2
+ import type { LlmClient } from "../llm/types.js";
3
+ import type { ExecutionLogger } from "../logging/logger.js";
4
+ export interface SkillStep {
5
+ action: string;
6
+ params: Record<string, unknown>;
7
+ description?: string;
8
+ }
9
+ export interface SkillScript {
10
+ name: string;
11
+ description: string;
12
+ steps: SkillStep[];
13
+ notes?: string[];
14
+ }
15
+ /** Result of executing a single step */
16
+ export interface StepResult {
17
+ index: number;
18
+ action: string;
19
+ success: boolean;
20
+ usedFallback: boolean;
21
+ /** What the LLM actually did when falling back */
22
+ fallbackAction?: string;
23
+ error?: string;
24
+ }
25
+ /** Structured report of a full skill execution */
26
+ export interface ExecutionReport {
27
+ skillName: string;
28
+ totalSteps: number;
29
+ successCount: number;
30
+ fallbackCount: number;
31
+ failedCount: number;
32
+ steps: StepResult[];
33
+ /** Overall success — all steps completed (with or without fallback) */
34
+ completed: boolean;
35
+ }
36
+ /**
37
+ * Runs a skill script step-by-step.
38
+ * Each step tries direct execution first; on failure, falls back to LLM.
39
+ */
40
+ export declare class ScriptRunner {
41
+ private actions;
42
+ private llmClient;
43
+ private logger;
44
+ constructor(actions: BrowserActions, llmClient: LlmClient, logger: ExecutionLogger);
45
+ run(script: SkillScript, variables?: Record<string, string>): Promise<ExecutionReport>;
46
+ private executeStep;
47
+ private llmFallback;
48
+ private resolveVariables;
49
+ }