browserclaw-agent 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 (77) hide show
  1. package/dist/agent-loop.d.ts +49 -0
  2. package/dist/agent-loop.d.ts.map +1 -0
  3. package/dist/agent-loop.js +1574 -0
  4. package/dist/agent-loop.js.map +1 -0
  5. package/dist/config.d.ts +33 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +73 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/content-policy.d.ts +5 -0
  10. package/dist/content-policy.d.ts.map +1 -0
  11. package/dist/content-policy.js +17 -0
  12. package/dist/content-policy.js.map +1 -0
  13. package/dist/index.d.ts +18 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +14 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/judge.d.ts +8 -0
  18. package/dist/judge.d.ts.map +1 -0
  19. package/dist/judge.js +57 -0
  20. package/dist/judge.js.map +1 -0
  21. package/dist/llm.d.ts +46 -0
  22. package/dist/llm.d.ts.map +1 -0
  23. package/dist/llm.js +441 -0
  24. package/dist/llm.js.map +1 -0
  25. package/dist/logger.d.ts +3 -0
  26. package/dist/logger.d.ts.map +1 -0
  27. package/dist/logger.js +10 -0
  28. package/dist/logger.js.map +1 -0
  29. package/dist/parse-json-response.d.ts +6 -0
  30. package/dist/parse-json-response.d.ts.map +1 -0
  31. package/dist/parse-json-response.js +52 -0
  32. package/dist/parse-json-response.js.map +1 -0
  33. package/dist/skills/cdp-utils.d.ts +4 -0
  34. package/dist/skills/cdp-utils.d.ts.map +1 -0
  35. package/dist/skills/cdp-utils.js +25 -0
  36. package/dist/skills/cdp-utils.js.map +1 -0
  37. package/dist/skills/cloudflare-checkbox.d.ts +3 -0
  38. package/dist/skills/cloudflare-checkbox.d.ts.map +1 -0
  39. package/dist/skills/cloudflare-checkbox.js +108 -0
  40. package/dist/skills/cloudflare-checkbox.js.map +1 -0
  41. package/dist/skills/dismiss-popup.d.ts +4 -0
  42. package/dist/skills/dismiss-popup.d.ts.map +1 -0
  43. package/dist/skills/dismiss-popup.js +147 -0
  44. package/dist/skills/dismiss-popup.js.map +1 -0
  45. package/dist/skills/infinite-scroll.d.ts +32 -0
  46. package/dist/skills/infinite-scroll.d.ts.map +1 -0
  47. package/dist/skills/infinite-scroll.js +92 -0
  48. package/dist/skills/infinite-scroll.js.map +1 -0
  49. package/dist/skills/loop-detection.d.ts +16 -0
  50. package/dist/skills/loop-detection.d.ts.map +1 -0
  51. package/dist/skills/loop-detection.js +35 -0
  52. package/dist/skills/loop-detection.js.map +1 -0
  53. package/dist/skills/page-state.d.ts +11 -0
  54. package/dist/skills/page-state.d.ts.map +1 -0
  55. package/dist/skills/page-state.js +55 -0
  56. package/dist/skills/page-state.js.map +1 -0
  57. package/dist/skills/press-and-hold.d.ts +10 -0
  58. package/dist/skills/press-and-hold.d.ts.map +1 -0
  59. package/dist/skills/press-and-hold.js +183 -0
  60. package/dist/skills/press-and-hold.js.map +1 -0
  61. package/dist/skills/recovery.d.ts +20 -0
  62. package/dist/skills/recovery.d.ts.map +1 -0
  63. package/dist/skills/recovery.js +215 -0
  64. package/dist/skills/recovery.js.map +1 -0
  65. package/dist/skills/tab-manager.d.ts +18 -0
  66. package/dist/skills/tab-manager.d.ts.map +1 -0
  67. package/dist/skills/tab-manager.js +50 -0
  68. package/dist/skills/tab-manager.js.map +1 -0
  69. package/dist/types.d.ts +148 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +18 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/web-search.d.ts +2 -0
  74. package/dist/web-search.d.ts.map +1 -0
  75. package/dist/web-search.js +77 -0
  76. package/dist/web-search.js.map +1 -0
  77. package/package.json +60 -0
