@usecrow/client 0.1.17 → 0.1.19

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browserUse.ts","../src/browser.ts"],"names":["PageController"],"mappings":"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","file":"browser.cjs","sourcesContent":["/**\n * CrowBrowserUse - Client-side browser automation orchestrator\n *\n * Handles DOM operations via PageController while server makes LLM decisions.\n * API keys stay secure on the server.\n *\n * Usage:\n * - For widget/bundled contexts: import from '@usecrow/client/browser' which\n * statically imports PageController and injects it automatically.\n * - For standalone SDK: install @page-agent/page-controller and use dynamic import fallback.\n */\n\nimport type { ToolResult } from './types';\n\n// PageController types - using 'any' to avoid coupling to the optional peer dependency\ntype PageControllerInstance = any;\ntype PageControllerClass = any;\n\n// Injected PageController class (set by browser.ts for bundled contexts)\nlet injectedPageController: PageControllerClass | null = null;\n\n// Cached dynamic import module\nlet PageControllerModule: { PageController: PageControllerClass } | null = null;\n\n/**\n * Inject PageController class for bundled contexts.\n * Called by @usecrow/client/browser which does the static import.\n */\nexport function setPageController(PC: PageControllerClass): void {\n injectedPageController = PC;\n}\n\n/**\n * Get PageController class - uses injected version if available,\n * otherwise falls back to dynamic import.\n */\nasync function getPageController(): Promise<PageControllerClass> {\n // Use injected PageController if available (from browser.ts)\n if (injectedPageController) {\n return injectedPageController;\n }\n\n // Fallback to dynamic import for standalone SDK usage\n if (!PageControllerModule) {\n try {\n PageControllerModule = await import('@page-agent/page-controller') as any;\n } catch (error) {\n throw new Error(\n 'PageController not available. Either import from \"@usecrow/client/browser\" ' +\n 'or install @page-agent/page-controller as a dependency.'\n );\n }\n }\n return PageControllerModule!.PageController;\n}\n\ninterface BrowserUseConfig {\n productId: string;\n apiUrl: string;\n}\n\ninterface BrowserUseStartResponse {\n session_id: string;\n max_steps: number;\n}\n\ninterface BrowserUseStepResponse {\n done: boolean;\n success?: boolean;\n message?: string;\n action?: Record<string, unknown>;\n step?: number;\n reflection?: {\n evaluation?: string;\n memory?: string;\n next_goal?: string;\n };\n error?: string;\n}\n\nexport class CrowBrowserUse {\n private config: BrowserUseConfig;\n private pageController: PageControllerInstance | null = null;\n private sessionId: string | null = null;\n private maxSteps: number = 20;\n\n constructor(config: BrowserUseConfig) {\n this.config = config;\n }\n\n /**\n * Initialize PageController with non-blocking pointer\n */\n private async initPageController(): Promise<PageControllerInstance> {\n if (this.pageController) {\n return this.pageController;\n }\n\n try {\n const PageController = await getPageController();\n\n this.pageController = new PageController({\n enableMask: true,\n viewportExpansion: 500,\n highlightLabelOpacity: 0, // Hide numbered labels from users\n highlightOpacity: 0, // Hide highlight boxes from users\n });\n\n // Show mask and make it non-blocking\n await this.pageController.showMask();\n\n // Make pointer visible but non-blocking (access internal mask property)\n const mask = (this.pageController as any).mask;\n if (mask?.wrapper) {\n mask.wrapper.style.pointerEvents = 'none';\n }\n\n console.log('[CrowBrowserUse] PageController initialized with non-blocking pointer');\n return this.pageController;\n } catch (error) {\n console.error('[CrowBrowserUse] Failed to import @page-agent/page-controller:', error);\n throw new Error(\n 'Failed to initialize browser automation. Make sure @page-agent/page-controller is installed.'\n );\n }\n }\n\n /**\n * Execute a browser automation task\n */\n async execute(task: string): Promise<ToolResult> {\n console.log('[CrowBrowserUse] Starting task:', task);\n\n try {\n // Initialize PageController\n const controller = await this.initPageController();\n\n // Start session on server\n const startResponse = await this.startSession(task);\n this.sessionId = startResponse.session_id;\n this.maxSteps = startResponse.max_steps;\n\n console.log('[CrowBrowserUse] Session started:', this.sessionId);\n\n // Run the automation loop\n let stepCount = 0;\n let lastActionResult: string | undefined;\n\n while (stepCount < this.maxSteps) {\n stepCount++;\n\n // Get browser state\n const browserState = await controller.getBrowserState();\n\n // Send to server for LLM decision\n const stepResponse = await this.processStep(browserState, lastActionResult);\n\n // Check if done\n if (stepResponse.done) {\n console.log('[CrowBrowserUse] Task completed:', stepResponse.message);\n await this.cleanup();\n\n return {\n status: stepResponse.success ? 'success' : 'error',\n data: {\n message: stepResponse.message,\n steps: stepCount,\n },\n error: stepResponse.success ? undefined : stepResponse.message,\n };\n }\n\n // Check for error\n if (stepResponse.error) {\n console.error('[CrowBrowserUse] Error:', stepResponse.error);\n await this.cleanup();\n\n return {\n status: 'error',\n error: stepResponse.error,\n };\n }\n\n // Execute the action\n if (stepResponse.action) {\n lastActionResult = await this.executeAction(controller, stepResponse.action);\n console.log(`[CrowBrowserUse] Step ${stepCount}:`, lastActionResult);\n }\n\n // Log reflection if available\n if (stepResponse.reflection) {\n console.log('[CrowBrowserUse] Reflection:', stepResponse.reflection.next_goal);\n }\n }\n\n // Reached max steps\n await this.cleanup();\n return {\n status: 'error',\n error: `Task incomplete after ${this.maxSteps} steps`,\n };\n } catch (error) {\n console.error('[CrowBrowserUse] Error:', error);\n await this.cleanup();\n\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Start a browser-use session on the server\n */\n private async startSession(task: string): Promise<BrowserUseStartResponse> {\n const response = await fetch(`${this.config.apiUrl}/api/browser-use/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n product_id: this.config.productId,\n task,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ detail: 'Unknown error' }));\n throw new Error(error.detail || `Failed to start session: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Process a step on the server\n */\n private async processStep(\n browserState: {\n url: string;\n title: string;\n content: string;\n header: string;\n footer: string;\n },\n actionResult?: string\n ): Promise<BrowserUseStepResponse> {\n const response = await fetch(`${this.config.apiUrl}/api/browser-use/step`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n session_id: this.sessionId,\n product_id: this.config.productId,\n browser_state: browserState,\n action_result: actionResult,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ detail: 'Unknown error' }));\n throw new Error(error.detail || `Failed to process step: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Execute an action using PageController\n */\n private async executeAction(\n controller: PageControllerInstance,\n action: Record<string, unknown>\n ): Promise<string> {\n const actionName = Object.keys(action)[0];\n const actionParams = action[actionName] as Record<string, unknown>;\n\n try {\n switch (actionName) {\n case 'click_element_by_index': {\n const result = await controller.clickElement(actionParams.index as number);\n return result.message;\n }\n\n case 'input_text': {\n const result = await controller.inputText(\n actionParams.index as number,\n actionParams.text as string\n );\n return result.message;\n }\n\n case 'select_dropdown_option': {\n const result = await controller.selectOption(\n actionParams.index as number,\n actionParams.text as string\n );\n return result.message;\n }\n\n case 'scroll': {\n const result = await controller.scroll({\n down: actionParams.down as boolean,\n numPages: actionParams.num_pages as number,\n pixels: actionParams.pixels as number | undefined,\n index: actionParams.index as number | undefined,\n });\n return result.message;\n }\n\n case 'scroll_horizontally': {\n const result = await controller.scrollHorizontally({\n right: actionParams.right as boolean,\n pixels: actionParams.pixels as number,\n index: actionParams.index as number | undefined,\n });\n return result.message;\n }\n\n case 'wait': {\n const seconds = (actionParams.seconds as number) || 1;\n await new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n return `Waited ${seconds} seconds`;\n }\n\n case 'done': {\n // Done is handled at the step level, not here\n return 'Task completed';\n }\n\n default:\n return `Unknown action: ${actionName}`;\n }\n } catch (error) {\n return `Action failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n }\n\n /**\n * Cleanup resources\n */\n private async cleanup(): Promise<void> {\n if (this.pageController) {\n try {\n await this.pageController.hideMask();\n await this.pageController.cleanUpHighlights();\n this.pageController.dispose();\n } catch (error) {\n console.warn('[CrowBrowserUse] Cleanup error:', error);\n }\n this.pageController = null;\n }\n\n // End session on server if still active\n if (this.sessionId) {\n try {\n await fetch(`${this.config.apiUrl}/api/browser-use/end`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n session_id: this.sessionId,\n product_id: this.config.productId,\n }),\n });\n } catch (error) {\n // Ignore - session may have already ended\n }\n this.sessionId = null;\n }\n }\n\n /**\n * Stop the current task\n */\n async stop(): Promise<void> {\n await this.cleanup();\n }\n}\n","/**\n * @usecrow/client/browser - Browser automation module with PageController\n *\n * This module statically imports @page-agent/page-controller, making it\n * suitable for bundled contexts (widget, webpack, vite) where the import\n * can be resolved at build time.\n *\n * Usage:\n * ```typescript\n * import { createBrowserUseTool, CrowBrowserUse } from '@usecrow/client/browser';\n *\n * // Option 1: Create a tool handler for registration\n * const browserUseTool = createBrowserUseTool({ productId, apiUrl });\n * client.registerTools({ browser_use: browserUseTool });\n *\n * // Option 2: Use CrowBrowserUse directly\n * const browserUse = new CrowBrowserUse({ productId, apiUrl });\n * await browserUse.execute('Click the login button');\n * ```\n */\n\n// Static import of PageController - resolved at build time by bundler\nimport { PageController } from '@page-agent/page-controller';\nimport { CrowBrowserUse, setPageController } from './browserUse';\nimport type { ToolResult } from './types';\n\n// Inject PageController immediately when this module is imported\nsetPageController(PageController);\n\n// Re-export CrowBrowserUse for direct usage\nexport { CrowBrowserUse };\n\n// Re-export PageController for advanced usage\nexport { PageController };\n\nexport interface BrowserUseToolConfig {\n productId: string;\n apiUrl: string;\n}\n\nexport interface BrowserUseToolArgs {\n instruction: string;\n}\n\n/**\n * Create a browser_use tool handler for registration with CrowClient or widget.\n *\n * @param config - Configuration with productId and apiUrl\n * @returns Async function that executes browser automation tasks\n *\n * @example\n * ```typescript\n * // Widget usage\n * window.__crow_client_tools.browser_use = createBrowserUseTool({ productId, apiUrl });\n *\n * // SDK usage\n * client.registerTools({\n * browser_use: createBrowserUseTool({ productId, apiUrl })\n * });\n * ```\n */\nexport function createBrowserUseTool(config: BrowserUseToolConfig) {\n return async (args: BrowserUseToolArgs | Record<string, unknown>): Promise<ToolResult> => {\n const instruction = (args as BrowserUseToolArgs).instruction || (args as Record<string, unknown>).instruction as string;\n\n if (!instruction) {\n return {\n status: 'error',\n error: 'Missing instruction parameter for browser_use tool',\n };\n }\n\n const browserUse = new CrowBrowserUse({\n productId: config.productId,\n apiUrl: config.apiUrl,\n });\n\n return browserUse.execute(instruction);\n };\n}\n"]}
@@ -1,52 +0,0 @@
1
- export { PageController } from '@page-agent/page-controller';
2
- import { e as ToolResult } from './browserUse-CZNpayEF.cjs';
3
- export { g as CrowBrowserUse } from './browserUse-CZNpayEF.cjs';
4
-
5
- /**
6
- * @usecrow/client/browser - Browser automation module with PageController
7
- *
8
- * This module statically imports @page-agent/page-controller, making it
9
- * suitable for bundled contexts (widget, webpack, vite) where the import
10
- * can be resolved at build time.
11
- *
12
- * Usage:
13
- * ```typescript
14
- * import { createBrowserUseTool, CrowBrowserUse } from '@usecrow/client/browser';
15
- *
16
- * // Option 1: Create a tool handler for registration
17
- * const browserUseTool = createBrowserUseTool({ productId, apiUrl });
18
- * client.registerTools({ browser_use: browserUseTool });
19
- *
20
- * // Option 2: Use CrowBrowserUse directly
21
- * const browserUse = new CrowBrowserUse({ productId, apiUrl });
22
- * await browserUse.execute('Click the login button');
23
- * ```
24
- */
25
-
26
- interface BrowserUseToolConfig {
27
- productId: string;
28
- apiUrl: string;
29
- }
30
- interface BrowserUseToolArgs {
31
- instruction: string;
32
- }
33
- /**
34
- * Create a browser_use tool handler for registration with CrowClient or widget.
35
- *
36
- * @param config - Configuration with productId and apiUrl
37
- * @returns Async function that executes browser automation tasks
38
- *
39
- * @example
40
- * ```typescript
41
- * // Widget usage
42
- * window.__crow_client_tools.browser_use = createBrowserUseTool({ productId, apiUrl });
43
- *
44
- * // SDK usage
45
- * client.registerTools({
46
- * browser_use: createBrowserUseTool({ productId, apiUrl })
47
- * });
48
- * ```
49
- */
50
- declare function createBrowserUseTool(config: BrowserUseToolConfig): (args: BrowserUseToolArgs | Record<string, unknown>) => Promise<ToolResult>;
51
-
52
- export { type BrowserUseToolArgs, type BrowserUseToolConfig, createBrowserUseTool };
package/dist/browser.d.ts DELETED
@@ -1,52 +0,0 @@
1
- export { PageController } from '@page-agent/page-controller';
2
- import { e as ToolResult } from './browserUse-CZNpayEF.js';
3
- export { g as CrowBrowserUse } from './browserUse-CZNpayEF.js';
4
-
5
- /**
6
- * @usecrow/client/browser - Browser automation module with PageController
7
- *
8
- * This module statically imports @page-agent/page-controller, making it
9
- * suitable for bundled contexts (widget, webpack, vite) where the import
10
- * can be resolved at build time.
11
- *
12
- * Usage:
13
- * ```typescript
14
- * import { createBrowserUseTool, CrowBrowserUse } from '@usecrow/client/browser';
15
- *
16
- * // Option 1: Create a tool handler for registration
17
- * const browserUseTool = createBrowserUseTool({ productId, apiUrl });
18
- * client.registerTools({ browser_use: browserUseTool });
19
- *
20
- * // Option 2: Use CrowBrowserUse directly
21
- * const browserUse = new CrowBrowserUse({ productId, apiUrl });
22
- * await browserUse.execute('Click the login button');
23
- * ```
24
- */
25
-
26
- interface BrowserUseToolConfig {
27
- productId: string;
28
- apiUrl: string;
29
- }
30
- interface BrowserUseToolArgs {
31
- instruction: string;
32
- }
33
- /**
34
- * Create a browser_use tool handler for registration with CrowClient or widget.
35
- *
36
- * @param config - Configuration with productId and apiUrl
37
- * @returns Async function that executes browser automation tasks
38
- *
39
- * @example
40
- * ```typescript
41
- * // Widget usage
42
- * window.__crow_client_tools.browser_use = createBrowserUseTool({ productId, apiUrl });
43
- *
44
- * // SDK usage
45
- * client.registerTools({
46
- * browser_use: createBrowserUseTool({ productId, apiUrl })
47
- * });
48
- * ```
49
- */
50
- declare function createBrowserUseTool(config: BrowserUseToolConfig): (args: BrowserUseToolArgs | Record<string, unknown>) => Promise<ToolResult>;
51
-
52
- export { type BrowserUseToolArgs, type BrowserUseToolConfig, createBrowserUseTool };
package/dist/browser.js DELETED
@@ -1,278 +0,0 @@
1
- import { PageController } from '@page-agent/page-controller';
2
- export { PageController } from '@page-agent/page-controller';
3
-
4
- // src/browser.ts
5
-
6
- // src/browserUse.ts
7
- var injectedPageController = null;
8
- var PageControllerModule = null;
9
- function setPageController(PC) {
10
- injectedPageController = PC;
11
- }
12
- async function getPageController() {
13
- if (injectedPageController) {
14
- return injectedPageController;
15
- }
16
- if (!PageControllerModule) {
17
- try {
18
- PageControllerModule = await import('@page-agent/page-controller');
19
- } catch (error) {
20
- throw new Error(
21
- 'PageController not available. Either import from "@usecrow/client/browser" or install @page-agent/page-controller as a dependency.'
22
- );
23
- }
24
- }
25
- return PageControllerModule.PageController;
26
- }
27
- var CrowBrowserUse = class {
28
- constructor(config) {
29
- this.pageController = null;
30
- this.sessionId = null;
31
- this.maxSteps = 20;
32
- this.config = config;
33
- }
34
- /**
35
- * Initialize PageController with non-blocking pointer
36
- */
37
- async initPageController() {
38
- if (this.pageController) {
39
- return this.pageController;
40
- }
41
- try {
42
- const PageController2 = await getPageController();
43
- this.pageController = new PageController2({
44
- enableMask: true,
45
- viewportExpansion: 500,
46
- highlightLabelOpacity: 0,
47
- // Hide numbered labels from users
48
- highlightOpacity: 0
49
- // Hide highlight boxes from users
50
- });
51
- await this.pageController.showMask();
52
- const mask = this.pageController.mask;
53
- if (mask?.wrapper) {
54
- mask.wrapper.style.pointerEvents = "none";
55
- }
56
- console.log("[CrowBrowserUse] PageController initialized with non-blocking pointer");
57
- return this.pageController;
58
- } catch (error) {
59
- console.error("[CrowBrowserUse] Failed to import @page-agent/page-controller:", error);
60
- throw new Error(
61
- "Failed to initialize browser automation. Make sure @page-agent/page-controller is installed."
62
- );
63
- }
64
- }
65
- /**
66
- * Execute a browser automation task
67
- */
68
- async execute(task) {
69
- console.log("[CrowBrowserUse] Starting task:", task);
70
- try {
71
- const controller = await this.initPageController();
72
- const startResponse = await this.startSession(task);
73
- this.sessionId = startResponse.session_id;
74
- this.maxSteps = startResponse.max_steps;
75
- console.log("[CrowBrowserUse] Session started:", this.sessionId);
76
- let stepCount = 0;
77
- let lastActionResult;
78
- while (stepCount < this.maxSteps) {
79
- stepCount++;
80
- const browserState = await controller.getBrowserState();
81
- const stepResponse = await this.processStep(browserState, lastActionResult);
82
- if (stepResponse.done) {
83
- console.log("[CrowBrowserUse] Task completed:", stepResponse.message);
84
- await this.cleanup();
85
- return {
86
- status: stepResponse.success ? "success" : "error",
87
- data: {
88
- message: stepResponse.message,
89
- steps: stepCount
90
- },
91
- error: stepResponse.success ? void 0 : stepResponse.message
92
- };
93
- }
94
- if (stepResponse.error) {
95
- console.error("[CrowBrowserUse] Error:", stepResponse.error);
96
- await this.cleanup();
97
- return {
98
- status: "error",
99
- error: stepResponse.error
100
- };
101
- }
102
- if (stepResponse.action) {
103
- lastActionResult = await this.executeAction(controller, stepResponse.action);
104
- console.log(`[CrowBrowserUse] Step ${stepCount}:`, lastActionResult);
105
- }
106
- if (stepResponse.reflection) {
107
- console.log("[CrowBrowserUse] Reflection:", stepResponse.reflection.next_goal);
108
- }
109
- }
110
- await this.cleanup();
111
- return {
112
- status: "error",
113
- error: `Task incomplete after ${this.maxSteps} steps`
114
- };
115
- } catch (error) {
116
- console.error("[CrowBrowserUse] Error:", error);
117
- await this.cleanup();
118
- return {
119
- status: "error",
120
- error: error instanceof Error ? error.message : String(error)
121
- };
122
- }
123
- }
124
- /**
125
- * Start a browser-use session on the server
126
- */
127
- async startSession(task) {
128
- const response = await fetch(`${this.config.apiUrl}/api/browser-use/start`, {
129
- method: "POST",
130
- headers: { "Content-Type": "application/json" },
131
- body: JSON.stringify({
132
- product_id: this.config.productId,
133
- task
134
- })
135
- });
136
- if (!response.ok) {
137
- const error = await response.json().catch(() => ({ detail: "Unknown error" }));
138
- throw new Error(error.detail || `Failed to start session: ${response.status}`);
139
- }
140
- return response.json();
141
- }
142
- /**
143
- * Process a step on the server
144
- */
145
- async processStep(browserState, actionResult) {
146
- const response = await fetch(`${this.config.apiUrl}/api/browser-use/step`, {
147
- method: "POST",
148
- headers: { "Content-Type": "application/json" },
149
- body: JSON.stringify({
150
- session_id: this.sessionId,
151
- product_id: this.config.productId,
152
- browser_state: browserState,
153
- action_result: actionResult
154
- })
155
- });
156
- if (!response.ok) {
157
- const error = await response.json().catch(() => ({ detail: "Unknown error" }));
158
- throw new Error(error.detail || `Failed to process step: ${response.status}`);
159
- }
160
- return response.json();
161
- }
162
- /**
163
- * Execute an action using PageController
164
- */
165
- async executeAction(controller, action) {
166
- const actionName = Object.keys(action)[0];
167
- const actionParams = action[actionName];
168
- try {
169
- switch (actionName) {
170
- case "click_element_by_index": {
171
- const result = await controller.clickElement(actionParams.index);
172
- return result.message;
173
- }
174
- case "input_text": {
175
- const result = await controller.inputText(
176
- actionParams.index,
177
- actionParams.text
178
- );
179
- return result.message;
180
- }
181
- case "select_dropdown_option": {
182
- const result = await controller.selectOption(
183
- actionParams.index,
184
- actionParams.text
185
- );
186
- return result.message;
187
- }
188
- case "scroll": {
189
- const result = await controller.scroll({
190
- down: actionParams.down,
191
- numPages: actionParams.num_pages,
192
- pixels: actionParams.pixels,
193
- index: actionParams.index
194
- });
195
- return result.message;
196
- }
197
- case "scroll_horizontally": {
198
- const result = await controller.scrollHorizontally({
199
- right: actionParams.right,
200
- pixels: actionParams.pixels,
201
- index: actionParams.index
202
- });
203
- return result.message;
204
- }
205
- case "wait": {
206
- const seconds = actionParams.seconds || 1;
207
- await new Promise((resolve) => setTimeout(resolve, seconds * 1e3));
208
- return `Waited ${seconds} seconds`;
209
- }
210
- case "done": {
211
- return "Task completed";
212
- }
213
- default:
214
- return `Unknown action: ${actionName}`;
215
- }
216
- } catch (error) {
217
- return `Action failed: ${error instanceof Error ? error.message : String(error)}`;
218
- }
219
- }
220
- /**
221
- * Cleanup resources
222
- */
223
- async cleanup() {
224
- if (this.pageController) {
225
- try {
226
- await this.pageController.hideMask();
227
- await this.pageController.cleanUpHighlights();
228
- this.pageController.dispose();
229
- } catch (error) {
230
- console.warn("[CrowBrowserUse] Cleanup error:", error);
231
- }
232
- this.pageController = null;
233
- }
234
- if (this.sessionId) {
235
- try {
236
- await fetch(`${this.config.apiUrl}/api/browser-use/end`, {
237
- method: "POST",
238
- headers: { "Content-Type": "application/json" },
239
- body: JSON.stringify({
240
- session_id: this.sessionId,
241
- product_id: this.config.productId
242
- })
243
- });
244
- } catch (error) {
245
- }
246
- this.sessionId = null;
247
- }
248
- }
249
- /**
250
- * Stop the current task
251
- */
252
- async stop() {
253
- await this.cleanup();
254
- }
255
- };
256
-
257
- // src/browser.ts
258
- setPageController(PageController);
259
- function createBrowserUseTool(config) {
260
- return async (args) => {
261
- const instruction = args.instruction || args.instruction;
262
- if (!instruction) {
263
- return {
264
- status: "error",
265
- error: "Missing instruction parameter for browser_use tool"
266
- };
267
- }
268
- const browserUse = new CrowBrowserUse({
269
- productId: config.productId,
270
- apiUrl: config.apiUrl
271
- });
272
- return browserUse.execute(instruction);
273
- };
274
- }
275
-
276
- export { CrowBrowserUse, createBrowserUseTool };
277
- //# sourceMappingURL=browser.js.map
278
- //# sourceMappingURL=browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browserUse.ts","../src/browser.ts"],"names":["PageController"],"mappings":"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","file":"browser.js","sourcesContent":["/**\n * CrowBrowserUse - Client-side browser automation orchestrator\n *\n * Handles DOM operations via PageController while server makes LLM decisions.\n * API keys stay secure on the server.\n *\n * Usage:\n * - For widget/bundled contexts: import from '@usecrow/client/browser' which\n * statically imports PageController and injects it automatically.\n * - For standalone SDK: install @page-agent/page-controller and use dynamic import fallback.\n */\n\nimport type { ToolResult } from './types';\n\n// PageController types - using 'any' to avoid coupling to the optional peer dependency\ntype PageControllerInstance = any;\ntype PageControllerClass = any;\n\n// Injected PageController class (set by browser.ts for bundled contexts)\nlet injectedPageController: PageControllerClass | null = null;\n\n// Cached dynamic import module\nlet PageControllerModule: { PageController: PageControllerClass } | null = null;\n\n/**\n * Inject PageController class for bundled contexts.\n * Called by @usecrow/client/browser which does the static import.\n */\nexport function setPageController(PC: PageControllerClass): void {\n injectedPageController = PC;\n}\n\n/**\n * Get PageController class - uses injected version if available,\n * otherwise falls back to dynamic import.\n */\nasync function getPageController(): Promise<PageControllerClass> {\n // Use injected PageController if available (from browser.ts)\n if (injectedPageController) {\n return injectedPageController;\n }\n\n // Fallback to dynamic import for standalone SDK usage\n if (!PageControllerModule) {\n try {\n PageControllerModule = await import('@page-agent/page-controller') as any;\n } catch (error) {\n throw new Error(\n 'PageController not available. Either import from \"@usecrow/client/browser\" ' +\n 'or install @page-agent/page-controller as a dependency.'\n );\n }\n }\n return PageControllerModule!.PageController;\n}\n\ninterface BrowserUseConfig {\n productId: string;\n apiUrl: string;\n}\n\ninterface BrowserUseStartResponse {\n session_id: string;\n max_steps: number;\n}\n\ninterface BrowserUseStepResponse {\n done: boolean;\n success?: boolean;\n message?: string;\n action?: Record<string, unknown>;\n step?: number;\n reflection?: {\n evaluation?: string;\n memory?: string;\n next_goal?: string;\n };\n error?: string;\n}\n\nexport class CrowBrowserUse {\n private config: BrowserUseConfig;\n private pageController: PageControllerInstance | null = null;\n private sessionId: string | null = null;\n private maxSteps: number = 20;\n\n constructor(config: BrowserUseConfig) {\n this.config = config;\n }\n\n /**\n * Initialize PageController with non-blocking pointer\n */\n private async initPageController(): Promise<PageControllerInstance> {\n if (this.pageController) {\n return this.pageController;\n }\n\n try {\n const PageController = await getPageController();\n\n this.pageController = new PageController({\n enableMask: true,\n viewportExpansion: 500,\n highlightLabelOpacity: 0, // Hide numbered labels from users\n highlightOpacity: 0, // Hide highlight boxes from users\n });\n\n // Show mask and make it non-blocking\n await this.pageController.showMask();\n\n // Make pointer visible but non-blocking (access internal mask property)\n const mask = (this.pageController as any).mask;\n if (mask?.wrapper) {\n mask.wrapper.style.pointerEvents = 'none';\n }\n\n console.log('[CrowBrowserUse] PageController initialized with non-blocking pointer');\n return this.pageController;\n } catch (error) {\n console.error('[CrowBrowserUse] Failed to import @page-agent/page-controller:', error);\n throw new Error(\n 'Failed to initialize browser automation. Make sure @page-agent/page-controller is installed.'\n );\n }\n }\n\n /**\n * Execute a browser automation task\n */\n async execute(task: string): Promise<ToolResult> {\n console.log('[CrowBrowserUse] Starting task:', task);\n\n try {\n // Initialize PageController\n const controller = await this.initPageController();\n\n // Start session on server\n const startResponse = await this.startSession(task);\n this.sessionId = startResponse.session_id;\n this.maxSteps = startResponse.max_steps;\n\n console.log('[CrowBrowserUse] Session started:', this.sessionId);\n\n // Run the automation loop\n let stepCount = 0;\n let lastActionResult: string | undefined;\n\n while (stepCount < this.maxSteps) {\n stepCount++;\n\n // Get browser state\n const browserState = await controller.getBrowserState();\n\n // Send to server for LLM decision\n const stepResponse = await this.processStep(browserState, lastActionResult);\n\n // Check if done\n if (stepResponse.done) {\n console.log('[CrowBrowserUse] Task completed:', stepResponse.message);\n await this.cleanup();\n\n return {\n status: stepResponse.success ? 'success' : 'error',\n data: {\n message: stepResponse.message,\n steps: stepCount,\n },\n error: stepResponse.success ? undefined : stepResponse.message,\n };\n }\n\n // Check for error\n if (stepResponse.error) {\n console.error('[CrowBrowserUse] Error:', stepResponse.error);\n await this.cleanup();\n\n return {\n status: 'error',\n error: stepResponse.error,\n };\n }\n\n // Execute the action\n if (stepResponse.action) {\n lastActionResult = await this.executeAction(controller, stepResponse.action);\n console.log(`[CrowBrowserUse] Step ${stepCount}:`, lastActionResult);\n }\n\n // Log reflection if available\n if (stepResponse.reflection) {\n console.log('[CrowBrowserUse] Reflection:', stepResponse.reflection.next_goal);\n }\n }\n\n // Reached max steps\n await this.cleanup();\n return {\n status: 'error',\n error: `Task incomplete after ${this.maxSteps} steps`,\n };\n } catch (error) {\n console.error('[CrowBrowserUse] Error:', error);\n await this.cleanup();\n\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Start a browser-use session on the server\n */\n private async startSession(task: string): Promise<BrowserUseStartResponse> {\n const response = await fetch(`${this.config.apiUrl}/api/browser-use/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n product_id: this.config.productId,\n task,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ detail: 'Unknown error' }));\n throw new Error(error.detail || `Failed to start session: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Process a step on the server\n */\n private async processStep(\n browserState: {\n url: string;\n title: string;\n content: string;\n header: string;\n footer: string;\n },\n actionResult?: string\n ): Promise<BrowserUseStepResponse> {\n const response = await fetch(`${this.config.apiUrl}/api/browser-use/step`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n session_id: this.sessionId,\n product_id: this.config.productId,\n browser_state: browserState,\n action_result: actionResult,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ detail: 'Unknown error' }));\n throw new Error(error.detail || `Failed to process step: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Execute an action using PageController\n */\n private async executeAction(\n controller: PageControllerInstance,\n action: Record<string, unknown>\n ): Promise<string> {\n const actionName = Object.keys(action)[0];\n const actionParams = action[actionName] as Record<string, unknown>;\n\n try {\n switch (actionName) {\n case 'click_element_by_index': {\n const result = await controller.clickElement(actionParams.index as number);\n return result.message;\n }\n\n case 'input_text': {\n const result = await controller.inputText(\n actionParams.index as number,\n actionParams.text as string\n );\n return result.message;\n }\n\n case 'select_dropdown_option': {\n const result = await controller.selectOption(\n actionParams.index as number,\n actionParams.text as string\n );\n return result.message;\n }\n\n case 'scroll': {\n const result = await controller.scroll({\n down: actionParams.down as boolean,\n numPages: actionParams.num_pages as number,\n pixels: actionParams.pixels as number | undefined,\n index: actionParams.index as number | undefined,\n });\n return result.message;\n }\n\n case 'scroll_horizontally': {\n const result = await controller.scrollHorizontally({\n right: actionParams.right as boolean,\n pixels: actionParams.pixels as number,\n index: actionParams.index as number | undefined,\n });\n return result.message;\n }\n\n case 'wait': {\n const seconds = (actionParams.seconds as number) || 1;\n await new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n return `Waited ${seconds} seconds`;\n }\n\n case 'done': {\n // Done is handled at the step level, not here\n return 'Task completed';\n }\n\n default:\n return `Unknown action: ${actionName}`;\n }\n } catch (error) {\n return `Action failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n }\n\n /**\n * Cleanup resources\n */\n private async cleanup(): Promise<void> {\n if (this.pageController) {\n try {\n await this.pageController.hideMask();\n await this.pageController.cleanUpHighlights();\n this.pageController.dispose();\n } catch (error) {\n console.warn('[CrowBrowserUse] Cleanup error:', error);\n }\n this.pageController = null;\n }\n\n // End session on server if still active\n if (this.sessionId) {\n try {\n await fetch(`${this.config.apiUrl}/api/browser-use/end`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n session_id: this.sessionId,\n product_id: this.config.productId,\n }),\n });\n } catch (error) {\n // Ignore - session may have already ended\n }\n this.sessionId = null;\n }\n }\n\n /**\n * Stop the current task\n */\n async stop(): Promise<void> {\n await this.cleanup();\n }\n}\n","/**\n * @usecrow/client/browser - Browser automation module with PageController\n *\n * This module statically imports @page-agent/page-controller, making it\n * suitable for bundled contexts (widget, webpack, vite) where the import\n * can be resolved at build time.\n *\n * Usage:\n * ```typescript\n * import { createBrowserUseTool, CrowBrowserUse } from '@usecrow/client/browser';\n *\n * // Option 1: Create a tool handler for registration\n * const browserUseTool = createBrowserUseTool({ productId, apiUrl });\n * client.registerTools({ browser_use: browserUseTool });\n *\n * // Option 2: Use CrowBrowserUse directly\n * const browserUse = new CrowBrowserUse({ productId, apiUrl });\n * await browserUse.execute('Click the login button');\n * ```\n */\n\n// Static import of PageController - resolved at build time by bundler\nimport { PageController } from '@page-agent/page-controller';\nimport { CrowBrowserUse, setPageController } from './browserUse';\nimport type { ToolResult } from './types';\n\n// Inject PageController immediately when this module is imported\nsetPageController(PageController);\n\n// Re-export CrowBrowserUse for direct usage\nexport { CrowBrowserUse };\n\n// Re-export PageController for advanced usage\nexport { PageController };\n\nexport interface BrowserUseToolConfig {\n productId: string;\n apiUrl: string;\n}\n\nexport interface BrowserUseToolArgs {\n instruction: string;\n}\n\n/**\n * Create a browser_use tool handler for registration with CrowClient or widget.\n *\n * @param config - Configuration with productId and apiUrl\n * @returns Async function that executes browser automation tasks\n *\n * @example\n * ```typescript\n * // Widget usage\n * window.__crow_client_tools.browser_use = createBrowserUseTool({ productId, apiUrl });\n *\n * // SDK usage\n * client.registerTools({\n * browser_use: createBrowserUseTool({ productId, apiUrl })\n * });\n * ```\n */\nexport function createBrowserUseTool(config: BrowserUseToolConfig) {\n return async (args: BrowserUseToolArgs | Record<string, unknown>): Promise<ToolResult> => {\n const instruction = (args as BrowserUseToolArgs).instruction || (args as Record<string, unknown>).instruction as string;\n\n if (!instruction) {\n return {\n status: 'error',\n error: 'Missing instruction parameter for browser_use tool',\n };\n }\n\n const browserUse = new CrowBrowserUse({\n productId: config.productId,\n apiUrl: config.apiUrl,\n });\n\n return browserUse.execute(instruction);\n };\n}\n"]}
@@ -1,188 +0,0 @@
1
- /**
2
- * Core types for @usecrow/client
3
- */
4
- interface CrowClientConfig {
5
- /** Your Crow product ID from the dashboard */
6
- productId: string;
7
- /** API URL (defaults to https://api.usecrow.org) */
8
- apiUrl?: string;
9
- /** Default model to use */
10
- model?: string;
11
- }
12
- interface IdentifyOptions {
13
- /** JWT token from your backend for user verification */
14
- token: string;
15
- /** Optional user display name */
16
- name?: string;
17
- /** Optional user email */
18
- email?: string;
19
- /** Any additional metadata */
20
- [key: string]: unknown;
21
- }
22
- interface IdentityState {
23
- token: string | null;
24
- metadata: Record<string, unknown>;
25
- isVerified: boolean;
26
- }
27
- interface Message {
28
- id: string;
29
- content: string;
30
- role: 'user' | 'assistant';
31
- timestamp: Date;
32
- /** Citations from knowledge base */
33
- citations?: Citation[];
34
- /** Claude's reasoning/thinking trace */
35
- thinking?: string;
36
- /** Whether thinking is complete */
37
- thinkingComplete?: boolean;
38
- }
39
- interface Citation {
40
- document_id: string;
41
- filename: string;
42
- similarity?: number;
43
- image_url?: string;
44
- page?: number;
45
- }
46
- type StreamEvent = {
47
- type: 'content';
48
- text: string;
49
- accumulated: string;
50
- } | {
51
- type: 'thinking';
52
- content: string;
53
- } | {
54
- type: 'thinking_complete';
55
- } | {
56
- type: 'citations';
57
- citations: Citation[];
58
- } | {
59
- type: 'tool_call_start';
60
- toolName: string;
61
- arguments: Record<string, unknown>;
62
- } | {
63
- type: 'tool_call_complete';
64
- toolName: string;
65
- success: boolean;
66
- } | {
67
- type: 'client_tool_call';
68
- toolName: string;
69
- arguments: Record<string, unknown>;
70
- } | {
71
- type: 'workflow_started';
72
- name: string;
73
- todos: WorkflowTodo[];
74
- } | {
75
- type: 'workflow_todo_updated';
76
- todoId: string;
77
- status: 'pending' | 'completed';
78
- } | {
79
- type: 'workflow_ended';
80
- } | {
81
- type: 'workflow_complete_prompt';
82
- } | {
83
- type: 'verification_status';
84
- isVerified: boolean;
85
- } | {
86
- type: 'conversation_id';
87
- conversationId: string;
88
- } | {
89
- type: 'error';
90
- message: string;
91
- } | {
92
- type: 'done';
93
- };
94
- type ToolHandler = (args: Record<string, unknown>) => Promise<ToolResult> | ToolResult;
95
- interface ToolResult {
96
- status: 'success' | 'error';
97
- data?: unknown;
98
- error?: string;
99
- }
100
- type ToolHandlers = Record<string, ToolHandler>;
101
- interface Conversation {
102
- id: string;
103
- name: string | null;
104
- created_at: string;
105
- updated_at: string;
106
- }
107
- interface WorkflowTodo {
108
- id: string;
109
- text: string;
110
- status: 'pending' | 'completed';
111
- }
112
- interface ActiveWorkflow {
113
- name: string;
114
- todos: WorkflowTodo[];
115
- isComplete?: boolean;
116
- }
117
- interface ContextData {
118
- /** Current page URL or path */
119
- page?: string;
120
- /** Custom context data */
121
- [key: string]: unknown;
122
- }
123
- interface CrowEventCallbacks {
124
- onMessage?: (message: Message) => void;
125
- onMessageUpdate?: (messageId: string, updates: Partial<Message>) => void;
126
- onToolCall?: (event: StreamEvent & {
127
- type: 'tool_call_start' | 'tool_call_complete' | 'client_tool_call';
128
- }) => void;
129
- onWorkflow?: (event: StreamEvent & {
130
- type: 'workflow_started' | 'workflow_todo_updated' | 'workflow_ended' | 'workflow_complete_prompt';
131
- }) => void;
132
- onVerificationStatus?: (isVerified: boolean) => void;
133
- onError?: (error: Error) => void;
134
- }
135
-
136
- /**
137
- * CrowBrowserUse - Client-side browser automation orchestrator
138
- *
139
- * Handles DOM operations via PageController while server makes LLM decisions.
140
- * API keys stay secure on the server.
141
- *
142
- * Usage:
143
- * - For widget/bundled contexts: import from '@usecrow/client/browser' which
144
- * statically imports PageController and injects it automatically.
145
- * - For standalone SDK: install @page-agent/page-controller and use dynamic import fallback.
146
- */
147
-
148
- interface BrowserUseConfig {
149
- productId: string;
150
- apiUrl: string;
151
- }
152
- declare class CrowBrowserUse {
153
- private config;
154
- private pageController;
155
- private sessionId;
156
- private maxSteps;
157
- constructor(config: BrowserUseConfig);
158
- /**
159
- * Initialize PageController with non-blocking pointer
160
- */
161
- private initPageController;
162
- /**
163
- * Execute a browser automation task
164
- */
165
- execute(task: string): Promise<ToolResult>;
166
- /**
167
- * Start a browser-use session on the server
168
- */
169
- private startSession;
170
- /**
171
- * Process a step on the server
172
- */
173
- private processStep;
174
- /**
175
- * Execute an action using PageController
176
- */
177
- private executeAction;
178
- /**
179
- * Cleanup resources
180
- */
181
- private cleanup;
182
- /**
183
- * Stop the current task
184
- */
185
- stop(): Promise<void>;
186
- }
187
-
188
- export { type ActiveWorkflow as A, type CrowClientConfig as C, type IdentifyOptions as I, type Message as M, type StreamEvent as S, type ToolHandlers as T, type WorkflowTodo as W, type CrowEventCallbacks as a, type ContextData as b, type Conversation as c, type IdentityState as d, type ToolResult as e, type Citation as f, CrowBrowserUse as g, type ToolHandler as h };