@nuanu-ai/agentbrowse 0.2.47 → 0.2.49
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.
- package/README.md +81 -10
- package/dist/agentpay-gateway.d.ts +9 -0
- package/dist/agentpay-gateway.d.ts.map +1 -1
- package/dist/agentpay-gateway.js +31 -1
- package/dist/agentpay-stagehand-llm.d.ts.map +1 -1
- package/dist/agentpay-stagehand-llm.js +9 -1
- package/dist/command-api-tracing.d.ts +19 -0
- package/dist/command-api-tracing.d.ts.map +1 -0
- package/dist/command-api-tracing.js +137 -0
- package/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +822 -670
- package/dist/commands/act.test-harness.d.ts +6 -0
- package/dist/commands/act.test-harness.d.ts.map +1 -1
- package/dist/commands/act.test-harness.js +44 -1
- package/dist/commands/action-acceptance.d.ts.map +1 -1
- package/dist/commands/action-acceptance.js +115 -0
- package/dist/commands/captcha-solve.d.ts.map +1 -1
- package/dist/commands/captcha-solve.js +83 -16
- package/dist/commands/click-action-executor.d.ts +0 -1
- package/dist/commands/click-action-executor.d.ts.map +1 -1
- package/dist/commands/click-action-executor.js +31 -77
- package/dist/commands/close.d.ts +3 -3
- package/dist/commands/close.d.ts.map +1 -1
- package/dist/commands/close.js +178 -0
- package/dist/commands/descriptor-validation.d.ts.map +1 -1
- package/dist/commands/descriptor-validation.js +75 -57
- package/dist/commands/end-session.d.ts +25 -0
- package/dist/commands/end-session.d.ts.map +1 -0
- package/dist/commands/end-session.js +161 -0
- package/dist/commands/extract-stagehand-executor.js +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +339 -202
- package/dist/commands/fill-secret.d.ts +3 -3
- package/dist/commands/fill-secret.d.ts.map +1 -1
- package/dist/commands/fill-secret.js +419 -234
- package/dist/commands/get-secrets-catalog.d.ts.map +1 -1
- package/dist/commands/get-secrets-catalog.js +66 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -3
- package/dist/commands/interaction-kernel.d.ts +46 -0
- package/dist/commands/interaction-kernel.d.ts.map +1 -0
- package/dist/commands/interaction-kernel.js +215 -0
- package/dist/commands/launch.d.ts +1 -3
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +115 -27
- package/dist/commands/navigate.d.ts.map +1 -1
- package/dist/commands/navigate.js +188 -45
- package/dist/commands/observe-accessibility.d.ts.map +1 -1
- package/dist/commands/observe-accessibility.js +46 -39
- package/dist/commands/observe-dom-label-contract.d.ts.map +1 -1
- package/dist/commands/observe-dom-label-contract.js +5 -0
- package/dist/commands/observe-inventory.d.ts +13 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +320 -65
- package/dist/commands/observe-persistence.d.ts.map +1 -1
- package/dist/commands/observe-persistence.js +3 -0
- package/dist/commands/observe-projection.d.ts +1 -0
- package/dist/commands/observe-projection.d.ts.map +1 -1
- package/dist/commands/observe-projection.js +7 -2
- package/dist/commands/observe-protected.d.ts +1 -0
- package/dist/commands/observe-protected.d.ts.map +1 -1
- package/dist/commands/observe-protected.js +9 -4
- package/dist/commands/observe-semantics.d.ts.map +1 -1
- package/dist/commands/observe-semantics.js +5 -2
- package/dist/commands/observe-stagehand.d.ts +1 -0
- package/dist/commands/observe-stagehand.d.ts.map +1 -1
- package/dist/commands/observe-stagehand.js +2 -0
- package/dist/commands/observe.d.ts +2 -0
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +387 -203
- package/dist/commands/observe.test-harness.d.ts +8 -0
- package/dist/commands/observe.test-harness.d.ts.map +1 -1
- package/dist/commands/observe.test-harness.js +48 -1
- package/dist/commands/poll-secret.d.ts +6 -0
- package/dist/commands/poll-secret.d.ts.map +1 -0
- package/dist/commands/poll-secret.js +159 -0
- package/dist/commands/request-secret.d.ts +6 -0
- package/dist/commands/request-secret.d.ts.map +1 -0
- package/dist/commands/request-secret.js +284 -0
- package/dist/commands/screenshot.d.ts.map +1 -1
- package/dist/commands/screenshot.js +172 -7
- package/dist/commands/select-action-executor.d.ts.map +1 -1
- package/dist/commands/semantic-observe.d.ts +4 -0
- package/dist/commands/semantic-observe.d.ts.map +1 -1
- package/dist/commands/semantic-observe.js +388 -17
- package/dist/commands/start-session.d.ts +31 -0
- package/dist/commands/start-session.d.ts.map +1 -0
- package/dist/commands/start-session.js +347 -0
- package/dist/commands/status.d.ts +2 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +166 -144
- package/dist/control-semantics.d.ts +1 -0
- package/dist/control-semantics.d.ts.map +1 -1
- package/dist/control-semantics.js +51 -9
- package/dist/generated/build-config.d.ts +2 -0
- package/dist/generated/build-config.d.ts.map +1 -0
- package/dist/generated/build-config.js +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +163 -63
- package/dist/otel-exporter.d.ts +58 -0
- package/dist/otel-exporter.d.ts.map +1 -0
- package/dist/otel-exporter.js +263 -0
- package/dist/otel-projector.d.ts +75 -0
- package/dist/otel-projector.d.ts.map +1 -0
- package/dist/otel-projector.js +409 -0
- package/dist/owned-browser.d.ts +1 -1
- package/dist/owned-browser.d.ts.map +1 -1
- package/dist/owned-browser.js +13 -1
- package/dist/owned-process.d.ts +2 -0
- package/dist/owned-process.d.ts.map +1 -1
- package/dist/owned-process.js +7 -3
- package/dist/playwright-runtime.d.ts +1 -1
- package/dist/playwright-runtime.d.ts.map +1 -1
- package/dist/playwright-runtime.js +8 -8
- package/dist/run-observability.d.ts +25 -0
- package/dist/run-observability.d.ts.map +1 -0
- package/dist/run-observability.js +115 -0
- package/dist/run-store.d.ts +274 -0
- package/dist/run-store.d.ts.map +1 -0
- package/dist/run-store.js +631 -0
- package/dist/runtime-metrics.d.ts +27 -0
- package/dist/runtime-metrics.d.ts.map +1 -0
- package/dist/runtime-metrics.js +66 -0
- package/dist/runtime-page-state.d.ts +11 -0
- package/dist/runtime-page-state.d.ts.map +1 -0
- package/dist/runtime-page-state.js +62 -0
- package/dist/runtime-protected-state.d.ts +16 -0
- package/dist/runtime-protected-state.d.ts.map +1 -0
- package/dist/runtime-protected-state.js +157 -0
- package/dist/runtime-state.d.ts +10 -44
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +57 -222
- package/dist/secrets/backend.d.ts +65 -16
- package/dist/secrets/backend.d.ts.map +1 -1
- package/dist/secrets/backend.js +135 -95
- package/dist/secrets/catalog-sync.d.ts.map +1 -1
- package/dist/secrets/catalog-sync.js +4 -1
- package/dist/secrets/form-matcher.d.ts +5 -5
- package/dist/secrets/form-matcher.d.ts.map +1 -1
- package/dist/secrets/form-matcher.js +292 -164
- package/dist/secrets/intent-output.d.ts +6 -10
- package/dist/secrets/intent-output.d.ts.map +1 -1
- package/dist/secrets/intent-output.js +4 -58
- package/dist/secrets/mock-agentpay-cabinet.d.ts +38 -27
- package/dist/secrets/mock-agentpay-cabinet.d.ts.map +1 -1
- package/dist/secrets/mock-agentpay-cabinet.js +177 -111
- package/dist/secrets/protected-artifact-guard.d.ts +2 -2
- package/dist/secrets/protected-artifact-guard.d.ts.map +1 -1
- package/dist/secrets/protected-artifact-guard.js +2 -2
- package/dist/secrets/protected-bindings.d.ts +1 -1
- package/dist/secrets/protected-bindings.d.ts.map +1 -1
- package/dist/secrets/protected-bindings.js +6 -0
- package/dist/secrets/protected-field-semantics.d.ts +9 -0
- package/dist/secrets/protected-field-semantics.d.ts.map +1 -0
- package/dist/secrets/protected-field-semantics.js +154 -0
- package/dist/secrets/protected-field-values.d.ts.map +1 -1
- package/dist/secrets/protected-field-values.js +3 -3
- package/dist/secrets/protected-fill.d.ts +1 -1
- package/dist/secrets/protected-fill.d.ts.map +1 -1
- package/dist/secrets/protected-fill.js +45 -149
- package/dist/secrets/protected-value-adapters.d.ts +2 -1
- package/dist/secrets/protected-value-adapters.d.ts.map +1 -1
- package/dist/secrets/protected-value-adapters.js +80 -1
- package/dist/secrets/request-output.d.ts +11 -0
- package/dist/secrets/request-output.d.ts.map +1 -0
- package/dist/secrets/request-output.js +75 -0
- package/dist/secrets/types.d.ts +15 -9
- package/dist/secrets/types.d.ts.map +1 -1
- package/dist/secrets/types.js +3 -0
- package/dist/session-event-exporter.d.ts +36 -0
- package/dist/session-event-exporter.d.ts.map +1 -0
- package/dist/session-event-exporter.js +428 -0
- package/dist/session.d.ts +16 -7
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +150 -23
- package/dist/sessions-backend.d.ts +354 -0
- package/dist/sessions-backend.d.ts.map +1 -0
- package/dist/sessions-backend.js +126 -0
- package/dist/solver/browser-launcher.d.ts +1 -1
- package/dist/solver/browser-launcher.d.ts.map +1 -1
- package/dist/solver/browser-launcher.js +39 -13
- package/dist/solver/captcha-solver.d.ts.map +1 -1
- package/dist/solver/captcha-solver.js +8 -1
- package/dist/solver/config.d.ts +0 -1
- package/dist/solver/config.d.ts.map +1 -1
- package/dist/solver/config.js +0 -22
- package/dist/solver/types.d.ts +1 -0
- package/dist/solver/types.d.ts.map +1 -1
- package/dist/workflow-session-completion.d.ts +33 -0
- package/dist/workflow-session-completion.d.ts.map +1 -0
- package/dist/workflow-session-completion.js +156 -0
- package/package.json +11 -1
- package/dist/commands/create-intent.d.ts +0 -6
- package/dist/commands/create-intent.d.ts.map +0 -1
- package/dist/commands/create-intent.js +0 -75
- package/dist/commands/poll-intent.d.ts +0 -6
- package/dist/commands/poll-intent.d.ts.map +0 -1
- package/dist/commands/poll-intent.js +0 -57
package/dist/index.js
CHANGED
|
@@ -7,22 +7,24 @@ import { preflightAgentpayGateway } from './agentpay-gateway.js';
|
|
|
7
7
|
import { browseCommand, browseCommandName } from './command-name.js';
|
|
8
8
|
import { assertSemanticObserveRuntimeSupport } from './commands/semantic-observe-lexical.js';
|
|
9
9
|
import { loadSession } from './session.js';
|
|
10
|
-
import { outputError, outputJSON, fatal, info } from './output.js';
|
|
11
|
-
import { applyDemoProxyBootstrap } from './solver/config.js';
|
|
10
|
+
import { outputContractFailure, outputError, outputJSON, fatal, info } from './output.js';
|
|
12
11
|
function usageText() {
|
|
13
12
|
return `Usage: ${browseCommandName()} <command> [args] [options]
|
|
14
13
|
|
|
15
14
|
Commands:
|
|
16
15
|
init <apiKey> [--api-url <url>] Configure AgentPay gateway access for AgentBrowse
|
|
17
16
|
launch [url] [options] Launch browser, optionally navigate to URL
|
|
17
|
+
start-session [name] [--merchant-name <name>]
|
|
18
|
+
Start workflow session and telemetry on the current browser
|
|
19
|
+
end-session Complete the active workflow session without closing the browser
|
|
18
20
|
solve-captcha [--timeout <s>] Wait for captcha and solve it on current page
|
|
19
21
|
navigate <url> Navigate current tab to URL
|
|
20
22
|
get-secrets-catalog [url] Refresh stored-secret metadata for a URL or current page
|
|
21
|
-
|
|
22
|
-
Create or reuse
|
|
23
|
-
poll-
|
|
24
|
-
fill-secret <fillRef> <
|
|
25
|
-
|
|
23
|
+
request-secret <fillRef> <storedSecretRef> --merchant-name <name>
|
|
24
|
+
Create or reuse a session-bound secret request for one fill target
|
|
25
|
+
poll-secret <requestId> Poll one secret request state without blocking
|
|
26
|
+
fill-secret <fillRef> <requestId>
|
|
27
|
+
Claim an approved secret request and fill protected fields
|
|
26
28
|
act <targetRef> <action> [value] Perform action on a previously observed target
|
|
27
29
|
extract '<schema-json>' [scopeRef] Extract structured data from the page or a stored scope
|
|
28
30
|
observe ["<goal>"] Discover available targets/elements
|
|
@@ -34,12 +36,12 @@ Options:
|
|
|
34
36
|
--compact Launch browser in compact window size (1280x900, default)
|
|
35
37
|
--full Launch browser in full-size window
|
|
36
38
|
--profile <name> Solver profile name for launch (default: "default")
|
|
37
|
-
--proxy
|
|
38
|
-
--proxyless Ignore configured/profile proxy for this run only
|
|
39
|
+
--proxy [url] Launch through configured proxy, or use one-off override URL
|
|
39
40
|
--headful Explicit alias for headful browser mode (default)
|
|
40
41
|
--headless Launch browser in headless mode
|
|
41
42
|
--path <file> Output path for screenshot
|
|
42
43
|
--timeout <seconds> Timeout for solve-captcha command (default: 90)
|
|
44
|
+
--merchant-name <name> Merchant/vendor name for start-session or request-secret
|
|
43
45
|
--help Show this help message
|
|
44
46
|
|
|
45
47
|
Environment:
|
|
@@ -48,11 +50,13 @@ Environment:
|
|
|
48
50
|
}
|
|
49
51
|
const KNOWN_COMMANDS = new Set([
|
|
50
52
|
'launch',
|
|
53
|
+
'start-session',
|
|
54
|
+
'end-session',
|
|
51
55
|
'init',
|
|
52
56
|
'navigate',
|
|
53
57
|
'get-secrets-catalog',
|
|
54
|
-
'
|
|
55
|
-
'poll-
|
|
58
|
+
'request-secret',
|
|
59
|
+
'poll-secret',
|
|
56
60
|
'fill-secret',
|
|
57
61
|
'solve-captcha',
|
|
58
62
|
'act',
|
|
@@ -117,8 +121,8 @@ function parseLaunchArgs(args) {
|
|
|
117
121
|
let compact = true;
|
|
118
122
|
let profile;
|
|
119
123
|
let headless = false;
|
|
124
|
+
let useProxy = false;
|
|
120
125
|
let proxy;
|
|
121
|
-
let noProxy = false;
|
|
122
126
|
for (let i = 0; i < args.length; i++) {
|
|
123
127
|
const arg = args[i];
|
|
124
128
|
if (arg === '--headless') {
|
|
@@ -140,36 +144,40 @@ function parseLaunchArgs(args) {
|
|
|
140
144
|
if (arg === '--profile') {
|
|
141
145
|
const value = args[i + 1];
|
|
142
146
|
if (!value || value.startsWith('--')) {
|
|
143
|
-
outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy
|
|
147
|
+
outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy [url]]', '[--headful|--headless]')}`);
|
|
144
148
|
}
|
|
145
149
|
profile = value;
|
|
146
150
|
i += 1;
|
|
147
151
|
continue;
|
|
148
152
|
}
|
|
149
|
-
if (arg
|
|
150
|
-
const value =
|
|
151
|
-
if (!value
|
|
152
|
-
outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy
|
|
153
|
+
if (arg.startsWith('--proxy=')) {
|
|
154
|
+
const value = arg.slice('--proxy='.length).trim();
|
|
155
|
+
if (!value) {
|
|
156
|
+
outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy [url]]', '[--headful|--headless]')}`);
|
|
153
157
|
}
|
|
158
|
+
useProxy = true;
|
|
154
159
|
proxy = value;
|
|
155
|
-
noProxy = false;
|
|
156
|
-
i += 1;
|
|
157
160
|
continue;
|
|
158
161
|
}
|
|
159
|
-
if (arg === '--
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
if (arg === '--proxy') {
|
|
163
|
+
useProxy = true;
|
|
164
|
+
const value = args[i + 1];
|
|
165
|
+
const trailingPositionals = args.slice(i + 1).filter((entry) => !entry.startsWith('--'));
|
|
166
|
+
if (value && !value.startsWith('--') && (url || trailingPositionals.length > 1)) {
|
|
167
|
+
proxy = value;
|
|
168
|
+
i += 1;
|
|
169
|
+
}
|
|
162
170
|
continue;
|
|
163
171
|
}
|
|
164
172
|
if (arg.startsWith('--')) {
|
|
165
173
|
outputError(`Unknown launch option: ${arg}`);
|
|
166
174
|
}
|
|
167
175
|
if (url) {
|
|
168
|
-
outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy
|
|
176
|
+
outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy [url]]', '[--headful|--headless]')}`);
|
|
169
177
|
}
|
|
170
178
|
url = arg;
|
|
171
179
|
}
|
|
172
|
-
return { url, compact, profile, headless,
|
|
180
|
+
return { url, compact, profile, headless, useProxy, proxy };
|
|
173
181
|
}
|
|
174
182
|
function parseCaptchaTimeout(args) {
|
|
175
183
|
const timeoutRaw = getFlag(args, '--timeout');
|
|
@@ -201,22 +209,98 @@ function parseInitArgs(args) {
|
|
|
201
209
|
apiUrl,
|
|
202
210
|
};
|
|
203
211
|
}
|
|
212
|
+
function parseStartSessionArgs(args) {
|
|
213
|
+
const nameParts = [];
|
|
214
|
+
let merchantName;
|
|
215
|
+
for (let i = 0; i < args.length; i++) {
|
|
216
|
+
const arg = args[i];
|
|
217
|
+
if (arg === '--merchant-name') {
|
|
218
|
+
const value = args[i + 1];
|
|
219
|
+
if (!value || value.startsWith('--')) {
|
|
220
|
+
outputError(`Usage: ${browseCommand('start-session', '[name]', '[--merchant-name <name>]')}`);
|
|
221
|
+
}
|
|
222
|
+
merchantName = value;
|
|
223
|
+
i += 1;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (arg.startsWith('--')) {
|
|
227
|
+
outputError(`Usage: ${browseCommand('start-session', '[name]', '[--merchant-name <name>]')}`);
|
|
228
|
+
}
|
|
229
|
+
nameParts.push(arg);
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
name: nameParts.join(' ').trim() || undefined,
|
|
233
|
+
merchantName,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function parseRequestSecretArgs(args) {
|
|
237
|
+
const positionals = [];
|
|
238
|
+
let merchantName;
|
|
239
|
+
for (let i = 0; i < args.length; i++) {
|
|
240
|
+
const arg = args[i];
|
|
241
|
+
if (arg === '--merchant-name') {
|
|
242
|
+
const value = args[i + 1];
|
|
243
|
+
if (!value || value.startsWith('--')) {
|
|
244
|
+
outputError(`Usage: ${browseCommand('request-secret', '<fillRef>', '<storedSecretRef>', '--merchant-name <name>')}`);
|
|
245
|
+
}
|
|
246
|
+
merchantName = value.trim();
|
|
247
|
+
i += 1;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (arg.startsWith('--')) {
|
|
251
|
+
outputError(`Usage: ${browseCommand('request-secret', '<fillRef>', '<storedSecretRef>', '--merchant-name <name>')}`);
|
|
252
|
+
}
|
|
253
|
+
positionals.push(arg);
|
|
254
|
+
}
|
|
255
|
+
if (merchantName !== undefined && merchantName.length === 0) {
|
|
256
|
+
outputError('Invalid --merchant-name value. Expected a non-empty string.');
|
|
257
|
+
}
|
|
258
|
+
if (positionals.length !== 2) {
|
|
259
|
+
outputError(`Usage: ${browseCommand('request-secret', '<fillRef>', '<storedSecretRef>', '--merchant-name <name>')}`);
|
|
260
|
+
}
|
|
261
|
+
if (!merchantName) {
|
|
262
|
+
outputError(`The \`request-secret\` command requires \`--merchant-name <name>\` so the operator sees which vendor requested the secret.`);
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
fillRef: positionals[0],
|
|
266
|
+
storedSecretRef: positionals[1],
|
|
267
|
+
merchantName,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
204
270
|
/** Require an active browser session. */
|
|
205
|
-
function
|
|
271
|
+
function requireBrowserSessionRecord(command) {
|
|
206
272
|
const session = loadSession();
|
|
207
|
-
if (session)
|
|
273
|
+
if (session) {
|
|
208
274
|
return session;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
275
|
+
}
|
|
276
|
+
return outputContractFailure({
|
|
277
|
+
error: 'workflow_session_required',
|
|
278
|
+
outcomeType: 'blocked',
|
|
279
|
+
message: `The \`${command}\` command requires an active product workflow session.`,
|
|
280
|
+
reason: `No persisted browser session was found. Run \`${browseCommandName()} launch [url]\` first, then \`${browseCommandName()} start-session\`.`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
function requireProductSessionRecord(command) {
|
|
284
|
+
const session = requireBrowserSessionRecord(command);
|
|
285
|
+
if (session.intentSessionId && session.activeRunId) {
|
|
286
|
+
return session;
|
|
287
|
+
}
|
|
288
|
+
if (!session.intentSessionId) {
|
|
289
|
+
return outputContractFailure({
|
|
290
|
+
error: 'workflow_session_required',
|
|
291
|
+
outcomeType: 'blocked',
|
|
292
|
+
message: `The \`${command}\` command requires an active product workflow session.`,
|
|
293
|
+
reason: `A browser session is loaded, but no product workflow session is active for it. Run \`${browseCommandName()} start-session\` first.`,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return outputContractFailure({
|
|
297
|
+
error: 'workflow_session_required',
|
|
298
|
+
outcomeType: 'blocked',
|
|
299
|
+
message: `The \`${command}\` command requires an active product workflow session.`,
|
|
300
|
+
reason: `The current product workflow session is missing its local run binding. Run \`${browseCommandName()} start-session\` again to re-bind the current browser session.`,
|
|
301
|
+
});
|
|
217
302
|
}
|
|
218
303
|
async function main(argv = process.argv) {
|
|
219
|
-
applyDemoProxyBootstrap();
|
|
220
304
|
const parsed = getCommand(argv);
|
|
221
305
|
if (!parsed)
|
|
222
306
|
process.exit(1);
|
|
@@ -254,63 +338,77 @@ async function main(argv = process.argv) {
|
|
|
254
338
|
compact: launchArgs.compact,
|
|
255
339
|
profile: launchArgs.profile,
|
|
256
340
|
headless: launchArgs.headless,
|
|
341
|
+
useProxy: launchArgs.useProxy,
|
|
257
342
|
proxy: launchArgs.proxy,
|
|
258
|
-
noProxy: launchArgs.noProxy,
|
|
259
343
|
});
|
|
260
|
-
const updateNotice = await
|
|
344
|
+
const updateNotice = await Promise.race([
|
|
345
|
+
updateNoticePromise,
|
|
346
|
+
new Promise((resolve) => {
|
|
347
|
+
queueMicrotask(() => resolve(null));
|
|
348
|
+
}),
|
|
349
|
+
]);
|
|
261
350
|
if (updateNotice) {
|
|
262
351
|
info(updateNotice.message);
|
|
263
352
|
}
|
|
264
353
|
outputJSON(launchResult);
|
|
265
354
|
break;
|
|
266
355
|
}
|
|
356
|
+
case 'start-session': {
|
|
357
|
+
const startSessionArgs = parseStartSessionArgs(args);
|
|
358
|
+
const { startSession } = await import('./commands/start-session.js');
|
|
359
|
+
outputJSON(await startSession(startSessionArgs.name, {
|
|
360
|
+
merchantName: startSessionArgs.merchantName,
|
|
361
|
+
}));
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
case 'end-session': {
|
|
365
|
+
const { endSession } = await import('./commands/end-session.js');
|
|
366
|
+
outputJSON(await endSession(requireProductSessionRecord(command)));
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
267
369
|
case 'navigate': {
|
|
268
370
|
const url = getPositional(args);
|
|
269
371
|
if (!url)
|
|
270
372
|
outputError(`Usage: ${browseCommand('navigate', '<url>')}`);
|
|
271
373
|
const { navigate } = await import('./commands/navigate.js');
|
|
272
|
-
await navigate(
|
|
374
|
+
await navigate(requireProductSessionRecord(command), url);
|
|
273
375
|
break;
|
|
274
376
|
}
|
|
275
377
|
case 'get-secrets-catalog': {
|
|
276
378
|
const url = getPositional(args);
|
|
277
379
|
const { getSecretsCatalog } = await import('./commands/get-secrets-catalog.js');
|
|
278
|
-
await getSecretsCatalog(
|
|
380
|
+
await getSecretsCatalog(requireProductSessionRecord(command), url);
|
|
279
381
|
break;
|
|
280
382
|
}
|
|
281
|
-
case '
|
|
282
|
-
const
|
|
283
|
-
const
|
|
284
|
-
|
|
285
|
-
outputError(`Usage: ${browseCommand('create-intent', '<fillRef>', '<storedSecretRef>')}`);
|
|
286
|
-
}
|
|
287
|
-
const { createIntent } = await import('./commands/create-intent.js');
|
|
288
|
-
await createIntent(requireSessionRecord(), fillRef, storedSecretRef);
|
|
383
|
+
case 'request-secret': {
|
|
384
|
+
const requestSecretArgs = parseRequestSecretArgs(args);
|
|
385
|
+
const { requestSecret } = await import('./commands/request-secret.js');
|
|
386
|
+
await requestSecret(requireProductSessionRecord(command), requestSecretArgs.fillRef, requestSecretArgs.storedSecretRef, requestSecretArgs.merchantName);
|
|
289
387
|
break;
|
|
290
388
|
}
|
|
291
|
-
case 'poll-
|
|
292
|
-
const
|
|
293
|
-
if (!
|
|
294
|
-
outputError(`Usage: ${browseCommand('poll-
|
|
389
|
+
case 'poll-secret': {
|
|
390
|
+
const requestId = getPositional(args);
|
|
391
|
+
if (!requestId) {
|
|
392
|
+
outputError(`Usage: ${browseCommand('poll-secret', '<requestId>')}`);
|
|
295
393
|
}
|
|
296
|
-
const {
|
|
297
|
-
await
|
|
394
|
+
const { pollSecret } = await import('./commands/poll-secret.js');
|
|
395
|
+
await pollSecret(requireProductSessionRecord(command), requestId);
|
|
298
396
|
break;
|
|
299
397
|
}
|
|
300
398
|
case 'fill-secret': {
|
|
301
399
|
const positionals = getPositionals(args);
|
|
302
|
-
const [fillRef,
|
|
303
|
-
if (!fillRef || !
|
|
304
|
-
outputError(`Usage: ${browseCommand('fill-secret', '<fillRef>', '<
|
|
400
|
+
const [fillRef, requestId] = positionals;
|
|
401
|
+
if (!fillRef || !requestId) {
|
|
402
|
+
outputError(`Usage: ${browseCommand('fill-secret', '<fillRef>', '<requestId>')}`);
|
|
305
403
|
}
|
|
306
404
|
const { fillSecret } = await import('./commands/fill-secret.js');
|
|
307
|
-
await fillSecret(
|
|
405
|
+
await fillSecret(requireProductSessionRecord(command), fillRef, requestId);
|
|
308
406
|
break;
|
|
309
407
|
}
|
|
310
408
|
case 'solve-captcha': {
|
|
311
409
|
const timeout = parseCaptchaTimeout(args);
|
|
312
410
|
const { captchaSolve } = await import('./commands/captcha-solve.js');
|
|
313
|
-
await captchaSolve(
|
|
411
|
+
await captchaSolve(requireProductSessionRecord(command), timeout);
|
|
314
412
|
break;
|
|
315
413
|
}
|
|
316
414
|
case 'act': {
|
|
@@ -323,7 +421,8 @@ async function main(argv = process.argv) {
|
|
|
323
421
|
if (!isBrowseAction(action)) {
|
|
324
422
|
outputError(`Unsupported act action: ${action}. Expected one of: click, fill, type, select, press.`);
|
|
325
423
|
}
|
|
326
|
-
|
|
424
|
+
const session = requireProductSessionRecord(command);
|
|
425
|
+
await act(session, targetRef, action, valueParts.length > 0 ? valueParts.join(' ') : undefined);
|
|
327
426
|
break;
|
|
328
427
|
}
|
|
329
428
|
case 'extract': {
|
|
@@ -333,13 +432,13 @@ async function main(argv = process.argv) {
|
|
|
333
432
|
outputError(`Usage: ${browseCommand('extract', "'<schema-json>'", '[scopeRef]')}`);
|
|
334
433
|
}
|
|
335
434
|
const { extract } = await import('./commands/extract.js');
|
|
336
|
-
await extract(
|
|
435
|
+
await extract(requireProductSessionRecord(command), schemaJson, scopeRef);
|
|
337
436
|
break;
|
|
338
437
|
}
|
|
339
438
|
case 'observe': {
|
|
340
439
|
const instruction = getPositional(args);
|
|
341
440
|
const { observe } = await import('./commands/observe.js');
|
|
342
|
-
await observe(
|
|
441
|
+
await observe(requireProductSessionRecord(command), instruction);
|
|
343
442
|
break;
|
|
344
443
|
}
|
|
345
444
|
case 'screenshot': {
|
|
@@ -349,12 +448,13 @@ async function main(argv = process.argv) {
|
|
|
349
448
|
}
|
|
350
449
|
const filePath = getFlag(args, '--path');
|
|
351
450
|
const { screenshot } = await import('./commands/screenshot.js');
|
|
352
|
-
await screenshot(
|
|
451
|
+
await screenshot(requireProductSessionRecord(command), filePath);
|
|
353
452
|
break;
|
|
354
453
|
}
|
|
355
454
|
case 'status': {
|
|
455
|
+
requireProductSessionRecord(command);
|
|
356
456
|
const { status } = await import('./commands/status.js');
|
|
357
|
-
await status();
|
|
457
|
+
outputJSON(await status());
|
|
358
458
|
break;
|
|
359
459
|
}
|
|
360
460
|
case 'close': {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type OtlpTraceRequest } from './otel-projector.js';
|
|
2
|
+
export type OtlpHttpJsonExporterConfig = {
|
|
3
|
+
tracesEndpoint: string;
|
|
4
|
+
headers: Record<string, string>;
|
|
5
|
+
timeoutMs: number;
|
|
6
|
+
protocol: 'http/json';
|
|
7
|
+
};
|
|
8
|
+
export type ExportStepTraceResult = {
|
|
9
|
+
attempted: false;
|
|
10
|
+
reason: 'config_missing' | 'run_missing' | 'step_missing' | 'unsupported_protocol';
|
|
11
|
+
} | {
|
|
12
|
+
attempted: true;
|
|
13
|
+
success: true;
|
|
14
|
+
status: number;
|
|
15
|
+
payload: OtlpTraceRequest;
|
|
16
|
+
} | {
|
|
17
|
+
attempted: true;
|
|
18
|
+
success: false;
|
|
19
|
+
status?: number;
|
|
20
|
+
reason: string;
|
|
21
|
+
payload: OtlpTraceRequest;
|
|
22
|
+
};
|
|
23
|
+
export type ExportRunRootTraceResult = {
|
|
24
|
+
attempted: false;
|
|
25
|
+
reason: 'config_missing' | 'run_missing';
|
|
26
|
+
} | {
|
|
27
|
+
attempted: true;
|
|
28
|
+
success: true;
|
|
29
|
+
status: number;
|
|
30
|
+
payload: OtlpTraceRequest;
|
|
31
|
+
} | {
|
|
32
|
+
attempted: true;
|
|
33
|
+
success: false;
|
|
34
|
+
status?: number;
|
|
35
|
+
reason: string;
|
|
36
|
+
payload: OtlpTraceRequest;
|
|
37
|
+
};
|
|
38
|
+
export declare function loadOtlpHttpJsonExporterConfig(env?: NodeJS.ProcessEnv): OtlpHttpJsonExporterConfig | null;
|
|
39
|
+
export declare function exportRunStepToOtlpHttpJson(params?: {
|
|
40
|
+
runId: string;
|
|
41
|
+
stepId: string;
|
|
42
|
+
config?: OtlpHttpJsonExporterConfig | null;
|
|
43
|
+
fetchImpl?: typeof fetch;
|
|
44
|
+
}): Promise<ExportStepTraceResult>;
|
|
45
|
+
export declare function buildRunStepOtlpTraceRequest(runId: string, stepId: string): OtlpTraceRequest | null;
|
|
46
|
+
export declare function exportRunRootToOtlpHttpJson(params?: {
|
|
47
|
+
runId: string;
|
|
48
|
+
config?: OtlpHttpJsonExporterConfig | null;
|
|
49
|
+
fetchImpl?: typeof fetch;
|
|
50
|
+
}): Promise<ExportRunRootTraceResult>;
|
|
51
|
+
export declare function buildRunRootOtlpTraceRequest(runId: string): OtlpTraceRequest | null;
|
|
52
|
+
export declare function exportRunStepToOtlpHttpJsonBestEffort(runId: string | undefined, stepId: string | undefined, options?: {
|
|
53
|
+
fetchImpl?: typeof fetch;
|
|
54
|
+
}): Promise<ExportStepTraceResult>;
|
|
55
|
+
export declare function exportRunRootToOtlpHttpJsonBestEffort(runId: string | undefined, options?: {
|
|
56
|
+
fetchImpl?: typeof fetch;
|
|
57
|
+
}): Promise<ExportRunRootTraceResult>;
|
|
58
|
+
//# sourceMappingURL=otel-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-exporter.d.ts","sourceRoot":"","sources":["../src/otel-exporter.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAS7B,MAAM,MAAM,0BAA0B,GAAG;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,sBAAsB,CAAC;CACpF,GACD;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;CAC3B,GACD;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,wBAAwB,GAChC;IACE,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAAC;CAC1C,GACD;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;CAC3B,GACD;IACE,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AA4DN,wBAAgB,8BAA8B,CAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,0BAA0B,GAAG,IAAI,CAsCnC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,GAAE;IACN,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAI1B,GACA,OAAO,CAAC,qBAAqB,CAAC,CAgFhC;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,gBAAgB,GAAG,IAAI,CAyBzB;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,GAAE;IACN,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAG1B,GACA,OAAO,CAAC,wBAAwB,CAAC,CAkDnC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOnF;AAED,wBAAsB,qCAAqC,CACzD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB,GACL,OAAO,CAAC,qBAAqB,CAAC,CAUhC;AAED,wBAAsB,qCAAqC,CACzD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB,GACL,OAAO,CAAC,wBAAwB,CAAC,CASnC"}
|