@superblocksteam/gateway 2.0.161-next.0 → 2.0.162-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.
Files changed (232) hide show
  1. package/README.md +135 -39
  2. package/dist/capabilities/lifecycle.d.ts +46 -29
  3. package/dist/capabilities/lifecycle.js +1731 -843
  4. package/dist/capabilities/lifecycle.js.map +1 -1
  5. package/dist/capabilities/query-integration.d.ts +14 -0
  6. package/dist/capabilities/query-integration.js +172 -0
  7. package/dist/capabilities/query-integration.js.map +1 -0
  8. package/dist/capabilities/source-files-archive.d.ts +11 -0
  9. package/dist/capabilities/source-files-archive.js +54 -0
  10. package/dist/capabilities/source-files-archive.js.map +1 -0
  11. package/dist/capabilities/types.d.ts +197 -119
  12. package/dist/capabilities/types.js +45 -6
  13. package/dist/capabilities/types.js.map +1 -1
  14. package/dist/capture/browser-contract.d.ts +15 -5
  15. package/dist/capture/browser-contract.js +13 -3
  16. package/dist/capture/browser-contract.js.map +1 -1
  17. package/dist/capture/browser-instructions.d.ts +3 -2
  18. package/dist/capture/browser-instructions.js +3 -2
  19. package/dist/capture/browser-instructions.js.map +1 -1
  20. package/dist/capture/mode.d.ts +8 -1
  21. package/dist/capture/mode.js +22 -2
  22. package/dist/capture/mode.js.map +1 -1
  23. package/dist/config.d.ts +22 -23
  24. package/dist/config.js +13 -12
  25. package/dist/config.js.map +1 -1
  26. package/dist/deps.d.ts +7 -7
  27. package/dist/index.d.ts +2 -4
  28. package/dist/index.js +2 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/integrations/read-only-postgres-query.d.ts +2 -0
  31. package/dist/integrations/read-only-postgres-query.js +164 -0
  32. package/dist/integrations/read-only-postgres-query.js.map +1 -0
  33. package/dist/main.js +1 -1
  34. package/dist/main.js.map +1 -1
  35. package/dist/playwright/ensure-chromium.d.ts +5 -7
  36. package/dist/playwright/ensure-chromium.js +13 -13
  37. package/dist/playwright/ensure-chromium.js.map +1 -1
  38. package/dist/preview/capture-screenshot.d.ts +30 -4
  39. package/dist/preview/capture-screenshot.js +67 -17
  40. package/dist/preview/capture-screenshot.js.map +1 -1
  41. package/dist/preview/viewer-url.js +3 -1
  42. package/dist/preview/viewer-url.js.map +1 -1
  43. package/dist/process/fault-barrier.js +1 -1
  44. package/dist/process/fault-barrier.js.map +1 -1
  45. package/dist/sabs/agent-facing-text.d.ts +2 -0
  46. package/dist/sabs/agent-facing-text.js +56 -2
  47. package/dist/sabs/agent-facing-text.js.map +1 -1
  48. package/dist/sabs/app-state.d.ts +126 -0
  49. package/dist/sabs/app-state.js +332 -0
  50. package/dist/sabs/app-state.js.map +1 -0
  51. package/dist/sabs/awaited-decision.d.ts +49 -0
  52. package/dist/sabs/awaited-decision.js +129 -0
  53. package/dist/sabs/awaited-decision.js.map +1 -0
  54. package/dist/sabs/editor-client-methods.d.ts +23 -5
  55. package/dist/sabs/editor-client-methods.js +45 -4
  56. package/dist/sabs/editor-client-methods.js.map +1 -1
  57. package/dist/sabs/editor-socket.d.ts +85 -0
  58. package/dist/sabs/editor-socket.js +67 -0
  59. package/dist/sabs/editor-socket.js.map +1 -0
  60. package/dist/sabs/session-peer.d.ts +119 -82
  61. package/dist/sabs/session-peer.js +10 -1
  62. package/dist/sabs/session-peer.js.map +1 -1
  63. package/dist/sabs/streamed-reply.d.ts +45 -0
  64. package/dist/sabs/streamed-reply.js +125 -0
  65. package/dist/sabs/streamed-reply.js.map +1 -0
  66. package/dist/sabs/turn-collector.d.ts +50 -35
  67. package/dist/sabs/turn-collector.js +110 -176
  68. package/dist/sabs/turn-collector.js.map +1 -1
  69. package/dist/sabs/websocket-session-peer.d.ts +104 -69
  70. package/dist/sabs/websocket-session-peer.js +1329 -475
  71. package/dist/sabs/websocket-session-peer.js.map +1 -1
  72. package/dist/server/client.d.ts +41 -9
  73. package/dist/server/client.js +126 -21
  74. package/dist/server/client.js.map +1 -1
  75. package/dist/start.d.ts +1 -1
  76. package/dist/start.js +30 -8
  77. package/dist/start.js.map +1 -1
  78. package/dist/stores/memory.d.ts +46 -0
  79. package/dist/stores/memory.js +163 -0
  80. package/dist/stores/memory.js.map +1 -0
  81. package/dist/stores/types.d.ts +92 -0
  82. package/dist/stores/types.js +11 -0
  83. package/dist/stores/types.js.map +1 -0
  84. package/dist/telemetry/mcp-client.d.ts +6 -1
  85. package/dist/telemetry/mcp-client.js +100 -4
  86. package/dist/telemetry/mcp-client.js.map +1 -1
  87. package/dist/telemetry/metrics.d.ts +12 -3
  88. package/dist/telemetry/metrics.js +60 -14
  89. package/dist/telemetry/metrics.js.map +1 -1
  90. package/dist/telemetry/runtime.js +4 -6
  91. package/dist/telemetry/runtime.js.map +1 -1
  92. package/dist/transports/mcp/admin-tools.d.ts +8 -0
  93. package/dist/transports/mcp/admin-tools.js +115 -4
  94. package/dist/transports/mcp/admin-tools.js.map +1 -1
  95. package/dist/transports/mcp/app-status-html.d.ts +4 -8
  96. package/dist/transports/mcp/app-status-html.js +336 -128
  97. package/dist/transports/mcp/app-status-html.js.map +1 -1
  98. package/dist/transports/mcp/client-presentation.d.ts +16 -0
  99. package/dist/transports/mcp/client-presentation.js +13 -0
  100. package/dist/transports/mcp/client-presentation.js.map +1 -0
  101. package/dist/transports/mcp/cowork-editor-url.d.ts +6 -0
  102. package/dist/transports/mcp/cowork-editor-url.js +10 -0
  103. package/dist/transports/mcp/cowork-editor-url.js.map +1 -0
  104. package/dist/transports/mcp/decision-card-html.d.ts +26 -0
  105. package/dist/transports/mcp/decision-card-html.js +876 -0
  106. package/dist/transports/mcp/decision-card-html.js.map +1 -0
  107. package/dist/transports/mcp/decision-elicitation.d.ts +42 -0
  108. package/dist/transports/mcp/decision-elicitation.js +59 -0
  109. package/dist/transports/mcp/decision-elicitation.js.map +1 -1
  110. package/dist/transports/mcp/editor-document-probe.d.ts +4 -0
  111. package/dist/transports/mcp/editor-document-probe.js +35 -0
  112. package/dist/transports/mcp/editor-document-probe.js.map +1 -0
  113. package/dist/transports/mcp/editor-integration-setup-url.d.ts +14 -0
  114. package/dist/transports/mcp/editor-integration-setup-url.js +29 -0
  115. package/dist/transports/mcp/editor-integration-setup-url.js.map +1 -0
  116. package/dist/transports/mcp/format-tool-content.d.ts +13 -18
  117. package/dist/transports/mcp/format-tool-content.js +172 -13
  118. package/dist/transports/mcp/format-tool-content.js.map +1 -1
  119. package/dist/transports/mcp/instructions/index.d.ts +23 -0
  120. package/dist/transports/mcp/instructions/index.js +81 -0
  121. package/dist/transports/mcp/instructions/index.js.map +1 -0
  122. package/dist/transports/mcp/instructions/result.d.ts +18 -0
  123. package/dist/transports/mcp/instructions/result.js +58 -0
  124. package/dist/transports/mcp/instructions/result.js.map +1 -0
  125. package/dist/transports/mcp/instructions/tools/ask-user.d.ts +2 -0
  126. package/dist/transports/mcp/instructions/tools/ask-user.js +20 -0
  127. package/dist/transports/mcp/instructions/tools/ask-user.js.map +1 -0
  128. package/dist/transports/mcp/instructions/tools/build-app.d.ts +4 -0
  129. package/dist/transports/mcp/instructions/tools/build-app.js +54 -0
  130. package/dist/transports/mcp/instructions/tools/build-app.js.map +1 -0
  131. package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +3 -0
  132. package/dist/transports/mcp/instructions/tools/check-app-progress.js +79 -0
  133. package/dist/transports/mcp/instructions/tools/check-app-progress.js.map +1 -0
  134. package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +3 -0
  135. package/dist/transports/mcp/instructions/tools/check-publish-progress.js +23 -0
  136. package/dist/transports/mcp/instructions/tools/check-publish-progress.js.map +1 -0
  137. package/dist/transports/mcp/instructions/tools/copy.d.ts +18 -0
  138. package/dist/transports/mcp/instructions/tools/copy.js +49 -0
  139. package/dist/transports/mcp/instructions/tools/copy.js.map +1 -0
  140. package/dist/transports/mcp/instructions/tools/create-integration.d.ts +4 -0
  141. package/dist/transports/mcp/instructions/tools/create-integration.js +41 -0
  142. package/dist/transports/mcp/instructions/tools/create-integration.js.map +1 -0
  143. package/dist/transports/mcp/instructions/tools/edit-app.d.ts +3 -0
  144. package/dist/transports/mcp/instructions/tools/edit-app.js +18 -0
  145. package/dist/transports/mcp/instructions/tools/edit-app.js.map +1 -0
  146. package/dist/transports/mcp/instructions/tools/get-app.d.ts +3 -0
  147. package/dist/transports/mcp/instructions/tools/get-app.js +49 -0
  148. package/dist/transports/mcp/instructions/tools/get-app.js.map +1 -0
  149. package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +2 -0
  150. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js +13 -0
  151. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js.map +1 -0
  152. package/dist/transports/mcp/instructions/tools/index.d.ts +7 -0
  153. package/dist/transports/mcp/instructions/tools/index.js +31 -0
  154. package/dist/transports/mcp/instructions/tools/index.js.map +1 -0
  155. package/dist/transports/mcp/instructions/tools/publish-app.d.ts +3 -0
  156. package/dist/transports/mcp/instructions/tools/publish-app.js +23 -0
  157. package/dist/transports/mcp/instructions/tools/publish-app.js.map +1 -0
  158. package/dist/transports/mcp/instructions/tools/start-app.d.ts +3 -0
  159. package/dist/transports/mcp/instructions/tools/start-app.js +22 -0
  160. package/dist/transports/mcp/instructions/tools/start-app.js.map +1 -0
  161. package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +2 -0
  162. package/dist/transports/mcp/instructions/tools/upload-artifact.js +13 -0
  163. package/dist/transports/mcp/instructions/tools/upload-artifact.js.map +1 -0
  164. package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
  165. package/dist/transports/mcp/mcp-app-brand-css.js +180 -0
  166. package/dist/transports/mcp/mcp-app-brand-css.js.map +1 -0
  167. package/dist/transports/mcp/mount.d.ts +14 -1
  168. package/dist/transports/mcp/mount.js +729 -172
  169. package/dist/transports/mcp/mount.js.map +1 -1
  170. package/dist/transports/mcp/native-browser-presence.d.ts +45 -0
  171. package/dist/transports/mcp/native-browser-presence.js +158 -0
  172. package/dist/transports/mcp/native-browser-presence.js.map +1 -0
  173. package/dist/transports/mcp/plan-approval.d.ts +44 -0
  174. package/dist/transports/mcp/plan-approval.js +179 -0
  175. package/dist/transports/mcp/plan-approval.js.map +1 -0
  176. package/dist/transports/mcp/session-directory.d.ts +7 -0
  177. package/dist/transports/mcp/session-directory.js +18 -0
  178. package/dist/transports/mcp/session-directory.js.map +1 -0
  179. package/dist/transports/mcp/tool-names.d.ts +2 -0
  180. package/dist/transports/mcp/tool-names.js +2 -0
  181. package/dist/transports/mcp/tool-names.js.map +1 -0
  182. package/package.json +16 -7
  183. package/skills/superblocks-build/SKILL.md +59 -0
  184. package/skills/superblocks-import/SKILL.md +125 -0
  185. package/dist/capabilities/import-prompt.d.ts +0 -11
  186. package/dist/capabilities/import-prompt.js +0 -96
  187. package/dist/capabilities/import-prompt.js.map +0 -1
  188. package/dist/capabilities/persisted-progress.d.ts +0 -46
  189. package/dist/capabilities/persisted-progress.js +0 -246
  190. package/dist/capabilities/persisted-progress.js.map +0 -1
  191. package/dist/events/cursor.d.ts +0 -43
  192. package/dist/events/cursor.js +0 -78
  193. package/dist/events/cursor.js.map +0 -1
  194. package/dist/events/memory-event-store.d.ts +0 -34
  195. package/dist/events/memory-event-store.js +0 -110
  196. package/dist/events/memory-event-store.js.map +0 -1
  197. package/dist/events/merge.d.ts +0 -23
  198. package/dist/events/merge.js +0 -97
  199. package/dist/events/merge.js.map +0 -1
  200. package/dist/events/normalized-collector.d.ts +0 -62
  201. package/dist/events/normalized-collector.js +0 -156
  202. package/dist/events/normalized-collector.js.map +0 -1
  203. package/dist/events/schema.d.ts +0 -9
  204. package/dist/events/schema.js +0 -93
  205. package/dist/events/schema.js.map +0 -1
  206. package/dist/events/snapshot.d.ts +0 -32
  207. package/dist/events/snapshot.js +0 -57
  208. package/dist/events/snapshot.js.map +0 -1
  209. package/dist/events/stream-key.d.ts +0 -2
  210. package/dist/events/stream-key.js +0 -31
  211. package/dist/events/stream-key.js.map +0 -1
  212. package/dist/events/types.d.ts +0 -179
  213. package/dist/events/types.js +0 -66
  214. package/dist/events/types.js.map +0 -1
  215. package/dist/resume/memory-progress-store.d.ts +0 -39
  216. package/dist/resume/memory-progress-store.js +0 -82
  217. package/dist/resume/memory-progress-store.js.map +0 -1
  218. package/dist/resume/memory-recent-app-store.d.ts +0 -14
  219. package/dist/resume/memory-recent-app-store.js +0 -27
  220. package/dist/resume/memory-recent-app-store.js.map +0 -1
  221. package/dist/resume/memory-turn-store.d.ts +0 -18
  222. package/dist/resume/memory-turn-store.js +0 -73
  223. package/dist/resume/memory-turn-store.js.map +0 -1
  224. package/dist/resume/progress-key.d.ts +0 -21
  225. package/dist/resume/progress-key.js +0 -58
  226. package/dist/resume/progress-key.js.map +0 -1
  227. package/dist/resume/stores.d.ts +0 -14
  228. package/dist/resume/stores.js +0 -18
  229. package/dist/resume/stores.js.map +0 -1
  230. package/dist/resume/types.d.ts +0 -124
  231. package/dist/resume/types.js +0 -13
  232. 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 gateway setup. Gateway Chromium cannot complete IdP. Config on disk can lie if a listed server fails to start.";
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
- * Until a loopback capture URL exists, live canvas is not a navigate target:
10
- * `canvas.doNotOpen` is the edit URL (opening it mid-build steals the turn).
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
- doNotOpen: string;
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: typeof HOST_BROWSER_TOOLS_UNKNOWN;
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 gateway setup. Gateway Chromium cannot complete IdP. Config on disk can lie if a listed server fails to start.";
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: { doNotOpen: input.editUrl },
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;AAE7D,MAAM,CAAC,MAAM,oBAAoB,GAC/B,8FAA8F,CAAC;AAEjG,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEhE,MAAM,CAAC,MAAM,4BAA4B,GACvC,2OAA2O,CAAC;AAmB9O,MAAM,UAAU,0BAA0B,CAAC,KAK1C;IACC,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE;QACpC,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,0BAA0B;QAC5C,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
+ {"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
- * does not open the edit URL mid-build or paste tokens into evaluate.
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. NEVER open canvas.doNotOpen (the edit URL) while status is \"building\". That tab steals the live-edit turn and the gateway goes \"detached\".\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.";
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
- * does not open the edit URL mid-build or paste tokens into evaluate.
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. NEVER open canvas.doNotOpen (the edit URL) while status is "building". That tab steals the live-edit turn and the gateway goes "detached".
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;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;0HAO+E,CAAC"}
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"}
@@ -13,10 +13,17 @@ export declare function resolveCaptureMode(input: {
13
13
  hostMcpConfigured: boolean;
14
14
  }): CaptureMode;
15
15
  /**
16
- * Human + machine summary for `gateway setup` stderr. Info goes to stderr so
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;
@@ -21,7 +21,7 @@ export function resolveCaptureMode(input) {
21
21
  return "urls_only";
22
22
  }
23
23
  /**
24
- * Human + machine summary for `gateway setup` stderr. Info goes to stderr so
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 gateway setup --with-screenshots may help live-canvas capture and does not clear IdP. Add @playwright/mcp for IdP step-up.");
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
@@ -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,gTAAgT,CACjT,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"}
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 `import_app` looks for an archive it was handed the name of.
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. Only the file name is taken from that path, and only these
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: raising it far past the
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. Nonterminal and well under
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 pacing and a cursor
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 { DEFAULT_TURN_TTL_MS } from "./resume/types.js";
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`. Anything outside these is refused, so an
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
- // Ceiling on one progress poll, not a floor: a poll returns the moment
85
- // Clark says anything. Keep this around 10s so the plan phase stays
86
- // responsive; the post-approve build cadence is clarkBuildPollAfterMs.
87
- clarkProgressWaitMs: Number(readEnv(env, "GATEWAY_CLARK_PROGRESS_WAIT_MS") ?? String(10_000)),
88
- // Suggested gap between polls once a plan is approved. ~30s keeps a
89
- // 2-4 minute build inside Claude Desktop's tool-call budget.
90
- clarkBuildPollAfterMs: Number(readEnv(env, "GATEWAY_CLARK_BUILD_POLL_AFTER_MS") ?? String(30_000)),
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") ?? DEFAULT_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"),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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 { EventStore } from "./events/types.js";
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
- /** Durable, bounded history of what happened in each live-edit session. */
30
- events: EventStore;
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
- turns: TurnStore;
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, importApp, IMPORT_ZIP_MAX_BYTES, previewApp, publishApp, startApp, } from "./capabilities/lifecycle.js";
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, importApp, IMPORT_ZIP_MAX_BYTES, previewApp, publishApp, startApp, } from "./capabilities/lifecycle.js";
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,SAAS,EACT,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,QAAQ,GACT,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;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC"}
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,2 @@
1
+ export declare function supportsReadOnlyPostgresQuery(pluginId: string): boolean;
2
+ export declare function isReadOnlyPostgresQuery(query: string): Promise<boolean>;
@@ -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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"}