@mercuryo-ai/magicpay-cli 0.1.0

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 (144) hide show
  1. package/README.md +56 -0
  2. package/dist/agentbrowse-assistive.d.ts +2 -0
  3. package/dist/agentbrowse-assistive.d.ts.map +1 -0
  4. package/dist/agentbrowse-assistive.js +66 -0
  5. package/dist/assistive-llm-client.d.ts +13 -0
  6. package/dist/assistive-llm-client.d.ts.map +1 -0
  7. package/dist/assistive-llm-client.js +152 -0
  8. package/dist/browser-bridge/act.d.ts +5 -0
  9. package/dist/browser-bridge/act.d.ts.map +1 -0
  10. package/dist/browser-bridge/act.js +8 -0
  11. package/dist/browser-bridge/observe.d.ts +5 -0
  12. package/dist/browser-bridge/observe.d.ts.map +1 -0
  13. package/dist/browser-bridge/observe.js +53 -0
  14. package/dist/browser-home.d.ts +7 -0
  15. package/dist/browser-home.d.ts.map +1 -0
  16. package/dist/browser-home.js +34 -0
  17. package/dist/commands/act.d.ts +5 -0
  18. package/dist/commands/act.d.ts.map +1 -0
  19. package/dist/commands/act.js +8 -0
  20. package/dist/commands/attach.d.ts +4 -0
  21. package/dist/commands/attach.d.ts.map +1 -0
  22. package/dist/commands/attach.js +10 -0
  23. package/dist/commands/browser-status.d.ts +5 -0
  24. package/dist/commands/browser-status.d.ts.map +1 -0
  25. package/dist/commands/browser-status.js +5 -0
  26. package/dist/commands/close.d.ts +4 -0
  27. package/dist/commands/close.d.ts.map +1 -0
  28. package/dist/commands/close.js +11 -0
  29. package/dist/commands/end-session.d.ts +22 -0
  30. package/dist/commands/end-session.d.ts.map +1 -0
  31. package/dist/commands/end-session.js +104 -0
  32. package/dist/commands/extract.d.ts +4 -0
  33. package/dist/commands/extract.d.ts.map +1 -0
  34. package/dist/commands/extract.js +14 -0
  35. package/dist/commands/fill-secret.d.ts +10 -0
  36. package/dist/commands/fill-secret.d.ts.map +1 -0
  37. package/dist/commands/fill-secret.js +483 -0
  38. package/dist/commands/find-form.d.ts +57 -0
  39. package/dist/commands/find-form.d.ts.map +1 -0
  40. package/dist/commands/find-form.js +138 -0
  41. package/dist/commands/get-secrets-catalog.d.ts +13 -0
  42. package/dist/commands/get-secrets-catalog.d.ts.map +1 -0
  43. package/dist/commands/get-secrets-catalog.js +103 -0
  44. package/dist/commands/init.d.ts +10 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +28 -0
  47. package/dist/commands/launch.d.ts +4 -0
  48. package/dist/commands/launch.d.ts.map +1 -0
  49. package/dist/commands/launch.js +10 -0
  50. package/dist/commands/mock-approve-secret.d.ts +21 -0
  51. package/dist/commands/mock-approve-secret.d.ts.map +1 -0
  52. package/dist/commands/mock-approve-secret.js +69 -0
  53. package/dist/commands/mock-deny-secret.d.ts +21 -0
  54. package/dist/commands/mock-deny-secret.d.ts.map +1 -0
  55. package/dist/commands/mock-deny-secret.js +69 -0
  56. package/dist/commands/navigate.d.ts +4 -0
  57. package/dist/commands/navigate.d.ts.map +1 -0
  58. package/dist/commands/navigate.js +9 -0
  59. package/dist/commands/observe.d.ts +5 -0
  60. package/dist/commands/observe.d.ts.map +1 -0
  61. package/dist/commands/observe.js +53 -0
  62. package/dist/commands/poll-secret.d.ts +13 -0
  63. package/dist/commands/poll-secret.d.ts.map +1 -0
  64. package/dist/commands/poll-secret.js +87 -0
  65. package/dist/commands/request-secret.d.ts +15 -0
  66. package/dist/commands/request-secret.d.ts.map +1 -0
  67. package/dist/commands/request-secret.js +235 -0
  68. package/dist/commands/screenshot.d.ts +4 -0
  69. package/dist/commands/screenshot.d.ts.map +1 -0
  70. package/dist/commands/screenshot.js +11 -0
  71. package/dist/commands/solve-captcha.d.ts +19 -0
  72. package/dist/commands/solve-captcha.d.ts.map +1 -0
  73. package/dist/commands/solve-captcha.js +63 -0
  74. package/dist/commands/start-session.d.ts +28 -0
  75. package/dist/commands/start-session.d.ts.map +1 -0
  76. package/dist/commands/start-session.js +298 -0
  77. package/dist/commands/status.d.ts +27 -0
  78. package/dist/commands/status.d.ts.map +1 -0
  79. package/dist/commands/status.js +51 -0
  80. package/dist/commands/submit-form.d.ts +36 -0
  81. package/dist/commands/submit-form.d.ts.map +1 -0
  82. package/dist/commands/submit-form.js +242 -0
  83. package/dist/config.d.ts +2 -0
  84. package/dist/config.d.ts.map +1 -0
  85. package/dist/config.js +1 -0
  86. package/dist/fillable-form-state.d.ts +5 -0
  87. package/dist/fillable-form-state.d.ts.map +1 -0
  88. package/dist/fillable-form-state.js +22 -0
  89. package/dist/gateway.d.ts +10 -0
  90. package/dist/gateway.d.ts.map +1 -0
  91. package/dist/gateway.js +49 -0
  92. package/dist/generated/build-config.d.ts +2 -0
  93. package/dist/generated/build-config.d.ts.map +1 -0
  94. package/dist/generated/build-config.js +2 -0
  95. package/dist/index.d.ts +4 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +398 -0
  98. package/dist/mock-secret-cabinet.d.ts +37 -0
  99. package/dist/mock-secret-cabinet.d.ts.map +1 -0
  100. package/dist/mock-secret-cabinet.js +321 -0
  101. package/dist/mock-secret-store.d.ts +12 -0
  102. package/dist/mock-secret-store.d.ts.map +1 -0
  103. package/dist/mock-secret-store.js +108 -0
  104. package/dist/mock-stored-secrets.json +180 -0
  105. package/dist/otel-exporter.d.ts +58 -0
  106. package/dist/otel-exporter.d.ts.map +1 -0
  107. package/dist/otel-exporter.js +241 -0
  108. package/dist/otel-projector.d.ts +59 -0
  109. package/dist/otel-projector.d.ts.map +1 -0
  110. package/dist/otel-projector.js +325 -0
  111. package/dist/output.d.ts +10 -0
  112. package/dist/output.d.ts.map +1 -0
  113. package/dist/output.js +29 -0
  114. package/dist/package-version.d.ts +2 -0
  115. package/dist/package-version.d.ts.map +1 -0
  116. package/dist/package-version.js +14 -0
  117. package/dist/protected-exposure.d.ts +4 -0
  118. package/dist/protected-exposure.d.ts.map +1 -0
  119. package/dist/protected-exposure.js +17 -0
  120. package/dist/request-output.d.ts +4 -0
  121. package/dist/request-output.d.ts.map +1 -0
  122. package/dist/request-output.js +27 -0
  123. package/dist/run-store.d.ts +130 -0
  124. package/dist/run-store.d.ts.map +1 -0
  125. package/dist/run-store.js +245 -0
  126. package/dist/secret-backend.d.ts +28 -0
  127. package/dist/secret-backend.d.ts.map +1 -0
  128. package/dist/secret-backend.js +335 -0
  129. package/dist/secret-state.d.ts +7 -0
  130. package/dist/secret-state.d.ts.map +1 -0
  131. package/dist/secret-state.js +26 -0
  132. package/dist/session-backend.d.ts +34 -0
  133. package/dist/session-backend.d.ts.map +1 -0
  134. package/dist/session-backend.js +36 -0
  135. package/dist/update-check.d.ts +13 -0
  136. package/dist/update-check.d.ts.map +1 -0
  137. package/dist/update-check.js +175 -0
  138. package/dist/workflow-session-completion.d.ts +32 -0
  139. package/dist/workflow-session-completion.d.ts.map +1 -0
  140. package/dist/workflow-session-completion.js +149 -0
  141. package/dist/workflow-state.d.ts +2 -0
  142. package/dist/workflow-state.d.ts.map +1 -0
  143. package/dist/workflow-state.js +1 -0
  144. package/package.json +67 -0
