@prompteryx/mcp-server 1.1.0 → 1.1.2
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 +267 -271
- package/dist/auth/api-key-auth.d.ts +27 -0
- package/dist/auth/api-key-auth.d.ts.map +1 -1
- package/dist/auth/api-key-auth.js.map +1 -1
- package/dist/auth/usage-enforcer.d.ts +27 -10
- package/dist/auth/usage-enforcer.d.ts.map +1 -1
- package/dist/auth/usage-enforcer.js +81 -26
- package/dist/auth/usage-enforcer.js.map +1 -1
- package/dist/resources/workflow-resources.d.ts.map +1 -1
- package/dist/resources/workflow-resources.js +2 -0
- package/dist/resources/workflow-resources.js.map +1 -1
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +21 -5
- package/dist/server.js.map +1 -1
- package/dist/tools/ai-browser-tools.js +5 -5
- package/dist/tools/ai-browser-tools.js.map +1 -1
- package/dist/tools/browser-session-manager.d.ts +15 -1
- package/dist/tools/browser-session-manager.d.ts.map +1 -1
- package/dist/tools/browser-session-manager.js +22 -2
- package/dist/tools/browser-session-manager.js.map +1 -1
- package/dist/tools/browser-tools.d.ts.map +1 -1
- package/dist/tools/browser-tools.js +3 -4
- package/dist/tools/browser-tools.js.map +1 -1
- package/dist/tools/connect-hub-tools.d.ts.map +1 -1
- package/dist/tools/connect-hub-tools.js +8 -4
- package/dist/tools/connect-hub-tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Usage Enforcement
|
|
3
3
|
*
|
|
4
|
-
* Pre-checks
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Pre-checks the user's balances before every tool call and records usage
|
|
5
|
+
* after successful execution. The platform routes stay the source of truth
|
|
6
|
+
* for hard limits (AI credits are charged per step, Connect Hub calls are
|
|
7
|
+
* reserved atomically); this is the early, friendly check.
|
|
8
|
+
*
|
|
9
|
+
* Founder decision (19 Sep 2026): access follows the BALANCE, never the plan
|
|
10
|
+
* tier. Since 1 Oct 2026 the balances come from the platform as
|
|
11
|
+
* `auth.balances` (plan allowance left + purchased top-ups):
|
|
12
|
+
* - AI credits = `aiCredits` (plan) + `purchasedAiCredits`. The previous
|
|
13
|
+
* check, `aiCreditsIncluded - aiCreditsUsedThisMonth`, subtracted usage
|
|
14
|
+
* twice (`aiCredits` is already the remaining plan balance) and ignored
|
|
15
|
+
* purchased credits — users with credits left were refused.
|
|
16
|
+
* - cloud minutes = plan minutes left + `purchasedMinutesBalance`.
|
|
17
|
+
* - Connect Hub = plan calls left + `purchasedConnectHubCredits`
|
|
18
|
+
* (+ legacy `purchasedConnectHubCalls`).
|
|
19
|
+
* Older platform builds send no `balances`; the legacy fields are then used.
|
|
8
20
|
*/
|
|
9
21
|
import type { AuthContext } from './api-key-auth.js';
|
|
10
|
-
export type ToolCategory = 'browser' | 'ai-agent' | 'integration' | 'workflow' | 'data';
|
|
22
|
+
export type ToolCategory = 'browser' | 'ai-agent' | 'integration' | 'connect-hub' | 'workflow' | 'data';
|
|
11
23
|
export interface UsageCheckResult {
|
|
12
24
|
allowed: boolean;
|
|
13
25
|
reason?: string;
|
|
@@ -22,6 +34,15 @@ export declare function getTierFeatures(tier: string): {
|
|
|
22
34
|
recordToWorkflow: boolean;
|
|
23
35
|
maxIntegrationServices: number;
|
|
24
36
|
};
|
|
37
|
+
/** Spendable AI credits (plan + purchased). */
|
|
38
|
+
export declare function aiCreditsRemaining(auth: AuthContext): number;
|
|
39
|
+
/**
|
|
40
|
+
* Spendable cloud-browser minutes: a number, `Infinity` when unmetered, or
|
|
41
|
+
* null when unknown (legacy platform reporting no allowance) — null never blocks.
|
|
42
|
+
*/
|
|
43
|
+
export declare function cloudMinutesRemaining(auth: AuthContext): number | null;
|
|
44
|
+
/** Spendable Connect Hub calls (plan + purchased), or null when the platform did not say. */
|
|
45
|
+
export declare function connectHubCallsRemaining(auth: AuthContext): number | null;
|
|
25
46
|
export declare function enforceUsageLimits(auth: AuthContext, category: ToolCategory, executionMode?: 'cloud' | 'local'): UsageCheckResult;
|
|
26
47
|
/**
|
|
27
48
|
* Records usage by calling the platform API.
|
|
@@ -32,9 +53,5 @@ export declare function recordUsage(apiKey: string, apiUrl: string, usage: {
|
|
|
32
53
|
aiCreditsUsed?: number;
|
|
33
54
|
executionCount?: number;
|
|
34
55
|
}): Promise<void>;
|
|
35
|
-
export declare function formatUsageRemaining(auth: AuthContext):
|
|
36
|
-
cloudBrowserMinutes: number;
|
|
37
|
-
aiCredits: number;
|
|
38
|
-
executions: number;
|
|
39
|
-
};
|
|
56
|
+
export declare function formatUsageRemaining(auth: AuthContext): Record<string, string | number | null>;
|
|
40
57
|
//# sourceMappingURL=usage-enforcer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-enforcer.d.ts","sourceRoot":"","sources":["../../src/auth/usage-enforcer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"usage-enforcer.d.ts","sourceRoot":"","sources":["../../src/auth/usage-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC;AAExG,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsDD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM;kBAnD5B,OAAO;aACZ,OAAO;aACP,OAAO;oBACA,OAAO;cACb,OAAO;oBACD,OAAO;sBACL,OAAO;4BACD,MAAM;EA8C/B;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAMtE;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAGzE;AAYD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,YAAY,EACtB,aAAa,GAAE,OAAO,GAAG,OAAiB,GACzC,gBAAgB,CA+DlB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,0CAUrD"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Usage Enforcement
|
|
3
3
|
*
|
|
4
|
-
* Pre-checks
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Pre-checks the user's balances before every tool call and records usage
|
|
5
|
+
* after successful execution. The platform routes stay the source of truth
|
|
6
|
+
* for hard limits (AI credits are charged per step, Connect Hub calls are
|
|
7
|
+
* reserved atomically); this is the early, friendly check.
|
|
8
|
+
*
|
|
9
|
+
* Founder decision (19 Sep 2026): access follows the BALANCE, never the plan
|
|
10
|
+
* tier. Since 1 Oct 2026 the balances come from the platform as
|
|
11
|
+
* `auth.balances` (plan allowance left + purchased top-ups):
|
|
12
|
+
* - AI credits = `aiCredits` (plan) + `purchasedAiCredits`. The previous
|
|
13
|
+
* check, `aiCreditsIncluded - aiCreditsUsedThisMonth`, subtracted usage
|
|
14
|
+
* twice (`aiCredits` is already the remaining plan balance) and ignored
|
|
15
|
+
* purchased credits — users with credits left were refused.
|
|
16
|
+
* - cloud minutes = plan minutes left + `purchasedMinutesBalance`.
|
|
17
|
+
* - Connect Hub = plan calls left + `purchasedConnectHubCredits`
|
|
18
|
+
* (+ legacy `purchasedConnectHubCalls`).
|
|
19
|
+
* Older platform builds send no `balances`; the legacy fields are then used.
|
|
8
20
|
*/
|
|
9
21
|
const TIER_FEATURES = {
|
|
10
22
|
free: {
|
|
@@ -51,38 +63,76 @@ const TIER_FEATURES = {
|
|
|
51
63
|
export function getTierFeatures(tier) {
|
|
52
64
|
return TIER_FEATURES[tier] ?? TIER_FEATURES.free;
|
|
53
65
|
}
|
|
66
|
+
/** Spendable AI credits (plan + purchased). */
|
|
67
|
+
export function aiCreditsRemaining(auth) {
|
|
68
|
+
if (auth.balances)
|
|
69
|
+
return Math.max(0, auth.balances.aiCredits.total);
|
|
70
|
+
return (auth.aiCreditsIncluded ?? 0) - (auth.aiCreditsUsedThisMonth ?? 0);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Spendable cloud-browser minutes: a number, `Infinity` when unmetered, or
|
|
74
|
+
* null when unknown (legacy platform reporting no allowance) — null never blocks.
|
|
75
|
+
*/
|
|
76
|
+
export function cloudMinutesRemaining(auth) {
|
|
77
|
+
const m = auth.balances?.cloudBrowserMinutes;
|
|
78
|
+
if (m)
|
|
79
|
+
return m.remaining == null ? Infinity : Math.max(0, m.remaining);
|
|
80
|
+
const allowed = auth.cloudBrowserMinutesAllowed ?? 0;
|
|
81
|
+
if (!(allowed > 0))
|
|
82
|
+
return null;
|
|
83
|
+
return allowed - (auth.monthlyUsage?.cloudBrowserMinutes ?? 0);
|
|
84
|
+
}
|
|
85
|
+
/** Spendable Connect Hub calls (plan + purchased), or null when the platform did not say. */
|
|
86
|
+
export function connectHubCallsRemaining(auth) {
|
|
87
|
+
const c = auth.balances?.connectHubCalls;
|
|
88
|
+
return c ? Math.max(0, c.remaining) : null;
|
|
89
|
+
}
|
|
90
|
+
function minutesExhaustedReason(auth, agent) {
|
|
91
|
+
const m = auth.balances?.cloudBrowserMinutes;
|
|
92
|
+
const detail = m
|
|
93
|
+
? `${m.planRemaining ?? 0} plan + ${m.purchased} purchased minutes left`
|
|
94
|
+
: `${auth.monthlyUsage?.cloudBrowserMinutes ?? 0}/${auth.cloudBrowserMinutesAllowed ?? 0} this month`;
|
|
95
|
+
return agent
|
|
96
|
+
? `The AI browser agent runs in a cloud browser and your cloud minutes are exhausted (${detail}). Top up, upgrade, or use local mode.`
|
|
97
|
+
: `Cloud browser minutes exhausted (${detail}). Top up or upgrade at prompteryx.ai/pricing, or switch to local execution mode with the Prompteryx Desktop App.`;
|
|
98
|
+
}
|
|
54
99
|
export function enforceUsageLimits(auth, category, executionMode = 'cloud') {
|
|
55
|
-
|
|
56
|
-
|
|
100
|
+
// Operator accounts are uncapped on every platform route too.
|
|
101
|
+
if (auth.balances?.unlimited)
|
|
102
|
+
return { allowed: true };
|
|
103
|
+
// Browser tools in the cloud spend cloud minutes (plan, then purchased).
|
|
57
104
|
if (category === 'browser' && executionMode === 'cloud') {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
reason: 'Cloud browser is not available on the Free plan. Upgrade to Starter (£20/mo) or use local mode with the Prompteryx Desktop App.',
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
if (auth.monthlyUsage.cloudBrowserMinutes >= auth.cloudBrowserMinutesAllowed) {
|
|
65
|
-
return {
|
|
66
|
-
allowed: false,
|
|
67
|
-
reason: `Cloud browser minutes exceeded (${auth.monthlyUsage.cloudBrowserMinutes}/${auth.cloudBrowserMinutesAllowed}). Upgrade your plan or switch to local execution mode.`,
|
|
68
|
-
};
|
|
105
|
+
const left = cloudMinutesRemaining(auth);
|
|
106
|
+
if (left !== null && left <= 0) {
|
|
107
|
+
return { allowed: false, reason: minutesExhaustedReason(auth, false) };
|
|
69
108
|
}
|
|
70
109
|
}
|
|
71
|
-
// AI agent needs credits
|
|
110
|
+
// AI agent needs credits (balance-based, regardless of plan tier)
|
|
72
111
|
if (category === 'ai-agent') {
|
|
73
|
-
|
|
74
|
-
if (remaining <= 0) {
|
|
112
|
+
if (aiCreditsRemaining(auth) <= 0) {
|
|
75
113
|
return {
|
|
76
114
|
allowed: false,
|
|
77
|
-
reason: 'AI credits exhausted.
|
|
115
|
+
reason: 'AI credits exhausted. Buy more at prompteryx.ai (Settings > AI Credits) or upgrade your plan.',
|
|
78
116
|
};
|
|
79
117
|
}
|
|
80
|
-
if (executionMode === 'cloud'
|
|
118
|
+
if (executionMode === 'cloud') {
|
|
119
|
+
const left = cloudMinutesRemaining(auth);
|
|
120
|
+
if (left !== null && left <= 0) {
|
|
121
|
+
return { allowed: false, reason: minutesExhaustedReason(auth, true) };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Connect Hub actions spend Connect Hub calls (plan, then purchased). The
|
|
126
|
+
// platform reserves each call atomically (429 on a cap); this is the early check.
|
|
127
|
+
if (category === 'connect-hub') {
|
|
128
|
+
const left = connectHubCallsRemaining(auth);
|
|
129
|
+
if (left !== null && left <= 0) {
|
|
81
130
|
return {
|
|
82
131
|
allowed: false,
|
|
83
|
-
reason: '
|
|
132
|
+
reason: 'Connect Hub calls exhausted for this month. Add Connect Hub calls on the Subscription page at prompteryx.ai, or wait for the monthly reset.',
|
|
84
133
|
};
|
|
85
134
|
}
|
|
135
|
+
return { allowed: true };
|
|
86
136
|
}
|
|
87
137
|
// Workflow execution counts
|
|
88
138
|
if (category === 'workflow') {
|
|
@@ -125,10 +175,15 @@ export async function recordUsage(apiKey, apiUrl, usage) {
|
|
|
125
175
|
}
|
|
126
176
|
}
|
|
127
177
|
export function formatUsageRemaining(auth) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
178
|
+
const minutes = cloudMinutesRemaining(auth);
|
|
179
|
+
const out = {
|
|
180
|
+
cloudBrowserMinutes: minutes === Infinity ? 'unlimited' : minutes ?? auth.cloudBrowserMinutesAllowed - auth.monthlyUsage.cloudBrowserMinutes,
|
|
181
|
+
aiCredits: aiCreditsRemaining(auth),
|
|
131
182
|
executions: auth.monthlyExecutionsAllowed - auth.monthlyUsage.executions,
|
|
132
183
|
};
|
|
184
|
+
const ch = connectHubCallsRemaining(auth);
|
|
185
|
+
if (ch !== null)
|
|
186
|
+
out.connectHubCalls = ch;
|
|
187
|
+
return out;
|
|
133
188
|
}
|
|
134
189
|
//# sourceMappingURL=usage-enforcer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-enforcer.js","sourceRoot":"","sources":["../../src/auth/usage-enforcer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"usage-enforcer.js","sourceRoot":"","sources":["../../src/auth/usage-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,MAAM,aAAa,GASd;IACH,IAAI,EAAE;QACJ,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK;QACd,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,KAAK;QACf,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;QACvB,sBAAsB,EAAE,CAAC;KAC1B;IACD,OAAO,EAAE;QACP,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,IAAI;QACtB,sBAAsB,EAAE,QAAQ;KACjC;IACD,GAAG,EAAE;QACH,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,IAAI;QACtB,sBAAsB,EAAE,QAAQ;KACjC;IACD,UAAU,EAAE;QACV,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,IAAI;QACtB,sBAAsB,EAAE,QAAQ;KACjC;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,kBAAkB,CAAC,IAAiB;IAClD,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAiB;IACrD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IAC7C,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,OAAO,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,IAAI,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,wBAAwB,CAAC,IAAiB;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;IACzC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAiB,EAAE,KAAc;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC;QACd,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,yBAAyB;QACxE,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,IAAI,CAAC,IAAI,IAAI,CAAC,0BAA0B,IAAI,CAAC,aAAa,CAAC;IACxG,OAAO,KAAK;QACV,CAAC,CAAC,sFAAsF,MAAM,wCAAwC;QACtI,CAAC,CAAC,oCAAoC,MAAM,mHAAmH,CAAC;AACpK,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAiB,EACjB,QAAsB,EACtB,gBAAmC,OAAO;IAE1C,8DAA8D;IAC9D,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEvD,yEAAyE;IACzE,IAAI,QAAQ,KAAK,SAAS,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,+FAA+F;aACxG,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,kFAAkF;IAClF,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,6IAA6I;aACtJ,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,4BAA4B;IAC5B,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,oCAAoC,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,wBAAwB,2CAA2C;aACrJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,oCAAoC,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,wBAAwB,IAAI;aAC9G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,MAAc,EACd,KAIC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,MAAM,sBAAsB,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAiB;IACpD,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAA2C;QAClD,mBAAmB,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB;QAC5I,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC;QACnC,UAAU,EAAE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU;KACzE,CAAC;IACF,MAAM,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,EAAE,KAAK,IAAI;QAAE,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC;IAC1C,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-resources.d.ts","sourceRoot":"","sources":["../../src/resources/workflow-resources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"workflow-resources.d.ts","sourceRoot":"","sources":["../../src/resources/workflow-resources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QA0FxE"}
|
|
@@ -70,6 +70,8 @@ export function registerResources(server, ctx) {
|
|
|
70
70
|
monthlyExecutionsAllowed: auth.monthlyExecutionsAllowed,
|
|
71
71
|
},
|
|
72
72
|
remaining,
|
|
73
|
+
// Plan allowance left + purchased top-ups, as the platform reports them.
|
|
74
|
+
...(auth.balances ? { balances: auth.balances } : {}),
|
|
73
75
|
}, null, 2),
|
|
74
76
|
mimeType: 'application/json',
|
|
75
77
|
}],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-resources.js","sourceRoot":"","sources":["../../src/resources/workflow-resources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQjE,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,GAAoB;IAEvE,iBAAiB;IACjB,MAAM,CAAC,QAAQ,CACb,WAAW,EACX,wBAAwB,EACxB;QACE,WAAW,EAAE,yCAAyC;QACtD,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,wBAAwB;oBAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACpC,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,WAAW,EAAE,CAAC,CAAC,WAAW;4BAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;4BACtB,OAAO,EAAE,CAAC,CAAC,OAAO;yBACnB,CAAC,CAAC;wBACH,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;qBAC7B,EAAE,IAAI,EAAE,CAAC,CAAC;oBACX,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,QAAQ,CACb,aAAa,EACb,0BAA0B,EAC1B;QACE,WAAW,EAAE,6CAA6C;QAC1D,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,0BAA0B;oBAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACxC,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,OAAO,EAAE,CAAC,CAAC,WAAW;4BACtB,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,OAAO,EAAE,CAAC,CAAC,OAAO;yBACnB,CAAC,CAAC;wBACH,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;qBAC/B,EAAE,IAAI,EAAE,CAAC,CAAC;oBACX,QAAQ,EAAE,kBAAkB;iBAC7B,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,cAAc;IACd,MAAM,CAAC,QAAQ,CACb,OAAO,EACP,oBAAoB,EACpB;QACE,WAAW,EAAE,yCAAyC;QACtD,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,oBAAoB;oBACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;wBACvC,KAAK,EAAE,IAAI,CAAC,YAAY;wBACxB,MAAM,EAAE;4BACN,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;4BAC3D,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;4BACzC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;yBACxD;wBACD,SAAS;
|
|
1
|
+
{"version":3,"file":"workflow-resources.js","sourceRoot":"","sources":["../../src/resources/workflow-resources.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -20,7 +20,18 @@ export interface ServerConfig {
|
|
|
20
20
|
* every session would add another pair of process listeners.
|
|
21
21
|
*/
|
|
22
22
|
registerSignalHandlers?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether the cloud browser_* tools may open Browserbase sessions with the
|
|
25
|
+
* BROWSERBASE_* keys in this process's environment. Default true: the stdio
|
|
26
|
+
* binary runs on the user's machine with the user's own environment. The
|
|
27
|
+
* hosted endpoint (/api/mcp) runs inside the Prompteryx server, whose keys are
|
|
28
|
+
* admin-testing-only (Browserbase is not an approved subprocessor for customer
|
|
29
|
+
* data — SOC 2 CC9.2), so it passes true only for admin API keys.
|
|
30
|
+
*/
|
|
31
|
+
allowBrowserbase?: boolean;
|
|
23
32
|
}
|
|
33
|
+
/** Why a hosted, non-admin MCP session cannot open a Browserbase-backed cloud browser. */
|
|
34
|
+
export declare const BROWSERBASE_ADMIN_ONLY_MESSAGE: string;
|
|
24
35
|
export declare function createPrompterxServer(config: ServerConfig): Promise<{
|
|
25
36
|
server: McpServer;
|
|
26
37
|
cleanup: () => Promise<void>;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,0FAA0F;AAC1F,eAAO,MAAM,8BAA8B,QAIqD,CAAC;AAIjG,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,YAAY;;;GAiH/D"}
|
package/dist/server.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
8
|
import { authenticate, refreshAuthContext } from './auth/api-key-auth.js';
|
|
9
|
+
import { recordUsage } from './auth/usage-enforcer.js';
|
|
9
10
|
import { BrowserSessionManager } from './tools/browser-session-manager.js';
|
|
10
11
|
import { registerBrowserTools } from './tools/browser-tools.js';
|
|
11
12
|
import { registerWorkflowTools } from './tools/workflow-tools.js';
|
|
@@ -15,6 +16,11 @@ import { registerConnectHubTools } from './tools/connect-hub-tools.js';
|
|
|
15
16
|
import { registerAiBrowserTools } from './tools/ai-browser-tools.js';
|
|
16
17
|
import { registerDataTools } from './tools/data-tools.js';
|
|
17
18
|
import { registerResources } from './resources/workflow-resources.js';
|
|
19
|
+
/** Why a hosted, non-admin MCP session cannot open a Browserbase-backed cloud browser. */
|
|
20
|
+
export const BROWSERBASE_ADMIN_ONLY_MESSAGE = 'The direct browser_* tools are not available on the hosted Prompteryx MCP endpoint for this account: ' +
|
|
21
|
+
'their cloud browser (Browserbase) is limited to Prompteryx admin testing. Use browser_ai_action (it runs ' +
|
|
22
|
+
'on the Prompteryx cloud browser), run a saved workflow, or run the MCP server locally with ' +
|
|
23
|
+
'PROMPTERYX_EXECUTION_MODE=local to drive your own Chrome through the Prompteryx desktop app.';
|
|
18
24
|
const AUTH_REFRESH_INTERVAL_MS = 60_000; // Refresh auth context every 60 seconds
|
|
19
25
|
export async function createPrompterxServer(config) {
|
|
20
26
|
const { apiKey, apiUrl, executionMode, sessionTimeout, } = config;
|
|
@@ -44,21 +50,31 @@ export async function createPrompterxServer(config) {
|
|
|
44
50
|
// Create MCP server
|
|
45
51
|
const server = new McpServer({
|
|
46
52
|
name: 'prompteryx',
|
|
47
|
-
version: '1.1.
|
|
53
|
+
version: '1.1.2',
|
|
48
54
|
}, {
|
|
49
55
|
capabilities: {
|
|
50
56
|
tools: {},
|
|
51
57
|
resources: {},
|
|
52
58
|
},
|
|
53
59
|
});
|
|
54
|
-
// Browser session manager (shared across browser tools and AI browser)
|
|
55
|
-
|
|
60
|
+
// Browser session manager (shared across browser tools and AI browser).
|
|
61
|
+
// Every cloud session's minutes are reported when it closes, however it
|
|
62
|
+
// closes (tool, idle timeout, end of the MCP session).
|
|
63
|
+
const sessionManager = new BrowserSessionManager(sessionTimeout ?? 300_000, async (minutesUsed) => {
|
|
64
|
+
if (executionMode === 'cloud')
|
|
65
|
+
await recordUsage(apiKey, apiUrl, { cloudBrowserMinutes: minutesUsed });
|
|
66
|
+
});
|
|
67
|
+
// SOC 2 CC9.2: with allowBrowserbase === false (hosted endpoint, non-admin key)
|
|
68
|
+
// the platform's Browserbase keys are never read or sent, and opening a cloud
|
|
69
|
+
// page fails with BROWSERBASE_ADMIN_ONLY_MESSAGE before any Browserbase call.
|
|
70
|
+
const browserbaseAllowed = config.allowBrowserbase !== false;
|
|
56
71
|
const cloudConfig = () => ({
|
|
57
72
|
apiKey,
|
|
58
73
|
apiUrl,
|
|
59
|
-
browserbaseProjectId: process.env.BROWSERBASE_PROJECT_ID ?? '',
|
|
60
|
-
browserbaseApiKey: process.env.BROWSERBASE_API_KEY ?? '',
|
|
74
|
+
browserbaseProjectId: browserbaseAllowed ? (process.env.BROWSERBASE_PROJECT_ID ?? '') : '',
|
|
75
|
+
browserbaseApiKey: browserbaseAllowed ? (process.env.BROWSERBASE_API_KEY ?? '') : '',
|
|
61
76
|
browserbaseContextId: authContext.browserbaseContextId,
|
|
77
|
+
browserbaseDisabledReason: browserbaseAllowed ? undefined : BROWSERBASE_ADMIN_ONLY_MESSAGE,
|
|
62
78
|
stealth: config.stealthMode,
|
|
63
79
|
videoRecording: config.videoRecording,
|
|
64
80
|
});
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAoB,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAA2B,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,18 +7,18 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { defineTool } from '../utils/tool-annotations.js';
|
|
9
9
|
import { z } from 'zod';
|
|
10
|
-
import { enforceUsageLimits, recordUsage, formatUsageRemaining } from '../auth/usage-enforcer.js';
|
|
10
|
+
import { enforceUsageLimits, recordUsage, formatUsageRemaining, aiCreditsRemaining } from '../auth/usage-enforcer.js';
|
|
11
11
|
import { formatError } from '../utils/output-formatter.js';
|
|
12
12
|
export function registerAiBrowserTools(server, ctx) {
|
|
13
13
|
// browser_ai_action
|
|
14
|
-
defineTool(server, 'browser_ai_action', 'AI Browser Agent: Give a natural language instruction and the AI will see the screen and perform complex multi-step browser actions.
|
|
14
|
+
defineTool(server, 'browser_ai_action', 'AI Browser Agent: Give a natural language instruction and the AI will see the screen and perform complex multi-step browser actions. Runs in a cloud browser (default model gemini-3.5-flash). Consumes AI credits and cloud-browser minutes. Say where to start inside the instruction.', {
|
|
15
15
|
instruction: z.string().describe('Natural language instruction (e.g. "Log into my dashboard and download the monthly report")'),
|
|
16
16
|
maxSteps: z.number().optional().describe('Maximum number of AI actions to perform (default: 10)'),
|
|
17
17
|
cloudProfileId: z.string().optional().describe('Reuse a saved cloud profile (its cookies/logins). Omit to use your default cloud profile; pass persistContext:false for a clean throwaway browser.'),
|
|
18
18
|
persistContext: z.boolean().optional().describe('Persist cookies/logins at session close. Defaults true; set false for an ephemeral run.'),
|
|
19
19
|
viewport: z.object({ width: z.number(), height: z.number() }).optional().describe('Viewport size (default 1440x900).'),
|
|
20
|
-
model: z.string().optional().describe('
|
|
21
|
-
aiVision: z.string().optional().describe('
|
|
20
|
+
model: z.string().optional().describe('Browser-agent model id, e.g. gemini-3.5-flash (default), gemini-3.7-flash, claude-sonnet-5-5-vision. Unknown ids are refused with the valid list.'),
|
|
21
|
+
aiVision: z.string().optional().describe('AI Vision quality preset: ultra-saver, low, saver, efficient, balanced, detailed, enhanced, precision, max-precision. Lower = cheaper and faster; higher = reads small text better.'),
|
|
22
22
|
recordSession: z.boolean().optional().describe('Record the run to an MP4.'),
|
|
23
23
|
}, async ({ instruction, maxSteps, cloudProfileId, persistContext, viewport, model, aiVision, recordSession }) => {
|
|
24
24
|
// Check AI agent credits
|
|
@@ -68,7 +68,7 @@ export function registerAiBrowserTools(server, ctx) {
|
|
|
68
68
|
stepsPerformed: data.steps?.length ?? 0,
|
|
69
69
|
actions: data.steps?.map((s) => s.action) ?? [],
|
|
70
70
|
creditsUsed: data.creditsUsed ?? 0,
|
|
71
|
-
creditsRemaining:
|
|
71
|
+
creditsRemaining: Math.max(0, aiCreditsRemaining(ctx.getAuth()) - (data.creditsUsed ?? 0)),
|
|
72
72
|
}, null, 2),
|
|
73
73
|
});
|
|
74
74
|
// Final screenshot if available
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-browser-tools.js","sourceRoot":"","sources":["../../src/tools/ai-browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-browser-tools.js","sourceRoot":"","sources":["../../src/tools/ai-browser-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,12 @@ export interface CloudSessionConfig {
|
|
|
26
26
|
browserbaseProjectId: string;
|
|
27
27
|
browserbaseApiKey: string;
|
|
28
28
|
browserbaseContextId?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Set when this session may not use Browserbase (the hosted endpoint for a
|
|
31
|
+
* non-admin key — SOC 2 CC9.2). Opening a cloud page then throws this message
|
|
32
|
+
* without contacting Browserbase.
|
|
33
|
+
*/
|
|
34
|
+
browserbaseDisabledReason?: string;
|
|
29
35
|
viewport?: {
|
|
30
36
|
width: number;
|
|
31
37
|
height: number;
|
|
@@ -41,7 +47,15 @@ export declare class BrowserSessionManager {
|
|
|
41
47
|
private session;
|
|
42
48
|
private timeoutTimer;
|
|
43
49
|
private timeoutMs;
|
|
44
|
-
|
|
50
|
+
private onCloudSessionClosed?;
|
|
51
|
+
/**
|
|
52
|
+
* `onCloudSessionClosed` fires once for EVERY cloud session that closes —
|
|
53
|
+
* browser_close, the idle timeout, a replaced session and server cleanup —
|
|
54
|
+
* so its minutes are always reported. (1 Oct 2026: only the browser_close
|
|
55
|
+
* tool reported minutes, so sessions that idled out or ended with the MCP
|
|
56
|
+
* session were never billed.)
|
|
57
|
+
*/
|
|
58
|
+
constructor(timeoutMs?: number, onCloudSessionClosed?: (minutesUsed: number) => Promise<void> | void);
|
|
45
59
|
get activeSession(): SessionInfo | null;
|
|
46
60
|
get hasSession(): boolean;
|
|
47
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-session-manager.d.ts","sourceRoot":"","sources":["../../src/tools/browser-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,SAAS,CAAS;
|
|
1
|
+
{"version":3,"file":"browser-session-manager.d.ts","sourceRoot":"","sources":["../../src/tools/browser-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,oBAAoB,CAAC,CAAgD;IAE7E;;;;;;OAMG;gBACS,SAAS,GAAE,MAA2B,EAAE,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAKxH,IAAI,aAAa,IAAI,WAAW,GAAG,IAAI,CAEtC;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAsD5E;;OAEG;YACW,wBAAwB;IAuCtC;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwC5E;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAK3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IA6C/C,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -14,8 +14,17 @@ export class BrowserSessionManager {
|
|
|
14
14
|
session = null;
|
|
15
15
|
timeoutTimer = null;
|
|
16
16
|
timeoutMs;
|
|
17
|
-
|
|
17
|
+
onCloudSessionClosed;
|
|
18
|
+
/**
|
|
19
|
+
* `onCloudSessionClosed` fires once for EVERY cloud session that closes —
|
|
20
|
+
* browser_close, the idle timeout, a replaced session and server cleanup —
|
|
21
|
+
* so its minutes are always reported. (1 Oct 2026: only the browser_close
|
|
22
|
+
* tool reported minutes, so sessions that idled out or ended with the MCP
|
|
23
|
+
* session were never billed.)
|
|
24
|
+
*/
|
|
25
|
+
constructor(timeoutMs = SESSION_TIMEOUT_MS, onCloudSessionClosed) {
|
|
18
26
|
this.timeoutMs = timeoutMs;
|
|
27
|
+
this.onCloudSessionClosed = onCloudSessionClosed;
|
|
19
28
|
}
|
|
20
29
|
get activeSession() {
|
|
21
30
|
return this.session;
|
|
@@ -32,6 +41,10 @@ export class BrowserSessionManager {
|
|
|
32
41
|
this.resetTimeout();
|
|
33
42
|
return this.session;
|
|
34
43
|
}
|
|
44
|
+
// SOC 2 CC9.2: refuse before any Browserbase call when this session may not use it.
|
|
45
|
+
if (config.browserbaseDisabledReason) {
|
|
46
|
+
throw new Error(config.browserbaseDisabledReason);
|
|
47
|
+
}
|
|
35
48
|
// Clean up any existing session first
|
|
36
49
|
await this.close();
|
|
37
50
|
const { chromium } = await import('playwright-core');
|
|
@@ -193,7 +206,14 @@ export class BrowserSessionManager {
|
|
|
193
206
|
catch { /* best effort */ }
|
|
194
207
|
}
|
|
195
208
|
this.session = null;
|
|
196
|
-
|
|
209
|
+
const billed = Math.ceil(minutesUsed);
|
|
210
|
+
if (mode === 'cloud' && billed > 0 && this.onCloudSessionClosed) {
|
|
211
|
+
try {
|
|
212
|
+
await this.onCloudSessionClosed(billed);
|
|
213
|
+
}
|
|
214
|
+
catch { /* best effort — never fail a close on usage reporting */ }
|
|
215
|
+
}
|
|
216
|
+
return { minutesUsed: billed };
|
|
197
217
|
}
|
|
198
218
|
resetTimeout() {
|
|
199
219
|
if (this.timeoutTimer)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-session-manager.js","sourceRoot":"","sources":["../../src/tools/browser-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"browser-session-manager.js","sourceRoot":"","sources":["../../src/tools/browser-session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-tools.d.ts","sourceRoot":"","sources":["../../src/tools/browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAI9F,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,cAAc,EAAE,qBAAqB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,WAAW,EAAE,MAAM,kBAAkB,CAAC;CACvC;AA4BD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"browser-tools.d.ts","sourceRoot":"","sources":["../../src/tools/browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAI9F,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,cAAc,EAAE,qBAAqB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,WAAW,EAAE,MAAM,kBAAkB,CAAC;CACvC;AA4BD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QAuV/E"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { defineTool } from '../utils/tool-annotations.js';
|
|
8
8
|
import { z } from 'zod';
|
|
9
|
-
import { enforceUsageLimits,
|
|
9
|
+
import { enforceUsageLimits, formatUsageRemaining } from '../auth/usage-enforcer.js';
|
|
10
10
|
import { executeBrowserAction } from '../execution/cloud-executor.js';
|
|
11
11
|
import { formatError } from '../utils/output-formatter.js';
|
|
12
12
|
function withUsageCheck(ctx, category, fn) {
|
|
@@ -256,10 +256,9 @@ export function registerBrowserTools(server, ctx) {
|
|
|
256
256
|
});
|
|
257
257
|
// browser_close
|
|
258
258
|
defineTool(server, 'browser_close', 'Close the browser session and release resources. Reports cloud minutes used.', {}, async () => {
|
|
259
|
+
// Minutes are reported by the session manager's close hook (every
|
|
260
|
+
// close path), so this tool must not report them a second time.
|
|
259
261
|
const { minutesUsed } = await ctx.sessionManager.close();
|
|
260
|
-
if (minutesUsed > 0 && ctx.executionMode === 'cloud') {
|
|
261
|
-
await recordUsage(ctx.apiKey, ctx.apiUrl, { cloudBrowserMinutes: minutesUsed });
|
|
262
|
-
}
|
|
263
262
|
return {
|
|
264
263
|
content: [{
|
|
265
264
|
type: 'text',
|