@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.
Files changed (198) hide show
  1. package/README.md +81 -10
  2. package/dist/agentpay-gateway.d.ts +9 -0
  3. package/dist/agentpay-gateway.d.ts.map +1 -1
  4. package/dist/agentpay-gateway.js +31 -1
  5. package/dist/agentpay-stagehand-llm.d.ts.map +1 -1
  6. package/dist/agentpay-stagehand-llm.js +9 -1
  7. package/dist/command-api-tracing.d.ts +19 -0
  8. package/dist/command-api-tracing.d.ts.map +1 -0
  9. package/dist/command-api-tracing.js +137 -0
  10. package/dist/commands/act.d.ts.map +1 -1
  11. package/dist/commands/act.js +822 -670
  12. package/dist/commands/act.test-harness.d.ts +6 -0
  13. package/dist/commands/act.test-harness.d.ts.map +1 -1
  14. package/dist/commands/act.test-harness.js +44 -1
  15. package/dist/commands/action-acceptance.d.ts.map +1 -1
  16. package/dist/commands/action-acceptance.js +115 -0
  17. package/dist/commands/captcha-solve.d.ts.map +1 -1
  18. package/dist/commands/captcha-solve.js +83 -16
  19. package/dist/commands/click-action-executor.d.ts +0 -1
  20. package/dist/commands/click-action-executor.d.ts.map +1 -1
  21. package/dist/commands/click-action-executor.js +31 -77
  22. package/dist/commands/close.d.ts +3 -3
  23. package/dist/commands/close.d.ts.map +1 -1
  24. package/dist/commands/close.js +178 -0
  25. package/dist/commands/descriptor-validation.d.ts.map +1 -1
  26. package/dist/commands/descriptor-validation.js +75 -57
  27. package/dist/commands/end-session.d.ts +25 -0
  28. package/dist/commands/end-session.d.ts.map +1 -0
  29. package/dist/commands/end-session.js +161 -0
  30. package/dist/commands/extract-stagehand-executor.js +1 -1
  31. package/dist/commands/extract.d.ts.map +1 -1
  32. package/dist/commands/extract.js +339 -202
  33. package/dist/commands/fill-secret.d.ts +3 -3
  34. package/dist/commands/fill-secret.d.ts.map +1 -1
  35. package/dist/commands/fill-secret.js +419 -234
  36. package/dist/commands/get-secrets-catalog.d.ts.map +1 -1
  37. package/dist/commands/get-secrets-catalog.js +66 -5
  38. package/dist/commands/init.d.ts.map +1 -1
  39. package/dist/commands/init.js +6 -3
  40. package/dist/commands/interaction-kernel.d.ts +46 -0
  41. package/dist/commands/interaction-kernel.d.ts.map +1 -0
  42. package/dist/commands/interaction-kernel.js +215 -0
  43. package/dist/commands/launch.d.ts +1 -3
  44. package/dist/commands/launch.d.ts.map +1 -1
  45. package/dist/commands/launch.js +115 -27
  46. package/dist/commands/navigate.d.ts.map +1 -1
  47. package/dist/commands/navigate.js +188 -45
  48. package/dist/commands/observe-accessibility.d.ts.map +1 -1
  49. package/dist/commands/observe-accessibility.js +46 -39
  50. package/dist/commands/observe-dom-label-contract.d.ts.map +1 -1
  51. package/dist/commands/observe-dom-label-contract.js +5 -0
  52. package/dist/commands/observe-inventory.d.ts +13 -0
  53. package/dist/commands/observe-inventory.d.ts.map +1 -1
  54. package/dist/commands/observe-inventory.js +320 -65
  55. package/dist/commands/observe-persistence.d.ts.map +1 -1
  56. package/dist/commands/observe-persistence.js +3 -0
  57. package/dist/commands/observe-projection.d.ts +1 -0
  58. package/dist/commands/observe-projection.d.ts.map +1 -1
  59. package/dist/commands/observe-projection.js +7 -2
  60. package/dist/commands/observe-protected.d.ts +1 -0
  61. package/dist/commands/observe-protected.d.ts.map +1 -1
  62. package/dist/commands/observe-protected.js +9 -4
  63. package/dist/commands/observe-semantics.d.ts.map +1 -1
  64. package/dist/commands/observe-semantics.js +5 -2
  65. package/dist/commands/observe-stagehand.d.ts +1 -0
  66. package/dist/commands/observe-stagehand.d.ts.map +1 -1
  67. package/dist/commands/observe-stagehand.js +2 -0
  68. package/dist/commands/observe.d.ts +2 -0
  69. package/dist/commands/observe.d.ts.map +1 -1
  70. package/dist/commands/observe.js +387 -203
  71. package/dist/commands/observe.test-harness.d.ts +8 -0
  72. package/dist/commands/observe.test-harness.d.ts.map +1 -1
  73. package/dist/commands/observe.test-harness.js +48 -1
  74. package/dist/commands/poll-secret.d.ts +6 -0
  75. package/dist/commands/poll-secret.d.ts.map +1 -0
  76. package/dist/commands/poll-secret.js +159 -0
  77. package/dist/commands/request-secret.d.ts +6 -0
  78. package/dist/commands/request-secret.d.ts.map +1 -0
  79. package/dist/commands/request-secret.js +284 -0
  80. package/dist/commands/screenshot.d.ts.map +1 -1
  81. package/dist/commands/screenshot.js +172 -7
  82. package/dist/commands/select-action-executor.d.ts.map +1 -1
  83. package/dist/commands/semantic-observe.d.ts +4 -0
  84. package/dist/commands/semantic-observe.d.ts.map +1 -1
  85. package/dist/commands/semantic-observe.js +388 -17
  86. package/dist/commands/start-session.d.ts +31 -0
  87. package/dist/commands/start-session.d.ts.map +1 -0
  88. package/dist/commands/start-session.js +347 -0
  89. package/dist/commands/status.d.ts +2 -1
  90. package/dist/commands/status.d.ts.map +1 -1
  91. package/dist/commands/status.js +166 -144
  92. package/dist/control-semantics.d.ts +1 -0
  93. package/dist/control-semantics.d.ts.map +1 -1
  94. package/dist/control-semantics.js +51 -9
  95. package/dist/generated/build-config.d.ts +2 -0
  96. package/dist/generated/build-config.d.ts.map +1 -0
  97. package/dist/generated/build-config.js +2 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +163 -63
  100. package/dist/otel-exporter.d.ts +58 -0
  101. package/dist/otel-exporter.d.ts.map +1 -0
  102. package/dist/otel-exporter.js +263 -0
  103. package/dist/otel-projector.d.ts +75 -0
  104. package/dist/otel-projector.d.ts.map +1 -0
  105. package/dist/otel-projector.js +409 -0
  106. package/dist/owned-browser.d.ts +1 -1
  107. package/dist/owned-browser.d.ts.map +1 -1
  108. package/dist/owned-browser.js +13 -1
  109. package/dist/owned-process.d.ts +2 -0
  110. package/dist/owned-process.d.ts.map +1 -1
  111. package/dist/owned-process.js +7 -3
  112. package/dist/playwright-runtime.d.ts +1 -1
  113. package/dist/playwright-runtime.d.ts.map +1 -1
  114. package/dist/playwright-runtime.js +8 -8
  115. package/dist/run-observability.d.ts +25 -0
  116. package/dist/run-observability.d.ts.map +1 -0
  117. package/dist/run-observability.js +115 -0
  118. package/dist/run-store.d.ts +274 -0
  119. package/dist/run-store.d.ts.map +1 -0
  120. package/dist/run-store.js +631 -0
  121. package/dist/runtime-metrics.d.ts +27 -0
  122. package/dist/runtime-metrics.d.ts.map +1 -0
  123. package/dist/runtime-metrics.js +66 -0
  124. package/dist/runtime-page-state.d.ts +11 -0
  125. package/dist/runtime-page-state.d.ts.map +1 -0
  126. package/dist/runtime-page-state.js +62 -0
  127. package/dist/runtime-protected-state.d.ts +16 -0
  128. package/dist/runtime-protected-state.d.ts.map +1 -0
  129. package/dist/runtime-protected-state.js +157 -0
  130. package/dist/runtime-state.d.ts +10 -44
  131. package/dist/runtime-state.d.ts.map +1 -1
  132. package/dist/runtime-state.js +57 -222
  133. package/dist/secrets/backend.d.ts +65 -16
  134. package/dist/secrets/backend.d.ts.map +1 -1
  135. package/dist/secrets/backend.js +135 -95
  136. package/dist/secrets/catalog-sync.d.ts.map +1 -1
  137. package/dist/secrets/catalog-sync.js +4 -1
  138. package/dist/secrets/form-matcher.d.ts +5 -5
  139. package/dist/secrets/form-matcher.d.ts.map +1 -1
  140. package/dist/secrets/form-matcher.js +292 -164
  141. package/dist/secrets/intent-output.d.ts +6 -10
  142. package/dist/secrets/intent-output.d.ts.map +1 -1
  143. package/dist/secrets/intent-output.js +4 -58
  144. package/dist/secrets/mock-agentpay-cabinet.d.ts +38 -27
  145. package/dist/secrets/mock-agentpay-cabinet.d.ts.map +1 -1
  146. package/dist/secrets/mock-agentpay-cabinet.js +177 -111
  147. package/dist/secrets/protected-artifact-guard.d.ts +2 -2
  148. package/dist/secrets/protected-artifact-guard.d.ts.map +1 -1
  149. package/dist/secrets/protected-artifact-guard.js +2 -2
  150. package/dist/secrets/protected-bindings.d.ts +1 -1
  151. package/dist/secrets/protected-bindings.d.ts.map +1 -1
  152. package/dist/secrets/protected-bindings.js +6 -0
  153. package/dist/secrets/protected-field-semantics.d.ts +9 -0
  154. package/dist/secrets/protected-field-semantics.d.ts.map +1 -0
  155. package/dist/secrets/protected-field-semantics.js +154 -0
  156. package/dist/secrets/protected-field-values.d.ts.map +1 -1
  157. package/dist/secrets/protected-field-values.js +3 -3
  158. package/dist/secrets/protected-fill.d.ts +1 -1
  159. package/dist/secrets/protected-fill.d.ts.map +1 -1
  160. package/dist/secrets/protected-fill.js +45 -149
  161. package/dist/secrets/protected-value-adapters.d.ts +2 -1
  162. package/dist/secrets/protected-value-adapters.d.ts.map +1 -1
  163. package/dist/secrets/protected-value-adapters.js +80 -1
  164. package/dist/secrets/request-output.d.ts +11 -0
  165. package/dist/secrets/request-output.d.ts.map +1 -0
  166. package/dist/secrets/request-output.js +75 -0
  167. package/dist/secrets/types.d.ts +15 -9
  168. package/dist/secrets/types.d.ts.map +1 -1
  169. package/dist/secrets/types.js +3 -0
  170. package/dist/session-event-exporter.d.ts +36 -0
  171. package/dist/session-event-exporter.d.ts.map +1 -0
  172. package/dist/session-event-exporter.js +428 -0
  173. package/dist/session.d.ts +16 -7
  174. package/dist/session.d.ts.map +1 -1
  175. package/dist/session.js +150 -23
  176. package/dist/sessions-backend.d.ts +354 -0
  177. package/dist/sessions-backend.d.ts.map +1 -0
  178. package/dist/sessions-backend.js +126 -0
  179. package/dist/solver/browser-launcher.d.ts +1 -1
  180. package/dist/solver/browser-launcher.d.ts.map +1 -1
  181. package/dist/solver/browser-launcher.js +39 -13
  182. package/dist/solver/captcha-solver.d.ts.map +1 -1
  183. package/dist/solver/captcha-solver.js +8 -1
  184. package/dist/solver/config.d.ts +0 -1
  185. package/dist/solver/config.d.ts.map +1 -1
  186. package/dist/solver/config.js +0 -22
  187. package/dist/solver/types.d.ts +1 -0
  188. package/dist/solver/types.d.ts.map +1 -1
  189. package/dist/workflow-session-completion.d.ts +33 -0
  190. package/dist/workflow-session-completion.d.ts.map +1 -0
  191. package/dist/workflow-session-completion.js +156 -0
  192. package/package.json +11 -1
  193. package/dist/commands/create-intent.d.ts +0 -6
  194. package/dist/commands/create-intent.d.ts.map +0 -1
  195. package/dist/commands/create-intent.js +0 -75
  196. package/dist/commands/poll-intent.d.ts +0 -6
  197. package/dist/commands/poll-intent.d.ts.map +0 -1
  198. 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
