@mercuryo-ai/magicpay-home 0.1.7 → 0.1.10

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Mercuryo AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,17 +1,30 @@
1
1
  # @mercuryo-ai/magicpay-home
2
2
 
3
- Shared local home/config/state runtime contract for the MagicPay product CLIs.
3
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
4
 
5
- This package is a runtime helper dependency for:
5
+ Shared configuration and state management for the MagicPay CLI family.
6
6
 
7
- - `@mercuryo-ai/agentbrowse-cli`
8
- - `@mercuryo-ai/magicpay-cli`
9
- - `@mercuryo-ai/magicpay-agent-cli`
7
+ This package owns the `~/.magicpay` directory layout — configuration files,
8
+ browser session state, and workflow persistence — shared by all three MagicPay
9
+ CLIs:
10
10
 
11
- It owns the shared `~/.magicpay` filesystem contract and exposes typed helpers
12
- for config paths, persisted browser session state, workflow state, and atomic
13
- filesystem writes.
11
+ - [`@mercuryo-ai/agentbrowse-cli`](https://www.npmjs.com/package/@mercuryo-ai/agentbrowse-cli) browser automation
12
+ - [`@mercuryo-ai/magicpay-cli`](https://www.npmjs.com/package/@mercuryo-ai/magicpay-cli) protected-form fills
13
+ - [`@mercuryo-ai/magicpay-agent-cli`](https://www.npmjs.com/package/@mercuryo-ai/magicpay-agent-cli) — combined browser + payment agent
14
14
 
15
- This package is not an end-user CLI and is not meant to be installed directly
16
- for standalone usage. It exists so the public CLI packages can consume one
17
- shared runtime contract without copying local-home logic into multiple packages.
15
+ ## Do I need to install this?
16
+
17
+ No. This package is pulled in automatically as a dependency of the CLIs above.
18
+ You don't need to install or configure it directly.
19
+
20
+ ## What it provides
21
+
22
+ - Typed helpers for `~/.magicpay/config.json` (API key, endpoints, feature
23
+ flags)
24
+ - Browser session persistence across process restarts
25
+ - Workflow state tracking for multi-step protected-form flows
26
+ - Safe concurrent writes when multiple MagicPay CLIs run at once
27
+
28
+ ## License
29
+
30
+ [MIT](LICENSE)
@@ -0,0 +1,17 @@
1
+ export type PackageUpdateCheckOptions = {
2
+ fetchImpl?: typeof fetch;
3
+ now?: Date;
4
+ timeoutMs?: number;
5
+ ttlMs?: number;
6
+ statePath?: string;
7
+ };
8
+ export declare function compareVersions(left: string, right: string): number;
9
+ export declare function checkForPackageUpdate<T>(params: {
10
+ packageName: string;
11
+ currentVersion: string;
12
+ buildNotice: (input: {
13
+ currentVersion: string;
14
+ latestVersion: string;
15
+ }) => T;
16
+ } & PackageUpdateCheckOptions): Promise<T | null>;
17
+ //# sourceMappingURL=cli-update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-update-check.d.ts","sourceRoot":"","sources":["../src/cli-update-check.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA8DnE;AAED,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,MAAM,EAAE;IACN,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,CAAC,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,CAAC,CAAC;CAC9E,GAAG,yBAAyB,GAC5B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA+BnB"}
@@ -0,0 +1,164 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { getMagicPayUpdateStatePath } from './paths.js';
4
+ const DEFAULT_UPDATE_CHECK_TIMEOUT_MS = 1500;
5
+ const DEFAULT_UPDATE_TTL_MS = 12 * 60 * 60 * 1000;
6
+ export function compareVersions(left, right) {
7
+ const parsedLeft = parseVersion(left);
8
+ const parsedRight = parseVersion(right);
9
+ if (!parsedLeft || !parsedRight) {
10
+ return left.localeCompare(right, undefined, {
11
+ numeric: true,
12
+ sensitivity: 'base',
13
+ });
14
+ }
15
+ for (let i = 0; i < 3; i += 1) {
16
+ const diff = parsedLeft.core[i] - parsedRight.core[i];
17
+ if (diff !== 0) {
18
+ return diff;
19
+ }
20
+ }
21
+ if (!parsedLeft.prerelease && !parsedRight.prerelease) {
22
+ return 0;
23
+ }
24
+ if (!parsedLeft.prerelease) {
25
+ return 1;
26
+ }
27
+ if (!parsedRight.prerelease) {
28
+ return -1;
29
+ }
30
+ const length = Math.max(parsedLeft.prerelease.length, parsedRight.prerelease.length);
31
+ for (let i = 0; i < length; i += 1) {
32
+ const leftPart = parsedLeft.prerelease[i];
33
+ const rightPart = parsedRight.prerelease[i];
34
+ if (leftPart === undefined) {
35
+ return -1;
36
+ }
37
+ if (rightPart === undefined) {
38
+ return 1;
39
+ }
40
+ if (typeof leftPart === 'number' && typeof rightPart === 'number') {
41
+ const diff = leftPart - rightPart;
42
+ if (diff !== 0) {
43
+ return diff;
44
+ }
45
+ continue;
46
+ }
47
+ if (typeof leftPart === 'number') {
48
+ return -1;
49
+ }
50
+ if (typeof rightPart === 'number') {
51
+ return 1;
52
+ }
53
+ const diff = leftPart.localeCompare(rightPart);
54
+ if (diff !== 0) {
55
+ return diff;
56
+ }
57
+ }
58
+ return 0;
59
+ }
60
+ export async function checkForPackageUpdate(params) {
61
+ const now = params.now ?? new Date();
62
+ const ttlMs = params.ttlMs ?? DEFAULT_UPDATE_TTL_MS;
63
+ const statePath = params.statePath ?? getMagicPayUpdateStatePath();
64
+ const cachedState = readUpdateState(statePath, params.packageName);
65
+ const cachedNotice = buildPackageUpdateNotice(params.currentVersion, cachedState?.latestVersion, params.buildNotice);
66
+ if (cachedState && !isCacheStale(cachedState.lastCheckedAt, now, ttlMs)) {
67
+ return cachedNotice;
68
+ }
69
+ const latestVersion = await fetchLatestVersion(params.packageName, {
70
+ fetchImpl: params.fetchImpl,
71
+ timeoutMs: params.timeoutMs ?? DEFAULT_UPDATE_CHECK_TIMEOUT_MS,
72
+ }).catch(() => null);
73
+ if (!latestVersion) {
74
+ return cachedNotice;
75
+ }
76
+ writeUpdateState(statePath, {
77
+ packageName: params.packageName,
78
+ latestVersion,
79
+ lastCheckedAt: now.toISOString(),
80
+ });
81
+ return buildPackageUpdateNotice(params.currentVersion, latestVersion, params.buildNotice);
82
+ }
83
+ function parseVersion(version) {
84
+ const match = version
85
+ .trim()
86
+ .match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+.*)?$/);
87
+ if (!match) {
88
+ return null;
89
+ }
90
+ const prerelease = match[4]
91
+ ? match[4].split('.').map((part) => (/^\d+$/.test(part) ? Number(part) : part))
92
+ : null;
93
+ return {
94
+ core: [Number(match[1]), Number(match[2]), Number(match[3])],
95
+ prerelease,
96
+ };
97
+ }
98
+ function buildPackageUpdateNotice(currentVersion, latestVersion, buildNotice) {
99
+ if (!latestVersion || compareVersions(latestVersion, currentVersion) <= 0) {
100
+ return null;
101
+ }
102
+ return buildNotice({ currentVersion, latestVersion });
103
+ }
104
+ function readUpdateState(statePath, packageName) {
105
+ if (!existsSync(statePath)) {
106
+ return null;
107
+ }
108
+ try {
109
+ const raw = JSON.parse(readFileSync(statePath, 'utf-8'));
110
+ if (raw.packageName !== packageName ||
111
+ typeof raw.latestVersion !== 'string' ||
112
+ typeof raw.lastCheckedAt !== 'string') {
113
+ return null;
114
+ }
115
+ return {
116
+ packageName: raw.packageName,
117
+ latestVersion: raw.latestVersion,
118
+ lastCheckedAt: raw.lastCheckedAt,
119
+ };
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ function writeUpdateState(statePath, state) {
126
+ mkdirSync(dirname(statePath), { recursive: true });
127
+ writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
128
+ }
129
+ function isCacheStale(lastCheckedAt, now, ttlMs) {
130
+ const lastCheckedAtMs = new Date(lastCheckedAt).getTime();
131
+ if (!Number.isFinite(lastCheckedAtMs)) {
132
+ return true;
133
+ }
134
+ return now.getTime() - lastCheckedAtMs >= ttlMs;
135
+ }
136
+ async function fetchLatestVersion(packageName, options) {
137
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
138
+ if (typeof fetchImpl !== 'function') {
139
+ throw new Error('Global fetch is not available.');
140
+ }
141
+ const controller = new AbortController();
142
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs);
143
+ const registryMetadataUrl = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;
144
+ try {
145
+ const response = await fetchImpl(registryMetadataUrl, {
146
+ headers: {
147
+ Accept: 'application/json',
148
+ },
149
+ signal: controller.signal,
150
+ });
151
+ if (!response.ok) {
152
+ throw new Error(`Registry responded with ${response.status}.`);
153
+ }
154
+ const metadata = (await response.json());
155
+ const latestVersion = metadata['dist-tags']?.latest;
156
+ if (!latestVersion || typeof latestVersion !== 'string') {
157
+ throw new Error('Registry metadata does not include dist-tags.latest.');
158
+ }
159
+ return latestVersion;
160
+ }
161
+ finally {
162
+ clearTimeout(timeout);
163
+ }
164
+ }
package/dist/config.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { getMagicPayConfigPath, getMagicPayHomeDir, getMagicPayProfilesDir, getMagicPayUpdateStatePath } from './paths.js';
2
- export type MagicPayBrowserWindowMode = 'compact' | 'full';
3
2
  export interface MagicPayBrowserProxyConfig {
4
3
  server: string;
5
4
  username?: string;
@@ -15,9 +14,6 @@ export interface MagicPaySharedConfig {
15
14
  defaultProfile?: string;
16
15
  headless?: boolean;
17
16
  proxy?: MagicPayBrowserProxySetting;
18
- window?: {
19
- mode?: MagicPayBrowserWindowMode;
20
- };
21
17
  };
22
18
  updates?: {
23
19
  checkForCliUpdates?: boolean;
@@ -65,7 +61,6 @@ export declare function getMagicPayBrowserDefaults(): {
65
61
  profile?: string;
66
62
  headless?: boolean;
67
63
  proxy?: MagicPayBrowserProxySetting;
68
- windowMode?: MagicPayBrowserWindowMode;
69
64
  };
70
65
  export declare function loadGatewayConfig(): {
71
66
  apiKey?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -91,9 +91,6 @@ function normalizeConfig(raw) {
91
91
  const browserSource = Reflect.get(raw, 'browser') && typeof Reflect.get(raw, 'browser') === 'object'
92
92
  ? Reflect.get(raw, 'browser')
93
93
  : undefined;
94
- const windowSource = browserSource?.window && typeof browserSource.window === 'object'
95
- ? browserSource.window
96
- : undefined;
97
94
  const updatesSource = Reflect.get(raw, 'updates') && typeof Reflect.get(raw, 'updates') === 'object'
98
95
  ? Reflect.get(raw, 'updates')
99
96
  : undefined;
@@ -102,9 +99,6 @@ function normalizeConfig(raw) {
102
99
  const browserDefaultProfile = trimOptionalString(browserSource?.defaultProfile);
103
100
  const browserHeadless = typeof browserSource?.headless === 'boolean' ? browserSource.headless : undefined;
104
101
  const browserProxy = normalizeProxySetting(browserSource?.proxy);
105
- const browserWindowMode = windowSource?.mode === 'compact' || windowSource?.mode === 'full'
106
- ? windowSource.mode
107
- : undefined;
108
102
  const checkForCliUpdates = typeof updatesSource?.checkForCliUpdates === 'boolean'
109
103
  ? updatesSource.checkForCliUpdates
110
104
  : undefined;
@@ -119,14 +113,12 @@ function normalizeConfig(raw) {
119
113
  : {}),
120
114
  ...(browserDefaultProfile !== undefined ||
121
115
  browserHeadless !== undefined ||
122
- browserProxy !== undefined ||
123
- browserWindowMode !== undefined
116
+ browserProxy !== undefined
124
117
  ? {
125
118
  browser: {
126
119
  ...(browserDefaultProfile ? { defaultProfile: browserDefaultProfile } : {}),
127
120
  ...(browserHeadless !== undefined ? { headless: browserHeadless } : {}),
128
121
  ...(browserProxy !== undefined ? { proxy: browserProxy } : {}),
129
- ...(browserWindowMode ? { window: { mode: browserWindowMode } } : {}),
130
122
  },
131
123
  }
132
124
  : {}),
@@ -317,7 +309,6 @@ export function getMagicPayBrowserDefaults() {
317
309
  ? { headless: config.browser.headless }
318
310
  : {}),
319
311
  ...(config.browser && 'proxy' in config.browser ? { proxy: config.browser.proxy } : {}),
320
- ...(config.browser?.window?.mode ? { windowMode: config.browser.window.mode } : {}),
321
312
  };
322
313
  }
323
314
  export function loadGatewayConfig() {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export { type MagicPayBrowserProxyConfig, type MagicPayBrowserProxySetting, type MagicPayBrowserWindowMode, type MagicPayConfigDoctorConfigState, type MagicPayConfigDoctorFailure, type MagicPayConfigDoctorGatewayState, type MagicPayConfigDoctorIssue, type MagicPayConfigDoctorResult, type MagicPayConfigDoctorSuccess, type MagicPaySharedConfig, doctorMagicPayConfig, getMagicPayBrowserDefaults, getMagicPayConfigPath, getMagicPayHomeDir, getMagicPayProfilesDir, getMagicPayUpdateStatePath, loadGatewayConfig, normalizeMagicPayApiUrl, readMagicPayConfig, writeMagicPayConfig, } from './config.js';
1
+ export { compareVersions, checkForPackageUpdate, type PackageUpdateCheckOptions, } from './cli-update-check.js';
2
+ export { type MagicPayBrowserProxyConfig, type MagicPayBrowserProxySetting, type MagicPayConfigDoctorConfigState, type MagicPayConfigDoctorFailure, type MagicPayConfigDoctorGatewayState, type MagicPayConfigDoctorIssue, type MagicPayConfigDoctorResult, type MagicPayConfigDoctorSuccess, type MagicPaySharedConfig, doctorMagicPayConfig, getMagicPayBrowserDefaults, getMagicPayConfigPath, getMagicPayHomeDir, getMagicPayProfilesDir, getMagicPayUpdateStatePath, loadGatewayConfig, normalizeMagicPayApiUrl, readMagicPayConfig, writeMagicPayConfig, } from './config.js';
2
3
  export { deleteFileIfExists, ensureMagicPayHomeDir, ensureParentDir, atomicWriteJson, atomicWriteText, readJsonFile, } from './fs.js';
3
4
  export { MAGICPAY_BROWSER_SESSION_FILENAME, MAGICPAY_CONFIG_FILENAME, MAGICPAY_HOME_DIRNAME, MAGICPAY_MOCK_SECRET_REQUESTS_FILENAME, MAGICPAY_MOCK_STORED_SECRETS_FILENAME, MAGICPAY_PROFILES_DIRNAME, MAGICPAY_RUNS_DIRNAME, MAGICPAY_UPDATE_STATE_FILENAME, MAGICPAY_WORKFLOW_STATE_FILENAME, getMagicPayBrowserSessionPath, getMagicPayMockSecretRequestsPath, getMagicPayMockStoredSecretsPath, getMagicPayRunsDir, getMagicPayWorkflowStatePath, } from './paths.js';
4
- export { type CachedTransientSecretEntry, type MagicPaySession, type MagicPayWorkflowContext, buildWorkflowContextForPersistence, cacheTransientSecret, canHydrateWorkflowContext, cleanupTransientSecretCache, clearWorkflowState, deleteCachedTransientSecret, deleteMagicPayBrowserSession, deleteWorkflowContext, getCachedTransientSecret, loadMagicPayBrowserSession, loadMagicPaySession, loadWorkflowContext, saveMagicPayBrowserSession, saveMagicPaySession, saveWorkflowContext, } from './workflow-state.js';
5
+ export { type CachedTransientSecretEntry, type MagicPaySession, type SessionOpenDataEntry, type SessionOpenDataFreshness, type SessionOpenDataProvenance, type SessionOpenDataSensitivity, type SessionOpenDataSnapshot, type SessionOpenDataSource, type MagicPayWorkflowContext, buildWorkflowContextForPersistence, cacheTransientSecret, canHydrateWorkflowContext, cleanupTransientSecretCache, clearWorkflowState, deleteCachedTransientSecret, deleteMagicPayBrowserSession, deleteWorkflowContext, getCachedTransientSecret, getSessionOpenDataValues, loadProfileFactsIntoOpenDataSnapshot, loadMagicPayBrowserSession, loadMagicPaySession, loadWorkflowContext, mergeSessionOpenDataValues, saveMagicPayBrowserSession, saveMagicPaySession, saveWorkflowContext, } from './workflow-state.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,iCAAiC,EACjC,wBAAwB,EACxB,qBAAqB,EACrB,sCAAsC,EACtC,qCAAqC,EACrC,yBAAyB,EACzB,qBAAqB,EACrB,8BAA8B,EAC9B,gCAAgC,EAChC,6BAA6B,EAC7B,iCAAiC,EACjC,gCAAgC,EAChC,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,kCAAkC,EAClC,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,yBAAyB,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,iCAAiC,EACjC,wBAAwB,EACxB,qBAAqB,EACrB,sCAAsC,EACtC,qCAAqC,EACrC,yBAAyB,EACzB,qBAAqB,EACrB,8BAA8B,EAC9B,gCAAgC,EAChC,6BAA6B,EAC7B,iCAAiC,EACjC,gCAAgC,EAChC,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,kCAAkC,EAClC,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,oCAAoC,EACpC,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
+ export { compareVersions, checkForPackageUpdate, } from './cli-update-check.js';
1
2
  export { doctorMagicPayConfig, getMagicPayBrowserDefaults, getMagicPayConfigPath, getMagicPayHomeDir, getMagicPayProfilesDir, getMagicPayUpdateStatePath, loadGatewayConfig, normalizeMagicPayApiUrl, readMagicPayConfig, writeMagicPayConfig, } from './config.js';
2
3
  export { deleteFileIfExists, ensureMagicPayHomeDir, ensureParentDir, atomicWriteJson, atomicWriteText, readJsonFile, } from './fs.js';
3
4
  export { MAGICPAY_BROWSER_SESSION_FILENAME, MAGICPAY_CONFIG_FILENAME, MAGICPAY_HOME_DIRNAME, MAGICPAY_MOCK_SECRET_REQUESTS_FILENAME, MAGICPAY_MOCK_STORED_SECRETS_FILENAME, MAGICPAY_PROFILES_DIRNAME, MAGICPAY_RUNS_DIRNAME, MAGICPAY_UPDATE_STATE_FILENAME, MAGICPAY_WORKFLOW_STATE_FILENAME, getMagicPayBrowserSessionPath, getMagicPayMockSecretRequestsPath, getMagicPayMockStoredSecretsPath, getMagicPayRunsDir, getMagicPayWorkflowStatePath, } from './paths.js';
4
- export { buildWorkflowContextForPersistence, cacheTransientSecret, canHydrateWorkflowContext, cleanupTransientSecretCache, clearWorkflowState, deleteCachedTransientSecret, deleteMagicPayBrowserSession, deleteWorkflowContext, getCachedTransientSecret, loadMagicPayBrowserSession, loadMagicPaySession, loadWorkflowContext, saveMagicPayBrowserSession, saveMagicPaySession, saveWorkflowContext, } from './workflow-state.js';
5
+ export { buildWorkflowContextForPersistence, cacheTransientSecret, canHydrateWorkflowContext, cleanupTransientSecretCache, clearWorkflowState, deleteCachedTransientSecret, deleteMagicPayBrowserSession, deleteWorkflowContext, getCachedTransientSecret, getSessionOpenDataValues, loadProfileFactsIntoOpenDataSnapshot, loadMagicPayBrowserSession, loadMagicPaySession, loadWorkflowContext, mergeSessionOpenDataValues, saveMagicPayBrowserSession, saveMagicPaySession, saveWorkflowContext, } from './workflow-state.js';
@@ -1,4 +1,4 @@
1
- import type { SecretCatalog, SecretRequestSnapshot } from '@mercuryo-ai/magicpay-sdk';
1
+ import type { MagicPayProfileFacts, SecretCatalog, SecretRequestSnapshot } from '@mercuryo-ai/magicpay-sdk';
2
2
  import { type BrowserSessionState } from '@mercuryo-ai/agentbrowse';
3
3
  export interface CachedTransientSecretEntry {
4
4
  requestId: string;
@@ -9,6 +9,32 @@ export interface CachedTransientSecretEntry {
9
9
  expiresAt?: string;
10
10
  values: Record<string, string>;
11
11
  }
12
+ export type SessionOpenDataSource = 'profile_facts' | 'session_open_value';
13
+ export type SessionOpenDataFreshness = 'profile_snapshot' | 'session_learned';
14
+ export type SessionOpenDataSensitivity = 'open' | 'protected';
15
+ export interface SessionOpenDataProvenance {
16
+ kind: 'profile_facts' | 'data_resolve' | 'data_provide';
17
+ requestId?: string;
18
+ }
19
+ export interface SessionOpenDataEntry {
20
+ fieldKey: string;
21
+ value: string | number;
22
+ source: SessionOpenDataSource;
23
+ freshness: SessionOpenDataFreshness;
24
+ sensitivity: SessionOpenDataSensitivity;
25
+ applicability: {
26
+ target: 'global' | 'host';
27
+ value?: string;
28
+ };
29
+ updatedAt: string;
30
+ factsUpdatedAt?: string;
31
+ provenance: SessionOpenDataProvenance;
32
+ }
33
+ export interface SessionOpenDataSnapshot {
34
+ version: 1;
35
+ updatedAt: string;
36
+ valuesByField: Record<string, SessionOpenDataEntry[]>;
37
+ }
12
38
  export interface MagicPayWorkflowContext {
13
39
  browserSessionId?: string;
14
40
  activeRunId?: string;
@@ -19,9 +45,22 @@ export interface MagicPayWorkflowContext {
19
45
  secretCatalogByHost?: Record<string, SecretCatalog>;
20
46
  secretRequestSnapshots?: Record<string, SecretRequestSnapshot>;
21
47
  transientSecretCache?: Record<string, CachedTransientSecretEntry>;
48
+ openDataSnapshot?: SessionOpenDataSnapshot;
22
49
  }
23
50
  export interface MagicPaySession extends BrowserSessionState, MagicPayWorkflowContext {
24
51
  }
52
+ export declare function loadProfileFactsIntoOpenDataSnapshot(session: MagicPayWorkflowContext, profileFacts: MagicPayProfileFacts, options?: {
53
+ loadedAt?: string;
54
+ }): SessionOpenDataSnapshot;
55
+ export declare function mergeSessionOpenDataValues(session: MagicPayWorkflowContext, values: Record<string, unknown>, options?: {
56
+ host?: string;
57
+ updatedAt?: string;
58
+ provenance?: SessionOpenDataProvenance;
59
+ sensitivity?: SessionOpenDataSensitivity;
60
+ }): SessionOpenDataSnapshot;
61
+ export declare function getSessionOpenDataValues(session: MagicPayWorkflowContext, fieldKey: string, options?: {
62
+ host?: string;
63
+ }): SessionOpenDataEntry[];
25
64
  export declare function cleanupTransientSecretCache(session: MagicPayWorkflowContext, options?: {
26
65
  now?: string;
27
66
  }): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../src/workflow-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AASlC,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB,EAAE,uBAAuB;CAAG;AAiBxF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,EAChC,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,OAAO,CAqBT;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,0BAA0B,GAChC,0BAA0B,CAQ5B;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,0BAA0B,GAAG,IAAI,CAGnC;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,MAAM,GAChB,OAAO,CAYT;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,uBAAuB,EAChC,wBAAwB,EAAE,MAAM,GAC/B,uBAAuB,GAAG,IAAI,CAuBhC;AAED,wBAAgB,yBAAyB,CACvC,wBAAwB,EAAE,MAAM,EAChC,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAKT;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAY5E;AAED,wBAAgB,mBAAmB,IAAI,uBAAuB,GAAG,IAAI,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAE1E;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE7E;AAED,wBAAgB,0BAA0B,IAAI,mBAAmB,GAAG,IAAI,CAEvE;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAsCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAQlE;AAED,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CA6B5D"}
1
+ {"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../src/workflow-state.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,180 @@
1
1
  import { createBrowserSessionStore, resolveBrowserSessionId, } from '@mercuryo-ai/agentbrowse';
2
2
  import { deleteFileIfExists, atomicWriteJson, readJsonFile } from './fs.js';
3
3
  import { MAGICPAY_BROWSER_SESSION_FILENAME, getMagicPayHomeDir, getMagicPayWorkflowStatePath, } from './paths.js';
4
+ function isSupportedOpenDataValue(value) {
5
+ return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));
6
+ }
7
+ function cloneOpenDataEntry(entry) {
8
+ return {
9
+ ...entry,
10
+ applicability: { ...entry.applicability },
11
+ provenance: { ...entry.provenance },
12
+ };
13
+ }
14
+ function cloneOpenDataSnapshot(snapshot) {
15
+ return {
16
+ version: 1,
17
+ updatedAt: snapshot.updatedAt,
18
+ valuesByField: Object.fromEntries(Object.entries(snapshot.valuesByField).map(([fieldKey, entries]) => [
19
+ fieldKey,
20
+ entries.map((entry) => cloneOpenDataEntry(entry)),
21
+ ])),
22
+ };
23
+ }
24
+ function normalizeOpenDataFieldKey(fieldKey) {
25
+ return fieldKey.trim();
26
+ }
27
+ function normalizeScopeValue(value) {
28
+ return value?.trim().toLowerCase() ?? '';
29
+ }
30
+ function openDataScopeRank(entry, host) {
31
+ if (entry.applicability.target === 'host') {
32
+ return normalizeScopeValue(entry.applicability.value) === normalizeScopeValue(host) ? 4 : 1;
33
+ }
34
+ return 2;
35
+ }
36
+ function openDataSourceRank(source) {
37
+ return source === 'session_open_value' ? 2 : 1;
38
+ }
39
+ function openDataFreshnessRank(freshness) {
40
+ return freshness === 'session_learned' ? 2 : 1;
41
+ }
42
+ function compareOpenDataEntries(left, right, host) {
43
+ const scopeRank = openDataScopeRank(right, host) - openDataScopeRank(left, host);
44
+ if (scopeRank !== 0) {
45
+ return scopeRank;
46
+ }
47
+ const sourceRank = openDataSourceRank(right.source) - openDataSourceRank(left.source);
48
+ if (sourceRank !== 0) {
49
+ return sourceRank;
50
+ }
51
+ const freshnessRank = openDataFreshnessRank(right.freshness) - openDataFreshnessRank(left.freshness);
52
+ if (freshnessRank !== 0) {
53
+ return freshnessRank;
54
+ }
55
+ return right.updatedAt.localeCompare(left.updatedAt);
56
+ }
57
+ function openDataEntryIdentity(entry) {
58
+ return [
59
+ normalizeOpenDataFieldKey(entry.fieldKey),
60
+ entry.applicability.target,
61
+ normalizeScopeValue(entry.applicability.value),
62
+ entry.value,
63
+ ].join('::');
64
+ }
65
+ function pruneEmptyOpenDataFields(snapshot) {
66
+ for (const [fieldKey, entries] of Object.entries(snapshot.valuesByField)) {
67
+ if (entries.length === 0) {
68
+ delete snapshot.valuesByField[fieldKey];
69
+ }
70
+ }
71
+ }
72
+ function assignOpenDataSnapshot(session, snapshot) {
73
+ pruneEmptyOpenDataFields(snapshot);
74
+ if (Object.keys(snapshot.valuesByField).length === 0) {
75
+ delete session.openDataSnapshot;
76
+ return {
77
+ version: 1,
78
+ updatedAt: snapshot.updatedAt,
79
+ valuesByField: {},
80
+ };
81
+ }
82
+ session.openDataSnapshot = snapshot;
83
+ return snapshot;
84
+ }
85
+ function ensureOpenDataSnapshot(session, updatedAt) {
86
+ const current = session.openDataSnapshot ? cloneOpenDataSnapshot(session.openDataSnapshot) : null;
87
+ return (current ?? {
88
+ version: 1,
89
+ updatedAt,
90
+ valuesByField: {},
91
+ });
92
+ }
93
+ function insertOpenDataEntries(snapshot, entries, host) {
94
+ for (const entry of entries) {
95
+ const fieldKey = normalizeOpenDataFieldKey(entry.fieldKey);
96
+ if (!fieldKey) {
97
+ continue;
98
+ }
99
+ const nextEntry = cloneOpenDataEntry({
100
+ ...entry,
101
+ fieldKey,
102
+ });
103
+ const existingEntries = snapshot.valuesByField[fieldKey] ?? [];
104
+ const dedupeKey = openDataEntryIdentity(nextEntry);
105
+ const nextEntries = existingEntries
106
+ .filter((existing) => openDataEntryIdentity(existing) !== dedupeKey)
107
+ .concat(nextEntry)
108
+ .sort((left, right) => compareOpenDataEntries(left, right, host));
109
+ snapshot.valuesByField[fieldKey] = nextEntries;
110
+ }
111
+ }
112
+ export function loadProfileFactsIntoOpenDataSnapshot(session, profileFacts, options = {}) {
113
+ const loadedAt = options.loadedAt ?? new Date().toISOString();
114
+ const snapshot = ensureOpenDataSnapshot(session, loadedAt);
115
+ for (const [fieldKey, entries] of Object.entries(snapshot.valuesByField)) {
116
+ snapshot.valuesByField[fieldKey] = entries.filter((entry) => entry.source !== 'profile_facts');
117
+ }
118
+ pruneEmptyOpenDataFields(snapshot);
119
+ insertOpenDataEntries(snapshot, Object.entries(profileFacts.facts)
120
+ .filter((entry) => isSupportedOpenDataValue(entry[1]))
121
+ .map(([fieldKey, value]) => ({
122
+ fieldKey,
123
+ value,
124
+ source: 'profile_facts',
125
+ freshness: 'profile_snapshot',
126
+ sensitivity: 'open',
127
+ applicability: {
128
+ target: 'global',
129
+ },
130
+ updatedAt: loadedAt,
131
+ factsUpdatedAt: profileFacts.updatedAt,
132
+ provenance: {
133
+ kind: 'profile_facts',
134
+ },
135
+ })), undefined);
136
+ snapshot.updatedAt = loadedAt;
137
+ return assignOpenDataSnapshot(session, snapshot);
138
+ }
139
+ export function mergeSessionOpenDataValues(session, values, options = {}) {
140
+ const updatedAt = options.updatedAt ?? new Date().toISOString();
141
+ const snapshot = ensureOpenDataSnapshot(session, updatedAt);
142
+ insertOpenDataEntries(snapshot, Object.entries(values)
143
+ .filter((entry) => isSupportedOpenDataValue(entry[1]))
144
+ .map(([fieldKey, value]) => ({
145
+ fieldKey,
146
+ value,
147
+ source: 'session_open_value',
148
+ freshness: 'session_learned',
149
+ sensitivity: options.sensitivity ?? 'open',
150
+ applicability: options.host
151
+ ? {
152
+ target: 'host',
153
+ value: options.host,
154
+ }
155
+ : {
156
+ target: 'global',
157
+ },
158
+ updatedAt,
159
+ provenance: options.provenance ?? {
160
+ kind: 'data_resolve',
161
+ },
162
+ })), options.host);
163
+ snapshot.updatedAt = updatedAt;
164
+ return assignOpenDataSnapshot(session, snapshot);
165
+ }
166
+ export function getSessionOpenDataValues(session, fieldKey, options = {}) {
167
+ const normalizedFieldKey = normalizeOpenDataFieldKey(fieldKey);
168
+ if (!normalizedFieldKey) {
169
+ return [];
170
+ }
171
+ const entries = session.openDataSnapshot?.valuesByField[normalizedFieldKey] ?? [];
172
+ return entries
173
+ .filter((entry) => entry.applicability.target === 'global' ||
174
+ normalizeScopeValue(entry.applicability.value) === normalizeScopeValue(options.host))
175
+ .sort((left, right) => compareOpenDataEntries(left, right, options.host))
176
+ .map((entry) => cloneOpenDataEntry(entry));
177
+ }
4
178
  function getMagicPayBrowserSessionStore() {
5
179
  return createBrowserSessionStore({
6
180
  rootDir: getMagicPayHomeDir(),
@@ -62,7 +236,8 @@ export function buildWorkflowContextForPersistence(session, resolvedBrowserSessi
62
236
  session.intentSessionId ||
63
237
  session.currentRequestId ||
64
238
  session.lastKnownStatus ||
65
- session.transientSecretCache) &&
239
+ session.transientSecretCache ||
240
+ session.openDataSnapshot) &&
66
241
  resolvedBrowserSessionId
67
242
  ? { browserSessionId: resolvedBrowserSessionId }
68
243
  : {}),
@@ -76,6 +251,7 @@ export function buildWorkflowContextForPersistence(session, resolvedBrowserSessi
76
251
  ? { secretRequestSnapshots: session.secretRequestSnapshots }
77
252
  : {}),
78
253
  ...(session.transientSecretCache ? { transientSecretCache: session.transientSecretCache } : {}),
254
+ ...(session.openDataSnapshot ? { openDataSnapshot: session.openDataSnapshot } : {}),
79
255
  };
80
256
  return Object.keys(workflowContext).length > 0 ? workflowContext : null;
81
257
  }
@@ -94,6 +270,7 @@ export function clearWorkflowState(session) {
94
270
  delete nextSession.secretCatalogByHost;
95
271
  delete nextSession.secretRequestSnapshots;
96
272
  delete nextSession.transientSecretCache;
273
+ delete nextSession.openDataSnapshot;
97
274
  return nextSession;
98
275
  }
99
276
  export function loadWorkflowContext() {
@@ -115,7 +292,7 @@ export function deleteMagicPayBrowserSession() {
115
292
  getMagicPayBrowserSessionStore().delete();
116
293
  }
117
294
  function splitSessionForPersistence(session) {
118
- const { browserSessionId, activeRunId, intentSessionId, currentRequestId, lastKnownStatus, lastEventSeq, secretCatalogByHost, secretRequestSnapshots, transientSecretCache, ...browserSession } = session;
295
+ const { browserSessionId, activeRunId, intentSessionId, currentRequestId, lastKnownStatus, lastEventSeq, secretCatalogByHost, secretRequestSnapshots, transientSecretCache, openDataSnapshot, ...browserSession } = session;
119
296
  return {
120
297
  browserSession: browserSession,
121
298
  workflowContext: buildWorkflowContextForPersistence({
@@ -128,6 +305,7 @@ function splitSessionForPersistence(session) {
128
305
  secretCatalogByHost,
129
306
  secretRequestSnapshots,
130
307
  transientSecretCache,
308
+ openDataSnapshot,
131
309
  }, resolveBrowserSessionId(browserSession)),
132
310
  };
133
311
  }
package/package.json CHANGED
@@ -1,11 +1,17 @@
1
1
  {
2
2
  "name": "@mercuryo-ai/magicpay-home",
3
- "version": "0.1.7",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Internal shared local home/config/state contract for MagicPay product CLIs",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
9
15
  "files": [
10
16
  "dist",
11
17
  "README.md"
@@ -14,8 +20,8 @@
14
20
  "access": "public"
15
21
  },
16
22
  "dependencies": {
17
- "@mercuryo-ai/magicpay-sdk": "0.1.0-test.7",
18
- "@mercuryo-ai/agentbrowse": "0.2.54"
23
+ "@mercuryo-ai/agentbrowse": "0.2.60",
24
+ "@mercuryo-ai/magicpay-sdk": "0.1.2"
19
25
  },
20
26
  "devDependencies": {
21
27
  "@types/node": "^22.0.0",
@@ -23,7 +29,7 @@
23
29
  "vitest": "^4.0.18"
24
30
  },
25
31
  "scripts": {
26
- "build": "pnpm --dir ../.. --filter @mercuryo-ai/agentbrowse build && pnpm --dir ../.. --filter @mercuryo-ai/magicpay-sdk build && node -e \"require('node:fs').rmSync('dist',{ recursive: true, force: true })\" && tsc -p tsconfig.build.json",
32
+ "build": "pnpm --dir ../.. --filter @mercuryo-ai/agentbrowse build && pnpm --dir ../.. --filter @mercuryo-ai/magicpay-sdk build && node -e \"require('node:fs').rmSync('dist',{ recursive: true, force: true, maxRetries: 10, retryDelay: 50 })\" && tsc -p tsconfig.build.json",
27
33
  "check-types": "pnpm --dir ../.. --filter @mercuryo-ai/agentbrowse build && pnpm --dir ../.. --filter @mercuryo-ai/magicpay-sdk build && tsc --noEmit",
28
34
  "pack:verify": "node scripts/verify-pack-artifact.mjs",
29
35
  "smoke:pack-install": "node scripts/verify-pack-install-smoke.mjs",