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.
- package/config.example.json +26 -0
- package/dist/agent/agent.d.ts +85 -0
- package/dist/agent/agent.js +725 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/memory.d.ts +17 -0
- package/dist/agent/memory.js +92 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/scheduler.d.ts +35 -0
- package/dist/agent/scheduler.js +154 -0
- package/dist/agent/scheduler.js.map +1 -0
- package/dist/agent/skill-generator.d.ts +37 -0
- package/dist/agent/skill-generator.js +263 -0
- package/dist/agent/skill-generator.js.map +1 -0
- package/dist/agent/task-runner.d.ts +31 -0
- package/dist/agent/task-runner.js +242 -0
- package/dist/agent/task-runner.js.map +1 -0
- package/dist/browser/actions.d.ts +28 -0
- package/dist/browser/actions.js +212 -0
- package/dist/browser/actions.js.map +1 -0
- package/dist/browser/manager.d.ts +17 -0
- package/dist/browser/manager.js +249 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser/script-runner.d.ts +49 -0
- package/dist/browser/script-runner.js +137 -0
- package/dist/browser/script-runner.js.map +1 -0
- package/dist/browser/snapshot.d.ts +15 -0
- package/dist/browser/snapshot.js +38 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/config/types.d.ts +62 -0
- package/dist/config/types.js +47 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +219 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/client.d.ts +3 -0
- package/dist/llm/client.js +503 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/tools.d.ts +5 -0
- package/dist/llm/tools.js +94 -0
- package/dist/llm/tools.js.map +1 -0
- package/dist/llm/types.d.ts +49 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/logging/logger.d.ts +17 -0
- package/dist/logging/logger.js +46 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/telegram/bot.d.ts +15 -0
- package/dist/telegram/bot.js +279 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/tui/tui.d.ts +12 -0
- package/dist/tui/tui.js +176 -0
- package/dist/tui/tui.js.map +1 -0
- 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
|
+
}
|