@nuanu-ai/agentbrowse 0.2.7 → 0.2.8

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 (191) hide show
  1. package/README.md +36 -8
  2. package/dist/agentpay-stagehand-llm.d.ts.map +1 -1
  3. package/dist/agentpay-stagehand-llm.js +5 -1
  4. package/dist/commands/act.d.ts +6 -2
  5. package/dist/commands/act.d.ts.map +1 -1
  6. package/dist/commands/act.js +840 -55
  7. package/dist/commands/act.test-harness.d.ts +19 -0
  8. package/dist/commands/act.test-harness.d.ts.map +1 -0
  9. package/dist/commands/act.test-harness.js +245 -0
  10. package/dist/commands/action-acceptance.d.ts +90 -0
  11. package/dist/commands/action-acceptance.d.ts.map +1 -0
  12. package/dist/commands/action-acceptance.js +1411 -0
  13. package/dist/commands/action-artifacts.d.ts +33 -0
  14. package/dist/commands/action-artifacts.d.ts.map +1 -0
  15. package/dist/commands/action-artifacts.js +104 -0
  16. package/dist/commands/action-execution-guards.d.ts +5 -0
  17. package/dist/commands/action-execution-guards.d.ts.map +1 -0
  18. package/dist/commands/action-execution-guards.js +3 -0
  19. package/dist/commands/action-executor-helpers.d.ts +21 -0
  20. package/dist/commands/action-executor-helpers.d.ts.map +1 -0
  21. package/dist/commands/action-executor-helpers.js +242 -0
  22. package/dist/commands/action-executor.d.ts +12 -0
  23. package/dist/commands/action-executor.d.ts.map +1 -0
  24. package/dist/commands/action-executor.js +45 -0
  25. package/dist/commands/action-fallbacks.d.ts +6 -0
  26. package/dist/commands/action-fallbacks.d.ts.map +1 -0
  27. package/dist/commands/action-fallbacks.js +43 -0
  28. package/dist/commands/action-value-projection.d.ts +32 -0
  29. package/dist/commands/action-value-projection.d.ts.map +1 -0
  30. package/dist/commands/action-value-projection.js +151 -0
  31. package/dist/commands/browse-actions.d.ts +4 -0
  32. package/dist/commands/browse-actions.d.ts.map +1 -0
  33. package/dist/commands/browse-actions.js +4 -0
  34. package/dist/commands/captcha-solve.d.ts.map +1 -1
  35. package/dist/commands/captcha-solve.js +13 -3
  36. package/dist/commands/click-action-executor.d.ts +10 -0
  37. package/dist/commands/click-action-executor.d.ts.map +1 -0
  38. package/dist/commands/click-action-executor.js +68 -0
  39. package/dist/commands/create-intent.d.ts +6 -0
  40. package/dist/commands/create-intent.d.ts.map +1 -0
  41. package/dist/commands/create-intent.js +75 -0
  42. package/dist/commands/datepicker-action-executor.d.ts +12 -0
  43. package/dist/commands/datepicker-action-executor.d.ts.map +1 -0
  44. package/dist/commands/datepicker-action-executor.js +218 -0
  45. package/dist/commands/descriptor-validation.d.ts +27 -0
  46. package/dist/commands/descriptor-validation.d.ts.map +1 -0
  47. package/dist/commands/descriptor-validation.js +333 -0
  48. package/dist/commands/extract-scope-resolution.d.ts +20 -0
  49. package/dist/commands/extract-scope-resolution.d.ts.map +1 -0
  50. package/dist/commands/extract-scope-resolution.js +100 -0
  51. package/dist/commands/extract-stagehand-executor.d.ts +17 -0
  52. package/dist/commands/extract-stagehand-executor.d.ts.map +1 -0
  53. package/dist/commands/extract-stagehand-executor.js +18 -0
  54. package/dist/commands/extract.d.ts +3 -2
  55. package/dist/commands/extract.d.ts.map +1 -1
  56. package/dist/commands/extract.js +256 -39
  57. package/dist/commands/fill-secret.d.ts +7 -0
  58. package/dist/commands/fill-secret.d.ts.map +1 -0
  59. package/dist/commands/fill-secret.js +371 -0
  60. package/dist/commands/get-secrets-catalog.d.ts +6 -0
  61. package/dist/commands/get-secrets-catalog.d.ts.map +1 -0
  62. package/dist/commands/get-secrets-catalog.js +23 -0
  63. package/dist/commands/launch.d.ts.map +1 -1
  64. package/dist/commands/launch.js +41 -7
  65. package/dist/commands/navigate.d.ts +2 -1
  66. package/dist/commands/navigate.d.ts.map +1 -1
  67. package/dist/commands/navigate.js +49 -12
  68. package/dist/commands/observe-inventory.d.ts +109 -0
  69. package/dist/commands/observe-inventory.d.ts.map +1 -0
  70. package/dist/commands/observe-inventory.js +2837 -0
  71. package/dist/commands/observe-persistence.d.ts +14 -0
  72. package/dist/commands/observe-persistence.d.ts.map +1 -0
  73. package/dist/commands/observe-persistence.js +170 -0
  74. package/dist/commands/observe-projection.d.ts +84 -0
  75. package/dist/commands/observe-projection.d.ts.map +1 -0
  76. package/dist/commands/observe-projection.js +140 -0
  77. package/dist/commands/observe-protected.d.ts +5 -0
  78. package/dist/commands/observe-protected.d.ts.map +1 -0
  79. package/dist/commands/observe-protected.js +18 -0
  80. package/dist/commands/observe-semantics.d.ts +10 -0
  81. package/dist/commands/observe-semantics.d.ts.map +1 -0
  82. package/dist/commands/observe-semantics.js +338 -0
  83. package/dist/commands/observe-stagehand.d.ts +48 -0
  84. package/dist/commands/observe-stagehand.d.ts.map +1 -0
  85. package/dist/commands/observe-stagehand.js +105 -0
  86. package/dist/commands/observe-surfaces.d.ts +9 -0
  87. package/dist/commands/observe-surfaces.d.ts.map +1 -0
  88. package/dist/commands/observe-surfaces.js +195 -0
  89. package/dist/commands/observe.d.ts +47 -1
  90. package/dist/commands/observe.d.ts.map +1 -1
  91. package/dist/commands/observe.js +173 -20
  92. package/dist/commands/observe.test-harness.d.ts +67 -0
  93. package/dist/commands/observe.test-harness.d.ts.map +1 -0
  94. package/dist/commands/observe.test-harness.js +107 -0
  95. package/dist/commands/poll-intent.d.ts +6 -0
  96. package/dist/commands/poll-intent.d.ts.map +1 -0
  97. package/dist/commands/poll-intent.js +57 -0
  98. package/dist/commands/screenshot.d.ts +2 -1
  99. package/dist/commands/screenshot.d.ts.map +1 -1
  100. package/dist/commands/screenshot.js +44 -12
  101. package/dist/commands/select-action-executor.d.ts +10 -0
  102. package/dist/commands/select-action-executor.d.ts.map +1 -0
  103. package/dist/commands/select-action-executor.js +91 -0
  104. package/dist/commands/semantic-observe.d.ts +24 -0
  105. package/dist/commands/semantic-observe.d.ts.map +1 -0
  106. package/dist/commands/semantic-observe.js +344 -0
  107. package/dist/commands/status.d.ts.map +1 -1
  108. package/dist/commands/status.js +75 -2
  109. package/dist/commands/structured-grid-action-executor.d.ts +3 -0
  110. package/dist/commands/structured-grid-action-executor.d.ts.map +1 -0
  111. package/dist/commands/structured-grid-action-executor.js +4 -0
  112. package/dist/commands/target-resolution.d.ts +4 -0
  113. package/dist/commands/target-resolution.d.ts.map +1 -0
  114. package/dist/commands/target-resolution.js +33 -0
  115. package/dist/commands/text-input-action-executor.d.ts +5 -0
  116. package/dist/commands/text-input-action-executor.d.ts.map +1 -0
  117. package/dist/commands/text-input-action-executor.js +116 -0
  118. package/dist/commands/user-actionable.d.ts +4 -0
  119. package/dist/commands/user-actionable.d.ts.map +1 -0
  120. package/dist/commands/user-actionable.js +95 -0
  121. package/dist/control-semantics.d.ts +29 -0
  122. package/dist/control-semantics.d.ts.map +1 -0
  123. package/dist/control-semantics.js +299 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +95 -32
  126. package/dist/output.d.ts +14 -2
  127. package/dist/output.d.ts.map +1 -1
  128. package/dist/output.js +17 -29
  129. package/dist/playwright-runtime.d.ts +35 -0
  130. package/dist/playwright-runtime.d.ts.map +1 -0
  131. package/dist/playwright-runtime.js +224 -0
  132. package/dist/runtime-resolution.d.ts +9 -0
  133. package/dist/runtime-resolution.d.ts.map +1 -0
  134. package/dist/runtime-resolution.js +19 -0
  135. package/dist/runtime-state.d.ts +217 -0
  136. package/dist/runtime-state.d.ts.map +1 -0
  137. package/dist/runtime-state.js +629 -0
  138. package/dist/secrets/backend.d.ts +32 -0
  139. package/dist/secrets/backend.d.ts.map +1 -0
  140. package/dist/secrets/backend.js +169 -0
  141. package/dist/secrets/catalog-applicability.d.ts +5 -0
  142. package/dist/secrets/catalog-applicability.d.ts.map +1 -0
  143. package/dist/secrets/catalog-applicability.js +59 -0
  144. package/dist/secrets/catalog-sync.d.ts +14 -0
  145. package/dist/secrets/catalog-sync.d.ts.map +1 -0
  146. package/dist/secrets/catalog-sync.js +35 -0
  147. package/dist/secrets/field-policy.d.ts +3 -0
  148. package/dist/secrets/field-policy.d.ts.map +1 -0
  149. package/dist/secrets/field-policy.js +3 -0
  150. package/dist/secrets/fill-ordering.d.ts +11 -0
  151. package/dist/secrets/fill-ordering.d.ts.map +1 -0
  152. package/dist/secrets/fill-ordering.js +44 -0
  153. package/dist/secrets/form-matcher.d.ts +60 -0
  154. package/dist/secrets/form-matcher.d.ts.map +1 -0
  155. package/dist/secrets/form-matcher.js +596 -0
  156. package/dist/secrets/intent-output.d.ts +11 -0
  157. package/dist/secrets/intent-output.d.ts.map +1 -0
  158. package/dist/secrets/intent-output.js +64 -0
  159. package/dist/secrets/mock-agentpay-backend.d.ts +13 -0
  160. package/dist/secrets/mock-agentpay-backend.d.ts.map +1 -0
  161. package/dist/secrets/mock-agentpay-backend.js +87 -0
  162. package/dist/secrets/mock-agentpay-cabinet.d.ts +43 -0
  163. package/dist/secrets/mock-agentpay-cabinet.d.ts.map +1 -0
  164. package/dist/secrets/mock-agentpay-cabinet.js +195 -0
  165. package/dist/secrets/protected-artifact-guard.d.ts +25 -0
  166. package/dist/secrets/protected-artifact-guard.d.ts.map +1 -0
  167. package/dist/secrets/protected-artifact-guard.js +26 -0
  168. package/dist/secrets/protected-bindings.d.ts +10 -0
  169. package/dist/secrets/protected-bindings.d.ts.map +1 -0
  170. package/dist/secrets/protected-bindings.js +17 -0
  171. package/dist/secrets/protected-field-values.d.ts +13 -0
  172. package/dist/secrets/protected-field-values.d.ts.map +1 -0
  173. package/dist/secrets/protected-field-values.js +100 -0
  174. package/dist/secrets/protected-fill.d.ts +47 -0
  175. package/dist/secrets/protected-fill.d.ts.map +1 -0
  176. package/dist/secrets/protected-fill.js +512 -0
  177. package/dist/secrets/types.d.ts +84 -0
  178. package/dist/secrets/types.d.ts.map +1 -0
  179. package/dist/secrets/types.js +27 -0
  180. package/dist/session.d.ts +22 -0
  181. package/dist/session.d.ts.map +1 -1
  182. package/dist/session.js +74 -2
  183. package/dist/solver/browser-launcher.d.ts.map +1 -1
  184. package/dist/solver/browser-launcher.js +6 -3
  185. package/dist/stagehand-runtime.d.ts +4 -0
  186. package/dist/stagehand-runtime.d.ts.map +1 -0
  187. package/dist/stagehand-runtime.js +10 -0
  188. package/dist/stagehand.d.ts +0 -5
  189. package/dist/stagehand.d.ts.map +1 -1
  190. package/dist/stagehand.js +0 -6
  191. package/package.json +5 -2
