@mercuryo-ai/magicpay-home 0.1.8 → 0.1.11

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 CHANGED
@@ -2,28 +2,85 @@
2
2
 
3
3
  [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
4
 
5
- Shared configuration and state management for the MagicPay CLI family.
5
+ Shared home directory and state contract for the MagicPay CLI family.
6
6
 
7
- This package owns the `~/.magicpay` directory contract configuration files,
8
- browser session state, and workflow persistence used by all three MagicPay
9
- CLIs:
7
+ This package owns `~/.magicpay/`: the on-disk home directory where
8
+ MagicPay's CLIs keep their config, browser session, workflow state, and
9
+ related files. It is not a CLI of its own — it is consumed as a
10
+ dependency by:
10
11
 
11
12
  - [`@mercuryo-ai/agentbrowse-cli`](https://www.npmjs.com/package/@mercuryo-ai/agentbrowse-cli) — browser automation
12
13
  - [`@mercuryo-ai/magicpay-cli`](https://www.npmjs.com/package/@mercuryo-ai/magicpay-cli) — protected-form fills
13
14
  - [`@mercuryo-ai/magicpay-agent-cli`](https://www.npmjs.com/package/@mercuryo-ai/magicpay-agent-cli) — combined browser + payment agent
14
15
 
15
- ## Do I need to install this?
16
+ ## Do I Need To Install This?
16
17
 
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.
18
+ **No.** This package is pulled in automatically as a dependency of the CLIs
19
+ above. You do not need to install or configure it directly.
19
20
 
20
- ## What it provides
21
+ ## Why This Package Exists
21
22
 
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
- - Atomic filesystem writes to prevent corruption from concurrent CLI runs
23
+ The underlying browser library [`@mercuryo-ai/agentbrowse`](https://www.npmjs.com/package/@mercuryo-ai/agentbrowse)
24
+ stores its own state in `~/.agentbrowse/` by default. That default is the
25
+ right behaviour for integrators who embed `@mercuryo-ai/agentbrowse` into
26
+ their own product under their own brand.
27
+
28
+ MagicPay is one such integrator. To keep configuration, browser state,
29
+ and workflow state together under a single directory, `magicpay-home`:
30
+
31
+ 1. Defines the MagicPay home directory at `~/.magicpay/`.
32
+ 2. Overrides the `@mercuryo-ai/agentbrowse` storage hook so the browser
33
+ library writes into `~/.magicpay/` instead of `~/.agentbrowse/` when
34
+ any MagicPay CLI is running.
35
+ 3. Provides typed helpers for the MagicPay-specific files in that same
36
+ directory (config, workflow state, update-check state, etc.).
37
+
38
+ If you build your own product on top of `@mercuryo-ai/agentbrowse`, you
39
+ can apply the same pattern with your own home directory name.
40
+
41
+ ## Directory Layout
42
+
43
+ All paths are relative to `~/.magicpay/` (or the OS equivalent of
44
+ `homedir() + "/.magicpay/"`).
45
+
46
+ | Path | Owner | Purpose | Written by |
47
+ | --- | --- | --- | --- |
48
+ | `config.json` | `magicpay-home` | Shared config: gateway (`apiKey`, `apiUrl`), browser defaults (profile, headless, proxy), updates policy. | `init` on any CLI. |
49
+ | `browser-session.json` | `@mercuryo-ai/agentbrowse` (via override) | CDP endpoint and browser session state so `launch` / `attach` persist across processes. | Every CLI that touches the browser — `agentbrowse-cli`, `magicpay-agent-cli`. |
50
+ | `workflow-state.json` | `magicpay-home` | In-flight protected-form workflow state (open-data snapshot, cached transient secrets, current step). | `magicpay-cli` and `magicpay-agent-cli` only. |
51
+ | `update-state.json` | `magicpay-home` | Last CLI update-check timestamp and cached result. | Any CLI that runs the update check. |
52
+ | `mock-stored-secrets.json` | `magicpay-home` | Development-only mock vault items. Not used in production. | Only when the CLI is run in mock mode. |
53
+ | `mock-secret-requests.json` | `magicpay-home` | Development-only mock secret-request log. Not used in production. | Only when the CLI is run in mock mode. |
54
+ | `profiles/` | `@mercuryo-ai/agentbrowse` (via override) | Per-profile browser user-data directories (cookies, localStorage, cache). | `launch` when a named profile is used. |
55
+ | `runs/` | `magicpay-home` | Per-run telemetry and artefacts. | Any CLI run that records run telemetry. |
56
+
57
+ Rules of thumb when debugging:
58
+
59
+ - **Safe to delete to reset auth:** `config.json`. The next `init` re-creates it.
60
+ - **Safe to delete to reset the browser session:** `browser-session.json`.
61
+ Next `launch` / `attach` starts fresh.
62
+ - **Safe to delete to reset an in-flight workflow:** `workflow-state.json`.
63
+ Any active `magicpay` / `magicpay-agent` session is lost; the next
64
+ `start-session` begins clean.
65
+ - **Do not hand-edit** any of these files — they are managed by the CLIs
66
+ and may be rewritten at any moment.
67
+
68
+ ## What The Package Provides
69
+
70
+ - Typed helpers for reading and writing `config.json`
71
+ (`readMagicPayConfig`, `writeMagicPayConfig`, `doctorMagicPayConfig`).
72
+ - Path helpers for every file and directory above (`getMagicPayHomeDir`,
73
+ `getMagicPayConfigPath`, `getMagicPayBrowserSessionPath`, etc.).
74
+ - Workflow-state helpers for the in-flight protected-form session
75
+ (`loadWorkflowContext`, `saveWorkflowContext`, `clearWorkflowState`).
76
+ - Browser-session helpers (`loadMagicPayBrowserSession`,
77
+ `saveMagicPayBrowserSession`, `deleteMagicPayBrowserSession`) that also
78
+ install the `@mercuryo-ai/agentbrowse` storage override so both packages
79
+ read and write the same file.
80
+ - CLI update-check helper (`checkForPackageUpdate`) with state persisted
81
+ in `update-state.json`.
82
+ - Safe concurrent writes so several MagicPay CLIs can run in the same
83
+ process or side-by-side without corrupting shared files.
27
84
 
28
85
  ## License
29
86
 
@@ -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 MagicPayBrowserSessionCapabilities, type MagicPayBrowserSessionState, 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, supportsMagicPayCaptchaSolve, withMagicPayCaptchaCapability, } 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,kCAAkC,EACvC,KAAK,2BAA2B,EAChC,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,EACnB,4BAA4B,EAC5B,6BAA6B,GAC9B,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, supportsMagicPayCaptchaSolve, withMagicPayCaptchaCapability, } 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,30 @@ export interface MagicPayWorkflowContext {
19
45
  secretCatalogByHost?: Record<string, SecretCatalog>;
20
46
  secretRequestSnapshots?: Record<string, SecretRequestSnapshot>;
21
47
  transientSecretCache?: Record<string, CachedTransientSecretEntry>;
48
+ openDataSnapshot?: SessionOpenDataSnapshot;
49
+ }
50
+ export interface MagicPayBrowserSessionCapabilities {
51
+ captchaSolve?: boolean;
52
+ }
53
+ export interface MagicPayBrowserSessionState extends BrowserSessionState {
54
+ capabilities?: MagicPayBrowserSessionCapabilities;
22
55
  }
23
- export interface MagicPaySession extends BrowserSessionState, MagicPayWorkflowContext {
56
+ export interface MagicPaySession extends MagicPayBrowserSessionState, MagicPayWorkflowContext {
24
57
  }
58
+ export declare function withMagicPayCaptchaCapability<T extends BrowserSessionState>(session: T, captchaSolve?: boolean): T & MagicPayBrowserSessionState;
59
+ export declare function supportsMagicPayCaptchaSolve(session: MagicPayBrowserSessionState | BrowserSessionState | null | undefined): boolean;
60
+ export declare function loadProfileFactsIntoOpenDataSnapshot(session: MagicPayWorkflowContext, profileFacts: MagicPayProfileFacts, options?: {
61
+ loadedAt?: string;
62
+ }): SessionOpenDataSnapshot;
63
+ export declare function mergeSessionOpenDataValues(session: MagicPayWorkflowContext, values: Record<string, unknown>, options?: {
64
+ host?: string;
65
+ updatedAt?: string;
66
+ provenance?: SessionOpenDataProvenance;
67
+ sensitivity?: SessionOpenDataSensitivity;
68
+ }): SessionOpenDataSnapshot;
69
+ export declare function getSessionOpenDataValues(session: MagicPayWorkflowContext, fieldKey: string, options?: {
70
+ host?: string;
71
+ }): SessionOpenDataEntry[];
25
72
  export declare function cleanupTransientSecretCache(session: MagicPayWorkflowContext, options?: {
26
73
  now?: string;
27
74
  }): boolean;
@@ -36,8 +83,8 @@ export declare function clearWorkflowState(session: MagicPaySession): MagicPaySe
36
83
  export declare function loadWorkflowContext(): MagicPayWorkflowContext | null;
37
84
  export declare function saveWorkflowContext(context: MagicPayWorkflowContext): void;
38
85
  export declare function deleteWorkflowContext(): void;
39
- export declare function saveMagicPayBrowserSession(session: BrowserSessionState): void;
40
- export declare function loadMagicPayBrowserSession(): BrowserSessionState | null;
86
+ export declare function saveMagicPayBrowserSession(session: MagicPayBrowserSessionState): void;
87
+ export declare function loadMagicPayBrowserSession(): MagicPayBrowserSessionState | null;
41
88
  export declare function deleteMagicPayBrowserSession(): void;
42
89
  export declare function saveMagicPaySession(session: MagicPaySession): void;
43
90
  export declare function loadMagicPaySession(): MagicPaySession | null;
@@ -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,193 @@
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
+ export function withMagicPayCaptchaCapability(session, captchaSolve = true) {
5
+ const currentCapabilities = session.capabilities;
6
+ return {
7
+ ...session,
8
+ capabilities: {
9
+ ...(currentCapabilities ?? {}),
10
+ captchaSolve,
11
+ },
12
+ };
13
+ }
14
+ export function supportsMagicPayCaptchaSolve(session) {
15
+ return session?.capabilities?.captchaSolve === true;
16
+ }
17
+ function isSupportedOpenDataValue(value) {
18
+ return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value));
19
+ }
20
+ function cloneOpenDataEntry(entry) {
21
+ return {
22
+ ...entry,
23
+ applicability: { ...entry.applicability },
24
+ provenance: { ...entry.provenance },
25
+ };
26
+ }
27
+ function cloneOpenDataSnapshot(snapshot) {
28
+ return {
29
+ version: 1,
30
+ updatedAt: snapshot.updatedAt,
31
+ valuesByField: Object.fromEntries(Object.entries(snapshot.valuesByField).map(([fieldKey, entries]) => [
32
+ fieldKey,
33
+ entries.map((entry) => cloneOpenDataEntry(entry)),
34
+ ])),
35
+ };
36
+ }
37
+ function normalizeOpenDataFieldKey(fieldKey) {
38
+ return fieldKey.trim();
39
+ }
40
+ function normalizeScopeValue(value) {
41
+ return value?.trim().toLowerCase() ?? '';
42
+ }
43
+ function openDataScopeRank(entry, host) {
44
+ if (entry.applicability.target === 'host') {
45
+ return normalizeScopeValue(entry.applicability.value) === normalizeScopeValue(host) ? 4 : 1;
46
+ }
47
+ return 2;
48
+ }
49
+ function openDataSourceRank(source) {
50
+ return source === 'session_open_value' ? 2 : 1;
51
+ }
52
+ function openDataFreshnessRank(freshness) {
53
+ return freshness === 'session_learned' ? 2 : 1;
54
+ }
55
+ function compareOpenDataEntries(left, right, host) {
56
+ const scopeRank = openDataScopeRank(right, host) - openDataScopeRank(left, host);
57
+ if (scopeRank !== 0) {
58
+ return scopeRank;
59
+ }
60
+ const sourceRank = openDataSourceRank(right.source) - openDataSourceRank(left.source);
61
+ if (sourceRank !== 0) {
62
+ return sourceRank;
63
+ }
64
+ const freshnessRank = openDataFreshnessRank(right.freshness) - openDataFreshnessRank(left.freshness);
65
+ if (freshnessRank !== 0) {
66
+ return freshnessRank;
67
+ }
68
+ return right.updatedAt.localeCompare(left.updatedAt);
69
+ }
70
+ function openDataEntryIdentity(entry) {
71
+ return [
72
+ normalizeOpenDataFieldKey(entry.fieldKey),
73
+ entry.applicability.target,
74
+ normalizeScopeValue(entry.applicability.value),
75
+ entry.value,
76
+ ].join('::');
77
+ }
78
+ function pruneEmptyOpenDataFields(snapshot) {
79
+ for (const [fieldKey, entries] of Object.entries(snapshot.valuesByField)) {
80
+ if (entries.length === 0) {
81
+ delete snapshot.valuesByField[fieldKey];
82
+ }
83
+ }
84
+ }
85
+ function assignOpenDataSnapshot(session, snapshot) {
86
+ pruneEmptyOpenDataFields(snapshot);
87
+ if (Object.keys(snapshot.valuesByField).length === 0) {
88
+ delete session.openDataSnapshot;
89
+ return {
90
+ version: 1,
91
+ updatedAt: snapshot.updatedAt,
92
+ valuesByField: {},
93
+ };
94
+ }
95
+ session.openDataSnapshot = snapshot;
96
+ return snapshot;
97
+ }
98
+ function ensureOpenDataSnapshot(session, updatedAt) {
99
+ const current = session.openDataSnapshot ? cloneOpenDataSnapshot(session.openDataSnapshot) : null;
100
+ return (current ?? {
101
+ version: 1,
102
+ updatedAt,
103
+ valuesByField: {},
104
+ });
105
+ }
106
+ function insertOpenDataEntries(snapshot, entries, host) {
107
+ for (const entry of entries) {
108
+ const fieldKey = normalizeOpenDataFieldKey(entry.fieldKey);
109
+ if (!fieldKey) {
110
+ continue;
111
+ }
112
+ const nextEntry = cloneOpenDataEntry({
113
+ ...entry,
114
+ fieldKey,
115
+ });
116
+ const existingEntries = snapshot.valuesByField[fieldKey] ?? [];
117
+ const dedupeKey = openDataEntryIdentity(nextEntry);
118
+ const nextEntries = existingEntries
119
+ .filter((existing) => openDataEntryIdentity(existing) !== dedupeKey)
120
+ .concat(nextEntry)
121
+ .sort((left, right) => compareOpenDataEntries(left, right, host));
122
+ snapshot.valuesByField[fieldKey] = nextEntries;
123
+ }
124
+ }
125
+ export function loadProfileFactsIntoOpenDataSnapshot(session, profileFacts, options = {}) {
126
+ const loadedAt = options.loadedAt ?? new Date().toISOString();
127
+ const snapshot = ensureOpenDataSnapshot(session, loadedAt);
128
+ for (const [fieldKey, entries] of Object.entries(snapshot.valuesByField)) {
129
+ snapshot.valuesByField[fieldKey] = entries.filter((entry) => entry.source !== 'profile_facts');
130
+ }
131
+ pruneEmptyOpenDataFields(snapshot);
132
+ insertOpenDataEntries(snapshot, Object.entries(profileFacts.facts)
133
+ .filter((entry) => isSupportedOpenDataValue(entry[1]))
134
+ .map(([fieldKey, value]) => ({
135
+ fieldKey,
136
+ value,
137
+ source: 'profile_facts',
138
+ freshness: 'profile_snapshot',
139
+ sensitivity: 'open',
140
+ applicability: {
141
+ target: 'global',
142
+ },
143
+ updatedAt: loadedAt,
144
+ factsUpdatedAt: profileFacts.updatedAt,
145
+ provenance: {
146
+ kind: 'profile_facts',
147
+ },
148
+ })), undefined);
149
+ snapshot.updatedAt = loadedAt;
150
+ return assignOpenDataSnapshot(session, snapshot);
151
+ }
152
+ export function mergeSessionOpenDataValues(session, values, options = {}) {
153
+ const updatedAt = options.updatedAt ?? new Date().toISOString();
154
+ const snapshot = ensureOpenDataSnapshot(session, updatedAt);
155
+ insertOpenDataEntries(snapshot, Object.entries(values)
156
+ .filter((entry) => isSupportedOpenDataValue(entry[1]))
157
+ .map(([fieldKey, value]) => ({
158
+ fieldKey,
159
+ value,
160
+ source: 'session_open_value',
161
+ freshness: 'session_learned',
162
+ sensitivity: options.sensitivity ?? 'open',
163
+ applicability: options.host
164
+ ? {
165
+ target: 'host',
166
+ value: options.host,
167
+ }
168
+ : {
169
+ target: 'global',
170
+ },
171
+ updatedAt,
172
+ provenance: options.provenance ?? {
173
+ kind: 'data_resolve',
174
+ },
175
+ })), options.host);
176
+ snapshot.updatedAt = updatedAt;
177
+ return assignOpenDataSnapshot(session, snapshot);
178
+ }
179
+ export function getSessionOpenDataValues(session, fieldKey, options = {}) {
180
+ const normalizedFieldKey = normalizeOpenDataFieldKey(fieldKey);
181
+ if (!normalizedFieldKey) {
182
+ return [];
183
+ }
184
+ const entries = session.openDataSnapshot?.valuesByField[normalizedFieldKey] ?? [];
185
+ return entries
186
+ .filter((entry) => entry.applicability.target === 'global' ||
187
+ normalizeScopeValue(entry.applicability.value) === normalizeScopeValue(options.host))
188
+ .sort((left, right) => compareOpenDataEntries(left, right, options.host))
189
+ .map((entry) => cloneOpenDataEntry(entry));
190
+ }
4
191
  function getMagicPayBrowserSessionStore() {
5
192
  return createBrowserSessionStore({
6
193
  rootDir: getMagicPayHomeDir(),
@@ -62,7 +249,8 @@ export function buildWorkflowContextForPersistence(session, resolvedBrowserSessi
62
249
  session.intentSessionId ||
63
250
  session.currentRequestId ||
64
251
  session.lastKnownStatus ||
65
- session.transientSecretCache) &&
252
+ session.transientSecretCache ||
253
+ session.openDataSnapshot) &&
66
254
  resolvedBrowserSessionId
67
255
  ? { browserSessionId: resolvedBrowserSessionId }
68
256
  : {}),
@@ -76,6 +264,7 @@ export function buildWorkflowContextForPersistence(session, resolvedBrowserSessi
76
264
  ? { secretRequestSnapshots: session.secretRequestSnapshots }
77
265
  : {}),
78
266
  ...(session.transientSecretCache ? { transientSecretCache: session.transientSecretCache } : {}),
267
+ ...(session.openDataSnapshot ? { openDataSnapshot: session.openDataSnapshot } : {}),
79
268
  };
80
269
  return Object.keys(workflowContext).length > 0 ? workflowContext : null;
81
270
  }
@@ -94,6 +283,7 @@ export function clearWorkflowState(session) {
94
283
  delete nextSession.secretCatalogByHost;
95
284
  delete nextSession.secretRequestSnapshots;
96
285
  delete nextSession.transientSecretCache;
286
+ delete nextSession.openDataSnapshot;
97
287
  return nextSession;
98
288
  }
99
289
  export function loadWorkflowContext() {
@@ -115,7 +305,7 @@ export function deleteMagicPayBrowserSession() {
115
305
  getMagicPayBrowserSessionStore().delete();
116
306
  }
117
307
  function splitSessionForPersistence(session) {
118
- const { browserSessionId, activeRunId, intentSessionId, currentRequestId, lastKnownStatus, lastEventSeq, secretCatalogByHost, secretRequestSnapshots, transientSecretCache, ...browserSession } = session;
308
+ const { browserSessionId, activeRunId, intentSessionId, currentRequestId, lastKnownStatus, lastEventSeq, secretCatalogByHost, secretRequestSnapshots, transientSecretCache, openDataSnapshot, ...browserSession } = session;
119
309
  return {
120
310
  browserSession: browserSession,
121
311
  workflowContext: buildWorkflowContextForPersistence({
@@ -128,6 +318,7 @@ function splitSessionForPersistence(session) {
128
318
  secretCatalogByHost,
129
319
  secretRequestSnapshots,
130
320
  transientSecretCache,
321
+ openDataSnapshot,
131
322
  }, resolveBrowserSessionId(browserSession)),
132
323
  };
133
324
  }
package/package.json CHANGED
@@ -1,11 +1,17 @@
1
1
  {
2
2
  "name": "@mercuryo-ai/magicpay-home",
3
- "version": "0.1.8",
3
+ "version": "0.1.11",
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.57",
18
- "@mercuryo-ai/magicpay-sdk": "0.1.1"
23
+ "@mercuryo-ai/agentbrowse": "0.2.63",
24
+ "@mercuryo-ai/magicpay-sdk": "0.1.3"
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",