@bctrl/sdk 1.0.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.
Files changed (260) hide show
  1. package/README.md +75 -0
  2. package/dist/agents/browser-use/index.d.ts +1 -0
  3. package/dist/agents/browser-use/index.js +9 -0
  4. package/dist/agents/browser-use/namespace.d.ts +39 -0
  5. package/dist/agents/browser-use/namespace.js +93 -0
  6. package/dist/agents/index.d.ts +2 -0
  7. package/dist/agents/index.js +17 -0
  8. package/dist/agents/stagehand/core.d.ts +93 -0
  9. package/dist/agents/stagehand/core.js +144 -0
  10. package/dist/agents/stagehand/index.d.ts +3 -0
  11. package/dist/agents/stagehand/index.js +24 -0
  12. package/dist/agents/stagehand/namespace.d.ts +51 -0
  13. package/dist/agents/stagehand/namespace.js +65 -0
  14. package/dist/ai-credentials/client.d.ts +12 -0
  15. package/dist/ai-credentials/client.js +70 -0
  16. package/dist/ai-credentials/index.d.ts +1 -0
  17. package/dist/ai-credentials/index.js +1 -0
  18. package/dist/base/event-binding.d.ts +7 -0
  19. package/dist/base/event-binding.js +23 -0
  20. package/dist/base/types.d.ts +109 -0
  21. package/dist/base/types.js +4 -0
  22. package/dist/bctrl.d.ts +37 -0
  23. package/dist/bctrl.js +77 -0
  24. package/dist/browser-extensions/client.d.ts +15 -0
  25. package/dist/browser-extensions/client.js +72 -0
  26. package/dist/browser-extensions/index.d.ts +2 -0
  27. package/dist/browser-extensions/index.js +1 -0
  28. package/dist/browser-profiles/client.d.ts +11 -0
  29. package/dist/browser-profiles/client.js +63 -0
  30. package/dist/browser-profiles/index.d.ts +1 -0
  31. package/dist/browser-profiles/index.js +1 -0
  32. package/dist/captcha/index.d.ts +1 -0
  33. package/dist/captcha/index.js +1 -0
  34. package/dist/captcha/namespace.d.ts +34 -0
  35. package/dist/captcha/namespace.js +41 -0
  36. package/dist/client/index.d.ts +1 -0
  37. package/dist/client/index.js +1 -0
  38. package/dist/client/rpc.d.ts +83 -0
  39. package/dist/client/rpc.js +354 -0
  40. package/dist/config.d.ts +5 -0
  41. package/dist/config.js +28 -0
  42. package/dist/constants/browser.d.ts +2 -0
  43. package/dist/constants/browser.js +1 -0
  44. package/dist/contracts/agent-tools.d.ts +45 -0
  45. package/dist/contracts/agent-tools.js +31 -0
  46. package/dist/contracts/automation.d.ts +265 -0
  47. package/dist/contracts/automation.js +109 -0
  48. package/dist/contracts/browser-management.d.ts +179 -0
  49. package/dist/contracts/browser-management.js +95 -0
  50. package/dist/contracts/browser-use.d.ts +136 -0
  51. package/dist/contracts/browser-use.js +93 -0
  52. package/dist/contracts/captcha.d.ts +114 -0
  53. package/dist/contracts/captcha.js +40 -0
  54. package/dist/contracts/desktop.d.ts +223 -0
  55. package/dist/contracts/desktop.js +121 -0
  56. package/dist/contracts/drivers/playwright.d.ts +2008 -0
  57. package/dist/contracts/drivers/playwright.js +2033 -0
  58. package/dist/contracts/drivers/puppeteer.d.ts +1221 -0
  59. package/dist/contracts/drivers/puppeteer.js +941 -0
  60. package/dist/contracts/drivers/selenium.d.ts +156 -0
  61. package/dist/contracts/drivers/selenium.js +61 -0
  62. package/dist/contracts/drivers/stagehand.d.ts +155 -0
  63. package/dist/contracts/drivers/stagehand.js +7 -0
  64. package/dist/contracts/extensions.d.ts +13 -0
  65. package/dist/contracts/extensions.js +9 -0
  66. package/dist/contracts/index.d.ts +13 -0
  67. package/dist/contracts/index.js +13 -0
  68. package/dist/contracts/public-api.d.ts +360 -0
  69. package/dist/contracts/public-api.js +17 -0
  70. package/dist/contracts/runtime.d.ts +81 -0
  71. package/dist/contracts/runtime.js +16 -0
  72. package/dist/contracts/stagehand.d.ts +253 -0
  73. package/dist/contracts/stagehand.js +145 -0
  74. package/dist/contracts/storage.d.ts +51 -0
  75. package/dist/contracts/storage.js +56 -0
  76. package/dist/contracts/vault.d.ts +119 -0
  77. package/dist/contracts/vault.js +112 -0
  78. package/dist/contracts/version.d.ts +3 -0
  79. package/dist/contracts/version.js +16 -0
  80. package/dist/desktop.d.ts +2 -0
  81. package/dist/desktop.js +3 -0
  82. package/dist/drivers/desktop/index.d.ts +65 -0
  83. package/dist/drivers/desktop/index.js +68 -0
  84. package/dist/drivers/desktop/session.d.ts +313 -0
  85. package/dist/drivers/desktop/session.js +432 -0
  86. package/dist/drivers/playwright/event-emitter.d.ts +160 -0
  87. package/dist/drivers/playwright/event-emitter.js +297 -0
  88. package/dist/drivers/playwright/generated/api-request-context.d.ts +137 -0
  89. package/dist/drivers/playwright/generated/api-request-context.js +154 -0
  90. package/dist/drivers/playwright/generated/api-response.d.ts +119 -0
  91. package/dist/drivers/playwright/generated/api-response.js +123 -0
  92. package/dist/drivers/playwright/generated/browser-context.d.ts +284 -0
  93. package/dist/drivers/playwright/generated/browser-context.js +458 -0
  94. package/dist/drivers/playwright/generated/browser.d.ts +120 -0
  95. package/dist/drivers/playwright/generated/browser.js +151 -0
  96. package/dist/drivers/playwright/generated/clock.d.ts +80 -0
  97. package/dist/drivers/playwright/generated/clock.js +94 -0
  98. package/dist/drivers/playwright/generated/console-message.d.ts +94 -0
  99. package/dist/drivers/playwright/generated/console-message.js +89 -0
  100. package/dist/drivers/playwright/generated/coverage.d.ts +57 -0
  101. package/dist/drivers/playwright/generated/coverage.js +66 -0
  102. package/dist/drivers/playwright/generated/dialog.d.ts +79 -0
  103. package/dist/drivers/playwright/generated/dialog.js +80 -0
  104. package/dist/drivers/playwright/generated/element-handle.d.ts +399 -0
  105. package/dist/drivers/playwright/generated/element-handle.js +501 -0
  106. package/dist/drivers/playwright/generated/frame-locator.d.ts +34 -0
  107. package/dist/drivers/playwright/generated/frame-locator.js +63 -0
  108. package/dist/drivers/playwright/generated/frame.d.ts +557 -0
  109. package/dist/drivers/playwright/generated/frame.js +634 -0
  110. package/dist/drivers/playwright/generated/js-handle.d.ts +72 -0
  111. package/dist/drivers/playwright/generated/js-handle.js +92 -0
  112. package/dist/drivers/playwright/generated/keyboard.d.ts +103 -0
  113. package/dist/drivers/playwright/generated/keyboard.js +113 -0
  114. package/dist/drivers/playwright/generated/locator.d.ts +795 -0
  115. package/dist/drivers/playwright/generated/locator.js +974 -0
  116. package/dist/drivers/playwright/generated/mouse.d.ts +97 -0
  117. package/dist/drivers/playwright/generated/mouse.js +109 -0
  118. package/dist/drivers/playwright/generated/page.d.ts +762 -0
  119. package/dist/drivers/playwright/generated/page.js +988 -0
  120. package/dist/drivers/playwright/generated/touchscreen.d.ts +34 -0
  121. package/dist/drivers/playwright/generated/touchscreen.js +37 -0
  122. package/dist/drivers/playwright/generated/tracing.d.ts +78 -0
  123. package/dist/drivers/playwright/generated/tracing.js +80 -0
  124. package/dist/drivers/playwright/generated/worker.d.ts +53 -0
  125. package/dist/drivers/playwright/generated/worker.js +59 -0
  126. package/dist/drivers/playwright/index.d.ts +19 -0
  127. package/dist/drivers/playwright/index.js +20 -0
  128. package/dist/drivers/playwright/remote-base.d.ts +62 -0
  129. package/dist/drivers/playwright/remote-base.js +86 -0
  130. package/dist/drivers/playwright/types.d.ts +148 -0
  131. package/dist/drivers/playwright/types.js +8 -0
  132. package/dist/drivers/puppeteer/errors.d.ts +50 -0
  133. package/dist/drivers/puppeteer/errors.js +71 -0
  134. package/dist/drivers/puppeteer/event-emitter.d.ts +145 -0
  135. package/dist/drivers/puppeteer/event-emitter.js +259 -0
  136. package/dist/drivers/puppeteer/generated/accessibility.d.ts +77 -0
  137. package/dist/drivers/puppeteer/generated/accessibility.js +74 -0
  138. package/dist/drivers/puppeteer/generated/browser-context.d.ts +116 -0
  139. package/dist/drivers/puppeteer/generated/browser-context.js +168 -0
  140. package/dist/drivers/puppeteer/generated/browser.d.ts +169 -0
  141. package/dist/drivers/puppeteer/generated/browser.js +246 -0
  142. package/dist/drivers/puppeteer/generated/console-message.d.ts +54 -0
  143. package/dist/drivers/puppeteer/generated/console-message.js +69 -0
  144. package/dist/drivers/puppeteer/generated/coverage.d.ts +49 -0
  145. package/dist/drivers/puppeteer/generated/coverage.js +57 -0
  146. package/dist/drivers/puppeteer/generated/dialog.d.ts +46 -0
  147. package/dist/drivers/puppeteer/generated/dialog.js +60 -0
  148. package/dist/drivers/puppeteer/generated/element-handle.d.ts +261 -0
  149. package/dist/drivers/puppeteer/generated/element-handle.js +341 -0
  150. package/dist/drivers/puppeteer/generated/file-chooser.d.ts +34 -0
  151. package/dist/drivers/puppeteer/generated/file-chooser.js +43 -0
  152. package/dist/drivers/puppeteer/generated/frame.d.ts +221 -0
  153. package/dist/drivers/puppeteer/generated/frame.js +302 -0
  154. package/dist/drivers/puppeteer/generated/http-request.d.ts +195 -0
  155. package/dist/drivers/puppeteer/generated/http-request.js +243 -0
  156. package/dist/drivers/puppeteer/generated/http-response.d.ts +142 -0
  157. package/dist/drivers/puppeteer/generated/http-response.js +169 -0
  158. package/dist/drivers/puppeteer/generated/js-handle.d.ts +104 -0
  159. package/dist/drivers/puppeteer/generated/js-handle.js +125 -0
  160. package/dist/drivers/puppeteer/generated/keyboard.d.ts +79 -0
  161. package/dist/drivers/puppeteer/generated/keyboard.js +89 -0
  162. package/dist/drivers/puppeteer/generated/locator.d.ts +141 -0
  163. package/dist/drivers/puppeteer/generated/locator.js +164 -0
  164. package/dist/drivers/puppeteer/generated/mouse.d.ts +74 -0
  165. package/dist/drivers/puppeteer/generated/mouse.js +94 -0
  166. package/dist/drivers/puppeteer/generated/page.d.ts +604 -0
  167. package/dist/drivers/puppeteer/generated/page.js +776 -0
  168. package/dist/drivers/puppeteer/generated/target.d.ts +105 -0
  169. package/dist/drivers/puppeteer/generated/target.js +123 -0
  170. package/dist/drivers/puppeteer/generated/touchscreen.d.ts +87 -0
  171. package/dist/drivers/puppeteer/generated/touchscreen.js +103 -0
  172. package/dist/drivers/puppeteer/generated/tracing.d.ts +38 -0
  173. package/dist/drivers/puppeteer/generated/tracing.js +43 -0
  174. package/dist/drivers/puppeteer/generated/web-worker.d.ts +63 -0
  175. package/dist/drivers/puppeteer/generated/web-worker.js +73 -0
  176. package/dist/drivers/puppeteer/index.d.ts +21 -0
  177. package/dist/drivers/puppeteer/index.js +23 -0
  178. package/dist/drivers/puppeteer/remote-base.d.ts +57 -0
  179. package/dist/drivers/puppeteer/remote-base.js +79 -0
  180. package/dist/drivers/puppeteer/types.d.ts +178 -0
  181. package/dist/drivers/puppeteer/types.js +8 -0
  182. package/dist/drivers/selenium/driver.d.ts +28 -0
  183. package/dist/drivers/selenium/driver.js +169 -0
  184. package/dist/drivers/selenium/element.d.ts +34 -0
  185. package/dist/drivers/selenium/element.js +73 -0
  186. package/dist/drivers/selenium/index.d.ts +3 -0
  187. package/dist/drivers/selenium/index.js +5 -0
  188. package/dist/drivers/selenium/types.d.ts +2 -0
  189. package/dist/drivers/selenium/types.js +12 -0
  190. package/dist/drivers/stagehand/generated/context.d.ts +127 -0
  191. package/dist/drivers/stagehand/generated/context.js +153 -0
  192. package/dist/drivers/stagehand/generated/locator.d.ts +324 -0
  193. package/dist/drivers/stagehand/generated/locator.js +368 -0
  194. package/dist/drivers/stagehand/generated/page.d.ts +377 -0
  195. package/dist/drivers/stagehand/generated/page.js +439 -0
  196. package/dist/drivers/stagehand/generated/response.d.ts +197 -0
  197. package/dist/drivers/stagehand/generated/response.js +232 -0
  198. package/dist/drivers/stagehand/index.d.ts +5 -0
  199. package/dist/drivers/stagehand/index.js +8 -0
  200. package/dist/drivers/stagehand/types.d.ts +1 -0
  201. package/dist/drivers/stagehand/types.js +7 -0
  202. package/dist/errors.d.ts +47 -0
  203. package/dist/errors.js +157 -0
  204. package/dist/extensions/client.d.ts +47 -0
  205. package/dist/extensions/client.js +154 -0
  206. package/dist/extensions/index.d.ts +1 -0
  207. package/dist/extensions/index.js +1 -0
  208. package/dist/index.d.ts +12 -0
  209. package/dist/index.js +23 -0
  210. package/dist/internal/dev-client.d.ts +5 -0
  211. package/dist/internal/dev-client.js +9 -0
  212. package/dist/internal/rpc-targets.d.ts +17 -0
  213. package/dist/internal/rpc-targets.js +58 -0
  214. package/dist/internal/serialization.d.ts +32 -0
  215. package/dist/internal/serialization.js +42 -0
  216. package/dist/internal/transport.d.ts +24 -0
  217. package/dist/internal/transport.js +29 -0
  218. package/dist/playwright.d.ts +1 -0
  219. package/dist/playwright.js +2 -0
  220. package/dist/puppeteer.d.ts +1 -0
  221. package/dist/puppeteer.js +2 -0
  222. package/dist/selenium.d.ts +1 -0
  223. package/dist/selenium.js +2 -0
  224. package/dist/stagehand.d.ts +1 -0
  225. package/dist/stagehand.js +2 -0
  226. package/dist/storage/client.d.ts +151 -0
  227. package/dist/storage/client.js +329 -0
  228. package/dist/storage/index.d.ts +2 -0
  229. package/dist/storage/index.js +4 -0
  230. package/dist/telemetry.d.ts +18 -0
  231. package/dist/telemetry.js +93 -0
  232. package/dist/updates/client.d.ts +8 -0
  233. package/dist/updates/client.js +128 -0
  234. package/dist/updates/index.d.ts +1 -0
  235. package/dist/updates/index.js +1 -0
  236. package/dist/utils/http.d.ts +39 -0
  237. package/dist/utils/http.js +88 -0
  238. package/dist/utils/index.d.ts +4 -0
  239. package/dist/utils/index.js +4 -0
  240. package/dist/utils/logger.d.ts +27 -0
  241. package/dist/utils/logger.js +74 -0
  242. package/dist/utils/schema.d.ts +17 -0
  243. package/dist/utils/schema.js +31 -0
  244. package/dist/utils/url.d.ts +5 -0
  245. package/dist/utils/url.js +7 -0
  246. package/dist/vault/client.d.ts +43 -0
  247. package/dist/vault/client.js +123 -0
  248. package/dist/vault/index.d.ts +1 -0
  249. package/dist/vault/index.js +1 -0
  250. package/dist/version.d.ts +1 -0
  251. package/dist/version.js +4 -0
  252. package/dist/workspaces/browser-runtime.d.ts +251 -0
  253. package/dist/workspaces/browser-runtime.js +1025 -0
  254. package/dist/workspaces/client.d.ts +48 -0
  255. package/dist/workspaces/client.js +222 -0
  256. package/dist/workspaces/index.d.ts +2 -0
  257. package/dist/workspaces/index.js +2 -0
  258. package/dist/workspaces/runtime-event-pump.d.ts +65 -0
  259. package/dist/workspaces/runtime-event-pump.js +716 -0
  260. package/package.json +56 -0
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # @bctrl/sdk
2
+
3
+ TypeScript SDK for BCTRL workspaces, browser runtimes, and browser profile automation.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @bctrl/sdk
9
+ ```
10
+
11
+ Node 18+ is required.
12
+
13
+ ## Quick start
14
+
15
+ ```ts
16
+ import { Bctrl } from '@bctrl/sdk';
17
+
18
+ const bctrl = new Bctrl({
19
+ apiKey: process.env.BCTRL_API_KEY!,
20
+ });
21
+
22
+ const workspace = await bctrl.workspaces.create({
23
+ name: 'my-task',
24
+ });
25
+
26
+ const browser = await workspace.runtimes.browser('web').playwright({
27
+ launch: { mode: 'ephemeral' },
28
+ });
29
+
30
+ await browser.run({
31
+ steps: [
32
+ { call: 'page.goto', args: ['https://example.com'] },
33
+ ],
34
+ });
35
+
36
+ const state = await workspace.state({ runtime: 'web' });
37
+ console.log(state.runtimes[0]?.summary);
38
+ ```
39
+
40
+ The public SDK always targets `https://api.bctrl.ai/v1`.
41
+
42
+ For local development inside this repo, use the internal test helper instead of changing the public client base URL:
43
+
44
+ ```ts
45
+ import { createInternalBctrl } from '../src/internal/dev-client.js';
46
+
47
+ const bctrl = createInternalBctrl({
48
+ apiKey: process.env.BCTRL_API_KEY!,
49
+ apiOrigin: 'http://localhost:8787',
50
+ });
51
+ ```
52
+
53
+ ## Entry points
54
+
55
+ - `@bctrl/sdk`: core client, workspaces, browser profiles, AI credentials, storage, vault, updates
56
+ - `@bctrl/sdk/playwright`: Playwright driver types and remote browser classes
57
+ - `@bctrl/sdk/puppeteer`: Puppeteer driver types and remote browser classes
58
+ - `@bctrl/sdk/stagehand`: Stagehand driver types and remote browser classes
59
+ - `@bctrl/sdk/selenium`: Selenium driver types and remote browser classes
60
+
61
+ ## Documentation
62
+
63
+ - SDK reference: https://platform.bctrl.ai/api-reference/sdk/overview
64
+ - Product site: https://bctrl.ai
65
+
66
+ ## Telemetry
67
+
68
+ The SDK currently contains optional error telemetry, not full usage analytics.
69
+
70
+ - Error reporting is Sentry-based and only activates when `SENTRY_DSN_SDK` is present at runtime.
71
+ - It captures SDK errors such as request timeouts and failed HTTP or automation calls.
72
+ - Sensitive headers like `authorization`, `cookie`, and internal secrets are stripped before an event is sent.
73
+ - Pass `telemetry: false` to `new Bctrl(...)` to disable it explicitly.
74
+
75
+ If you want to measure feature adoption, successful operations, or per-method usage, that is not implemented in the published SDK today. Instrument your application around SDK calls or add explicit SDK hooks before relying on package-level usage analytics.
@@ -0,0 +1 @@
1
+ export { BrowserUseNamespace } from './namespace.js';
@@ -0,0 +1,9 @@
1
+ // ============================================================================
2
+ // Browser-use Agent - Autonomous browser automation
3
+ // ============================================================================
4
+ //
5
+ // This module provides the browser-use agent integration for bctrl.
6
+ // Browser-use agents can autonomously complete tasks using natural language.
7
+ //
8
+ // ============================================================================
9
+ export { BrowserUseNamespace } from './namespace.js';
@@ -0,0 +1,39 @@
1
+ import type { BrowserUseAgentConfig, BrowserUseCodeAgentConfig, BrowserUseAPI, BrowserUseAgent, BrowserUseCodeAgent } from '../../contracts/browser-use.js';
2
+ import type { RpcSender } from '../../internal/transport.js';
3
+ /**
4
+ * Browser-use namespace - provides agent and codeAgent factory methods.
5
+ */
6
+ export declare class BrowserUseNamespace implements BrowserUseAPI {
7
+ private sendRpc;
8
+ private getActivePageId;
9
+ constructor(sendRpc: RpcSender, getActivePageId: () => string | undefined);
10
+ /**
11
+ * Create a reusable agent for natural language task execution.
12
+ * The agent can be used multiple times with different tasks.
13
+ *
14
+ * @example
15
+ * const agent = session.browserUse.agent({
16
+ * llm: "gpt-4o",
17
+ * useVision: true,
18
+ * maxSteps: 20,
19
+ * });
20
+ *
21
+ * // Execute multiple tasks with the same agent
22
+ * const result1 = await agent.execute("Search for latest AI news");
23
+ * const result2 = await agent.execute("Find pricing information", { maxSteps: 10 });
24
+ */
25
+ agent(config?: BrowserUseAgentConfig): BrowserUseAgent;
26
+ /**
27
+ * Create a reusable code agent for code-based automation.
28
+ * Code agents generate and execute code to accomplish tasks.
29
+ *
30
+ * @example
31
+ * const codeAgent = session.browserUse.codeAgent({
32
+ * llm: "gpt-4o",
33
+ * });
34
+ *
35
+ * // Execute tasks with the code agent
36
+ * const result = await codeAgent.execute("Fill out the registration form");
37
+ */
38
+ codeAgent(config?: BrowserUseCodeAgentConfig): BrowserUseCodeAgent;
39
+ }
@@ -0,0 +1,93 @@
1
+ // ============================================================================
2
+ // BrowserUseNamespace - Shared Browser-use agent methods for all drivers
3
+ // ============================================================================
4
+ //
5
+ // This class provides the `.browserUse` namespace on driver sessions.
6
+ // It creates Browser-use agents that can autonomously complete tasks.
7
+ //
8
+ // Usage (consistent with Stagehand agent pattern):
9
+ // const session = await bctrl.browser('my-scraper').connect.puppeteer();
10
+ //
11
+ // // Create a reusable agent with configuration
12
+ // const agent = session.browserUse.agent({
13
+ // llm: "gpt-4o",
14
+ // useVision: true,
15
+ // });
16
+ //
17
+ // // Execute tasks with the agent
18
+ // const result = await agent.execute("Search for AI news and summarize");
19
+ // const result2 = await agent.execute("Find pricing information", { maxSteps: 10 });
20
+ //
21
+ // // Code agent works similarly
22
+ // const codeAgent = session.browserUse.codeAgent({ llm: "gpt-4o" });
23
+ // const codeResult = await codeAgent.execute("Fill out the form with test data");
24
+ //
25
+ // ============================================================================
26
+ /**
27
+ * Browser-use namespace - provides agent and codeAgent factory methods.
28
+ */
29
+ export class BrowserUseNamespace {
30
+ sendRpc;
31
+ getActivePageId;
32
+ constructor(sendRpc, getActivePageId) {
33
+ this.sendRpc = sendRpc;
34
+ this.getActivePageId = getActivePageId;
35
+ }
36
+ /**
37
+ * Create a reusable agent for natural language task execution.
38
+ * The agent can be used multiple times with different tasks.
39
+ *
40
+ * @example
41
+ * const agent = session.browserUse.agent({
42
+ * llm: "gpt-4o",
43
+ * useVision: true,
44
+ * maxSteps: 20,
45
+ * });
46
+ *
47
+ * // Execute multiple tasks with the same agent
48
+ * const result1 = await agent.execute("Search for latest AI news");
49
+ * const result2 = await agent.execute("Find pricing information", { maxSteps: 10 });
50
+ */
51
+ agent(config) {
52
+ const agentConfig = config || {};
53
+ const pageId = agentConfig.pageId || this.getActivePageId();
54
+ const rpc = this.sendRpc;
55
+ return {
56
+ execute: async (task, options) => {
57
+ const executeOptions = {
58
+ task,
59
+ ...(options?.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
60
+ ...(options?.tools !== undefined ? { tools: options.tools } : {}),
61
+ };
62
+ return rpc('browserUse', 'agent.execute', [agentConfig, executeOptions], { pageId });
63
+ },
64
+ };
65
+ }
66
+ /**
67
+ * Create a reusable code agent for code-based automation.
68
+ * Code agents generate and execute code to accomplish tasks.
69
+ *
70
+ * @example
71
+ * const codeAgent = session.browserUse.codeAgent({
72
+ * llm: "gpt-4o",
73
+ * });
74
+ *
75
+ * // Execute tasks with the code agent
76
+ * const result = await codeAgent.execute("Fill out the registration form");
77
+ */
78
+ codeAgent(config) {
79
+ const agentConfig = config || {};
80
+ const pageId = agentConfig.pageId || this.getActivePageId();
81
+ const rpc = this.sendRpc;
82
+ return {
83
+ execute: async (task, options) => {
84
+ const executeOptions = {
85
+ task,
86
+ ...(options?.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
87
+ ...(options?.tools !== undefined ? { tools: options.tools } : {}),
88
+ };
89
+ return rpc('browserUse', 'codeAgent.execute', [agentConfig, executeOptions], { pageId });
90
+ },
91
+ };
92
+ }
93
+ }
@@ -0,0 +1,2 @@
1
+ export { StagehandNamespace, StagehandAgent } from './stagehand/index.js';
2
+ export { BrowserUseNamespace } from './browser-use/index.js';
@@ -0,0 +1,17 @@
1
+ // ============================================================================
2
+ // AI Agents - Unified AI-powered browser automation
3
+ // ============================================================================
4
+ //
5
+ // This module provides all AI agent integrations for bctrl:
6
+ //
7
+ // - Stagehand: AI-powered browser automation with act, extract, observe
8
+ // - Browser-use: Autonomous agents for natural language task execution
9
+ //
10
+ // These agents work across all drivers (Puppeteer, Playwright, Selenium, Stagehand)
11
+ // through the `.stagehand` and `.browserUse` namespaces on sessions.
12
+ //
13
+ // ============================================================================
14
+ // Stagehand AI exports
15
+ export { StagehandNamespace, StagehandAgent } from './stagehand/index.js';
16
+ // Browser-use exports
17
+ export { BrowserUseNamespace } from './browser-use/index.js';
@@ -0,0 +1,93 @@
1
+ import type { ZodType, infer as ZodInfer } from 'zod';
2
+ import type { ActOptions, ActResult, StagehandAction, ExtractOptions, StagehandExtractResult, StagehandObserveResult, ObserveOptions, StagehandAgentConfig, StagehandAgentExecuteOptions, StagehandAgentResult, StagehandMetrics, StagehandHistoryEntry } from '../../contracts/stagehand.js';
3
+ import type { RpcSender } from '../../internal/transport.js';
4
+ /** Page resolver - converts driver-specific page object to pageId */
5
+ export type PageResolver<TPage> = (page?: TPage) => string | undefined;
6
+ /** Options with page parameter (replaces pageId for SDK usage) */
7
+ export type WithPage<TPage, TOptions = {}> = Omit<TOptions, 'pageId'> & {
8
+ page?: TPage;
9
+ };
10
+ export type ActOptionsWithPage<TPage> = WithPage<TPage, ActOptions>;
11
+ export type ExtractOptionsWithPage<TPage> = WithPage<TPage, ExtractOptions>;
12
+ export type ObserveOptionsWithPage<TPage> = WithPage<TPage, ObserveOptions>;
13
+ export type AgentExecuteOptionsWithPage<TPage> = WithPage<TPage, StagehandAgentExecuteOptions> & {
14
+ instruction: string;
15
+ };
16
+ export type AgentExecuteCallOptionsWithPage<TPage> = WithPage<TPage, Omit<StagehandAgentExecuteOptions, 'instruction'>>;
17
+ /**
18
+ * Core Stagehand AI methods implementation.
19
+ * Generic TPage allows each driver to specify its own page type.
20
+ */
21
+ export declare class StagehandCore<TPage = unknown> {
22
+ private sendRpc;
23
+ private getContextId;
24
+ private getActivePageId;
25
+ private resolvePage;
26
+ constructor(sendRpc: RpcSender, getContextId: () => string | undefined, getActivePageId: () => string | undefined, resolvePage: PageResolver<TPage>);
27
+ /** Resolve page object to pageId, falling back to active page */
28
+ private resolvePageId;
29
+ /** Strip page property from options before sending over RPC */
30
+ private stripPage;
31
+ /** Get RPC routing IDs */
32
+ private rpcIds;
33
+ /**
34
+ * Execute an AI action on a page.
35
+ * @example await session.act("click the login button", { page });
36
+ */
37
+ act(instruction: string, options?: ActOptionsWithPage<TPage>): Promise<ActResult>;
38
+ act(action: StagehandAction, options?: ActOptionsWithPage<TPage>): Promise<ActResult>;
39
+ /**
40
+ * Extract data from a page using AI.
41
+ * Supports Zod schemas for type-safe extraction.
42
+ *
43
+ * @example
44
+ * // Get page text
45
+ * const { pageText } = await session.extract({ page });
46
+ *
47
+ * // Extract with schema
48
+ * const schema = z.object({ title: z.string(), price: z.number() });
49
+ * const data = await session.extract("get product info", schema, { page });
50
+ * // data is typed as { title: string; price: number }
51
+ */
52
+ extract(options?: ExtractOptionsWithPage<TPage>): Promise<StagehandExtractResult<{
53
+ pageText: string;
54
+ }>>;
55
+ extract<T extends ZodType>(instruction: string, schema: T, options?: ExtractOptionsWithPage<TPage>): Promise<StagehandExtractResult<ZodInfer<T>>>;
56
+ /**
57
+ * Observe available actions on a page using AI.
58
+ * @example const actions = await session.observe("find clickable elements", { page });
59
+ */
60
+ observe(options?: ObserveOptionsWithPage<TPage>): Promise<StagehandObserveResult>;
61
+ observe(instruction: string, options?: ObserveOptionsWithPage<TPage>): Promise<StagehandObserveResult>;
62
+ /**
63
+ * Create a Stagehand agent for autonomous task execution.
64
+ * @example
65
+ * const agent = session.agent({ model: 'gpt-4o' });
66
+ * await agent.execute("Find and click the login button", { page });
67
+ */
68
+ agent(config?: StagehandAgentConfig): StagehandAgent<TPage>;
69
+ /**
70
+ * Get Stagehand usage metrics.
71
+ */
72
+ getMetrics(): Promise<StagehandMetrics>;
73
+ /**
74
+ * Get Stagehand operation history.
75
+ */
76
+ getHistory(): Promise<StagehandHistoryEntry[]>;
77
+ }
78
+ /**
79
+ * Stagehand agent for autonomous task execution.
80
+ */
81
+ export declare class StagehandAgent<TPage = unknown> {
82
+ private sendRpc;
83
+ private getContextId;
84
+ private resolvePageId;
85
+ private config?;
86
+ constructor(sendRpc: RpcSender, getContextId: () => string | undefined, resolvePageId: (page?: TPage) => string | undefined, config?: StagehandAgentConfig | undefined);
87
+ /**
88
+ * Execute an autonomous task.
89
+ * @example await agent.execute("Find and book a flight to Tokyo", { page });
90
+ */
91
+ execute(instruction: string, options?: AgentExecuteCallOptionsWithPage<TPage>): Promise<StagehandAgentResult>;
92
+ execute(options: AgentExecuteOptionsWithPage<TPage>): Promise<StagehandAgentResult>;
93
+ }
@@ -0,0 +1,144 @@
1
+ // ============================================================================
2
+ // StagehandCore - Centralized Stagehand AI methods
3
+ // ============================================================================
4
+ //
5
+ // This module provides the core implementation of Stagehand AI methods
6
+ // (act, extract, observe, agent) that can be used by:
7
+ //
8
+ // 1. Stagehand browser runtime clients - expose methods directly
9
+ // 2. StagehandNamespace - wraps the same RPC surface for other runtime clients
10
+ //
11
+ // The API mirrors the real Stagehand SDK where AI methods take { page } option.
12
+ //
13
+ // ============================================================================
14
+ import { toJsonSchema } from '../../utils/schema.js';
15
+ // ============================================================================
16
+ // StagehandCore
17
+ // ============================================================================
18
+ /**
19
+ * Core Stagehand AI methods implementation.
20
+ * Generic TPage allows each driver to specify its own page type.
21
+ */
22
+ export class StagehandCore {
23
+ sendRpc;
24
+ getContextId;
25
+ getActivePageId;
26
+ resolvePage;
27
+ constructor(sendRpc, getContextId, getActivePageId, resolvePage) {
28
+ this.sendRpc = sendRpc;
29
+ this.getContextId = getContextId;
30
+ this.getActivePageId = getActivePageId;
31
+ this.resolvePage = resolvePage;
32
+ }
33
+ /** Resolve page object to pageId, falling back to active page */
34
+ resolvePageId(page) {
35
+ if (page) {
36
+ const id = this.resolvePage(page);
37
+ if (id)
38
+ return id;
39
+ }
40
+ return this.getActivePageId();
41
+ }
42
+ /** Strip page property from options before sending over RPC */
43
+ stripPage(options) {
44
+ if (!options)
45
+ return undefined;
46
+ const { page, ...rest } = options;
47
+ return Object.keys(rest).length > 0 ? rest : undefined;
48
+ }
49
+ /** Get RPC routing IDs */
50
+ rpcIds(page) {
51
+ return {
52
+ contextId: this.getContextId(),
53
+ pageId: this.resolvePageId(page),
54
+ };
55
+ }
56
+ act(instructionOrAction, options) {
57
+ return this.sendRpc('stagehand', 'act', [instructionOrAction, this.stripPage(options)], this.rpcIds(options?.page));
58
+ }
59
+ extract(instructionOrOptions, schema, options) {
60
+ // No args or options only - extract page text
61
+ if (instructionOrOptions === undefined || typeof instructionOrOptions === 'object') {
62
+ const opts = instructionOrOptions;
63
+ return this.sendRpc('stagehand', 'extract', [null, null, this.stripPage(opts)], this.rpcIds(opts?.page));
64
+ }
65
+ // Instruction + schema + options
66
+ const jsonSchema = schema ? toJsonSchema(schema) : null;
67
+ return this.sendRpc('stagehand', 'extract', [instructionOrOptions, jsonSchema, this.stripPage(options)], this.rpcIds(options?.page));
68
+ }
69
+ observe(instructionOrOptions, options) {
70
+ // Options only
71
+ if (instructionOrOptions === undefined || typeof instructionOrOptions === 'object') {
72
+ const opts = instructionOrOptions;
73
+ return this.sendRpc('stagehand', 'observe', [null, this.stripPage(opts)], this.rpcIds(opts?.page));
74
+ }
75
+ // Instruction + options
76
+ return this.sendRpc('stagehand', 'observe', [instructionOrOptions, this.stripPage(options)], this.rpcIds(options?.page));
77
+ }
78
+ // ==========================================================================
79
+ // agent
80
+ // ==========================================================================
81
+ /**
82
+ * Create a Stagehand agent for autonomous task execution.
83
+ * @example
84
+ * const agent = session.agent({ model: 'gpt-4o' });
85
+ * await agent.execute("Find and click the login button", { page });
86
+ */
87
+ agent(config) {
88
+ return new StagehandAgent(this.sendRpc, () => this.getContextId(), (page) => this.resolvePageId(page), config);
89
+ }
90
+ // ==========================================================================
91
+ // Metrics & History
92
+ // ==========================================================================
93
+ /**
94
+ * Get Stagehand usage metrics.
95
+ */
96
+ getMetrics() {
97
+ return this.sendRpc('stagehand', 'getMetrics', []);
98
+ }
99
+ /**
100
+ * Get Stagehand operation history.
101
+ */
102
+ getHistory() {
103
+ return this.sendRpc('stagehand', 'getHistory', []);
104
+ }
105
+ }
106
+ // ============================================================================
107
+ // StagehandAgent
108
+ // ============================================================================
109
+ /**
110
+ * Stagehand agent for autonomous task execution.
111
+ */
112
+ export class StagehandAgent {
113
+ sendRpc;
114
+ getContextId;
115
+ resolvePageId;
116
+ config;
117
+ constructor(sendRpc, getContextId, resolvePageId, config) {
118
+ this.sendRpc = sendRpc;
119
+ this.getContextId = getContextId;
120
+ this.resolvePageId = resolvePageId;
121
+ this.config = config;
122
+ }
123
+ execute(instructionOrOptions, options) {
124
+ const isString = typeof instructionOrOptions === 'string';
125
+ const page = isString ? options?.page : instructionOrOptions.page;
126
+ // Build clean options without page
127
+ let cleanOptions;
128
+ if (isString) {
129
+ const { page: _, ...rest } = options ?? {};
130
+ cleanOptions = {
131
+ instruction: instructionOrOptions,
132
+ ...rest,
133
+ };
134
+ }
135
+ else {
136
+ const { page: _, ...rest } = instructionOrOptions;
137
+ cleanOptions = rest;
138
+ }
139
+ return this.sendRpc('stagehand', 'agent.execute', [this.config, cleanOptions], {
140
+ contextId: this.getContextId(),
141
+ pageId: this.resolvePageId(page),
142
+ });
143
+ }
144
+ }
@@ -0,0 +1,3 @@
1
+ export { StagehandCore, StagehandAgent } from './core.js';
2
+ export { StagehandNamespace } from './namespace.js';
3
+ export type { ActOptionsWithPage, ExtractOptionsWithPage, ObserveOptionsWithPage, AgentExecuteOptionsWithPage, PageResolver, } from './core.js';
@@ -0,0 +1,24 @@
1
+ // ============================================================================
2
+ // Stagehand AI Agent - AI-powered browser automation
3
+ // ============================================================================
4
+ //
5
+ // This module provides the Stagehand AI integration for bctrl.
6
+ //
7
+ // - StagehandCore: Centralized implementation of act, extract, observe, agent
8
+ // - StagehandNamespace: Wraps core for .stagehand namespace on other drivers
9
+ // - StagehandAgent: Agent wrapper for autonomous task execution
10
+ //
11
+ // Usage:
12
+ // // For Playwright/Puppeteer/Selenium - via namespace
13
+ // const session = await bctrl.browser('my-scraper').connect.puppeteer();
14
+ // await session.stagehand.act("click button", { page });
15
+ //
16
+ // // For Stagehand driver - directly on session (matches real Stagehand SDK)
17
+ // const session = await bctrl.browser('my-scraper').connect.stagehand();
18
+ // await session.act("click button", { page });
19
+ //
20
+ // ============================================================================
21
+ // Core implementation
22
+ export { StagehandCore, StagehandAgent } from './core.js';
23
+ // Namespace wrapper for other drivers
24
+ export { StagehandNamespace } from './namespace.js';
@@ -0,0 +1,51 @@
1
+ import type { ZodType, infer as ZodInfer } from 'zod';
2
+ import { StagehandAgent, type ActOptionsWithPage, type ExtractOptionsWithPage, type ObserveOptionsWithPage, type PageResolver } from './core.js';
3
+ import type { ActResult, StagehandAction, StagehandAgentConfig, StagehandExtractResult, StagehandMetrics, StagehandHistoryEntry, StagehandObserveResult } from '../../contracts/stagehand.js';
4
+ import type { RpcSender } from '../../internal/transport.js';
5
+ /**
6
+ * Stagehand AI namespace - wraps StagehandCore for driver sessions.
7
+ * Generic TPage allows each driver to specify its own page type.
8
+ */
9
+ export declare class StagehandNamespace<TPage = unknown> {
10
+ private core;
11
+ constructor(sendRpc: RpcSender, getContextId: () => string | undefined, getActivePageId: () => string | undefined, resolvePageFromDriver: PageResolver<TPage>);
12
+ /**
13
+ * Execute an AI action on a page.
14
+ * @example await stagehand.act("click the login button", { page });
15
+ */
16
+ act(instruction: string, options?: ActOptionsWithPage<TPage>): Promise<ActResult>;
17
+ act(action: StagehandAction, options?: ActOptionsWithPage<TPage>): Promise<ActResult>;
18
+ /**
19
+ * Extract data from a page using AI.
20
+ * @example
21
+ * const schema = z.object({ title: z.string(), price: z.number() });
22
+ * const data = await stagehand.extract("get product info", schema, { page });
23
+ */
24
+ extract(options?: ExtractOptionsWithPage<TPage>): Promise<StagehandExtractResult<{
25
+ pageText: string;
26
+ }>>;
27
+ extract<T extends ZodType>(instruction: string, schema: T, options?: ExtractOptionsWithPage<TPage>): Promise<StagehandExtractResult<ZodInfer<T>>>;
28
+ /**
29
+ * Observe available actions on a page using AI.
30
+ * @example const actions = await stagehand.observe("find clickable elements", { page });
31
+ */
32
+ observe(options?: ObserveOptionsWithPage<TPage>): Promise<StagehandObserveResult>;
33
+ observe(instruction: string, options?: ObserveOptionsWithPage<TPage>): Promise<StagehandObserveResult>;
34
+ /**
35
+ * Create a Stagehand agent for autonomous task execution.
36
+ * @example
37
+ * const agent = stagehand.agent({ model: 'gpt-4o' });
38
+ * await agent.execute("Find and click the login button", { page });
39
+ */
40
+ agent(config?: StagehandAgentConfig): StagehandAgent<TPage>;
41
+ /**
42
+ * Get Stagehand usage metrics.
43
+ */
44
+ getMetrics(): Promise<StagehandMetrics>;
45
+ /**
46
+ * Get Stagehand operation history.
47
+ */
48
+ getHistory(): Promise<StagehandHistoryEntry[]>;
49
+ }
50
+ export { StagehandCore, StagehandAgent } from './core.js';
51
+ export type { ActOptionsWithPage, ExtractOptionsWithPage, ObserveOptionsWithPage, AgentExecuteOptionsWithPage, PageResolver, } from './core.js';
@@ -0,0 +1,65 @@
1
+ // ============================================================================
2
+ // StagehandNamespace - Stagehand AI methods for non-stagehand drivers
3
+ // ============================================================================
4
+ //
5
+ // This class provides the `.stagehand` namespace on driver sessions
6
+ // for Playwright, Puppeteer, and Selenium drivers.
7
+ //
8
+ // Usage:
9
+ // const session = await bctrl.browser('my-scraper').connect.puppeteer();
10
+ // await session.stagehand.act("click button", { page });
11
+ // const data = await session.stagehand.extract("get info", schema, { page });
12
+ //
13
+ // Note: For the stagehand driver, AI methods are exposed directly on the
14
+ // session (session.act, session.extract, etc.) to match the real Stagehand SDK.
15
+ //
16
+ // ============================================================================
17
+ import { StagehandCore, } from './core.js';
18
+ /**
19
+ * Stagehand AI namespace - wraps StagehandCore for driver sessions.
20
+ * Generic TPage allows each driver to specify its own page type.
21
+ */
22
+ export class StagehandNamespace {
23
+ core;
24
+ constructor(sendRpc, getContextId, getActivePageId, resolvePageFromDriver) {
25
+ this.core = new StagehandCore(sendRpc, getContextId, getActivePageId, resolvePageFromDriver);
26
+ }
27
+ act(instructionOrAction, options) {
28
+ return this.core.act(instructionOrAction, options);
29
+ }
30
+ extract(instructionOrOptions, schema, options) {
31
+ if (typeof instructionOrOptions === 'string') {
32
+ return this.core.extract(instructionOrOptions, schema, options);
33
+ }
34
+ return this.core.extract(instructionOrOptions);
35
+ }
36
+ observe(instructionOrOptions, options) {
37
+ if (typeof instructionOrOptions === 'string') {
38
+ return this.core.observe(instructionOrOptions, options);
39
+ }
40
+ return this.core.observe(instructionOrOptions);
41
+ }
42
+ /**
43
+ * Create a Stagehand agent for autonomous task execution.
44
+ * @example
45
+ * const agent = stagehand.agent({ model: 'gpt-4o' });
46
+ * await agent.execute("Find and click the login button", { page });
47
+ */
48
+ agent(config) {
49
+ return this.core.agent(config);
50
+ }
51
+ /**
52
+ * Get Stagehand usage metrics.
53
+ */
54
+ getMetrics() {
55
+ return this.core.getMetrics();
56
+ }
57
+ /**
58
+ * Get Stagehand operation history.
59
+ */
60
+ getHistory() {
61
+ return this.core.getHistory();
62
+ }
63
+ }
64
+ // Re-export types and classes from core for convenience
65
+ export { StagehandCore, StagehandAgent } from './core.js';
@@ -0,0 +1,12 @@
1
+ import type { AiCredential, AiCredentialCreateRequest, AiCredentialTestResponse, AiCredentialUpdateRequest } from '../contracts/public-api.js';
2
+ export declare class AiCredentialsClient {
3
+ private readonly baseUrl;
4
+ private readonly apiKey;
5
+ constructor(baseUrl: string, apiKey: string);
6
+ list(): Promise<AiCredential[]>;
7
+ create(request: AiCredentialCreateRequest): Promise<AiCredential>;
8
+ get(id: string): Promise<AiCredential>;
9
+ update(id: string, request: AiCredentialUpdateRequest): Promise<AiCredential>;
10
+ delete(id: string): Promise<void>;
11
+ test(id: string): Promise<AiCredentialTestResponse>;
12
+ }