@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,74 @@
1
+ /**
2
+ * What one Gateway process remembers between tool calls.
3
+ *
4
+ * All of it is in-memory and lives exactly as long as the process: Gateway
5
+ * speaks MCP over stdio as a single CLI user, so there is no second reader to
6
+ * coordinate with and no restart to survive. The stores are synchronous for
7
+ * the same reason — they are maps, and an async signature would only promise a
8
+ * round trip that never happens.
9
+ */
10
+ export type AppScopeKey = {
11
+ applicationId: string;
12
+ organizationId: string;
13
+ };
14
+ export type UserScopeKey = {
15
+ organizationId: string;
16
+ userId: string;
17
+ };
18
+ /**
19
+ * The application a caller most recently worked on, so a tool call that names
20
+ * none still has one to act on.
21
+ */
22
+ export type RecentAppStore = {
23
+ get(key: UserScopeKey): string | undefined;
24
+ set(input: UserScopeKey & {
25
+ applicationId: string;
26
+ }): void;
27
+ };
28
+ /**
29
+ * When a build last spoke, and whether its silence has already been reported.
30
+ *
31
+ * App-scoped rather than per-caller: whether a build has gone quiet is a fact
32
+ * about the build, and two readers of one build must not disagree about it.
33
+ */
34
+ export type ProgressStore = {
35
+ lastActivityAtMs(key: AppScopeKey): number | undefined;
36
+ recordActivity(input: AppScopeKey & {
37
+ atMs: number;
38
+ }): void;
39
+ stallHintedAtMs(key: AppScopeKey): number | undefined;
40
+ /** `undefined` clears the mark, so the next quiet spell gets its own hint. */
41
+ recordStallHint(input: AppScopeKey & {
42
+ atMs: number | undefined;
43
+ }): void;
44
+ };
45
+ export type StepUpTurnStatus = "pending" | "ready" | "expired";
46
+ /**
47
+ * An interactive authorization a capability is waiting on.
48
+ *
49
+ * The one thing here with a real expiry: a step-up a caller walked away from
50
+ * must not still be claimable an hour later.
51
+ */
52
+ export type StepUpTurn = {
53
+ authUrl: string;
54
+ callbackToken: string;
55
+ createdAtMs: number;
56
+ idempotencyKey: string;
57
+ reason: "idp_step_up";
58
+ status: StepUpTurnStatus;
59
+ turnId: string;
60
+ };
61
+ export type StepUpTurnStore = {
62
+ complete(turnId: string, callbackToken: string): StepUpTurn | undefined;
63
+ create(input: {
64
+ authUrl: string;
65
+ callbackToken?: string;
66
+ idempotencyKey: string;
67
+ reason: StepUpTurn["reason"];
68
+ ttlMs?: number;
69
+ turnId?: string;
70
+ }): StepUpTurn;
71
+ get(turnId: string): StepUpTurn | undefined;
72
+ getByIdempotencyKey(idempotencyKey: string): StepUpTurn | undefined;
73
+ };
74
+ export declare const DEFAULT_STEP_UP_TTL_MS = 180000;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * What one Gateway process remembers between tool calls.
3
+ *
4
+ * All of it is in-memory and lives exactly as long as the process: Gateway
5
+ * speaks MCP over stdio as a single CLI user, so there is no second reader to
6
+ * coordinate with and no restart to survive. The stores are synchronous for
7
+ * the same reason — they are maps, and an async signature would only promise a
8
+ * round trip that never happens.
9
+ */
10
+ export const DEFAULT_STEP_UP_TTL_MS = 180_000;
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/stores/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type Tracer } from "@opentelemetry/api";
2
+ import type { CapabilityResult } from "../capabilities/types.js";
3
+ export type McpClientInfo = {
4
+ name: string;
5
+ version?: string;
6
+ };
7
+ export type McpToolCall = {
8
+ client?: McpClientInfo;
9
+ toolName: string;
10
+ };
11
+ export declare class McpClientTelemetry {
12
+ private readonly tracer;
13
+ private ended;
14
+ private hadError;
15
+ private organizationId;
16
+ private readonly sessionContext;
17
+ private readonly sessionSpan;
18
+ constructor(tracer: Tracer);
19
+ setOrganizationId(organizationId: string): void;
20
+ runTool<T>(call: McpToolCall, operation: () => Promise<CapabilityResult<T>>): Promise<CapabilityResult<T>>;
21
+ endSession(): void;
22
+ }
@@ -0,0 +1,140 @@
1
+ import { context, SpanStatusCode, trace, } from "@opentelemetry/api";
2
+ import { recordMcpToolCall } from "./metrics.js";
3
+ function bounded(value, maxLength) {
4
+ return value.slice(0, maxLength);
5
+ }
6
+ function stringProperty(value, key) {
7
+ if (typeof value !== "object" || value === null || !(key in value)) {
8
+ return undefined;
9
+ }
10
+ const property = Reflect.get(value, key);
11
+ return typeof property === "string" ? property : undefined;
12
+ }
13
+ export class McpClientTelemetry {
14
+ tracer;
15
+ ended = false;
16
+ hadError = false;
17
+ organizationId;
18
+ sessionContext;
19
+ sessionSpan;
20
+ constructor(tracer) {
21
+ this.tracer = tracer;
22
+ this.sessionSpan = tracer.startSpan("gen_ai.request", {
23
+ attributes: {
24
+ "gen_ai.operation.name": "invoke_agent",
25
+ },
26
+ });
27
+ this.sessionContext = trace.setSpan(context.active(), this.sessionSpan);
28
+ }
29
+ setOrganizationId(organizationId) {
30
+ this.organizationId = organizationId;
31
+ this.sessionSpan.setAttribute("organization.id", organizationId);
32
+ }
33
+ async runTool(call, operation) {
34
+ const attributes = {
35
+ "gen_ai.operation.name": "execute_tool",
36
+ ...(call.client
37
+ ? {
38
+ "mcp.client.name": bounded(call.client.name, 80),
39
+ ...(call.client.version
40
+ ? {
41
+ "mcp.client.version": bounded(call.client.version, 40),
42
+ }
43
+ : {}),
44
+ }
45
+ : {}),
46
+ ...(this.organizationId
47
+ ? { "organization.id": this.organizationId }
48
+ : {}),
49
+ "tool.name": bounded(call.toolName, 80),
50
+ };
51
+ if (call.client) {
52
+ this.sessionSpan.setAttributes({
53
+ "mcp.client.name": bounded(call.client.name, 80),
54
+ ...(call.client.version
55
+ ? { "mcp.client.version": bounded(call.client.version, 40) }
56
+ : {}),
57
+ });
58
+ }
59
+ let span;
60
+ try {
61
+ span = this.tracer.startSpan("gen_ai.tool_call", { attributes }, this.sessionContext);
62
+ }
63
+ catch {
64
+ return operation();
65
+ }
66
+ const startedAt = Date.now();
67
+ let status = "success";
68
+ try {
69
+ const result = await context.with(trace.setSpan(this.sessionContext, span), operation);
70
+ span.setAttribute("tool.duration_ms", Date.now() - startedAt);
71
+ if (this.organizationId) {
72
+ span.setAttribute("organization.id", this.organizationId);
73
+ }
74
+ if (result.kind === "error") {
75
+ this.hadError = true;
76
+ status = "error";
77
+ span.setAttributes({
78
+ ...(result.applicationId
79
+ ? { "application.id": result.applicationId }
80
+ : {}),
81
+ "mcp.error.code": bounded(result.code, 80),
82
+ "tool.error_category": result.code === "cancelled" ? "timeout" : "execution_error",
83
+ "tool.status": "error",
84
+ });
85
+ span.setStatus({ code: SpanStatusCode.ERROR });
86
+ }
87
+ else if (result.kind === "auth_required") {
88
+ this.hadError = true;
89
+ status = "error";
90
+ span.setAttributes({
91
+ "mcp.result.status": "auth_required",
92
+ "tool.error_category": "permission_denied",
93
+ "tool.status": "error",
94
+ });
95
+ }
96
+ else {
97
+ const applicationId = stringProperty(result.value, "applicationId");
98
+ const resultStatus = stringProperty(result.value, "status");
99
+ span.setAttributes({
100
+ ...(applicationId ? { "application.id": applicationId } : {}),
101
+ ...(resultStatus
102
+ ? { "mcp.result.status": bounded(resultStatus, 80) }
103
+ : {}),
104
+ "tool.error_category": "none",
105
+ "tool.status": "success",
106
+ });
107
+ }
108
+ return result;
109
+ }
110
+ catch (error) {
111
+ this.hadError = true;
112
+ status = "error";
113
+ span.setAttributes({
114
+ "tool.duration_ms": Date.now() - startedAt,
115
+ "tool.error_category": "execution_error",
116
+ "tool.status": "error",
117
+ });
118
+ span.setStatus({ code: SpanStatusCode.ERROR });
119
+ throw error;
120
+ }
121
+ finally {
122
+ recordMcpToolCall({
123
+ ...(call.client ? { clientName: bounded(call.client.name, 80) } : {}),
124
+ durationSeconds: (Date.now() - startedAt) / 1000,
125
+ status,
126
+ toolName: bounded(call.toolName, 80),
127
+ });
128
+ span.end();
129
+ }
130
+ }
131
+ endSession() {
132
+ if (this.ended) {
133
+ return;
134
+ }
135
+ this.ended = true;
136
+ this.sessionSpan.setAttribute("gen_ai.request.status", this.hadError ? "error" : "success");
137
+ this.sessionSpan.end();
138
+ }
139
+ }
140
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/telemetry/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { IdentityReadOutcome } from "../server/identity-reads.js";
2
+ /**
3
+ * Series scale with distinct client names, which the caller chooses at
4
+ * initialize; the name is length-bounded but not enumerated.
5
+ */
6
+ export declare function recordMcpToolCall(input: {
7
+ clientName?: string;
8
+ durationSeconds: number;
9
+ status: "error" | "success";
10
+ toolName: string;
11
+ }): void;
12
+ export type CheckpointMetricOutcome = "authentication_failure" | "cleanup_warning" | "conflict_failure" | "downstream_failure" | "saved" | "sync_timeout" | "timeout_failure" | "unchanged";
13
+ /**
14
+ * How the identity lookup behind a capability is behaving.
15
+ *
16
+ * No credential, user, or organization is ever a label — the outcome is a
17
+ * closed set, so the series count grows with code and not with traffic.
18
+ */
19
+ export declare function recordIdentityReadOutcome(outcome: IdentityReadOutcome): void;
20
+ export declare function recordCheckpointOutcome(outcome: CheckpointMetricOutcome): void;
21
+ /**
22
+ * How often the gateway is absorbing faults it used to die from (ENG-5809).
23
+ *
24
+ * Neither the message nor a stack is a label; both go to the log line instead.
25
+ */
26
+ export declare function recordGatewayFault(fault: {
27
+ fatal: boolean;
28
+ kind: string;
29
+ }): void;
30
+ /**
31
+ * Separates "this gateway is broken" from "the platform it fronts is down".
32
+ *
33
+ * Kept so in-process dispatch probes can still record a verdict. Stdio Gateway
34
+ * does not bind `/health`.
35
+ */
36
+ export declare function recordReadinessVerdict(input: {
37
+ dispatch: string;
38
+ probe: "liveness" | "readiness";
39
+ ready: boolean;
40
+ upstream: string;
41
+ }): void;
@@ -0,0 +1,103 @@
1
+ import { metrics, } from "@opentelemetry/api";
2
+ /**
3
+ * The metrics API has no proxy provider, unlike traces: a meter taken before
4
+ * the SDK registers one is a no-op forever. Bind on first record instead, and
5
+ * rebind whenever the global provider changes.
6
+ */
7
+ function lazyInstrument(create) {
8
+ let boundMeter;
9
+ let instrument;
10
+ return () => {
11
+ const current = metrics.getMeter("gateway");
12
+ if (current !== boundMeter || instrument === undefined) {
13
+ boundMeter = current;
14
+ instrument = create(current);
15
+ }
16
+ return instrument;
17
+ };
18
+ }
19
+ function lazyCounter(name, description) {
20
+ return lazyInstrument((boundMeter) => boundMeter.createCounter(name, { description }));
21
+ }
22
+ function lazyHistogram(name, description, bucketBoundaries) {
23
+ return lazyInstrument((boundMeter) => boundMeter.createHistogram(name, {
24
+ advice: { explicitBucketBoundaries: bucketBoundaries },
25
+ description,
26
+ unit: "s",
27
+ }));
28
+ }
29
+ const mcpToolCalls = lazyCounter("gateway.mcp.tool_calls", "MCP tool calls by tool, calling client, and outcome");
30
+ /** Tool calls run from single-digit milliseconds to a multi-minute build. */
31
+ const TOOL_DURATION_BUCKETS_SECONDS = [
32
+ 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60, 120, 300,
33
+ ];
34
+ const mcpToolCallDuration = lazyHistogram("gateway.mcp.tool_call_duration_seconds", "Wall-clock duration of an MCP tool call", TOOL_DURATION_BUCKETS_SECONDS);
35
+ /**
36
+ * Series scale with distinct client names, which the caller chooses at
37
+ * initialize; the name is length-bounded but not enumerated.
38
+ */
39
+ export function recordMcpToolCall(input) {
40
+ const attributes = {
41
+ ...(input.clientName ? { "mcp.client.name": input.clientName } : {}),
42
+ "tool.name": input.toolName,
43
+ "tool.status": input.status,
44
+ };
45
+ mcpToolCalls().add(1, attributes);
46
+ mcpToolCallDuration().record(input.durationSeconds, attributes);
47
+ }
48
+ function resourceAttributes() {
49
+ return {
50
+ "deployment.environment.name": process.env.DEPLOYMENT_ENVIRONMENT_NAME ?? "local",
51
+ "service.name": "gateway",
52
+ };
53
+ }
54
+ const identityReadOutcomes = lazyCounter("gateway.identity.read.outcomes", "Caller-identity lookups by outcome: served from cache, resolved, refused, or unavailable");
55
+ /**
56
+ * How the identity lookup behind a capability is behaving.
57
+ *
58
+ * No credential, user, or organization is ever a label — the outcome is a
59
+ * closed set, so the series count grows with code and not with traffic.
60
+ */
61
+ export function recordIdentityReadOutcome(outcome) {
62
+ identityReadOutcomes().add(1, {
63
+ ...resourceAttributes(),
64
+ "gateway.outcome": outcome,
65
+ });
66
+ }
67
+ const checkpointOutcomes = lazyCounter("gateway.checkpoint.outcomes", "Clark checkpoint attempts by bounded outcome");
68
+ export function recordCheckpointOutcome(outcome) {
69
+ checkpointOutcomes().add(1, {
70
+ ...resourceAttributes(),
71
+ "gateway.checkpoint.outcome": outcome,
72
+ });
73
+ }
74
+ const processFaults = lazyCounter("gateway.process.faults", "Faults the process-level barrier caught, by kind and whether it gave up the process");
75
+ /**
76
+ * How often the gateway is absorbing faults it used to die from (ENG-5809).
77
+ *
78
+ * Neither the message nor a stack is a label; both go to the log line instead.
79
+ */
80
+ export function recordGatewayFault(fault) {
81
+ processFaults().add(1, {
82
+ ...resourceAttributes(),
83
+ "gateway.fault.fatal": String(fault.fatal),
84
+ "gateway.fault.kind": fault.kind,
85
+ });
86
+ }
87
+ const readinessVerdicts = lazyCounter("gateway.readiness.verdicts", "Health and readiness probe verdicts, by dispatch state and upstream reachability");
88
+ /**
89
+ * Separates "this gateway is broken" from "the platform it fronts is down".
90
+ *
91
+ * Kept so in-process dispatch probes can still record a verdict. Stdio Gateway
92
+ * does not bind `/health`.
93
+ */
94
+ export function recordReadinessVerdict(input) {
95
+ readinessVerdicts().add(1, {
96
+ ...resourceAttributes(),
97
+ "gateway.readiness.dispatch": input.dispatch,
98
+ "gateway.readiness.probe": input.probe,
99
+ "gateway.readiness.ready": String(input.ready),
100
+ "gateway.readiness.upstream": input.upstream,
101
+ });
102
+ }
103
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { GatewayConfig } from "../config.js";
2
+ import { McpClientTelemetry } from "./mcp-client.js";
3
+ export declare function startGatewayTelemetry(input: {
4
+ apiKey: string;
5
+ config: GatewayConfig;
6
+ }): {
7
+ mcpTelemetry: McpClientTelemetry;
8
+ shutdown: () => Promise<void>;
9
+ };
@@ -0,0 +1,118 @@
1
+ import { DeploymentType, getDefaultPolicy, parseDeploymentType, } from "@superblocksteam/telemetry";
2
+ import { initNodeTelemetry } from "@superblocksteam/telemetry/node";
3
+ import { McpClientTelemetry } from "./mcp-client.js";
4
+ const TELEMETRY_SHUTDOWN_MS = 2_000;
5
+ /**
6
+ * stdout is the MCP JSON-RPC wire. Without a logger the shared init falls back
7
+ * to console.info, which writes there and corrupts the protocol.
8
+ */
9
+ function logToStderr(first, message) {
10
+ if (message === undefined) {
11
+ console.error(first);
12
+ return;
13
+ }
14
+ console.error(first, message);
15
+ }
16
+ const stderrLogger = {
17
+ error: logToStderr,
18
+ info: logToStderr,
19
+ warn: logToStderr,
20
+ };
21
+ function telemetryBaseUrl(serverUrl) {
22
+ try {
23
+ const url = new URL(serverUrl);
24
+ url.hash = "";
25
+ url.pathname = `${url.pathname.replace(/\/$/u, "")}/api`;
26
+ url.search = "";
27
+ return url.toString().replace(/\/$/u, "");
28
+ }
29
+ catch {
30
+ console.error("gateway telemetry skipped: server URL is not parseable");
31
+ return undefined;
32
+ }
33
+ }
34
+ function environmentName(config) {
35
+ if (config.deploymentEnvironmentName !== "unknown") {
36
+ return config.deploymentEnvironmentName;
37
+ }
38
+ try {
39
+ return environmentFromHostname(new URL(config.serverUrl).hostname);
40
+ }
41
+ catch {
42
+ return "unknown";
43
+ }
44
+ }
45
+ function environmentFromHostname(hostname) {
46
+ if (hostname.match(/^app\.superblocks(?:hq)?\.com$/u)) {
47
+ return "prod";
48
+ }
49
+ if (hostname.match(/^eu\.superblocks(?:hq)?\.com$/u)) {
50
+ return "prod-eu";
51
+ }
52
+ if (hostname.match(/^staging\.superblocks(?:hq)?\.com$/u)) {
53
+ return "staging";
54
+ }
55
+ if (hostname.match(/^dev\.superblocks(?:hq)?\.com$/u)) {
56
+ return "dev";
57
+ }
58
+ if (hostname.match(/^pr-[0-9]+\.superblocks(?:hq)?\.dev$/u)) {
59
+ return "ephemeral";
60
+ }
61
+ if (hostname === "localhost" || hostname === "127.0.0.1") {
62
+ return "local";
63
+ }
64
+ return "other";
65
+ }
66
+ function deploymentTypeFor(config) {
67
+ if (config.localAgentMode) {
68
+ return DeploymentType.CLOUD_PREM;
69
+ }
70
+ try {
71
+ return parseDeploymentType(process.env.SUPERBLOCKS_DEPLOYMENT_TYPE);
72
+ }
73
+ catch {
74
+ return DeploymentType.CLOUD;
75
+ }
76
+ }
77
+ async function settleWithin(work, timeoutMs) {
78
+ let timer;
79
+ try {
80
+ await Promise.race([
81
+ work,
82
+ new Promise((resolve) => {
83
+ timer = setTimeout(resolve, timeoutMs);
84
+ }),
85
+ ]);
86
+ }
87
+ finally {
88
+ if (timer !== undefined) {
89
+ clearTimeout(timer);
90
+ }
91
+ }
92
+ }
93
+ export function startGatewayTelemetry(input) {
94
+ const otlpUrl = telemetryBaseUrl(input.config.serverUrl);
95
+ const telemetry = initNodeTelemetry({
96
+ environment: environmentName(input.config),
97
+ logger: stderrLogger,
98
+ logsEnabled: false,
99
+ metricsEnabled: true,
100
+ otlpHeaders: { Authorization: `Bearer ${input.apiKey}` },
101
+ ...(otlpUrl ? { otlpUrl } : {}),
102
+ serviceName: "gateway",
103
+ serviceVersion: "0.0.1",
104
+ }, getDefaultPolicy(deploymentTypeFor(input.config)));
105
+ const mcpTelemetry = new McpClientTelemetry(telemetry.getTracer("gateway.mcp"));
106
+ return {
107
+ mcpTelemetry,
108
+ shutdown: async () => {
109
+ try {
110
+ mcpTelemetry.endSession();
111
+ }
112
+ finally {
113
+ await settleWithin(telemetry.shutdown(), TELEMETRY_SHUTDOWN_MS);
114
+ }
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import type { Tool, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
4
+ import { z } from "zod";
5
+ import { type ToolRegistry } from "@superblocksteam/mcp-server";
6
+ import type { ClientProfile } from "./client-presentation.js";
7
+ export type RegisterAdminToolsOptions = {
8
+ /**
9
+ * Superblocks Server base URL injected as `base_url` when the caller omits it.
10
+ * Models should not invent environments; the gateway already knows the control plane.
11
+ */
12
+ serverUrl: string;
13
+ /**
14
+ * Fixed credential for tests and tightly scoped callers. Prefer `resolveApiKey`
15
+ * on the live HTTP path so each tool call uses the caller's downstream key.
16
+ */
17
+ apiKey?: string;
18
+ resolveApiKey?: (auth: AuthInfo | undefined) => Promise<string>;
19
+ /**
20
+ * Cloud-Prem / laptop Admin agents (`GATEWAY_LOCAL_AGENT`) talk to a control
21
+ * plane that carries no SaaS billing plan, so the Admin tools' Enterprise/POC
22
+ * plan lookup would refuse every call. Entitlement for those installs is
23
+ * established by the deployment itself. SaaS-hosted Gateways leave this off
24
+ * and keep the check.
25
+ */
26
+ localAgentMode?: boolean;
27
+ clientProfile?: () => ClientProfile;
28
+ /**
29
+ * When the session already has an application, send credential entry to the
30
+ * editor Integrations tab instead of the org Integrations page.
31
+ */
32
+ resolveEditorIntegrationSetupUrl?: (integrationId: string) => string | undefined | Promise<string | undefined>;
33
+ };
34
+ export type JsonSchemaToZodShapeOptions = {
35
+ /** Advertised as optional no matter what the source schema requires. */
36
+ optionalKeys?: readonly string[];
37
+ };
38
+ /**
39
+ * Loose JSON-Schema -> Zod conversion so `registerTool` can list Admin tools
40
+ * with usable shapes. Handlers still validate through `@superblocksteam/mcp-server`.
41
+ */
42
+ export declare function jsonSchemaToZodShape(inputSchema: Tool["inputSchema"], options?: JsonSchemaToZodShapeOptions): Record<string, z.ZodType>;
43
+ /**
44
+ * Gateway product copy names the builder Superblocks. Admin tool definitions
45
+ * still mention the retired "Clark" alias in places; rewrite for this surface
46
+ * so clients do not reintroduce that name.
47
+ */
48
+ export declare function superblocksProductCopy(text: string): string;
49
+ /** Completes MCP hints without overriding shared Admin definitions. */
50
+ export declare function completeToolAnnotations(annotations: ToolAnnotations | undefined): ToolAnnotations;
51
+ /**
52
+ * Registers customer-profile Admin MCP tools on the same McpServer as Builder
53
+ * tools. Each call runs under `runWithAuthContext` with the Gateway's
54
+ * downstream credential, against the `serverUrl` that credential belongs to.
55
+ */
56
+ export declare function registerAdminTools(server: McpServer, options: RegisterAdminToolsOptions): ToolRegistry;