@mercuryo-ai/agentbrowse 0.2.50

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 (301) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +335 -0
  3. package/dist/assistive-runtime.d.ts +110 -0
  4. package/dist/assistive-runtime.d.ts.map +1 -0
  5. package/dist/assistive-runtime.js +79 -0
  6. package/dist/assistive-runtime.test-support.d.ts +7 -0
  7. package/dist/assistive-runtime.test-support.d.ts.map +1 -0
  8. package/dist/assistive-runtime.test-support.js +106 -0
  9. package/dist/assistive-stagehand.d.ts +12 -0
  10. package/dist/assistive-stagehand.d.ts.map +1 -0
  11. package/dist/assistive-stagehand.js +10 -0
  12. package/dist/browser-session-state.d.ts +95 -0
  13. package/dist/browser-session-state.d.ts.map +1 -0
  14. package/dist/browser-session-state.js +279 -0
  15. package/dist/client-bindings.d.ts +10 -0
  16. package/dist/client-bindings.d.ts.map +1 -0
  17. package/dist/client-bindings.js +18 -0
  18. package/dist/client.d.ts +49 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +63 -0
  21. package/dist/command-api-tracing.d.ts +20 -0
  22. package/dist/command-api-tracing.d.ts.map +1 -0
  23. package/dist/command-api-tracing.js +149 -0
  24. package/dist/command-name.d.ts +3 -0
  25. package/dist/command-name.d.ts.map +1 -0
  26. package/dist/command-name.js +11 -0
  27. package/dist/commands/act.d.ts +43 -0
  28. package/dist/commands/act.d.ts.map +1 -0
  29. package/dist/commands/act.js +1107 -0
  30. package/dist/commands/action-acceptance.d.ts +93 -0
  31. package/dist/commands/action-acceptance.d.ts.map +1 -0
  32. package/dist/commands/action-acceptance.js +1938 -0
  33. package/dist/commands/action-artifacts.d.ts +33 -0
  34. package/dist/commands/action-artifacts.d.ts.map +1 -0
  35. package/dist/commands/action-artifacts.js +104 -0
  36. package/dist/commands/action-execution-guards.d.ts +5 -0
  37. package/dist/commands/action-execution-guards.d.ts.map +1 -0
  38. package/dist/commands/action-execution-guards.js +3 -0
  39. package/dist/commands/action-executor-helpers.d.ts +21 -0
  40. package/dist/commands/action-executor-helpers.d.ts.map +1 -0
  41. package/dist/commands/action-executor-helpers.js +265 -0
  42. package/dist/commands/action-executor.d.ts +14 -0
  43. package/dist/commands/action-executor.d.ts.map +1 -0
  44. package/dist/commands/action-executor.js +46 -0
  45. package/dist/commands/action-fallbacks.d.ts +6 -0
  46. package/dist/commands/action-fallbacks.d.ts.map +1 -0
  47. package/dist/commands/action-fallbacks.js +43 -0
  48. package/dist/commands/action-result-resolution.d.ts +17 -0
  49. package/dist/commands/action-result-resolution.d.ts.map +1 -0
  50. package/dist/commands/action-result-resolution.js +132 -0
  51. package/dist/commands/action-value-projection.d.ts +32 -0
  52. package/dist/commands/action-value-projection.d.ts.map +1 -0
  53. package/dist/commands/action-value-projection.js +151 -0
  54. package/dist/commands/attach.d.ts +41 -0
  55. package/dist/commands/attach.d.ts.map +1 -0
  56. package/dist/commands/attach.js +103 -0
  57. package/dist/commands/browse-actions.d.ts +4 -0
  58. package/dist/commands/browse-actions.d.ts.map +1 -0
  59. package/dist/commands/browse-actions.js +4 -0
  60. package/dist/commands/browser-status.d.ts +57 -0
  61. package/dist/commands/browser-status.d.ts.map +1 -0
  62. package/dist/commands/browser-status.js +243 -0
  63. package/dist/commands/click-action-executor.d.ts +12 -0
  64. package/dist/commands/click-action-executor.d.ts.map +1 -0
  65. package/dist/commands/click-action-executor.js +111 -0
  66. package/dist/commands/click-activation-policy.d.ts +5 -0
  67. package/dist/commands/click-activation-policy.d.ts.map +1 -0
  68. package/dist/commands/click-activation-policy.js +13 -0
  69. package/dist/commands/close.d.ts +26 -0
  70. package/dist/commands/close.d.ts.map +1 -0
  71. package/dist/commands/close.js +124 -0
  72. package/dist/commands/datepicker-action-executor.d.ts +12 -0
  73. package/dist/commands/datepicker-action-executor.d.ts.map +1 -0
  74. package/dist/commands/datepicker-action-executor.js +218 -0
  75. package/dist/commands/descriptor-validation.d.ts +27 -0
  76. package/dist/commands/descriptor-validation.d.ts.map +1 -0
  77. package/dist/commands/descriptor-validation.js +192 -0
  78. package/dist/commands/extract-scope-resolution.d.ts +20 -0
  79. package/dist/commands/extract-scope-resolution.d.ts.map +1 -0
  80. package/dist/commands/extract-scope-resolution.js +109 -0
  81. package/dist/commands/extract-scoped-dialog-text.d.ts +3 -0
  82. package/dist/commands/extract-scoped-dialog-text.d.ts.map +1 -0
  83. package/dist/commands/extract-scoped-dialog-text.js +210 -0
  84. package/dist/commands/extract-snapshot-sanitizer.d.ts +5 -0
  85. package/dist/commands/extract-snapshot-sanitizer.d.ts.map +1 -0
  86. package/dist/commands/extract-snapshot-sanitizer.js +98 -0
  87. package/dist/commands/extract-stagehand-executor.d.ts +17 -0
  88. package/dist/commands/extract-stagehand-executor.d.ts.map +1 -0
  89. package/dist/commands/extract-stagehand-executor.js +112 -0
  90. package/dist/commands/extract.d.ts +57 -0
  91. package/dist/commands/extract.d.ts.map +1 -0
  92. package/dist/commands/extract.js +668 -0
  93. package/dist/commands/interaction-kernel.d.ts +46 -0
  94. package/dist/commands/interaction-kernel.d.ts.map +1 -0
  95. package/dist/commands/interaction-kernel.js +215 -0
  96. package/dist/commands/launch.d.ts +41 -0
  97. package/dist/commands/launch.d.ts.map +1 -0
  98. package/dist/commands/launch.js +182 -0
  99. package/dist/commands/navigate.d.ts +31 -0
  100. package/dist/commands/navigate.d.ts.map +1 -0
  101. package/dist/commands/navigate.js +202 -0
  102. package/dist/commands/observe-accessibility.d.ts +22 -0
  103. package/dist/commands/observe-accessibility.d.ts.map +1 -0
  104. package/dist/commands/observe-accessibility.js +566 -0
  105. package/dist/commands/observe-display-label.d.ts +4 -0
  106. package/dist/commands/observe-display-label.d.ts.map +1 -0
  107. package/dist/commands/observe-display-label.js +26 -0
  108. package/dist/commands/observe-dom-label-contract.d.ts +2 -0
  109. package/dist/commands/observe-dom-label-contract.d.ts.map +1 -0
  110. package/dist/commands/observe-dom-label-contract.js +564 -0
  111. package/dist/commands/observe-fallback-semantics.d.ts +6 -0
  112. package/dist/commands/observe-fallback-semantics.d.ts.map +1 -0
  113. package/dist/commands/observe-fallback-semantics.js +86 -0
  114. package/dist/commands/observe-inventory.d.ts +149 -0
  115. package/dist/commands/observe-inventory.d.ts.map +1 -0
  116. package/dist/commands/observe-inventory.js +3545 -0
  117. package/dist/commands/observe-label-policy.d.ts +8 -0
  118. package/dist/commands/observe-label-policy.d.ts.map +1 -0
  119. package/dist/commands/observe-label-policy.js +21 -0
  120. package/dist/commands/observe-page-state.d.ts +11 -0
  121. package/dist/commands/observe-page-state.d.ts.map +1 -0
  122. package/dist/commands/observe-page-state.js +89 -0
  123. package/dist/commands/observe-persistence.d.ts +15 -0
  124. package/dist/commands/observe-persistence.d.ts.map +1 -0
  125. package/dist/commands/observe-persistence.js +238 -0
  126. package/dist/commands/observe-projection.d.ts +119 -0
  127. package/dist/commands/observe-projection.d.ts.map +1 -0
  128. package/dist/commands/observe-projection.js +726 -0
  129. package/dist/commands/observe-protected.d.ts +6 -0
  130. package/dist/commands/observe-protected.d.ts.map +1 -0
  131. package/dist/commands/observe-protected.js +31 -0
  132. package/dist/commands/observe-semantics.d.ts +10 -0
  133. package/dist/commands/observe-semantics.d.ts.map +1 -0
  134. package/dist/commands/observe-semantics.js +535 -0
  135. package/dist/commands/observe-signals.d.ts +48 -0
  136. package/dist/commands/observe-signals.d.ts.map +1 -0
  137. package/dist/commands/observe-signals.js +461 -0
  138. package/dist/commands/observe-stagehand.d.ts +49 -0
  139. package/dist/commands/observe-stagehand.d.ts.map +1 -0
  140. package/dist/commands/observe-stagehand.js +94 -0
  141. package/dist/commands/observe-surfaces.d.ts +11 -0
  142. package/dist/commands/observe-surfaces.d.ts.map +1 -0
  143. package/dist/commands/observe-surfaces.js +290 -0
  144. package/dist/commands/observe.d.ts +113 -0
  145. package/dist/commands/observe.d.ts.map +1 -0
  146. package/dist/commands/observe.js +556 -0
  147. package/dist/commands/screenshot.d.ts +37 -0
  148. package/dist/commands/screenshot.d.ts.map +1 -0
  149. package/dist/commands/screenshot.js +269 -0
  150. package/dist/commands/select-action-executor.d.ts +10 -0
  151. package/dist/commands/select-action-executor.d.ts.map +1 -0
  152. package/dist/commands/select-action-executor.js +156 -0
  153. package/dist/commands/semantic-observe-lexical.d.ts +31 -0
  154. package/dist/commands/semantic-observe-lexical.d.ts.map +1 -0
  155. package/dist/commands/semantic-observe-lexical.js +186 -0
  156. package/dist/commands/semantic-observe.d.ts +37 -0
  157. package/dist/commands/semantic-observe.d.ts.map +1 -0
  158. package/dist/commands/semantic-observe.js +1339 -0
  159. package/dist/commands/structured-grid-action-executor.d.ts +3 -0
  160. package/dist/commands/structured-grid-action-executor.d.ts.map +1 -0
  161. package/dist/commands/structured-grid-action-executor.js +4 -0
  162. package/dist/commands/target-resolution.d.ts +4 -0
  163. package/dist/commands/target-resolution.d.ts.map +1 -0
  164. package/dist/commands/target-resolution.js +33 -0
  165. package/dist/commands/text-input-action-executor.d.ts +5 -0
  166. package/dist/commands/text-input-action-executor.d.ts.map +1 -0
  167. package/dist/commands/text-input-action-executor.js +116 -0
  168. package/dist/commands/user-actionable.d.ts +4 -0
  169. package/dist/commands/user-actionable.d.ts.map +1 -0
  170. package/dist/commands/user-actionable.js +216 -0
  171. package/dist/control-semantics.d.ts +30 -0
  172. package/dist/control-semantics.d.ts.map +1 -0
  173. package/dist/control-semantics.js +419 -0
  174. package/dist/diagnostics.d.ts +132 -0
  175. package/dist/diagnostics.d.ts.map +1 -0
  176. package/dist/diagnostics.js +120 -0
  177. package/dist/index.d.ts +5 -0
  178. package/dist/index.d.ts.map +1 -0
  179. package/dist/index.js +350 -0
  180. package/dist/library.d.ts +17 -0
  181. package/dist/library.d.ts.map +1 -0
  182. package/dist/library.js +14 -0
  183. package/dist/output.d.ts +32 -0
  184. package/dist/output.d.ts.map +1 -0
  185. package/dist/output.js +33 -0
  186. package/dist/owned-browser.d.ts +12 -0
  187. package/dist/owned-browser.d.ts.map +1 -0
  188. package/dist/owned-browser.js +69 -0
  189. package/dist/owned-process.d.ts +19 -0
  190. package/dist/owned-process.d.ts.map +1 -0
  191. package/dist/owned-process.js +145 -0
  192. package/dist/playwright-runtime.d.ts +43 -0
  193. package/dist/playwright-runtime.d.ts.map +1 -0
  194. package/dist/playwright-runtime.js +339 -0
  195. package/dist/protected-fill-browser.d.ts +22 -0
  196. package/dist/protected-fill-browser.d.ts.map +1 -0
  197. package/dist/protected-fill-browser.js +52 -0
  198. package/dist/protected-fill.d.ts +82 -0
  199. package/dist/protected-fill.d.ts.map +1 -0
  200. package/dist/protected-fill.js +20 -0
  201. package/dist/runtime-metrics.d.ts +27 -0
  202. package/dist/runtime-metrics.d.ts.map +1 -0
  203. package/dist/runtime-metrics.js +66 -0
  204. package/dist/runtime-page-state.d.ts +11 -0
  205. package/dist/runtime-page-state.d.ts.map +1 -0
  206. package/dist/runtime-page-state.js +62 -0
  207. package/dist/runtime-protected-state.d.ts +14 -0
  208. package/dist/runtime-protected-state.d.ts.map +1 -0
  209. package/dist/runtime-protected-state.js +148 -0
  210. package/dist/runtime-resolution.d.ts +9 -0
  211. package/dist/runtime-resolution.d.ts.map +1 -0
  212. package/dist/runtime-resolution.js +19 -0
  213. package/dist/runtime-state.d.ts +251 -0
  214. package/dist/runtime-state.d.ts.map +1 -0
  215. package/dist/runtime-state.js +599 -0
  216. package/dist/secrets/catalog-applicability.d.ts +5 -0
  217. package/dist/secrets/catalog-applicability.d.ts.map +1 -0
  218. package/dist/secrets/catalog-applicability.js +59 -0
  219. package/dist/secrets/field-policy.d.ts +3 -0
  220. package/dist/secrets/field-policy.d.ts.map +1 -0
  221. package/dist/secrets/field-policy.js +3 -0
  222. package/dist/secrets/fill-ordering.d.ts +10 -0
  223. package/dist/secrets/fill-ordering.d.ts.map +1 -0
  224. package/dist/secrets/fill-ordering.js +41 -0
  225. package/dist/secrets/form-matcher.d.ts +60 -0
  226. package/dist/secrets/form-matcher.d.ts.map +1 -0
  227. package/dist/secrets/form-matcher.js +948 -0
  228. package/dist/secrets/protected-artifact-guard.d.ts +39 -0
  229. package/dist/secrets/protected-artifact-guard.d.ts.map +1 -0
  230. package/dist/secrets/protected-artifact-guard.js +44 -0
  231. package/dist/secrets/protected-bindings.d.ts +14 -0
  232. package/dist/secrets/protected-bindings.d.ts.map +1 -0
  233. package/dist/secrets/protected-bindings.js +29 -0
  234. package/dist/secrets/protected-exact-value-redaction.d.ts +14 -0
  235. package/dist/secrets/protected-exact-value-redaction.d.ts.map +1 -0
  236. package/dist/secrets/protected-exact-value-redaction.js +360 -0
  237. package/dist/secrets/protected-field-semantics.d.ts +9 -0
  238. package/dist/secrets/protected-field-semantics.d.ts.map +1 -0
  239. package/dist/secrets/protected-field-semantics.js +154 -0
  240. package/dist/secrets/protected-field-values.d.ts +15 -0
  241. package/dist/secrets/protected-field-values.d.ts.map +1 -0
  242. package/dist/secrets/protected-field-values.js +131 -0
  243. package/dist/secrets/protected-fill.d.ts +47 -0
  244. package/dist/secrets/protected-fill.d.ts.map +1 -0
  245. package/dist/secrets/protected-fill.js +446 -0
  246. package/dist/secrets/protected-value-adapters.d.ts +4 -0
  247. package/dist/secrets/protected-value-adapters.d.ts.map +1 -0
  248. package/dist/secrets/protected-value-adapters.js +118 -0
  249. package/dist/secrets/types.d.ts +70 -0
  250. package/dist/secrets/types.d.ts.map +1 -0
  251. package/dist/secrets/types.js +30 -0
  252. package/dist/session.d.ts +19 -0
  253. package/dist/session.d.ts.map +1 -0
  254. package/dist/session.js +120 -0
  255. package/dist/solver/browser-launcher.d.ts +14 -0
  256. package/dist/solver/browser-launcher.d.ts.map +1 -0
  257. package/dist/solver/browser-launcher.js +799 -0
  258. package/dist/solver/config.d.ts +18 -0
  259. package/dist/solver/config.d.ts.map +1 -0
  260. package/dist/solver/config.js +67 -0
  261. package/dist/solver/fingerprint.d.ts +9 -0
  262. package/dist/solver/fingerprint.d.ts.map +1 -0
  263. package/dist/solver/fingerprint.js +96 -0
  264. package/dist/solver/profile-manager.d.ts +8 -0
  265. package/dist/solver/profile-manager.d.ts.map +1 -0
  266. package/dist/solver/profile-manager.js +74 -0
  267. package/dist/solver/turnstile-challenge.d.ts +3 -0
  268. package/dist/solver/turnstile-challenge.d.ts.map +1 -0
  269. package/dist/solver/turnstile-challenge.js +173 -0
  270. package/dist/solver/types.d.ts +67 -0
  271. package/dist/solver/types.d.ts.map +1 -0
  272. package/dist/solver/types.js +1 -0
  273. package/dist/stagehand-runtime.d.ts +4 -0
  274. package/dist/stagehand-runtime.d.ts.map +1 -0
  275. package/dist/stagehand-runtime.js +10 -0
  276. package/dist/stagehand.d.ts +15 -0
  277. package/dist/stagehand.d.ts.map +1 -0
  278. package/dist/stagehand.js +19 -0
  279. package/dist/testing.d.ts +5 -0
  280. package/dist/testing.d.ts.map +1 -0
  281. package/dist/testing.js +4 -0
  282. package/dist/update-check.d.ts +14 -0
  283. package/dist/update-check.d.ts.map +1 -0
  284. package/dist/update-check.js +182 -0
  285. package/dist/workflow-session-state.d.ts +30 -0
  286. package/dist/workflow-session-state.d.ts.map +1 -0
  287. package/dist/workflow-session-state.js +74 -0
  288. package/docs/README.md +25 -0
  289. package/docs/api-reference.md +242 -0
  290. package/docs/assistive-runtime.md +148 -0
  291. package/docs/configuration.md +287 -0
  292. package/docs/getting-started.md +237 -0
  293. package/docs/integration-checklist.md +36 -0
  294. package/docs/protected-fill.md +112 -0
  295. package/docs/testing.md +50 -0
  296. package/docs/troubleshooting.md +71 -0
  297. package/examples/README.md +18 -0
  298. package/examples/attach.ts +27 -0
  299. package/examples/basic.ts +36 -0
  300. package/examples/extract.ts +50 -0
  301. package/package.json +83 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ - switched the library extraction API to `extract(session, schema, scopeRef?)`, where
