@superblocksteam/gateway 2.0.0-SNAPSHOT.1d4c72c0ab174c21

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 (248) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +291 -0
  3. package/dist/agents/resolve-orchestrator-url.d.ts +22 -0
  4. package/dist/agents/resolve-orchestrator-url.js +38 -0
  5. package/dist/agents/resolve-orchestrator-url.js.map +1 -0
  6. package/dist/capabilities/integration-metadata.d.ts +28 -0
  7. package/dist/capabilities/integration-metadata.js +174 -0
  8. package/dist/capabilities/integration-metadata.js.map +1 -0
  9. package/dist/capabilities/lifecycle.d.ts +93 -0
  10. package/dist/capabilities/lifecycle.js +3450 -0
  11. package/dist/capabilities/lifecycle.js.map +1 -0
  12. package/dist/capabilities/query-integration.d.ts +14 -0
  13. package/dist/capabilities/query-integration.js +172 -0
  14. package/dist/capabilities/query-integration.js.map +1 -0
  15. package/dist/capabilities/source-files-archive.d.ts +11 -0
  16. package/dist/capabilities/source-files-archive.js +54 -0
  17. package/dist/capabilities/source-files-archive.js.map +1 -0
  18. package/dist/capabilities/types.d.ts +542 -0
  19. package/dist/capabilities/types.js +86 -0
  20. package/dist/capabilities/types.js.map +1 -0
  21. package/dist/capture/browser-contract.d.ts +46 -0
  22. package/dist/capture/browser-contract.js +34 -0
  23. package/dist/capture/browser-contract.js.map +1 -0
  24. package/dist/capture/browser-instructions.d.ts +10 -0
  25. package/dist/capture/browser-instructions.js +18 -0
  26. package/dist/capture/browser-instructions.js.map +1 -0
  27. package/dist/capture/capture-library-probe.d.ts +55 -0
  28. package/dist/capture/capture-library-probe.js +177 -0
  29. package/dist/capture/capture-library-probe.js.map +1 -0
  30. package/dist/capture/capture-library.d.ts +52 -0
  31. package/dist/capture/capture-library.js +249 -0
  32. package/dist/capture/capture-library.js.map +1 -0
  33. package/dist/capture/classify-library-paint.d.ts +21 -0
  34. package/dist/capture/classify-library-paint.js +13 -0
  35. package/dist/capture/classify-library-paint.js.map +1 -0
  36. package/dist/capture/host-mcp-scan.d.ts +16 -0
  37. package/dist/capture/host-mcp-scan.js +64 -0
  38. package/dist/capture/host-mcp-scan.js.map +1 -0
  39. package/dist/capture/library-parent-script.d.ts +35 -0
  40. package/dist/capture/library-parent-script.js +82 -0
  41. package/dist/capture/library-parent-script.js.map +1 -0
  42. package/dist/capture/mode.d.ts +29 -0
  43. package/dist/capture/mode.js +65 -0
  44. package/dist/capture/mode.js.map +1 -0
  45. package/dist/config.d.ts +148 -0
  46. package/dist/config.js +111 -0
  47. package/dist/config.js.map +1 -0
  48. package/dist/debug.d.ts +2 -0
  49. package/dist/debug.js +9 -0
  50. package/dist/debug.js.map +1 -0
  51. package/dist/deps.d.ts +38 -0
  52. package/dist/deps.js +2 -0
  53. package/dist/deps.js.map +1 -0
  54. package/dist/health/readiness.d.ts +99 -0
  55. package/dist/health/readiness.js +202 -0
  56. package/dist/health/readiness.js.map +1 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.js +8 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/integrations/filters.d.ts +8 -0
  61. package/dist/integrations/filters.js +40 -0
  62. package/dist/integrations/filters.js.map +1 -0
  63. package/dist/integrations/map.d.ts +27 -0
  64. package/dist/integrations/map.js +43 -0
  65. package/dist/integrations/map.js.map +1 -0
  66. package/dist/integrations/profile-key.d.ts +19 -0
  67. package/dist/integrations/profile-key.js +35 -0
  68. package/dist/integrations/profile-key.js.map +1 -0
  69. package/dist/integrations/read-only-postgres-query.d.ts +2 -0
  70. package/dist/integrations/read-only-postgres-query.js +164 -0
  71. package/dist/integrations/read-only-postgres-query.js.map +1 -0
  72. package/dist/main.d.ts +2 -0
  73. package/dist/main.js +5 -0
  74. package/dist/main.js.map +1 -0
  75. package/dist/orchestrator/client.d.ts +62 -0
  76. package/dist/orchestrator/client.js +160 -0
  77. package/dist/orchestrator/client.js.map +1 -0
  78. package/dist/playwright/ensure-chromium.d.ts +24 -0
  79. package/dist/playwright/ensure-chromium.js +60 -0
  80. package/dist/playwright/ensure-chromium.js.map +1 -0
  81. package/dist/preview/capture-screenshot.d.ts +67 -0
  82. package/dist/preview/capture-screenshot.js +179 -0
  83. package/dist/preview/capture-screenshot.js.map +1 -0
  84. package/dist/preview/viewer-url.d.ts +82 -0
  85. package/dist/preview/viewer-url.js +130 -0
  86. package/dist/preview/viewer-url.js.map +1 -0
  87. package/dist/process/fault-barrier.d.ts +55 -0
  88. package/dist/process/fault-barrier.js +113 -0
  89. package/dist/process/fault-barrier.js.map +1 -0
  90. package/dist/sabs/agent-facing-text.d.ts +35 -0
  91. package/dist/sabs/agent-facing-text.js +165 -0
  92. package/dist/sabs/agent-facing-text.js.map +1 -0
  93. package/dist/sabs/app-state.d.ts +126 -0
  94. package/dist/sabs/app-state.js +332 -0
  95. package/dist/sabs/app-state.js.map +1 -0
  96. package/dist/sabs/awaited-decision.d.ts +47 -0
  97. package/dist/sabs/awaited-decision.js +124 -0
  98. package/dist/sabs/awaited-decision.js.map +1 -0
  99. package/dist/sabs/browser-context.d.ts +53 -0
  100. package/dist/sabs/browser-context.js +92 -0
  101. package/dist/sabs/browser-context.js.map +1 -0
  102. package/dist/sabs/editor-client-methods.d.ts +164 -0
  103. package/dist/sabs/editor-client-methods.js +750 -0
  104. package/dist/sabs/editor-client-methods.js.map +1 -0
  105. package/dist/sabs/editor-socket.d.ts +84 -0
  106. package/dist/sabs/editor-socket.js +64 -0
  107. package/dist/sabs/editor-socket.js.map +1 -0
  108. package/dist/sabs/recent-tool-runs.d.ts +14 -0
  109. package/dist/sabs/recent-tool-runs.js +61 -0
  110. package/dist/sabs/recent-tool-runs.js.map +1 -0
  111. package/dist/sabs/session-peer.d.ts +392 -0
  112. package/dist/sabs/session-peer.js +11 -0
  113. package/dist/sabs/session-peer.js.map +1 -0
  114. package/dist/sabs/streamed-reply.d.ts +42 -0
  115. package/dist/sabs/streamed-reply.js +110 -0
  116. package/dist/sabs/streamed-reply.js.map +1 -0
  117. package/dist/sabs/turn-collector.d.ts +169 -0
  118. package/dist/sabs/turn-collector.js +506 -0
  119. package/dist/sabs/turn-collector.js.map +1 -0
  120. package/dist/sabs/websocket-session-peer.d.ts +540 -0
  121. package/dist/sabs/websocket-session-peer.js +3289 -0
  122. package/dist/sabs/websocket-session-peer.js.map +1 -0
  123. package/dist/security/constant-time.d.ts +9 -0
  124. package/dist/security/constant-time.js +13 -0
  125. package/dist/security/constant-time.js.map +1 -0
  126. package/dist/server/client.d.ts +405 -0
  127. package/dist/server/client.js +684 -0
  128. package/dist/server/client.js.map +1 -0
  129. package/dist/server/identity-reads.d.ts +76 -0
  130. package/dist/server/identity-reads.js +209 -0
  131. package/dist/server/identity-reads.js.map +1 -0
  132. package/dist/start.d.ts +24 -0
  133. package/dist/start.js +81 -0
  134. package/dist/start.js.map +1 -0
  135. package/dist/stores/memory.d.ts +42 -0
  136. package/dist/stores/memory.js +121 -0
  137. package/dist/stores/memory.js.map +1 -0
  138. package/dist/stores/types.d.ts +74 -0
  139. package/dist/stores/types.js +11 -0
  140. package/dist/stores/types.js.map +1 -0
  141. package/dist/telemetry/mcp-client.d.ts +22 -0
  142. package/dist/telemetry/mcp-client.js +140 -0
  143. package/dist/telemetry/mcp-client.js.map +1 -0
  144. package/dist/telemetry/metrics.d.ts +41 -0
  145. package/dist/telemetry/metrics.js +103 -0
  146. package/dist/telemetry/metrics.js.map +1 -0
  147. package/dist/telemetry/runtime.d.ts +9 -0
  148. package/dist/telemetry/runtime.js +118 -0
  149. package/dist/telemetry/runtime.js.map +1 -0
  150. package/dist/transports/mcp/admin-tools.d.ts +56 -0
  151. package/dist/transports/mcp/admin-tools.js +252 -0
  152. package/dist/transports/mcp/admin-tools.js.map +1 -0
  153. package/dist/transports/mcp/app-status-html.d.ts +11 -0
  154. package/dist/transports/mcp/app-status-html.js +899 -0
  155. package/dist/transports/mcp/app-status-html.js.map +1 -0
  156. package/dist/transports/mcp/client-presentation.d.ts +16 -0
  157. package/dist/transports/mcp/client-presentation.js +13 -0
  158. package/dist/transports/mcp/client-presentation.js.map +1 -0
  159. package/dist/transports/mcp/cowork-editor-url.d.ts +6 -0
  160. package/dist/transports/mcp/cowork-editor-url.js +10 -0
  161. package/dist/transports/mcp/cowork-editor-url.js.map +1 -0
  162. package/dist/transports/mcp/decision-card-html.d.ts +26 -0
  163. package/dist/transports/mcp/decision-card-html.js +876 -0
  164. package/dist/transports/mcp/decision-card-html.js.map +1 -0
  165. package/dist/transports/mcp/decision-elicitation.d.ts +116 -0
  166. package/dist/transports/mcp/decision-elicitation.js +292 -0
  167. package/dist/transports/mcp/decision-elicitation.js.map +1 -0
  168. package/dist/transports/mcp/dispatch-probe.d.ts +24 -0
  169. package/dist/transports/mcp/dispatch-probe.js +48 -0
  170. package/dist/transports/mcp/dispatch-probe.js.map +1 -0
  171. package/dist/transports/mcp/editor-document-probe.d.ts +4 -0
  172. package/dist/transports/mcp/editor-document-probe.js +35 -0
  173. package/dist/transports/mcp/editor-document-probe.js.map +1 -0
  174. package/dist/transports/mcp/editor-integration-setup-url.d.ts +8 -0
  175. package/dist/transports/mcp/editor-integration-setup-url.js +23 -0
  176. package/dist/transports/mcp/editor-integration-setup-url.js.map +1 -0
  177. package/dist/transports/mcp/format-tool-content.d.ts +20 -0
  178. package/dist/transports/mcp/format-tool-content.js +89 -0
  179. package/dist/transports/mcp/format-tool-content.js.map +1 -0
  180. package/dist/transports/mcp/instructions/index.d.ts +23 -0
  181. package/dist/transports/mcp/instructions/index.js +81 -0
  182. package/dist/transports/mcp/instructions/index.js.map +1 -0
  183. package/dist/transports/mcp/instructions/result.d.ts +18 -0
  184. package/dist/transports/mcp/instructions/result.js +58 -0
  185. package/dist/transports/mcp/instructions/result.js.map +1 -0
  186. package/dist/transports/mcp/instructions/tools/ask-user.d.ts +2 -0
  187. package/dist/transports/mcp/instructions/tools/ask-user.js +17 -0
  188. package/dist/transports/mcp/instructions/tools/ask-user.js.map +1 -0
  189. package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +3 -0
  190. package/dist/transports/mcp/instructions/tools/check-app-progress.js +75 -0
  191. package/dist/transports/mcp/instructions/tools/check-app-progress.js.map +1 -0
  192. package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +3 -0
  193. package/dist/transports/mcp/instructions/tools/check-publish-progress.js +23 -0
  194. package/dist/transports/mcp/instructions/tools/check-publish-progress.js.map +1 -0
  195. package/dist/transports/mcp/instructions/tools/copy.d.ts +14 -0
  196. package/dist/transports/mcp/instructions/tools/copy.js +35 -0
  197. package/dist/transports/mcp/instructions/tools/copy.js.map +1 -0
  198. package/dist/transports/mcp/instructions/tools/create-integration.d.ts +4 -0
  199. package/dist/transports/mcp/instructions/tools/create-integration.js +41 -0
  200. package/dist/transports/mcp/instructions/tools/create-integration.js.map +1 -0
  201. package/dist/transports/mcp/instructions/tools/edit-app.d.ts +2 -0
  202. package/dist/transports/mcp/instructions/tools/edit-app.js +18 -0
  203. package/dist/transports/mcp/instructions/tools/edit-app.js.map +1 -0
  204. package/dist/transports/mcp/instructions/tools/get-app.d.ts +3 -0
  205. package/dist/transports/mcp/instructions/tools/get-app.js +47 -0
  206. package/dist/transports/mcp/instructions/tools/get-app.js.map +1 -0
  207. package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +2 -0
  208. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js +13 -0
  209. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js.map +1 -0
  210. package/dist/transports/mcp/instructions/tools/index.d.ts +7 -0
  211. package/dist/transports/mcp/instructions/tools/index.js +26 -0
  212. package/dist/transports/mcp/instructions/tools/index.js.map +1 -0
  213. package/dist/transports/mcp/instructions/tools/preview-app.d.ts +3 -0
  214. package/dist/transports/mcp/instructions/tools/preview-app.js +14 -0
  215. package/dist/transports/mcp/instructions/tools/preview-app.js.map +1 -0
  216. package/dist/transports/mcp/instructions/tools/publish-app.d.ts +3 -0
  217. package/dist/transports/mcp/instructions/tools/publish-app.js +23 -0
  218. package/dist/transports/mcp/instructions/tools/publish-app.js.map +1 -0
  219. package/dist/transports/mcp/instructions/tools/start-app.d.ts +2 -0
  220. package/dist/transports/mcp/instructions/tools/start-app.js +22 -0
  221. package/dist/transports/mcp/instructions/tools/start-app.js.map +1 -0
  222. package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +2 -0
  223. package/dist/transports/mcp/instructions/tools/upload-artifact.js +13 -0
  224. package/dist/transports/mcp/instructions/tools/upload-artifact.js.map +1 -0
  225. package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
  226. package/dist/transports/mcp/mcp-app-brand-css.js +180 -0
  227. package/dist/transports/mcp/mcp-app-brand-css.js.map +1 -0
  228. package/dist/transports/mcp/mount.d.ts +22 -0
  229. package/dist/transports/mcp/mount.js +1040 -0
  230. package/dist/transports/mcp/mount.js.map +1 -0
  231. package/dist/transports/mcp/native-browser-presence.d.ts +45 -0
  232. package/dist/transports/mcp/native-browser-presence.js +158 -0
  233. package/dist/transports/mcp/native-browser-presence.js.map +1 -0
  234. package/dist/transports/mcp/plan-approval.d.ts +38 -0
  235. package/dist/transports/mcp/plan-approval.js +175 -0
  236. package/dist/transports/mcp/plan-approval.js.map +1 -0
  237. package/dist/transports/mcp/progress-notifier.d.ts +39 -0
  238. package/dist/transports/mcp/progress-notifier.js +52 -0
  239. package/dist/transports/mcp/progress-notifier.js.map +1 -0
  240. package/dist/transports/mcp/session-directory.d.ts +7 -0
  241. package/dist/transports/mcp/session-directory.js +18 -0
  242. package/dist/transports/mcp/session-directory.js.map +1 -0
  243. package/dist/transports/mcp/tool-names.d.ts +2 -0
  244. package/dist/transports/mcp/tool-names.js +2 -0
  245. package/dist/transports/mcp/tool-names.js.map +1 -0
  246. package/package.json +78 -0
  247. package/skills/superblocks-build/SKILL.md +59 -0
  248. package/skills/superblocks-import/SKILL.md +88 -0
