@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,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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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ console.error("This process speaks MCP over stdio as the Superblocks CLI user. Run: superblocks mcp serve");
3
+ process.exit(1);
4
+ export {};
5
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,CAAC,KAAK,CACX,4FAA4F,CAC7F,CAAC;AACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Thin HTTP client for the Superblocks orchestrator / agent used by Gateway
3
+ * when Clark asks the editor peer to run APIs or load integration metadata.
4
+ *
5
+ * The base URL is discovered per session from Server `/users/me` agents
6
+ * (same filters as the browser), not operator-picked env. Scoped JWTs travel
7
+ * in `x-superblocks-authorization`, matching the editor's execute path.
8
+ */
9
+ export declare class OrchestratorHttpError extends Error {
10
+ readonly status: number;
11
+ constructor(message: string, status: number);
12
+ }
13
+ /**
14
+ * Credential identifying who is asking, sent as `Authorization`.
15
+ *
16
+ * The orchestrator forwards this header verbatim when it fetches the app's
17
+ * code bundle from the Superblocks server, and that route authenticates it in
18
+ * its own right: a Superblocks JWT presented there is checked against
19
+ * `apps:view`, which a live-edit session's `apps:update` token does not carry.
20
+ * Sending the API key instead mirrors the browser editor, which puts its user
21
+ * session token here and keeps the scoped JWT to
22
+ * `x-superblocks-authorization`.
23
+ */
24
+ type RequesterCredential = {
25
+ apiKey?: string;
26
+ };
27
+ export type SdkApiV3ExecuteInput = RequesterCredential & {
28
+ applicationId: string;
29
+ branchName?: string;
30
+ entryPoint: string;
31
+ exportName?: string;
32
+ inputs: Record<string, unknown>;
33
+ profileKey?: string;
34
+ scopedToken: string;
35
+ };
36
+ export type V2ExecuteInput = RequesterCredential & {
37
+ body: Record<string, unknown>;
38
+ profileKey?: string;
39
+ scopedToken: string;
40
+ };
41
+ export type MetadataInput = RequesterCredential & {
42
+ integrationId: string;
43
+ profileKey: string;
44
+ scopedToken: string;
45
+ stepConfiguration?: Record<string, unknown>;
46
+ };
47
+ export type OrchestratorClient = {
48
+ executeSdkApiV3(input: SdkApiV3ExecuteInput): Promise<unknown>;
49
+ executeV2Api(input: V2ExecuteInput): Promise<unknown>;
50
+ getMetadata(input: MetadataInput): Promise<Record<string, unknown>>;
51
+ };
52
+ export declare class HttpOrchestratorClient implements OrchestratorClient {
53
+ private readonly orchestratorUrl;
54
+ private readonly timeoutMs;
55
+ constructor(orchestratorUrl: string, timeoutMs?: number);
56
+ private baseUrl;
57
+ private post;
58
+ executeSdkApiV3(input: SdkApiV3ExecuteInput): Promise<unknown>;
59
+ executeV2Api(input: V2ExecuteInput): Promise<unknown>;
60
+ getMetadata(input: MetadataInput): Promise<Record<string, unknown>>;
61
+ }
62
+ export {};
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Thin HTTP client for the Superblocks orchestrator / agent used by Gateway
3
+ * when Clark asks the editor peer to run APIs or load integration metadata.
4
+ *
5
+ * The base URL is discovered per session from Server `/users/me` agents
6
+ * (same filters as the browser), not operator-picked env. Scoped JWTs travel
7
+ * in `x-superblocks-authorization`, matching the editor's execute path.
8
+ */
9
+ const SUPERBLOCKS_AUTHORIZATION_HEADER = "x-superblocks-authorization";
10
+ /** Protobuf `api.v1.ViewMode.EDIT` — same numeric the UI sends on v3/execute. */
11
+ const ORCHESTRATOR_VIEW_MODE_EDIT = 1;
12
+ const DEFAULT_TIMEOUT_MS = 120_000;
13
+ const MAX_DETAIL_LENGTH = 300;
14
+ function detailSuffix(body) {
15
+ if (!body.trim()) {
16
+ return "";
17
+ }
18
+ let detail = body;
19
+ try {
20
+ const parsed = JSON.parse(body);
21
+ if (parsed && typeof parsed === "object") {
22
+ const record = parsed;
23
+ const message = record.responseMeta?.message ?? record.message ?? record.error;
24
+ if (typeof message === "string" && message.trim()) {
25
+ detail = message;
26
+ }
27
+ }
28
+ }
29
+ catch {
30
+ // Not JSON — fall back to the raw body.
31
+ }
32
+ return ` — ${detail.trim().slice(0, MAX_DETAIL_LENGTH)}`;
33
+ }
34
+ export class OrchestratorHttpError extends Error {
35
+ status;
36
+ constructor(message, status) {
37
+ super(message);
38
+ this.status = status;
39
+ this.name = "OrchestratorHttpError";
40
+ }
41
+ }
42
+ export class HttpOrchestratorClient {
43
+ orchestratorUrl;
44
+ timeoutMs;
45
+ constructor(orchestratorUrl, timeoutMs = DEFAULT_TIMEOUT_MS) {
46
+ this.orchestratorUrl = orchestratorUrl;
47
+ this.timeoutMs = timeoutMs;
48
+ }
49
+ baseUrl() {
50
+ return this.orchestratorUrl.replace(/\/$/, "");
51
+ }
52
+ async post(path, input) {
53
+ const url = new URL(`${this.baseUrl()}/${path.replace(/^\//, "")}`);
54
+ for (const [key, value] of Object.entries(input.query ?? {})) {
55
+ url.searchParams.set(key, value);
56
+ }
57
+ const headers = new Headers({
58
+ Authorization: `Bearer ${input.apiKey ?? input.scopedToken}`,
59
+ "Content-Type": "application/json",
60
+ [SUPERBLOCKS_AUTHORIZATION_HEADER]: `Bearer ${input.scopedToken}`,
61
+ });
62
+ if (input.profileKey) {
63
+ headers.set("x-superblocks-profile", input.profileKey);
64
+ }
65
+ let response;
66
+ try {
67
+ response = await fetch(url, {
68
+ body: JSON.stringify(input.body),
69
+ headers,
70
+ method: "POST",
71
+ signal: AbortSignal.timeout(this.timeoutMs),
72
+ });
73
+ }
74
+ catch (error) {
75
+ if (error instanceof Error && error.name === "TimeoutError") {
76
+ throw new Error(`Orchestrator ${path} timed out after ${this.timeoutMs}ms`);
77
+ }
78
+ throw error;
79
+ }
80
+ if (!response.ok) {
81
+ if (response.status === 401) {
82
+ console.warn("gateway orchestrator auth rejected", {
83
+ path,
84
+ profileKey: input.profileKey,
85
+ status: response.status,
86
+ });
87
+ }
88
+ throw new OrchestratorHttpError(`Orchestrator ${path} failed: ${response.status}${detailSuffix(await response.text().catch(() => ""))}`, response.status);
89
+ }
90
+ if (response.status === 204) {
91
+ return undefined;
92
+ }
93
+ const text = await response.text();
94
+ if (!text.trim()) {
95
+ return undefined;
96
+ }
97
+ try {
98
+ return JSON.parse(text);
99
+ }
100
+ catch {
101
+ return text;
102
+ }
103
+ }
104
+ async executeSdkApiV3(input) {
105
+ return this.post("v3/execute", {
106
+ apiKey: input.apiKey,
107
+ body: {
108
+ applicationId: input.applicationId,
109
+ entryPoint: input.entryPoint,
110
+ inputs: input.inputs,
111
+ viewMode: ORCHESTRATOR_VIEW_MODE_EDIT,
112
+ ...(input.exportName ? { exportName: input.exportName } : {}),
113
+ ...(input.branchName ? { branchName: input.branchName } : {}),
114
+ ...(input.profileKey
115
+ ? {
116
+ profile: {
117
+ key: input.profileKey,
118
+ name: input.profileKey,
119
+ },
120
+ }
121
+ : {}),
122
+ },
123
+ profileKey: input.profileKey,
124
+ scopedToken: input.scopedToken,
125
+ });
126
+ }
127
+ async executeV2Api(input) {
128
+ return this.post("v2/execute", {
129
+ apiKey: input.apiKey,
130
+ body: input.body,
131
+ profileKey: input.profileKey,
132
+ query: {
133
+ eventType: "ON_CLARK_REQUEST",
134
+ viewMode: "editor",
135
+ },
136
+ scopedToken: input.scopedToken,
137
+ });
138
+ }
139
+ async getMetadata(input) {
140
+ const raw = await this.post("v2/metadata", {
141
+ apiKey: input.apiKey,
142
+ body: {
143
+ integration: input.integrationId,
144
+ profile: { name: input.profileKey },
145
+ stepConfiguration: input.stepConfiguration ?? {},
146
+ },
147
+ profileKey: input.profileKey,
148
+ scopedToken: input.scopedToken,
149
+ });
150
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
151
+ const record = raw;
152
+ if (record.data && typeof record.data === "object") {
153
+ return record.data;
154
+ }
155
+ return raw;
156
+ }
157
+ return {};
158
+ }
159
+ }
160
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/orchestrator/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,gCAAgC,GAAG,6BAA6B,CAAC;AAEvE,iFAAiF;AACjF,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAId,CAAC;YACF,MAAM,OAAO,GACX,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;YACjE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClD,MAAM,GAAG,OAAO,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IACD,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGnC;IAFX,YACE,OAAe,EACN,MAAc;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AA8CD,MAAM,OAAO,sBAAsB;IAEd;IACA;IAFnB,YACmB,eAAuB,EACvB,YAAoB,kBAAkB;QADtC,oBAAe,GAAf,eAAe,CAAQ;QACvB,cAAS,GAAT,SAAS,CAA6B;IACtD,CAAC;IAEI,OAAO;QACb,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,IAAI,CAChB,IAAY,EACZ,KAKC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE;YAC5D,cAAc,EAAE,kBAAkB;YAClC,CAAC,gCAAgC,CAAC,EAAE,UAAU,KAAK,CAAC,WAAW,EAAE;SAClE,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;gBAChC,OAAO;gBACP,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,oBAAoB,IAAI,CAAC,SAAS,IAAI,CAC3D,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE;oBACjD,IAAI;oBACJ,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACxB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,qBAAqB,CAC7B,gBAAgB,IAAI,YAAY,QAAQ,CAAC,MAAM,GAAG,YAAY,CAC5D,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CACtC,EAAE,EACH,QAAQ,CAAC,MAAM,CAChB,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAA2B;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE;gBACJ,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,2BAA2B;gBACrC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,UAAU;oBAClB,CAAC,CAAC;wBACE,OAAO,EAAE;4BACP,GAAG,EAAE,KAAK,CAAC,UAAU;4BACrB,IAAI,EAAE,KAAK,CAAC,UAAU;yBACvB;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;YACD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAqB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE;gBACL,SAAS,EAAE,kBAAkB;gBAC7B,QAAQ,EAAE,QAAQ;aACnB;YACD,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAoB;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACzC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE;gBACJ,WAAW,EAAE,KAAK,CAAC,aAAa;gBAChC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;gBACnC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,EAAE;aACjD;YACD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;QACH,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,GAAyB,CAAC;YACzC,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnD,OAAO,MAAM,CAAC,IAA+B,CAAC;YAChD,CAAC;YACD,OAAO,GAA8B,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ export type EnsurePlaywrightChromiumOptions = {
2
+ /** Override for tests. Defaults to Playwright's Chromium executable path. */
3
+ chromiumExecutablePath?: string;
4
+ };
5
+ export type EnsurePlaywrightChromiumResult = {
6
+ /** True when this call ran an install. */
7
+ installed: boolean;
8
+ };
9
+ /**
10
+ * Probe only: true when Playwright Chromium is already on disk. Does not
11
+ * download anything. Used by `mcp setup` capture.mode and by capabilities
12
+ * that must fail closed instead of waiting on `chromium.launch()`.
13
+ */
14
+ export declare function playwrightChromiumPresent(options?: Pick<EnsurePlaywrightChromiumOptions, "chromiumExecutablePath">): Promise<boolean>;
15
+ /**
16
+ * Ensures Playwright Chromium is on disk. Intended for
17
+ * `mcp setup --with-screenshots`, not every `mcp serve` - corp laptops need a
18
+ * one-time download with network.
19
+ */
20
+ export declare function ensurePlaywrightChromium(options?: EnsurePlaywrightChromiumOptions): Promise<EnsurePlaywrightChromiumResult>;
21
+ /**
22
+ * Clear error for `mcp serve` when setup was skipped.
23
+ */
24
+ export declare function assertPlaywrightChromiumInstalled(options?: Pick<EnsurePlaywrightChromiumOptions, "chromiumExecutablePath">): Promise<void>;
@@ -0,0 +1,60 @@
1
+ import { execFile as execFileCallback } from "node:child_process";
2
+ import { access } from "node:fs/promises";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { chromium } from "playwright";
7
+ const execFile = promisify(execFileCallback);
8
+ const require = createRequire(import.meta.url);
9
+ async function pathExists(path) {
10
+ try {
11
+ await access(path);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ /**
19
+ * Probe only: true when Playwright Chromium is already on disk. Does not
20
+ * download anything. Used by `mcp setup` capture.mode and by capabilities
21
+ * that must fail closed instead of waiting on `chromium.launch()`.
22
+ */
23
+ export async function playwrightChromiumPresent(options = {}) {
24
+ const executablePath = options.chromiumExecutablePath ?? chromium.executablePath();
25
+ return pathExists(executablePath);
26
+ }
27
+ /**
28
+ * Ensures Playwright Chromium is on disk. Intended for
29
+ * `mcp setup --with-screenshots`, not every `mcp serve` - corp laptops need a
30
+ * one-time download with network.
31
+ */
32
+ export async function ensurePlaywrightChromium(options = {}) {
33
+ const executablePath = options.chromiumExecutablePath ?? chromium.executablePath();
34
+ if (await pathExists(executablePath)) {
35
+ return { installed: false };
36
+ }
37
+ const playwrightCli = join(dirname(require.resolve("playwright")), "cli.js");
38
+ try {
39
+ await execFile(process.execPath, [playwrightCli, "install", "chromium"]);
40
+ }
41
+ catch (error) {
42
+ const detail = error instanceof Error ? error.message : String(error);
43
+ throw new Error(`Failed to install Playwright Chromium (needed for preview screenshots). The bundled playwright install chromium command failed. Re-run: superblocks mcp setup --with-screenshots. (${detail})`);
44
+ }
45
+ if (!(await pathExists(executablePath))) {
46
+ throw new Error(`Playwright Chromium is still missing after install at ${executablePath}. Run: superblocks mcp setup --with-screenshots`);
47
+ }
48
+ return { installed: true };
49
+ }
50
+ /**
51
+ * Clear error for `mcp serve` when setup was skipped.
52
+ */
53
+ export async function assertPlaywrightChromiumInstalled(options = {}) {
54
+ const executablePath = options.chromiumExecutablePath ?? chromium.executablePath();
55
+ if (await pathExists(executablePath)) {
56
+ return;
57
+ }
58
+ throw new Error(`Playwright Chromium is not installed (looked for ${executablePath}). Run: superblocks mcp setup --with-screenshots`);
59
+ }
60
+ //# sourceMappingURL=ensure-chromium.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-chromium.js","sourceRoot":"","sources":["../../src/playwright/ensure-chromium.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAY/C,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,UAA2E,EAAE;IAE7E,MAAM,cAAc,GAClB,OAAO,CAAC,sBAAsB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC9D,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,UAA2C,EAAE;IAE7C,MAAM,cAAc,GAClB,OAAO,CAAC,sBAAsB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC9D,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,sLAAsL,MAAM,GAAG,CAChM,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,yDAAyD,cAAc,iDAAiD,CACzH,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,UAA2E,EAAE;IAE7E,MAAM,cAAc,GAClB,OAAO,CAAC,sBAAsB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC9D,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CACb,oDAAoD,cAAc,kDAAkD,CACrH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Headless capture of a preview viewer URL for MCP image content.
3
+ *
4
+ * Best-effort: callers must succeed with URLs alone when this returns
5
+ * undefined. Output is capped for Claude Desktop tool-result size limits.
6
+ */
7
+ export type PreviewScreenshot = {
8
+ dataBase64: string;
9
+ mimeType: "image/jpeg";
10
+ };
11
+ /** Soft cap on decoded bytes before base64 (~256 KiB). */
12
+ export declare const PREVIEW_SCREENSHOT_MAX_BYTES: number;
13
+ export type CapturePreviewScreenshot = (input: {
14
+ /**
15
+ * App-scoped bearer handed to the embed shell. Without it the shell falls
16
+ * back to Auth0 silent login, which has no session to find headless.
17
+ */
18
+ embedToken?: string;
19
+ /**
20
+ * The origin {@link embedToken} belongs to - the control plane the session
21
+ * signed in to, which already receives this token on every API call. It is
22
+ * the only non-loopback origin allowed to be handed the token; unset means
23
+ * loopback only.
24
+ */
25
+ trustedOrigin?: string;
26
+ url: string;
27
+ timeoutMs?: number;
28
+ }) => Promise<PreviewScreenshot | undefined>;
29
+ /**
30
+ * Whether a session bearer may be delivered to the page at `url`.
31
+ *
32
+ * Loopback is the user's own machine. The only remote origin allowed is the
33
+ * one the token was issued by, over https, so the token never reaches a host
34
+ * that does not already hold it.
35
+ */
36
+ export declare function isTrustedEmbedOrigin(url: string, trustedOrigin?: string): boolean;
37
+ /**
38
+ * Page source that hands the deployed shell its bearer, and the whole reason a
39
+ * headless capture can paint a real app.
40
+ *
41
+ * `ui-deployed-shell` only accepts a bearer through an `INITIALIZE_EMBED`
42
+ * message from its embedder, and ~300ms after mount it gives up and tries
43
+ * Auth0 silent login instead — which has no session to find here. At top level
44
+ * the shell's embedder port has no parent window to check messages against, so
45
+ * it accepts one posted by the page itself.
46
+ *
47
+ * Delivery happens exactly once: each `INITIALIZE_EMBED` replaces the shell's
48
+ * auth state and restarts its bootstrap, so a repeating handshake would keep
49
+ * the app from ever settling.
50
+ *
51
+ * This is source text rather than a function handed to `addInitScript` because
52
+ * Playwright ships a function by serializing it, which drags in whatever
53
+ * helpers the bundler injected into its body (`__name` under tsx) and throws a
54
+ * ReferenceError in the page.
55
+ *
56
+ * The result is only ever evaluated as script source (Playwright forwards it
57
+ * to CDP `addScriptToEvaluateOnNewDocument`), never interpolated into HTML, so
58
+ * `JSON.stringify` is sufficient to contain the token. Putting it in a
59
+ * `<script>` element would not be — the token would need `</script>` escaped.
60
+ */
61
+ export declare function buildEmbedHandshakeScript(token: string, expectedOrigin: string): string;
62
+ /**
63
+ * Captures a JPEG screenshot via Playwright when available. Soft-fails when
64
+ * Chromium is missing or the page never becomes ready — callers must still
65
+ * return preview URLs when this returns undefined.
66
+ */
67
+ export declare const capturePreviewScreenshotWithPlaywright: CapturePreviewScreenshot;