@@ -0,0 +1,19 @@
1
+ import { vi } from 'vitest';
2
+ import type { BrowseSession } from '../session.js';
3
+ type ViMock = ReturnType<typeof vi.fn>;
4
+ export declare const captureActionFailureArtifactsMock: ViMock;
5
+ export declare const connectStagehandMock: ViMock;
6
+ export declare const connectOverCDPMock: ViMock;
7
+ export declare const outputContractFailureMock: ViMock;
8
+ export declare const outputErrorMock: ViMock;
9
+ export declare const outputFailureMock: ViMock;
10
+ export declare const outputJSONMock: ViMock;
11
+ export declare const saveSessionMock: ViMock;
12
+ export declare const startActionTraceMock: ViMock;
13
+ export declare const act: typeof import("./act.js").act;
14
+ export declare function makeSession(): BrowseSession;
15
+ export declare function makeLocator(overrides?: Record<string, unknown>): any;
16
+ export declare function makeLocatorCollection(...locators: Array<ReturnType<typeof makeLocator>>): any;
17
+ export declare function installActTestHooks(): void;
18
+ export {};
19
+ //# sourceMappingURL=act.test-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act.test-harness.d.ts","sourceRoot":"","sources":["../../src/commands/act.test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,EAAE,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AA6BvC,eAAO,MAAM,iCAAiC,EAAE,MAAgD,CAAC;AACjG,eAAO,MAAM,oBAAoB,EAAE,MAAmC,CAAC;AACvE,eAAO,MAAM,kBAAkB,EAAE,MAAiC,CAAC;AACnE,eAAO,MAAM,yBAAyB,EAAE,MAAwC,CAAC;AACjF,eAAO,MAAM,eAAe,EAAE,MAA8B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,EAAE,MAAgC,CAAC;AACjE,eAAO,MAAM,cAAc,EAAE,MAA6B,CAAC;AAC3D,eAAO,MAAM,eAAe,EAAE,MAA8B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,EAAE,MAAmC,CAAC;AAgCvE,eAAO,MAAQ,GAAG,+BAA6B,CAAC;AAEhD,wBAAgB,WAAW,IAAI,aAAa,CAW3C;AAED,wBAAgB,WAAW,CAAC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,GAAG,CA0JxE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,GAAG,GAAG,CAM7F;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAqB1C"}
@@ -0,0 +1,245 @@
1
+ import { afterEach, beforeEach, vi } from 'vitest';
2
+ import { registerPage } from '../runtime-state.js';
3
+ const mocks = vi.hoisted(() => ({
4
+ captureActionFailureArtifactsMock: vi.fn(async () => ({
5
+ dir: '/tmp/agentbrowse-artifacts/act-test',
6
+ screenshotPath: '/tmp/agentbrowse-artifacts/act-test/page.png',
7
+ htmlPath: '/tmp/agentbrowse-artifacts/act-test/page.html',
8
+ tracePath: '/tmp/agentbrowse-artifacts/act-test/trace.zip',
9
+ actionLogPath: '/tmp/agentbrowse-artifacts/act-test/action-log.json',
10
+ })),
11
+ connectStagehandMock: vi.fn(),
12
+ connectOverCDPMock: vi.fn(),
13
+ outputContractFailureMock: vi.fn((payload) => {
14
+ throw new Error(`outputContractFailure:${JSON.stringify(payload)}`);
15
+ }),
16
+ outputErrorMock: vi.fn((message) => {
17
+ throw new Error(message);
18
+ }),
19
+ outputFailureMock: vi.fn((result) => {
20
+ throw new Error(result.error);
21
+ }),
22
+ outputJSONMock: vi.fn(),
23
+ saveSessionMock: vi.fn(),
24
+ startActionTraceMock: vi.fn(async () => ({
25
+ finishSuccess: async () => { },
26
+ finishFailure: async () => '/tmp/agentbrowse-artifacts/act-test/trace.zip',
27
+ })),
28
+ }));
29
+ export const captureActionFailureArtifactsMock = mocks.captureActionFailureArtifactsMock;
30
+ export const connectStagehandMock = mocks.connectStagehandMock;
31
+ export const connectOverCDPMock = mocks.connectOverCDPMock;
32
+ export const outputContractFailureMock = mocks.outputContractFailureMock;
33
+ export const outputErrorMock = mocks.outputErrorMock;
34
+ export const outputFailureMock = mocks.outputFailureMock;
35
+ export const outputJSONMock = mocks.outputJSONMock;
36
+ export const saveSessionMock = mocks.saveSessionMock;
37
+ export const startActionTraceMock = mocks.startActionTraceMock;
38
+ vi.mock('playwright-core', () => ({
39
+ chromium: {
40
+ connectOverCDP: connectOverCDPMock,
41
+ },
42
+ }));
43
+ vi.mock('../output.js', () => ({
44
+ outputContractFailure: outputContractFailureMock,
45
+ outputError: outputErrorMock,
46
+ outputFailure: outputFailureMock,
47
+ outputJSON: outputJSONMock,
48
+ }));
49
+ vi.mock('../stagehand.js', () => ({
50
+ connectStagehand: connectStagehandMock,
51
+ }));
52
+ vi.mock('./action-artifacts.js', () => ({
53
+ captureActionFailureArtifacts: captureActionFailureArtifactsMock,
54
+ startActionTrace: startActionTraceMock,
55
+ }));
56
+ vi.mock('../session.js', async () => {
57
+ const actual = await vi.importActual('../session.js');
58
+ return {
59
+ ...actual,
60
+ saveSession: saveSessionMock,
61
+ };
62
+ });
63
+ export const { act } = await import('./act.js');
64
+ export function makeSession() {
65
+ const session = {
66
+ cdpUrl: 'ws://localhost:9222/devtools/browser/test',
67
+ pid: 1,
68
+ launchedAt: new Date(0).toISOString(),
69
+ };
70
+ registerPage(session, {
71
+ pageRef: 'p0',
72
+ makeCurrent: true,
73
+ });
74
+ return session;
75
+ }
76
+ export function makeLocator(overrides = {}) {
77
+ const { click: clickOverride, evaluate: evaluateOverride, fill: fillOverride, inputValue: inputValueOverride, innerText: innerTextOverride, locator: locatorOverride, press: pressOverride, pressSequentially: pressSequentiallyOverride, selectOption: selectOptionOverride, textContent: textContentOverride, ...restOverrides } = overrides;
78
+ let contextText = 'target context';
79
+ let currentValueInitialized = false;
80
+ let currentValue = '';
81
+ const ensureCurrentValue = async () => {
82
+ if (currentValueInitialized) {
83
+ return currentValue;
84
+ }
85
+ currentValueInitialized = true;
86
+ if (typeof inputValueOverride === 'function') {
87
+ currentValue = (await inputValueOverride()) ?? '';
88
+ }
89
+ else if (typeof inputValueOverride === 'string') {
90
+ currentValue = inputValueOverride;
91
+ }
92
+ return currentValue;
93
+ };
94
+ const locator = {
95
+ boundingBox: vi.fn(async () => null),
96
+ click: vi.fn(async (...args) => {
97
+ if (typeof clickOverride === 'function') {
98
+ const result = await clickOverride(...args);
99
+ contextText = 'target context clicked';
100
+ return result;
101
+ }
102
+ contextText = 'target context clicked';
103
+ }),
104
+ count: vi.fn(async () => 1),
105
+ fill: vi.fn(async (value) => {
106
+ await ensureCurrentValue();
107
+ if (typeof fillOverride === 'function') {
108
+ const result = await fillOverride(value);
109
+ currentValue = value;
110
+ contextText = value;
111
+ return result;
112
+ }
113
+ currentValue = value;
114
+ contextText = value;
115
+ }),
116
+ evaluate: vi.fn(async (fn, value) => {
117
+ if (typeof evaluateOverride === 'function') {
118
+ const result = await evaluateOverride(fn, value);
119
+ if (typeof value === 'string') {
120
+ currentValue = value;
121
+ currentValueInitialized = true;
122
+ contextText = value;
123
+ }
124
+ return result;
125
+ }
126
+ if (typeof value === 'string') {
127
+ currentValue = value;
128
+ currentValueInitialized = true;
129
+ contextText = value;
130
+ }
131
+ }),
132
+ getAttribute: vi.fn(async (_name) => null),
133
+ getByRole: vi.fn(),
134
+ getByText: vi.fn(),
135
+ inputValue: vi.fn(async () => ensureCurrentValue()),
136
+ innerText: vi.fn(async () => typeof innerTextOverride === 'function'
137
+ ? await innerTextOverride()
138
+ : (await ensureCurrentValue()) || contextText),
139
+ isChecked: vi.fn(async () => false),
140
+ locator: vi.fn(),
141
+ scrollIntoViewIfNeeded: vi.fn(async () => { }),
142
+ selectText: vi.fn(async () => { }),
143
+ pressSequentially: vi.fn(async (value) => {
144
+ await ensureCurrentValue();
145
+ if (typeof pressSequentiallyOverride === 'function') {
146
+ const result = await pressSequentiallyOverride(value);
147
+ currentValue = value;
148
+ currentValueInitialized = true;
149
+ contextText = value;
150
+ return result;
151
+ }
152
+ currentValue = value;
153
+ currentValueInitialized = true;
154
+ contextText = value;
155
+ }),
156
+ selectOption: vi.fn(async (value) => {
157
+ await ensureCurrentValue();
158
+ if (typeof selectOptionOverride === 'function') {
159
+ const result = await selectOptionOverride(value);
160
+ currentValue = value;
161
+ currentValueInitialized = true;
162
+ contextText = value;
163
+ return result;
164
+ }
165
+ currentValue = value;
166
+ currentValueInitialized = true;
167
+ contextText = value;
168
+ }),
169
+ press: vi.fn(async (value) => {
170
+ await ensureCurrentValue();
171
+ if (typeof pressOverride === 'function') {
172
+ const result = await pressOverride(value);
173
+ if (value === 'Backspace') {
174
+ currentValue = '';
175
+ }
176
+ return result;
177
+ }
178
+ if (value === 'Backspace') {
179
+ currentValue = '';
180
+ }
181
+ }),
182
+ blur: vi.fn(async () => { }),
183
+ dispatchEvent: vi.fn(async () => { }),
184
+ isEditable: vi.fn(async () => true),
185
+ isVisible: vi.fn(async () => true),
186
+ first: vi.fn(),
187
+ nth: vi.fn(),
188
+ textContent: vi.fn(async () => typeof textContentOverride === 'function'
189
+ ? await textContentOverride()
190
+ : (await ensureCurrentValue()) || contextText),
191
+ ...restOverrides,
192
+ };
193
+ const locatorImpl = typeof locatorOverride === 'function'
194
+ ? (...args) => locatorOverride(...args)
195
+ : () => locator;
196
+ locator.first.mockReturnValue(locator);
197
+ locator.nth.mockReturnValue(locator);
198
+ if (!locator.locator.mock?.calls) {
199
+ locator.locator = vi.fn(locatorImpl);
200
+ }
201
+ else {
202
+ locator.locator.mockImplementation(locatorImpl);
203
+ }
204
+ if (!locator.getByRole.mock?.calls) {
205
+ locator.getByRole = vi.fn(() => locator);
206
+ }
207
+ else {
208
+ locator.getByRole.mockReturnValue(locator);
209
+ }
210
+ if (!locator.getByText.mock?.calls) {
211
+ locator.getByText = vi.fn(() => locator);
212
+ }
213
+ else {
214
+ locator.getByText.mockReturnValue(locator);
215
+ }
216
+ return locator;
217
+ }
218
+ export function makeLocatorCollection(...locators) {
219
+ return {
220
+ count: vi.fn(async () => locators.length),
221
+ first: vi.fn(() => locators[0] ?? makeLocator()),
222
+ nth: vi.fn((index) => locators[index] ?? makeLocator()),
223
+ };
224
+ }
225
+ export function installActTestHooks() {
226
+ beforeEach(() => {
227
+ vi.useRealTimers();
228
+ connectOverCDPMock.mockReset();
229
+ connectStagehandMock.mockReset();
230
+ captureActionFailureArtifactsMock.mockClear();
231
+ outputContractFailureMock.mockReset();
232
+ outputContractFailureMock.mockImplementation((payload) => {
233
+ throw new Error(`outputContractFailure:${JSON.stringify(payload)}`);
234
+ });
235
+ outputErrorMock.mockClear();
236
+ outputFailureMock.mockClear();
237
+ outputJSONMock.mockClear();
238
+ saveSessionMock.mockReset();
239
+ startActionTraceMock.mockClear();
240
+ });
241
+ afterEach(() => {
242
+ vi.useRealTimers();
243
+ vi.restoreAllMocks();
244
+ });
245
+ }
@@ -0,0 +1,90 @@
1
+ import type { Locator, Page } from 'playwright-core';
2
+ import type { BrowseSession } from '../session.js';
3
+ import { getTarget } from '../runtime-state.js';
4
+ import type { SurfaceDescriptor, TargetDescriptor } from '../runtime-state.js';
5
+ import { type ComparableValueType } from '../control-semantics.js';
6
+ import type { BrowseAction } from './browse-actions.js';
7
+ export type PageObservation = {
8
+ url: string;
9
+ title: string;
10
+ contentHash: string | null;
11
+ structureHash: string | null;
12
+ submitSignalHash: string | null;
13
+ };
14
+ type TargetStateKey = 'selected' | 'checked' | 'expanded' | 'pressed' | 'current' | 'focused';
15
+ type LocatorStateObservation = Partial<Record<TargetStateKey, string | boolean>>;
16
+ export type AcceptanceProbe = {
17
+ policy: NonNullable<TargetDescriptor['acceptancePolicy']>;
18
+ page: Page;
19
+ target: TargetDescriptor;
20
+ action: BrowseAction;
21
+ surface: SurfaceDescriptor | null;
22
+ ownerTarget: TargetDescriptor | null;
23
+ ownerSurface: SurfaceDescriptor | null;
24
+ beforePage: PageObservation | null;
25
+ beforeLocator: LocatorStateObservation | null;
26
+ beforeContextHash: string | null;
27
+ beforeReadLocator: LocatorStateObservation | null;
28
+ beforeReadContextHash: string | null;
29
+ trackedStateKeys: TargetStateKey[];
30
+ locator: Locator;
31
+ readLocator: Locator;
32
+ readLocators: Locator[];
33
+ surfaceLocator: Locator | null;
34
+ expectedValue: string | null;
35
+ beforeValue: string | null;
36
+ comparableValueType?: ComparableValueType;
37
+ ownerLocator: Locator | null;
38
+ beforeOwnerValue: string | null;
39
+ beforeSurfaceContextHash: string | null;
40
+ };
41
+ export type AcceptanceProbeResult = {
42
+ accepted: boolean;
43
+ afterPageObservation: PageObservation | null;
44
+ polls: number;
45
+ };
46
+ export type NoObservableProgressDiagnosis = {
47
+ kind: 'validation-blocked' | 'overlay-blocked' | 'target-blocked' | 'site-noop';
48
+ messages: string[];
49
+ invalidFields: string[];
50
+ blockingOverlays: string[];
51
+ targetState?: {
52
+ disabled?: boolean;
53
+ ariaDisabled?: boolean;
54
+ readonly?: boolean;
55
+ centerHitSelf?: boolean;
56
+ };
57
+ };
58
+ export declare function rankLocatorCandidates(candidates: ReadonlyArray<NonNullable<ReturnType<typeof getTarget>>['locatorCandidates'][number]>, action: BrowseAction): import("../runtime-state.js").LocatorCandidate[];
59
+ export declare function shouldVerifyObservableProgress(target: TargetDescriptor, action: BrowseAction): boolean;
60
+ export declare function capturePageObservation(page: Page): Promise<PageObservation>;
61
+ export declare function captureLocatorContextHash(locator: Locator): Promise<string | null>;
62
+ declare function comparableValueTypeForTarget(target: TargetDescriptor): ComparableValueType | undefined;
63
+ declare function normalizeComparableValue(value: string | null, comparableValueType?: ComparableValueType): string;
64
+ declare function valuesMatchExpected(expected: string | null, actual: string | null, comparableValueType?: ComparableValueType): boolean;
65
+ export declare const __testComparableValues: {
66
+ comparableValueTypeForTarget: typeof comparableValueTypeForTarget;
67
+ normalizeComparableValue: typeof normalizeComparableValue;
68
+ valuesMatchExpected: typeof valuesMatchExpected;
69
+ };
70
+ export declare function captureLocatorState(locator: Locator, keys: ReadonlyArray<TargetStateKey>): Promise<LocatorStateObservation | null>;
71
+ export declare function locatorStateChanged(before: LocatorStateObservation | null, after: LocatorStateObservation | null): boolean;
72
+ export declare function pageObservationChanged(before: PageObservation | null, after: PageObservation | null): boolean;
73
+ export declare function submitObservationChanged(before: PageObservation | null, after: PageObservation | null): boolean;
74
+ export declare function diagnoseNoObservableProgress(page: Page, locator: Locator): Promise<NoObservableProgressDiagnosis | null>;
75
+ export declare function createAcceptanceProbe(args: {
76
+ session: BrowseSession;
77
+ page: Page;
78
+ target: TargetDescriptor;
79
+ action: BrowseAction;
80
+ actionValue: string | undefined;
81
+ locator: Locator;
82
+ beforePageObservation: PageObservation | null;
83
+ }): Promise<AcceptanceProbe | null>;
84
+ export declare function evaluateAcceptanceProbe(probe: AcceptanceProbe, afterPageObservation: PageObservation | null): Promise<boolean>;
85
+ export declare function waitForAcceptanceProbe(probe: AcceptanceProbe, options?: {
86
+ timeoutMs?: number;
87
+ intervalMs?: number;
88
+ }): Promise<AcceptanceProbeResult>;
89
+ export {};
90
+ //# sourceMappingURL=action-acceptance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"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"}