@superblocksteam/gateway 2.0.161 → 2.0.162-next.1
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 +135 -39
- package/dist/agents/resolve-orchestrator-url.d.ts +18 -0
- package/dist/agents/resolve-orchestrator-url.js +64 -1
- package/dist/agents/resolve-orchestrator-url.js.map +1 -1
- package/dist/capabilities/lifecycle.d.ts +46 -29
- package/dist/capabilities/lifecycle.js +1731 -843
- package/dist/capabilities/lifecycle.js.map +1 -1
- package/dist/capabilities/query-integration.d.ts +14 -0
- package/dist/capabilities/query-integration.js +172 -0
- package/dist/capabilities/query-integration.js.map +1 -0
- package/dist/capabilities/source-files-archive.d.ts +11 -0
- package/dist/capabilities/source-files-archive.js +54 -0
- package/dist/capabilities/source-files-archive.js.map +1 -0
- package/dist/capabilities/types.d.ts +197 -119
- package/dist/capabilities/types.js +45 -6
- package/dist/capabilities/types.js.map +1 -1
- package/dist/capture/browser-contract.d.ts +15 -5
- package/dist/capture/browser-contract.js +13 -3
- package/dist/capture/browser-contract.js.map +1 -1
- package/dist/capture/browser-instructions.d.ts +3 -2
- package/dist/capture/browser-instructions.js +3 -2
- package/dist/capture/browser-instructions.js.map +1 -1
- package/dist/capture/mode.d.ts +8 -1
- package/dist/capture/mode.js +22 -2
- package/dist/capture/mode.js.map +1 -1
- package/dist/config.d.ts +22 -23
- package/dist/config.js +13 -12
- package/dist/config.js.map +1 -1
- package/dist/deps.d.ts +7 -7
- package/dist/index.d.ts +2 -4
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/integrations/read-only-postgres-query.d.ts +2 -0
- package/dist/integrations/read-only-postgres-query.js +164 -0
- package/dist/integrations/read-only-postgres-query.js.map +1 -0
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/playwright/ensure-chromium.d.ts +5 -7
- package/dist/playwright/ensure-chromium.js +13 -13
- package/dist/playwright/ensure-chromium.js.map +1 -1
- package/dist/preview/capture-screenshot.d.ts +30 -4
- package/dist/preview/capture-screenshot.js +67 -17
- package/dist/preview/capture-screenshot.js.map +1 -1
- package/dist/preview/viewer-url.js +3 -1
- package/dist/preview/viewer-url.js.map +1 -1
- package/dist/process/fault-barrier.js +1 -1
- package/dist/process/fault-barrier.js.map +1 -1
- package/dist/sabs/agent-facing-text.d.ts +2 -0
- package/dist/sabs/agent-facing-text.js +56 -2
- package/dist/sabs/agent-facing-text.js.map +1 -1
- package/dist/sabs/app-state.d.ts +126 -0
- package/dist/sabs/app-state.js +332 -0
- package/dist/sabs/app-state.js.map +1 -0
- package/dist/sabs/awaited-decision.d.ts +49 -0
- package/dist/sabs/awaited-decision.js +129 -0
- package/dist/sabs/awaited-decision.js.map +1 -0
- package/dist/sabs/editor-client-methods.d.ts +23 -5
- package/dist/sabs/editor-client-methods.js +45 -4
- package/dist/sabs/editor-client-methods.js.map +1 -1
- package/dist/sabs/editor-socket.d.ts +85 -0
- package/dist/sabs/editor-socket.js +67 -0
- package/dist/sabs/editor-socket.js.map +1 -0
- package/dist/sabs/session-peer.d.ts +119 -82
- package/dist/sabs/session-peer.js +10 -1
- package/dist/sabs/session-peer.js.map +1 -1
- package/dist/sabs/streamed-reply.d.ts +45 -0
- package/dist/sabs/streamed-reply.js +125 -0
- package/dist/sabs/streamed-reply.js.map +1 -0
- package/dist/sabs/turn-collector.d.ts +50 -35
- package/dist/sabs/turn-collector.js +110 -176
- package/dist/sabs/turn-collector.js.map +1 -1
- package/dist/sabs/websocket-session-peer.d.ts +104 -69
- package/dist/sabs/websocket-session-peer.js +1333 -477
- package/dist/sabs/websocket-session-peer.js.map +1 -1
- package/dist/server/client.d.ts +41 -9
- package/dist/server/client.js +126 -21
- package/dist/server/client.js.map +1 -1
- package/dist/start.d.ts +1 -1
- package/dist/start.js +30 -8
- package/dist/start.js.map +1 -1
- package/dist/stores/memory.d.ts +46 -0
- package/dist/stores/memory.js +163 -0
- package/dist/stores/memory.js.map +1 -0
- package/dist/stores/types.d.ts +92 -0
- package/dist/stores/types.js +11 -0
- package/dist/stores/types.js.map +1 -0
- package/dist/telemetry/mcp-client.d.ts +6 -1
- package/dist/telemetry/mcp-client.js +100 -4
- package/dist/telemetry/mcp-client.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +12 -3
- package/dist/telemetry/metrics.js +60 -14
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry/runtime.js +4 -6
- package/dist/telemetry/runtime.js.map +1 -1
- package/dist/transports/mcp/admin-tools.d.ts +8 -0
- package/dist/transports/mcp/admin-tools.js +115 -4
- package/dist/transports/mcp/admin-tools.js.map +1 -1
- package/dist/transports/mcp/app-status-html.d.ts +4 -8
- package/dist/transports/mcp/app-status-html.js +336 -128
- package/dist/transports/mcp/app-status-html.js.map +1 -1
- package/dist/transports/mcp/client-presentation.d.ts +16 -0
- package/dist/transports/mcp/client-presentation.js +13 -0
- package/dist/transports/mcp/client-presentation.js.map +1 -0
- package/dist/transports/mcp/cowork-editor-url.d.ts +6 -0
- package/dist/transports/mcp/cowork-editor-url.js +10 -0
- package/dist/transports/mcp/cowork-editor-url.js.map +1 -0
- package/dist/transports/mcp/decision-card-html.d.ts +26 -0
- package/dist/transports/mcp/decision-card-html.js +876 -0
- package/dist/transports/mcp/decision-card-html.js.map +1 -0
- package/dist/transports/mcp/decision-elicitation.d.ts +42 -0
- package/dist/transports/mcp/decision-elicitation.js +59 -0
- package/dist/transports/mcp/decision-elicitation.js.map +1 -1
- package/dist/transports/mcp/editor-document-probe.d.ts +4 -0
- package/dist/transports/mcp/editor-document-probe.js +35 -0
- package/dist/transports/mcp/editor-document-probe.js.map +1 -0
- package/dist/transports/mcp/editor-integration-setup-url.d.ts +14 -0
- package/dist/transports/mcp/editor-integration-setup-url.js +29 -0
- package/dist/transports/mcp/editor-integration-setup-url.js.map +1 -0
- package/dist/transports/mcp/format-tool-content.d.ts +13 -18
- package/dist/transports/mcp/format-tool-content.js +172 -13
- package/dist/transports/mcp/format-tool-content.js.map +1 -1
- package/dist/transports/mcp/instructions/index.d.ts +23 -0
- package/dist/transports/mcp/instructions/index.js +81 -0
- package/dist/transports/mcp/instructions/index.js.map +1 -0
- package/dist/transports/mcp/instructions/result.d.ts +18 -0
- package/dist/transports/mcp/instructions/result.js +58 -0
- package/dist/transports/mcp/instructions/result.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/ask-user.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/ask-user.js +20 -0
- package/dist/transports/mcp/instructions/tools/ask-user.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/build-app.d.ts +4 -0
- package/dist/transports/mcp/instructions/tools/build-app.js +54 -0
- package/dist/transports/mcp/instructions/tools/build-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/check-app-progress.js +79 -0
- package/dist/transports/mcp/instructions/tools/check-app-progress.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/check-publish-progress.js +23 -0
- package/dist/transports/mcp/instructions/tools/check-publish-progress.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/copy.d.ts +18 -0
- package/dist/transports/mcp/instructions/tools/copy.js +49 -0
- package/dist/transports/mcp/instructions/tools/copy.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/create-integration.d.ts +4 -0
- package/dist/transports/mcp/instructions/tools/create-integration.js +41 -0
- package/dist/transports/mcp/instructions/tools/create-integration.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/edit-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/edit-app.js +18 -0
- package/dist/transports/mcp/instructions/tools/edit-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/get-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/get-app.js +49 -0
- package/dist/transports/mcp/instructions/tools/get-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/get-integration-metadata.js +13 -0
- package/dist/transports/mcp/instructions/tools/get-integration-metadata.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/index.d.ts +7 -0
- package/dist/transports/mcp/instructions/tools/index.js +31 -0
- package/dist/transports/mcp/instructions/tools/index.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/publish-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/publish-app.js +23 -0
- package/dist/transports/mcp/instructions/tools/publish-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/start-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/start-app.js +22 -0
- package/dist/transports/mcp/instructions/tools/start-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/upload-artifact.js +13 -0
- package/dist/transports/mcp/instructions/tools/upload-artifact.js.map +1 -0
- package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
- package/dist/transports/mcp/mcp-app-brand-css.js +180 -0
- package/dist/transports/mcp/mcp-app-brand-css.js.map +1 -0
- package/dist/transports/mcp/mount.d.ts +14 -1
- package/dist/transports/mcp/mount.js +729 -172
- package/dist/transports/mcp/mount.js.map +1 -1
- package/dist/transports/mcp/native-browser-presence.d.ts +45 -0
- package/dist/transports/mcp/native-browser-presence.js +158 -0
- package/dist/transports/mcp/native-browser-presence.js.map +1 -0
- package/dist/transports/mcp/plan-approval.d.ts +44 -0
- package/dist/transports/mcp/plan-approval.js +179 -0
- package/dist/transports/mcp/plan-approval.js.map +1 -0
- package/dist/transports/mcp/session-directory.d.ts +7 -0
- package/dist/transports/mcp/session-directory.js +18 -0
- package/dist/transports/mcp/session-directory.js.map +1 -0
- package/dist/transports/mcp/tool-names.d.ts +2 -0
- package/dist/transports/mcp/tool-names.js +2 -0
- package/dist/transports/mcp/tool-names.js.map +1 -0
- package/package.json +16 -7
- package/skills/superblocks-build/SKILL.md +59 -0
- package/skills/superblocks-import/SKILL.md +125 -0
- package/dist/capabilities/import-prompt.d.ts +0 -11
- package/dist/capabilities/import-prompt.js +0 -96
- package/dist/capabilities/import-prompt.js.map +0 -1
- package/dist/capabilities/persisted-progress.d.ts +0 -46
- package/dist/capabilities/persisted-progress.js +0 -246
- package/dist/capabilities/persisted-progress.js.map +0 -1
- package/dist/events/cursor.d.ts +0 -43
- package/dist/events/cursor.js +0 -78
- package/dist/events/cursor.js.map +0 -1
- package/dist/events/memory-event-store.d.ts +0 -34
- package/dist/events/memory-event-store.js +0 -110
- package/dist/events/memory-event-store.js.map +0 -1
- package/dist/events/merge.d.ts +0 -23
- package/dist/events/merge.js +0 -97
- package/dist/events/merge.js.map +0 -1
- package/dist/events/normalized-collector.d.ts +0 -62
- package/dist/events/normalized-collector.js +0 -156
- package/dist/events/normalized-collector.js.map +0 -1
- package/dist/events/schema.d.ts +0 -9
- package/dist/events/schema.js +0 -93
- package/dist/events/schema.js.map +0 -1
- package/dist/events/snapshot.d.ts +0 -32
- package/dist/events/snapshot.js +0 -57
- package/dist/events/snapshot.js.map +0 -1
- package/dist/events/stream-key.d.ts +0 -2
- package/dist/events/stream-key.js +0 -31
- package/dist/events/stream-key.js.map +0 -1
- package/dist/events/types.d.ts +0 -179
- package/dist/events/types.js +0 -66
- package/dist/events/types.js.map +0 -1
- package/dist/resume/memory-progress-store.d.ts +0 -39
- package/dist/resume/memory-progress-store.js +0 -82
- package/dist/resume/memory-progress-store.js.map +0 -1
- package/dist/resume/memory-recent-app-store.d.ts +0 -14
- package/dist/resume/memory-recent-app-store.js +0 -27
- package/dist/resume/memory-recent-app-store.js.map +0 -1
- package/dist/resume/memory-turn-store.d.ts +0 -18
- package/dist/resume/memory-turn-store.js +0 -73
- package/dist/resume/memory-turn-store.js.map +0 -1
- package/dist/resume/progress-key.d.ts +0 -21
- package/dist/resume/progress-key.js +0 -58
- package/dist/resume/progress-key.js.map +0 -1
- package/dist/resume/stores.d.ts +0 -14
- package/dist/resume/stores.js +0 -18
- package/dist/resume/stores.js.map +0 -1
- package/dist/resume/types.d.ts +0 -124
- package/dist/resume/types.js +0 -13
- package/dist/resume/types.js.map +0 -1
|
@@ -1,24 +1,33 @@
|
|
|
1
1
|
import type { CaptureMode } from "./mode.js";
|
|
2
|
+
/** The host drives its own browser pane; no driver MCP is involved. */
|
|
3
|
+
export declare const HOST_BROWSER_TOOLS_COWORK: "cowork_embedded";
|
|
4
|
+
/**
|
|
5
|
+
* Nobody looked, rather than nobody found one. The setup-time config scan
|
|
6
|
+
* behind {@link CaptureMode} can lie, so only a transport that knows which
|
|
7
|
+
* client is connected may say anything more definite than this.
|
|
8
|
+
*/
|
|
2
9
|
export declare const HOST_BROWSER_TOOLS_UNKNOWN: "unknown";
|
|
10
|
+
export type HostBrowserTools = typeof HOST_BROWSER_TOOLS_COWORK | typeof HOST_BROWSER_TOOLS_UNKNOWN;
|
|
3
11
|
export declare const MUST_NOT_CLOSE_UNTIL = "the Superblocks task is done (status ready, or the user no longer needs the browser session)";
|
|
4
12
|
export declare const NEEDS_BROWSER_DRIVER_CODE = "needs_browser_driver";
|
|
5
|
-
export declare const NEEDS_BROWSER_DRIVER_MESSAGE = "No browser driver is available for live-canvas capture or IdP step-up. Add a host browser MCP (@playwright/mcp) and re-run
|
|
13
|
+
export declare const NEEDS_BROWSER_DRIVER_MESSAGE = "No browser driver is available for live-canvas capture or IdP step-up. Add a host browser MCP (@playwright/mcp) and re-run mcp setup. Gateway Chromium cannot complete IdP. Config on disk can lie if a listed server fails to start.";
|
|
6
14
|
/**
|
|
7
15
|
* Structured steer for host browser tools. Tokens never belong here.
|
|
8
16
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
17
|
+
* The edit URL may stay open while building only in Claude Cowork's built-in
|
|
18
|
+
* side panel. Other browser drivers can steal the live-edit turn by opening it.
|
|
11
19
|
*/
|
|
12
20
|
export type BrowserDriverContract = {
|
|
13
21
|
captureMode: CaptureMode;
|
|
14
22
|
canvas: {
|
|
15
|
-
|
|
23
|
+
editUrl: string;
|
|
24
|
+
openWhileBuilding: "claude_cowork_side_panel_only";
|
|
16
25
|
};
|
|
17
26
|
driver: {
|
|
18
27
|
isolated?: boolean;
|
|
19
28
|
mustNotCloseUntil: string;
|
|
20
29
|
};
|
|
21
|
-
hostBrowserTools:
|
|
30
|
+
hostBrowserTools: HostBrowserTools;
|
|
22
31
|
uiOrigin: {
|
|
23
32
|
navigate: string;
|
|
24
33
|
};
|
|
@@ -26,6 +35,7 @@ export type BrowserDriverContract = {
|
|
|
26
35
|
export declare function buildBrowserDriverContract(input: {
|
|
27
36
|
captureMode: CaptureMode;
|
|
28
37
|
editUrl: string;
|
|
38
|
+
hostBrowserTools?: HostBrowserTools;
|
|
29
39
|
isolated?: boolean;
|
|
30
40
|
uiOrigin: string;
|
|
31
41
|
}): BrowserDriverContract;
|
|
@@ -1,16 +1,26 @@
|
|
|
1
|
+
/** The host drives its own browser pane; no driver MCP is involved. */
|
|
2
|
+
export const HOST_BROWSER_TOOLS_COWORK = "cowork_embedded";
|
|
3
|
+
/**
|
|
4
|
+
* Nobody looked, rather than nobody found one. The setup-time config scan
|
|
5
|
+
* behind {@link CaptureMode} can lie, so only a transport that knows which
|
|
6
|
+
* client is connected may say anything more definite than this.
|
|
7
|
+
*/
|
|
1
8
|
export const HOST_BROWSER_TOOLS_UNKNOWN = "unknown";
|
|
2
9
|
export const MUST_NOT_CLOSE_UNTIL = "the Superblocks task is done (status ready, or the user no longer needs the browser session)";
|
|
3
10
|
export const NEEDS_BROWSER_DRIVER_CODE = "needs_browser_driver";
|
|
4
|
-
export const NEEDS_BROWSER_DRIVER_MESSAGE = "No browser driver is available for live-canvas capture or IdP step-up. Add a host browser MCP (@playwright/mcp) and re-run
|
|
11
|
+
export const NEEDS_BROWSER_DRIVER_MESSAGE = "No browser driver is available for live-canvas capture or IdP step-up. Add a host browser MCP (@playwright/mcp) and re-run mcp setup. Gateway Chromium cannot complete IdP. Config on disk can lie if a listed server fails to start.";
|
|
5
12
|
export function buildBrowserDriverContract(input) {
|
|
6
13
|
return {
|
|
7
14
|
captureMode: input.captureMode,
|
|
8
|
-
canvas: {
|
|
15
|
+
canvas: {
|
|
16
|
+
editUrl: input.editUrl,
|
|
17
|
+
openWhileBuilding: "claude_cowork_side_panel_only",
|
|
18
|
+
},
|
|
9
19
|
driver: {
|
|
10
20
|
...(input.isolated ? { isolated: true } : {}),
|
|
11
21
|
mustNotCloseUntil: MUST_NOT_CLOSE_UNTIL,
|
|
12
22
|
},
|
|
13
|
-
hostBrowserTools: HOST_BROWSER_TOOLS_UNKNOWN,
|
|
23
|
+
hostBrowserTools: input.hostBrowserTools ?? HOST_BROWSER_TOOLS_UNKNOWN,
|
|
14
24
|
uiOrigin: { navigate: input.uiOrigin },
|
|
15
25
|
};
|
|
16
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-contract.js","sourceRoot":"","sources":["../../src/capture/browser-contract.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-contract.js","sourceRoot":"","sources":["../../src/capture/browser-contract.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAA0B,CAAC;AAEpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAkB,CAAC;AAM7D,MAAM,CAAC,MAAM,oBAAoB,GAC/B,8FAA8F,CAAC;AAEjG,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEhE,MAAM,CAAC,MAAM,4BAA4B,GACvC,uOAAuO,CAAC;AAsB1O,MAAM,UAAU,0BAA0B,CAAC,KAM1C;IACC,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE;YACN,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,iBAAiB,EAAE,+BAA+B;SACnD;QACD,MAAM,EAAE;YACN,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,iBAAiB,EAAE,oBAAoB;SACxC;QACD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,0BAA0B;QACtE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IAKrC,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,4BAA4B;KACtC,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Numbered MUSTs for host browser drivers. Appended to MCP server
|
|
3
3
|
* instructions so a model that already has Playwright MCP (or agent-browser)
|
|
4
|
-
*
|
|
4
|
+
* opens the edit URL mid-build only in Cowork's side panel and never pastes
|
|
5
|
+
* tokens into evaluate.
|
|
5
6
|
*
|
|
6
7
|
* Detecting that this turn actually has those tools is ENG-5858's sibling
|
|
7
8
|
* concern; these lines only steer when the tools exist.
|
|
8
9
|
*/
|
|
9
|
-
export declare const BROWSER_DRIVER_INSTRUCTIONS = "Browser capture (MUST):\n1. Prefer host browser tools (Playwright MCP, chrome-devtools, agent-browser) over opening Superblocks URLs yourself. Honor the structured \"browser\" field on start_app / get_app / idp_step_up; do not paraphrase it into a different URL.\n2.
|
|
10
|
+
export declare const BROWSER_DRIVER_INSTRUCTIONS = "Browser capture (MUST):\n1. Prefer host browser tools (Playwright MCP, chrome-devtools, agent-browser) over opening Superblocks URLs yourself. Honor the structured \"browser\" field on start_app / get_app / idp_step_up; do not paraphrase it into a different URL.\n2. When canvas.openWhileBuilding is \"claude_cowork_side_panel_only\", open canvas.editUrl while status is \"building\" only for a Claude Cowork task whose built-in browser is available, and use its embedded side panel. Every other host MUST NOT open it mid-build because that can steal the live-edit turn.\n3. NEVER paste tokens, JWTs, or API keys into browser evaluate or fill. Tokens are not in tool JSON; do not invent them.\n4. Playwright MCP MUST NOT use --isolated for Superblocks IdP. Cookies must survive the session.\n5. MUST NOT call browser_close until the Superblocks task is done (see driver.mustNotCloseUntil).\n6. agent-browser MUST always pass --profile and a stable --session for the same Superblocks origin.\n7. Claude-in-Chrome is not a mid-turn canvas. Do not use it to screenshot the live Vite app while a Gateway turn is held.";
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Numbered MUSTs for host browser drivers. Appended to MCP server
|
|
3
3
|
* instructions so a model that already has Playwright MCP (or agent-browser)
|
|
4
|
-
*
|
|
4
|
+
* opens the edit URL mid-build only in Cowork's side panel and never pastes
|
|
5
|
+
* tokens into evaluate.
|
|
5
6
|
*
|
|
6
7
|
* Detecting that this turn actually has those tools is ENG-5858's sibling
|
|
7
8
|
* concern; these lines only steer when the tools exist.
|
|
8
9
|
*/
|
|
9
10
|
export const BROWSER_DRIVER_INSTRUCTIONS = `Browser capture (MUST):
|
|
10
11
|
1. Prefer host browser tools (Playwright MCP, chrome-devtools, agent-browser) over opening Superblocks URLs yourself. Honor the structured "browser" field on start_app / get_app / idp_step_up; do not paraphrase it into a different URL.
|
|
11
|
-
2.
|
|
12
|
+
2. When canvas.openWhileBuilding is "claude_cowork_side_panel_only", open canvas.editUrl while status is "building" only for a Claude Cowork task whose built-in browser is available, and use its embedded side panel. Every other host MUST NOT open it mid-build because that can steal the live-edit turn.
|
|
12
13
|
3. NEVER paste tokens, JWTs, or API keys into browser evaluate or fill. Tokens are not in tool JSON; do not invent them.
|
|
13
14
|
4. Playwright MCP MUST NOT use --isolated for Superblocks IdP. Cookies must survive the session.
|
|
14
15
|
5. MUST NOT call browser_close until the Superblocks task is done (see driver.mustNotCloseUntil).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-instructions.js","sourceRoot":"","sources":["../../src/capture/browser-instructions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"browser-instructions.js","sourceRoot":"","sources":["../../src/capture/browser-instructions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;0HAO+E,CAAC"}
|
package/dist/capture/mode.d.ts
CHANGED
|
@@ -13,10 +13,17 @@ export declare function resolveCaptureMode(input: {
|
|
|
13
13
|
hostMcpConfigured: boolean;
|
|
14
14
|
}): CaptureMode;
|
|
15
15
|
/**
|
|
16
|
-
* Human + machine summary for `
|
|
16
|
+
* Human + machine summary for `mcp setup --debug`. Info goes to stderr so
|
|
17
17
|
* a redirected stdout report stays clean.
|
|
18
18
|
*/
|
|
19
19
|
export declare function formatCaptureModeSummary(input: {
|
|
20
20
|
isolated: boolean;
|
|
21
21
|
mode: CaptureMode;
|
|
22
22
|
}): string;
|
|
23
|
+
/**
|
|
24
|
+
* End-user copy for `mcp setup`. No machine keys, no internal error codes.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatCaptureModeUserSummary(input: {
|
|
27
|
+
isolated: boolean;
|
|
28
|
+
mode: CaptureMode;
|
|
29
|
+
}): string | undefined;
|
package/dist/capture/mode.js
CHANGED
|
@@ -21,7 +21,7 @@ export function resolveCaptureMode(input) {
|
|
|
21
21
|
return "urls_only";
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Human + machine summary for `
|
|
24
|
+
* Human + machine summary for `mcp setup --debug`. Info goes to stderr so
|
|
25
25
|
* a redirected stdout report stays clean.
|
|
26
26
|
*/
|
|
27
27
|
export function formatCaptureModeSummary(input) {
|
|
@@ -34,7 +34,7 @@ export function formatCaptureModeSummary(input) {
|
|
|
34
34
|
lines.push("Gateway Playwright Chromium is present for preview screenshots. No host browser MCP was found. Config on disk can lie if a listed server fails to start. IdP step-up still returns needs_browser_driver until a host browser MCP (@playwright/mcp) is configured. Gateway Chromium cannot complete IdP.");
|
|
35
35
|
break;
|
|
36
36
|
case "urls_only":
|
|
37
|
-
lines.push("URLs only: no host browser MCP and no Gateway Chromium. Config on disk can lie if a listed server fails to start. Live-canvas capture will return needs_browser_driver; superblocks
|
|
37
|
+
lines.push("URLs only: no host browser MCP and no Gateway Chromium. Config on disk can lie if a listed server fails to start. Live-canvas capture will return needs_browser_driver; superblocks mcp setup --with-screenshots may enable live-canvas capture and does not clear IdP. Add @playwright/mcp for IdP step-up.");
|
|
38
38
|
break;
|
|
39
39
|
}
|
|
40
40
|
if (input.isolated) {
|
|
@@ -42,4 +42,24 @@ export function formatCaptureModeSummary(input) {
|
|
|
42
42
|
}
|
|
43
43
|
return lines.join("\n");
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* End-user copy for `mcp setup`. No machine keys, no internal error codes.
|
|
47
|
+
*/
|
|
48
|
+
export function formatCaptureModeUserSummary(input) {
|
|
49
|
+
const lines = [];
|
|
50
|
+
switch (input.mode) {
|
|
51
|
+
case "host_mcp_configured":
|
|
52
|
+
lines.push("Screenshots and browser sign-in will use Playwright MCP in your editor.");
|
|
53
|
+
break;
|
|
54
|
+
case "gateway_chromium":
|
|
55
|
+
break;
|
|
56
|
+
case "urls_only":
|
|
57
|
+
lines.push("App preview screenshots are off. Re-run: superblocks mcp setup --with-screenshots");
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
if (input.isolated) {
|
|
61
|
+
lines.push("Warning: Playwright MCP uses --isolated, so sign-in cookies will not persist.");
|
|
62
|
+
}
|
|
63
|
+
return lines.length > 0 ? lines.join("\n") : undefined;
|
|
64
|
+
}
|
|
45
65
|
//# sourceMappingURL=mode.js.map
|
package/dist/capture/mode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/capture/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,qBAAqB;IACrB,WAAW;CACH,CAAC;AAIX,MAAM,UAAU,kBAAkB,CAAC,KAGlC;IACC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAGxC;IACC,MAAM,KAAK,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,qBAAqB;YACxB,KAAK,CAAC,IAAI,CACR,0HAA0H,CAC3H,CAAC;YACF,MAAM;QACR,KAAK,kBAAkB;YACrB,KAAK,CAAC,IAAI,CACR,ySAAyS,CAC1S,CAAC;YACF,MAAM;QACR,KAAK,WAAW;YACd,KAAK,CAAC,IAAI,CACR,
|
|
1
|
+
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/capture/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,qBAAqB;IACrB,WAAW;CACH,CAAC;AAIX,MAAM,UAAU,kBAAkB,CAAC,KAGlC;IACC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAGxC;IACC,MAAM,KAAK,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,qBAAqB;YACxB,KAAK,CAAC,IAAI,CACR,0HAA0H,CAC3H,CAAC;YACF,MAAM;QACR,KAAK,kBAAkB;YACrB,KAAK,CAAC,IAAI,CACR,ySAAyS,CAC1S,CAAC;YACF,MAAM;QACR,KAAK,WAAW;YACd,KAAK,CAAC,IAAI,CACR,8SAA8S,CAC/S,CAAC;YACF,MAAM;IACV,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,iGAAiG,CAClG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAG5C;IACC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,qBAAqB;YACxB,KAAK,CAAC,IAAI,CACR,yEAAyE,CAC1E,CAAC;YACF,MAAM;QACR,KAAK,kBAAkB;YACrB,MAAM;QACR,KAAK,WAAW;YACd,KAAK,CAAC,IAAI,CACR,mFAAmF,CACpF,CAAC;YACF,MAAM;IACV,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,+EAA+E,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -10,19 +10,18 @@ export type GatewayConfig = {
|
|
|
10
10
|
*/
|
|
11
11
|
adminToolsOnly: boolean;
|
|
12
12
|
/**
|
|
13
|
-
* Where `
|
|
13
|
+
* Where `upload_artifact` looks when it was handed only a file name or a
|
|
14
|
+
* sandbox path that does not exist on this host.
|
|
14
15
|
*
|
|
15
16
|
* A file attached to a chat lives in the model's own sandbox, so the path the
|
|
16
17
|
* model can quote is unreadable here even though the user downloaded the file
|
|
17
|
-
* to this machine.
|
|
18
|
-
* directories are searched, so a caller cannot walk the filesystem with it.
|
|
18
|
+
* to this machine. Exact absolute host paths are read directly.
|
|
19
19
|
*/
|
|
20
20
|
importSearchDirs: string[];
|
|
21
21
|
/**
|
|
22
22
|
* How long the held socket's liveness beat must stay lost before the turn
|
|
23
23
|
* running on it is given up on. Exposed because this is the one knob that can
|
|
24
|
-
* end a turn the sandbox might still have finished
|
|
25
|
-
* turn budget disables the behavior without a deploy.
|
|
24
|
+
* end a turn the sandbox might still have finished.
|
|
26
25
|
*/
|
|
27
26
|
beatLostGraceMs: number;
|
|
28
27
|
/**
|
|
@@ -37,11 +36,6 @@ export type GatewayConfig = {
|
|
|
37
36
|
* sandbox's only editor peer, which is the peer Clark's API calls run on.
|
|
38
37
|
*/
|
|
39
38
|
heldSessionReleaseAfterTurnMs: number;
|
|
40
|
-
/**
|
|
41
|
-
* How long `start_app` / `edit_app` wait for Clark's generation turn after
|
|
42
|
-
* the prompt is acknowledged.
|
|
43
|
-
*/
|
|
44
|
-
clarkTurnTimeoutMs: number;
|
|
45
39
|
/**
|
|
46
40
|
* Quiet window after Clark emits completed/idle before treating the job as
|
|
47
41
|
* done, so an acknowledgment that resumes generating is coalesced.
|
|
@@ -61,25 +55,24 @@ export type GatewayConfig = {
|
|
|
61
55
|
* Chromium headroom and you want Clark to drive browser_* tools.
|
|
62
56
|
*/
|
|
63
57
|
clarkTestingEnabled: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Least time a single `check_app_progress` call collects Clark activity for
|
|
60
|
+
* before answering, so a talkative build comes back in whole thoughts rather
|
|
61
|
+
* than a line at a time. Only ever spends part of
|
|
62
|
+
* {@link GatewayConfig.clarkProgressWaitMs}, and never delays a finished
|
|
63
|
+
* turn: a decision waiting on a human is what the poll exists to surface.
|
|
64
|
+
* Zero answers on the first line.
|
|
65
|
+
*/
|
|
66
|
+
clarkProgressFloorMs: number;
|
|
64
67
|
/**
|
|
65
68
|
* How long a single `check_app_progress` call waits for new Clark activity
|
|
66
69
|
* before answering with what it has. Sized to stay inside a client's tool
|
|
67
70
|
* timeout so the caller can poll again rather than lose the turn.
|
|
68
71
|
*/
|
|
69
72
|
clarkProgressWaitMs: number;
|
|
70
|
-
/**
|
|
71
|
-
* How long to wait between `check_app_progress` polls once a plan is
|
|
72
|
-
* approved and the app is being built. Longer than
|
|
73
|
-
* {@link GatewayConfig.clarkProgressWaitMs} so a multi-minute build does not
|
|
74
|
-
* burn through a host's tool-call budget; the plan phase still uses the
|
|
75
|
-
* shorter progress wait so a decision surfaces quickly.
|
|
76
|
-
*/
|
|
77
|
-
clarkBuildPollAfterMs: number;
|
|
78
73
|
/**
|
|
79
74
|
* How long a build may run without saying anything before a poll warns that
|
|
80
|
-
* it has gone quiet.
|
|
81
|
-
* {@link GatewayConfig.clarkTurnTimeoutMs}, so the caller hears about the
|
|
82
|
-
* silence long before the turn is given up on.
|
|
75
|
+
* it has gone quiet. The hint is nonterminal; the caller can keep polling.
|
|
83
76
|
*/
|
|
84
77
|
clarkStallHintAfterMs: number;
|
|
85
78
|
/**
|
|
@@ -88,14 +81,20 @@ export type GatewayConfig = {
|
|
|
88
81
|
* Hosts abandon a tool call after their own timeout, and a host that
|
|
89
82
|
* advertises progress notifications is under no obligation to act on them —
|
|
90
83
|
* so a call cannot be allowed to run past this on the strength of having
|
|
91
|
-
* sent progress. Anything still unfinished here returns
|
|
92
|
-
* instead of holding the request open.
|
|
84
|
+
* sent progress. Anything still unfinished here returns its current status
|
|
85
|
+
* and a cursor instead of holding the request open.
|
|
93
86
|
*/
|
|
94
87
|
hostCallCeilingMs: number;
|
|
95
88
|
/**
|
|
96
89
|
* How long `publish_app` polls a queued deploy before giving up.
|
|
97
90
|
*/
|
|
98
91
|
publishWaitTimeoutMs: number;
|
|
92
|
+
/**
|
|
93
|
+
* How long a single `check_publish_progress` call watches the rollout
|
|
94
|
+
* before answering with its current state. Sized to stay inside a client's
|
|
95
|
+
* tool timeout so the caller can poll again rather than lose the turn.
|
|
96
|
+
*/
|
|
97
|
+
publishProgressWaitMs: number;
|
|
99
98
|
/**
|
|
100
99
|
* Interval between deploy-status polls while waiting for a queued publish.
|
|
101
100
|
*/
|
package/dist/config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { homedir } from "node:os";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { DEFAULT_STEP_UP_TTL_MS } from "./stores/types.js";
|
|
4
4
|
/**
|
|
5
5
|
* Reads an env var, treating blank as absent.
|
|
6
6
|
*
|
|
@@ -27,8 +27,7 @@ function explicitEnvironmentName(env) {
|
|
|
27
27
|
* folder, the desktop, or a temp directory, which is where Claude's own
|
|
28
28
|
* downloads land. `/tmp` and `/private/tmp` cover the macOS `/tmp` symlink both
|
|
29
29
|
* ways; `/private/var/folders` covers Claude's realpath'd temp dirs without
|
|
30
|
-
* opening the rest of `/private
|
|
31
|
-
* operator who needs more sets the env var.
|
|
30
|
+
* opening the rest of `/private` during the fallback search.
|
|
32
31
|
*/
|
|
33
32
|
function resolveImportSearchDirs(env) {
|
|
34
33
|
const configured = readEnv(env, "GATEWAY_IMPORT_SEARCH_DIRS");
|
|
@@ -76,27 +75,29 @@ export function loadConfig(env = process.env) {
|
|
|
76
75
|
heldSessionIdleMs: Number(readEnv(env, "GATEWAY_HELD_SESSION_IDLE_MS") ?? String(30 * 60 * 1000)),
|
|
77
76
|
heldSessionReleaseAfterTurnMs: Number(readEnv(env, "GATEWAY_HELD_SESSION_RELEASE_AFTER_TURN_MS") ??
|
|
78
77
|
String(30_000)),
|
|
79
|
-
clarkTurnTimeoutMs: Number(readEnv(env, "GATEWAY_CLARK_TURN_TIMEOUT_MS") ?? String(10 * 60 * 1000)),
|
|
80
78
|
clarkSettleMs: Number(readEnv(env, "GATEWAY_CLARK_SETTLE_MS") ?? String(12_000)),
|
|
81
79
|
clarkReadyWaitMs: Number(readEnv(env, "GATEWAY_CLARK_READY_WAIT_MS") ?? String(30_000)),
|
|
82
80
|
clarkTestingEnabled: readEnv(env, "GATEWAY_CLARK_TESTING_ENABLED") === "true" ||
|
|
83
81
|
readEnv(env, "GATEWAY_CLARK_TESTING_ENABLED") === "1",
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
//
|
|
90
|
-
|
|
82
|
+
// clarkProgressFloorMs and clarkProgressWaitMs are used to control the polling behavior
|
|
83
|
+
// of the progress poll in the check_app_progress tool.
|
|
84
|
+
// Minimum time a progress poll waits to collect activity for before it answers.
|
|
85
|
+
// If the turn is finished (ex: needs a user decision), it will answer immediately.
|
|
86
|
+
clarkProgressFloorMs: Number(readEnv(env, "GATEWAY_CLARK_PROGRESS_FLOOR_MS") ?? String(20_000)),
|
|
87
|
+
// Maximum time a progress poll waits to collect activity for before it answers.
|
|
88
|
+
// This is the ceiling on the poll. If we reach the ceiling,
|
|
89
|
+
// we will answer with what we have (can be empty if no activity).
|
|
90
|
+
clarkProgressWaitMs: Number(readEnv(env, "GATEWAY_CLARK_PROGRESS_WAIT_MS") ?? String(25_000)),
|
|
91
91
|
clarkStallHintAfterMs: Number(readEnv(env, "GATEWAY_CLARK_STALL_HINT_AFTER_MS") ?? String(120_000)),
|
|
92
92
|
// Under the 60s most MCP hosts allow a tool call, with room for the
|
|
93
93
|
// response to be written and read.
|
|
94
94
|
hostCallCeilingMs: Number(readEnv(env, "GATEWAY_HOST_CALL_CEILING_MS") ?? String(50_000)),
|
|
95
95
|
publishWaitTimeoutMs: Number(readEnv(env, "GATEWAY_PUBLISH_WAIT_TIMEOUT_MS") ?? String(2 * 60 * 1000)),
|
|
96
|
+
publishProgressWaitMs: Number(readEnv(env, "GATEWAY_PUBLISH_PROGRESS_WAIT_MS") ?? String(25_000)),
|
|
96
97
|
publishPollIntervalMs: Number(readEnv(env, "GATEWAY_PUBLISH_POLL_INTERVAL_MS") ?? "2000"),
|
|
97
98
|
profileKey: required(env, "GATEWAY_PROFILE_KEY", "default"),
|
|
98
99
|
serverUrl: required(env, "SUPERBLOCKS_SERVER_URL", readEnv(env, "GATEWAY_SERVER_URL") ?? baseUrl ?? "http://localhost:8080"),
|
|
99
|
-
turnTtlMs: Number(readEnv(env, "GATEWAY_TURN_TTL_MS") ??
|
|
100
|
+
turnTtlMs: Number(readEnv(env, "GATEWAY_TURN_TTL_MS") ?? DEFAULT_STEP_UP_TTL_MS),
|
|
100
101
|
uiBaseUrl: required(env, "GATEWAY_UI_BASE_URL", baseUrl ?? "http://localhost:3000"),
|
|
101
102
|
deployedShellBaseUrl: readEnv(env, "GATEWAY_DEPLOYED_SHELL_BASE_URL"),
|
|
102
103
|
publicViewerBaseUrl: readEnv(env, "GATEWAY_PUBLIC_VIEWER_BASE_URL"),
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/deps.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { GatewayConfig } from "./config.js";
|
|
2
|
-
import type {
|
|
3
|
-
import type { ProgressStore, RecentAppStore, TurnStore } from "./resume/types.js";
|
|
2
|
+
import type { AppState } from "./sabs/app-state.js";
|
|
4
3
|
import type { SessionPeer } from "./sabs/session-peer.js";
|
|
5
4
|
import type { SuperblocksServerClient } from "./server/client.js";
|
|
5
|
+
import type { ProgressStore, RecentAppStore, StepUpTurnStore } from "./stores/types.js";
|
|
6
6
|
import type { McpClientTelemetry } from "./telemetry/mcp-client.js";
|
|
7
7
|
/**
|
|
8
8
|
* Runtime collaborators for one Gateway process. Stdio MCP is the only
|
|
@@ -10,6 +10,8 @@ import type { McpClientTelemetry } from "./telemetry/mcp-client.js";
|
|
|
10
10
|
* client.
|
|
11
11
|
*/
|
|
12
12
|
export type AppDeps = {
|
|
13
|
+
/** Per-application facts shared by the session peer and the capabilities. */
|
|
14
|
+
appState: AppState;
|
|
13
15
|
config: GatewayConfig;
|
|
14
16
|
/**
|
|
15
17
|
* Personal API key of the already-logged-in Superblocks CLI user.
|
|
@@ -26,13 +28,11 @@ export type AppDeps = {
|
|
|
26
28
|
organizationId: string;
|
|
27
29
|
userId: string;
|
|
28
30
|
};
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
/** Each caller's place in a build's event stream, kept between calls. */
|
|
32
|
-
progressCursors: ProgressStore;
|
|
31
|
+
/** When each build last spoke, and whether its silence was reported. */
|
|
32
|
+
progress: ProgressStore;
|
|
33
33
|
recentApps: RecentAppStore;
|
|
34
34
|
mcpTelemetry?: Pick<McpClientTelemetry, "runTool" | "setOrganizationId">;
|
|
35
35
|
server: SuperblocksServerClient;
|
|
36
36
|
sessionPeer: SessionPeer;
|
|
37
|
-
|
|
37
|
+
stepUpTurns: StepUpTurnStore;
|
|
38
38
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export { loadConfig } from "./config.js";
|
|
2
2
|
export { scanHostBrowserMcp } from "./capture/host-mcp-scan.js";
|
|
3
|
-
export { formatCaptureModeSummary, resolveCaptureMode, } from "./capture/mode.js";
|
|
4
|
-
export { editApp,
|
|
3
|
+
export { formatCaptureModeSummary, formatCaptureModeUserSummary, resolveCaptureMode, } from "./capture/mode.js";
|
|
4
|
+
export { editApp, IMPORT_ZIP_MAX_BYTES, previewApp, publishApp, startApp, uploadArtifact, } from "./capabilities/lifecycle.js";
|
|
5
5
|
export { GATEWAY_FAULT_EXIT_CODE } from "./process/fault-barrier.js";
|
|
6
6
|
export { startStdioGateway } from "./start.js";
|
|
7
7
|
export type { StartGatewayOptions, StartedGateway } from "./start.js";
|
|
8
8
|
export { ensurePlaywrightChromium, playwrightChromiumPresent, } from "./playwright/ensure-chromium.js";
|
|
9
|
-
export { MemoryRecentAppStore } from "./resume/memory-recent-app-store.js";
|
|
10
|
-
export { MemoryTurnStore } from "./resume/memory-turn-store.js";
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export { loadConfig } from "./config.js";
|
|
2
2
|
export { scanHostBrowserMcp } from "./capture/host-mcp-scan.js";
|
|
3
|
-
export { formatCaptureModeSummary, resolveCaptureMode, } from "./capture/mode.js";
|
|
4
|
-
export { editApp,
|
|
3
|
+
export { formatCaptureModeSummary, formatCaptureModeUserSummary, resolveCaptureMode, } from "./capture/mode.js";
|
|
4
|
+
export { editApp, IMPORT_ZIP_MAX_BYTES, previewApp, publishApp, startApp, uploadArtifact, } from "./capabilities/lifecycle.js";
|
|
5
5
|
export { GATEWAY_FAULT_EXIT_CODE } from "./process/fault-barrier.js";
|
|
6
6
|
export { startStdioGateway } from "./start.js";
|
|
7
7
|
export { ensurePlaywrightChromium, playwrightChromiumPresent, } from "./playwright/ensure-chromium.js";
|
|
8
|
-
export { MemoryRecentAppStore } from "./resume/memory-recent-app-store.js";
|
|
9
|
-
export { MemoryTurnStore } from "./resume/memory-turn-store.js";
|
|
10
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,OAAO,EACP,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { loadModule, parseSync } from "libpg-query";
|
|
2
|
+
import { LakebasePlugin, PostgresPlugin, SnowflakePostgresPlugin, } from "@superblocksteam/shared";
|
|
3
|
+
const POSTGRES_PLUGIN_IDS = new Set([
|
|
4
|
+
LakebasePlugin.id,
|
|
5
|
+
PostgresPlugin.id,
|
|
6
|
+
SnowflakePostgresPlugin.id,
|
|
7
|
+
]);
|
|
8
|
+
const READ_STATEMENT_KEYS = new Set([
|
|
9
|
+
"SelectStmt",
|
|
10
|
+
"VariableShowStmt",
|
|
11
|
+
]);
|
|
12
|
+
const MUTATION_STATEMENT_KEYS = new Set([
|
|
13
|
+
"DeleteStmt",
|
|
14
|
+
"InsertStmt",
|
|
15
|
+
"MergeStmt",
|
|
16
|
+
"UpdateStmt",
|
|
17
|
+
]);
|
|
18
|
+
const FORBIDDEN_NESTED_KEYS = new Set([
|
|
19
|
+
...MUTATION_STATEMENT_KEYS,
|
|
20
|
+
"TypeCast",
|
|
21
|
+
"intoClause",
|
|
22
|
+
"lockingClause",
|
|
23
|
+
]);
|
|
24
|
+
const READ_ONLY_FUNCTION_NAMES = new Set([
|
|
25
|
+
"avg",
|
|
26
|
+
"count",
|
|
27
|
+
"max",
|
|
28
|
+
"min",
|
|
29
|
+
"sum",
|
|
30
|
+
]);
|
|
31
|
+
const MAX_AST_DEPTH = 1_000;
|
|
32
|
+
let parserReady;
|
|
33
|
+
function ensureParserLoaded() {
|
|
34
|
+
parserReady ??= loadModule().catch((error) => {
|
|
35
|
+
parserReady = undefined;
|
|
36
|
+
throw error;
|
|
37
|
+
});
|
|
38
|
+
return parserReady;
|
|
39
|
+
}
|
|
40
|
+
function carriesValue(value) {
|
|
41
|
+
if (value === null || value === undefined) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return Array.isArray(value) ? value.length > 0 : true;
|
|
45
|
+
}
|
|
46
|
+
function containsKey(node, keys, depth = 0) {
|
|
47
|
+
if (depth > MAX_AST_DEPTH) {
|
|
48
|
+
throw new Error("SQL parse tree exceeds the safety limit");
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(node)) {
|
|
51
|
+
return node.some((child) => containsKey(child, keys, depth + 1));
|
|
52
|
+
}
|
|
53
|
+
if (node === null || typeof node !== "object") {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return Object.entries(node).some(([key, value]) => (keys.has(key) && carriesValue(value)) ||
|
|
57
|
+
containsKey(value, keys, depth + 1));
|
|
58
|
+
}
|
|
59
|
+
function nodeField(node, key) {
|
|
60
|
+
if (node === null || typeof node !== "object") {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const value = Reflect.get(node, key);
|
|
64
|
+
return value !== null && typeof value === "object" ? value : undefined;
|
|
65
|
+
}
|
|
66
|
+
function stringNodeValue(node) {
|
|
67
|
+
const stringNode = nodeField(node, "String");
|
|
68
|
+
if (!stringNode) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const value = Reflect.get(stringNode, "sval");
|
|
72
|
+
return typeof value === "string" ? value : undefined;
|
|
73
|
+
}
|
|
74
|
+
function isAllowedReadFunction(call) {
|
|
75
|
+
const funcname = Reflect.get(call, "funcname");
|
|
76
|
+
if (!Array.isArray(funcname)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
const names = [];
|
|
80
|
+
for (const part of funcname) {
|
|
81
|
+
const name = stringNodeValue(part);
|
|
82
|
+
if (name === undefined) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
names.push(name);
|
|
86
|
+
}
|
|
87
|
+
const functionName = names.at(-1)?.toLowerCase();
|
|
88
|
+
if (functionName === undefined) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (names.length > 1 &&
|
|
92
|
+
!(names.length === 2 && names[0]?.toLowerCase() === "pg_catalog")) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return READ_ONLY_FUNCTION_NAMES.has(functionName);
|
|
96
|
+
}
|
|
97
|
+
function containsUnsupportedFunction(node, depth = 0) {
|
|
98
|
+
if (depth > MAX_AST_DEPTH) {
|
|
99
|
+
throw new Error("SQL parse tree exceeds the safety limit");
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(node)) {
|
|
102
|
+
return node.some((child) => containsUnsupportedFunction(child, depth + 1));
|
|
103
|
+
}
|
|
104
|
+
if (node === null || typeof node !== "object") {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
const functionCall = nodeField(node, "FuncCall");
|
|
108
|
+
if (functionCall && !isAllowedReadFunction(functionCall)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
return Object.values(node).some((child) => containsUnsupportedFunction(child, depth + 1));
|
|
112
|
+
}
|
|
113
|
+
function explainRunsStatement(explain) {
|
|
114
|
+
const options = Reflect.get(explain, "options");
|
|
115
|
+
return (Array.isArray(options) &&
|
|
116
|
+
options.some((option) => {
|
|
117
|
+
const element = nodeField(option, "DefElem");
|
|
118
|
+
return element && Reflect.get(element, "defname") === "analyze";
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
function isReadOnlyStatement(statement) {
|
|
122
|
+
const [statementKey] = Object.keys(statement);
|
|
123
|
+
if (statementKey === undefined) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
if (statementKey === "ExplainStmt") {
|
|
127
|
+
const explain = nodeField(statement, statementKey);
|
|
128
|
+
if (explain === undefined) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (!explainRunsStatement(explain)) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
const explained = nodeField(explain, "query");
|
|
135
|
+
return explained !== undefined && isReadOnlyStatement(explained);
|
|
136
|
+
}
|
|
137
|
+
return (READ_STATEMENT_KEYS.has(statementKey) &&
|
|
138
|
+
!containsKey(statement, FORBIDDEN_NESTED_KEYS) &&
|
|
139
|
+
!containsUnsupportedFunction(statement));
|
|
140
|
+
}
|
|
141
|
+
function extractSingleStatement(parsed) {
|
|
142
|
+
if (parsed === null || typeof parsed !== "object" || !("stmts" in parsed)) {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
const { stmts } = parsed;
|
|
146
|
+
if (!Array.isArray(stmts) || stmts.length !== 1) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
return nodeField(stmts[0], "stmt");
|
|
150
|
+
}
|
|
151
|
+
export function supportsReadOnlyPostgresQuery(pluginId) {
|
|
152
|
+
return POSTGRES_PLUGIN_IDS.has(pluginId);
|
|
153
|
+
}
|
|
154
|
+
export async function isReadOnlyPostgresQuery(query) {
|
|
155
|
+
try {
|
|
156
|
+
await ensureParserLoaded();
|
|
157
|
+
const statement = extractSingleStatement(parseSync(query));
|
|
158
|
+
return statement !== undefined && isReadOnlyStatement(statement);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=read-only-postgres-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only-postgres-query.js","sourceRoot":"","sources":["../../src/integrations/read-only-postgres-query.ts"],"names":[],"mappings":"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"}
|