@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
@@ -0,0 +1,145 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { getProfilesDir } from './solver/config.js';
4
+ const TERM_WAIT_ATTEMPTS = 10;
5
+ const TERM_WAIT_MS = 100;
6
+ const KILL_WAIT_ATTEMPTS = 5;
7
+ const KILL_WAIT_MS = 20;
8
+ export function isPidAlive(pid) {
9
+ try {
10
+ process.kill(pid, 0);
11
+ return true;
12
+ }
13
+ catch (error) {
14
+ const code = getErrorCode(error);
15
+ if (code === 'EPERM') {
16
+ return true;
17
+ }
18
+ return false;
19
+ }
20
+ }
21
+ export async function terminateOwnedPid(pid) {
22
+ const processGroupTermination = await terminateSignalTarget(-pid, pid);
23
+ if (processGroupTermination !== 'not_found') {
24
+ return processGroupTermination;
25
+ }
26
+ return terminateSignalTarget(pid, pid);
27
+ }
28
+ async function terminateSignalTarget(target, pid) {
29
+ try {
30
+ process.kill(target, 'SIGTERM');
31
+ }
32
+ catch (error) {
33
+ const code = getErrorCode(error);
34
+ if (target < 0 && code === 'ESRCH' && isPidAlive(pid)) {
35
+ return 'not_found';
36
+ }
37
+ return isPidAlive(pid) ? 'still_alive' : 'not_found';
38
+ }
39
+ if (await waitForPidExit(pid, TERM_WAIT_ATTEMPTS, TERM_WAIT_MS)) {
40
+ return 'terminated';
41
+ }
42
+ try {
43
+ process.kill(target, 'SIGKILL');
44
+ }
45
+ catch {
46
+ return isPidAlive(pid) ? 'still_alive' : 'sigkilled';
47
+ }
48
+ if (await waitForPidExit(pid, KILL_WAIT_ATTEMPTS, KILL_WAIT_MS)) {
49
+ return 'sigkilled';
50
+ }
51
+ return 'still_alive';
52
+ }
53
+ export async function cleanupManagedBrowserPids(options = {}) {
54
+ const excludePids = new Set(options.excludePids ?? []);
55
+ const terminated = [];
56
+ const blocked = [];
57
+ for (const pid of listManagedBrowserPids({ userDataDir: options.userDataDir })) {
58
+ if (excludePids.has(pid)) {
59
+ continue;
60
+ }
61
+ const result = await terminateOwnedPid(pid);
62
+ if (result === 'still_alive') {
63
+ blocked.push(pid);
64
+ continue;
65
+ }
66
+ if (result !== 'not_found') {
67
+ terminated.push(pid);
68
+ }
69
+ }
70
+ return { terminated, blocked };
71
+ }
72
+ export function listManagedBrowserPids(options = {}) {
73
+ const processTable = options.processTable ?? readProcessTable();
74
+ const pids = new Set();
75
+ const scopedUserDataDir = options.userDataDir ? path.resolve(options.userDataDir) : null;
76
+ for (const line of processTable.split(/\r?\n/)) {
77
+ const match = line.trimStart().match(/^(\d+)\s+(.*)$/);
78
+ if (!match) {
79
+ continue;
80
+ }
81
+ const pid = Number(match[1]);
82
+ const command = match[2] ?? '';
83
+ if (!Number.isFinite(pid) || pid <= 0 || pid === process.pid) {
84
+ continue;
85
+ }
86
+ if (!isManagedBrowserCommand(command, scopedUserDataDir)) {
87
+ continue;
88
+ }
89
+ pids.add(pid);
90
+ }
91
+ return Array.from(pids);
92
+ }
93
+ export function isManagedBrowserPid(pid, options = {}) {
94
+ return listManagedBrowserPids(options).includes(pid);
95
+ }
96
+ async function waitForPidExit(pid, attempts, intervalMs) {
97
+ for (let attempt = 0; attempt < attempts; attempt++) {
98
+ if (!isPidAlive(pid)) {
99
+ return true;
100
+ }
101
+ await sleep(intervalMs);
102
+ }
103
+ return !isPidAlive(pid);
104
+ }
105
+ function getErrorCode(error) {
106
+ if (!error || typeof error !== 'object') {
107
+ return undefined;
108
+ }
109
+ const code = Reflect.get(error, 'code');
110
+ return typeof code === 'string' ? code : undefined;
111
+ }
112
+ function sleep(ms) {
113
+ return new Promise((resolve) => setTimeout(resolve, ms));
114
+ }
115
+ function readProcessTable() {
116
+ try {
117
+ return execFileSync('ps', ['-Ao', 'pid=,command='], { encoding: 'utf-8' });
118
+ }
119
+ catch {
120
+ return '';
121
+ }
122
+ }
123
+ function isManagedBrowserCommand(command, scopedUserDataDir) {
124
+ if (!command.includes('--remote-debugging-address=127.0.0.1')) {
125
+ return false;
126
+ }
127
+ const userDataDir = readCommandFlag(command, '--user-data-dir');
128
+ if (!userDataDir) {
129
+ return false;
130
+ }
131
+ const normalizedUserDataDir = path.resolve(userDataDir);
132
+ if (scopedUserDataDir && normalizedUserDataDir !== scopedUserDataDir) {
133
+ return false;
134
+ }
135
+ return isWithinRoot(normalizedUserDataDir, getProfilesDir());
136
+ }
137
+ function readCommandFlag(command, flag) {
138
+ const escapedFlag = flag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
139
+ const match = command.match(new RegExp(`${escapedFlag}=(?:"([^"]+)"|'([^']+)'|(\\S+))`));
140
+ return match?.[1] ?? match?.[2] ?? match?.[3] ?? null;
141
+ }
142
+ function isWithinRoot(candidatePath, rootPath) {
143
+ const relative = path.relative(rootPath, candidatePath);
144
+ return relative.length > 0 && !relative.startsWith(`..${path.sep}`) && relative !== '..';
145
+ }
@@ -0,0 +1,43 @@
1
+ import { type Browser, type Page } from 'playwright-core';
2
+ import type { BrowserSessionState } from './browser-session-state.js';
3
+ export declare function connectPlaywright(cdpUrl: string): Promise<Browser>;
4
+ export declare function disconnectPlaywright(browser: Browser): Promise<void>;
5
+ export declare function listPages(browser: Browser): Page[];
6
+ type LaunchPageMetadata = {
7
+ page: Page | null;
8
+ url: string;
9
+ title: string;
10
+ targetId?: string;
11
+ };
12
+ export type ResolvedCurrentPageContext = {
13
+ pageRef: string;
14
+ page: Page;
15
+ recoveredVia?: 'opener' | 'sole-live-page';
16
+ };
17
+ export declare function readLaunchPageMetadata(browser: Browser, options?: {
18
+ requestedUrl?: string;
19
+ fallbackUrl?: string;
20
+ fallbackTitle?: string;
21
+ timeoutMs?: number;
22
+ }): Promise<LaunchPageMetadata>;
23
+ export declare function syncLaunchPage(session: BrowserSessionState, browser: Browser, options?: {
24
+ requestedUrl?: string;
25
+ fallbackUrl?: string;
26
+ fallbackTitle?: string;
27
+ timeoutMs?: number;
28
+ }): Promise<{
29
+ url: string;
30
+ title: string;
31
+ targetId?: string;
32
+ }>;
33
+ export declare function resolvePageByRef(browser: Browser, session: BrowserSessionState, pageRef: string): Promise<Page>;
34
+ export declare function resolveCurrentPageContext(browser: Browser, session: BrowserSessionState): Promise<ResolvedCurrentPageContext>;
35
+ export declare function syncSessionPage(session: BrowserSessionState, pageRef: string, page: Page, options?: {
36
+ settleTimeoutMs?: number;
37
+ }): Promise<{
38
+ url: string;
39
+ title: string;
40
+ targetId?: string;
41
+ }>;
42
+ export {};
43
+ //# sourceMappingURL=playwright-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-runtime.d.ts","sourceRoot":"","sources":["../src/playwright-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,CAElD;AA8CD,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAQF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,CAAC,EAAE,QAAQ,GAAG,gBAAgB,CAAC;CAC5C,CAAC;AA4IF,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,kBAAkB,CAAC,CA+C7B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC5D;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA8Cf;AA+CD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,0BAA0B,CAAC,CAqCrC;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB5D"}
@@ -0,0 +1,339 @@
1
+ import { chromium } from 'playwright-core';
2
+ import { ensureRuntimeState } from './runtime-state.js';
3
+ import { registerPage, updatePage } from './runtime-page-state.js';
4
+ export async function connectPlaywright(cdpUrl) {
5
+ return chromium.connectOverCDP(cdpUrl);
6
+ }
7
+ export async function disconnectPlaywright(browser) {
8
+ const maybeClose = browser.close;
9
+ if (typeof maybeClose !== 'function') {
10
+ return;
11
+ }
12
+ await Promise.resolve(maybeClose.call(browser)).catch(() => undefined);
13
+ }
14
+ export function listPages(browser) {
15
+ return browser.contexts().flatMap((context) => context.pages());
16
+ }
17
+ function buildPageResolutionError(kind, pageRef) {
18
+ return new Error(`${kind === 'unknown' ? 'unknown_page_ref' : 'stale_page_ref'}:${pageRef}`);
19
+ }
20
+ function isPageResolutionError(error, kind, pageRef) {
21
+ return (error instanceof Error &&
22
+ error.message === `${kind === 'unknown' ? 'unknown_page_ref' : 'stale_page_ref'}:${pageRef}`);
23
+ }
24
+ function sleep(ms) {
25
+ return new Promise((resolve) => setTimeout(resolve, ms));
26
+ }
27
+ function normalizeComparableUrl(value) {
28
+ const raw = value?.trim();
29
+ if (!raw) {
30
+ return null;
31
+ }
32
+ try {
33
+ const url = new URL(raw);
34
+ url.hash = '';
35
+ url.search = '';
36
+ return `${url.origin}${url.pathname}`;
37
+ }
38
+ catch {
39
+ return raw;
40
+ }
41
+ }
42
+ function isMeaningfulUrl(value) {
43
+ const raw = value?.trim();
44
+ return Boolean(raw && raw !== ':' && raw !== 'about:blank');
45
+ }
46
+ function isMeaningfulTitle(value) {
47
+ return Boolean(value?.trim());
48
+ }
49
+ function preferMeaningfulValue(value, fallback, predicate) {
50
+ if (predicate(value)) {
51
+ return value ?? '';
52
+ }
53
+ if (predicate(fallback)) {
54
+ return fallback ?? '';
55
+ }
56
+ return value ?? fallback ?? '';
57
+ }
58
+ function scoreLaunchPageMetadata(metadata, options) {
59
+ const normalizedUrl = normalizeComparableUrl(metadata.url);
60
+ const requestedUrl = normalizeComparableUrl(options.requestedUrl);
61
+ const fallbackUrl = normalizeComparableUrl(options.fallbackUrl);
62
+ let score = 0;
63
+ if (requestedUrl && normalizedUrl === requestedUrl) {
64
+ score += 200;
65
+ }
66
+ else if (fallbackUrl && normalizedUrl === fallbackUrl) {
67
+ score += 180;
68
+ }
69
+ else if (isMeaningfulUrl(metadata.url)) {
70
+ score += 100;
71
+ }
72
+ if (isMeaningfulTitle(metadata.title)) {
73
+ score += 20;
74
+ }
75
+ if (metadata.targetId) {
76
+ score += 5;
77
+ }
78
+ return score;
79
+ }
80
+ async function readPageTargetId(page) {
81
+ try {
82
+ const cdp = await page.context().newCDPSession(page);
83
+ try {
84
+ const result = (await cdp.send('Target.getTargetInfo'));
85
+ return result.targetInfo?.targetId;
86
+ }
87
+ finally {
88
+ await cdp.detach().catch(() => undefined);
89
+ }
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ async function readPageMetadata(page) {
96
+ const [url, title, targetId] = await Promise.all([
97
+ Promise.resolve(page.url()),
98
+ page.title().catch(() => ''),
99
+ readPageTargetId(page),
100
+ ]);
101
+ return { page, url, title, targetId };
102
+ }
103
+ async function readSessionPageMetadata(session, pageRef, page) {
104
+ const existing = session.runtime?.pages[pageRef];
105
+ const [url, targetId, title] = await Promise.all([
106
+ Promise.resolve(page.url()),
107
+ readPageTargetId(page),
108
+ page.title().catch(() => existing?.title ?? ''),
109
+ ]);
110
+ return {
111
+ url,
112
+ title,
113
+ targetId,
114
+ };
115
+ }
116
+ async function readSettledSessionPageMetadata(session, pageRef, page, options = {}) {
117
+ const existing = session.runtime?.pages[pageRef];
118
+ const deadline = Date.now() + (options.settleTimeoutMs ?? 0);
119
+ let best = null;
120
+ while (Date.now() <= deadline) {
121
+ const metadata = await readSessionPageMetadata(session, pageRef, page);
122
+ const score = (isMeaningfulUrl(metadata.url) ? 100 : 0) +
123
+ (isMeaningfulTitle(metadata.title) ? 20 : 0) +
124
+ (metadata.targetId ? 5 : 0);
125
+ if (!best ||
126
+ score > best.score ||
127
+ (score === best.score && metadata.title.trim().length > best.title.trim().length)) {
128
+ best = { ...metadata, score };
129
+ }
130
+ if (best &&
131
+ isMeaningfulUrl(best.url) &&
132
+ (isMeaningfulTitle(best.title) || best.targetId || Date.now() >= deadline)) {
133
+ break;
134
+ }
135
+ if (Date.now() >= deadline) {
136
+ break;
137
+ }
138
+ await sleep(100);
139
+ }
140
+ const metadata = best ?? (await readSessionPageMetadata(session, pageRef, page));
141
+ return {
142
+ url: preferMeaningfulValue(metadata.url, existing?.url, isMeaningfulUrl),
143
+ title: preferMeaningfulValue(metadata.title, existing?.title, isMeaningfulTitle),
144
+ targetId: metadata.targetId ?? existing?.targetId,
145
+ };
146
+ }
147
+ export async function readLaunchPageMetadata(browser, options = {}) {
148
+ const deadline = Date.now() + (options.timeoutMs ?? 2_500);
149
+ let best = null;
150
+ while (Date.now() <= deadline) {
151
+ const pages = listPages(browser);
152
+ for (const page of pages) {
153
+ const metadata = await readPageMetadata(page);
154
+ const score = scoreLaunchPageMetadata(metadata, options);
155
+ if (!best ||
156
+ score > best.score ||
157
+ (score === best.score && metadata.title.trim().length > best.title.trim().length)) {
158
+ best = { ...metadata, score };
159
+ }
160
+ }
161
+ if (best &&
162
+ isMeaningfulUrl(best.url) &&
163
+ (isMeaningfulTitle(best.title) || Date.now() >= deadline)) {
164
+ break;
165
+ }
166
+ if (Date.now() >= deadline) {
167
+ break;
168
+ }
169
+ await sleep(100);
170
+ }
171
+ if (best) {
172
+ return {
173
+ page: best.page,
174
+ url: isMeaningfulUrl(best.url) ? best.url : (options.fallbackUrl ?? best.url),
175
+ title: isMeaningfulTitle(best.title) ? best.title : (options.fallbackTitle ?? best.title),
176
+ targetId: best.targetId,
177
+ };
178
+ }
179
+ return {
180
+ page: null,
181
+ url: options.fallbackUrl ?? '',
182
+ title: options.fallbackTitle ?? '',
183
+ };
184
+ }
185
+ export async function syncLaunchPage(session, browser, options = {}) {
186
+ const metadata = await readLaunchPageMetadata(browser, options);
187
+ if (!metadata.page) {
188
+ return {
189
+ url: metadata.url,
190
+ title: metadata.title,
191
+ targetId: metadata.targetId,
192
+ };
193
+ }
194
+ ensureRuntimeState(session);
195
+ if (session.runtime?.pages.p0) {
196
+ updatePage(session, 'p0', {
197
+ url: metadata.url,
198
+ title: metadata.title,
199
+ targetId: metadata.targetId,
200
+ });
201
+ }
202
+ else {
203
+ registerPage(session, {
204
+ pageRef: 'p0',
205
+ url: metadata.url,
206
+ title: metadata.title,
207
+ targetId: metadata.targetId,
208
+ makeCurrent: true,
209
+ });
210
+ }
211
+ return {
212
+ url: metadata.url,
213
+ title: metadata.title,
214
+ targetId: metadata.targetId,
215
+ };
216
+ }
217
+ export async function resolvePageByRef(browser, session, pageRef) {
218
+ const pages = listPages(browser);
219
+ if (pages.length === 0) {
220
+ throw new Error('no_open_pages');
221
+ }
222
+ const pageState = session.runtime?.pages[pageRef];
223
+ if (!pageState) {
224
+ throw buildPageResolutionError('unknown', pageRef);
225
+ }
226
+ if (!pageState.targetId && !pageState.url && !pageState.title) {
227
+ if (pages.length === 1) {
228
+ return pages[0];
229
+ }
230
+ throw buildPageResolutionError('stale', pageRef);
231
+ }
232
+ if (pageState.targetId) {
233
+ for (const page of pages) {
234
+ if ((await readPageTargetId(page)) === pageState.targetId) {
235
+ return page;
236
+ }
237
+ }
238
+ }
239
+ if (pageState.url && pageState.title) {
240
+ for (const page of pages) {
241
+ const liveTitle = await page.title().catch(() => '');
242
+ if (page.url() === pageState.url && liveTitle === pageState.title) {
243
+ return page;
244
+ }
245
+ }
246
+ }
247
+ if (!pageState.url) {
248
+ throw buildPageResolutionError('stale', pageRef);
249
+ }
250
+ for (const page of pages) {
251
+ if (page.url() === pageState.url) {
252
+ return page;
253
+ }
254
+ }
255
+ throw buildPageResolutionError('stale', pageRef);
256
+ }
257
+ async function findRecoverableCurrentPageRef(browser, session, stalePageRef) {
258
+ const runtimePages = session.runtime?.pages ?? {};
259
+ const stalePageState = runtimePages[stalePageRef];
260
+ const openerPageRef = stalePageState?.openerPageRef;
261
+ if (openerPageRef && openerPageRef !== stalePageRef) {
262
+ try {
263
+ await resolvePageByRef(browser, session, openerPageRef);
264
+ return {
265
+ pageRef: openerPageRef,
266
+ recoveredVia: 'opener',
267
+ };
268
+ }
269
+ catch {
270
+ // Keep recovery fail-closed unless opener or a single live alternative is provably valid.
271
+ }
272
+ }
273
+ const liveCandidateRefs = [];
274
+ for (const candidatePageRef of Object.keys(runtimePages)) {
275
+ if (candidatePageRef === stalePageRef || candidatePageRef === openerPageRef) {
276
+ continue;
277
+ }
278
+ try {
279
+ await resolvePageByRef(browser, session, candidatePageRef);
280
+ liveCandidateRefs.push(candidatePageRef);
281
+ }
282
+ catch {
283
+ // Ignore stale or unknown candidates while looking for a single surviving live page.
284
+ }
285
+ }
286
+ if (liveCandidateRefs.length === 1) {
287
+ return {
288
+ pageRef: liveCandidateRefs[0],
289
+ recoveredVia: 'sole-live-page',
290
+ };
291
+ }
292
+ return null;
293
+ }
294
+ export async function resolveCurrentPageContext(browser, session) {
295
+ const currentPageRef = session.runtime?.currentPageRef ?? 'p0';
296
+ try {
297
+ const page = await resolvePageByRef(browser, session, currentPageRef);
298
+ return {
299
+ pageRef: currentPageRef,
300
+ page,
301
+ };
302
+ }
303
+ catch (error) {
304
+ if (isPageResolutionError(error, 'unknown', currentPageRef)) {
305
+ const pages = listPages(browser);
306
+ if (pages.length === 1) {
307
+ return {
308
+ pageRef: currentPageRef,
309
+ page: pages[0],
310
+ recoveredVia: 'sole-live-page',
311
+ };
312
+ }
313
+ throw error;
314
+ }
315
+ if (!isPageResolutionError(error, 'stale', currentPageRef)) {
316
+ throw error;
317
+ }
318
+ const recovered = await findRecoverableCurrentPageRef(browser, session, currentPageRef);
319
+ if (!recovered) {
320
+ throw error;
321
+ }
322
+ return {
323
+ pageRef: recovered.pageRef,
324
+ page: await resolvePageByRef(browser, session, recovered.pageRef),
325
+ recoveredVia: recovered.recoveredVia,
326
+ };
327
+ }
328
+ }
329
+ export async function syncSessionPage(session, pageRef, page, options = {}) {
330
+ ensureRuntimeState(session);
331
+ const { url, title, targetId } = await readSettledSessionPageMetadata(session, pageRef, page, options);
332
+ if (session.runtime?.pages[pageRef]) {
333
+ updatePage(session, pageRef, { url, title, targetId });
334
+ }
335
+ else {
336
+ registerPage(session, { pageRef, url, title, targetId, makeCurrent: false });
337
+ }
338
+ return { url, title, targetId };
339
+ }
@@ -0,0 +1,22 @@
1
+ import type { BrowserSessionState } from './browser-session-state.js';
2
+ import { type ProtectedFillExecutionResult } from './secrets/protected-fill.js';
3
+ import type { PersistedFillableForm, StoredSecretFieldPolicies, StoredSecretFieldKey } from './secrets/types.js';
4
+ export type FillProtectedFormBrowserResult = {
5
+ success: true;
6
+ pageRef: string;
7
+ url: string;
8
+ title: string;
9
+ execution: ProtectedFillExecutionResult;
10
+ } | {
11
+ success: false;
12
+ error: 'browser_connection_failed' | 'page_resolution_failed';
13
+ message: string;
14
+ reason: string;
15
+ };
16
+ export declare function fillProtectedFormBrowser(params: {
17
+ session: BrowserSessionState;
18
+ fillableForm: PersistedFillableForm;
19
+ protectedValues: Partial<Record<StoredSecretFieldKey, string>>;
20
+ fieldPolicies?: StoredSecretFieldPolicies;
21
+ }): Promise<FillProtectedFormBrowserResult>;
22
+ //# sourceMappingURL=protected-fill-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-fill-browser.d.ts","sourceRoot":"","sources":["../src/protected-fill-browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,8BAA8B,GACtC;IACE,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,4BAA4B,CAAC;CACzC,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,2BAA2B,GAAG,wBAAwB,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,YAAY,EAAE,qBAAqB,CAAC;IACpC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAqD1C"}
@@ -0,0 +1,52 @@
1
+ import { connectPlaywright, disconnectPlaywright, resolvePageByRef, syncSessionPage, } from './playwright-runtime.js';
2
+ import { executeProtectedFill, } from './secrets/protected-fill.js';
3
+ export async function fillProtectedFormBrowser(params) {
4
+ let browser = null;
5
+ try {
6
+ browser = await connectPlaywright(params.session.cdpUrl);
7
+ }
8
+ catch (error) {
9
+ return {
10
+ success: false,
11
+ error: 'browser_connection_failed',
12
+ message: 'Protected fill could not connect to the browser.',
13
+ reason: error instanceof Error ? error.message : String(error),
14
+ };
15
+ }
16
+ try {
17
+ const page = await resolvePageByRef(browser, params.session, params.fillableForm.pageRef).catch((error) => {
18
+ throw new Error(error instanceof Error ? error.message : String(error));
19
+ });
20
+ const { url, title } = await syncSessionPage(params.session, params.fillableForm.pageRef, page);
21
+ const execution = await executeProtectedFill({
22
+ session: params.session,
23
+ page,
24
+ fillableForm: params.fillableForm,
25
+ protectedValues: Object.fromEntries(Object.entries(params.protectedValues).filter((entry) => {
26
+ const value = entry[1];
27
+ return typeof value === 'string' && value.length > 0;
28
+ })),
29
+ fieldPolicies: params.fieldPolicies,
30
+ });
31
+ return {
32
+ success: true,
33
+ pageRef: params.fillableForm.pageRef,
34
+ url,
35
+ title,
36
+ execution,
37
+ };
38
+ }
39
+ catch (error) {
40
+ return {
41
+ success: false,
42
+ error: 'page_resolution_failed',
43
+ message: 'Protected fill could not resolve the target page in the browser.',
44
+ reason: error instanceof Error ? error.message : String(error),
45
+ };
46
+ }
47
+ finally {
48
+ if (browser) {
49
+ await disconnectPlaywright(browser);
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,82 @@
1
+ import type { BrowserSessionState } from "./browser-session-state.js";
2
+ import type { FillableFormFieldBinding, FillableFormPresence, ProtectedBindingValueHint, ProtectedFieldPolicy, StoredSecretFieldKey, StoredSecretFieldPolicies } from "./secrets/types.js";
3
+ import type { ProtectedExactValueProfile } from "./runtime-state.js";
4
+ /** Canonical stored protected field keys supported by AgentBrowse protected fill. */
5
+ export type ProtectedFieldKey = StoredSecretFieldKey;
6
+ export type ProtectedFieldPolicyMode = ProtectedFieldPolicy;
7
+ export type ProtectedFieldPolicies = StoredSecretFieldPolicies;
8
+ export type ProtectedFieldValueHint = ProtectedBindingValueHint;
9
+ export type ProtectedFillPresence = FillableFormPresence;
10
+ export type { ProtectedExactValueProfile } from "./runtime-state.js";
11
+ /** Single field binding inside a protected fill form. */
12
+ export interface ProtectedFillFieldBinding extends FillableFormFieldBinding {
13
+ }
14
+ /** Protected fill form returned from `observe(...)` and accepted by `fillProtectedForm(...)`. */
15
+ export interface ProtectedFillForm {
16
+ fillRef: string;
17
+ pageRef: string;
18
+ scopeRef?: string;
19
+ purpose: string;
20
+ presence?: ProtectedFillPresence;
21
+ scopeEpoch?: number;
22
+ fields: ProtectedFillFieldBinding[];
23
+ observedAt: string;
24
+ }
25
+ /** Single field that AgentBrowse filled during a protected fill run. */
26
+ export interface ProtectedFilledField {
27
+ fieldKey: ProtectedFieldKey;
28
+ targetRef: string;
29
+ }
30
+ /** Field-level validation or application failure for protected fill. */
31
+ export interface ProtectedFieldError extends ProtectedFilledField {
32
+ reason: "client_validation_rejected" | "value_not_applied";
33
+ validationTextRedacted?: true;
34
+ }
35
+ export type ProtectedFillExecution = {
36
+ kind: "success";
37
+ filledFields: ProtectedFilledField[];
38
+ } | {
39
+ kind: "binding_stale";
40
+ targetRef: string;
41
+ fieldKeys: ProtectedFieldKey[];
42
+ reason: "target_missing" | "target_not_live" | "page_signature_mismatch" | "dom_signature_mismatch" | "locator_resolution_failed" | "target_blocked";
43
+ attempts: string[];
44
+ } | {
45
+ kind: "validation_failed";
46
+ filledFields: ProtectedFilledField[];
47
+ fieldErrors: ProtectedFieldError[];
48
+ } | {
49
+ kind: "unexpected_error";
50
+ reason: "missing_protected_value" | "unsupported_protected_field_group" | "deterministic_only_resolution_failed" | "assisted_value_resolution_failed" | "action_failed";
51
+ };
52
+ export type FillProtectedFormResult = {
53
+ success: true;
54
+ pageRef: string;
55
+ url: string;
56
+ title: string;
57
+ execution: ProtectedFillExecution;
58
+ } | {
59
+ success: false;
60
+ error: "browser_connection_failed" | "page_resolution_failed";
61
+ message: string;
62
+ reason: string;
63
+ };
64
+ export interface FillProtectedFormInput {
65
+ session: BrowserSessionState;
66
+ fillableForm: ProtectedFillForm;
67
+ protectedValues: Partial<Record<ProtectedFieldKey, string>>;
68
+ fieldPolicies?: ProtectedFieldPolicies;
69
+ }
70
+ export interface BuildProtectedExposureArtifactsInput {
71
+ session: BrowserSessionState;
72
+ fillableForm: ProtectedFillForm;
73
+ protectedValues: Partial<Record<ProtectedFieldKey, string>>;
74
+ fieldPolicies?: ProtectedFieldPolicies;
75
+ }
76
+ export interface ProtectedExposureArtifacts {
77
+ exactValueProfile: ProtectedExactValueProfile;
78
+ }
79
+ /** Fills a previously observed protected form with caller-provided protected values. */
80
+ export declare function fillProtectedForm(params: FillProtectedFormInput): Promise<FillProtectedFormResult>;
81
+ export declare function buildProtectedExposureArtifacts(params: BuildProtectedExposureArtifactsInput): ProtectedExposureArtifacts;
82
+ //# sourceMappingURL=protected-fill.d.ts.map