6
+ `schema` is a plain schema object or a Zod schema
7
+ - made `observe(...)` return a top-level flat `targets` array alongside grouped
8
+ `scopes`
9
+ - exported named observe payload types and extraction schema types from the
10
+ public library surface
11
+ - replaced `ReturnType<typeof ...>` client method signatures with named result
12
+ types
13
+ - added runnable examples under `examples/`
14
+ - added public API reference and troubleshooting guides
15
+ - aligned package metadata with the public `nuanu-ai/agentbrowse` repository
package/README.md ADDED
@@ -0,0 +1,335 @@
1
+ # @mercuryo-ai/agentbrowse
2
+
3
+ Browser automation library for agent systems.
4
+
5
+ AgentBrowse is for the part of your system that has to work with a real web
6
+ page.
7
+
8
+ If your application already knows what it is trying to do, AgentBrowse gives
9
+ you the browser layer for that work:
10
+
11
+ - launch a managed browser or attach to an existing CDP browser session;
12
+ - inspect the current page;
13
+ - interact with stable target references instead of raw selectors;
14
+ - extract structured data from the page;
15
+ - optionally use an LLM when page understanding needs help.
16
+
17
+ Your app keeps control of orchestration, state, policies, and business logic.
18
+ AgentBrowse focuses on the page itself.
19
+
20
+ A good first way to think about it is:
21
+
22
+ 1. launch a browser or attach to one and get a `session`
23
+ 2. inspect the page with `observe(...)`
24
+ 3. use `act(...)` to interact with what you found
25
+ 4. use `extract(...)` when you need structured data instead of an action
26
+ 5. close the session when you are done
27
+
28
+ This makes AgentBrowse fit naturally into a worker, backend service, CLI, or
29
+ agent runtime that already exists.
30
+
31
+ ## Install
32
+
33
+ ```bash
34
+ npm i @mercuryo-ai/agentbrowse
35
+ ```
36
+
37
+ If you want the operator-facing CLI, install `@mercuryo-ai/agentbrowse-cli`.
38
+
39
+ ## The Core Mental Model
40
+
41
+ There are four ideas you need to understand before using the library:
42
+
43
+ - `session`
44
+ The handle for a running browser. `launch(...)` or `attach(...)` returns it,
45
+ and you pass it into the rest of the API.
46
+ - `observe`
47
+ Reads the page and tells you what AgentBrowse found: targets, scopes,
48
+ signals, and forms.
49
+ - `ref`
50
+ A stable reference returned by `observe(...)`. You use it with `act(...)`
51
+ instead of managing selectors yourself.
52
+ - `assistive runtime`
53
+ Optional LLM-backed page understanding. You only need it for extraction and
54
+ for better quality in some goal-based `observe(session, goal)` calls.
55
+
56
+ ## Quick Start
57
+
58
+ This is the normal managed-browser flow. It does not require LLM setup.
59
+
60
+ ```ts
61
+ import {
62
+ act,
63
+ close,
64
+ launch,
65
+ navigate,
66
+ observe,
67
+ screenshot,
68
+ status,
69
+ } from '@mercuryo-ai/agentbrowse';
70
+
71
+ const launchResult = await launch('https://example.com');
72
+ if (!launchResult.success) {
73
+ throw new Error(launchResult.reason ?? launchResult.message);
74
+ }
75
+
76
+ const { session } = launchResult;
77
+
78
+ try {
79
+ const observeResult = await observe(session);
80
+ if (!observeResult.success) {
81
+ throw new Error(observeResult.reason ?? observeResult.message);
82
+ }
83
+
84
+ const firstActionableTarget = observeResult.targets.find((target) => typeof target.ref === 'string');
85
+
86
+ if (firstActionableTarget?.ref) {
87
+ const actResult = await act(session, firstActionableTarget.ref, 'click');
88
+ if (!actResult.success) {
89
+ throw new Error(actResult.reason ?? actResult.message);
90
+ }
91
+ }
92
+
93
+ const navigateResult = await navigate(session, 'https://example.com/checkout');
94
+ if (!navigateResult.success) {
95
+ throw new Error(navigateResult.reason ?? navigateResult.message);
96
+ }
97
+
98
+ const screenshotResult = await screenshot(session, '/tmp/checkout.png');
99
+ if (!screenshotResult.success) {
100
+ throw new Error(screenshotResult.reason ?? screenshotResult.message);
101
+ }
102
+
103
+ const statusResult = await status(session);
104
+ if (!statusResult.success) {
105
+ throw new Error(statusResult.reason ?? statusResult.message);
106
+ }
107
+ } finally {
108
+ await close(session);
109
+ }
110
+ ```
111
+
112
+ Runnable examples live in [`examples/`](./examples/README.md):
113
+
114
+ - `npx tsx examples/basic.ts`
115
+ - `npx tsx examples/attach.ts`
116
+ - `npx tsx examples/extract.ts`
117
+
118
+ ## Managed Launch Runtime Note
119
+
120
+ When you use `launch(...)`, the package includes `puppeteer` for the managed
121
+ browser connection layer with stealth evasions enabled by default.
122
+
123
+ The goal is practical: reduce unnecessary anti-bot friction such as extra
124
+ captcha or challenge pages on sensitive sites.
125
+
126
+ After the browser is up, the normal live browser interaction flow still runs
127
+ over Playwright CDP.
128
+
129
+ The library entrypoint does not load `.env` files. Environment loading is only
130
+ part of the CLI entrypoint.
131
+
132
+ ## Attach To An Existing Browser
133
+
134
+ If you already have a browser that exposes a CDP websocket, use `attach(...)`
135
+ instead of `launch(...)`.
136
+
137
+ That works for:
138
+
139
+ - a local Chrome or Chromium process started with remote debugging enabled;
140
+ - a cloud browser session that gives you a CDP websocket URL;
141
+ - any other browser runtime that Playwright can reach through CDP.
142
+
143
+ ```ts
144
+ import { attach, observe } from '@mercuryo-ai/agentbrowse';
145
+
146
+ const attached = await attach('ws://127.0.0.1:9222/devtools/browser/browser-id');
147
+ if (!attached.success) {
148
+ throw new Error(attached.reason ?? attached.message);
149
+ }
150
+
151
+ const observeResult = await observe(attached.session);
152
+ if (!observeResult.success) {
153
+ throw new Error(observeResult.reason ?? observeResult.message);
154
+ }
155
+ ```
156
+
157
+ If your provider gives you a labeled remote session, you can carry that label
158
+ in the session handle:
159
+
160
+ ```ts
161
+ const attached = await attach(remoteCdpUrl, {
162
+ provider: 'browserbase',
163
+ });
164
+ ```
165
+
166
+ ## What Each Main API Does
167
+
168
+ | API | Use it when | Typical result |
169
+ | --- | --- | --- |
170
+ | `launch(url?, options?)` | You need a new browser session | `session`, current `url`, current `title` |
171
+ | `attach(cdpUrl, options?)` | You already have a running browser that exposes CDP | `session`, current `url`, current `title` |
172
+ | `observe(session, goal?)` | You want to understand the page | targets, scopes, signals, fillable forms |
173
+ | `act(session, targetRef, action, value?)` | You want to click, type, select, fill, or press | action result and target metadata |
174
+ | `navigate(session, url)` | You want to move to another page | page metadata after navigation |
175
+ | `extract(session, schema, scopeRef?)` | You want structured JSON from the page | `data` that matches your schema |
176
+ | `screenshot(session, path?)` | You want a screenshot artifact | saved path and page metadata |
177
+ | `status(session)` | You want to know whether the session is still healthy | liveness, page info, runtime summary |
178
+ | `close(session)` | You are done with the browser | close result |
179
+
180
+ Two common questions:
181
+
182
+ - `observe(session)` gives you a general inventory of the page.
183
+ - `observe(session, goal)` focuses that inventory around a question such as
184
+ `"find the checkout total"` or `"find the email field"`.
185
+
186
+ All main APIs return the same broad result shape:
187
+
188
+ - success path: `{ success: true, ... }`
189
+ - failure path: `{ success: false, error, message, reason, ... }`
190
+
191
+ ## When You Need An Assistive Runtime
192
+
193
+ You only need assistive runtime when AgentBrowse should call an LLM.
194
+
195
+ In practice, that mainly means:
196
+
197
+ - `extract(...)`
198
+ - better quality goal-based `observe(session, goal)`
199
+
200
+ The runtime contract is intentionally small: you provide an object that can
201
+ create an OpenAI-compatible chat-completions client.
202
+
203
+ ```ts
204
+ import { createAgentbrowseClient } from '@mercuryo-ai/agentbrowse';
205
+
206
+ const client = createAgentbrowseClient({
207
+ assistiveRuntime: {
208
+ createLlmClient: () => ({
209
+ async createChatCompletion(args) {
210
+ const { messages, response_model, image, temperature, maxOutputTokens } = args.options;
211
+
212
+ const result = await callStructuredProvider({
213
+ messages,
214
+ responseModel: response_model,
215
+ image,
216
+ temperature,
217
+ maxOutputTokens,
218
+ });
219
+
220
+ return {
221
+ data: result.data,
222
+ usage: result.usage,
223
+ };
224
+ },
225
+ }),
226
+ },
227
+ });
228
+ ```
229
+
230
+ The same pattern works for OpenRouter and other OpenAI-compatible backends.
231
+
232
+ See:
233
+
234
+ - [Assistive Runtime Guide](./docs/assistive-runtime.md)
235
+
236
+ ## Session Persistence, Proxy, And Diagnostics
237
+
238
+ Normal usage is explicit-session based:
239
+
240
+ 1. call `launch(...)` or `attach(...)`
241
+ 2. keep the returned `session`
242
+ 3. pass that session into later calls
243
+
244
+ If you want to restore a session across process runs, use the optional store
245
+ helpers:
246
+
247
+ ```ts
248
+ import {
249
+ createBrowserSessionStore,
250
+ loadBrowserSession,
251
+ saveBrowserSession,
252
+ } from '@mercuryo-ai/agentbrowse';
253
+
254
+ saveBrowserSession(session);
255
+ const restored = loadBrowserSession();
256
+
257
+ const store = createBrowserSessionStore({
258
+ rootDir: '/tmp/my-app/browser-state',
259
+ });
260
+
261
+ store.save(session);
262
+ const restoredFromCustomRoot = store.load();
263
+ ```
264
+
265
+ If you want to use a proxy, pass it directly to `launch(...)`:
266
+
267
+ ```ts
268
+ const launchResult = await launch('https://example.com', {
269
+ useProxy: true,
270
+ proxy: 'http://user:pass@proxy.example:8080',
271
+ });
272
+ ```
273
+
274
+ Diagnostics are optional. If you need tracing or custom logging, use a client:
275
+
276
+ ```ts
277
+ import { createAgentbrowseClient } from '@mercuryo-ai/agentbrowse';
278
+
279
+ const client = createAgentbrowseClient({
280
+ diagnostics: {
281
+ startStep() {
282
+ return {
283
+ finish() {},
284
+ };
285
+ },
286
+ },
287
+ });
288
+ ```
289
+
290
+ See:
291
+
292
+ - [Configuration Guide](./docs/configuration.md)
293
+
294
+ ## Testing Wrappers Around AgentBrowse
295
+
296
+ If your package wraps AgentBrowse and you want a stable test helper for the
297
+ assistive runtime contract, use the dedicated testing subpath:
298
+
299
+ ```ts
300
+ import {
301
+ installFetchBackedTestAssistiveRuntime,
302
+ uninstallTestAssistiveRuntime,
303
+ } from '@mercuryo-ai/agentbrowse/testing';
304
+ ```
305
+
306
+ See:
307
+
308
+ - [Testing Guide](./docs/testing.md)
309
+
310
+ ## Protected Fill
311
+
312
+ Protected fill is for cases where your application already has sensitive values
313
+ and wants AgentBrowse to apply them to a previously observed form through a
314
+ guarded browser execution path.
315
+
316
+ Import it separately:
317
+
318
+ ```ts
319
+ import { fillProtectedForm } from '@mercuryo-ai/agentbrowse/protected-fill';
320
+ ```
321
+
322
+ See:
323
+
324
+ - [Protected Fill Guide](./docs/protected-fill.md)
325
+
326
+ ## Documentation
327
+
328
+ - [Getting Started](./docs/getting-started.md)
329
+ - [API Reference](./docs/api-reference.md)
330
+ - [Configuration Guide](./docs/configuration.md)
331
+ - [Assistive Runtime Guide](./docs/assistive-runtime.md)
332
+ - [Protected Fill Guide](./docs/protected-fill.md)
333
+ - [Integration Checklist](./docs/integration-checklist.md)
334
+ - [Testing Guide](./docs/testing.md)
335
+ - [Troubleshooting](./docs/troubleshooting.md)
@@ -0,0 +1,110 @@
1
+ import type { Stagehand } from '@browserbasehq/stagehand';
2
+ import type { z } from 'zod';
3
+ import type { BrowserSessionState } from './browser-session-state.js';
4
+ /** Token usage reported by an assistive LLM provider. */
5
+ export interface AgentbrowseAssistiveLlmUsage {
6
+ prompt_tokens?: number;
7
+ completion_tokens?: number;
8
+ total_tokens?: number;
9
+ cached_input_tokens?: number;
10
+ reasoning_tokens?: number;
11
+ }
12
+ /** Single text-or-image content entry in an assistive user message. */
13
+ export type AgentbrowseAssistiveMessageContentPart = {
14
+ type: 'text';
15
+ text: string;
16
+ } | {
17
+ type: 'image_url';
18
+ image_url: {
19
+ url: string;
20
+ detail: 'auto';
21
+ };
22
+ };
23
+ /** Single assistive chat message sent to the configured LLM client. */
24
+ export interface AgentbrowseAssistiveChatMessage {
25
+ role: 'system' | 'user' | 'assistant';
26
+ content: string | AgentbrowseAssistiveMessageContentPart[];
27
+ }
28
+ /** Optional screenshot-style image payload passed to the assistive runtime. */
29
+ export interface AgentbrowseAssistiveImageInput {
30
+ buffer: Buffer;
31
+ description?: string;
32
+ }
33
+ /** Structured output contract requested from the assistive runtime. */
34
+ export interface AgentbrowseAssistiveResponseModel {
35
+ name: string;
36
+ schema: z.ZodTypeAny;
37
+ }
38
+ /** Request options passed to `createChatCompletion(...)`. */
39
+ export interface AgentbrowseAssistiveChatCompletionOptions {
40
+ messages: AgentbrowseAssistiveChatMessage[];
41
+ response_model?: AgentbrowseAssistiveResponseModel;
42
+ temperature?: number;
43
+ maxOutputTokens?: number;
44
+ image?: AgentbrowseAssistiveImageInput;
45
+ }
46
+ /** Single structured assistive LLM request. */
47
+ export interface AgentbrowseAssistiveChatCompletionRequest {
48
+ logger?: (...args: unknown[]) => void;
49
+ options: AgentbrowseAssistiveChatCompletionOptions;
50
+ }
51
+ /** Structured assistive LLM response returned to AgentBrowse. */
52
+ export interface AgentbrowseAssistiveChatCompletionResult<T = unknown> {
53
+ data: T;
54
+ usage?: AgentbrowseAssistiveLlmUsage;
55
+ }
56
+ /** Minimal LLM client contract required by assistive AgentBrowse features. */
57
+ export interface AgentbrowseAssistiveLlmClient {
58
+ createChatCompletion<T = unknown>(args: AgentbrowseAssistiveChatCompletionRequest): Promise<AgentbrowseAssistiveChatCompletionResult<T>>;
59
+ }
60
+ /** Assistive runtime configuration for goal-based observe and extract flows. */
61
+ export interface AgentbrowseAssistiveRuntime {
62
+ createLlmClient: () => AgentbrowseAssistiveLlmClient;
63
+ connectStagehand?: (input: {
64
+ cdpUrl: string;
65
+ llmClient: AgentbrowseAssistiveLlmClient;
66
+ }) => Promise<Stagehand>;
67
+ }
68
+ export declare class AgentbrowseAssistiveRuntimeMissingError extends Error {
69
+ readonly feature: string;
70
+ constructor(feature: string);
71
+ }
72
+ export declare class AssistiveStructuredOutputTruncatedError extends Error {
73
+ readonly status: number;
74
+ readonly provider?: string;
75
+ readonly model?: string;
76
+ readonly finishReason?: string;
77
+ readonly maxOutputTokens?: number;
78
+ readonly completionTokens?: number;
79
+ constructor(message: string, params: {
80
+ status: number;
81
+ provider?: string;
82
+ model?: string;
83
+ finishReason?: string;
84
+ maxOutputTokens?: number;
85
+ completionTokens?: number;
86
+ });
87
+ }
88
+ export declare function configureAgentbrowseAssistiveRuntime(runtime: AgentbrowseAssistiveRuntime | null): void;
89
+ export declare function resetAgentbrowseAssistiveRuntime(): void;
90
+ /** Returns a best-effort assistive LLM client for the provided session or runtime. */
91
+ export declare function tryCreateAgentbrowseAssistiveLlmClient(options?: {
92
+ session?: BrowserSessionState | null;
93
+ runtime?: AgentbrowseAssistiveRuntime | null;
94
+ }): AgentbrowseAssistiveLlmClient | null;
95
+ /** Returns `true` when assistive LLM-backed features can run for the session. */
96
+ export declare function canUseAgentbrowseAssistiveLlmClient(options?: {
97
+ session?: BrowserSessionState | null;
98
+ runtime?: AgentbrowseAssistiveRuntime | null;
99
+ }): boolean;
100
+ /** Returns the configured assistive LLM client or throws when none is available. */
101
+ export declare function requireAgentbrowseAssistiveLlmClient(feature: string, options?: {
102
+ session?: BrowserSessionState | null;
103
+ runtime?: AgentbrowseAssistiveRuntime | null;
104
+ }): AgentbrowseAssistiveLlmClient;
105
+ /** Connects Stagehand through the configured assistive runtime for the session. */
106
+ export declare function connectConfiguredAssistiveStagehand(cdpUrl: string, options?: {
107
+ session?: BrowserSessionState | null;
108
+ runtime?: AgentbrowseAssistiveRuntime | null;
109
+ }): Promise<Stagehand>;
110
+ //# sourceMappingURL=assistive-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistive-runtime.d.ts","sourceRoot":"","sources":["../src/assistive-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE,yDAAyD;AACzD,MAAM,WAAW,4BAA4B;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,uEAAuE;AACvE,MAAM,MAAM,sCAAsC,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEtE,uEAAuE;AACvE,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,sCAAsC,EAAE,CAAC;CAC5D;AAED,+EAA+E;AAC/E,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uEAAuE;AACvE,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;CACtB;AAED,6DAA6D;AAC7D,MAAM,WAAW,yCAAyC;IACxD,QAAQ,EAAE,+BAA+B,EAAE,CAAC;IAC5C,cAAc,CAAC,EAAE,iCAAiC,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,8BAA8B,CAAC;CACxC;AAED,+CAA+C;AAC/C,MAAM,WAAW,yCAAyC;IACxD,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,yCAAyC,CAAC;CACpD;AAED,iEAAiE;AACjE,MAAM,WAAW,wCAAwC,CAAC,CAAC,GAAG,OAAO;IACnE,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE,4BAA4B,CAAC;CACtC;AAED,8EAA8E;AAC9E,MAAM,WAAW,6BAA6B;IAC5C,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAC9B,IAAI,EAAE,yCAAyC,GAC9C,OAAO,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzD;AAED,gFAAgF;AAChF,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,MAAM,6BAA6B,CAAC;IACrD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,6BAA6B,CAAC;KAC1C,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;CAC1B;AAED,qBAAa,uCAAwC,SAAQ,KAAK;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM;CAO5B;AAED,qBAAa,uCAAwC,SAAQ,KAAK;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;gBAGjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;CAWJ;AAqBD,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,2BAA2B,GAAG,IAAI,GAC1C,IAAI,CAEN;AAED,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAED,sFAAsF;AACtF,wBAAgB,sCAAsC,CACpD,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACzC,GACL,6BAA6B,GAAG,IAAI,CAEtC;AAED,iFAAiF;AACjF,wBAAgB,mCAAmC,CACjD,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACzC,GACL,OAAO,CAMT;AAED,oFAAoF;AACpF,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACzC,GACL,6BAA6B,CAM/B;AAED,mFAAmF;AACnF,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACzC,GACL,OAAO,CAAC,SAAS,CAAC,CAapB"}
@@ -0,0 +1,79 @@
1
+ import { getAgentbrowseSessionBindings } from './client-bindings.js';
2
+ import { connectStagehand } from './stagehand.js';
3
+ export class AgentbrowseAssistiveRuntimeMissingError extends Error {
4
+ feature;
5
+ constructor(feature) {
6
+ super(`AgentBrowse assistive runtime is not configured for ${feature}. Configure it in the orchestration layer before using assistive browser features.`);
7
+ this.name = 'AgentbrowseAssistiveRuntimeMissingError';
8
+ this.feature = feature;
9
+ }
10
+ }
11
+ export class AssistiveStructuredOutputTruncatedError extends Error {
12
+ status;
13
+ provider;
14
+ model;
15
+ finishReason;
16
+ maxOutputTokens;
17
+ completionTokens;
18
+ constructor(message, params) {
19
+ super(message);
20
+ this.name = 'AssistiveStructuredOutputTruncatedError';
21
+ this.status = params.status;
22
+ this.provider = params.provider;
23
+ this.model = params.model;
24
+ this.finishReason = params.finishReason;
25
+ this.maxOutputTokens = params.maxOutputTokens;
26
+ this.completionTokens = params.completionTokens;
27
+ }
28
+ }
29
+ let configuredAssistiveRuntime = null;
30
+ function resolveAssistiveRuntime(options = {}) {
31
+ if (options.runtime) {
32
+ return options.runtime;
33
+ }
34
+ const boundRuntime = options.session
35
+ ? (getAgentbrowseSessionBindings(options.session)?.assistiveRuntime ?? null)
36
+ : null;
37
+ return boundRuntime ?? configuredAssistiveRuntime;
38
+ }
39
+ export function configureAgentbrowseAssistiveRuntime(runtime) {
40
+ configuredAssistiveRuntime = runtime;
41
+ }
42
+ export function resetAgentbrowseAssistiveRuntime() {
43
+ configuredAssistiveRuntime = null;
44
+ }
45
+ /** Returns a best-effort assistive LLM client for the provided session or runtime. */
46
+ export function tryCreateAgentbrowseAssistiveLlmClient(options = {}) {
47
+ return resolveAssistiveRuntime(options)?.createLlmClient() ?? null;
48
+ }
49
+ /** Returns `true` when assistive LLM-backed features can run for the session. */
50
+ export function canUseAgentbrowseAssistiveLlmClient(options = {}) {
51
+ try {
52
+ return tryCreateAgentbrowseAssistiveLlmClient(options) !== null;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /** Returns the configured assistive LLM client or throws when none is available. */
59
+ export function requireAgentbrowseAssistiveLlmClient(feature, options = {}) {
60
+ const client = tryCreateAgentbrowseAssistiveLlmClient(options);
61
+ if (!client) {
62
+ throw new AgentbrowseAssistiveRuntimeMissingError(feature);
63
+ }
64
+ return client;
65
+ }
66
+ /** Connects Stagehand through the configured assistive runtime for the session. */
67
+ export async function connectConfiguredAssistiveStagehand(cdpUrl, options = {}) {
68
+ const runtime = resolveAssistiveRuntime(options);
69
+ const llmClient = requireAgentbrowseAssistiveLlmClient('assistive stagehand execution', options);
70
+ if (runtime?.connectStagehand) {
71
+ return runtime.connectStagehand({
72
+ cdpUrl,
73
+ llmClient,
74
+ });
75
+ }
76
+ return connectStagehand(cdpUrl, {
77
+ llmClient,
78
+ });
79
+ }
@@ -0,0 +1,7 @@
1
+ export declare function installFetchBackedTestAssistiveRuntime(options?: {
2
+ apiKey?: string;
3
+ apiUrl?: string;
4
+ model?: string;
5
+ }): void;
6
+ export declare function uninstallTestAssistiveRuntime(): void;
7
+ //# sourceMappingURL=assistive-runtime.test-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistive-runtime.test-support.d.ts","sourceRoot":"","sources":["../src/assistive-runtime.test-support.ts"],"names":[],"mappings":"AA4FA,wBAAgB,sCAAsC,CACpD,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,IAAI,CA2EN;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
@@ -0,0 +1,106 @@
1
+ import { toJsonSchema } from '@browserbasehq/stagehand';
2
+ import { AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
3
+ function readString(value) {
4
+ return typeof value === 'string' && value.trim().length > 0 ? value : undefined;
5
+ }
6
+ function readNumber(value) {
7
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
8
+ }
9
+ function normalizeApiUrl(value) {
10
+ return value.replace(/\/$/, '');
11
+ }
12
+ function normalizeUsage(usage) {
13
+ if (!usage ||
14
+ typeof usage.prompt_tokens !== 'number' ||
15
+ typeof usage.completion_tokens !== 'number' ||
16
+ typeof usage.total_tokens !== 'number') {
17
+ return undefined;
18
+ }
19
+ return usage;
20
+ }
21
+ function buildMessages(options) {
22
+ const messages = [...options.messages];
23
+ if (!options.image) {
24
+ return messages;
25
+ }
26
+ const content = [];
27
+ if (options.image.description?.trim()) {
28
+ content.push({ type: 'text', text: options.image.description.trim() });
29
+ }
30
+ content.push({
31
+ type: 'image_url',
32
+ image_url: {
33
+ url: `data:image/jpeg;base64,${options.image.buffer.toString('base64')}`,
34
+ detail: 'auto',
35
+ },
36
+ });
37
+ messages.push({
38
+ role: 'user',
39
+ content,
40
+ });
41
+ return messages;
42
+ }
43
+ export function installFetchBackedTestAssistiveRuntime(options = {}) {
44
+ const apiKey = options.apiKey ?? 'ap_test';
45
+ const apiUrl = normalizeApiUrl(options.apiUrl ?? 'https://example.com/api');
46
+ const model = options.model ?? 'magicpay';
47
+ configureAgentbrowseAssistiveRuntime({
48
+ createLlmClient: () => ({
49
+ async createChatCompletion({ options, }) {
50
+ if (!options.response_model) {
51
+ throw new Error('Test assistive runtime requires response_model');
52
+ }
53
+ const response = await fetch(`${apiUrl}/v1/chat/completions`, {
54
+ method: 'POST',
55
+ headers: {
56
+ Authorization: `Bearer ${apiKey}`,
57
+ Accept: 'application/json',
58
+ 'Content-Type': 'application/json',
59
+ },
60
+ body: JSON.stringify({
61
+ model,
62
+ messages: buildMessages(options),
63
+ response_format: {
64
+ type: 'json_schema',
65
+ json_schema: {
66
+ name: options.response_model.name,
67
+ strict: true,
68
+ schema: toJsonSchema(options.response_model.schema),
69
+ },
70
+ },
71
+ temperature: options.temperature,
72
+ max_completion_tokens: options.maxOutputTokens,
73
+ }),
74
+ });
75
+ const json = (await response.json());
76
+ if (!response.ok) {
77
+ if (json.error_code === 'structured_output_truncated') {
78
+ throw new AssistiveStructuredOutputTruncatedError(`Test assistive runtime error (${response.status})`, {
79
+ status: response.status,
80
+ provider: readString(json.provider),
81
+ model: readString(json.model),
82
+ finishReason: readString(json.finish_reason),
83
+ maxOutputTokens: readNumber(json.max_output_tokens),
84
+ completionTokens: readNumber(json.completion_tokens),
85
+ });
86
+ }
87
+ const message = typeof json.error === 'string'
88
+ ? json.error
89
+ : `Test assistive runtime HTTP ${response.status}`;
90
+ throw new Error(message);
91
+ }
92
+ const content = json.choices?.[0]?.message?.content;
93
+ if (typeof content !== 'string' || content.trim().length === 0) {
94
+ throw new Error('Test assistive runtime response missing assistant content');
95
+ }
96
+ return {
97
+ data: JSON.parse(content),
98
+ usage: normalizeUsage(json.usage),
99
+ };
100
+ },
101
+ }),
102
+ });
103
+ }
104
+ export function uninstallTestAssistiveRuntime() {
105
+ resetAgentbrowseAssistiveRuntime();
106
+ }
@@ -0,0 +1,12 @@
1
+ import type { BrowserSessionState } from './browser-session-state.js';
2
+ import type { Stagehand } from '@browserbasehq/stagehand';
3
+ /**
4
+ * Connect Stagehand with the currently configured assistive runtime.
5
+ *
6
+ * This stays separate from the generic Stagehand connector so the browser-core
7
+ * layer does not own orchestration/backend setup directly.
8
+ */
9
+ export declare function connectAssistiveStagehand(cdpUrl: string, options?: {
10
+ session?: BrowserSessionState | null;
11
+ }): Promise<Stagehand>;
12
+ //# sourceMappingURL=assistive-stagehand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistive-stagehand.d.ts","sourceRoot":"","sources":["../src/assistive-stagehand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAG1D;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACjC,GACL,OAAO,CAAC,SAAS,CAAC,CAEpB"}