package/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # @mercuryo-ai/magicpay-cli
2
+
3
+ Payment-only MagicPay CLI for session, secrets, and protected-form completion.
4
+
5
+ `magicpay` is the payment-only MagicPay CLI surface for:
6
+
7
+ - gateway setup and health checks;
8
+ - workflow session lifecycle;
9
+ - secret catalog, request, poll, protected fill, and guarded submit/observe flow;
10
+ - narrow browser attachment and protected-form completion on an already prepared page.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm i -g @mercuryo-ai/magicpay-cli
16
+ magicpay --help
17
+ ```
18
+
19
+ ## Current surface
20
+
21
+ - `init`
22
+ - `status`
23
+ - `attach`
24
+ - `start-session`
25
+ - `end-session`
26
+ - `find-form`
27
+ - `get-secrets-catalog`
28
+ - `request-secret`
29
+ - `mock-approve-secret`
30
+ - `mock-deny-secret`
31
+ - `poll-secret`
32
+ - `fill-secret`
33
+ - `submit-form`
34
+
35
+ Browser attach happens over CDP:
36
+
37
+ - `magicpay attach <cdp-url>`
38
+
39
+ `magicpay fill-secret` now performs a post-fill refresh, auto-submits when it
40
+ can resolve one live form-bound submit control, and returns a follow-up observe
41
+ result when submission happens. `submit-form` remains available as a manual
42
+ recovery surface.
43
+
44
+ `magicpay status` stays quiet about CLI updates by default. When a newer npm
45
+ release is available, it includes a short English notice and the suggested
46
+ update command.
47
+
48
+ ## Architecture boundary
49
+
50
+ - `magicpay` is the operator CLI for workflow sessions, approvals, protected
51
+ secret handling, and narrow form completion on the current page.
52
+ - `@mercuryo-ai/agentbrowse` owns browser primitives and the reusable browser
53
+ session store API.
54
+ - `@mercuryo-ai/magicpay-sdk` owns reusable MagicPay API and flow helpers.
55
+ - `@mercuryo-ai/magicpay-cli` owns branded payment CLI orchestration and the
56
+ payment-safe command UX on top of the shared `~/.magicpay` home.
@@ -0,0 +1,2 @@
1
+ export declare function ensureMagicPayAgentbrowseAssistiveRuntime(): void;
2
+ //# sourceMappingURL=agentbrowse-assistive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentbrowse-assistive.d.ts","sourceRoot":"","sources":["../src/agentbrowse-assistive.ts"],"names":[],"mappings":"AAqEA,wBAAgB,yCAAyC,IAAI,IAAI,CAWhE"}
@@ -0,0 +1,66 @@
1
+ import { configureAgentbrowseAssistiveRuntime, configureAgentbrowseDiagnostics, } from '@mercuryo-ai/agentbrowse';
2
+ import { tryResolveMagicPayGatewayConfig } from './gateway.js';
3
+ import { exportRunStepToOtlpHttpJsonBestEffort } from './otel-exporter.js';
4
+ import { appendStepChildSpan, finishRunStep, startRunStep } from './run-store.js';
5
+ import { MagicPayAssistiveLlmClient } from './assistive-llm-client.js';
6
+ const agentbrowseDiagnostics = {
7
+ startStep(input) {
8
+ if (!input.runId) {
9
+ return null;
10
+ }
11
+ const step = startRunStep({
12
+ runId: input.runId,
13
+ command: input.command,
14
+ ...(input.input ? { input: input.input } : {}),
15
+ ...(input.refs ? { refs: input.refs } : {}),
16
+ ...(input.protectedStep ? { protectedStep: true } : {}),
17
+ });
18
+ if (!step) {
19
+ return null;
20
+ }
21
+ return {
22
+ runId: step.runId,
23
+ stepId: step.stepId,
24
+ command: input.command,
25
+ };
26
+ },
27
+ async finishStep(input) {
28
+ if (!input.step) {
29
+ return;
30
+ }
31
+ finishRunStep({
32
+ runId: input.step.runId,
33
+ stepId: input.step.stepId,
34
+ success: input.success,
35
+ ...(input.outcomeType ? { outcomeType: input.outcomeType } : {}),
36
+ ...(input.message ? { message: input.message } : {}),
37
+ ...(input.reason ? { reason: input.reason } : {}),
38
+ });
39
+ await exportRunStepToOtlpHttpJsonBestEffort(input.step.runId, input.step.stepId);
40
+ },
41
+ recordChildSpan(input) {
42
+ if (!input.step) {
43
+ return;
44
+ }
45
+ appendStepChildSpan({
46
+ runId: input.step.runId,
47
+ stepId: input.step.stepId,
48
+ name: input.name,
49
+ startedAt: input.startedAt,
50
+ endedAt: input.endedAt,
51
+ statusCode: input.statusCode,
52
+ ...(input.kind ? { kind: input.kind } : {}),
53
+ ...(input.statusMessage ? { statusMessage: input.statusMessage } : {}),
54
+ ...(input.attributes ? { attributes: input.attributes } : {}),
55
+ });
56
+ },
57
+ };
58
+ export function ensureMagicPayAgentbrowseAssistiveRuntime() {
59
+ const gateway = tryResolveMagicPayGatewayConfig();
60
+ configureAgentbrowseAssistiveRuntime(gateway
61
+ ? {
62
+ createLlmClient: () => new MagicPayAssistiveLlmClient(gateway),
63
+ }
64
+ : null);
65
+ configureAgentbrowseDiagnostics(agentbrowseDiagnostics);
66
+ }
@@ -0,0 +1,13 @@
1
+ import { LLMClient } from '@browserbasehq/stagehand';
2
+ import { type AgentbrowseAssistiveChatCompletionRequest, type AgentbrowseAssistiveChatCompletionResult } from '@mercuryo-ai/agentbrowse';
3
+ import type { MagicPayGatewayConfig } from './gateway.js';
4
+ export declare class MagicPayAssistiveLlmClient extends LLMClient {
5
+ private readonly gateway;
6
+ type: "magicpay";
7
+ hasVision: boolean;
8
+ clientOptions: {};
9
+ constructor(gateway: MagicPayGatewayConfig);
10
+ createChatCompletion<T = unknown>(args: unknown): Promise<any>;
11
+ createAssistiveChatCompletion<T = unknown>(args: AgentbrowseAssistiveChatCompletionRequest): Promise<AgentbrowseAssistiveChatCompletionResult<T>>;
12
+ }
13
+ //# sourceMappingURL=assistive-llm-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistive-llm-client.d.ts","sourceRoot":"","sources":["../src/assistive-llm-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,yCAAyC,EAC9C,KAAK,wCAAwC,EAE9C,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAmG1D,qBAAa,0BAA2B,SAAQ,SAAS;IAK3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ3B,IAAI,EAAG,UAAU,CAAU;IAC3B,SAAS,UAAQ;IACjB,aAAa,KAAM;gBAEC,OAAO,EAAE,qBAAqB;IAIrD,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAmG9D,6BAA6B,CAAC,CAAC,GAAG,OAAO,EAC7C,IAAI,EAAE,yCAAyC,GAC9C,OAAO,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC;CASxD"}
@@ -0,0 +1,152 @@
1
+ import { LLMClient, toJsonSchema, } from '@browserbasehq/stagehand';
2
+ import { AssistiveStructuredOutputTruncatedError, } from '@mercuryo-ai/agentbrowse';
3
+ function readString(value) {
4
+ return typeof value === 'string' && value.trim().length > 0 ? value : undefined;
5
+ }
6
+ function readNumber(value) {
7
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
8
+ }
9
+ function gatewayBaseUrl(gateway) {
10
+ return gateway.apiUrl.replace(/\/$/, '');
11
+ }
12
+ function isRetryableStatus(status) {
13
+ return status === 429 || status === 502 || status === 503 || status === 504 || status >= 500;
14
+ }
15
+ function buildMessages(options) {
16
+ const messages = [...options.messages];
17
+ if (!options.image) {
18
+ return messages;
19
+ }
20
+ const content = [];
21
+ if (options.image.description?.trim()) {
22
+ content.push({ type: 'text', text: options.image.description.trim() });
23
+ }
24
+ content.push({
25
+ type: 'image_url',
26
+ image_url: {
27
+ url: `data:image/jpeg;base64,${options.image.buffer.toString('base64')}`,
28
+ detail: 'auto',
29
+ },
30
+ });
31
+ messages.push({
32
+ role: 'user',
33
+ content,
34
+ });
35
+ return messages;
36
+ }
37
+ async function withRetry(fn, retries = 1) {
38
+ for (let attempt = 0;; attempt += 1) {
39
+ try {
40
+ return await fn();
41
+ }
42
+ catch (err) {
43
+ const retryable = err instanceof Error &&
44
+ (err.name === 'RetryableHttpError' || err.name === 'RetryableNetworkError');
45
+ if (!retryable || attempt >= retries) {
46
+ throw err;
47
+ }
48
+ await new Promise((resolve) => setTimeout(resolve, 2_000 * (attempt + 1)));
49
+ }
50
+ }
51
+ }
52
+ export class MagicPayAssistiveLlmClient extends LLMClient {
53
+ gateway;
54
+ type = 'magicpay';
55
+ hasVision = true;
56
+ clientOptions = {};
57
+ constructor(gateway) {
58
+ super('magicpay/backend');
59
+ this.gateway = gateway;
60
+ }
61
+ async createChatCompletion(args) {
62
+ const request = args;
63
+ const { options } = request;
64
+ if (!options?.response_model) {
65
+ throw new Error('MagicPay assistive client currently requires response_model');
66
+ }
67
+ const url = `${gatewayBaseUrl(this.gateway)}/v1/chat/completions`;
68
+ const body = {
69
+ model: 'magicpay',
70
+ messages: buildMessages(options),
71
+ response_format: {
72
+ type: 'json_schema',
73
+ json_schema: {
74
+ name: options.response_model.name,
75
+ strict: true,
76
+ schema: toJsonSchema(options.response_model.schema),
77
+ },
78
+ },
79
+ temperature: options.temperature,
80
+ max_completion_tokens: options.maxOutputTokens,
81
+ };
82
+ const result = await withRetry(async () => {
83
+ let response;
84
+ try {
85
+ response = await fetch(url, {
86
+ method: 'POST',
87
+ headers: {
88
+ Authorization: `Bearer ${this.gateway.apiKey}`,
89
+ Accept: 'application/json',
90
+ 'Content-Type': 'application/json',
91
+ },
92
+ body: JSON.stringify(body),
93
+ signal: AbortSignal.timeout(45_000),
94
+ });
95
+ }
96
+ catch (err) {
97
+ const error = new Error(`MagicPay assistive runtime network error: ${err instanceof Error ? err.message : String(err)}`);
98
+ error.name = 'RetryableNetworkError';
99
+ throw error;
100
+ }
101
+ let json;
102
+ try {
103
+ json = (await response.json());
104
+ }
105
+ catch {
106
+ const parseError = new Error(`MagicPay assistive runtime returned non-JSON response (${response.status})`);
107
+ parseError.name = isRetryableStatus(response.status) ? 'RetryableHttpError' : 'HttpError';
108
+ throw parseError;
109
+ }
110
+ if (!response.ok) {
111
+ const message = typeof json.error === 'string' ? json.error : `HTTP ${response.status}`;
112
+ const structuredError = json;
113
+ if (structuredError.error_code === 'structured_output_truncated') {
114
+ throw new AssistiveStructuredOutputTruncatedError(`MagicPay assistive runtime error (${response.status}): ${message}`, {
115
+ status: response.status,
116
+ provider: readString(structuredError.provider),
117
+ model: readString(structuredError.model),
118
+ finishReason: readString(structuredError.finish_reason),
119
+ maxOutputTokens: readNumber(structuredError.max_output_tokens),
120
+ completionTokens: readNumber(structuredError.completion_tokens),
121
+ });
122
+ }
123
+ const error = new Error(`MagicPay assistive runtime error (${response.status}): ${message}`);
124
+ error.name = isRetryableStatus(response.status) ? 'RetryableHttpError' : 'HttpError';
125
+ throw error;
126
+ }
127
+ return json;
128
+ });
129
+ const structuredResult = result;
130
+ const content = structuredResult.choices?.[0]?.message?.content;
131
+ if (typeof content !== 'string' || content.trim().length === 0) {
132
+ throw new Error('MagicPay assistive runtime response missing assistant content');
133
+ }
134
+ let data;
135
+ try {
136
+ data = JSON.parse(content);
137
+ }
138
+ catch {
139
+ throw new Error('MagicPay assistive runtime returned invalid JSON assistant content');
140
+ }
141
+ return {
142
+ data,
143
+ usage: structuredResult.usage,
144
+ };
145
+ }
146
+ async createAssistiveChatCompletion(args) {
147
+ if (!args.options.response_model) {
148
+ throw new Error('MagicPay assistive client currently requires response_model');
149
+ }
150
+ return (await this.createChatCompletion(args));
151
+ }
152
+ }
@@ -0,0 +1,5 @@
1
+ import { isBrowseAction, type ActResult, type BrowserSessionState, type BrowseAction } from '@mercuryo-ai/agentbrowse';
2
+ export { isBrowseAction };
3
+ export type { ActResult, BrowseAction };
4
+ export declare function act(session: BrowserSessionState, targetRef: string, action: BrowseAction, value?: string): Promise<ActResult>;
5
+ //# sourceMappingURL=act.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/browser-bridge/act.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAExC,wBAAsB,GAAG,CACvB,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAIpB"}
@@ -0,0 +1,8 @@
1
+ import { act as actPrimitive, isBrowseAction, } from '@mercuryo-ai/agentbrowse';
2
+ import { saveMagicPaySession } from '../workflow-state.js';
3
+ export { isBrowseAction };
4
+ export async function act(session, targetRef, action, value) {
5
+ const result = await actPrimitive(session, targetRef, action, value);
6
+ saveMagicPaySession(session);
7
+ return result;
8
+ }
@@ -0,0 +1,5 @@
1
+ import { type BrowserSessionState, type ObserveResult } from '@mercuryo-ai/agentbrowse';
2
+ import { type MagicPaySession } from '../workflow-state.js';
3
+ export type { ObserveResult };
4
+ export declare function observe(session: BrowserSessionState | MagicPaySession, instruction?: string): Promise<ObserveResult>;
5
+ //# sourceMappingURL=observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/browser-bridge/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEjF,YAAY,EAAE,aAAa,EAAE,CAAC;AAmC9B,wBAAsB,OAAO,CAC3B,OAAO,EAAE,mBAAmB,GAAG,eAAe,EAC9C,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
@@ -0,0 +1,53 @@
1
+ import { observe as observePrimitive, } from '@mercuryo-ai/agentbrowse';
2
+ import { enrichObservedFormsForUrl } from '@mercuryo-ai/magicpay-sdk/agentbrowse';
3
+ import { listFillableForms } from '../fillable-form-state.js';
4
+ import { saveMagicPaySession } from '../workflow-state.js';
5
+ async function ensureAssistiveRuntime() {
6
+ const { ensureMagicPayAgentbrowseAssistiveRuntime } = await import('../agentbrowse-assistive.js');
7
+ ensureMagicPayAgentbrowseAssistiveRuntime();
8
+ }
9
+ function toObservedFillableForms(forms) {
10
+ return forms
11
+ .filter((form) => form.presence !== 'absent')
12
+ .map((form) => ({
13
+ fillRef: form.fillRef,
14
+ scopeRef: form.scopeRef,
15
+ purpose: form.purpose,
16
+ presence: form.presence === 'unknown' ? 'unknown' : 'present',
17
+ fields: form.fields.map((field) => ({
18
+ fieldKey: field.fieldKey,
19
+ targetRef: field.targetRef,
20
+ label: field.label,
21
+ required: field.required,
22
+ valueHint: field.valueHint,
23
+ })),
24
+ storedSecretCandidates: form.storedSecretCandidates.map((candidate) => ({
25
+ storedSecretRef: candidate.storedSecretRef,
26
+ kind: candidate.kind,
27
+ scope: candidate.scope,
28
+ displayName: candidate.displayName,
29
+ matchConfidence: candidate.matchConfidence,
30
+ intentRequired: candidate.intentRequired,
31
+ })),
32
+ }));
33
+ }
34
+ export async function observe(session, instruction) {
35
+ await ensureAssistiveRuntime();
36
+ const result = await observePrimitive(session, instruction);
37
+ if (result.success) {
38
+ saveMagicPaySession(session);
39
+ }
40
+ if (!result.success || !Array.isArray(result.fillableForms) || !result.url) {
41
+ return result;
42
+ }
43
+ try {
44
+ const runtimeFillableForms = listFillableForms(session);
45
+ return {
46
+ ...result,
47
+ fillableForms: toObservedFillableForms(enrichObservedFormsForUrl(runtimeFillableForms, 'secretCatalogByHost' in session ? session.secretCatalogByHost : undefined, result.url)),
48
+ };
49
+ }
50
+ catch {
51
+ return result;
52
+ }
53
+ }
@@ -0,0 +1,7 @@
1
+ import { type LaunchOptions } from '@mercuryo-ai/agentbrowse';
2
+ export declare function configureMagicPayAgentbrowseHome(): void;
3
+ export declare function resolveLaunchOptions(options?: Omit<LaunchOptions, 'compact' | 'profile'> & {
4
+ compact?: boolean;
5
+ profile?: string;
6
+ }): LaunchOptions;
7
+ //# sourceMappingURL=browser-home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-home.d.ts","sourceRoot":"","sources":["../src/browser-home.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAYlC,wBAAgB,gCAAgC,IAAI,IAAI,CAiBvD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,aAAa,CAUf"}
@@ -0,0 +1,34 @@
1
+ import { getMagicPayBrowserDefaults, getMagicPayHomeDir, } from '@mercuryo-ai/magicpay-home';
2
+ import { setSolverConfigStoreOverride, } from '@mercuryo-ai/agentbrowse';
3
+ function toProxySetting(value) {
4
+ if (value === null || value === undefined) {
5
+ return undefined;
6
+ }
7
+ return value;
8
+ }
9
+ export function configureMagicPayAgentbrowseHome() {
10
+ const override = {
11
+ rootDir: getMagicPayHomeDir(),
12
+ readConfig: () => {
13
+ const defaults = getMagicPayBrowserDefaults();
14
+ const proxy = toProxySetting(defaults.proxy);
15
+ return {
16
+ defaults: {
17
+ ...(typeof defaults.headless === 'boolean' ? { headless: defaults.headless } : {}),
18
+ ...(proxy ? { proxy } : {}),
19
+ },
20
+ };
21
+ },
22
+ };
23
+ setSolverConfigStoreOverride(override);
24
+ }
25
+ export function resolveLaunchOptions(options = {}) {
26
+ const defaults = getMagicPayBrowserDefaults();
27
+ return {
28
+ compact: options.compact ?? (defaults.windowMode === 'full' ? false : true),
29
+ profile: options.profile ?? defaults.profile,
30
+ ...(typeof options.headless === 'boolean' ? { headless: options.headless } : {}),
31
+ ...(typeof options.useProxy === 'boolean' ? { useProxy: options.useProxy } : {}),
32
+ ...(options.proxy ? { proxy: options.proxy } : {}),
33
+ };
34
+ }
@@ -0,0 +1,5 @@
1
+ import { isBrowseAction, type ActResult, type BrowserSessionState, type BrowseAction } from '@mercuryo-ai/agentbrowse';
2
+ export { isBrowseAction };
3
+ export type { ActResult, BrowseAction };
4
+ export declare function act(session: BrowserSessionState, targetRef: string, action: BrowseAction, value?: string): Promise<ActResult>;
5
+ //# sourceMappingURL=act.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAExC,wBAAsB,GAAG,CACvB,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAIpB"}
@@ -0,0 +1,8 @@
1
+ import { act as actPrimitive, isBrowseAction, } from '@mercuryo-ai/agentbrowse';
2
+ import { saveMagicPaySession } from '../workflow-state.js';
3
+ export { isBrowseAction };
4
+ export async function act(session, targetRef, action, value) {
5
+ const result = await actPrimitive(session, targetRef, action, value);
6
+ saveMagicPaySession(session);
7
+ return result;
8
+ }
@@ -0,0 +1,4 @@
1
+ import { type AttachOptions, type AttachResult } from '@mercuryo-ai/agentbrowse';
2
+ export type { AttachOptions, AttachResult };
3
+ export declare function attach(cdpUrl: string, options?: AttachOptions): Promise<AttachResult>;
4
+ //# sourceMappingURL=attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/commands/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,0BAA0B,CAAC;AAQlC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAE5C,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAO3F"}
@@ -0,0 +1,10 @@
1
+ import { attach as attachBrowser, close as closeBrowser, } from '@mercuryo-ai/agentbrowse';
2
+ import { loadMagicPayBrowserSession, loadMagicPaySession, saveMagicPaySession, } from '../workflow-state.js';
3
+ export async function attach(cdpUrl, options) {
4
+ await closeBrowser(loadMagicPaySession() ?? loadMagicPayBrowserSession());
5
+ const result = await attachBrowser(cdpUrl, options);
6
+ if (result.success) {
7
+ saveMagicPaySession(result.session);
8
+ }
9
+ return result;
10
+ }
@@ -0,0 +1,5 @@
1
+ import { status as readStatus, type BrowserCommandSession } from '@mercuryo-ai/agentbrowse';
2
+ export type BrowserStatusResult = Awaited<ReturnType<typeof readStatus>>;
3
+ export type { BrowserCommandSession };
4
+ export declare function browserStatus(): Promise<BrowserStatusResult>;
5
+ //# sourceMappingURL=browser-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-status.d.ts","sourceRoot":"","sources":["../../src/commands/browser-status.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,IAAI,UAAU,EACpB,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;AACzE,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,wBAAsB,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAElE"}
@@ -0,0 +1,5 @@
1
+ import { status as readStatus, } from '@mercuryo-ai/agentbrowse';
2
+ import { loadMagicPayBrowserSession, loadMagicPaySession } from '../workflow-state.js';
3
+ export async function browserStatus() {
4
+ return readStatus(loadMagicPaySession() ?? loadMagicPayBrowserSession());
5
+ }
@@ -0,0 +1,4 @@
1
+ import { type CloseResult } from '@mercuryo-ai/agentbrowse';
2
+ export type { CloseResult };
3
+ export declare function close(): Promise<CloseResult>;
4
+ //# sourceMappingURL=close.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,0BAA0B,CAAC;AASlC,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,wBAAsB,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAWlD"}
@@ -0,0 +1,11 @@
1
+ import { close as closeBrowser, } from '@mercuryo-ai/agentbrowse';
2
+ import { deleteMagicPayBrowserSession, deleteWorkflowContext, loadMagicPayBrowserSession, loadMagicPaySession, } from '../workflow-state.js';
3
+ export async function close() {
4
+ const session = (loadMagicPaySession() ?? loadMagicPayBrowserSession());
5
+ const result = await closeBrowser(session);
6
+ if (result.success) {
7
+ deleteMagicPayBrowserSession();
8
+ deleteWorkflowContext();
9
+ }
10
+ return result;
11
+ }
@@ -0,0 +1,22 @@
1
+ import { type MagicPaySession } from '../workflow-state.js';
2
+ export type EndSessionSuccessResult = {
3
+ success: true;
4
+ runId: string;
5
+ intentSessionId: string;
6
+ status: string;
7
+ lastEventSeq: number;
8
+ browserSessionId: string | null;
9
+ completedAt: string;
10
+ outcomeType: 'workflow_session_completed';
11
+ message: 'Workflow session completed.';
12
+ };
13
+ export type EndSessionFailureResult = {
14
+ success: false;
15
+ error: 'workflow_session_unavailable' | 'workflow_session_already_closed' | 'workflow_run_unavailable' | 'workflow_step_unavailable' | 'backend_session_complete_failed';
16
+ outcomeType: 'blocked' | 'failed';
17
+ message: 'Workflow session end failed.';
18
+ reason: string;
19
+ };
20
+ export type EndSessionResult = EndSessionSuccessResult | EndSessionFailureResult;
21
+ export declare function endSession(session: MagicPaySession): Promise<EndSessionResult>;
22
+ //# sourceMappingURL=end-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end-session.d.ts","sourceRoot":"","sources":["../../src/commands/end-session.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAM9B,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,4BAA4B,CAAC;IAC1C,OAAO,EAAE,6BAA6B,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EACD,8BAA8B,GAC9B,iCAAiC,GACjC,0BAA0B,GAC1B,2BAA2B,GAC3B,iCAAiC,CAAC;IACtC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,8BAA8B,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AA6DjF,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwEpF"}
@@ -0,0 +1,104 @@
1
+ import { exportRunStepToOtlpHttpJsonBestEffort } from '../otel-exporter.js';
2
+ import { info } from '../output.js';
3
+ import { finishRunRecord, finishRunStep, startRunStep } from '../run-store.js';
4
+ import { clearWorkflowState, saveMagicPaySession, } from '../workflow-state.js';
5
+ import { completeWorkflowSessionRemote, formatUnknownWorkflowCompletionError, } from '../workflow-session-completion.js';
6
+ async function finalizeEndSessionStepBestEffort(runId, stepId, options) {
7
+ if (!runId || !stepId) {
8
+ return;
9
+ }
10
+ try {
11
+ finishRunStep({
12
+ runId,
13
+ stepId,
14
+ ...options,
15
+ });
16
+ await exportRunStepToOtlpHttpJsonBestEffort(runId, stepId);
17
+ }
18
+ catch (error) {
19
+ info(`[end-session] failed to finalize local run step ${stepId}: ${formatUnknownWorkflowCompletionError(error)}`);
20
+ }
21
+ }
22
+ function finalizeRunRecordBestEffort(runId, options) {
23
+ if (!runId) {
24
+ return;
25
+ }
26
+ try {
27
+ finishRunRecord(runId, {
28
+ status: options.status,
29
+ finalOutcome: {
30
+ success: options.success,
31
+ ...(options.outcomeType ? { outcomeType: options.outcomeType } : {}),
32
+ ...(options.message ? { message: options.message } : {}),
33
+ ...(options.reason ? { reason: options.reason } : {}),
34
+ },
35
+ });
36
+ }
37
+ catch (error) {
38
+ info(`[end-session] failed to finalize local run ${runId}: ${formatUnknownWorkflowCompletionError(error)}`);
39
+ }
40
+ }
41
+ export async function endSession(session) {
42
+ const endSessionStep = session.activeRunId
43
+ ? startRunStep({
44
+ runId: session.activeRunId,
45
+ command: 'end-session',
46
+ input: {
47
+ hasWorkflowSession: Boolean(session.intentSessionId),
48
+ currentRequestId: session.currentRequestId ?? null,
49
+ },
50
+ })
51
+ : null;
52
+ const remoteCompletion = await completeWorkflowSessionRemote({
53
+ session,
54
+ stepId: endSessionStep?.stepId,
55
+ command: 'end-session',
56
+ terminalStatus: 'completed',
57
+ runStatus: 'completed',
58
+ summary: 'Workflow session completed.',
59
+ outcomeType: 'workflow_session_completed',
60
+ message: 'Workflow session completed.',
61
+ });
62
+ if (!remoteCompletion.success) {
63
+ const outcomeType = remoteCompletion.error === 'backend_session_complete_failed'
64
+ ? 'backend_session_complete_failed'
65
+ : 'blocked';
66
+ await finalizeEndSessionStepBestEffort(session.activeRunId, endSessionStep?.stepId, {
67
+ success: false,
68
+ outcomeType,
69
+ message: 'Workflow session end failed.',
70
+ reason: remoteCompletion.reason,
71
+ });
72
+ return {
73
+ success: false,
74
+ error: remoteCompletion.error,
75
+ outcomeType: remoteCompletion.error === 'backend_session_complete_failed' ? 'failed' : 'blocked',
76
+ message: 'Workflow session end failed.',
77
+ reason: remoteCompletion.reason,
78
+ };
79
+ }
80
+ await finalizeEndSessionStepBestEffort(remoteCompletion.runId, remoteCompletion.stepId ?? undefined, {
81
+ success: true,
82
+ outcomeType: 'workflow_session_completed',
83
+ message: 'Workflow session completed.',
84
+ });
85
+ finalizeRunRecordBestEffort(remoteCompletion.runId, {
86
+ status: 'completed',
87
+ success: true,
88
+ outcomeType: 'workflow_session_completed',
89
+ message: 'Workflow session completed.',
90
+ });
91
+ const nextSession = clearWorkflowState(session);
92
+ saveMagicPaySession(nextSession);
93
+ return {
94
+ success: true,
95
+ runId: remoteCompletion.runId,
96
+ intentSessionId: remoteCompletion.response.session.id,
97
+ status: remoteCompletion.response.session.status,
98
+ lastEventSeq: remoteCompletion.response.session.last_event_seq,
99
+ browserSessionId: remoteCompletion.response.browser_session_id,
100
+ completedAt: remoteCompletion.completedAt,
101
+ outcomeType: 'workflow_session_completed',
102
+ message: 'Workflow session completed.',
103
+ };
104
+ }
@@ -0,0 +1,4 @@
1
+ import { type BrowserSessionState, type ExtractResult, type ExtractSchemaInput } from '@mercuryo-ai/agentbrowse';
2
+ export type { ExtractResult };
3
+ export declare function extract(session: BrowserSessionState, schema: ExtractSchemaInput, scopeRef?: string): Promise<ExtractResult>;
4
+ //# sourceMappingURL=extract.d.ts.map