@@ -0,0 +1,148 @@
1
+ export interface Session {
2
+ id: string;
3
+ prompt: string;
4
+ created_at: string;
5
+ last_activity_at: string;
6
+ status: SessionStatus;
7
+ }
8
+ export interface UserMessage {
9
+ text: string;
10
+ receivedAt: Date;
11
+ }
12
+ export type SessionStatus = 'pending' | 'running' | 'waiting_for_user' | 'completed' | 'failed';
13
+ export type LlmProvider = 'anthropic' | 'openai' | 'openai-oauth' | 'gemini';
14
+ export interface LlmConfig {
15
+ provider: LlmProvider;
16
+ model: string;
17
+ api_key: string;
18
+ }
19
+ export interface CreateSessionRequest {
20
+ prompt: string;
21
+ url?: string;
22
+ headless?: boolean;
23
+ skip_moderation?: boolean;
24
+ /**
25
+ * When true, skip post-run work that exists on this service but not on
26
+ * bare OSS agents (skill generation, judge, domain-skill aggregation).
27
+ * Used by apples-to-apples comparison runs so token totals reflect only
28
+ * the agent loop itself.
29
+ */
30
+ skip_postprocessing?: boolean;
31
+ llm_config?: LlmConfig;
32
+ }
33
+ export type AgentActionType = 'click' | 'type' | 'navigate' | 'back' | 'select' | 'scroll' | 'keyboard' | 'wait' | 'press_and_hold' | 'click_cloudflare' | 'extract' | 'web_search' | 'switch_tab' | 'close_tab' | 'done' | 'fail' | 'ask_user';
34
+ export interface AgentAction {
35
+ action: AgentActionType;
36
+ reasoning: string;
37
+ /** Accumulated facts, data, findings across steps — the agent's persistent scratchpad */
38
+ memory?: string;
39
+ /** What the agent plans to do next — maintains goal focus across long runs */
40
+ next_goal?: string;
41
+ /** Assessment of whether the previous action achieved its goal */
42
+ evaluation_previous_goal?: string;
43
+ answer?: string;
44
+ ref?: string;
45
+ text?: string;
46
+ url?: string;
47
+ key?: string;
48
+ options?: string[];
49
+ direction?: 'up' | 'down';
50
+ /** JavaScript expression to evaluate in the page (for extract action) */
51
+ expression?: string;
52
+ /** Tab ID to switch to or close (for switch_tab / close_tab actions) */
53
+ tab_id?: string;
54
+ /** Hold duration in ms (for press_and_hold). Omit for the default 4–10s randomized hold. */
55
+ hold_ms?: number;
56
+ /** Search query (for web_search action) */
57
+ query?: string;
58
+ /** Result of extract action — set by the agent loop, shown in next step's history */
59
+ extract_result?: string;
60
+ /** Set by the agent loop when action execution fails — fed back to LLM in next step */
61
+ error_feedback?: string;
62
+ }
63
+ export interface AgentStep {
64
+ step: number;
65
+ action: AgentAction;
66
+ snapshot_text?: string;
67
+ url?: string;
68
+ page_title?: string;
69
+ timestamp: string;
70
+ user_response?: string;
71
+ /** Natural language description of the action outcome — what changed on the page */
72
+ outcome?: string;
73
+ }
74
+ export interface AgentProgress {
75
+ completed: string[];
76
+ current: string;
77
+ blocked_by: string | null;
78
+ }
79
+ export interface SkillOutput {
80
+ title: string;
81
+ description: string;
82
+ steps: SkillStep[];
83
+ tips: string[];
84
+ /** Patterns that worked well during execution */
85
+ what_worked?: string[];
86
+ /** Known failure modes from rejected runs */
87
+ failure_notes?: string[];
88
+ metadata: SkillMetadata;
89
+ markdown: string;
90
+ }
91
+ export interface SkillStep {
92
+ number: number;
93
+ description: string;
94
+ action: AgentActionType;
95
+ details?: string;
96
+ }
97
+ export interface SkillMetadata {
98
+ prompt: string;
99
+ url: string;
100
+ total_steps: number;
101
+ duration_ms: number;
102
+ generated_at: string;
103
+ }
104
+ export interface AgentLoopResult {
105
+ success: boolean;
106
+ steps: AgentStep[];
107
+ answer?: string;
108
+ error?: string;
109
+ duration_ms: number;
110
+ final_url?: string;
111
+ }
112
+ export interface CatalogSkill {
113
+ id: string;
114
+ domain: string;
115
+ skill: SkillOutput;
116
+ tags: string[];
117
+ created_at: string;
118
+ run_count: number;
119
+ }
120
+ export interface DomainSkillEntry {
121
+ domain: string;
122
+ skill: SkillOutput;
123
+ source: 'catalog' | 'generated';
124
+ tags: string[];
125
+ run_count: number;
126
+ }
127
+ export interface DomainLesson {
128
+ domain: string;
129
+ status: 'blocked' | 'worked';
130
+ reason: string;
131
+ last_seen: string;
132
+ }
133
+ export interface TaskLesson {
134
+ task_hash: string;
135
+ task_terms: string[];
136
+ domains: DomainLesson[];
137
+ updated_at: string;
138
+ }
139
+ export declare class HttpError extends Error {
140
+ readonly statusCode: number;
141
+ constructor(statusCode: number, message: string);
142
+ }
143
+ export declare class LlmParseError extends Error {
144
+ /** First 500 chars of the raw LLM response for diagnostics */
145
+ readonly responseSnippet: string;
146
+ constructor(message: string, rawResponse: string);
147
+ }
148
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,18 @@
1
+ export class HttpError extends Error {
2
+ statusCode;
3
+ constructor(statusCode, message) {
4
+ super(message);
5
+ this.statusCode = statusCode;
6
+ this.name = 'HttpError';
7
+ }
8
+ }
9
+ export class LlmParseError extends Error {
10
+ /** First 500 chars of the raw LLM response for diagnostics */
11
+ responseSnippet;
12
+ constructor(message, rawResponse) {
13
+ super(message);
14
+ this.name = 'LlmParseError';
15
+ this.responseSnippet = rawResponse.slice(0, 500);
16
+ }
17
+ }
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA6KA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IADlB,YACkB,UAAkB,EAClC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAIlC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,8DAA8D;IACrD,eAAe,CAAS;IAEjC,YAAY,OAAe,EAAE,WAAmB;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function webSearch(query: string): Promise<string>;
2
+ //# sourceMappingURL=web-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../src/web-search.ts"],"names":[],"mappings":"AAwDA,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC9D"}
@@ -0,0 +1,77 @@
1
+ import { logger } from './logger.js';
2
+ const SEARCH_URL = 'https://html.duckduckgo.com/html/';
3
+ const MAX_RESULTS = 10;
4
+ const FETCH_TIMEOUT_MS = 8000;
5
+ function stripHtml(raw) {
6
+ const TAG_RE = /<[^>]+>/g;
7
+ let text = raw;
8
+ let prev;
9
+ do {
10
+ prev = text;
11
+ text = text.replace(TAG_RE, '');
12
+ } while (text !== prev);
13
+ return text.trim();
14
+ }
15
+ function parseResults(html) {
16
+ const results = [];
17
+ const linkRegex = /<a[^>]+class="result__a"[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/gs;
18
+ const snippetRegex = /<a[^>]+class="result__snippet"[^>]*>(.*?)<\/a>/gs;
19
+ const links = [...html.matchAll(linkRegex)];
20
+ const snippets = [...html.matchAll(snippetRegex)];
21
+ for (let i = 0; i < Math.min(links.length, MAX_RESULTS); i++) {
22
+ const link = links[i];
23
+ const rawUrl = link[1];
24
+ const title = stripHtml(link[2]);
25
+ const snippet = stripHtml(snippets[i]?.[1] ?? '');
26
+ let url = rawUrl;
27
+ const uddg = /[?&]uddg=([^&]+)/.exec(rawUrl);
28
+ if (uddg?.[1] !== undefined) {
29
+ url = decodeURIComponent(uddg[1]);
30
+ }
31
+ if (title !== '' && url !== '') {
32
+ results.push({ title, url, snippet });
33
+ }
34
+ }
35
+ return results;
36
+ }
37
+ function formatResults(results) {
38
+ if (results.length === 0)
39
+ return 'No results found.';
40
+ return results.map((r, i) => `${String(i + 1)}. ${r.title}\n ${r.url}\n ${r.snippet}`).join('\n\n');
41
+ }
42
+ export async function webSearch(query) {
43
+ try {
44
+ const params = new URLSearchParams({ q: query });
45
+ const controller = new AbortController();
46
+ const timeout = setTimeout(() => {
47
+ controller.abort();
48
+ }, FETCH_TIMEOUT_MS);
49
+ let res;
50
+ try {
51
+ res = await fetch(`${SEARCH_URL}?${params.toString()}`, {
52
+ method: 'GET',
53
+ headers: {
54
+ 'User-Agent': 'Mozilla/5.0 (compatible; browserclaw/1.0)',
55
+ Accept: 'text/html',
56
+ },
57
+ signal: controller.signal,
58
+ });
59
+ }
60
+ finally {
61
+ clearTimeout(timeout);
62
+ }
63
+ if (!res.ok) {
64
+ return `Search failed: HTTP ${String(res.status)}`;
65
+ }
66
+ const html = await res.text();
67
+ const results = parseResults(html);
68
+ logger.info({ query, resultCount: results.length }, 'Web search');
69
+ return formatResults(results);
70
+ }
71
+ catch (err) {
72
+ const msg = err instanceof Error ? err.message : 'unknown error';
73
+ logger.warn({ query, err: msg }, 'Web search failed');
74
+ return `Search failed: ${msg}`;
75
+ }
76
+ }
77
+ //# sourceMappingURL=web-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.js","sourceRoot":"","sources":["../src/web-search.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "browserclaw-agent",
3
+ "version": "0.1.0",
4
+ "description": "Browser automation agent loop powered by browserclaw",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist/index.*",
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/"
26
+ ],
27
+ "scripts": {
28
+ "dev": "tsx watch --env-file=.env.local src/server.ts",
29
+ "build": "tsc",
30
+ "start": "node dist/server.js",
31
+ "test": "vitest run",
32
+ "lint": "eslint src/",
33
+ "typecheck": "tsc --noEmit",
34
+ "format": "prettier --write src/",
35
+ "format:check": "prettier --check src/"
36
+ },
37
+ "dependencies": {
38
+ "browserclaw": "^0.12.7",
39
+ "openai": "^4.80.0",
40
+ "pino": "^10.3.1"
41
+ },
42
+ "optionalDependencies": {
43
+ "@anthropic-ai/sdk": "^0.39.0",
44
+ "@aws-sdk/client-s3": "^3.750.0",
45
+ "@types/ws": "^8.18.1",
46
+ "ws": "^8.19.0"
47
+ },
48
+ "devDependencies": {
49
+ "@eslint/js": "^10.0.1",
50
+ "@types/node": "^22.0.0",
51
+ "eslint": "^10.1.0",
52
+ "eslint-config-prettier": "^10.1.8",
53
+ "jiti": "^2.6.1",
54
+ "prettier": "^3.8.1",
55
+ "tsx": "^4.19.0",
56
+ "typescript": "^5.7.0",
57
+ "typescript-eslint": "^8.57.2",
58
+ "vitest": "^4.1.0"
59
+ }
60
+ }