@@ -0,0 +1,34 @@
1
+ /** The host drives its own embedded browser; 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
+ */
8
+ export const HOST_BROWSER_TOOLS_UNKNOWN = "unknown";
9
+ export const MUST_NOT_CLOSE_UNTIL = "the Superblocks task is done (status ready, or the user no longer needs the browser session)";
10
+ export const NEEDS_BROWSER_DRIVER_CODE = "needs_browser_driver";
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.";
12
+ export function buildBrowserDriverContract(input) {
13
+ return {
14
+ captureMode: input.captureMode,
15
+ canvas: {
16
+ editUrl: input.editUrl,
17
+ openWhileBuilding: "claude_cowork_side_panel_only",
18
+ },
19
+ driver: {
20
+ ...(input.isolated ? { isolated: true } : {}),
21
+ mustNotCloseUntil: MUST_NOT_CLOSE_UNTIL,
22
+ },
23
+ hostBrowserTools: input.hostBrowserTools ?? HOST_BROWSER_TOOLS_UNKNOWN,
24
+ uiOrigin: { navigate: input.uiOrigin },
25
+ };
26
+ }
27
+ export function needsBrowserDriverError() {
28
+ return {
29
+ code: NEEDS_BROWSER_DRIVER_CODE,
30
+ kind: "error",
31
+ message: NEEDS_BROWSER_DRIVER_MESSAGE,
32
+ };
33
+ }
34
+ //# sourceMappingURL=browser-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-contract.js","sourceRoot":"","sources":["../../src/capture/browser-contract.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Numbered MUSTs for host browser drivers. Appended to MCP server
3
+ * instructions so a model that already has Playwright MCP (or agent-browser)
4
+ * opens the edit URL mid-build only in Cowork's side panel and never pastes
5
+ * tokens into evaluate.
6
+ *
7
+ * Detecting that this turn actually has those tools is ENG-5858's sibling
8
+ * concern; these lines only steer when the tools exist.
9
+ */
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.";
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Numbered MUSTs for host browser drivers. Appended to MCP server
3
+ * instructions so a model that already has Playwright MCP (or agent-browser)
4
+ * opens the edit URL mid-build only in Cowork's side panel and never pastes
5
+ * tokens into evaluate.
6
+ *
7
+ * Detecting that this turn actually has those tools is ENG-5858's sibling
8
+ * concern; these lines only steer when the tools exist.
9
+ */
10
+ export const BROWSER_DRIVER_INSTRUCTIONS = `Browser capture (MUST):
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.
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.
13
+ 3. NEVER paste tokens, JWTs, or API keys into browser evaluate or fill. Tokens are not in tool JSON; do not invent them.
14
+ 4. Playwright MCP MUST NOT use --isolated for Superblocks IdP. Cookies must survive the session.
15
+ 5. MUST NOT call browser_close until the Superblocks task is done (see driver.mustNotCloseUntil).
16
+ 6. agent-browser MUST always pass --profile and a stable --session for the same Superblocks origin.
17
+ 7. 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.`;
18
+ //# sourceMappingURL=browser-instructions.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Stderr probe for live-library capture when canvas execute is unhealthy.
3
+ * Used to tell CORS / 401 / pending-abort apart from Clark testApi. Do not
4
+ * log tokens. Success (v3/execute POST 200) stays quiet. CORS preflight is
5
+ * not execute.
6
+ */
7
+ export type CaptureParentEvent = {
8
+ type: string;
9
+ };
10
+ export type CaptureExecuteProbe = {
11
+ failure?: string;
12
+ method: string;
13
+ path: string;
14
+ pending?: boolean;
15
+ status?: number;
16
+ };
17
+ export type CaptureProbeInput = {
18
+ agentUrl?: string;
19
+ consoleText: string[];
20
+ execute: CaptureExecuteProbe[];
21
+ pageErrors: string[];
22
+ parentEvents: CaptureParentEvent[];
23
+ paintInnerText: string;
24
+ paintKind: string;
25
+ };
26
+ export type CaptureProbeSummary = {
27
+ agentHost?: string;
28
+ console: string[];
29
+ execute: CaptureExecuteProbe[];
30
+ pageErrors: string[];
31
+ paint: {
32
+ innerText: string;
33
+ kind: string;
34
+ };
35
+ parent: string[];
36
+ unanswered: string[];
37
+ };
38
+ export declare function isLibraryExecuteUrl(url: string): boolean;
39
+ export declare function redactCaptureUrl(url: string): string;
40
+ export declare function redactCaptureSecrets(text: string): string;
41
+ export declare function executeStillInFlight(execute: CaptureExecuteProbe[]): boolean;
42
+ export declare function shouldKeepCaptureConsole(text: string): boolean;
43
+ export declare function summarizeCaptureProbe(input: CaptureProbeInput): CaptureProbeSummary;
44
+ export type CaptureProbeCollector = {
45
+ consoleText: string[];
46
+ execute: CaptureExecuteProbe[];
47
+ pageErrors: string[];
48
+ };
49
+ type ProbePage = {
50
+ on: (event: string, handler: (arg: unknown) => void) => void;
51
+ };
52
+ export declare function attachLibraryCaptureProbe(page: ProbePage, collector: CaptureProbeCollector): void;
53
+ export declare function shouldLogCaptureProbe(summary: CaptureProbeSummary): boolean;
54
+ export declare function logCaptureProbe(summary: CaptureProbeSummary): void;
55
+ export {};
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Stderr probe for live-library capture when canvas execute is unhealthy.
3
+ * Used to tell CORS / 401 / pending-abort apart from Clark testApi. Do not
4
+ * log tokens. Success (v3/execute POST 200) stays quiet. CORS preflight is
5
+ * not execute.
6
+ */
7
+ const ANSWERED_PARENT_TYPES = new Set([
8
+ "authenticate-api-request",
9
+ "sb-editor-request-bootstrap",
10
+ "sb-ready",
11
+ ]);
12
+ const CONSOLE_KEEP = /api-store|no active agent|failed to execute|authenticate|failed to fetch|cors|net::err/i;
13
+ export function isLibraryExecuteUrl(url) {
14
+ try {
15
+ const path = new URL(url).pathname;
16
+ return /\/v[23]\/execute(?:\/stream)?\/?$/.test(path);
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ function isLibraryExecuteProbe(method, url) {
23
+ return method.toUpperCase() === "POST" && isLibraryExecuteUrl(url);
24
+ }
25
+ export function redactCaptureUrl(url) {
26
+ try {
27
+ const parsed = new URL(url);
28
+ return `${parsed.origin}${parsed.pathname}`;
29
+ }
30
+ catch {
31
+ return url;
32
+ }
33
+ }
34
+ export function redactCaptureSecrets(text) {
35
+ return text
36
+ .replace(/Bearer\s+\S+/gi, "Bearer [redacted]")
37
+ .replace(/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9._-]+/g, "[redacted-jwt]");
38
+ }
39
+ export function executeStillInFlight(execute) {
40
+ return execute.some((row) => row.status === undefined && row.failure === undefined);
41
+ }
42
+ function clip(text) {
43
+ const collapsed = text.replace(/\s+/g, " ").trim();
44
+ if (collapsed.length <= 240) {
45
+ return collapsed;
46
+ }
47
+ return `${collapsed.slice(0, 237)}...`;
48
+ }
49
+ export function shouldKeepCaptureConsole(text) {
50
+ return CONSOLE_KEEP.test(text);
51
+ }
52
+ export function summarizeCaptureProbe(input) {
53
+ const parent = input.parentEvents.map((event) => event.type);
54
+ const unanswered = parent.filter((type) => !ANSWERED_PARENT_TYPES.has(type));
55
+ let agentHost;
56
+ if (input.agentUrl) {
57
+ try {
58
+ agentHost = new URL(input.agentUrl).hostname;
59
+ }
60
+ catch {
61
+ agentHost = undefined;
62
+ }
63
+ }
64
+ return {
65
+ ...(agentHost ? { agentHost } : {}),
66
+ console: input.consoleText
67
+ .filter(shouldKeepCaptureConsole)
68
+ .map((text) => clip(redactCaptureSecrets(text))),
69
+ execute: input.execute.map((row) => ({
70
+ ...(row.failure ? { failure: row.failure } : {}),
71
+ method: row.method,
72
+ path: row.path,
73
+ ...(row.status === undefined && row.failure === undefined
74
+ ? { pending: true }
75
+ : {}),
76
+ ...(row.status !== undefined ? { status: row.status } : {}),
77
+ })),
78
+ pageErrors: input.pageErrors.map((text) => clip(redactCaptureSecrets(text))),
79
+ paint: {
80
+ innerText: clip(input.paintInnerText),
81
+ kind: input.paintKind,
82
+ },
83
+ parent,
84
+ unanswered,
85
+ };
86
+ }
87
+ function upsertExecute(collector, row) {
88
+ const open = collector.execute.find((existing) => existing.method === row.method &&
89
+ existing.path === row.path &&
90
+ existing.status === undefined &&
91
+ existing.failure === undefined);
92
+ if (open) {
93
+ if (row.status !== undefined) {
94
+ open.status = row.status;
95
+ }
96
+ if (row.failure !== undefined) {
97
+ open.failure = row.failure;
98
+ }
99
+ if (!open.method) {
100
+ open.method = row.method;
101
+ }
102
+ return;
103
+ }
104
+ collector.execute.push({
105
+ method: row.method,
106
+ path: row.path,
107
+ ...(row.failure ? { failure: row.failure } : {}),
108
+ ...(row.status !== undefined ? { status: row.status } : {}),
109
+ });
110
+ }
111
+ export function attachLibraryCaptureProbe(page, collector) {
112
+ page.on("request", (arg) => {
113
+ const request = arg;
114
+ const url = request.url();
115
+ const method = request.method();
116
+ if (!isLibraryExecuteProbe(method, url)) {
117
+ return;
118
+ }
119
+ collector.execute.push({
120
+ method,
121
+ path: redactCaptureUrl(url),
122
+ });
123
+ });
124
+ page.on("response", (arg) => {
125
+ const response = arg;
126
+ const url = response.url();
127
+ const method = response.request?.().method() ?? "POST";
128
+ if (!isLibraryExecuteProbe(method, url)) {
129
+ return;
130
+ }
131
+ upsertExecute(collector, {
132
+ method,
133
+ path: redactCaptureUrl(url),
134
+ status: response.status(),
135
+ });
136
+ });
137
+ page.on("requestfailed", (arg) => {
138
+ const request = arg;
139
+ const url = request.url();
140
+ const method = request.method();
141
+ if (!isLibraryExecuteProbe(method, url)) {
142
+ return;
143
+ }
144
+ const failed = request.failure?.();
145
+ upsertExecute(collector, {
146
+ failure: failed?.errorText ?? "requestfailed",
147
+ method,
148
+ path: redactCaptureUrl(url),
149
+ });
150
+ });
151
+ page.on("console", (arg) => {
152
+ const message = arg;
153
+ const text = message.text();
154
+ if (message.type() === "error" || shouldKeepCaptureConsole(text)) {
155
+ collector.consoleText.push(text);
156
+ }
157
+ });
158
+ page.on("pageerror", (arg) => {
159
+ collector.pageErrors.push(arg instanceof Error ? arg.message : String(arg));
160
+ });
161
+ }
162
+ export function shouldLogCaptureProbe(summary) {
163
+ if (summary.pageErrors.length > 0) {
164
+ return true;
165
+ }
166
+ if (summary.execute.length === 0) {
167
+ return /\bloading\b/i.test(summary.paint.innerText);
168
+ }
169
+ return summary.execute.some((row) => row.pending === true || row.failure !== undefined || row.status !== 200);
170
+ }
171
+ export function logCaptureProbe(summary) {
172
+ if (!shouldLogCaptureProbe(summary)) {
173
+ return;
174
+ }
175
+ console.error("gateway live canvas capture probe", summary);
176
+ }
177
+ //# sourceMappingURL=capture-library-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-library-probe.js","sourceRoot":"","sources":["../../src/capture/capture-library-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Headless capture of the live library iframe (pitcherURL) for MCP image
3
+ * content. Top-level goto + mock parent, never the Superblocks edit URL.
4
+ *
5
+ * Best-effort: callers must succeed with URLs alone when this returns
6
+ * undefined. Output is capped like preview capture.
7
+ */
8
+ import { type CaptureParentEvent } from "./capture-library-probe.js";
9
+ import { type LibraryPaint } from "./classify-library-paint.js";
10
+ import { type LibraryParentPayload } from "./library-parent-script.js";
11
+ export type LibraryScreenshot = {
12
+ dataBase64: string;
13
+ mimeType: "image/jpeg";
14
+ };
15
+ export type CaptureLibraryScreenshotInput = LibraryParentPayload & {
16
+ iframeBaseUrl: string;
17
+ timeoutMs?: number;
18
+ };
19
+ export type LibraryPaintElement = {
20
+ innerText?: string;
21
+ querySelectorAll: (selector: string) => ArrayLike<LibraryPaintElement>;
22
+ };
23
+ export type LibraryPaintView = {
24
+ document: {
25
+ body?: LibraryPaintElement | null;
26
+ documentElement?: LibraryPaintElement | null;
27
+ };
28
+ getComputedStyle: (element: LibraryPaintElement) => {
29
+ backgroundColor: string;
30
+ color: string;
31
+ };
32
+ };
33
+ /**
34
+ * Runs inside Playwright's page.evaluate. Keep this function self-contained
35
+ * (Playwright serializes only this body). Default `view` is the browser
36
+ * globalThis; tests pass a fake page so Node tsc does not need DOM libs.
37
+ */
38
+ export declare function readLibraryPaintInPage(view?: LibraryPaintView): LibraryPaint;
39
+ /**
40
+ * Runs inside Playwright's page.evaluate. Keep self-contained: Playwright
41
+ * serializes only this body. Default `view` is the browser globalThis.
42
+ */
43
+ export declare function readLibraryCaptureParentEvents(view?: {
44
+ __sbGatewayCaptureEvents?: unknown;
45
+ }): CaptureParentEvent[];
46
+ /**
47
+ * Captures a JPEG of the live Vite canvas via Playwright when available.
48
+ * Soft-fails when Chromium is missing, the URL is the edit chrome, or the
49
+ * page never becomes ready.
50
+ */
51
+ export type CaptureLibraryScreenshot = (input: CaptureLibraryScreenshotInput) => Promise<LibraryScreenshot | undefined>;
52
+ export declare function captureLibraryScreenshotWithPlaywright(input: CaptureLibraryScreenshotInput): Promise<LibraryScreenshot | undefined>;
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Headless capture of the live library iframe (pitcherURL) for MCP image
3
+ * content. Top-level goto + mock parent, never the Superblocks edit URL.
4
+ *
5
+ * Best-effort: callers must succeed with URLs alone when this returns
6
+ * undefined. Output is capped like preview capture.
7
+ */
8
+ import { PREVIEW_SCREENSHOT_MAX_BYTES } from "../preview/capture-screenshot.js";
9
+ import { attachLibraryCaptureProbe, executeStillInFlight, logCaptureProbe, summarizeCaptureProbe, } from "./capture-library-probe.js";
10
+ import { classifyLibraryPaint, } from "./classify-library-paint.js";
11
+ import { buildLibraryParentScript, } from "./library-parent-script.js";
12
+ const APP_PAINT_SETTLE_MS = 2_500;
13
+ const DEFAULT_CAPTURE_TIMEOUT_MS = 15_000;
14
+ const EXECUTE_POLL_MS = 250;
15
+ const POST_EXECUTE_PAINT_MS = 500;
16
+ const SCREENSHOT_RESERVE_MS = 1_000;
17
+ function isEditorChromeUrl(url) {
18
+ try {
19
+ return /\/code-mode\/applications\/edit\//.test(new URL(url).pathname);
20
+ }
21
+ catch {
22
+ return true;
23
+ }
24
+ }
25
+ function libraryCaptureUrl(iframeBaseUrl) {
26
+ let url;
27
+ try {
28
+ url = new URL(iframeBaseUrl);
29
+ }
30
+ catch {
31
+ return undefined;
32
+ }
33
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
34
+ return undefined;
35
+ }
36
+ if (isEditorChromeUrl(url.toString())) {
37
+ return undefined;
38
+ }
39
+ url.searchParams.set("app_mode", "EDIT");
40
+ return url.toString();
41
+ }
42
+ /**
43
+ * Runs inside Playwright's page.evaluate. Keep this function self-contained
44
+ * (Playwright serializes only this body). Default `view` is the browser
45
+ * globalThis; tests pass a fake page so Node tsc does not need DOM libs.
46
+ */
47
+ export function readLibraryPaintInPage(view) {
48
+ const page = view ?? globalThis;
49
+ const innerText = page.document.body?.innerText ?? "";
50
+ const samples = [];
51
+ const roots = [];
52
+ if (page.document.documentElement) {
53
+ roots.push(page.document.documentElement);
54
+ }
55
+ if (page.document.body) {
56
+ roots.push(page.document.body, ...Array.from(page.document.body.querySelectorAll("*")).slice(0, 40));
57
+ }
58
+ for (const element of roots) {
59
+ const style = page.getComputedStyle(element);
60
+ for (const color of [style.backgroundColor, style.color]) {
61
+ const match = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(color);
62
+ if (match) {
63
+ samples.push({
64
+ b: Number(match[3]),
65
+ g: Number(match[2]),
66
+ r: Number(match[1]),
67
+ });
68
+ }
69
+ }
70
+ }
71
+ return { innerText, samples };
72
+ }
73
+ /**
74
+ * Runs inside Playwright's page.evaluate. Keep self-contained: Playwright
75
+ * serializes only this body. Default `view` is the browser globalThis.
76
+ */
77
+ export function readLibraryCaptureParentEvents(view) {
78
+ const page = view ?? globalThis;
79
+ const events = page.__sbGatewayCaptureEvents;
80
+ if (!Array.isArray(events)) {
81
+ return [];
82
+ }
83
+ const recorded = [];
84
+ for (const event of events) {
85
+ if (event &&
86
+ typeof event === "object" &&
87
+ typeof event.type === "string") {
88
+ recorded.push({ type: event.type });
89
+ }
90
+ }
91
+ return recorded;
92
+ }
93
+ export async function captureLibraryScreenshotWithPlaywright(input) {
94
+ const target = libraryCaptureUrl(input.iframeBaseUrl);
95
+ if (!target) {
96
+ console.warn("gateway library screenshot skipped: not a library URL", {
97
+ url: input.iframeBaseUrl,
98
+ });
99
+ return undefined;
100
+ }
101
+ let chromium;
102
+ try {
103
+ const mod = (await import(
104
+ /* webpackIgnore: true */ "playwright"));
105
+ chromium = mod.chromium;
106
+ }
107
+ catch (error) {
108
+ console.warn("gateway library screenshot: playwright unavailable", {
109
+ message: error instanceof Error ? error.message : String(error),
110
+ });
111
+ return undefined;
112
+ }
113
+ const timeoutMs = input.timeoutMs ?? DEFAULT_CAPTURE_TIMEOUT_MS;
114
+ let browser;
115
+ let cancelled = false;
116
+ let timedOut = false;
117
+ let probeLogged = false;
118
+ const collector = {
119
+ consoleText: [],
120
+ execute: [],
121
+ pageErrors: [],
122
+ };
123
+ let parentEvents = [];
124
+ let paintInnerText = "";
125
+ let paintKind = "unknown";
126
+ const emitProbeOnce = () => {
127
+ if (probeLogged) {
128
+ return;
129
+ }
130
+ probeLogged = true;
131
+ logCaptureProbe(summarizeCaptureProbe({
132
+ agentUrl: input.bootstrapData.agentUrls?.[0],
133
+ consoleText: collector.consoleText,
134
+ execute: collector.execute,
135
+ pageErrors: collector.pageErrors,
136
+ parentEvents,
137
+ paintInnerText,
138
+ paintKind,
139
+ }));
140
+ };
141
+ const capture = (async () => {
142
+ const startedAt = Date.now();
143
+ try {
144
+ const launched = await chromium.launch({ headless: true });
145
+ browser = launched;
146
+ if (cancelled) {
147
+ await launched.close().catch(() => undefined);
148
+ return undefined;
149
+ }
150
+ const page = await browser.newPage();
151
+ attachLibraryCaptureProbe(page, collector);
152
+ await page.addInitScript({
153
+ content: buildLibraryParentScript({
154
+ bootstrapData: input.bootstrapData,
155
+ initData: input.initData,
156
+ }),
157
+ });
158
+ await page.setViewportSize({ height: 800, width: 1280 });
159
+ await page.goto(target, {
160
+ timeout: timeoutMs,
161
+ waitUntil: "domcontentloaded",
162
+ });
163
+ await page
164
+ .locator("body > *")
165
+ .first()
166
+ .waitFor({ state: "visible", timeout: timeoutMs })
167
+ .catch(() => undefined);
168
+ await page.waitForTimeout(APP_PAINT_SETTLE_MS);
169
+ // Home's first paint is often "Loading first order..." with v3/execute
170
+ // still in flight. Closing Chromium after the settle aborts that fetch,
171
+ // which is why the probe showed POST with no status. Wait out the
172
+ // request (or the capture budget) before photographing.
173
+ const waitUntil = startedAt + timeoutMs - SCREENSHOT_RESERVE_MS;
174
+ while (!cancelled &&
175
+ Date.now() < waitUntil &&
176
+ executeStillInFlight(collector.execute)) {
177
+ await page.waitForTimeout(EXECUTE_POLL_MS);
178
+ }
179
+ if (collector.execute.length > 0 &&
180
+ !executeStillInFlight(collector.execute)) {
181
+ await page.waitForTimeout(POST_EXECUTE_PAINT_MS);
182
+ }
183
+ const paint = (await page.evaluate(readLibraryPaintInPage));
184
+ parentEvents = (await page.evaluate(readLibraryCaptureParentEvents));
185
+ paintInnerText = paint.innerText;
186
+ const verdict = classifyLibraryPaint(paint);
187
+ paintKind = verdict.kind === "skip" ? verdict.reason : verdict.kind;
188
+ emitProbeOnce();
189
+ if (verdict.kind === "skip") {
190
+ console.error(`gateway live canvas skipped: ${verdict.reason}`, {
191
+ url: target,
192
+ });
193
+ return undefined;
194
+ }
195
+ let quality = 80;
196
+ let buffer = await page.screenshot({ quality, type: "jpeg" });
197
+ while (buffer.byteLength > PREVIEW_SCREENSHOT_MAX_BYTES && quality > 30) {
198
+ quality -= 10;
199
+ buffer = await page.screenshot({ quality, type: "jpeg" });
200
+ }
201
+ if (buffer.byteLength > PREVIEW_SCREENSHOT_MAX_BYTES) {
202
+ console.warn("gateway library screenshot exceeds size cap; skipping", {
203
+ bytes: buffer.byteLength,
204
+ });
205
+ return undefined;
206
+ }
207
+ return {
208
+ dataBase64: buffer.toString("base64"),
209
+ mimeType: "image/jpeg",
210
+ };
211
+ }
212
+ catch (error) {
213
+ emitProbeOnce();
214
+ if (timedOut) {
215
+ return undefined;
216
+ }
217
+ console.warn("gateway library screenshot failed", {
218
+ message: error instanceof Error ? error.message : String(error),
219
+ url: target,
220
+ });
221
+ return undefined;
222
+ }
223
+ })();
224
+ let timer;
225
+ const timeout = new Promise((resolve) => {
226
+ timer = setTimeout(() => {
227
+ timedOut = true;
228
+ cancelled = true;
229
+ emitProbeOnce();
230
+ console.error("gateway live canvas skipped: capture_timeout", {
231
+ timeoutMs,
232
+ url: target,
233
+ });
234
+ resolve(undefined);
235
+ }, timeoutMs);
236
+ });
237
+ try {
238
+ return await Promise.race([capture, timeout]);
239
+ }
240
+ finally {
241
+ cancelled = true;
242
+ if (timer !== undefined) {
243
+ clearTimeout(timer);
244
+ }
245
+ emitProbeOnce();
246
+ await browser?.close().catch(() => undefined);
247
+ }
248
+ }
249
+ //# sourceMappingURL=capture-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-library.js","sourceRoot":"","sources":["../../src/capture/capture-library.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Preview sign-in copy is a failed live-library capture: the JPEG looks like
3
+ * a real page but is the auth wall. A white/empty canvas is returned as
4
+ * bytes so the agent can see it; screenshotBase64 now travels in MCP JSON.
5
+ */
6
+ export type LibraryPaintSample = {
7
+ b: number;
8
+ g: number;
9
+ r: number;
10
+ };
11
+ export type LibraryPaint = {
12
+ innerText: string;
13
+ samples: ReadonlyArray<LibraryPaintSample>;
14
+ };
15
+ export type LibraryPaintVerdict = {
16
+ kind: "ok";
17
+ } | {
18
+ kind: "skip";
19
+ reason: "preview_sign_in";
20
+ };
21
+ export declare function classifyLibraryPaint(paint: LibraryPaint): LibraryPaintVerdict;