@mercuryo-ai/magicpay-home 0.1.8 → 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/README.md +3 -3
- package/dist/cli-update-check.d.ts +17 -0
- package/dist/cli-update-check.d.ts.map +1 -0
- package/dist/cli-update-check.js +164 -0
- package/dist/config.d.ts +0 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -10
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/workflow-state.d.ts +40 -1
- package/dist/workflow-state.d.ts.map +1 -1
- package/dist/workflow-state.js +180 -2
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
Shared configuration and state management for the MagicPay CLI family.
|
|
6
6
|
|
|
7
|
-
This package owns the `~/.magicpay` directory
|
|
8
|
-
browser session state, and workflow persistence —
|
|
7
|
+
This package owns the `~/.magicpay` directory layout — configuration files,
|
|
8
|
+
browser session state, and workflow persistence — shared by all three MagicPay
|
|
9
9
|
CLIs:
|
|
10
10
|
|
|
11
11
|
- [`@mercuryo-ai/agentbrowse-cli`](https://www.npmjs.com/package/@mercuryo-ai/agentbrowse-cli) — browser automation
|
|
@@ -23,7 +23,7 @@ You don't need to install or configure it directly.
|
|
|
23
23
|
flags)
|
|
24
24
|
- Browser session persistence across process restarts
|
|
25
25
|
- Workflow state tracking for multi-step protected-form flows
|
|
26
|
-
-
|
|
26
|
+
- Safe concurrent writes when multiple MagicPay CLIs run at once
|
|
27
27
|
|
|
28
28
|
## License
|
|
29
29
|
|
|
@@ -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;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAGpB,MAAM,
|
|
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 {
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
|
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';
|
package/dist/workflow-state.d.ts
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"workflow-state.d.ts","sourceRoot":"","sources":["../src/workflow-state.ts"],"names":[],"mappings":"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"}
|
package/dist/workflow-state.js
CHANGED
|
@@ -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.
|
|
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/agentbrowse": "0.2.
|
|
18
|
-
"@mercuryo-ai/magicpay-sdk": "0.1.
|
|
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",
|