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,263 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ExecutionLogger } from "../logging/logger.js";
4
+ export class SkillGenerator {
5
+ skillsDir;
6
+ llmClient;
7
+ constructor(workspace, llmClient) {
8
+ this.skillsDir = path.join(workspace, "skills");
9
+ this.llmClient = llmClient;
10
+ fs.mkdirSync(this.skillsDir, { recursive: true });
11
+ }
12
+ /** Generate a skill from an execution log file */
13
+ async generate(logFilePath) {
14
+ const entries = ExecutionLogger.readLog(logFilePath);
15
+ if (entries.length === 0) {
16
+ return "Error: log file is empty.";
17
+ }
18
+ // Filter to actionable steps (exclude snapshots used for reading)
19
+ const actionEntries = entries.filter((e) => e.success && e.action !== "snapshot" && e.action !== "screenshot");
20
+ const logSummary = entries
21
+ .map((e) => `Step ${e.step}: ${e.action} ${JSON.stringify(Object.fromEntries(Object.entries(e).filter(([k]) => !["step", "action", "timestamp", "success"].includes(k))))} (${e.success ? "ok" : "FAILED"})`)
22
+ .join("\n");
23
+ // Ask LLM to generate a structured skill
24
+ const response = await this.llmClient.chat([
25
+ {
26
+ role: "user",
27
+ content: `Based on this browser automation execution log, generate a reusable skill definition.
28
+
29
+ The skill should capture the essential steps that can be replayed later. Use CSS selectors or descriptive locators rather than element references (e1, e2, etc.) since those are ephemeral.
30
+
31
+ Execution log:
32
+ ${logSummary}
33
+
34
+ Please respond with a JSON object in this exact format:
35
+ {
36
+ "name": "skill-name",
37
+ "description": "What this skill does",
38
+ "steps": [
39
+ { "action": "navigate", "params": { "url": "..." }, "description": "..." },
40
+ { "action": "type", "params": { "ref": "css-selector-or-role", "text": "..." }, "description": "..." }
41
+ ],
42
+ "notes": ["any important notes about this skill"]
43
+ }
44
+
45
+ Use {{variable_name}} for parts that should be parameterized (e.g., search terms).
46
+ Only include the JSON, no other text.`,
47
+ },
48
+ ], undefined, "You are an expert at analyzing browser automation logs and creating reusable scripts. Output only valid JSON.");
49
+ try {
50
+ // Extract JSON from response
51
+ const jsonMatch = response.content.match(/\{[\s\S]*\}/);
52
+ if (!jsonMatch) {
53
+ return "Error: LLM did not return valid JSON.";
54
+ }
55
+ const skill = JSON.parse(jsonMatch[0]);
56
+ return this.saveSkill(skill);
57
+ }
58
+ catch (err) {
59
+ return `Error parsing skill: ${err instanceof Error ? err.message : String(err)}`;
60
+ }
61
+ }
62
+ /** Save a skill to a markdown file with metadata */
63
+ saveSkill(skill, meta) {
64
+ const safeName = skill.name.replace(/[^a-zA-Z0-9_-]/g, "_");
65
+ const filePath = path.join(this.skillsDir, `${safeName}.md`);
66
+ const stepsJson = JSON.stringify(skill.steps, null, 2);
67
+ const notes = skill.notes?.map((n) => `- ${n}`).join("\n") || "";
68
+ const usageCount = meta?.usageCount ?? 0;
69
+ const successRate = meta?.successRate ?? 100;
70
+ const lastImproved = meta?.lastImproved ?? "";
71
+ const content = `---
72
+ name: ${skill.name}
73
+ description: ${skill.description}
74
+ created: ${new Date().toISOString()}
75
+ usageCount: ${usageCount}
76
+ successRate: ${successRate}
77
+ lastImproved: ${lastImproved}
78
+ ---
79
+
80
+ ## Steps
81
+
82
+ \`\`\`json
83
+ ${stepsJson}
84
+ \`\`\`
85
+
86
+ ## Notes
87
+ ${notes}
88
+ `;
89
+ fs.writeFileSync(filePath, content, "utf-8");
90
+ return `Skill saved: ${filePath}`;
91
+ }
92
+ /** Load a skill from a markdown file */
93
+ loadSkill(skillRef) {
94
+ const safeName = skillRef.replace(/[^a-zA-Z0-9_-]/g, "_");
95
+ let filePath = path.join(this.skillsDir, `${safeName}.md`);
96
+ if (!fs.existsSync(filePath)) {
97
+ // Try with .md extension
98
+ filePath = path.join(this.skillsDir, skillRef);
99
+ if (!fs.existsSync(filePath))
100
+ return null;
101
+ }
102
+ const content = fs.readFileSync(filePath, "utf-8");
103
+ // Parse frontmatter
104
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
105
+ const name = fmMatch?.[1].match(/name:\s*(.+)/)?.[1] || skillRef;
106
+ const description = fmMatch?.[1].match(/description:\s*(.+)/)?.[1] || "";
107
+ // Parse steps JSON
108
+ const stepsMatch = content.match(/```json\n([\s\S]*?)\n```/);
109
+ if (!stepsMatch)
110
+ return null;
111
+ try {
112
+ const steps = JSON.parse(stepsMatch[1]);
113
+ // Parse notes
114
+ const notesSection = content.split("## Notes")[1];
115
+ const notes = notesSection
116
+ ? notesSection
117
+ .trim()
118
+ .split("\n")
119
+ .filter((l) => l.startsWith("- "))
120
+ .map((l) => l.slice(2))
121
+ : [];
122
+ return { name, description, steps, notes };
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ /** List all available skills */
129
+ listSkills() {
130
+ const files = fs
131
+ .readdirSync(this.skillsDir)
132
+ .filter((f) => f.endsWith(".md"));
133
+ if (files.length === 0)
134
+ return "(no skills available)";
135
+ return files
136
+ .map((f) => {
137
+ const skill = this.loadSkill(f);
138
+ if (!skill)
139
+ return `- ${f} (invalid)`;
140
+ const meta = this.loadSkillMeta(f);
141
+ const stats = meta.usageCount > 0
142
+ ? ` [used ${meta.usageCount}x, ${meta.successRate}% ok]`
143
+ : "";
144
+ return `- ${skill.name}: ${skill.description} (${skill.steps.length} steps)${stats}`;
145
+ })
146
+ .join("\n");
147
+ }
148
+ /** Load metadata from a skill file */
149
+ loadSkillMeta(skillRef) {
150
+ const safeName = skillRef.replace(/[^a-zA-Z0-9_-]/g, "_").replace(/\.md$/, "");
151
+ let filePath = path.join(this.skillsDir, `${safeName}.md`);
152
+ if (!fs.existsSync(filePath)) {
153
+ filePath = path.join(this.skillsDir, skillRef);
154
+ }
155
+ const defaults = { usageCount: 0, successRate: 100, lastImproved: "" };
156
+ if (!fs.existsSync(filePath))
157
+ return defaults;
158
+ const content = fs.readFileSync(filePath, "utf-8");
159
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
160
+ if (!fmMatch)
161
+ return defaults;
162
+ const fm = fmMatch[1];
163
+ return {
164
+ usageCount: Number(fm.match(/usageCount:\s*(\d+)/)?.[1] ?? 0),
165
+ successRate: Number(fm.match(/successRate:\s*([\d.]+)/)?.[1] ?? 100),
166
+ lastImproved: fm.match(/lastImproved:\s*(.+)/)?.[1]?.trim() ?? "",
167
+ };
168
+ }
169
+ /** Update usage stats for a skill after execution */
170
+ updateSkillMeta(skillRef, success) {
171
+ const skill = this.loadSkill(skillRef);
172
+ if (!skill)
173
+ return;
174
+ const meta = this.loadSkillMeta(skillRef);
175
+ meta.usageCount++;
176
+ const total = meta.usageCount;
177
+ // Rolling success rate
178
+ meta.successRate = Math.round(((meta.successRate * (total - 1)) / 100 + (success ? 1 : 0)) / total * 100);
179
+ this.saveSkill(skill, meta);
180
+ }
181
+ /**
182
+ * Determine if an execution log is worth auto-generating a skill from.
183
+ * Criteria: enough meaningful browser actions, all successful, not trivially short.
184
+ */
185
+ shouldAutoGenerate(logFilePath) {
186
+ const entries = ExecutionLogger.readLog(logFilePath);
187
+ if (entries.length === 0)
188
+ return false;
189
+ const actionEntries = entries.filter((e) => e.action !== "snapshot" && e.action !== "screenshot" && e.action !== "script_start" && e.action !== "script_end");
190
+ // Need at least 3 meaningful actions
191
+ if (actionEntries.length < 3)
192
+ return false;
193
+ // Must have a navigate action (needs a real workflow, not just clicks)
194
+ const hasNavigate = actionEntries.some((e) => e.action === "navigate");
195
+ if (!hasNavigate)
196
+ return false;
197
+ // Failure rate must be under 30%
198
+ const failures = actionEntries.filter((e) => !e.success);
199
+ if (failures.length / actionEntries.length > 0.3)
200
+ return false;
201
+ return true;
202
+ }
203
+ /**
204
+ * Improve a skill based on its execution report.
205
+ * When steps used LLM fallback, ask the LLM to revise those steps.
206
+ */
207
+ async improveSkill(skill, report) {
208
+ // Only improve if there were fallbacks but the skill overall completed
209
+ if (report.fallbackCount === 0 || !report.completed)
210
+ return null;
211
+ const fallbackSteps = report.steps
212
+ .filter((s) => s.usedFallback)
213
+ .map((s) => ({
214
+ index: s.index,
215
+ originalAction: skill.steps[s.index]?.action,
216
+ originalParams: skill.steps[s.index]?.params,
217
+ originalDescription: skill.steps[s.index]?.description,
218
+ fallbackAction: s.fallbackAction,
219
+ error: s.error,
220
+ }));
221
+ const response = await this.llmClient.chat([
222
+ {
223
+ role: "user",
224
+ content: `A browser automation skill "${skill.name}" was executed but some steps needed LLM fallback because the original steps failed. Please revise the skill to fix these problematic steps.
225
+
226
+ Current skill steps:
227
+ ${JSON.stringify(skill.steps, null, 2)}
228
+
229
+ Steps that needed fallback:
230
+ ${JSON.stringify(fallbackSteps, null, 2)}
231
+
232
+ Return the COMPLETE revised steps array as JSON. Keep steps that worked unchanged. Fix the steps that failed based on what the fallback actually did. Use {{variable_name}} for parameterized parts.
233
+
234
+ Return ONLY the JSON array of steps, no other text.`,
235
+ },
236
+ ], undefined, "You are an expert at improving browser automation scripts. Output only valid JSON.");
237
+ try {
238
+ const jsonMatch = response.content.match(/\[[\s\S]*\]/);
239
+ if (!jsonMatch)
240
+ return null;
241
+ const improvedSteps = JSON.parse(jsonMatch[0]);
242
+ // Update the skill
243
+ const improvedSkill = {
244
+ ...skill,
245
+ steps: improvedSteps,
246
+ notes: [
247
+ ...(skill.notes || []),
248
+ `Auto-improved on ${new Date().toISOString().slice(0, 10)}: fixed ${fallbackSteps.length} step(s)`,
249
+ ],
250
+ };
251
+ const meta = this.loadSkillMeta(skill.name);
252
+ meta.lastImproved = new Date().toISOString();
253
+ const result = this.saveSkill(improvedSkill, meta);
254
+ console.log(`🧠 Skill "${skill.name}" auto-improved: ${fallbackSteps.length} step(s) revised`);
255
+ return result;
256
+ }
257
+ catch (err) {
258
+ console.error("Failed to improve skill:", err);
259
+ return null;
260
+ }
261
+ }
262
+ }
263
+ //# sourceMappingURL=skill-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/agent/skill-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { DipclawConfig } from "../config/types.js";
2
+ import type { LlmClient } from "../llm/types.js";
3
+ import { BrowserManager } from "../browser/manager.js";
4
+ import { MemoryManager } from "./memory.js";
5
+ import type { ScheduledTask } from "./scheduler.js";
6
+ import type { Scheduler } from "./scheduler.js";
7
+ export declare class TaskRunner {
8
+ private config;
9
+ private llmClient;
10
+ private browser;
11
+ private browserActions;
12
+ private memory;
13
+ private skillGenerator;
14
+ private scheduler;
15
+ constructor(config: DipclawConfig, llmClient: LlmClient, browser: BrowserManager, memory: MemoryManager);
16
+ /** Set scheduler reference for auto-linking skills to tasks */
17
+ setScheduler(scheduler: Scheduler): void;
18
+ /** Run a scheduled task with learning loop */
19
+ runTask(task: ScheduledTask): Promise<string>;
20
+ /** Try to auto-generate a skill from a successful LLM-driven task and link it */
21
+ private tryAutoGenerateSkill;
22
+ /** Format an execution report as readable text */
23
+ private formatReport;
24
+ /** Run an ad-hoc prompt in LLM-driven mode */
25
+ runPrompt(prompt: string, taskName?: string): Promise<string>;
26
+ private runLlmDriven;
27
+ private executeTool;
28
+ private executeBrowserAction;
29
+ private executeMemoryAction;
30
+ private buildSystemPrompt;
31
+ }
@@ -0,0 +1,242 @@
1
+ import { getAllTools } from "../llm/tools.js";
2
+ import { BrowserActions } from "../browser/actions.js";
3
+ import { ScriptRunner } from "../browser/script-runner.js";
4
+ import { ExecutionLogger } from "../logging/logger.js";
5
+ import { SkillGenerator } from "./skill-generator.js";
6
+ import path from "node:path";
7
+ export class TaskRunner {
8
+ config;
9
+ llmClient;
10
+ browser;
11
+ browserActions;
12
+ memory;
13
+ skillGenerator;
14
+ scheduler = null;
15
+ constructor(config, llmClient, browser, memory) {
16
+ this.config = config;
17
+ this.llmClient = llmClient;
18
+ this.browser = browser;
19
+ this.browserActions = new BrowserActions(browser);
20
+ this.memory = memory;
21
+ this.skillGenerator = new SkillGenerator(config.workspace, llmClient);
22
+ }
23
+ /** Set scheduler reference for auto-linking skills to tasks */
24
+ setScheduler(scheduler) {
25
+ this.scheduler = scheduler;
26
+ }
27
+ /** Run a scheduled task with learning loop */
28
+ async runTask(task) {
29
+ const logsDir = path.join(this.config.workspace, "logs");
30
+ const logger = new ExecutionLogger(logsDir, task.name);
31
+ this.browserActions.setLogger(logger);
32
+ try {
33
+ // Path A: Skill-based execution — run skill, then try to improve if needed
34
+ if (task.skillRef) {
35
+ const skill = this.skillGenerator.loadSkill(task.skillRef);
36
+ if (skill) {
37
+ console.log(` Using skill: ${skill.name}`);
38
+ const runner = new ScriptRunner(this.browserActions, this.llmClient, logger);
39
+ const report = await runner.run(skill);
40
+ // Update skill usage stats
41
+ this.skillGenerator.updateSkillMeta(task.skillRef, report.completed);
42
+ // Learning: if some steps used fallback, improve the skill
43
+ if (report.fallbackCount > 0 && report.completed) {
44
+ console.log(`🧠 Learning: ${report.fallbackCount} step(s) used fallback, improving skill...`);
45
+ await this.skillGenerator.improveSkill(skill, report);
46
+ }
47
+ return this.formatReport(report);
48
+ }
49
+ }
50
+ // Path B: LLM-driven execution — then auto-generate skill if worthwhile
51
+ const result = await this.runLlmDriven(task.prompt, logger);
52
+ // Learning: auto-generate skill from successful LLM-driven execution
53
+ await this.tryAutoGenerateSkill(task, logger);
54
+ return result;
55
+ }
56
+ finally {
57
+ this.browserActions.setLogger(null);
58
+ console.log(` Log saved: ${logger.getLogFilePath()}`);
59
+ }
60
+ }
61
+ /** Try to auto-generate a skill from a successful LLM-driven task and link it */
62
+ async tryAutoGenerateSkill(task, logger) {
63
+ const logPath = logger.getLogFilePath();
64
+ if (!this.skillGenerator.shouldAutoGenerate(logPath)) {
65
+ return;
66
+ }
67
+ console.log(`🧠 Learning: auto-generating skill from task "${task.name}"...`);
68
+ try {
69
+ const saveResult = await this.skillGenerator.generate(logPath);
70
+ console.log(` ${saveResult}`);
71
+ // Auto-link the new skill to this scheduled task
72
+ if (this.scheduler && saveResult.startsWith("Skill saved:")) {
73
+ // Extract skill name from the saved file path
74
+ const match = saveResult.match(/\/([^/]+)\.md$/);
75
+ if (match) {
76
+ const skillRef = match[1];
77
+ this.scheduler.linkSkill(task.id, skillRef);
78
+ console.log(` Skill "${skillRef}" auto-linked to task "${task.name}"`);
79
+ }
80
+ }
81
+ }
82
+ catch (err) {
83
+ console.error(" Auto skill generation failed:", err);
84
+ }
85
+ }
86
+ /** Format an execution report as readable text */
87
+ formatReport(report) {
88
+ const lines = [`Skill "${report.skillName}": ${report.completed ? "completed" : "failed"}`];
89
+ lines.push(` ${report.successCount}/${report.totalSteps} steps ok, ${report.fallbackCount} fallback(s)`);
90
+ for (const step of report.steps) {
91
+ const status = step.success
92
+ ? step.usedFallback ? "ok (fallback)" : "ok"
93
+ : `FAILED: ${step.error}`;
94
+ lines.push(` Step ${step.index + 1} [${step.action}]: ${status}`);
95
+ }
96
+ return lines.join("\n");
97
+ }
98
+ /** Run an ad-hoc prompt in LLM-driven mode */
99
+ async runPrompt(prompt, taskName = "adhoc") {
100
+ const logsDir = path.join(this.config.workspace, "logs");
101
+ const logger = new ExecutionLogger(logsDir, taskName);
102
+ this.browserActions.setLogger(logger);
103
+ try {
104
+ return await this.runLlmDriven(prompt, logger);
105
+ }
106
+ finally {
107
+ this.browserActions.setLogger(null);
108
+ }
109
+ }
110
+ async runLlmDriven(prompt, logger) {
111
+ // Build system prompt with memory context
112
+ const memoryIndex = this.memory.loadIndex();
113
+ const relevantMemory = this.memory.loadRelevantMemories(prompt.split(/\s+/).filter((w) => w.length > 3));
114
+ const systemPrompt = this.buildSystemPrompt(memoryIndex, relevantMemory);
115
+ const tools = getAllTools();
116
+ const messages = [
117
+ { role: "user", content: prompt },
118
+ ];
119
+ let iterations = 0;
120
+ let finalContent = "";
121
+ const maxIter = this.config.maxIterations;
122
+ while (iterations < maxIter) {
123
+ iterations++;
124
+ const response = await this.llmClient.chat(messages, tools, systemPrompt);
125
+ if (response.content) {
126
+ finalContent = response.content;
127
+ }
128
+ // If no tool calls, we're done
129
+ if (response.toolCalls.length === 0 || response.stopReason === "stop") {
130
+ break;
131
+ }
132
+ // Add assistant message with tool calls
133
+ messages.push({
134
+ role: "assistant",
135
+ content: response.content,
136
+ toolCalls: response.toolCalls,
137
+ });
138
+ // Execute each tool call
139
+ for (const tc of response.toolCalls) {
140
+ const result = await this.executeTool(tc);
141
+ messages.push({
142
+ role: "tool",
143
+ content: result,
144
+ toolCallId: tc.id,
145
+ });
146
+ }
147
+ }
148
+ // Reached iteration limit — ask LLM for a final summary without tools
149
+ if (iterations >= maxIter) {
150
+ messages.push({
151
+ role: "user",
152
+ content: "You've reached the maximum number of tool-calling iterations allowed. Please provide a final response summarizing what you've found and accomplished so far, without calling any more tools.",
153
+ });
154
+ const summary = await this.llmClient.chat(messages, undefined, systemPrompt);
155
+ finalContent = summary.content;
156
+ }
157
+ return finalContent;
158
+ }
159
+ async executeTool(tc) {
160
+ const args = tc.arguments;
161
+ const action = args.action;
162
+ switch (tc.name) {
163
+ case "browser":
164
+ return await this.executeBrowserAction(action, args);
165
+ case "memory":
166
+ return this.executeMemoryAction(action, args);
167
+ case "scheduler":
168
+ return `(scheduler managed via commands)`;
169
+ default:
170
+ return `Unknown tool: ${tc.name}`;
171
+ }
172
+ }
173
+ async executeBrowserAction(action, args) {
174
+ switch (action) {
175
+ case "navigate":
176
+ return await this.browserActions.navigate(args.url);
177
+ case "snapshot":
178
+ return await this.browserActions.snapshot();
179
+ case "click":
180
+ return await this.browserActions.click(args.ref);
181
+ case "type":
182
+ return await this.browserActions.type(args.ref, args.text, args.clear);
183
+ case "scroll":
184
+ return await this.browserActions.scroll(args.direction, args.amount, args.ref);
185
+ case "screenshot": {
186
+ const ss = await this.browserActions.screenshot(args.fullPage);
187
+ return ss.text;
188
+ }
189
+ case "evaluate":
190
+ return await this.browserActions.evaluate(args.script);
191
+ case "wait":
192
+ return await this.browserActions.wait(args);
193
+ case "press":
194
+ return await this.browserActions.pressKey(args.key);
195
+ case "select":
196
+ return await this.browserActions.selectOption(args.ref, args.value);
197
+ case "tabs":
198
+ return await this.browserActions.listTabs();
199
+ case "close_tab":
200
+ return await this.browserActions.closeTab(args.index);
201
+ case "focus_tab":
202
+ return await this.browserActions.focusTab(args.index);
203
+ default:
204
+ return `Unknown browser action: ${action}`;
205
+ }
206
+ }
207
+ executeMemoryAction(action, args) {
208
+ switch (action) {
209
+ case "save":
210
+ return this.memory.save(args.key, args.title, args.content);
211
+ case "read":
212
+ return this.memory.read(args.key);
213
+ case "list":
214
+ return this.memory.list();
215
+ default:
216
+ return `Unknown memory action: ${action}`;
217
+ }
218
+ }
219
+ buildSystemPrompt(memoryIndex, relevantMemory) {
220
+ let prompt = `You are a browser automation assistant named "${this.config.name}". You help users accomplish tasks by controlling a web browser.
221
+
222
+ ## Available Tools
223
+ You have browser tools to navigate, click, type, scroll, take screenshots, and interact with web pages. Always take a snapshot first to understand the page structure before performing actions.
224
+
225
+ ## How to use browser tool
226
+ 1. Use browser with action "navigate" to go to a URL
227
+ 2. Use browser with action "snapshot" to see the page (you'll get element refs like [e1], [e2])
228
+ 3. Use browser with action "click", "type", etc. with element references
229
+ 4. After actions, take another snapshot to verify the result
230
+
231
+ ## Memory
232
+ Use the memory tool with action "save" to store important discoveries (e.g., website quirks, login flows).`;
233
+ if (memoryIndex.trim().length > 20) {
234
+ prompt += `\n\n## Saved Memories\n${memoryIndex}`;
235
+ }
236
+ if (relevantMemory.trim()) {
237
+ prompt += `\n\n## Relevant Memory Details\n${relevantMemory}`;
238
+ }
239
+ return prompt;
240
+ }
241
+ }
242
+ //# sourceMappingURL=task-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../src/agent/task-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { BrowserManager } from "./manager.js";
2
+ import type { ExecutionLogger } from "../logging/logger.js";
3
+ export declare class BrowserActions {
4
+ private browser;
5
+ private logger;
6
+ constructor(browser: BrowserManager);
7
+ setLogger(logger: ExecutionLogger | null): void;
8
+ navigate(url: string): Promise<string>;
9
+ snapshot(): Promise<string>;
10
+ click(ref: string): Promise<string>;
11
+ type(ref: string, text: string, clear?: boolean): Promise<string>;
12
+ scroll(direction: "up" | "down", amount?: number, ref?: string): Promise<string>;
13
+ screenshot(fullPage?: boolean): Promise<{
14
+ base64: string;
15
+ text: string;
16
+ }>;
17
+ evaluate(script: string): Promise<string>;
18
+ wait(opts: {
19
+ selector?: string;
20
+ text?: string;
21
+ timeout?: number;
22
+ }): Promise<string>;
23
+ pressKey(key: string): Promise<string>;
24
+ selectOption(ref: string, value: string): Promise<string>;
25
+ listTabs(): Promise<string>;
26
+ closeTab(index: number): Promise<string>;
27
+ focusTab(index: number): Promise<string>;
28
+ }