- create-intent <fillRef> <storedSecretRef>
22
- Create or reuse an intent for one stored secret fill
23
- poll-intent <intentId> Poll stored-secret intent status
24
- fill-secret <fillRef> <intentId>
25
- Fill protected fields from the one-time delivered secret payload
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 <url> Launch browser through proxy for this run only
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
- 'create-intent',
55
- 'poll-intent',
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 <url>|--proxyless]', '[--headful|--headless]')}`);
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 === '--proxy') {
150
- const value = args[i + 1];
151
- if (!value || value.startsWith('--')) {
152
- outputError(`Usage: ${browseCommand('launch', '[url]', '[--profile <name>]', '[--proxy <url>|--proxyless]', '[--headful|--headless]')}`);
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 === '--proxyless') {
160
- proxy = undefined;
161
- noProxy = true;
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 <url>|--proxyless]', '[--headful|--headless]')}`);
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, proxy, noProxy };
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 requireSessionRecord() {
271
+ function requireBrowserSessionRecord(command) {
206
272
  const session = loadSession();
207
- if (session)
273
+ if (session) {
208
274
  return session;
209
- // Fallback: try CDP on port 9222 directly
210
- // (Chrome may have been launched by agentpay-cli or externally)
211
- // Caller will handle connection errors. Runtime state starts empty.
212
- return {
213
- cdpUrl: 'ws://localhost:9222',
214
- pid: process.pid,
215
- launchedAt: new Date().toISOString(),
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 updateNoticePromise;
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(requireSessionRecord(), url);
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(requireSessionRecord(), url);
380
+ await getSecretsCatalog(requireProductSessionRecord(command), url);
279
381
  break;
280
382
  }
281
- case 'create-intent': {
282
- const positionals = getPositionals(args);
283
- const [fillRef, storedSecretRef] = positionals;
284
- if (!fillRef || !storedSecretRef) {
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-intent': {
292
- const intentId = getPositional(args);
293
- if (!intentId) {
294
- outputError(`Usage: ${browseCommand('poll-intent', '<intentId>')}`);
389
+ case 'poll-secret': {
390
+ const requestId = getPositional(args);
391
+ if (!requestId) {
392
+ outputError(`Usage: ${browseCommand('poll-secret', '<requestId>')}`);
295
393
  }
296
- const { pollIntent } = await import('./commands/poll-intent.js');
297
- await pollIntent(requireSessionRecord(), intentId);
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, intentId] = positionals;
303
- if (!fillRef || !intentId) {
304
- outputError(`Usage: ${browseCommand('fill-secret', '<fillRef>', '<intentId>')}`);
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(requireSessionRecord(), fillRef, intentId);
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(loadSession(), timeout);
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
- await act(requireSessionRecord(), targetRef, action, valueParts.length > 0 ? valueParts.join(' ') : undefined);
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(requireSessionRecord(), schemaJson, scopeRef);
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(requireSessionRecord(), instruction);
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(requireSessionRecord(), filePath);
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"}