@superblocksteam/gateway 2.0.155-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +87 -0
- package/README.md +170 -0
- package/dist/agents/resolve-orchestrator-url.d.ts +22 -0
- package/dist/agents/resolve-orchestrator-url.js +38 -0
- package/dist/agents/resolve-orchestrator-url.js.map +1 -0
- package/dist/capabilities/import-prompt.d.ts +11 -0
- package/dist/capabilities/import-prompt.js +96 -0
- package/dist/capabilities/import-prompt.js.map +1 -0
- package/dist/capabilities/lifecycle.d.ts +73 -0
- package/dist/capabilities/lifecycle.js +2531 -0
- package/dist/capabilities/lifecycle.js.map +1 -0
- package/dist/capabilities/persisted-progress.d.ts +46 -0
- package/dist/capabilities/persisted-progress.js +246 -0
- package/dist/capabilities/persisted-progress.js.map +1 -0
- package/dist/capabilities/types.d.ts +446 -0
- package/dist/capabilities/types.js +47 -0
- package/dist/capabilities/types.js.map +1 -0
- package/dist/capture/browser-contract.d.ts +36 -0
- package/dist/capture/browser-contract.js +24 -0
- package/dist/capture/browser-contract.js.map +1 -0
- package/dist/capture/browser-instructions.d.ts +9 -0
- package/dist/capture/browser-instructions.js +17 -0
- package/dist/capture/browser-instructions.js.map +1 -0
- package/dist/capture/capture-library-probe.d.ts +55 -0
- package/dist/capture/capture-library-probe.js +177 -0
- package/dist/capture/capture-library-probe.js.map +1 -0
- package/dist/capture/capture-library.d.ts +52 -0
- package/dist/capture/capture-library.js +249 -0
- package/dist/capture/capture-library.js.map +1 -0
- package/dist/capture/classify-library-paint.d.ts +21 -0
- package/dist/capture/classify-library-paint.js +13 -0
- package/dist/capture/classify-library-paint.js.map +1 -0
- package/dist/capture/host-mcp-scan.d.ts +16 -0
- package/dist/capture/host-mcp-scan.js +64 -0
- package/dist/capture/host-mcp-scan.js.map +1 -0
- package/dist/capture/library-parent-script.d.ts +34 -0
- package/dist/capture/library-parent-script.js +82 -0
- package/dist/capture/library-parent-script.js.map +1 -0
- package/dist/capture/mode.d.ts +22 -0
- package/dist/capture/mode.js +45 -0
- package/dist/capture/mode.js.map +1 -0
- package/dist/config.d.ts +141 -0
- package/dist/config.js +109 -0
- package/dist/config.js.map +1 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.js +9 -0
- package/dist/debug.js.map +1 -0
- package/dist/deps.d.ts +36 -0
- package/dist/deps.js +2 -0
- package/dist/deps.js.map +1 -0
- package/dist/events/cursor.d.ts +43 -0
- package/dist/events/cursor.js +78 -0
- package/dist/events/cursor.js.map +1 -0
- package/dist/events/memory-event-store.d.ts +34 -0
- package/dist/events/memory-event-store.js +110 -0
- package/dist/events/memory-event-store.js.map +1 -0
- package/dist/events/merge.d.ts +23 -0
- package/dist/events/merge.js +97 -0
- package/dist/events/merge.js.map +1 -0
- package/dist/events/normalized-collector.d.ts +62 -0
- package/dist/events/normalized-collector.js +156 -0
- package/dist/events/normalized-collector.js.map +1 -0
- package/dist/events/schema.d.ts +9 -0
- package/dist/events/schema.js +93 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/snapshot.d.ts +32 -0
- package/dist/events/snapshot.js +57 -0
- package/dist/events/snapshot.js.map +1 -0
- package/dist/events/stream-key.d.ts +2 -0
- package/dist/events/stream-key.js +31 -0
- package/dist/events/stream-key.js.map +1 -0
- package/dist/events/types.d.ts +179 -0
- package/dist/events/types.js +66 -0
- package/dist/events/types.js.map +1 -0
- package/dist/health/readiness.d.ts +99 -0
- package/dist/health/readiness.js +202 -0
- package/dist/health/readiness.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/filters.d.ts +8 -0
- package/dist/integrations/filters.js +40 -0
- package/dist/integrations/filters.js.map +1 -0
- package/dist/integrations/map.d.ts +26 -0
- package/dist/integrations/map.js +43 -0
- package/dist/integrations/map.js.map +1 -0
- package/dist/integrations/profile-key.d.ts +19 -0
- package/dist/integrations/profile-key.js +35 -0
- package/dist/integrations/profile-key.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/orchestrator/client.d.ts +62 -0
- package/dist/orchestrator/client.js +160 -0
- package/dist/orchestrator/client.js.map +1 -0
- package/dist/playwright/ensure-chromium.d.ts +26 -0
- package/dist/playwright/ensure-chromium.js +60 -0
- package/dist/playwright/ensure-chromium.js.map +1 -0
- package/dist/preview/capture-screenshot.d.ts +52 -0
- package/dist/preview/capture-screenshot.js +158 -0
- package/dist/preview/capture-screenshot.js.map +1 -0
- package/dist/preview/viewer-url.d.ts +82 -0
- package/dist/preview/viewer-url.js +128 -0
- package/dist/preview/viewer-url.js.map +1 -0
- package/dist/process/fault-barrier.d.ts +55 -0
- package/dist/process/fault-barrier.js +113 -0
- package/dist/process/fault-barrier.js.map +1 -0
- package/dist/resume/memory-progress-store.d.ts +39 -0
- package/dist/resume/memory-progress-store.js +82 -0
- package/dist/resume/memory-progress-store.js.map +1 -0
- package/dist/resume/memory-recent-app-store.d.ts +14 -0
- package/dist/resume/memory-recent-app-store.js +27 -0
- package/dist/resume/memory-recent-app-store.js.map +1 -0
- package/dist/resume/memory-turn-store.d.ts +18 -0
- package/dist/resume/memory-turn-store.js +73 -0
- package/dist/resume/memory-turn-store.js.map +1 -0
- package/dist/resume/progress-key.d.ts +21 -0
- package/dist/resume/progress-key.js +58 -0
- package/dist/resume/progress-key.js.map +1 -0
- package/dist/resume/stores.d.ts +14 -0
- package/dist/resume/stores.js +18 -0
- package/dist/resume/stores.js.map +1 -0
- package/dist/resume/types.d.ts +124 -0
- package/dist/resume/types.js +13 -0
- package/dist/resume/types.js.map +1 -0
- package/dist/sabs/agent-facing-text.d.ts +33 -0
- package/dist/sabs/agent-facing-text.js +125 -0
- package/dist/sabs/agent-facing-text.js.map +1 -0
- package/dist/sabs/browser-context.d.ts +53 -0
- package/dist/sabs/browser-context.js +91 -0
- package/dist/sabs/browser-context.js.map +1 -0
- package/dist/sabs/editor-client-methods.d.ts +147 -0
- package/dist/sabs/editor-client-methods.js +715 -0
- package/dist/sabs/editor-client-methods.js.map +1 -0
- package/dist/sabs/recent-tool-runs.d.ts +14 -0
- package/dist/sabs/recent-tool-runs.js +61 -0
- package/dist/sabs/recent-tool-runs.js.map +1 -0
- package/dist/sabs/session-peer.d.ts +351 -0
- package/dist/sabs/session-peer.js +2 -0
- package/dist/sabs/session-peer.js.map +1 -0
- package/dist/sabs/turn-collector.d.ts +152 -0
- package/dist/sabs/turn-collector.js +573 -0
- package/dist/sabs/turn-collector.js.map +1 -0
- package/dist/sabs/websocket-session-peer.d.ts +514 -0
- package/dist/sabs/websocket-session-peer.js +2487 -0
- package/dist/sabs/websocket-session-peer.js.map +1 -0
- package/dist/security/constant-time.d.ts +9 -0
- package/dist/security/constant-time.js +13 -0
- package/dist/security/constant-time.js.map +1 -0
- package/dist/server/client.d.ts +371 -0
- package/dist/server/client.js +572 -0
- package/dist/server/client.js.map +1 -0
- package/dist/server/identity-reads.d.ts +76 -0
- package/dist/server/identity-reads.js +209 -0
- package/dist/server/identity-reads.js.map +1 -0
- package/dist/start.d.ts +14 -0
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +32 -0
- package/dist/telemetry/metrics.js +57 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/transports/mcp/admin-tools.d.ts +47 -0
- package/dist/transports/mcp/admin-tools.js +164 -0
- package/dist/transports/mcp/admin-tools.js.map +1 -0
- package/dist/transports/mcp/app-status-html.d.ts +15 -0
- package/dist/transports/mcp/app-status-html.js +563 -0
- package/dist/transports/mcp/app-status-html.js.map +1 -0
- package/dist/transports/mcp/decision-elicitation.d.ts +74 -0
- package/dist/transports/mcp/decision-elicitation.js +233 -0
- package/dist/transports/mcp/decision-elicitation.js.map +1 -0
- package/dist/transports/mcp/dispatch-probe.d.ts +24 -0
- package/dist/transports/mcp/dispatch-probe.js +48 -0
- package/dist/transports/mcp/dispatch-probe.js.map +1 -0
- package/dist/transports/mcp/format-tool-content.d.ts +25 -0
- package/dist/transports/mcp/format-tool-content.js +48 -0
- package/dist/transports/mcp/format-tool-content.js.map +1 -0
- package/dist/transports/mcp/mount.d.ts +9 -0
- package/dist/transports/mcp/mount.js +469 -0
- package/dist/transports/mcp/mount.js.map +1 -0
- package/dist/transports/mcp/progress-notifier.d.ts +39 -0
- package/dist/transports/mcp/progress-notifier.js +52 -0
- package/dist/transports/mcp/progress-notifier.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stderr probe for live-library capture when canvas execute is unhealthy.
|
|
3
|
+
* Used to tell CORS / 401 / pending-abort apart from Clark testApi. Do not
|
|
4
|
+
* log tokens. Success (v3/execute POST 200) stays quiet. CORS preflight is
|
|
5
|
+
* not execute.
|
|
6
|
+
*/
|
|
7
|
+
const ANSWERED_PARENT_TYPES = new Set([
|
|
8
|
+
"authenticate-api-request",
|
|
9
|
+
"sb-editor-request-bootstrap",
|
|
10
|
+
"sb-ready",
|
|
11
|
+
]);
|
|
12
|
+
const CONSOLE_KEEP = /api-store|no active agent|failed to execute|authenticate|failed to fetch|cors|net::err/i;
|
|
13
|
+
export function isLibraryExecuteUrl(url) {
|
|
14
|
+
try {
|
|
15
|
+
const path = new URL(url).pathname;
|
|
16
|
+
return /\/v[23]\/execute(?:\/stream)?\/?$/.test(path);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function isLibraryExecuteProbe(method, url) {
|
|
23
|
+
return method.toUpperCase() === "POST" && isLibraryExecuteUrl(url);
|
|
24
|
+
}
|
|
25
|
+
export function redactCaptureUrl(url) {
|
|
26
|
+
try {
|
|
27
|
+
const parsed = new URL(url);
|
|
28
|
+
return `${parsed.origin}${parsed.pathname}`;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return url;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function redactCaptureSecrets(text) {
|
|
35
|
+
return text
|
|
36
|
+
.replace(/Bearer\s+\S+/gi, "Bearer [redacted]")
|
|
37
|
+
.replace(/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9._-]+/g, "[redacted-jwt]");
|
|
38
|
+
}
|
|
39
|
+
export function executeStillInFlight(execute) {
|
|
40
|
+
return execute.some((row) => row.status === undefined && row.failure === undefined);
|
|
41
|
+
}
|
|
42
|
+
function clip(text) {
|
|
43
|
+
const collapsed = text.replace(/\s+/g, " ").trim();
|
|
44
|
+
if (collapsed.length <= 240) {
|
|
45
|
+
return collapsed;
|
|
46
|
+
}
|
|
47
|
+
return `${collapsed.slice(0, 237)}...`;
|
|
48
|
+
}
|
|
49
|
+
export function shouldKeepCaptureConsole(text) {
|
|
50
|
+
return CONSOLE_KEEP.test(text);
|
|
51
|
+
}
|
|
52
|
+
export function summarizeCaptureProbe(input) {
|
|
53
|
+
const parent = input.parentEvents.map((event) => event.type);
|
|
54
|
+
const unanswered = parent.filter((type) => !ANSWERED_PARENT_TYPES.has(type));
|
|
55
|
+
let agentHost;
|
|
56
|
+
if (input.agentUrl) {
|
|
57
|
+
try {
|
|
58
|
+
agentHost = new URL(input.agentUrl).hostname;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
agentHost = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
...(agentHost ? { agentHost } : {}),
|
|
66
|
+
console: input.consoleText
|
|
67
|
+
.filter(shouldKeepCaptureConsole)
|
|
68
|
+
.map((text) => clip(redactCaptureSecrets(text))),
|
|
69
|
+
execute: input.execute.map((row) => ({
|
|
70
|
+
...(row.failure ? { failure: row.failure } : {}),
|
|
71
|
+
method: row.method,
|
|
72
|
+
path: row.path,
|
|
73
|
+
...(row.status === undefined && row.failure === undefined
|
|
74
|
+
? { pending: true }
|
|
75
|
+
: {}),
|
|
76
|
+
...(row.status !== undefined ? { status: row.status } : {}),
|
|
77
|
+
})),
|
|
78
|
+
pageErrors: input.pageErrors.map((text) => clip(redactCaptureSecrets(text))),
|
|
79
|
+
paint: {
|
|
80
|
+
innerText: clip(input.paintInnerText),
|
|
81
|
+
kind: input.paintKind,
|
|
82
|
+
},
|
|
83
|
+
parent,
|
|
84
|
+
unanswered,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function upsertExecute(collector, row) {
|
|
88
|
+
const open = collector.execute.find((existing) => existing.method === row.method &&
|
|
89
|
+
existing.path === row.path &&
|
|
90
|
+
existing.status === undefined &&
|
|
91
|
+
existing.failure === undefined);
|
|
92
|
+
if (open) {
|
|
93
|
+
if (row.status !== undefined) {
|
|
94
|
+
open.status = row.status;
|
|
95
|
+
}
|
|
96
|
+
if (row.failure !== undefined) {
|
|
97
|
+
open.failure = row.failure;
|
|
98
|
+
}
|
|
99
|
+
if (!open.method) {
|
|
100
|
+
open.method = row.method;
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
collector.execute.push({
|
|
105
|
+
method: row.method,
|
|
106
|
+
path: row.path,
|
|
107
|
+
...(row.failure ? { failure: row.failure } : {}),
|
|
108
|
+
...(row.status !== undefined ? { status: row.status } : {}),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
export function attachLibraryCaptureProbe(page, collector) {
|
|
112
|
+
page.on("request", (arg) => {
|
|
113
|
+
const request = arg;
|
|
114
|
+
const url = request.url();
|
|
115
|
+
const method = request.method();
|
|
116
|
+
if (!isLibraryExecuteProbe(method, url)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
collector.execute.push({
|
|
120
|
+
method,
|
|
121
|
+
path: redactCaptureUrl(url),
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
page.on("response", (arg) => {
|
|
125
|
+
const response = arg;
|
|
126
|
+
const url = response.url();
|
|
127
|
+
const method = response.request?.().method() ?? "POST";
|
|
128
|
+
if (!isLibraryExecuteProbe(method, url)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
upsertExecute(collector, {
|
|
132
|
+
method,
|
|
133
|
+
path: redactCaptureUrl(url),
|
|
134
|
+
status: response.status(),
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
page.on("requestfailed", (arg) => {
|
|
138
|
+
const request = arg;
|
|
139
|
+
const url = request.url();
|
|
140
|
+
const method = request.method();
|
|
141
|
+
if (!isLibraryExecuteProbe(method, url)) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const failed = request.failure?.();
|
|
145
|
+
upsertExecute(collector, {
|
|
146
|
+
failure: failed?.errorText ?? "requestfailed",
|
|
147
|
+
method,
|
|
148
|
+
path: redactCaptureUrl(url),
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
page.on("console", (arg) => {
|
|
152
|
+
const message = arg;
|
|
153
|
+
const text = message.text();
|
|
154
|
+
if (message.type() === "error" || shouldKeepCaptureConsole(text)) {
|
|
155
|
+
collector.consoleText.push(text);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
page.on("pageerror", (arg) => {
|
|
159
|
+
collector.pageErrors.push(arg instanceof Error ? arg.message : String(arg));
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
export function shouldLogCaptureProbe(summary) {
|
|
163
|
+
if (summary.pageErrors.length > 0) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (summary.execute.length === 0) {
|
|
167
|
+
return /\bloading\b/i.test(summary.paint.innerText);
|
|
168
|
+
}
|
|
169
|
+
return summary.execute.some((row) => row.pending === true || row.failure !== undefined || row.status !== 200);
|
|
170
|
+
}
|
|
171
|
+
export function logCaptureProbe(summary) {
|
|
172
|
+
if (!shouldLogCaptureProbe(summary)) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
console.error("gateway live canvas capture probe", summary);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=capture-library-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-library-probe.js","sourceRoot":"","sources":["../../src/capture/capture-library-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless capture of the live library iframe (pitcherURL) for MCP image
|
|
3
|
+
* content. Top-level goto + mock parent, never the Superblocks edit URL.
|
|
4
|
+
*
|
|
5
|
+
* Best-effort: callers must succeed with URLs alone when this returns
|
|
6
|
+
* undefined. Output is capped like preview capture.
|
|
7
|
+
*/
|
|
8
|
+
import { type CaptureParentEvent } from "./capture-library-probe.js";
|
|
9
|
+
import { type LibraryPaint } from "./classify-library-paint.js";
|
|
10
|
+
import { type LibraryParentPayload } from "./library-parent-script.js";
|
|
11
|
+
export type LibraryScreenshot = {
|
|
12
|
+
dataBase64: string;
|
|
13
|
+
mimeType: "image/jpeg";
|
|
14
|
+
};
|
|
15
|
+
export type CaptureLibraryScreenshotInput = LibraryParentPayload & {
|
|
16
|
+
iframeBaseUrl: string;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
};
|
|
19
|
+
export type LibraryPaintElement = {
|
|
20
|
+
innerText?: string;
|
|
21
|
+
querySelectorAll: (selector: string) => ArrayLike<LibraryPaintElement>;
|
|
22
|
+
};
|
|
23
|
+
export type LibraryPaintView = {
|
|
24
|
+
document: {
|
|
25
|
+
body?: LibraryPaintElement | null;
|
|
26
|
+
documentElement?: LibraryPaintElement | null;
|
|
27
|
+
};
|
|
28
|
+
getComputedStyle: (element: LibraryPaintElement) => {
|
|
29
|
+
backgroundColor: string;
|
|
30
|
+
color: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Runs inside Playwright's page.evaluate. Keep this function self-contained
|
|
35
|
+
* (Playwright serializes only this body). Default `view` is the browser
|
|
36
|
+
* globalThis; tests pass a fake page so Node tsc does not need DOM libs.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readLibraryPaintInPage(view?: LibraryPaintView): LibraryPaint;
|
|
39
|
+
/**
|
|
40
|
+
* Runs inside Playwright's page.evaluate. Keep self-contained: Playwright
|
|
41
|
+
* serializes only this body. Default `view` is the browser globalThis.
|
|
42
|
+
*/
|
|
43
|
+
export declare function readLibraryCaptureParentEvents(view?: {
|
|
44
|
+
__sbGatewayCaptureEvents?: unknown;
|
|
45
|
+
}): CaptureParentEvent[];
|
|
46
|
+
/**
|
|
47
|
+
* Captures a JPEG of the live Vite canvas via Playwright when available.
|
|
48
|
+
* Soft-fails when Chromium is missing, the URL is the edit chrome, or the
|
|
49
|
+
* page never becomes ready.
|
|
50
|
+
*/
|
|
51
|
+
export type CaptureLibraryScreenshot = (input: CaptureLibraryScreenshotInput) => Promise<LibraryScreenshot | undefined>;
|
|
52
|
+
export declare function captureLibraryScreenshotWithPlaywright(input: CaptureLibraryScreenshotInput): Promise<LibraryScreenshot | undefined>;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless capture of the live library iframe (pitcherURL) for MCP image
|
|
3
|
+
* content. Top-level goto + mock parent, never the Superblocks edit URL.
|
|
4
|
+
*
|
|
5
|
+
* Best-effort: callers must succeed with URLs alone when this returns
|
|
6
|
+
* undefined. Output is capped like preview capture.
|
|
7
|
+
*/
|
|
8
|
+
import { PREVIEW_SCREENSHOT_MAX_BYTES } from "../preview/capture-screenshot.js";
|
|
9
|
+
import { attachLibraryCaptureProbe, executeStillInFlight, logCaptureProbe, summarizeCaptureProbe, } from "./capture-library-probe.js";
|
|
10
|
+
import { classifyLibraryPaint, } from "./classify-library-paint.js";
|
|
11
|
+
import { buildLibraryParentScript, } from "./library-parent-script.js";
|
|
12
|
+
const APP_PAINT_SETTLE_MS = 2_500;
|
|
13
|
+
const DEFAULT_CAPTURE_TIMEOUT_MS = 15_000;
|
|
14
|
+
const EXECUTE_POLL_MS = 250;
|
|
15
|
+
const POST_EXECUTE_PAINT_MS = 500;
|
|
16
|
+
const SCREENSHOT_RESERVE_MS = 1_000;
|
|
17
|
+
function isEditorChromeUrl(url) {
|
|
18
|
+
try {
|
|
19
|
+
return /\/code-mode\/applications\/edit\//.test(new URL(url).pathname);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function libraryCaptureUrl(iframeBaseUrl) {
|
|
26
|
+
let url;
|
|
27
|
+
try {
|
|
28
|
+
url = new URL(iframeBaseUrl);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
if (isEditorChromeUrl(url.toString())) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
url.searchParams.set("app_mode", "EDIT");
|
|
40
|
+
return url.toString();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Runs inside Playwright's page.evaluate. Keep this function self-contained
|
|
44
|
+
* (Playwright serializes only this body). Default `view` is the browser
|
|
45
|
+
* globalThis; tests pass a fake page so Node tsc does not need DOM libs.
|
|
46
|
+
*/
|
|
47
|
+
export function readLibraryPaintInPage(view) {
|
|
48
|
+
const page = view ?? globalThis;
|
|
49
|
+
const innerText = page.document.body?.innerText ?? "";
|
|
50
|
+
const samples = [];
|
|
51
|
+
const roots = [];
|
|
52
|
+
if (page.document.documentElement) {
|
|
53
|
+
roots.push(page.document.documentElement);
|
|
54
|
+
}
|
|
55
|
+
if (page.document.body) {
|
|
56
|
+
roots.push(page.document.body, ...Array.from(page.document.body.querySelectorAll("*")).slice(0, 40));
|
|
57
|
+
}
|
|
58
|
+
for (const element of roots) {
|
|
59
|
+
const style = page.getComputedStyle(element);
|
|
60
|
+
for (const color of [style.backgroundColor, style.color]) {
|
|
61
|
+
const match = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(color);
|
|
62
|
+
if (match) {
|
|
63
|
+
samples.push({
|
|
64
|
+
b: Number(match[3]),
|
|
65
|
+
g: Number(match[2]),
|
|
66
|
+
r: Number(match[1]),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { innerText, samples };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Runs inside Playwright's page.evaluate. Keep self-contained: Playwright
|
|
75
|
+
* serializes only this body. Default `view` is the browser globalThis.
|
|
76
|
+
*/
|
|
77
|
+
export function readLibraryCaptureParentEvents(view) {
|
|
78
|
+
const page = view ?? globalThis;
|
|
79
|
+
const events = page.__sbGatewayCaptureEvents;
|
|
80
|
+
if (!Array.isArray(events)) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const recorded = [];
|
|
84
|
+
for (const event of events) {
|
|
85
|
+
if (event &&
|
|
86
|
+
typeof event === "object" &&
|
|
87
|
+
typeof event.type === "string") {
|
|
88
|
+
recorded.push({ type: event.type });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return recorded;
|
|
92
|
+
}
|
|
93
|
+
export async function captureLibraryScreenshotWithPlaywright(input) {
|
|
94
|
+
const target = libraryCaptureUrl(input.iframeBaseUrl);
|
|
95
|
+
if (!target) {
|
|
96
|
+
console.warn("gateway library screenshot skipped: not a library URL", {
|
|
97
|
+
url: input.iframeBaseUrl,
|
|
98
|
+
});
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
let chromium;
|
|
102
|
+
try {
|
|
103
|
+
const mod = (await import(
|
|
104
|
+
/* webpackIgnore: true */ "playwright"));
|
|
105
|
+
chromium = mod.chromium;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.warn("gateway library screenshot: playwright unavailable", {
|
|
109
|
+
message: error instanceof Error ? error.message : String(error),
|
|
110
|
+
});
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
const timeoutMs = input.timeoutMs ?? DEFAULT_CAPTURE_TIMEOUT_MS;
|
|
114
|
+
let browser;
|
|
115
|
+
let cancelled = false;
|
|
116
|
+
let timedOut = false;
|
|
117
|
+
let probeLogged = false;
|
|
118
|
+
const collector = {
|
|
119
|
+
consoleText: [],
|
|
120
|
+
execute: [],
|
|
121
|
+
pageErrors: [],
|
|
122
|
+
};
|
|
123
|
+
let parentEvents = [];
|
|
124
|
+
let paintInnerText = "";
|
|
125
|
+
let paintKind = "unknown";
|
|
126
|
+
const emitProbeOnce = () => {
|
|
127
|
+
if (probeLogged) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
probeLogged = true;
|
|
131
|
+
logCaptureProbe(summarizeCaptureProbe({
|
|
132
|
+
agentUrl: input.bootstrapData.agentUrls?.[0],
|
|
133
|
+
consoleText: collector.consoleText,
|
|
134
|
+
execute: collector.execute,
|
|
135
|
+
pageErrors: collector.pageErrors,
|
|
136
|
+
parentEvents,
|
|
137
|
+
paintInnerText,
|
|
138
|
+
paintKind,
|
|
139
|
+
}));
|
|
140
|
+
};
|
|
141
|
+
const capture = (async () => {
|
|
142
|
+
const startedAt = Date.now();
|
|
143
|
+
try {
|
|
144
|
+
const launched = await chromium.launch({ headless: true });
|
|
145
|
+
browser = launched;
|
|
146
|
+
if (cancelled) {
|
|
147
|
+
await launched.close().catch(() => undefined);
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const page = await browser.newPage();
|
|
151
|
+
attachLibraryCaptureProbe(page, collector);
|
|
152
|
+
await page.addInitScript({
|
|
153
|
+
content: buildLibraryParentScript({
|
|
154
|
+
bootstrapData: input.bootstrapData,
|
|
155
|
+
initData: input.initData,
|
|
156
|
+
}),
|
|
157
|
+
});
|
|
158
|
+
await page.setViewportSize({ height: 800, width: 1280 });
|
|
159
|
+
await page.goto(target, {
|
|
160
|
+
timeout: timeoutMs,
|
|
161
|
+
waitUntil: "domcontentloaded",
|
|
162
|
+
});
|
|
163
|
+
await page
|
|
164
|
+
.locator("body > *")
|
|
165
|
+
.first()
|
|
166
|
+
.waitFor({ state: "visible", timeout: timeoutMs })
|
|
167
|
+
.catch(() => undefined);
|
|
168
|
+
await page.waitForTimeout(APP_PAINT_SETTLE_MS);
|
|
169
|
+
// Home's first paint is often "Loading first order..." with v3/execute
|
|
170
|
+
// still in flight. Closing Chromium after the settle aborts that fetch,
|
|
171
|
+
// which is why the probe showed POST with no status. Wait out the
|
|
172
|
+
// request (or the capture budget) before photographing.
|
|
173
|
+
const waitUntil = startedAt + timeoutMs - SCREENSHOT_RESERVE_MS;
|
|
174
|
+
while (!cancelled &&
|
|
175
|
+
Date.now() < waitUntil &&
|
|
176
|
+
executeStillInFlight(collector.execute)) {
|
|
177
|
+
await page.waitForTimeout(EXECUTE_POLL_MS);
|
|
178
|
+
}
|
|
179
|
+
if (collector.execute.length > 0 &&
|
|
180
|
+
!executeStillInFlight(collector.execute)) {
|
|
181
|
+
await page.waitForTimeout(POST_EXECUTE_PAINT_MS);
|
|
182
|
+
}
|
|
183
|
+
const paint = (await page.evaluate(readLibraryPaintInPage));
|
|
184
|
+
parentEvents = (await page.evaluate(readLibraryCaptureParentEvents));
|
|
185
|
+
paintInnerText = paint.innerText;
|
|
186
|
+
const verdict = classifyLibraryPaint(paint);
|
|
187
|
+
paintKind = verdict.kind === "skip" ? verdict.reason : verdict.kind;
|
|
188
|
+
emitProbeOnce();
|
|
189
|
+
if (verdict.kind === "skip") {
|
|
190
|
+
console.error(`gateway live canvas skipped: ${verdict.reason}`, {
|
|
191
|
+
url: target,
|
|
192
|
+
});
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
let quality = 80;
|
|
196
|
+
let buffer = await page.screenshot({ quality, type: "jpeg" });
|
|
197
|
+
while (buffer.byteLength > PREVIEW_SCREENSHOT_MAX_BYTES && quality > 30) {
|
|
198
|
+
quality -= 10;
|
|
199
|
+
buffer = await page.screenshot({ quality, type: "jpeg" });
|
|
200
|
+
}
|
|
201
|
+
if (buffer.byteLength > PREVIEW_SCREENSHOT_MAX_BYTES) {
|
|
202
|
+
console.warn("gateway library screenshot exceeds size cap; skipping", {
|
|
203
|
+
bytes: buffer.byteLength,
|
|
204
|
+
});
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
dataBase64: buffer.toString("base64"),
|
|
209
|
+
mimeType: "image/jpeg",
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
emitProbeOnce();
|
|
214
|
+
if (timedOut) {
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
console.warn("gateway library screenshot failed", {
|
|
218
|
+
message: error instanceof Error ? error.message : String(error),
|
|
219
|
+
url: target,
|
|
220
|
+
});
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
})();
|
|
224
|
+
let timer;
|
|
225
|
+
const timeout = new Promise((resolve) => {
|
|
226
|
+
timer = setTimeout(() => {
|
|
227
|
+
timedOut = true;
|
|
228
|
+
cancelled = true;
|
|
229
|
+
emitProbeOnce();
|
|
230
|
+
console.error("gateway live canvas skipped: capture_timeout", {
|
|
231
|
+
timeoutMs,
|
|
232
|
+
url: target,
|
|
233
|
+
});
|
|
234
|
+
resolve(undefined);
|
|
235
|
+
}, timeoutMs);
|
|
236
|
+
});
|
|
237
|
+
try {
|
|
238
|
+
return await Promise.race([capture, timeout]);
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
cancelled = true;
|
|
242
|
+
if (timer !== undefined) {
|
|
243
|
+
clearTimeout(timer);
|
|
244
|
+
}
|
|
245
|
+
emitProbeOnce();
|
|
246
|
+
await browser?.close().catch(() => undefined);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=capture-library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-library.js","sourceRoot":"","sources":["../../src/capture/capture-library.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,GAGtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,GAErB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AAYpC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAqCpC,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,mCAAmC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC9C,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAkBD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAuB;IAC5D,MAAM,IAAI,GAAG,IAAI,IAAK,UAA0C,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;IACtD,MAAM,OAAO,GAA0C,EAAE,CAAC;IAC1D,MAAM,KAAK,GAA0B,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CACrE,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,yCAAyC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC;oBACX,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAE9C;IACC,MAAM,IAAI,GACR,IAAI,IAAK,UAAgE,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,EACtD,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAG,KAA0B,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAC1D,KAAoC;IAEpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE;YACpE,GAAG,EAAE,KAAK,CAAC,aAAa;SACzB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM;QACvB,yBAAyB,CAAC,YAAY,CACvC,CAEA,CAAC;QACF,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE;YACjE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,0BAA0B,CAAC;IAChE,IAAI,OAAsE,CAAC;IAC3E,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,SAAS,GAA0B;QACvC,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,EAAE;KACf,CAAC;IACF,IAAI,YAAY,GAAyB,EAAE,CAAC;IAC5C,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,SAAS,GAAG,SAAS,CAAC;IAE1B,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,WAAW,GAAG,IAAI,CAAC;QACnB,eAAe,CACb,qBAAqB,CAAC;YACpB,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC5C,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,YAAY;YACZ,cAAc;YACd,SAAS;SACV,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,KAAK,IAA4C,EAAE;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,OAAO,GAAG,QAAQ,CAAC;YACnB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC9C,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,yBAAyB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC3C,MAAM,IAAI,CAAC,aAAa,CAAC;gBACvB,OAAO,EAAE,wBAAwB,CAAC;oBAChC,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC;aACH,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACtB,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,kBAAkB;aAC9B,CAAC,CAAC;YACH,MAAM,IAAI;iBACP,OAAO,CAAC,UAAU,CAAC;iBACnB,KAAK,EAAE;iBACP,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;iBACjD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;YAC/C,uEAAuE;YACvE,wEAAwE;YACxE,kEAAkE;YAClE,wDAAwD;YACxD,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,qBAAqB,CAAC;YAChE,OACE,CAAC,SAAS;gBACV,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACtB,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,EACvC,CAAC;gBACD,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YAC7C,CAAC;YACD,IACE,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC5B,CAAC,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,EACxC,CAAC;gBACD,MAAM,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAChC,sBAAsB,CACvB,CAAiB,CAAC;YACnB,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CACjC,8BAA8B,CAC/B,CAAyB,CAAC;YAC3B,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;YACjC,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC5C,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YACpE,aAAa,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,MAAM,EAAE,EAAE;oBAC9D,GAAG,EAAE,MAAM;iBACZ,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9D,OAAO,MAAM,CAAC,UAAU,GAAG,4BAA4B,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;gBACxE,OAAO,IAAI,EAAE,CAAC;gBACd,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,MAAM,CAAC,UAAU,GAAG,4BAA4B,EAAE,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE;oBACpE,KAAK,EAAE,MAAM,CAAC,UAAU;iBACzB,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrC,QAAQ,EAAE,YAAY;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAChD,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,GAAG,EAAE,MAAM;aACZ,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,KAAgD,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACjD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS,GAAG,IAAI,CAAC;YACjB,aAAa,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE;gBAC5D,SAAS;gBACT,GAAG,EAAE,MAAM;aACZ,CAAC,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,aAAa,EAAE,CAAC;QAChB,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview sign-in copy is a failed live-library capture: the JPEG looks like
|
|
3
|
+
* a real page but is the auth wall. A white/empty canvas is returned as
|
|
4
|
+
* bytes so the agent can see it; screenshotBase64 now travels in MCP JSON.
|
|
5
|
+
*/
|
|
6
|
+
export type LibraryPaintSample = {
|
|
7
|
+
b: number;
|
|
8
|
+
g: number;
|
|
9
|
+
r: number;
|
|
10
|
+
};
|
|
11
|
+
export type LibraryPaint = {
|
|
12
|
+
innerText: string;
|
|
13
|
+
samples: ReadonlyArray<LibraryPaintSample>;
|
|
14
|
+
};
|
|
15
|
+
export type LibraryPaintVerdict = {
|
|
16
|
+
kind: "ok";
|
|
17
|
+
} | {
|
|
18
|
+
kind: "skip";
|
|
19
|
+
reason: "preview_sign_in";
|
|
20
|
+
};
|
|
21
|
+
export declare function classifyLibraryPaint(paint: LibraryPaint): LibraryPaintVerdict;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview sign-in copy is a failed live-library capture: the JPEG looks like
|
|
3
|
+
* a real page but is the auth wall. A white/empty canvas is returned as
|
|
4
|
+
* bytes so the agent can see it; screenshotBase64 now travels in MCP JSON.
|
|
5
|
+
*/
|
|
6
|
+
const SIGN_IN_COPY = /\b(?:sign[\s-]?in|log[\s-]?in|continue with google|continue with github)\b/i;
|
|
7
|
+
export function classifyLibraryPaint(paint) {
|
|
8
|
+
if (SIGN_IN_COPY.test(paint.innerText)) {
|
|
9
|
+
return { kind: "skip", reason: "preview_sign_in" };
|
|
10
|
+
}
|
|
11
|
+
return { kind: "ok" };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=classify-library-paint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify-library-paint.js","sourceRoot":"","sources":["../../src/capture/classify-library-paint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,MAAM,YAAY,GAChB,6EAA6E,CAAC;AAEhF,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup-time scan of an MCP client config for known host browser drivers.
|
|
3
|
+
*
|
|
4
|
+
* Gateway cannot see other MCP servers at tool-call time. This only inspects
|
|
5
|
+
* what is on disk (or about to be written). Config can lie: the server may
|
|
6
|
+
* fail to start or `npx` may miss PATH.
|
|
7
|
+
*/
|
|
8
|
+
export type HostBrowserMcpScan = {
|
|
9
|
+
found: boolean;
|
|
10
|
+
isolated: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Walks `mcpServers` (Claude Code, Cursor, Desktop). Superblocks Gateway is
|
|
14
|
+
* skipped so a self-scan cannot count as a host browser.
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanHostBrowserMcp(config: unknown): HostBrowserMcpScan;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup-time scan of an MCP client config for known host browser drivers.
|
|
3
|
+
*
|
|
4
|
+
* Gateway cannot see other MCP servers at tool-call time. This only inspects
|
|
5
|
+
* what is on disk (or about to be written). Config can lie: the server may
|
|
6
|
+
* fail to start or `npx` may miss PATH.
|
|
7
|
+
*/
|
|
8
|
+
const HOST_BROWSER_MARKERS = [
|
|
9
|
+
"@playwright/mcp",
|
|
10
|
+
"agent-browser",
|
|
11
|
+
"chrome-devtools-mcp",
|
|
12
|
+
"puppeteer",
|
|
13
|
+
];
|
|
14
|
+
function tokensOf(entry) {
|
|
15
|
+
if (!entry || typeof entry !== "object") {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
const record = entry;
|
|
19
|
+
const tokens = [];
|
|
20
|
+
if (typeof record.command === "string") {
|
|
21
|
+
tokens.push(record.command);
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(record.args)) {
|
|
24
|
+
for (const arg of record.args) {
|
|
25
|
+
if (typeof arg === "string") {
|
|
26
|
+
tokens.push(arg);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return tokens;
|
|
31
|
+
}
|
|
32
|
+
function isHostBrowserDriver(tokens) {
|
|
33
|
+
return tokens.some((token) => HOST_BROWSER_MARKERS.some((marker) => token.includes(marker)));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Walks `mcpServers` (Claude Code, Cursor, Desktop). Superblocks Gateway is
|
|
37
|
+
* skipped so a self-scan cannot count as a host browser.
|
|
38
|
+
*/
|
|
39
|
+
export function scanHostBrowserMcp(config) {
|
|
40
|
+
if (!config || typeof config !== "object") {
|
|
41
|
+
return { found: false, isolated: false };
|
|
42
|
+
}
|
|
43
|
+
const mcpServers = config.mcpServers;
|
|
44
|
+
if (!mcpServers || typeof mcpServers !== "object") {
|
|
45
|
+
return { found: false, isolated: false };
|
|
46
|
+
}
|
|
47
|
+
let found = false;
|
|
48
|
+
let isolated = false;
|
|
49
|
+
for (const [name, entry] of Object.entries(mcpServers)) {
|
|
50
|
+
if (name === "superblocks") {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const tokens = tokensOf(entry);
|
|
54
|
+
if (!isHostBrowserDriver(tokens)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
found = true;
|
|
58
|
+
if (tokens.includes("--isolated")) {
|
|
59
|
+
isolated = true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { found, isolated };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=host-mcp-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-mcp-scan.js","sourceRoot":"","sources":["../../src/capture/host-mcp-scan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,oBAAoB,GAAG;IAC3B,iBAAiB;IACjB,eAAe;IACf,qBAAqB;IACrB,WAAW;CACH,CAAC;AAOX,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAgB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,UAAU,GAAI,MAAmC,CAAC,UAAU,CAAC;IACnE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACxC,UAAqC,CACtC,EAAE,CAAC;QACF,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page source that makes a top-level pitcherURL visit look like the Code Mode
|
|
3
|
+
* iframe: mock `window.parent`, answer `sb-ready` / bootstrap / API auth in
|
|
4
|
+
* page JS so the host driver never sees the scoped JWT.
|
|
5
|
+
*
|
|
6
|
+
* Source text rather than a function handed to `addInitScript` because
|
|
7
|
+
* Playwright serializes functions and can drag bundler helpers (`__name`)
|
|
8
|
+
* into the page. Same rule as `buildEmbedHandshakeScript`.
|
|
9
|
+
*/
|
|
10
|
+
export type LibraryParentInitData = {
|
|
11
|
+
appId: string;
|
|
12
|
+
devServerAuthorization: string;
|
|
13
|
+
peerId: string;
|
|
14
|
+
userId?: string;
|
|
15
|
+
windowOriginUrl?: string;
|
|
16
|
+
};
|
|
17
|
+
export type LibraryParentBootstrapData = {
|
|
18
|
+
accessToken: string;
|
|
19
|
+
agents?: unknown[];
|
|
20
|
+
agentUrls?: string[];
|
|
21
|
+
appId: string;
|
|
22
|
+
featureFlags?: Record<string, unknown>;
|
|
23
|
+
orgId?: string;
|
|
24
|
+
profiles?: unknown;
|
|
25
|
+
token: string;
|
|
26
|
+
userEmail?: string;
|
|
27
|
+
userId: string;
|
|
28
|
+
windowOriginUrl?: string;
|
|
29
|
+
};
|
|
30
|
+
export type LibraryParentPayload = {
|
|
31
|
+
bootstrapData: LibraryParentBootstrapData;
|
|
32
|
+
initData: LibraryParentInitData;
|
|
33
|
+
};
|
|
34
|
+
export declare function buildLibraryParentScript(payload: LibraryParentPayload): string;
|