@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/dist/index.js ADDED
@@ -0,0 +1,350 @@
1
+ #!/usr/bin/env node
2
+ import { config as loadEnv } from 'dotenv';
3
+ import { realpathSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+ loadEnv();
6
+ import { browseCommand, browseCommandName } from './command-name.js';
7
+ import { assertSemanticObserveRuntimeSupport } from './commands/semantic-observe-lexical.js';
8
+ import { loadSession } from './session.js';
9
+ import { outputContractFailure, outputError, outputJSON, fatal, info } from './output.js';
10
+ function usageText() {
11
+ return `Usage: ${browseCommandName()} <command> [args] [options]
12
+
13
+ Commands:
14
+ launch [url] [options] Launch browser, optionally navigate to URL
15
+ attach <cdp-url> [options] Attach to an existing browser over CDP
16
+ browser-status Check live browser/page/runtime state
17
+ navigate <url> Navigate current tab to URL
18
+ act <targetRef> <action> [value] Perform action on a previously observed target
19
+ extract '<schema-json>' [scopeRef] Extract structured data from the page or a stored scope
20
+ observe ["<goal>"] Discover available targets/elements
21
+ screenshot [--path <file>] Capture a screenshot
22
+ close Close browser and clean up
23
+
24
+ Options:
25
+ --compact Launch browser in compact window size (1280x900, default)
26
+ --full Launch browser in full-size window
27
+ --profile <name> Solver profile name for launch (default: "default")
28
+ --proxy [url] Launch through configured proxy, or use one-off override URL
29
+ --provider <name> Optional provider label for attach (for example "browserbase")
30
+ --headful Explicit alias for headful browser mode (default)
31
+ --headless Launch browser in headless mode
32
+ --path <file> Output path for screenshot
33
+ --help Show this help message`;
34
+ }
35
+ const KNOWN_COMMANDS = new Set([
36
+ 'launch',
37
+ 'attach',
38
+ 'browser-status',
39
+ 'navigate',
40
+ 'act',
41
+ 'extract',
42
+ 'observe',
43
+ 'screenshot',
44
+ 'close',
45
+ ]);
46
+ function getCommand(argv = process.argv) {
47
+ const rawArgs = argv.slice(2);
48
+ if (rawArgs.length === 0 || rawArgs[0] === '--help') {
49
+ info(usageText());
50
+ process.exit(0);
51
+ }
52
+ const command = rawArgs[0];
53
+ const args = rawArgs.slice(1);
54
+ return { command, args };
55
+ }
56
+ /** Parse --key value or --key 'value' from args array. */
57
+ function getFlag(args, flag) {
58
+ const idx = args.indexOf(flag);
59
+ if (idx === -1 || idx + 1 >= args.length)
60
+ return undefined;
61
+ return args[idx + 1];
62
+ }
63
+ function hasFlag(args, flag) {
64
+ return args.includes(flag);
65
+ }
66
+ /** Get the first positional argument (not starting with --). */
67
+ function getPositional(args, valueFlags = []) {
68
+ const valueFlagSet = new Set(valueFlags);
69
+ for (let i = 0; i < args.length; i++) {
70
+ const arg = args[i];
71
+ if (arg.startsWith('--')) {
72
+ if (valueFlagSet.has(arg)) {
73
+ i += 1;
74
+ }
75
+ continue;
76
+ }
77
+ return arg;
78
+ }
79
+ return undefined;
80
+ }
81
+ function getPositionals(args, valueFlags = []) {
82
+ const valueFlagSet = new Set(valueFlags);
83
+ const values = [];
84
+ for (let i = 0; i < args.length; i++) {
85
+ const arg = args[i];
86
+ if (arg.startsWith('--')) {
87
+ if (valueFlagSet.has(arg)) {
88
+ i += 1;
89
+ }
90
+ continue;
91
+ }
92
+ values.push(arg);
93
+ }
94
+ return values;
95
+ }
96
+ function parseLaunchArgs(args) {
97
+ let url;
98
+ let compact = true;
99
+ let profile;
100
+ let headless = false;
101
+ let useProxy = false;
102
+ let proxy;
103
+ for (let i = 0; i < args.length; i++) {
104
+ const arg = args[i];
105
+ if (arg === '--headless') {
106
+ headless = true;
107
+ continue;
108
+ }
109
+ if (arg === '--headful') {
110
+ headless = false;
111
+ continue;
112
+ }
113
+ if (arg === '--compact') {
114
+ compact = true;
115
+ continue;
116
+ }
117
+ if (arg === '--full') {
118
+ compact = false;
119
+ continue;
120
+ }
121
+ if (arg === '--profile') {
122
+ const value = args[i + 1];
123
+ if (!value || value.startsWith('--')) {
124
+ outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy [url]]', '[--headful|--headless]')}`);
125
+ }
126
+ profile = value;
127
+ i += 1;
128
+ continue;
129
+ }
130
+ if (arg.startsWith('--proxy=')) {
131
+ const value = arg.slice('--proxy='.length).trim();
132
+ if (!value) {
133
+ outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy [url]]', '[--headful|--headless]')}`);
134
+ }
135
+ useProxy = true;
136
+ proxy = value;
137
+ continue;
138
+ }
139
+ if (arg === '--proxy') {
140
+ useProxy = true;
141
+ const value = args[i + 1];
142
+ const trailingPositionals = args.slice(i + 1).filter((entry) => !entry.startsWith('--'));
143
+ if (value && !value.startsWith('--') && (url || trailingPositionals.length > 1)) {
144
+ proxy = value;
145
+ i += 1;
146
+ }
147
+ continue;
148
+ }
149
+ if (arg.startsWith('--')) {
150
+ outputError(`Unknown launch option: ${arg}`);
151
+ }
152
+ if (url) {
153
+ outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy [url]]', '[--headful|--headless]')}`);
154
+ }
155
+ url = arg;
156
+ }
157
+ return { url, compact, profile, headless, useProxy, proxy };
158
+ }
159
+ function parseAttachArgs(args) {
160
+ let cdpUrl;
161
+ let provider;
162
+ for (let i = 0; i < args.length; i++) {
163
+ const arg = args[i];
164
+ if (arg === '--provider') {
165
+ const value = args[i + 1];
166
+ if (!value || value.startsWith('--')) {
167
+ outputError(`Usage: ${browseCommand('attach', '<cdp-url>', '[--provider <name>]')}`);
168
+ }
169
+ provider = value;
170
+ i += 1;
171
+ continue;
172
+ }
173
+ if (arg.startsWith('--')) {
174
+ outputError(`Unknown attach option: ${arg}`);
175
+ }
176
+ if (cdpUrl) {
177
+ outputError(`Usage: ${browseCommand('attach', '<cdp-url>', '[--provider <name>]')}`);
178
+ }
179
+ cdpUrl = arg;
180
+ }
181
+ if (!cdpUrl) {
182
+ outputError(`Usage: ${browseCommand('attach', '<cdp-url>', '[--provider <name>]')}`);
183
+ }
184
+ return {
185
+ cdpUrl: cdpUrl,
186
+ ...(provider ? { provider } : {}),
187
+ };
188
+ }
189
+ /** Require an active browser session. */
190
+ function requireLaunchedBrowserSessionRecord(command) {
191
+ const session = loadSession();
192
+ if (session) {
193
+ return session;
194
+ }
195
+ return outputContractFailure({
196
+ error: 'browser_session_required',
197
+ outcomeType: 'blocked',
198
+ message: `The \`${command}\` command requires an active browser session.`,
199
+ reason: `No persisted browser session was found. Run \`${browseCommandName()} launch [url]\` or \`${browseCommandName()} attach <cdp-url>\` first.`,
200
+ });
201
+ }
202
+ async function main(argv = process.argv) {
203
+ const parsed = getCommand(argv);
204
+ if (!parsed)
205
+ process.exit(1);
206
+ const { command, args } = parsed;
207
+ if (!KNOWN_COMMANDS.has(command)) {
208
+ outputError(`Unknown command: ${command}\n\n${usageText()}`);
209
+ }
210
+ try {
211
+ assertSemanticObserveRuntimeSupport();
212
+ }
213
+ catch (err) {
214
+ outputError(err instanceof Error ? err.message : String(err));
215
+ }
216
+ switch (command) {
217
+ case 'launch': {
218
+ const { launch } = await import('./commands/launch.js');
219
+ const { close } = await import('./commands/close.js');
220
+ const { saveBrowserSession } = await import('./browser-session-state.js');
221
+ const { deleteWorkflowContext } = await import('./session.js');
222
+ const { checkForLaunchUpdate } = await import('./update-check.js');
223
+ const launchArgs = parseLaunchArgs(args);
224
+ const updateNoticePromise = checkForLaunchUpdate().catch(() => null);
225
+ const existingSession = loadSession();
226
+ await Promise.resolve(close(existingSession)).catch(() => undefined);
227
+ deleteWorkflowContext();
228
+ const launchResult = await launch(launchArgs.url, {
229
+ compact: launchArgs.compact,
230
+ profile: launchArgs.profile,
231
+ headless: launchArgs.headless,
232
+ useProxy: launchArgs.useProxy,
233
+ proxy: launchArgs.proxy,
234
+ });
235
+ if (launchResult.success) {
236
+ saveBrowserSession(launchResult.session);
237
+ }
238
+ const updateNotice = await Promise.race([
239
+ updateNoticePromise,
240
+ new Promise((resolve) => {
241
+ queueMicrotask(() => resolve(null));
242
+ }),
243
+ ]);
244
+ if (updateNotice) {
245
+ info(updateNotice.message);
246
+ }
247
+ outputJSON(launchResult);
248
+ break;
249
+ }
250
+ case 'attach': {
251
+ const { attach } = await import('./commands/attach.js');
252
+ const { close } = await import('./commands/close.js');
253
+ const { saveBrowserSession } = await import('./browser-session-state.js');
254
+ const { deleteWorkflowContext } = await import('./session.js');
255
+ const attachArgs = parseAttachArgs(args);
256
+ const existingSession = loadSession();
257
+ await Promise.resolve(close(existingSession)).catch(() => undefined);
258
+ deleteWorkflowContext();
259
+ const attachResult = await attach(attachArgs.cdpUrl, {
260
+ ...(attachArgs.provider ? { provider: attachArgs.provider } : {}),
261
+ });
262
+ if (attachResult.success) {
263
+ saveBrowserSession(attachResult.session);
264
+ }
265
+ outputJSON(attachResult);
266
+ break;
267
+ }
268
+ case 'navigate': {
269
+ const url = getPositional(args);
270
+ if (!url)
271
+ outputError(`Usage: ${browseCommand('navigate', '<url>')}`);
272
+ const { navigate } = await import('./commands/navigate.js');
273
+ await navigate(requireLaunchedBrowserSessionRecord(command), url);
274
+ break;
275
+ }
276
+ case 'act': {
277
+ const positionals = getPositionals(args);
278
+ const [targetRef, action, ...valueParts] = positionals;
279
+ if (!targetRef || !action) {
280
+ outputError(`Usage: ${browseCommand('act', '<targetRef>', '<action>', '[value]')}`);
281
+ }
282
+ const { act, isBrowseAction } = await import('./commands/act.js');
283
+ if (!isBrowseAction(action)) {
284
+ outputError(`Unsupported act action: ${action}. Expected one of: click, fill, type, select, press.`);
285
+ }
286
+ await act(requireLaunchedBrowserSessionRecord(command), targetRef, action, valueParts.length > 0 ? valueParts.join(' ') : undefined);
287
+ break;
288
+ }
289
+ case 'extract': {
290
+ const positionals = getPositionals(args);
291
+ const [schemaJson, scopeRef] = positionals;
292
+ if (!schemaJson) {
293
+ outputError(`Usage: ${browseCommand('extract', "'<schema-json>'", '[scopeRef]')}`);
294
+ }
295
+ const { extract } = await import('./commands/extract.js');
296
+ await extract(requireLaunchedBrowserSessionRecord(command), schemaJson, scopeRef);
297
+ break;
298
+ }
299
+ case 'observe': {
300
+ const instruction = getPositional(args);
301
+ const { observe } = await import('./commands/observe.js');
302
+ await observe(requireLaunchedBrowserSessionRecord(command), instruction);
303
+ break;
304
+ }
305
+ case 'screenshot': {
306
+ if (hasFlag(args, '--help')) {
307
+ info(`Usage: ${browseCommand('screenshot', '[--path <file>]')}`);
308
+ process.exit(0);
309
+ }
310
+ const filePath = getFlag(args, '--path');
311
+ const { screenshot } = await import('./commands/screenshot.js');
312
+ await screenshot(requireLaunchedBrowserSessionRecord(command), filePath);
313
+ break;
314
+ }
315
+ case 'browser-status': {
316
+ const { browserStatus } = await import('./commands/browser-status.js');
317
+ outputJSON(await browserStatus(requireLaunchedBrowserSessionRecord(command)));
318
+ break;
319
+ }
320
+ case 'close': {
321
+ const session = loadSession();
322
+ const { close } = await import('./commands/close.js');
323
+ const { deleteSession } = await import('./session.js');
324
+ const result = await close(session);
325
+ if (result.success) {
326
+ deleteSession();
327
+ }
328
+ outputJSON(result);
329
+ break;
330
+ }
331
+ }
332
+ }
333
+ export { main };
334
+ export function isDirectExecution(metaUrl, argv = process.argv) {
335
+ const entry = argv[1];
336
+ if (!entry) {
337
+ return false;
338
+ }
339
+ try {
340
+ return realpathSync(entry) === realpathSync(fileURLToPath(metaUrl));
341
+ }
342
+ catch {
343
+ return false;
344
+ }
345
+ }
346
+ if (isDirectExecution(import.meta.url)) {
347
+ main().catch((err) => {
348
+ fatal(err instanceof Error ? err.message : String(err));
349
+ });
350
+ }
@@ -0,0 +1,17 @@
1
+ export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, type BrowserSessionCapabilities, type BrowserSessionStore, type BrowserSessionState, type BrowseSessionIdentity, type BrowseSessionTransport, } from './browser-session-state.js';
2
+ export { attach, ATTACH_ERROR_CODES, ATTACH_OUTCOME_TYPES, type AttachErrorCode, type AttachFailureResult, type AttachOutcomeType, type AttachOptions, type AttachResult, type AttachSuccessResult, } from './commands/attach.js';
3
+ export { AgentbrowseAssistiveRuntimeMissingError, AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, type AgentbrowseAssistiveChatCompletionOptions, type AgentbrowseAssistiveChatCompletionRequest, type AgentbrowseAssistiveChatCompletionResult, type AgentbrowseAssistiveChatMessage, type AgentbrowseAssistiveImageInput, type AgentbrowseAssistiveLlmClient, type AgentbrowseAssistiveLlmUsage, type AgentbrowseAssistiveMessageContentPart, type AgentbrowseAssistiveResponseModel, type AgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
4
+ export { createAgentbrowseClient, type AgentbrowseClient, type AgentbrowseClientOptions, } from './client.js';
5
+ export { configureAgentbrowseDiagnostics, resetAgentbrowseDiagnostics, type DiagnosticArtifactManifest, type DiagnosticArtifactManifestInput, type AgentbrowseDiagnosticsHooks, type DiagnosticChildSpanInput, type DiagnosticLifecycleEventInput, type DiagnosticSnapshotInput, type DiagnosticStepFinishInput, type DiagnosticStepHandle, type DiagnosticStepStartInput, } from './diagnostics.js';
6
+ export { setSolverConfigStoreOverride, type SolverConfigStoreOverride, } from './solver/config.js';
7
+ export type { BrowserCommandSession } from './browser-session-state.js';
8
+ export { browserStatus as status, BROWSER_STATUS_OUTCOME_TYPES, type BrowserStatusAliveResult, type BrowserStatusCurrentPageMismatch, type BrowserStatusNotRunningResult, type BrowserStatusOutcomeType, type BrowserStatusProtectedExposureResult, type BrowserStatusResult, type BrowserStatusRuntimeSummary, } from './commands/browser-status.js';
9
+ export { actBrowser as act, ACT_ERROR_CODES, ACT_OUTCOME_TYPES, isBrowseAction, BROWSE_ACTIONS, type ActErrorCode, type ActExecutionFailureResult, type ActFailureResult, type ActOutcomeType, type ActPreflightFailureResult, type ActResult, type ActSuccessResult, type BrowseAction, } from './commands/act.js';
10
+ export { extractBrowser as extract, EXTRACT_ERROR_CODES, EXTRACT_OUTCOME_TYPES, type ExtractErrorCode, type ExtractFailureResult, type ExtractOutcomeType, type ExtractResult, type ExtractSchemaDescriptor, type ExtractSchemaInput, type ExtractSchemaValue, type ExtractSuccessResult, } from './commands/extract.js';
11
+ export { observeBrowser as observe, OBSERVE_ERROR_CODES, OBSERVE_OUTCOME_TYPES, type ObserveErrorCode, type ObserveExecutionMode, type ObserveFailureResult, type ObserveFillableForm, type ObserveOutcomeType, type ObserveResult, type ObserveScope, type ObserveSuccessResult, type ObserveSignal, type ObserveTarget, } from './commands/observe.js';
12
+ export { close, CLOSE_ERROR_CODES, CLOSE_OUTCOME_TYPES, type CloseErrorCode, type CloseFailureResult, type CloseOutcomeType, type CloseResult, type CloseSuccessResult, } from './commands/close.js';
13
+ export { launch, LAUNCH_ERROR_CODES, LAUNCH_OUTCOME_TYPES, type LaunchErrorCode, type LaunchOptions, type LaunchFailureResult, type LaunchOutcomeType, type LaunchResult, type LaunchSuccessResult, } from './commands/launch.js';
14
+ export { navigateBrowser as navigate, NAVIGATE_ERROR_CODES, NAVIGATE_OUTCOME_TYPES, type NavigateErrorCode, type NavigateFailureResult, type NavigateOutcomeType, type NavigateResult, type NavigateSuccessResult, } from './commands/navigate.js';
15
+ export { screenshotBrowser as screenshot, SCREENSHOT_ERROR_CODES, SCREENSHOT_OUTCOME_TYPES, type ScreenshotErrorCode, type ScreenshotFailureResult, type ScreenshotOutcomeType, type ScreenshotResult, type ScreenshotSuccessResult, } from './commands/screenshot.js';
16
+ export type { ProtectedFieldPolicies, ProtectedFillForm } from './protected-fill.js';
17
+ //# sourceMappingURL=library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, } from './browser-session-state.js';
2
+ export { attach, ATTACH_ERROR_CODES, ATTACH_OUTCOME_TYPES, } from './commands/attach.js';
3
+ export { AgentbrowseAssistiveRuntimeMissingError, AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
4
+ export { createAgentbrowseClient, } from './client.js';
5
+ export { configureAgentbrowseDiagnostics, resetAgentbrowseDiagnostics, } from './diagnostics.js';
6
+ export { setSolverConfigStoreOverride, } from './solver/config.js';
7
+ export { browserStatus as status, BROWSER_STATUS_OUTCOME_TYPES, } from './commands/browser-status.js';
8
+ export { actBrowser as act, ACT_ERROR_CODES, ACT_OUTCOME_TYPES, isBrowseAction, BROWSE_ACTIONS, } from './commands/act.js';
9
+ export { extractBrowser as extract, EXTRACT_ERROR_CODES, EXTRACT_OUTCOME_TYPES, } from './commands/extract.js';
10
+ export { observeBrowser as observe, OBSERVE_ERROR_CODES, OBSERVE_OUTCOME_TYPES, } from './commands/observe.js';
11
+ export { close, CLOSE_ERROR_CODES, CLOSE_OUTCOME_TYPES, } from './commands/close.js';
12
+ export { launch, LAUNCH_ERROR_CODES, LAUNCH_OUTCOME_TYPES, } from './commands/launch.js';
13
+ export { navigateBrowser as navigate, NAVIGATE_ERROR_CODES, NAVIGATE_OUTCOME_TYPES, } from './commands/navigate.js';
14
+ export { screenshotBrowser as screenshot, SCREENSHOT_ERROR_CODES, SCREENSHOT_OUTCOME_TYPES, } from './commands/screenshot.js';
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structured output helpers.
3
+ * Machine-readable JSON to stdout.
4
+ */
5
+ export interface BrowseResult {
6
+ success: boolean;
7
+ error?: string;
8
+ url?: string;
9
+ title?: string;
10
+ [key: string]: unknown;
11
+ }
12
+ export interface BrowseContractFailure extends Omit<BrowseResult, 'success'> {
13
+ error: string;
14
+ outcomeType: string;
15
+ message: string;
16
+ reason: string;
17
+ }
18
+ /** Write final structured result to stdout and exit. */
19
+ export declare function outputJSON(result: BrowseResult): never;
20
+ /** Write structured failure result to stdout and exit 1. */
21
+ export declare function outputFailure(result: Omit<BrowseResult, 'success'> & {
22
+ error: string;
23
+ }): never;
24
+ /** Write a normalized contract failure result to stderr and exit 1. */
25
+ export declare function outputContractFailure(result: BrowseContractFailure): never;
26
+ /** Write error to stderr and exit 1. */
27
+ export declare function outputError(error: string): never;
28
+ /** Write a progress/info message to stderr. */
29
+ export declare function info(message: string): void;
30
+ /** Fatal crash — unhandled error, exit 1. */
31
+ export declare function fatal(message: string): never;
32
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAMtD;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAE9F;AAED,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,KAAK,CAE1E;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAEhD;AAED,+CAA+C;AAC/C,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,6CAA6C;AAC7C,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAG5C"}
package/dist/output.js ADDED
@@ -0,0 +1,33 @@
1
+ import { browseCommandName } from './command-name.js';
2
+ function serializeResult(result) {
3
+ return `${JSON.stringify(result, null, 2)}\n`;
4
+ }
5
+ /** Write final structured result to stdout and exit. */
6
+ export function outputJSON(result) {
7
+ const normalizedResult = result.success
8
+ ? result
9
+ : { ...result, error: result.error ?? 'Unknown error' };
10
+ process.stdout.write(serializeResult(normalizedResult));
11
+ process.exit(result.success ? 0 : 1);
12
+ }
13
+ /** Write structured failure result to stdout and exit 1. */
14
+ export function outputFailure(result) {
15
+ outputJSON({ success: false, ...result });
16
+ }
17
+ /** Write a normalized contract failure result to stderr and exit 1. */
18
+ export function outputContractFailure(result) {
19
+ outputFailure(result);
20
+ }
21
+ /** Write error to stderr and exit 1. */
22
+ export function outputError(error) {
23
+ outputFailure({ error });
24
+ }
25
+ /** Write a progress/info message to stderr. */
26
+ export function info(message) {
27
+ process.stderr.write(`${message}\n`);
28
+ }
29
+ /** Fatal crash — unhandled error, exit 1. */
30
+ export function fatal(message) {
31
+ process.stderr.write(`[${browseCommandName()}] Fatal: ${message}\n`);
32
+ process.exit(1);
33
+ }
@@ -0,0 +1,12 @@
1
+ import { type BrowserSessionState } from './browser-session-state.js';
2
+ export type CloseOwnedBrowserResult = {
3
+ success: true;
4
+ method: 'already_closed' | 'cdp' | 'signal' | 'cleanup';
5
+ } | {
6
+ success: false;
7
+ reason: string;
8
+ };
9
+ export declare function closeOwnedBrowser(session: BrowserSessionState & {
10
+ pid: number;
11
+ }): Promise<CloseOwnedBrowserResult>;
12
+ //# sourceMappingURL=owned-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-browser.d.ts","sourceRoot":"","sources":["../src/owned-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQtF,MAAM,MAAM,uBAAuB,GAC/B;IACE,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzD,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,uBAAuB,CAAC,CAuClC"}
@@ -0,0 +1,69 @@
1
+ import { getSessionPort } from './browser-session-state.js';
2
+ import { connectPlaywright } from './playwright-runtime.js';
3
+ import { cleanupManagedBrowserPids, terminateOwnedPid } from './owned-process.js';
4
+ import { getUserDataDir } from './solver/config.js';
5
+ const ENDPOINT_WAIT_ATTEMPTS = 10;
6
+ const ENDPOINT_WAIT_MS = 100;
7
+ export async function closeOwnedBrowser(session) {
8
+ const port = getSessionPort(session);
9
+ const endpointAliveBeforeClose = await isBrowserEndpointAlive(port);
10
+ if (endpointAliveBeforeClose) {
11
+ await tryCloseBrowserViaCdp(session.cdpUrl);
12
+ if (await waitForBrowserEndpointToClose(port)) {
13
+ return { success: true, method: 'cdp' };
14
+ }
15
+ }
16
+ const termination = await terminateOwnedPid(session.pid);
17
+ if (await waitForBrowserEndpointToClose(port)) {
18
+ return {
19
+ success: true,
20
+ method: endpointAliveBeforeClose ? 'signal' : 'already_closed',
21
+ };
22
+ }
23
+ if (session.profile) {
24
+ const cleanup = await cleanupManagedBrowserPids({
25
+ userDataDir: getUserDataDir(session.profile),
26
+ });
27
+ if (await waitForBrowserEndpointToClose(port)) {
28
+ return {
29
+ success: true,
30
+ method: cleanup.terminated.length > 0 ? 'cleanup' : 'already_closed',
31
+ };
32
+ }
33
+ }
34
+ if (!endpointAliveBeforeClose && termination === 'not_found') {
35
+ return { success: true, method: 'already_closed' };
36
+ }
37
+ return {
38
+ success: false,
39
+ reason: `Owned browser endpoint on port ${port} remained reachable after close attempts (termination=${termination}).`,
40
+ };
41
+ }
42
+ async function tryCloseBrowserViaCdp(cdpUrl) {
43
+ try {
44
+ const browser = await connectPlaywright(cdpUrl);
45
+ await browser.close();
46
+ }
47
+ catch { }
48
+ }
49
+ async function isBrowserEndpointAlive(port) {
50
+ try {
51
+ const response = await fetch(`http://127.0.0.1:${port}/json/version`);
52
+ return response.ok;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ async function waitForBrowserEndpointToClose(port) {
59
+ for (let attempt = 0; attempt < ENDPOINT_WAIT_ATTEMPTS; attempt++) {
60
+ if (!(await isBrowserEndpointAlive(port))) {
61
+ return true;
62
+ }
63
+ await sleep(ENDPOINT_WAIT_MS);
64
+ }
65
+ return !(await isBrowserEndpointAlive(port));
66
+ }
67
+ function sleep(ms) {
68
+ return new Promise((resolve) => setTimeout(resolve, ms));
69
+ }
@@ -0,0 +1,19 @@
1
+ export type OwnedPidTerminationResult = 'not_found' | 'terminated' | 'sigkilled' | 'still_alive';
2
+ export type ManagedBrowserCleanupResult = {
3
+ terminated: number[];
4
+ blocked: number[];
5
+ };
6
+ export declare function isPidAlive(pid: number): boolean;
7
+ export declare function terminateOwnedPid(pid: number): Promise<OwnedPidTerminationResult>;
8
+ export declare function cleanupManagedBrowserPids(options?: {
9
+ excludePids?: Iterable<number>;
10
+ userDataDir?: string;
11
+ }): Promise<ManagedBrowserCleanupResult>;
12
+ export declare function listManagedBrowserPids(options?: {
13
+ processTable?: string;
14
+ userDataDir?: string;
15
+ }): number[];
16
+ export declare function isManagedBrowserPid(pid: number, options?: {
17
+ processTable?: string;
18
+ }): boolean;
19
+ //# sourceMappingURL=owned-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-process.d.ts","sourceRoot":"","sources":["../src/owned-process.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AACjG,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAW/C;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAOvF;AAiCD,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACrE,OAAO,CAAC,2BAA2B,CAAC,CAqBtC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACjB,GACL,MAAM,EAAE,CAwBV;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,OAAO,CAET"}