browserclaw-agent 0.1.0 → 0.1.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-loop.d.ts +23 -15
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +55 -32
- package/dist/agent-loop.js.map +1 -1
- package/dist/config.d.ts +10 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -16
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +7 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -12
- package/dist/index.js.map +1 -1
- package/dist/lesson-store.d.ts +11 -0
- package/dist/lesson-store.d.ts.map +1 -0
- package/dist/lesson-store.js +323 -0
- package/dist/lesson-store.js.map +1 -0
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +37 -24
- package/dist/llm.js.map +1 -1
- package/dist/port-probe.d.ts +8 -0
- package/dist/port-probe.d.ts.map +1 -0
- package/dist/port-probe.js +22 -0
- package/dist/port-probe.js.map +1 -0
- package/dist/prompt-log.d.ts +17 -0
- package/dist/prompt-log.d.ts.map +1 -0
- package/dist/prompt-log.js +28 -0
- package/dist/prompt-log.js.map +1 -0
- package/dist/routes.d.ts +3 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +227 -0
- package/dist/routes.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +121 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +40 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +635 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/skill-generator.d.ts +5 -0
- package/dist/skill-generator.d.ts.map +1 -0
- package/dist/skill-generator.js +173 -0
- package/dist/skill-generator.js.map +1 -0
- package/dist/skill-store.d.ts +7 -0
- package/dist/skill-store.d.ts.map +1 -0
- package/dist/skill-store.js +85 -0
- package/dist/skill-store.js.map +1 -0
- package/dist/trajectory-store.d.ts +20 -0
- package/dist/trajectory-store.d.ts.map +1 -0
- package/dist/trajectory-store.js +61 -0
- package/dist/trajectory-store.js.map +1 -0
- package/package.json +6 -14
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AgentLoopResult, SkillOutput } from './types.js';
|
|
2
|
+
export declare function generateSkillTags(prompt: string, skill: SkillOutput): Promise<string[]>;
|
|
3
|
+
export declare function generateSkill(prompt: string, result: AgentLoopResult): Promise<SkillOutput>;
|
|
4
|
+
export declare function mergeSkills(existing: SkillOutput, prompt: string, result: AgentLoopResult): Promise<SkillOutput>;
|
|
5
|
+
//# sourceMappingURL=skill-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../src/skill-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAa,MAAM,YAAY,CAAC;AAM1E,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW7F;AAoHD,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAgDjG;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CA2CtB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { llmJson } from './llm.js';
|
|
2
|
+
export async function generateSkillTags(prompt, skill) {
|
|
3
|
+
try {
|
|
4
|
+
const result = await llmJson({
|
|
5
|
+
system: `Generate 3-5 short tags for a browser automation skill. Tags should describe the type of task (e.g. "search", "booking", "form-fill", "navigation", "price-check"). Respond with JSON: {"tags": ["tag1", "tag2", ...]}`,
|
|
6
|
+
message: `Prompt: ${prompt}\nSkill: ${skill.title} — ${skill.description}`,
|
|
7
|
+
maxTokens: 128,
|
|
8
|
+
});
|
|
9
|
+
return result.tags;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const SYSTEM_PROMPT = `You are a skill documentation generator. Given a browser automation task and the actions that were taken (including failures), generate a clean, structured skill document with reflective analysis.
|
|
16
|
+
|
|
17
|
+
You MUST respond with valid JSON matching this schema:
|
|
18
|
+
{
|
|
19
|
+
"title": "short descriptive title",
|
|
20
|
+
"description": "one-sentence description of what this skill does",
|
|
21
|
+
"steps": [
|
|
22
|
+
{
|
|
23
|
+
"number": 1,
|
|
24
|
+
"description": "what this step does in plain language",
|
|
25
|
+
"action": "click | type | navigate | select | scroll | wait",
|
|
26
|
+
"details": "specific details like what was clicked or typed (optional)"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"tips": [
|
|
30
|
+
"practical tips about this site that would save time on the next visit"
|
|
31
|
+
],
|
|
32
|
+
"what_worked": [
|
|
33
|
+
"patterns or approaches that succeeded and should be repeated"
|
|
34
|
+
],
|
|
35
|
+
"what_to_avoid": [
|
|
36
|
+
"patterns or approaches that failed or wasted steps — so future runs skip them"
|
|
37
|
+
],
|
|
38
|
+
"site_quirks": [
|
|
39
|
+
"site-specific behaviors discovered: slow loading, aggressive popups, unusual navigation, anti-bot, etc."
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
Rules:
|
|
44
|
+
- Title should be concise (under 60 chars).
|
|
45
|
+
- Collapse redundant or failed steps — only include the successful logical steps.
|
|
46
|
+
- Description should be one sentence explaining the end-to-end task.
|
|
47
|
+
- Steps should be human-readable — use natural language, not technical refs.
|
|
48
|
+
- Omit intermediate waits and scrolls unless they're meaningful to the workflow.
|
|
49
|
+
- Tips should capture site-specific knowledge: cookie banners, autocomplete behavior, loading delays, popup dismissals, anti-bot challenges, hidden buttons, required wait times, URL patterns.
|
|
50
|
+
- what_worked: analyze the successful patterns — what approach worked? What shortcuts did the agent find?
|
|
51
|
+
- what_to_avoid: analyze the failures — what approaches failed? What dead ends should future runs skip?
|
|
52
|
+
- site_quirks: what unusual behaviors did this site exhibit? Overlays, slow loads, redirects, anti-bot?`;
|
|
53
|
+
function buildPrompt(userPrompt, result) {
|
|
54
|
+
let message = `Original task: ${userPrompt}\n\n`;
|
|
55
|
+
message += `Final URL: ${result.final_url ?? 'unknown'}\n`;
|
|
56
|
+
message += `Total steps executed: ${String(result.steps.length)}\n`;
|
|
57
|
+
message += `Duration: ${String(result.duration_ms)}ms\n\n`;
|
|
58
|
+
message += "Action history (including failures — analyze what worked and what didn't):\n";
|
|
59
|
+
for (const step of result.steps) {
|
|
60
|
+
const action = step.action;
|
|
61
|
+
let detail = `Step ${String(step.step)}: ${action.action} — ${action.reasoning}`;
|
|
62
|
+
if (action.ref !== undefined && action.ref !== '')
|
|
63
|
+
detail += ` (ref: ${action.ref})`;
|
|
64
|
+
if (action.text !== undefined && action.text !== '')
|
|
65
|
+
detail += ` (text: "${action.text}")`;
|
|
66
|
+
if (action.url !== undefined && action.url !== '')
|
|
67
|
+
detail += ` (url: ${action.url})`;
|
|
68
|
+
if (step.page_title !== undefined && step.page_title !== '')
|
|
69
|
+
detail += ` [page: ${step.page_title}]`;
|
|
70
|
+
if (step.outcome !== undefined && step.outcome !== '')
|
|
71
|
+
detail += ` → ${step.outcome}`;
|
|
72
|
+
if (action.error_feedback !== undefined && action.error_feedback !== '')
|
|
73
|
+
detail += ` ⚠ FAILED: ${action.error_feedback}`;
|
|
74
|
+
message += ` ${detail}\n`;
|
|
75
|
+
}
|
|
76
|
+
return message;
|
|
77
|
+
}
|
|
78
|
+
function toMarkdown(title, description, steps, tips, whatWorked, prompt, url, durationMs) {
|
|
79
|
+
const lines = [`# ${title}`, '', description, '', '## Steps', ''];
|
|
80
|
+
for (const step of steps) {
|
|
81
|
+
lines.push(`${String(step.number)}. **${step.description}**`);
|
|
82
|
+
if (step.details !== undefined && step.details !== '')
|
|
83
|
+
lines.push(` ${step.details}`);
|
|
84
|
+
}
|
|
85
|
+
if (tips.length > 0) {
|
|
86
|
+
lines.push('', '## Tips', '');
|
|
87
|
+
for (const tip of tips) {
|
|
88
|
+
lines.push(`- ${tip}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (whatWorked.length > 0) {
|
|
92
|
+
lines.push('', '## What Worked', '');
|
|
93
|
+
for (const w of whatWorked) {
|
|
94
|
+
lines.push(`- ${w}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
lines.push('', '---', '');
|
|
98
|
+
lines.push(`- **Prompt:** ${prompt}`);
|
|
99
|
+
lines.push(`- **Final URL:** ${url}`);
|
|
100
|
+
lines.push(`- **Duration:** ${(durationMs / 1000).toFixed(1)}s`);
|
|
101
|
+
lines.push(`- **Generated:** ${new Date().toISOString()}`);
|
|
102
|
+
lines.push(`- **Engine:** [BrowserClaw](https://github.com/idan-rubin/browserclaw)`);
|
|
103
|
+
lines.push('');
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
export async function generateSkill(prompt, result) {
|
|
107
|
+
const parsed = await llmJson({
|
|
108
|
+
system: SYSTEM_PROMPT,
|
|
109
|
+
message: buildPrompt(prompt, result),
|
|
110
|
+
maxTokens: 2048,
|
|
111
|
+
});
|
|
112
|
+
// Merge what_to_avoid and site_quirks into tips for a unified guidance section
|
|
113
|
+
const tips = [...(parsed.tips ?? [])];
|
|
114
|
+
if (parsed.what_to_avoid !== undefined) {
|
|
115
|
+
for (const avoid of parsed.what_to_avoid) {
|
|
116
|
+
tips.push(`⚠ Avoid: ${avoid}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (parsed.site_quirks !== undefined) {
|
|
120
|
+
for (const quirk of parsed.site_quirks) {
|
|
121
|
+
tips.push(`🔍 Site quirk: ${quirk}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const whatWorked = parsed.what_worked ?? [];
|
|
125
|
+
const metadata = {
|
|
126
|
+
prompt,
|
|
127
|
+
url: result.final_url ?? '',
|
|
128
|
+
total_steps: result.steps.length,
|
|
129
|
+
duration_ms: result.duration_ms,
|
|
130
|
+
generated_at: new Date().toISOString(),
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
title: parsed.title,
|
|
134
|
+
description: parsed.description,
|
|
135
|
+
steps: parsed.steps,
|
|
136
|
+
tips,
|
|
137
|
+
what_worked: whatWorked,
|
|
138
|
+
metadata,
|
|
139
|
+
markdown: toMarkdown(parsed.title, parsed.description, parsed.steps, tips, whatWorked, prompt, metadata.url, metadata.duration_ms),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export async function mergeSkills(existing, prompt, result) {
|
|
143
|
+
const newSkill = await generateSkill(prompt, result);
|
|
144
|
+
// Merge tips: deduplicate by keeping unique entries from both
|
|
145
|
+
const allTips = [...existing.tips];
|
|
146
|
+
for (const tip of newSkill.tips) {
|
|
147
|
+
if (!allTips.some((t) => t.toLowerCase().includes(tip.toLowerCase().slice(0, 30)))) {
|
|
148
|
+
allTips.push(tip);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Merge what_worked
|
|
152
|
+
const allWorked = [...(existing.what_worked ?? [])];
|
|
153
|
+
for (const w of newSkill.what_worked ?? []) {
|
|
154
|
+
if (!allWorked.some((aw) => aw.toLowerCase().includes(w.toLowerCase().slice(0, 30)))) {
|
|
155
|
+
allWorked.push(w);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Always keep the shorter (more efficient) steps. mergeSkills is called when
|
|
159
|
+
// the new run took more steps, so existing steps are usually shorter — but
|
|
160
|
+
// we check explicitly in case the new run found a shorter path.
|
|
161
|
+
const steps = newSkill.steps.length < existing.steps.length ? newSkill.steps : existing.steps;
|
|
162
|
+
return {
|
|
163
|
+
title: existing.title,
|
|
164
|
+
description: existing.description,
|
|
165
|
+
steps,
|
|
166
|
+
tips: allTips,
|
|
167
|
+
what_worked: allWorked,
|
|
168
|
+
failure_notes: existing.failure_notes,
|
|
169
|
+
metadata: newSkill.metadata,
|
|
170
|
+
markdown: toMarkdown(existing.title, existing.description, steps, allTips, allWorked, prompt, newSkill.metadata.url, newSkill.metadata.duration_ms),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=skill-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../src/skill-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CatalogSkill, SkillOutput } from './types.js';
|
|
2
|
+
export declare function initSkillStore(): Promise<void>;
|
|
3
|
+
export declare function extractDomain(url: string): string;
|
|
4
|
+
export declare function getSkillForDomain(domain: string): Promise<CatalogSkill | null>;
|
|
5
|
+
export declare function getSkillsForDomains(domains: string[]): Promise<Map<string, CatalogSkill>>;
|
|
6
|
+
export declare function saveSkill(domain: string, skill: SkillOutput, tags: string[], runCount?: number): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=skill-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../src/skill-store.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM5D,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWpF;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAY/F;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpH"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { S3Client, CreateBucketCommand, HeadBucketCommand, GetObjectCommand, PutObjectCommand, } from '@aws-sdk/client-s3';
|
|
2
|
+
import { getMinioConfig } from './config.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
let s3;
|
|
5
|
+
let bucket;
|
|
6
|
+
export async function initSkillStore() {
|
|
7
|
+
const config = getMinioConfig();
|
|
8
|
+
bucket = config.bucket;
|
|
9
|
+
s3 = new S3Client({
|
|
10
|
+
endpoint: config.endpoint,
|
|
11
|
+
region: 'us-east-1',
|
|
12
|
+
credentials: {
|
|
13
|
+
accessKeyId: config.accessKey,
|
|
14
|
+
secretAccessKey: config.secretKey,
|
|
15
|
+
},
|
|
16
|
+
forcePathStyle: true,
|
|
17
|
+
});
|
|
18
|
+
try {
|
|
19
|
+
await s3.send(new HeadBucketCommand({ Bucket: bucket }));
|
|
20
|
+
logger.info({ bucket }, 'Skill store ready');
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
await s3.send(new CreateBucketCommand({ Bucket: bucket }));
|
|
24
|
+
logger.info({ bucket }, 'Created skill store bucket');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function extractDomain(url) {
|
|
28
|
+
try {
|
|
29
|
+
const hostname = new URL(url).hostname;
|
|
30
|
+
return hostname.replace(/^www\./, '');
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function getSkillForDomain(domain) {
|
|
37
|
+
if (domain === '')
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
const res = await s3.send(new GetObjectCommand({ Bucket: bucket, Key: `skills/${domain}.json` }));
|
|
41
|
+
const raw = await res.Body?.transformToString();
|
|
42
|
+
if (raw === undefined || raw === '')
|
|
43
|
+
return null;
|
|
44
|
+
return JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function getSkillsForDomains(domains) {
|
|
51
|
+
const results = new Map();
|
|
52
|
+
const fetches = domains.filter(Boolean).map(async (domain) => {
|
|
53
|
+
try {
|
|
54
|
+
const skill = await getSkillForDomain(domain);
|
|
55
|
+
if (skill)
|
|
56
|
+
results.set(domain, skill);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// skip domains that fail to fetch
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
await Promise.all(fetches);
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
export async function saveSkill(domain, skill, tags, runCount) {
|
|
66
|
+
if (domain === '')
|
|
67
|
+
return;
|
|
68
|
+
const now = new Date().toISOString();
|
|
69
|
+
const catalogSkill = {
|
|
70
|
+
id: crypto.randomUUID(),
|
|
71
|
+
domain,
|
|
72
|
+
skill,
|
|
73
|
+
tags,
|
|
74
|
+
created_at: now,
|
|
75
|
+
run_count: runCount ?? 1,
|
|
76
|
+
};
|
|
77
|
+
await s3.send(new PutObjectCommand({
|
|
78
|
+
Bucket: bucket,
|
|
79
|
+
Key: `skills/${domain}.json`,
|
|
80
|
+
Body: JSON.stringify(catalogSkill, null, 2),
|
|
81
|
+
ContentType: 'application/json',
|
|
82
|
+
}));
|
|
83
|
+
logger.info({ title: skill.title, domain, runCount: catalogSkill.run_count }, 'Saved skill');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=skill-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.js","sourceRoot":"","sources":["../src/skill-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentStep } from './types.js';
|
|
2
|
+
export declare const TRAJECTORY_STATUS: {
|
|
3
|
+
readonly completed: "completed";
|
|
4
|
+
readonly failed: "failed";
|
|
5
|
+
};
|
|
6
|
+
export type TrajectoryStatus = (typeof TRAJECTORY_STATUS)[keyof typeof TRAJECTORY_STATUS];
|
|
7
|
+
export interface TrajectoryRecord {
|
|
8
|
+
session_id: string;
|
|
9
|
+
prompt: string;
|
|
10
|
+
status: TrajectoryStatus;
|
|
11
|
+
steps: AgentStep[];
|
|
12
|
+
answer?: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
duration_ms: number;
|
|
15
|
+
saved_at: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function initTrajectoryStore(): void;
|
|
18
|
+
export declare function saveTrajectory(record: TrajectoryRecord): Promise<void>;
|
|
19
|
+
export declare function loadTrajectory(sessionId: string): Promise<TrajectoryRecord | null>;
|
|
20
|
+
//# sourceMappingURL=trajectory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-store.d.ts","sourceRoot":"","sources":["../src/trajectory-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE1F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AAYD,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5E;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAWxF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { S3Client, GetObjectCommand, PutObjectCommand, NoSuchKey } from '@aws-sdk/client-s3';
|
|
2
|
+
import { getMinioConfig } from './config.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
const KEY_PREFIX = 'trajectories/';
|
|
5
|
+
const CONTENT_TYPE = 'application/json';
|
|
6
|
+
export const TRAJECTORY_STATUS = {
|
|
7
|
+
completed: 'completed',
|
|
8
|
+
failed: 'failed',
|
|
9
|
+
};
|
|
10
|
+
let s3;
|
|
11
|
+
let bucket;
|
|
12
|
+
export function initTrajectoryStore() {
|
|
13
|
+
const config = getMinioConfig();
|
|
14
|
+
bucket = config.bucket;
|
|
15
|
+
s3 = new S3Client({
|
|
16
|
+
endpoint: config.endpoint,
|
|
17
|
+
region: 'us-east-1',
|
|
18
|
+
credentials: { accessKeyId: config.accessKey, secretAccessKey: config.secretKey },
|
|
19
|
+
forcePathStyle: true,
|
|
20
|
+
});
|
|
21
|
+
logger.info('Trajectory store ready');
|
|
22
|
+
}
|
|
23
|
+
function keyFor(sessionId) {
|
|
24
|
+
return `${KEY_PREFIX}${sessionId}.json`;
|
|
25
|
+
}
|
|
26
|
+
async function readBody(body) {
|
|
27
|
+
const chunks = [];
|
|
28
|
+
for await (const chunk of body)
|
|
29
|
+
chunks.push(Buffer.from(chunk));
|
|
30
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
31
|
+
}
|
|
32
|
+
export async function saveTrajectory(record) {
|
|
33
|
+
try {
|
|
34
|
+
await s3.send(new PutObjectCommand({
|
|
35
|
+
Bucket: bucket,
|
|
36
|
+
Key: keyFor(record.session_id),
|
|
37
|
+
Body: JSON.stringify(record),
|
|
38
|
+
ContentType: CONTENT_TYPE,
|
|
39
|
+
}));
|
|
40
|
+
logger.info({ sessionId: record.session_id, steps: record.steps.length, status: record.status }, 'Saved trajectory');
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
logger.warn({ err, sessionId: record.session_id }, 'Failed to save trajectory');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function loadTrajectory(sessionId) {
|
|
47
|
+
try {
|
|
48
|
+
const res = await s3.send(new GetObjectCommand({ Bucket: bucket, Key: keyFor(sessionId) }));
|
|
49
|
+
if (res.Body === undefined)
|
|
50
|
+
return null;
|
|
51
|
+
const body = await readBody(res.Body);
|
|
52
|
+
return JSON.parse(body);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err instanceof NoSuchKey)
|
|
56
|
+
return null;
|
|
57
|
+
logger.warn({ err, sessionId }, 'Failed to load trajectory');
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=trajectory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-store.js","sourceRoot":"","sources":["../src/trajectory-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserclaw-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Browser automation agent loop powered by browserclaw",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -12,27 +12,19 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
|
-
"dist
|
|
16
|
-
"dist/agent-loop.*",
|
|
17
|
-
"dist/config.*",
|
|
18
|
-
"dist/llm.*",
|
|
19
|
-
"dist/types.*",
|
|
20
|
-
"dist/logger.*",
|
|
21
|
-
"dist/parse-json-response.*",
|
|
22
|
-
"dist/content-policy.*",
|
|
23
|
-
"dist/judge.*",
|
|
24
|
-
"dist/web-search.*",
|
|
25
|
-
"dist/skills/"
|
|
15
|
+
"dist"
|
|
26
16
|
],
|
|
27
17
|
"scripts": {
|
|
28
18
|
"dev": "tsx watch --env-file=.env.local src/server.ts",
|
|
29
|
-
"build": "tsc",
|
|
19
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
30
20
|
"start": "node dist/server.js",
|
|
31
21
|
"test": "vitest run",
|
|
22
|
+
"test:pack": "node scripts/test-pack.mjs",
|
|
32
23
|
"lint": "eslint src/",
|
|
33
24
|
"typecheck": "tsc --noEmit",
|
|
34
25
|
"format": "prettier --write src/",
|
|
35
|
-
"format:check": "prettier --check src/"
|
|
26
|
+
"format:check": "prettier --check src/",
|
|
27
|
+
"prepublishOnly": "npm run build && npm run test:pack"
|
|
36
28
|
},
|
|
37
29
|
"dependencies": {
|
|
38
30
|
"browserclaw": "^0.12.7",
|