@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,13 @@
1
+ /**
2
+ * Preview sign-in copy is a failed live-library capture: the JPEG looks like
3
+ * a real page but is the auth wall. A white/empty canvas is returned as
4
+ * bytes so the agent can see it; screenshotBase64 now travels in MCP JSON.
5
+ */
6
+ const SIGN_IN_COPY = /\b(?:sign[\s-]?in|log[\s-]?in|continue with google|continue with github)\b/i;
7
+ export function classifyLibraryPaint(paint) {
8
+ if (SIGN_IN_COPY.test(paint.innerText)) {
9
+ return { kind: "skip", reason: "preview_sign_in" };
10
+ }
11
+ return { kind: "ok" };
12
+ }
13
+ //# sourceMappingURL=classify-library-paint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-library-paint.js","sourceRoot":"","sources":["../../src/capture/classify-library-paint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,MAAM,YAAY,GAChB,6EAA6E,CAAC;AAEhF,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Setup-time scan of an MCP client config for known host browser drivers.
3
+ *
4
+ * Gateway cannot see other MCP servers at tool-call time. This only inspects
5
+ * what is on disk (or about to be written). Config can lie: the server may
6
+ * fail to start or `npx` may miss PATH.
7
+ */
8
+ export type HostBrowserMcpScan = {
9
+ found: boolean;
10
+ isolated: boolean;
11
+ };
12
+ /**
13
+ * Walks `mcpServers` (Claude Code, Cursor, Desktop). Superblocks Gateway is
14
+ * skipped so a self-scan cannot count as a host browser.
15
+ */
16
+ export declare function scanHostBrowserMcp(config: unknown): HostBrowserMcpScan;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Setup-time scan of an MCP client config for known host browser drivers.
3
+ *
4
+ * Gateway cannot see other MCP servers at tool-call time. This only inspects
5
+ * what is on disk (or about to be written). Config can lie: the server may
6
+ * fail to start or `npx` may miss PATH.
7
+ */
8
+ const HOST_BROWSER_MARKERS = [
9
+ "@playwright/mcp",
10
+ "agent-browser",
11
+ "chrome-devtools-mcp",
12
+ "puppeteer",
13
+ ];
14
+ function tokensOf(entry) {
15
+ if (!entry || typeof entry !== "object") {
16
+ return [];
17
+ }
18
+ const record = entry;
19
+ const tokens = [];
20
+ if (typeof record.command === "string") {
21
+ tokens.push(record.command);
22
+ }
23
+ if (Array.isArray(record.args)) {
24
+ for (const arg of record.args) {
25
+ if (typeof arg === "string") {
26
+ tokens.push(arg);
27
+ }
28
+ }
29
+ }
30
+ return tokens;
31
+ }
32
+ function isHostBrowserDriver(tokens) {
33
+ return tokens.some((token) => HOST_BROWSER_MARKERS.some((marker) => token.includes(marker)));
34
+ }
35
+ /**
36
+ * Walks `mcpServers` (Claude Code, Cursor, Desktop). Superblocks Gateway is
37
+ * skipped so a self-scan cannot count as a host browser.
38
+ */
39
+ export function scanHostBrowserMcp(config) {
40
+ if (!config || typeof config !== "object") {
41
+ return { found: false, isolated: false };
42
+ }
43
+ const mcpServers = config.mcpServers;
44
+ if (!mcpServers || typeof mcpServers !== "object") {
45
+ return { found: false, isolated: false };
46
+ }
47
+ let found = false;
48
+ let isolated = false;
49
+ for (const [name, entry] of Object.entries(mcpServers)) {
50
+ if (name === "superblocks") {
51
+ continue;
52
+ }
53
+ const tokens = tokensOf(entry);
54
+ if (!isHostBrowserDriver(tokens)) {
55
+ continue;
56
+ }
57
+ found = true;
58
+ if (tokens.includes("--isolated")) {
59
+ isolated = true;
60
+ }
61
+ }
62
+ return { found, isolated };
63
+ }
64
+ //# sourceMappingURL=host-mcp-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-mcp-scan.js","sourceRoot":"","sources":["../../src/capture/host-mcp-scan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,oBAAoB,GAAG;IAC3B,iBAAiB;IACjB,eAAe;IACf,qBAAqB;IACrB,WAAW;CACH,CAAC;AAOX,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAgB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,UAAU,GAAI,MAAmC,CAAC,UAAU,CAAC;IACnE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACxC,UAAqC,CACtC,EAAE,CAAC;QACF,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Page source that makes a top-level pitcherURL visit look like the Code Mode
3
+ * iframe: mock `window.parent`, answer `sb-ready` / bootstrap / API auth in
4
+ * page JS so the host driver never sees the scoped JWT.
5
+ *
6
+ * Source text rather than a function handed to `addInitScript` because
7
+ * Playwright serializes functions and can drag bundler helpers (`__name`)
8
+ * into the page. Same rule as `buildEmbedHandshakeScript`.
9
+ */
10
+ export type LibraryParentInitData = {
11
+ appId: string;
12
+ devServerAuthorization: string;
13
+ peerId: string;
14
+ userId?: string;
15
+ windowOriginUrl?: string;
16
+ };
17
+ export type LibraryParentBootstrapData = {
18
+ accessToken: string;
19
+ agents?: unknown[];
20
+ agentUrls?: string[];
21
+ appId: string;
22
+ devServerAuthorization: string;
23
+ featureFlags?: Record<string, unknown>;
24
+ orgId?: string;
25
+ profiles?: unknown;
26
+ token: string;
27
+ userEmail?: string;
28
+ userId: string;
29
+ windowOriginUrl?: string;
30
+ };
31
+ export type LibraryParentPayload = {
32
+ bootstrapData: LibraryParentBootstrapData;
33
+ initData: LibraryParentInitData;
34
+ };
35
+ export declare function buildLibraryParentScript(payload: LibraryParentPayload): string;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Page source that makes a top-level pitcherURL visit look like the Code Mode
3
+ * iframe: mock `window.parent`, answer `sb-ready` / bootstrap / API auth in
4
+ * page JS so the host driver never sees the scoped JWT.
5
+ *
6
+ * Source text rather than a function handed to `addInitScript` because
7
+ * Playwright serializes functions and can drag bundler helpers (`__name`)
8
+ * into the page. Same rule as `buildEmbedHandshakeScript`.
9
+ */
10
+ export function buildLibraryParentScript(payload) {
11
+ return `(function () {
12
+ if (window.parent !== window) return;
13
+ var payload = ${JSON.stringify(payload)};
14
+ var init = payload.initData;
15
+ var bootstrap = payload.bootstrapData;
16
+ window.__sbGatewayCaptureEvents = [];
17
+ function record(message) {
18
+ if (message && typeof message.type === "string") {
19
+ window.__sbGatewayCaptureEvents.push({ type: message.type });
20
+ }
21
+ }
22
+ function send(message) {
23
+ window.postMessage(message, window.location.origin);
24
+ }
25
+ var mockParent = {
26
+ postMessage: function (message) {
27
+ record(message);
28
+ if (message && message.type === "sb-ready" && init) {
29
+ send({
30
+ payload: {
31
+ appId: init.appId,
32
+ devServerAuthorization: init.devServerAuthorization,
33
+ peerId: init.peerId,
34
+ userId: init.userId,
35
+ windowOriginUrl: init.windowOriginUrl,
36
+ },
37
+ startTime: Date.now(),
38
+ type: "sb-init",
39
+ });
40
+ }
41
+ if (message && message.type === "sb-editor-request-bootstrap" && bootstrap) {
42
+ send({
43
+ payload: bootstrap,
44
+ startTime: Date.now(),
45
+ type: "sb-bootstrap-response",
46
+ });
47
+ if (bootstrap.profiles) {
48
+ send({
49
+ payload: { global: { profiles: bootstrap.profiles } },
50
+ startTime: Date.now(),
51
+ type: "sb-global-sync",
52
+ });
53
+ }
54
+ }
55
+ if (message && message.type === "authenticate-api-request") {
56
+ var callbackId = message.payload && message.payload.callbackId;
57
+ if (callbackId) {
58
+ send({
59
+ callbackId: callbackId,
60
+ payload: {
61
+ tokens: {
62
+ accessToken: bootstrap.accessToken,
63
+ token: bootstrap.token,
64
+ },
65
+ },
66
+ type: "resolve-promise",
67
+ });
68
+ }
69
+ }
70
+ },
71
+ document: document,
72
+ location: window.location,
73
+ window: window,
74
+ };
75
+ Object.defineProperty(window, "parent", {
76
+ configurable: true,
77
+ value: mockParent,
78
+ writable: false,
79
+ });
80
+ })();`;
81
+ }
82
+ //# sourceMappingURL=library-parent-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-parent-script.js","sourceRoot":"","sources":["../../src/capture/library-parent-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8BH,MAAM,UAAU,wBAAwB,CACtC,OAA6B;IAE7B,OAAO;;oBAEW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmErC,CAAC;AACP,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * How this Gateway can (or cannot) capture a live canvas or complete IdP.
3
+ *
4
+ * `host_mcp_configured` is a setup-time scan of the MCP client config. That
5
+ * file can lie: the listed server may fail to start or miss PATH. Tool results
6
+ * therefore keep hostBrowserTools as "unknown" rather than claiming this turn
7
+ * has Playwright.
8
+ */
9
+ export declare const CAPTURE_MODES: readonly ["gateway_chromium", "host_mcp_configured", "urls_only"];
10
+ export type CaptureMode = (typeof CAPTURE_MODES)[number];
11
+ export declare function resolveCaptureMode(input: {
12
+ gatewayChromium: boolean;
13
+ hostMcpConfigured: boolean;
14
+ }): CaptureMode;
15
+ /**
16
+ * Human + machine summary for `mcp setup --debug`. Info goes to stderr so
17
+ * a redirected stdout report stays clean.
18
+ */
19
+ export declare function formatCaptureModeSummary(input: {
20
+ isolated: boolean;
21
+ mode: CaptureMode;
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;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * How this Gateway can (or cannot) capture a live canvas or complete IdP.
3
+ *
4
+ * `host_mcp_configured` is a setup-time scan of the MCP client config. That
5
+ * file can lie: the listed server may fail to start or miss PATH. Tool results
6
+ * therefore keep hostBrowserTools as "unknown" rather than claiming this turn
7
+ * has Playwright.
8
+ */
9
+ export const CAPTURE_MODES = [
10
+ "gateway_chromium",
11
+ "host_mcp_configured",
12
+ "urls_only",
13
+ ];
14
+ export function resolveCaptureMode(input) {
15
+ if (input.hostMcpConfigured) {
16
+ return "host_mcp_configured";
17
+ }
18
+ if (input.gatewayChromium) {
19
+ return "gateway_chromium";
20
+ }
21
+ return "urls_only";
22
+ }
23
+ /**
24
+ * Human + machine summary for `mcp setup --debug`. Info goes to stderr so
25
+ * a redirected stdout report stays clean.
26
+ */
27
+ export function formatCaptureModeSummary(input) {
28
+ const lines = [`capture.mode: ${input.mode}`];
29
+ switch (input.mode) {
30
+ case "host_mcp_configured":
31
+ lines.push("A host browser MCP is listed in this client config. Config on disk can lie if that server fails to start or misses PATH.");
32
+ break;
33
+ case "gateway_chromium":
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
+ break;
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 mcp setup --with-screenshots may enable live-canvas capture and does not clear IdP. Add @playwright/mcp for IdP step-up.");
38
+ break;
39
+ }
40
+ if (input.isolated) {
41
+ lines.push("Warning: a scanned browser MCP includes --isolated. IdP cookies will not survive browser_close.");
42
+ }
43
+ return lines.join("\n");
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
+ }
65
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +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,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"}
@@ -0,0 +1,148 @@
1
+ export type GatewayConfig = {
2
+ deploymentEnvironmentName: string;
3
+ /** Cloud-Prem laptop agent: single-user process on a corp machine. */
4
+ localAgentMode: boolean;
5
+ /**
6
+ * Cloud-Prem Admin laptop agent: register Admin tools (integrations, apps,
7
+ * users, deploy_application, ...) only, and skip the Builder surface
8
+ * (start_app, edit_app, ...) that needs Playwright Chromium for preview
9
+ * screenshots and a live-edit session it never opens on this machine.
10
+ */
11
+ adminToolsOnly: boolean;
12
+ /**
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.
15
+ *
16
+ * A file attached to a chat lives in the model's own sandbox, so the path the
17
+ * model can quote is unreadable here even though the user downloaded the file
18
+ * to this machine. Exact absolute host paths are read directly.
19
+ */
20
+ importSearchDirs: string[];
21
+ /**
22
+ * How long the held socket's liveness beat must stay lost before the turn
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.
26
+ */
27
+ beatLostGraceMs: number;
28
+ /**
29
+ * How long to hold an editor websocket after the last prompt before
30
+ * releasing it. Headless MCP needs the socket kept open so the sandbox
31
+ * startup watchdog does not tear the session down.
32
+ */
33
+ heldSessionIdleMs: number;
34
+ /**
35
+ * Grace period between a Clark turn settling and the held editor socket
36
+ * being dropped. Keeping it short leaves the user's own editor tab as the
37
+ * sandbox's only editor peer, which is the peer Clark's API calls run on.
38
+ */
39
+ 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
+ /**
46
+ * Quiet window after Clark emits completed/idle before treating the job as
47
+ * done, so an acknowledgment that resumes generating is coalesced.
48
+ */
49
+ clarkSettleMs: number;
50
+ /**
51
+ * After Clark's job settles, how long to wait for the dev server to flush
52
+ * Clark's files before giving up on checkpointing them.
53
+ */
54
+ clarkReadyWaitMs: number;
55
+ /**
56
+ * Opt-in: hands Clark a browser context so its Playwright test tools are
57
+ * registered on headless turns. Off by default because that launches
58
+ * Chromium inside the live-edit pod (3Gi), which OOMKills generation.
59
+ * Gateway preview screenshots use laptop Chromium and ignore this flag.
60
+ * Set GATEWAY_CLARK_TESTING_ENABLED=true only when the sandbox has
61
+ * Chromium headroom and you want Clark to drive browser_* tools.
62
+ */
63
+ clarkTestingEnabled: boolean;
64
+ /**
65
+ * Least time a single `check_app_progress` call collects Clark activity for
66
+ * before answering, so a talkative build comes back in whole thoughts rather
67
+ * than a line at a time. Only ever spends part of
68
+ * {@link GatewayConfig.clarkProgressWaitMs}, and never delays a finished
69
+ * turn: a decision waiting on a human is what the poll exists to surface.
70
+ * Zero answers on the first line.
71
+ */
72
+ clarkProgressFloorMs: number;
73
+ /**
74
+ * How long a single `check_app_progress` call waits for new Clark activity
75
+ * before answering with what it has. Sized to stay inside a client's tool
76
+ * timeout so the caller can poll again rather than lose the turn.
77
+ */
78
+ clarkProgressWaitMs: number;
79
+ /**
80
+ * How long a build may run without saying anything before a poll warns that
81
+ * it has gone quiet. Nonterminal and well under
82
+ * {@link GatewayConfig.clarkTurnTimeoutMs}, so the caller hears about the
83
+ * silence long before the turn is given up on.
84
+ */
85
+ clarkStallHintAfterMs: number;
86
+ /**
87
+ * Ceiling on any single host-facing call, whatever it is waiting for.
88
+ *
89
+ * Hosts abandon a tool call after their own timeout, and a host that
90
+ * advertises progress notifications is under no obligation to act on them —
91
+ * so a call cannot be allowed to run past this on the strength of having
92
+ * sent progress. Anything still unfinished here returns its current status
93
+ * and a cursor instead of holding the request open.
94
+ */
95
+ hostCallCeilingMs: number;
96
+ /**
97
+ * How long `publish_app` polls a queued deploy before giving up.
98
+ */
99
+ publishWaitTimeoutMs: number;
100
+ /**
101
+ * How long a single `check_publish_progress` call watches the rollout
102
+ * before answering with its current state. Sized to stay inside a client's
103
+ * tool timeout so the caller can poll again rather than lose the turn.
104
+ */
105
+ publishProgressWaitMs: number;
106
+ /**
107
+ * Interval between deploy-status polls while waiting for a queued publish.
108
+ */
109
+ publishPollIntervalMs: number;
110
+ /**
111
+ * Preferred integration profile key. When unset or `default`, Gateway
112
+ * picks a real org profile (staging → dev → production → first).
113
+ */
114
+ profileKey: string;
115
+ serverUrl: string;
116
+ turnTtlMs: number;
117
+ uiBaseUrl: string;
118
+ /**
119
+ * Base URL of the deployed-app shell / CDN used for JWT preview links.
120
+ * Local default is the csb-mock CDN. May include `__SB_APP_ID`.
121
+ */
122
+ deployedShellBaseUrl: string | undefined;
123
+ /**
124
+ * Optional https front door for the deployed shell (viewer/CDN tunnel).
125
+ * When set, Claude Desktop can openLink preview URLs. Stdio Gateway does
126
+ * not bind HTTP, so this is never a gateway origin.
127
+ */
128
+ publicViewerBaseUrl: string | undefined;
129
+ /**
130
+ * When true, always attempt a headless screenshot even if previewUrl is
131
+ * already https (demo / debugging).
132
+ */
133
+ forcePreviewScreenshot: boolean;
134
+ /**
135
+ * Setup-time scan: a host browser MCP (@playwright/mcp, chrome-devtools,
136
+ * puppeteer, agent-browser) was listed in the client config. Config on disk
137
+ * can lie; tool results keep hostBrowserTools as "unknown".
138
+ */
139
+ captureHostMcp: boolean;
140
+ /** Scanned host browser MCP args included --isolated (IdP cookies die). */
141
+ captureHostIsolated: boolean;
142
+ /**
143
+ * Test override for whether Playwright Chromium is on disk. Unset in
144
+ * production: capabilities probe without installing.
145
+ */
146
+ gatewayChromiumPresent?: boolean;
147
+ };
148
+ export declare function loadConfig(env?: NodeJS.ProcessEnv): GatewayConfig;
package/dist/config.js ADDED
@@ -0,0 +1,111 @@
1
+ import { homedir } from "node:os";
2
+ import path from "node:path";
3
+ import { DEFAULT_STEP_UP_TTL_MS } from "./stores/types.js";
4
+ /**
5
+ * Reads an env var, treating blank as absent.
6
+ *
7
+ * Every optional var the Tilt profile passes is written as
8
+ * `os.getenv(name, '')`, and `FOO= cmd` sets an empty string too. Without this,
9
+ * `??` happily accepts `""` and it reaches config as a real value — a zero
10
+ * turn TTL, an empty UI URL that then fails URL construction.
11
+ */
12
+ function readEnv(env, name) {
13
+ return env[name]?.trim() || undefined;
14
+ }
15
+ function required(env, name, fallback) {
16
+ const value = readEnv(env, name) ?? fallback;
17
+ if (!value) {
18
+ throw new Error(`Missing required env var: ${name}`);
19
+ }
20
+ return value;
21
+ }
22
+ function explicitEnvironmentName(env) {
23
+ return (readEnv(env, "DEPLOYMENT_ENVIRONMENT_NAME") ?? readEnv(env, "NODE_ENV"));
24
+ }
25
+ /**
26
+ * Where a file the user just got hold of actually sits: the browser's download
27
+ * folder, the desktop, or a temp directory, which is where Claude's own
28
+ * downloads land. `/tmp` and `/private/tmp` cover the macOS `/tmp` symlink both
29
+ * ways; `/private/var/folders` covers Claude's realpath'd temp dirs without
30
+ * opening the rest of `/private` during the fallback search.
31
+ */
32
+ function resolveImportSearchDirs(env) {
33
+ const configured = readEnv(env, "GATEWAY_IMPORT_SEARCH_DIRS");
34
+ if (configured) {
35
+ return configured
36
+ .split(",")
37
+ .map((dir) => dir.trim())
38
+ .filter(Boolean);
39
+ }
40
+ const home = homedir();
41
+ return [
42
+ path.join(home, "Downloads"),
43
+ path.join(home, "Desktop"),
44
+ "/tmp",
45
+ "/private/tmp",
46
+ "/private/var/folders",
47
+ ];
48
+ }
49
+ function isTruthyFlag(value) {
50
+ if (!value) {
51
+ return false;
52
+ }
53
+ const normalized = value.toLowerCase();
54
+ return normalized === "1" || normalized === "true" || normalized === "yes";
55
+ }
56
+ export function loadConfig(env = process.env) {
57
+ const explicitEnvironment = explicitEnvironmentName(env);
58
+ const localAgentMode = isTruthyFlag(readEnv(env, "GATEWAY_LOCAL_AGENT"));
59
+ const adminToolsOnly = isTruthyFlag(readEnv(env, "GATEWAY_ADMIN_TOOLS_ONLY"));
60
+ // Never default the label to "local". A deployment that forgot to set the
61
+ // variable is not local, and anything reading the label would otherwise
62
+ // relax itself on the strength of a default.
63
+ const deploymentEnvironmentName = explicitEnvironment ?? "unknown";
64
+ // One origin standing in for both the server and the UI, for environments
65
+ // that serve them together - an ee deployment, a shared dev box. The local
66
+ // stack splits them across ports and sets each explicitly, and those still
67
+ // win: this is only the fallback beneath them.
68
+ const baseUrl = readEnv(env, "GATEWAY_BASE_URL");
69
+ return {
70
+ deploymentEnvironmentName,
71
+ localAgentMode,
72
+ adminToolsOnly,
73
+ importSearchDirs: resolveImportSearchDirs(env),
74
+ beatLostGraceMs: Number(readEnv(env, "GATEWAY_BEAT_LOST_GRACE_MS") ?? String(60_000)),
75
+ heldSessionIdleMs: Number(readEnv(env, "GATEWAY_HELD_SESSION_IDLE_MS") ?? String(30 * 60 * 1000)),
76
+ heldSessionReleaseAfterTurnMs: Number(readEnv(env, "GATEWAY_HELD_SESSION_RELEASE_AFTER_TURN_MS") ??
77
+ String(30_000)),
78
+ clarkTurnTimeoutMs: Number(readEnv(env, "GATEWAY_CLARK_TURN_TIMEOUT_MS") ?? String(10 * 60 * 1000)),
79
+ clarkSettleMs: Number(readEnv(env, "GATEWAY_CLARK_SETTLE_MS") ?? String(12_000)),
80
+ clarkReadyWaitMs: Number(readEnv(env, "GATEWAY_CLARK_READY_WAIT_MS") ?? String(30_000)),
81
+ clarkTestingEnabled: readEnv(env, "GATEWAY_CLARK_TESTING_ENABLED") === "true" ||
82
+ readEnv(env, "GATEWAY_CLARK_TESTING_ENABLED") === "1",
83
+ // clarkProgressFloorMs and clarkProgressWaitMs are used to control the polling behavior
84
+ // of the progress poll in the check_app_progress tool.
85
+ // Minimum time a progress poll waits to collect activity for before it answers.
86
+ // If the turn is finished (ex: needs a user decision), it will answer immediately.
87
+ clarkProgressFloorMs: Number(readEnv(env, "GATEWAY_CLARK_PROGRESS_FLOOR_MS") ?? String(20_000)),
88
+ // Maximum time a progress poll waits to collect activity for before it answers.
89
+ // This is the ceiling on the poll. If we reach the ceiling,
90
+ // we will answer with what we have (can be empty if no activity).
91
+ clarkProgressWaitMs: Number(readEnv(env, "GATEWAY_CLARK_PROGRESS_WAIT_MS") ?? String(25_000)),
92
+ clarkStallHintAfterMs: Number(readEnv(env, "GATEWAY_CLARK_STALL_HINT_AFTER_MS") ?? String(120_000)),
93
+ // Under the 60s most MCP hosts allow a tool call, with room for the
94
+ // response to be written and read.
95
+ hostCallCeilingMs: Number(readEnv(env, "GATEWAY_HOST_CALL_CEILING_MS") ?? String(50_000)),
96
+ publishWaitTimeoutMs: Number(readEnv(env, "GATEWAY_PUBLISH_WAIT_TIMEOUT_MS") ?? String(2 * 60 * 1000)),
97
+ publishProgressWaitMs: Number(readEnv(env, "GATEWAY_PUBLISH_PROGRESS_WAIT_MS") ?? String(25_000)),
98
+ publishPollIntervalMs: Number(readEnv(env, "GATEWAY_PUBLISH_POLL_INTERVAL_MS") ?? "2000"),
99
+ profileKey: required(env, "GATEWAY_PROFILE_KEY", "default"),
100
+ serverUrl: required(env, "SUPERBLOCKS_SERVER_URL", readEnv(env, "GATEWAY_SERVER_URL") ?? baseUrl ?? "http://localhost:8080"),
101
+ turnTtlMs: Number(readEnv(env, "GATEWAY_TURN_TTL_MS") ?? DEFAULT_STEP_UP_TTL_MS),
102
+ uiBaseUrl: required(env, "GATEWAY_UI_BASE_URL", baseUrl ?? "http://localhost:3000"),
103
+ deployedShellBaseUrl: readEnv(env, "GATEWAY_DEPLOYED_SHELL_BASE_URL"),
104
+ publicViewerBaseUrl: readEnv(env, "GATEWAY_PUBLIC_VIEWER_BASE_URL"),
105
+ forcePreviewScreenshot: readEnv(env, "GATEWAY_FORCE_PREVIEW_SCREENSHOT") === "true" ||
106
+ readEnv(env, "GATEWAY_FORCE_PREVIEW_SCREENSHOT") === "1",
107
+ captureHostMcp: isTruthyFlag(readEnv(env, "GATEWAY_CAPTURE_HOST_MCP")),
108
+ captureHostIsolated: isTruthyFlag(readEnv(env, "GATEWAY_CAPTURE_HOST_ISOLATED")),
109
+ };
110
+ }
111
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const gatewayDebug: import("util").DebugLogger;
2
+ export declare function gatewayDebugStack(message: string, attributes?: Record<string, unknown>): void;
package/dist/debug.js ADDED
@@ -0,0 +1,9 @@
1
+ import { debuglog } from "node:util";
2
+ export const gatewayDebug = debuglog("gateway");
3
+ export function gatewayDebugStack(message, attributes = {}) {
4
+ if (!gatewayDebug.enabled) {
5
+ return;
6
+ }
7
+ gatewayDebug(message, { ...attributes, stack: new Error().stack });
8
+ }
9
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAEhD,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,aAAsC,EAAE;IAExC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC"}
package/dist/deps.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import type { GatewayConfig } from "./config.js";
2
+ import type { AppState } from "./sabs/app-state.js";
3
+ import type { SessionPeer } from "./sabs/session-peer.js";
4
+ import type { SuperblocksServerClient } from "./server/client.js";
5
+ import type { ProgressStore, RecentAppStore, StepUpTurnStore } from "./stores/types.js";
6
+ import type { McpClientTelemetry } from "./telemetry/mcp-client.js";
7
+ /**
8
+ * Runtime collaborators for one Gateway process. Stdio MCP is the only
9
+ * production transport; tests build the same bag and connect an in-memory
10
+ * client.
11
+ */
12
+ export type AppDeps = {
13
+ /** Per-application facts shared by the session peer and the capabilities. */
14
+ appState: AppState;
15
+ config: GatewayConfig;
16
+ /**
17
+ * Personal API key of the already-logged-in Superblocks CLI user.
18
+ * Gateway tools call the control plane as this identity.
19
+ */
20
+ cliApiKey: string;
21
+ /**
22
+ * Superblocks user already resolved for this CLI session. When present,
23
+ * capabilities skip `/users/me` (ENG-5806). When absent, the first tool
24
+ * call resolves it through the guarded identity read.
25
+ */
26
+ cliIdentity?: {
27
+ email?: string;
28
+ organizationId: string;
29
+ userId: string;
30
+ };
31
+ /** When each build last spoke, and whether its silence was reported. */
32
+ progress: ProgressStore;
33
+ recentApps: RecentAppStore;
34
+ mcpTelemetry?: Pick<McpClientTelemetry, "runTool" | "setOrganizationId">;
35
+ server: SuperblocksServerClient;
36
+ sessionPeer: SessionPeer;
37
+ stepUpTurns: StepUpTurnStore;
38
+ };
package/dist/deps.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deps.js.map